/* * Copyright 2014 Bevbot LLC <info@bevbot.com> * * This file is part of the Kegtab package from the Kegbot project. For * more information on Kegtab or Kegbot, see <http://kegbot.org/>. * * Kegtab is free software: you can redistribute it and/or modify it under * the terms of the GNU General Public License as published by the Free * Software Foundation, version 2. * * Kegtab is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have received a copy of the GNU General Public License along * with Kegtab. If not, see <http://www.gnu.org/licenses/>. */ package org.kegbot.app; import android.app.ActionBar; import android.app.Activity; import android.app.PendingIntent; import android.content.Intent; import android.content.IntentFilter; import android.content.IntentFilter.MalformedMimeTypeException; import android.net.Uri; import android.nfc.NfcAdapter; import android.nfc.tech.IsoDep; import android.nfc.tech.MifareClassic; import android.nfc.tech.MifareUltralight; import android.nfc.tech.NfcA; import android.nfc.tech.NfcB; import android.nfc.tech.NfcF; import android.os.Build; import android.os.Bundle; import android.util.Log; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.view.WindowManager; import com.google.common.collect.Lists; import com.squareup.otto.Bus; import com.squareup.otto.Subscribe; import org.kegbot.app.alert.AlertActivity; import org.kegbot.app.alert.AlertCancelledEvent; import org.kegbot.app.alert.AlertCore; import org.kegbot.app.alert.AlertCore.Alert; import org.kegbot.app.alert.AlertPostedEvent; import org.kegbot.app.config.AppConfiguration; import org.kegbot.app.service.KegbotCoreService; import org.kegbot.core.KegbotCore; import java.util.List; /** * An activity which starts the core service on create and resume. * * @author mike wakerly (opensource@hoho.com) */ public class CoreActivity extends Activity { private static final String TAG = CoreActivity.class.getSimpleName(); private Bus mBus; private AppConfiguration mConfig; // TODO(mikey):remove me after moving checkin info elsewhere private AlertCore mAlertCore; private final List<Alert> mCachedAlerts = Lists.newArrayList(); private Menu mMenu; private NfcAdapter mNfcAdapter; private final Object mCoreListener = new Object() { @Subscribe public void onAlertPosted(AlertPostedEvent event) { Log.d(TAG, "Got alert posted"); rebuildAlerts(); } @Subscribe public void onAlertCancelledEvent(AlertCancelledEvent event) { rebuildAlerts(); } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); KegbotCoreService.startService(this); mConfig = KegbotCore.getInstance(this).getConfiguration(); mBus = KegbotCore.getInstance(this).getBus(); mAlertCore = KegbotCore.getInstance(this).getAlertCore(); } @Override protected void onStart() { super.onStart(); mConfig = KegbotCore.getInstance(this).getConfiguration(); mBus = KegbotCore.getInstance(this).getBus(); mAlertCore = KegbotCore.getInstance(this).getAlertCore(); mBus.register(mCoreListener); //enterImmersiveMode(); } @Override protected void onStop() { mBus.unregister(mCoreListener); mMenu = null; super.onStop(); } @Override protected void onResume() { setupActionBar(); if (mConfig.keepScreenOn()) { getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); } registerNfcDispatch(); KegbotCoreService.startService(this); rebuildAlerts(); super.onResume(); } @Override protected void onPause() { unregisterNfcDispatch(); super.onPause(); } protected void setupActionBar() { final ActionBar actionBar = getActionBar(); if (actionBar != null) { actionBar.setDisplayOptions(ActionBar.DISPLAY_SHOW_HOME | ActionBar.DISPLAY_USE_LOGO); actionBar.setTitle(""); } } private void enterImmersiveMode() { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { final View decorView = getWindow().getDecorView(); decorView.setSystemUiVisibility( View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION // hide nav bar | View.SYSTEM_UI_FLAG_FULLSCREEN // hide status bar | View.SYSTEM_UI_FLAG_IMMERSIVE ); } } @Override public boolean onCreateOptionsMenu(Menu menu) { mMenu = menu; getMenuInflater().inflate(R.menu.main, menu); rebuildAlerts(); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case android.R.id.home: Intent intent = new Intent(this, HomeActivity.class); intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); startActivity(intent); return true; case R.id.alertUpdate: Intent marketIntent = new Intent(Intent.ACTION_VIEW); marketIntent.setData(Uri.parse("market://details?id=org.kegbot.app")); PinActivity.startThroughPinActivity(this, marketIntent); return true; case R.id.alertGeneral: AlertActivity.showDialogs(this); return true; default: return super.onOptionsItemSelected(item); } } private void rebuildAlerts() { if (mMenu == null) { Log.w(TAG, "No menu, can't rebuild."); return; } final List<Alert> alerts = mAlertCore.getAlerts(); if (mCachedAlerts.equals(alerts)) { Log.d(TAG, "No change to alerts."); return; } mCachedAlerts.clear(); mCachedAlerts.addAll(alerts); final MenuItem item = mMenu.findItem(R.id.alertGeneral); if (mCachedAlerts.isEmpty()) { Log.d(TAG, "No alerts, hiding menu."); item.setVisible(false); return; } item.setVisible(true); if (mCachedAlerts.size() == 1) { item.setTitle(mCachedAlerts.get(0).getTitle()); } else { item.setTitle(String.format("%s Alerts", String.valueOf(mCachedAlerts.size()))); } mMenu.findItem(R.id.alertUpdate).setVisible(mConfig.getUpdateAvailable()); } protected void updateConnectivityAlert(boolean isConnected) { if (mMenu != null) { mMenu.findItem(R.id.alertNetwork).setVisible(!isConnected); } } private void registerNfcDispatch() { mNfcAdapter = NfcAdapter.getDefaultAdapter(this); if (mNfcAdapter == null) { Log.d(TAG, "NFC is not available."); return; } final IntentFilter intentFilter = new IntentFilter(NfcAdapter.ACTION_NDEF_DISCOVERED); try { intentFilter.addDataType("*/*"); } catch (MalformedMimeTypeException e) { throw new RuntimeException("Error creating NFC filter", e); } final String[][] techLists = new String[][]{ new String[]{IsoDep.class.getName()}, new String[]{MifareClassic.class.getName()}, new String[]{MifareUltralight.class.getName()}, new String[]{NfcA.class.getName()}, new String[]{NfcB.class.getName()}, new String[]{NfcF.class.getName()} }; final Intent intent = AuthenticatingActivity.getStartForNfcIntent(getApplicationContext()); final PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_CANCEL_CURRENT); mNfcAdapter.enableForegroundDispatch(this, pendingIntent, null, techLists); Log.d(TAG, "NFC dispatch registered."); } private void unregisterNfcDispatch() { if (mNfcAdapter != null) { mNfcAdapter.disableForegroundDispatch(this); mNfcAdapter = null; } } }