package ca.grocerygo.android; import android.app.AlertDialog; import android.app.SearchManager; import android.content.*; import android.os.Bundle; import android.preference.PreferenceManager; import android.support.v4.app.ActionBarDrawerToggle; import android.support.v4.content.LocalBroadcastManager; import android.support.v4.widget.DrawerLayout; import android.util.Log; import android.widget.ListView; import android.widget.Toast; import ca.grocerygo.android.fragment.ToggleLocationDialogFragment; import ca.grocerygo.android.fragment.ToggleWifiDialogFragment; import ca.grocerygo.android.gcm.GroceryGCMBroadcastReceiver; import ca.grocerygo.android.services.NetworkHandler; import ca.grocerygo.android.utils.*; import com.actionbarsherlock.app.SherlockFragmentActivity; import com.actionbarsherlock.view.Menu; import com.actionbarsherlock.view.MenuItem; import com.actionbarsherlock.widget.SearchView; import de.keyboardsurfer.android.widget.crouton.Configuration; import de.keyboardsurfer.android.widget.crouton.Crouton; import de.keyboardsurfer.android.widget.crouton.Style; public class CategoryTopFragmentActivity extends SherlockFragmentActivity { public static final String INTENT_EXTRA_FLAG_LOCATION_SERVICE_BAD = "intent_extra_flag_location_service_bad"; public static final String INTENT_EXTRA_FLAG_LOCATION_NOT_SUPPORTED = "intent_extra_flag_location_not_supported"; private static final String SETTINGS_IS_REFRESHING = "isRefreshing"; private Context mContext; private DrawerLayout mDrawerLayout; private ListView mDrawerList; private ActionBarDrawerToggle mDrawerToggle; RefreshStatusReceiver mRefreshStatusReceiver; MenuItem refreshItem; private Menu mMenu; public static Double mPriceRangeMin; public static Double mPriceRangeMax; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.category_activity); mContext = this; GroceryGoUtils.NavigationDrawerBundle drawerBundle = GroceryGoUtils.configNavigationDrawer(this, true, R.string.title_main); this.mDrawerLayout = drawerBundle.getDrawerLayout(); this.mDrawerList = drawerBundle.getDrawerList(); this.mDrawerToggle = drawerBundle.getDrawerToggle(); handleIntent(getIntent()); } @Override protected void onPostCreate(Bundle savedInstanceState) { super.onPostCreate(savedInstanceState); mDrawerToggle.syncState(); SharedPreferences settings = PreferenceManager.getDefaultSharedPreferences(this); boolean isLocAva = settings.getBoolean(GroceryGoUtils.LOCATION_IS_LOATION_AVA, false); boolean isLocTogglePromted = settings.getBoolean(GroceryGoUtils.LOCATION_IS_LOATION_TOGGLE_PROMTED, false); // If we see that user has disabled all locations, we prompt them to use it. if (!isLocAva & !isLocTogglePromted) { ToggleLocationDialogFragment toggleLocDialog = new ToggleLocationDialogFragment(); toggleLocDialog.show(this.getSupportFragmentManager(), "toggle_location_dialog"); SharedPreferences.Editor settingsEditor = settings.edit(); settingsEditor.putBoolean(GroceryGoUtils.LOCATION_IS_LOATION_TOGGLE_PROMTED, true); settingsEditor.commit(); } } @Override public void onNewIntent(Intent intent) { super.onNewIntent(intent); setIntent(intent); handleIntent(intent); } private void handleIntent(Intent intent) { if (Intent.ACTION_SEARCH.equals(intent.getAction())) { // Gets the search query from the voice recognizer intent //String query = intent.getStringExtra(SearchManager.QUERY); // Collapse the search view as a search is performed MenuItem searchItem = mMenu.findItem(R.id.search); SearchView searchView = (SearchView) mMenu.findItem(R.id.search).getActionView(); searchItem.collapseActionView(); searchView.setQuery("", false); // If on the home page and doing a global search, send the intent // to the GlobalSearchActivity Intent globalSearchIntent = new Intent(this, GlobalSearchFragmentActivity.class); GroceryGoUtils.copyIntentData(intent, globalSearchIntent); globalSearchIntent.putExtra(GlobalSearchFragmentActivity.GLOBAL_SEARCH, true); startActivity(globalSearchIntent); } else { boolean localizationWarningFlag; localizationWarningFlag = intent.getBooleanExtra(INTENT_EXTRA_FLAG_LOCATION_SERVICE_BAD, false); if (localizationWarningFlag) { AlertDialog.Builder builder = new AlertDialog.Builder(this); builder.setMessage("Could not determine location. Sales data will not be available. Make sure location sharing is turned on to get the most out of this app.").setTitle("WARNING"); builder.setPositiveButton("Continue", null); AlertDialog dialog = builder.create(); dialog.show(); } localizationWarningFlag = intent.getBooleanExtra(INTENT_EXTRA_FLAG_LOCATION_NOT_SUPPORTED, false); if (localizationWarningFlag) { AlertDialog.Builder builder = new AlertDialog.Builder(this); builder.setMessage("Your location is not fully supported. Sales data will not be available.").setTitle("WARNING"); builder.setPositiveButton("Continue", null); AlertDialog dialog = builder.create(); dialog.show(); } } } @Override protected void onResume() { super.onResume(); promptIfEmptyDb(this); mRefreshStatusReceiver = new RefreshStatusReceiver(); IntentFilter mStatusIntentFilter = new IntentFilter(NetworkHandler.REFRESH_COMPLETED_ACTION); mStatusIntentFilter.addCategory(Intent.CATEGORY_DEFAULT); LocalBroadcastManager.getInstance(this).registerReceiver(mRefreshStatusReceiver, mStatusIntentFilter); // show a changelog dialog if it's new ChangeLogDialog cd = new ChangeLogDialog(this); cd.show(); if (refreshItem != null) RefreshAnimation.refreshIcon(mContext, false, refreshItem); invalidateOptionsMenu(); refreshItem = null; } private void promptIfEmptyDb(Context context) { SharedPreferences settings = PreferenceManager.getDefaultSharedPreferences(context); boolean isDBPopulated = settings.getBoolean(SplashScreenActivity.SETTINGS_IS_DB_POPULATED, false); if (!ServerURLs.checkNetworkStatus(getBaseContext()) && !isDBPopulated) { ToggleWifiDialogFragment toggleWifiDialog = new ToggleWifiDialogFragment(); toggleWifiDialog.show(this.getSupportFragmentManager(), "toggle_wifi_dialog"); } else if (ServerURLs.checkNetworkStatus(getBaseContext()) && !isDBPopulated) { SharedPreferences.Editor settingsEditor = settings.edit(); settingsEditor.putBoolean(GroceryGCMBroadcastReceiver.SETTINGS_IS_NEW_DATA_AVA, true); settingsEditor.commit(); } } @Override protected void onPause() { GroceryRefreshTrigger.stopAll(this); LocalBroadcastManager.getInstance(this).unregisterReceiver(mRefreshStatusReceiver); RefreshAnimation.refreshIcon(this, false, refreshItem); SharedPreferences settings = PreferenceManager.getDefaultSharedPreferences(this); SharedPreferences.Editor settingsEditor = settings.edit(); if (settings.getBoolean(SETTINGS_IS_REFRESHING, false)) { settingsEditor.putBoolean(GroceryGCMBroadcastReceiver.SETTINGS_IS_NEW_DATA_AVA, true); settingsEditor.putBoolean(SETTINGS_IS_REFRESHING, false); settingsEditor.commit(); } invalidateOptionsMenu(); refreshItem = null; Crouton.cancelAllCroutons(); super.onPause(); } @Override protected void onDestroy() { Crouton.cancelAllCroutons(); super.onDestroy(); } @Override public boolean onCreateOptionsMenu(final Menu menu) { mMenu = menu; return true; } @Override public boolean onPrepareOptionsMenu(Menu menu) { SharedPreferences settings = PreferenceManager.getDefaultSharedPreferences(this); boolean isRefreshing = settings.getBoolean(CategoryTopFragmentActivity.SETTINGS_IS_REFRESHING, false); boolean isNewDataAva = settings.getBoolean(GroceryGCMBroadcastReceiver.SETTINGS_IS_NEW_DATA_AVA, false); menu.clear(); configSearchView(menu); if (isRefreshing) { refreshItem = mMenu.findItem(R.id.refresh); Log.i(GroceryApplication.TAG, "refreshItem is: " + (refreshItem == null)); if (refreshItem == null) { Log.i(GroceryApplication.TAG, "refreshItem is: null, gonna add it"); menu.add(0, R.id.refresh, Menu.NONE, R.string.navdrawer_item_sync).setIcon(R.drawable.ic_menu_refresh).setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS); refreshItem = mMenu.findItem(R.id.refresh); if (refreshItem != null) { Log.i(GroceryApplication.TAG, "refreshItem is: added, gonna start animation"); RefreshAnimation.refreshIcon(mContext, true, refreshItem); } } Style INFINITE = new Style.Builder().setBackgroundColorValue(Style.holoBlueLight).build(); Configuration CONFIGURATION_INFINITE = new Configuration.Builder().setDuration(Configuration.DURATION_INFINITE).build(); Crouton.makeText(this, R.string.gcm_newdata_notification, INFINITE).setConfiguration(CONFIGURATION_INFINITE).show(); } else if (isNewDataAva) { if (refreshItem == null) { menu.add(0, R.id.refresh, Menu.NONE, R.string.navdrawer_item_sync).setIcon(R.drawable.ic_menu_refresh).setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS); } Style INFINITE = new Style.Builder().setBackgroundColorValue(Style.holoBlueLight).build(); Configuration CONFIGURATION_INFINITE = new Configuration.Builder().setDuration(Configuration.DURATION_INFINITE).build(); Crouton.makeText(this, R.string.gcm_newdata_notification, INFINITE).setConfiguration(CONFIGURATION_INFINITE).show(); } if (this.mDrawerLayout != null && this.mDrawerList != null) { for (int i = 0; i < menu.size(); i++) { MenuItem item = menu.getItem(i); item.setVisible(!mDrawerLayout.isDrawerOpen(mDrawerList)); } } return super.onPrepareOptionsMenu(menu); } private void configSearchView(Menu menu) { // Create a blank SearchView and set the searchable configuration SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE); SearchView searchView = new SearchView(getSherlock().getActionBar().getThemedContext()); searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName())); searchView.setIconifiedByDefault(true); // Set the blank SearchView to the menu MenuItem searchItem = menu.add(0, R.id.search, Menu.NONE, R.string.groceryoverview_menu_item_search); searchItem.setIcon(R.drawable.ic_menu_search).setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS | MenuItem.SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW); searchItem.setActionView(searchView); } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case R.id.refresh: refreshContent(mContext); return true; case android.R.id.home: // When home is pressed if (mDrawerLayout.isDrawerOpen(mDrawerList)) mDrawerLayout.closeDrawer(mDrawerList); else mDrawerLayout.openDrawer(mDrawerList); return true; } return super.onOptionsItemSelected(item); } private void refreshContent(Context context) { Toast t = Toast.makeText(this, "Fetching new items...", Toast.LENGTH_SHORT); t.show(); SharedPreferences settings = PreferenceManager.getDefaultSharedPreferences(context); SharedPreferences.Editor settingsEditor = settings.edit(); settingsEditor.putBoolean(SETTINGS_IS_REFRESHING, true); settingsEditor.commit(); refreshItem = mMenu.findItem(R.id.refresh); RefreshAnimation.refreshIcon(mContext, true, refreshItem); GroceryRefreshTrigger.refreshAll(getApplicationContext()); } private class RefreshStatusReceiver extends BroadcastReceiver { private RefreshStatusReceiver() { } @Override public void onReceive(Context context, Intent intent) { SharedPreferences settings = PreferenceManager.getDefaultSharedPreferences(context); SharedPreferences.Editor settingsEditor = settings.edit(); int resultCode = intent.getBundleExtra("bundle").getInt(NetworkHandler.CONNECTION_STATE); int requestType = intent.getBundleExtra("bundle").getInt(NetworkHandler.REQUEST_TYPE); boolean newData = intent.getBundleExtra("bundle").getBoolean(GroceryGCMBroadcastReceiver.SETTINGS_IS_NEW_DATA_AVA); Toast toast = null; if (resultCode == NetworkHandler.NO_CONNECTION) { RefreshAnimation.refreshIcon(context, false, refreshItem); toast = Toast.makeText(mContext, "No Internet Connection", Toast.LENGTH_SHORT); toast.show(); settingsEditor.putBoolean(SETTINGS_IS_REFRESHING, false); settingsEditor.commit(); return; } if (newData) { invalidateOptionsMenu(); settingsEditor.putBoolean(SETTINGS_IS_REFRESHING, false); settingsEditor.commit(); } if (requestType == NetworkHandler.GRO && resultCode == NetworkHandler.CONNECTION) { Log.i(GroceryApplication.TAG, "******** Refresh is done... ********"); RefreshAnimation.refreshIcon(context, false, refreshItem); settingsEditor.putBoolean(GroceryGCMBroadcastReceiver.SETTINGS_IS_NEW_DATA_AVA, false); settingsEditor.putBoolean(SETTINGS_IS_REFRESHING, false); settingsEditor.putBoolean(SplashScreenActivity.SETTINGS_IS_DB_POPULATED, true); settingsEditor.commit(); invalidateOptionsMenu(); refreshItem = null; Crouton.cancelAllCroutons(); toast = Toast.makeText(mContext, "Groceries Updated", Toast.LENGTH_SHORT); toast.show(); } } } }