/* * Copyright (C) 2009 Android Shuffle Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.dodgybits.shuffle.android.core.view; import org.dodgybits.android.shuffle.R; import org.dodgybits.shuffle.android.core.activity.HelpActivity; import org.dodgybits.shuffle.android.list.activity.ContextsActivity; import org.dodgybits.shuffle.android.list.activity.ProjectsActivity; import org.dodgybits.shuffle.android.list.activity.State; import org.dodgybits.shuffle.android.list.activity.expandable.ExpandableContextsActivity; import org.dodgybits.shuffle.android.list.activity.expandable.ExpandableProjectsActivity; import org.dodgybits.shuffle.android.list.activity.task.InboxActivity; import org.dodgybits.shuffle.android.list.activity.task.TabbedDueActionsActivity; import org.dodgybits.shuffle.android.list.activity.task.TicklerActivity; import org.dodgybits.shuffle.android.list.activity.task.TopTasksActivity; import org.dodgybits.shuffle.android.list.activity.task.TrashActivity; import org.dodgybits.shuffle.android.preference.activity.PreferencesActivity; import org.dodgybits.shuffle.android.preference.model.Preferences; import org.dodgybits.shuffle.android.synchronisation.tracks.activity.SynchronizeActivity; import android.app.Activity; import android.content.Context; import android.content.Intent; import android.net.Uri; import android.util.Log; import android.view.Menu; import android.view.MenuItem; import android.view.SubMenu; public class MenuUtils { private static final String cTag = "MenuUtils"; private MenuUtils() { // deny } // Identifiers for our menu items. public static final int SAVE_ID = Menu.FIRST; public static final int SAVE_AND_ADD_ID = Menu.FIRST + 1; public static final int REVERT_ID = Menu.FIRST + 2; public static final int DISCARD_ID = Menu.FIRST + 3; public static final int DELETE_ID = Menu.FIRST + 4; public static final int INSERT_ID = Menu.FIRST + 5; public static final int INSERT_CHILD_ID = Menu.FIRST + 6; public static final int INSERT_GROUP_ID = Menu.FIRST + 7; public static final int INBOX_ID = Menu.FIRST + 10; public static final int CALENDAR_ID = Menu.FIRST + 11; public static final int TOP_TASKS_ID = Menu.FIRST + 12; public static final int PROJECT_ID = Menu.FIRST + 13; public static final int CONTEXT_ID = Menu.FIRST + 14; public static final int TICKLER_ID = Menu.FIRST + 15; public static final int TRASH_ID = Menu.FIRST + 16; public static final int PREFERENCE_ID = Menu.FIRST + 20; public static final int HELP_ID = Menu.FIRST + 21; public static final int SYNC_ID = Menu.FIRST + 22; public static final int SEARCH_ID = Menu.FIRST + 23; public static final int CLEAN_INBOX_ID = Menu.FIRST + 50; public static final int PERMANENTLY_DELETE_ID = Menu.FIRST + 51; // Menu item for activity specific items public static final int PUT_BACK_ID = Menu.FIRST + 100; public static final int COMPLETE_ID = Menu.FIRST + 101; public static final int MOVE_UP_ID = Menu.FIRST + 102; public static final int MOVE_DOWN_ID = Menu.FIRST + 103; // Editor menus private static final int SAVE_ORDER = 1; private static final int SAVE_AND_ADD_ORDER = 2; private static final int REVERT_ORDER = 3; private static final int DISCARD_ORDER = 3; // Context menus private static final int EDIT_ORDER = 1; private static final int PUT_BACK_ORDER = 3; private static final int COMPLETE_ORDER = 4; private static final int MOVE_UP_ORDER = 5; private static final int MOVE_DOWN_ORDER = 6; private static final int DELETE_ORDER = 10; // List menus private static final int INSERT_ORDER = 1; private static final int INSERT_CHILD_ORDER = 1; private static final int INSERT_GROUP_ORDER = 2; private static final int CLEAN_INBOX_ORDER = 101; private static final int PERMANENTLY_DELETE_ORDER = 102; // General menus private static final int PERSPECTIVE_ORDER = 201; private static final int PREFERENCE_ORDER = 202; private static final int SYNCH_ORDER = 203; private static final int SEARCH_ORDER = 204; private static final int HELP_ORDER = 205; public static void addInsertMenuItems(Menu menu, String itemName, boolean isTaskList, Context context) { String menuName = context.getResources().getString(R.string.menu_insert, itemName); menu.add(Menu.NONE, INSERT_ID, INSERT_ORDER, menuName) .setIcon(android.R.drawable.ic_menu_add) .setAlphabeticShortcut(isTaskList ? 'c' : 'a'); } public static void addExpandableInsertMenuItems(Menu menu, String groupName, String childName, Context context) { String menuName; menuName = context.getResources().getString(R.string.menu_insert, childName); menu.add(Menu.NONE, INSERT_CHILD_ID, INSERT_CHILD_ORDER, menuName) .setIcon(android.R.drawable.ic_menu_add).setAlphabeticShortcut('c'); menuName = context.getResources().getString(R.string.menu_insert, groupName); menu.add(Menu.NONE, INSERT_GROUP_ID, INSERT_GROUP_ORDER, menuName) .setIcon(android.R.drawable.ic_menu_add).setAlphabeticShortcut('a'); } public static void addViewMenuItems(Menu menu, int currentViewMenuId) { SubMenu viewMenu = menu.addSubMenu(Menu.NONE, Menu.NONE, PERSPECTIVE_ORDER, R.string.menu_view) .setIcon(R.drawable.preferences_system_windows); viewMenu.add(Menu.NONE, INBOX_ID, 0, R.string.title_inbox) .setChecked(INBOX_ID == currentViewMenuId); viewMenu.add(Menu.NONE, CALENDAR_ID, 1, R.string.title_due_tasks) .setChecked(CALENDAR_ID == currentViewMenuId); viewMenu.add(Menu.NONE, TOP_TASKS_ID, 2, R.string.title_next_tasks) .setChecked(TOP_TASKS_ID == currentViewMenuId); viewMenu.add(Menu.NONE, PROJECT_ID, 3, R.string.title_project) .setChecked(PROJECT_ID == currentViewMenuId); viewMenu.add(Menu.NONE, CONTEXT_ID, 4, R.string.title_context) .setChecked(CONTEXT_ID == currentViewMenuId); viewMenu.add(Menu.NONE, TICKLER_ID, 5, R.string.title_context) .setChecked(TICKLER_ID == currentViewMenuId); viewMenu.add(Menu.NONE, TRASH_ID, 6, R.string.title_context) .setChecked(TRASH_ID == currentViewMenuId); } public static void addEditorMenuItems(Menu menu, int state) { menu.add(Menu.NONE, SAVE_ID, SAVE_ORDER, R.string.menu_save) .setIcon(android.R.drawable.ic_menu_save).setAlphabeticShortcut('s'); menu.add(Menu.NONE, SAVE_AND_ADD_ID, SAVE_AND_ADD_ORDER, R.string.menu_save_and_add) .setIcon(android.R.drawable.ic_menu_save); // Build the menus that are shown when editing. if (state == State.STATE_EDIT) { menu.add(Menu.NONE, REVERT_ID, REVERT_ORDER, R.string.menu_revert) .setIcon(android.R.drawable.ic_menu_revert).setAlphabeticShortcut('r'); menu.add(Menu.NONE, DELETE_ID, DELETE_ORDER, R.string.menu_delete) .setIcon(android.R.drawable.ic_menu_delete).setAlphabeticShortcut('d'); // Build the menus that are shown when inserting. } else { menu.add(Menu.NONE, DISCARD_ID, DISCARD_ORDER, R.string.menu_discard) .setIcon(android.R.drawable.ic_menu_close_clear_cancel).setAlphabeticShortcut('d'); } } public static void addPrefsHelpMenuItems(Context context, Menu menu) { menu.add(Menu.NONE, PREFERENCE_ID, PREFERENCE_ORDER, R.string.menu_preferences) .setIcon(android.R.drawable.ic_menu_preferences).setAlphabeticShortcut('p'); menu.add(Menu.NONE, HELP_ID, HELP_ORDER, R.string.menu_help) .setIcon(android.R.drawable.ic_menu_help).setAlphabeticShortcut('h'); } public static void addSyncMenuItem(Context context, Menu menu) { menu.add(Menu.NONE, SYNC_ID, SYNCH_ORDER, R.string.menu_sync) .setIcon(android.R.drawable.ic_menu_rotate).setVisible(Preferences.validateTracksSettings(context)); } public static void addSearchMenuItem(Context context, Menu menu) { menu.add(Menu.NONE, SEARCH_ID, SEARCH_ORDER, R.string.menu_search) .setIcon(android.R.drawable.ic_menu_search).setAlphabeticShortcut('s'); } public static void addSelectedAlternativeMenuItems(Menu menu, Uri uri, boolean includeView) { // Build menu... always starts with the EDIT action... int viewIndex = 0; int editIndex = (includeView ? 1 : 0); Intent[] specifics = new Intent[editIndex + 1]; MenuItem[] items = new MenuItem[editIndex + 1]; if (includeView) { specifics[viewIndex] = new Intent(Intent.ACTION_VIEW, uri); } specifics[editIndex] = new Intent(Intent.ACTION_EDIT, uri); // ... is followed by whatever other actions are available... Intent intent = new Intent(null, uri); intent.addCategory(Intent.CATEGORY_ALTERNATIVE); menu.addIntentOptions(Menu.CATEGORY_ALTERNATIVE, Menu.NONE, EDIT_ORDER, null, specifics, intent, 0, items); // Give a shortcut to the edit action. if (items[editIndex] != null) { items[editIndex].setAlphabeticShortcut('e'); items[editIndex].setIcon(android.R.drawable.ic_menu_edit); } if (includeView && items[viewIndex] != null) { items[viewIndex].setAlphabeticShortcut('v'); items[viewIndex].setIcon(android.R.drawable.ic_menu_view); } } public static void addPutBackMenuItem(Menu menu) { menu.add(Menu.CATEGORY_ALTERNATIVE, PUT_BACK_ID, PUT_BACK_ORDER, R.string.menu_put_back); } public static void addCompleteMenuItem(Menu menu) { menu.add(Menu.CATEGORY_ALTERNATIVE, COMPLETE_ID, COMPLETE_ORDER, R.string.menu_complete) .setIcon(R.drawable.btn_check_on).setAlphabeticShortcut('x'); } public static void addDeleteMenuItem(Menu menu) { menu.add(Menu.CATEGORY_ALTERNATIVE, DELETE_ID, DELETE_ORDER, R.string.menu_delete) .setIcon(android.R.drawable.ic_menu_delete).setAlphabeticShortcut('d'); } public static void addCleanInboxMenuItem(Menu menu) { menu.add(Menu.NONE, CLEAN_INBOX_ID, CLEAN_INBOX_ORDER, R.string.clean_inbox_button_title) .setIcon(R.drawable.edit_clear).setAlphabeticShortcut('i'); } public static void addPermanentlyDeleteMenuItem(Menu menu) { menu.add(Menu.NONE, PERMANENTLY_DELETE_ID, PERMANENTLY_DELETE_ORDER, R.string.permanently_delete_button_title) .setIcon(R.drawable.icon_delete); } public static void addMoveMenuItems(Menu menu, boolean enableUp, boolean enableDown) { if (enableUp) { menu.add(Menu.CATEGORY_ALTERNATIVE, MOVE_UP_ID, MOVE_UP_ORDER, R.string.menu_move_up) .setIcon(R.drawable.go_up).setAlphabeticShortcut('k'); } if (enableDown) { menu.add(Menu.CATEGORY_ALTERNATIVE, MOVE_DOWN_ID, MOVE_DOWN_ORDER, R.string.menu_move_down) .setIcon(R.drawable.go_down).setAlphabeticShortcut('j'); } } public static boolean checkCommonItemsSelected(MenuItem item, Activity activity, int currentViewMenuId) { return checkCommonItemsSelected(item.getItemId(), activity, currentViewMenuId, true); } public static boolean checkCommonItemsSelected(int menuItemId, Activity activity, int currentViewMenuId) { return checkCommonItemsSelected(menuItemId, activity, currentViewMenuId, true); } public static boolean checkCommonItemsSelected(int menuItemId, Activity activity, int currentViewMenuId, boolean finishCurrentActivity) { switch (menuItemId) { case MenuUtils.INBOX_ID: if (currentViewMenuId != INBOX_ID) { Log.d(cTag, "Switching to inbox"); activity.startActivity(new Intent(activity, InboxActivity.class)); if (finishCurrentActivity) activity.finish(); } return true; case MenuUtils.CALENDAR_ID: if (currentViewMenuId != CALENDAR_ID) { Log.d(cTag, "Switching to calendar"); activity.startActivity(new Intent(activity, TabbedDueActionsActivity.class)); if (finishCurrentActivity) activity.finish(); } return true; case MenuUtils.TOP_TASKS_ID: if (currentViewMenuId != TOP_TASKS_ID) { Log.d(cTag, "Switching to top tasks"); activity.startActivity(new Intent(activity, TopTasksActivity.class)); if (finishCurrentActivity) activity.finish(); } return true; case MenuUtils.PROJECT_ID: if (currentViewMenuId != PROJECT_ID) { Log.d(cTag, "Switching to project list"); Class<? extends Activity> activityClass = null; if (Preferences.isProjectViewExpandable(activity)) { activityClass = ExpandableProjectsActivity.class; } else { activityClass = ProjectsActivity.class; } activity.startActivity(new Intent(activity, activityClass)); if (finishCurrentActivity) activity.finish(); } return true; case CONTEXT_ID: if (currentViewMenuId != CONTEXT_ID) { Log.d(cTag, "Switching to context list"); Class<? extends Activity> activityClass = null; if (Preferences.isContextViewExpandable(activity)) { activityClass = ExpandableContextsActivity.class; } else { activityClass = ContextsActivity.class; } activity.startActivity(new Intent(activity, activityClass)); if (finishCurrentActivity) activity.finish(); } return true; case TICKLER_ID: Log.d(cTag, "Switching to tickler list"); activity.startActivity(new Intent(activity, TicklerActivity.class)); return true; case TRASH_ID: Log.d(cTag, "Bringing up trash"); activity.startActivity(new Intent(activity, TrashActivity.class)); return true; case PREFERENCE_ID: Log.d(cTag, "Bringing up preferences"); activity.startActivity(new Intent(activity, PreferencesActivity.class)); return true; case HELP_ID: Log.d(cTag, "Bringing up help"); Intent intent = new Intent(activity, HelpActivity.class); intent.putExtra(HelpActivity.cHelpPage, getHelpScreen(currentViewMenuId)); activity.startActivity(intent); return true; case SYNC_ID: Log.d(cTag, "starting sync"); activity.startActivity(new Intent(activity, SynchronizeActivity.class)); return true; case SEARCH_ID: Log.d(cTag, "starting search"); activity.onSearchRequested(); return true; } return false; } private static int getHelpScreen(int currentViewMenuId) { int result = 0; switch (currentViewMenuId) { case INBOX_ID: result = 1; break; case PROJECT_ID: result = 2; break; case CONTEXT_ID: result = 3; break; case TOP_TASKS_ID: result = 4; break; case CALENDAR_ID: result = 5; break; } return result; } }