package ms.warpzone.warppay; import android.app.AlertDialog; import android.app.PendingIntent; import android.content.DialogInterface; import android.content.Intent; import android.content.IntentFilter; import android.nfc.NfcAdapter; import android.nfc.tech.NfcF; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.util.Log; import android.view.KeyEvent; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; import android.view.View; import android.widget.Toast; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import ms.warpzone.warppay.data.models.local.Product; import ms.warpzone.warppay.data.models.local.User; import ms.warpzone.warppay.dialogs.BarcodeLearnDialog; import ms.warpzone.warppay.manager.DataManager; import ms.warpzone.warppay.manager.MainManager; import ms.warpzone.warppay.manager.UiManager; import ms.warpzone.warppay.orderList.Order; public class MainActivity extends AppCompatActivity implements View.OnClickListener, View.OnKeyListener{ private MainManager manager; private NfcAdapter nfcAdapter; private PendingIntent mPendingIntent; private IntentFilter[] mIntentFilters; private String[][] mNFCTechLists; private String barcode; private BarcodeLearnDialog barcodeLearnDialog; public boolean onCreateOptionsMenu(Menu menu) { MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.menu_main, menu); return true; } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); getWindow().addFlags(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN); setContentView(R.layout.activity_main); this.findViewById(R.id.mainLayout).setOnKeyListener(this); this.manager = MainManager.getInstance(); this.manager.init(this); this.barcode = ""; this.findViewById(android.R.id.content).setOnKeyListener(this); this.nfcAdapter = NfcAdapter.getDefaultAdapter(this); this.mPendingIntent = PendingIntent.getActivity(this, 0, new Intent(this, getClass()).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP), 0); IntentFilter ndefIntent = new IntentFilter(NfcAdapter.ACTION_TAG_DISCOVERED); try { this.mIntentFilters = new IntentFilter[] { ndefIntent }; } catch (Exception e) { Log.e("TagDispatch", e.toString()); } mNFCTechLists = new String[][] { new String[] { NfcF.class.getName() } }; } public void onResume() { super.onResume(); if (nfcAdapter != null) { nfcAdapter.enableForegroundDispatch(this, mPendingIntent, mIntentFilters, mNFCTechLists); } } @Override public void onPause() { super.onPause(); if (nfcAdapter != null) nfcAdapter.disableForegroundDispatch(this); } protected void onNewIntent(Intent intent) { String card_id = byteArrayToHex(intent.getByteArrayExtra(NfcAdapter.EXTRA_ID)); DataManager.getInstance().setLastCardId(card_id); if(this.manager.getCurrentUser() == null) { User u = User.getByCardId(card_id); if(u != null) MainManager.getInstance().setCurrentUser(u); } } @Override public void onUserInteraction(){ if(MainManager.getInstance().getCurrentUser() != null) { MainManager.getInstance().startTimer(); //MainManager.getInstance().stopScreenSaverTimer(); } else { MainManager.getInstance().stopTimer(); //MainManager.getInstance().resetScreenSaverTimer(); } } public static String byteArrayToHex(byte[] a) { StringBuilder sb = new StringBuilder(a.length * 2); for(byte b: a) sb.append(String.format("%02x", b & 0xff)); return sb.toString(); } public void onClick(View v) { UiManager.getInstance().onClick(v); } public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case R.id.action_learn_card_id: MainManager.getInstance().stopTimer(); if (this.manager.getCurrentUser() != null){ new AlertDialog.Builder(this) .setTitle(this.getResources().getString(R.string.confirm_learn_card)) .setMessage("Bitte die Karte vorhalten und nach dem Ton auf ok drücken.") .setNeutralButton(android.R.string.ok, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { MainManager.getInstance().saveCardId(); } }) .setIcon(android.R.drawable.ic_dialog_alert) .show(); } else { Toast.makeText(this, "Bitte User auswählen", Toast.LENGTH_LONG).show(); } break; case R.id.action_learn_barcode: MainManager.getInstance().stopTimer(); this.barcodeLearnDialog = new BarcodeLearnDialog(); MainManager.getInstance().setBarcodeLearning(true); this.barcodeLearnDialog.setOnDismissListener(new DialogInterface.OnDismissListener() { @Override public void onDismiss(DialogInterface dialogInterface) { MainManager.getInstance().setBarcodeLearning(false); } }); this.barcodeLearnDialog.show(); break; default: break; } return true; } public void removeOrderOnClickHandler(View v) { MainManager.getInstance().removeOrder((Order) v.getTag()); } @Override public boolean onKey(View view, int keyCode, KeyEvent keyEvent) { return false; } @Override public boolean dispatchKeyEvent(KeyEvent event) { List blockedKeys = new ArrayList(Arrays.asList(KeyEvent.KEYCODE_VOLUME_DOWN, KeyEvent.KEYCODE_VOLUME_UP)); if (blockedKeys.contains(event.getKeyCode())) { return true; } if(this.manager.getCurrentUser() != null) { if (event.getAction() == KeyEvent.ACTION_UP) { if (KeyEvent.KEYCODE_ENTER == event.getKeyCode()) { Product p = Product.getOneByBarcode(this.barcode.trim().replace("\n", "").toString()); if (p != null) { Order order = new Order(p); UiManager.getInstance().addOrder(order); this.manager.addOrder(order); } else { Toast.makeText(this, "Barcode not found: " + this.barcode, Toast.LENGTH_LONG).show(); } this.barcode = ""; } else { this.barcode += (char) event.getUnicodeChar(); } } } return super.dispatchKeyEvent(event); } @Override public void onBackPressed() { // nothing to do here // … really } }