QRCodeFragment.java 9.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319
  1. package app.mar.activities;
  2. import android.app.Activity;
  3. import android.content.pm.PackageManager;
  4. import android.graphics.Color;
  5. import android.os.Bundle;
  6. import android.app.Fragment;
  7. import android.util.Log;
  8. import android.util.TypedValue;
  9. import android.view.KeyEvent;
  10. import android.view.LayoutInflater;
  11. import android.view.View;
  12. import android.view.ViewGroup;
  13. import android.widget.Button;
  14. import android.widget.LinearLayout;
  15. import android.widget.TextView;
  16. import android.widget.Toast;
  17. import com.google.zxing.ResultPoint;
  18. import com.google.zxing.client.android.BeepManager;
  19. import com.journeyapps.barcodescanner.BarcodeCallback;
  20. import com.journeyapps.barcodescanner.BarcodeResult;
  21. import com.journeyapps.barcodescanner.CaptureManager;
  22. import com.journeyapps.barcodescanner.DecoratedBarcodeView;
  23. import java.util.List;
  24. import app.mar.game.Area;
  25. import app.mar.game.Game;
  26. import app.mar.game.challenges.Challenge;
  27. import app.mar.game.challenges.GeoIndice;
  28. import app.mar.game.challenges.IGeoTreasure;
  29. import app.mar.game.challenges.Indice;
  30. import app.mar.game.challenges.QRCodeGeoTreasure;
  31. import app.mar.game.challenges.QRCodeTreasure;
  32. import app.mar.game.challenges.TextIndice;
  33. /**
  34. * A simple {@link Fragment} subclass.
  35. * Activities that contain this fragment must implement the
  36. * {@link QRCodeFragment.OnFragmentInteractionListener} interface
  37. * to handle interaction events.
  38. * Use the {@link QRCodeFragment#newInstance} factory method to
  39. * create an instance of this fragment.
  40. */
  41. public class QRCodeFragment extends ChallengeFragment implements
  42. DecoratedBarcodeView.TorchListener, BarcodeCallback, View.OnClickListener{
  43. private CaptureManager capture;
  44. private DecoratedBarcodeView barcodeScannerView;
  45. private Button switchFlashlightButton;
  46. private Button goToScan;
  47. private BeepManager beepManager;
  48. private View vPresRoot;
  49. private View vScanRoot;
  50. private Game mGame;
  51. public static final int REQUEST_CODE = 2001;
  52. private QRCodeTreasure mQr;
  53. private OnFragmentInteractionListener mListener;
  54. protected static final int STATE_PRESENTATION=0;
  55. protected static final int STATE_RA=1;
  56. protected int state=STATE_PRESENTATION;
  57. protected LinearLayout mUITextIndices2;
  58. protected TextView mUIGeoIndice2;
  59. protected LinearLayout mUIGlobalIndice2;
  60. public QRCodeFragment() {
  61. // Required empty public constructor
  62. }
  63. /**
  64. * Use this factory method to create a new instance of
  65. * this fragment using the provided parameters.
  66. *
  67. * @return A new instance of fragment QRCodeFragment.
  68. */
  69. public static QRCodeFragment newInstance() {
  70. QRCodeFragment fragment = new QRCodeFragment();
  71. Bundle args = new Bundle();
  72. fragment.setArguments(args);
  73. return fragment;
  74. }
  75. @Override
  76. public void onCreate(Bundle savedInstanceState) {
  77. super.onCreate(savedInstanceState);
  78. if (getArguments() != null) {
  79. }
  80. }
  81. @Override
  82. protected void onInitChallenge(Challenge c) {
  83. super.onInitChallenge(c);
  84. if(c instanceof QRCodeTreasure) {
  85. mQr = (QRCodeTreasure) c;
  86. }else
  87. {
  88. mQr=null;
  89. }
  90. if( (c instanceof QRCodeGeoTreasure) )
  91. {
  92. getDriver().startLocalisation();
  93. }
  94. getDriver().setVisibilityView(R.id.btn_valid, View.INVISIBLE);
  95. }
  96. @Override
  97. protected void onResetUi() {
  98. state=STATE_PRESENTATION;
  99. if(mUIGeoIndice2!=null)
  100. {
  101. mUIGeoIndice2.setVisibility(View.GONE);
  102. }
  103. if(mUITextIndices2!=null)
  104. {
  105. mUITextIndices2.removeAllViews();
  106. }
  107. if(mUIGlobalIndice2!=null) {
  108. mUIGlobalIndice2.setVisibility(View.GONE);
  109. }
  110. getDriver().setVisibilityView(R.id.btn_valid, View.INVISIBLE);
  111. }
  112. @Override
  113. public View onCreateView(LayoutInflater inflater, ViewGroup container,
  114. Bundle savedInstanceState) {
  115. // Inflate the layout for this fragment
  116. View v = super.onCreateView(inflater, container, R.layout.fragment_qrcode);
  117. barcodeScannerView = (DecoratedBarcodeView)v.findViewById(R.id.zxing_barcode_scanner);
  118. barcodeScannerView.setTorchListener(this);
  119. beepManager=new BeepManager(getActivity());
  120. switchFlashlightButton = (Button)v.findViewById(R.id.switch_flashlight);
  121. goToScan = (Button)v.findViewById(R.id.btn_scan);
  122. goToScan.setOnClickListener(this);
  123. vPresRoot=v.findViewById(R.id.presentation);
  124. vScanRoot=v.findViewById(R.id.root_qr);
  125. mUITextIndices2= (LinearLayout) v.findViewById(R.id.ll_textIndices2);
  126. mUIGeoIndice2= (TextView) v.findViewById(R.id.tv_geoIndice2);
  127. mUIGlobalIndice2 = (LinearLayout) v.findViewById(R.id.ll_rootIndices2);
  128. if (!hasFlash()) {
  129. switchFlashlightButton.setVisibility(View.GONE);
  130. }
  131. capture = new CaptureManager(getActivity(), barcodeScannerView);
  132. capture.initializeFromIntent(getActivity().getIntent(), savedInstanceState);
  133. barcodeScannerView.decodeContinuous(this);
  134. return v;
  135. }
  136. @Override
  137. public void onStart() {
  138. super.onStart();
  139. getDriver().resumeLocalisation();
  140. }
  141. @Override
  142. public void onStop() {
  143. super.onStop();
  144. getDriver().pauseLocalisation();
  145. }
  146. @Override
  147. public void onResume() {
  148. super.onResume();
  149. capture.onResume();
  150. }
  151. @Override
  152. public void onPause() {
  153. super.onPause();
  154. capture.onPause();
  155. }
  156. @Override
  157. public void onDestroy() {
  158. super.onDestroy();
  159. capture.onDestroy();
  160. }
  161. @Override
  162. public void onSaveInstanceState(Bundle outState) {
  163. super.onSaveInstanceState(outState);
  164. capture.onSaveInstanceState(outState);
  165. }
  166. public boolean onKeyDown(int keyCode, KeyEvent event) {
  167. return barcodeScannerView.onKeyDown(keyCode, event) || getActivity().onKeyDown(keyCode, event);
  168. }
  169. /**
  170. * Check if the device's camera has a Flashlight.
  171. * @return true if there is Flashlight, otherwise false.
  172. */
  173. private boolean hasFlash() {
  174. return getActivity().getApplicationContext().getPackageManager()
  175. .hasSystemFeature(PackageManager.FEATURE_CAMERA_FLASH);
  176. }
  177. public void switchFlashlight(View view) {
  178. if ("on".equals(switchFlashlightButton.getText())) {
  179. barcodeScannerView.setTorchOn();
  180. } else {
  181. barcodeScannerView.setTorchOff();
  182. }
  183. }
  184. @Override
  185. public void onTorchOn() {
  186. switchFlashlightButton.setText("Off");
  187. }
  188. @Override
  189. public void onTorchOff() {
  190. switchFlashlightButton.setText("On");
  191. }
  192. public void barcodeResult(final BarcodeResult result) {
  193. beepManager.playBeepSoundAndVibrate();
  194. Toast.makeText(getActivity(),"Text: '"+result.getText()+"'", Toast.LENGTH_LONG).show();
  195. if(result.getText().compareTo(mQr.getQRValue())==0)
  196. {
  197. Log.i("-----", "Challenge '"+mQr.getName()+"' validated !");
  198. barcodeScannerView.pause();
  199. Activity act = getActivity();
  200. getDriver().challengeValidate(mChallenge, mGame, (ChallengeDriver)getActivity());
  201. stopGeoUpdateTimer();
  202. }else
  203. {
  204. Toast.makeText(getActivity(), mQr.getBadQRMessage(), Toast.LENGTH_LONG).show();
  205. barcodeScannerView.decodeContinuous(this);
  206. }
  207. }
  208. public boolean onBackPressed(){
  209. if(state==STATE_PRESENTATION) return true;
  210. state=STATE_PRESENTATION;
  211. vScanRoot.setVisibility(View.GONE);
  212. vPresRoot.setVisibility(View.VISIBLE);
  213. return false;
  214. }
  215. public Indice showIndice()
  216. {
  217. Indice indice = super.showIndice();
  218. int indInd = mChallenge.getIndiceIndex();
  219. if(indice!=null && getActivity() instanceof ChallengeDriver)
  220. {
  221. if(indice instanceof GeoIndice)
  222. {
  223. if(mUIGeoIndice2!=null)
  224. {
  225. mUIGlobalIndice2.setVisibility(View.VISIBLE);
  226. mUIGeoIndice2.setVisibility(View.VISIBLE);
  227. startGeoUpdateTimer();
  228. }
  229. }else if(indice instanceof TextIndice)
  230. {
  231. if(mUITextIndices2!=null)
  232. {
  233. mUIGlobalIndice2.setVisibility(View.VISIBLE);
  234. TextView tv = new TextView(getActivity());
  235. tv.setTextSize(TypedValue.COMPLEX_UNIT_SP, 14);
  236. tv.setText(" Indice "+(indInd+1)+" : "+((TextIndice) indice).getText());
  237. mUITextIndices2.addView(tv);
  238. }
  239. }
  240. }
  241. return indice;
  242. }
  243. @Override
  244. protected void onGeoUpdateTimer()
  245. {
  246. super.onGeoUpdateTimer();
  247. mUIGeoIndice2.setText(mUIGeoIndice.getText());
  248. }
  249. @Override
  250. public void possibleResultPoints(List<ResultPoint> resultPoints) {
  251. }
  252. @Override
  253. public boolean check() {
  254. return false;
  255. }
  256. @Override
  257. public void onClick(View v) {
  258. if(v==goToScan && state==STATE_PRESENTATION)
  259. {
  260. vScanRoot.setVisibility(View.VISIBLE);
  261. vPresRoot.setVisibility(View.GONE);
  262. state=STATE_RA;
  263. }
  264. }
  265. }