package org.commcare.activities; import android.annotation.TargetApi; import android.app.ActionBar; import android.os.Build; import android.os.Bundle; import android.support.v4.widget.DrawerLayout; import android.view.View; import android.widget.AdapterView; import android.widget.ListView; import org.commcare.activities.components.NavDrawerItem; import org.commcare.adapters.NavDrawerAdapter; import org.commcare.dalvik.R; import org.commcare.preferences.CommCarePreferences; import org.commcare.utils.ChangeLocaleUtil; import org.commcare.utils.SyncDetailCalculations; import org.javarosa.core.services.locale.Localization; import java.util.HashMap; import java.util.Map; /** * Manages the UI of the nav drawer in RootMenuHomeActivity * * @author Aliza Stone */ public class HomeNavDrawerController { private static final String ABOUT_CC_DRAWER_ITEM_ID = "about-cc"; private static final String UPDATE_DRAWER_ITEM_ID = "update"; private static final String CHANGE_LANGUAGE_DRAWER_ITEM_ID = "change-language"; private static final String SETTINGS_DRAWER_ITEM_ID = "settings"; private static final String ADVANCED_DRAWER_ITEM_ID = "advanced"; private static final String SYNC_DRAWER_ITEM_ID = "sync"; private static final String SAVED_FORMS_ITEM_ID = "saved-forms"; private static final String LOGOUT_DRAWER_ITEM_ID = "home-logout"; protected static final String KEY_DRAWER_WAS_OPEN = "drawer-open-before-rotation"; private RootMenuHomeActivity activity; private DrawerLayout drawerLayout; private ListView navDrawerList; private Map<String, NavDrawerItem> allDrawerItems; private NavDrawerItem[] drawerItemsShowing; private boolean reopenDrawerWhenResumed; public HomeNavDrawerController(RootMenuHomeActivity activity) { this.activity = activity; drawerLayout = (DrawerLayout)activity.findViewById(R.id.menu_activity_drawer_layout); navDrawerList = (ListView)activity.findViewById(R.id.nav_drawer); // Disable opening of the nav drawer via swiping drawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED); } @TargetApi(Build.VERSION_CODES.JELLY_BEAN) protected void setupNavDrawer(Bundle savedInstanceState) { initDrawerItemsMap(); determineDrawerItemsToInclude(); navDrawerList.setOnItemClickListener(getNavDrawerClickListener()); refreshItems(); ActionBar actionBar = activity.getActionBar(); actionBar.setHomeButtonEnabled(true); actionBar.setDisplayHomeAsUpEnabled(false); actionBar.setDisplayUseLogoEnabled(false); actionBar.setIcon(R.drawable.ic_menu_bar); if (savedInstanceState != null && savedInstanceState.getBoolean(KEY_DRAWER_WAS_OPEN)) { reopenDrawerWhenResumed = true; } } protected void reopenDrawerIfNeeded() { if (reopenDrawerWhenResumed) { openDrawer(); reopenDrawerWhenResumed = false; } } protected void refreshItems() { updateItemSubtexts(); determineDrawerItemsToInclude(); navDrawerList.setAdapter(new NavDrawerAdapter(activity, drawerItemsShowing)); } private void updateItemSubtexts() { NavDrawerItem syncItem = allDrawerItems.get(SYNC_DRAWER_ITEM_ID); syncItem.subtext = SyncDetailCalculations.getLastSyncTimeAndMessage().second; } private void initDrawerItemsMap() { allDrawerItems = new HashMap<>(); for (String itemId : getAllItemIdsInOrder()) { NavDrawerItem item = new NavDrawerItem(itemId, getItemTitle(itemId), getItemIcon(itemId), getItemSubtext(itemId)); allDrawerItems.put(itemId, item); } } private void determineDrawerItemsToInclude() { boolean hideSavedFormsItem = !CommCarePreferences.isSavedFormsEnabled(); boolean hideChangeLanguageItem = ChangeLocaleUtil.getLocaleNames().length <= 1; int numItemsToInclude = allDrawerItems.size() - (hideChangeLanguageItem ? 1 : 0) - (hideSavedFormsItem ? 1 : 0); drawerItemsShowing = new NavDrawerItem[numItemsToInclude]; int index = 0; for (String id : getAllItemIdsInOrder()) { NavDrawerItem item = allDrawerItems.get(id); if (!excludeItem(id, hideChangeLanguageItem, hideSavedFormsItem)) { drawerItemsShowing[index] = item; index++; } } } private boolean excludeItem(String itemId, boolean hideChangeLanguageItem, boolean hideSavedFormsItem) { return (itemId.equals(CHANGE_LANGUAGE_DRAWER_ITEM_ID) && hideChangeLanguageItem) || (itemId.equals(SAVED_FORMS_ITEM_ID) && hideSavedFormsItem); } private ListView.OnItemClickListener getNavDrawerClickListener() { return new ListView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { drawerLayout.closeDrawer(navDrawerList); switch(drawerItemsShowing[position].id) { case SYNC_DRAWER_ITEM_ID: activity.sendFormsOrSync(true); break; case SAVED_FORMS_ITEM_ID: activity.goToFormArchive(false); break; case UPDATE_DRAWER_ITEM_ID: activity.launchUpdateActivity(); break; case ABOUT_CC_DRAWER_ITEM_ID: activity.showAboutCommCareDialog(); break; case SETTINGS_DRAWER_ITEM_ID: HomeScreenBaseActivity.createPreferencesMenu(activity); break; case ADVANCED_DRAWER_ITEM_ID: activity.startAdvancedActionsActivity(); break; case CHANGE_LANGUAGE_DRAWER_ITEM_ID: activity.showLocaleChangeMenu(null); break; case LOGOUT_DRAWER_ITEM_ID: activity.userTriggeredLogout(); break; } } }; } private static String[] getAllItemIdsInOrder() { return new String[] { ABOUT_CC_DRAWER_ITEM_ID, SETTINGS_DRAWER_ITEM_ID, ADVANCED_DRAWER_ITEM_ID, CHANGE_LANGUAGE_DRAWER_ITEM_ID, SAVED_FORMS_ITEM_ID, UPDATE_DRAWER_ITEM_ID, SYNC_DRAWER_ITEM_ID, LOGOUT_DRAWER_ITEM_ID }; } private static String getItemTitle(String id) { switch(id) { case ABOUT_CC_DRAWER_ITEM_ID: return Localization.get("home.menu.about"); case SETTINGS_DRAWER_ITEM_ID: return Localization.get("home.menu.settings"); case UPDATE_DRAWER_ITEM_ID: return Localization.get("home.menu.update"); case CHANGE_LANGUAGE_DRAWER_ITEM_ID: return Localization.get("home.menu.locale.change"); case ADVANCED_DRAWER_ITEM_ID: return Localization.get("home.menu.advanced"); case SYNC_DRAWER_ITEM_ID: return Localization.get("home.sync"); case SAVED_FORMS_ITEM_ID: return Localization.get("home.menu.saved.forms"); case LOGOUT_DRAWER_ITEM_ID: return Localization.get("home.logout"); } return ""; } private static int getItemIcon(String id) { switch(id) { case ABOUT_CC_DRAWER_ITEM_ID: return R.drawable.ic_about_cc_nav_drawer; case SETTINGS_DRAWER_ITEM_ID: return R.drawable.ic_settings_nav_drawer; case UPDATE_DRAWER_ITEM_ID: return R.drawable.ic_update_nav_drawer; case CHANGE_LANGUAGE_DRAWER_ITEM_ID: return R.drawable.ic_change_lang_nav_drawer; case ADVANCED_DRAWER_ITEM_ID: return R.drawable.ic_cog_nav_drawer; case SYNC_DRAWER_ITEM_ID: return R.drawable.ic_sync_nav_drawer; case SAVED_FORMS_ITEM_ID: return R.drawable.ic_saved_forms_nav_drawer; case LOGOUT_DRAWER_ITEM_ID: return R.drawable.ic_logout_nav_drawer; } return -1; } private static String getItemSubtext(String id) { if (SYNC_DRAWER_ITEM_ID.equals(id)) { return SyncDetailCalculations.getLastSyncTimeAndMessage().second; } else { return null; } } protected boolean isDrawerOpen() { return drawerLayout.isDrawerOpen(navDrawerList); } protected void toggleDrawer() { if (isDrawerOpen()) { closeDrawer(); } else { openDrawer(); } } private void openDrawer() { drawerLayout.openDrawer(navDrawerList); } private void closeDrawer() { drawerLayout.closeDrawer(navDrawerList); } }