diff --git a/astrid/build.gradle b/astrid/build.gradle index fa1a92b86..c75aac67e 100644 --- a/astrid/build.gradle +++ b/astrid/build.gradle @@ -61,8 +61,6 @@ dependencies { compile group: 'com.android.support', name: 'appcompat-v7', version: '19.1.+' - compile 'net.simonvt.menudrawer:menudrawer:3.0.4@aar' - compile project(":api") compile group: 'com.rubiconproject.oss', name: 'jchronic', version: '0.2.6', transitive: false diff --git a/astrid/src/main/java/com/todoroo/astrid/actfm/TagSettingsActivity.java b/astrid/src/main/java/com/todoroo/astrid/actfm/TagSettingsActivity.java index 2e7db8261..2f02f7ac2 100644 --- a/astrid/src/main/java/com/todoroo/astrid/actfm/TagSettingsActivity.java +++ b/astrid/src/main/java/com/todoroo/astrid/actfm/TagSettingsActivity.java @@ -10,13 +10,8 @@ import android.content.Intent; import android.os.Bundle; import android.support.v7.app.ActionBar; import android.text.TextUtils; -import android.util.DisplayMetrics; import android.view.Menu; import android.view.MenuItem; -import android.view.View; -import android.view.View.OnClickListener; -import android.view.ViewGroup.LayoutParams; -import android.view.Window; import android.view.inputmethod.InputMethodManager; import android.widget.EditText; @@ -27,26 +22,16 @@ import com.todoroo.astrid.helper.UUIDHelper; import com.todoroo.astrid.tags.TagFilterExposer; import com.todoroo.astrid.tags.TagService; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; import org.tasks.R; import org.tasks.injection.InjectingActionBarActivity; import org.tasks.preferences.ActivityPreferences; -import org.tasks.preferences.ResourceResolver; import javax.inject.Inject; -import static android.support.v4.view.MenuItemCompat.setShowAsAction; - public class TagSettingsActivity extends InjectingActionBarActivity { - private static final Logger log = LoggerFactory.getLogger(TagSettingsActivity.class); - public static final String TOKEN_NEW_FILTER = "newFilter"; //$NON-NLS-1$ - private static final int MENU_SAVE_ID = R.string.TEA_menu_save; - private static final int MENU_DISCARD_ID = R.string.TEA_menu_discard_changes; - public static final String TOKEN_AUTOPOPULATE_MEMBERS = "autopopulateMembers"; //$NON-NLS-1$ public static final String TOKEN_AUTOPOPULATE_NAME = "autopopulateName"; //$NON-NLS-1$ @@ -56,33 +41,17 @@ public class TagSettingsActivity extends InjectingActionBarActivity { @Inject TagService tagService; @Inject TagDataDao tagDataDao; @Inject ActivityPreferences preferences; - @Inject ResourceResolver resourceResolver; private EditText tagName; private boolean isNewTag = false; - private boolean isDialog; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - setupForDialogOrFullscreen(); + preferences.applyTheme(); setContentView(R.layout.tag_settings_activity); - if (isDialog) { - LayoutParams params = getWindow().getAttributes(); - params.width = LayoutParams.FILL_PARENT; - params.height = LayoutParams.WRAP_CONTENT; - - DisplayMetrics metrics = getResources().getDisplayMetrics(); - if ((metrics.widthPixels / metrics.density) >= ActivityPreferences.MIN_TABLET_HEIGHT) { - params.width = (3 * metrics.widthPixels) / 5; - } else if ((metrics.widthPixels / metrics.density) >= ActivityPreferences.MIN_TABLET_WIDTH) { - params.width = (4 * metrics.widthPixels) / 5; - } - getWindow().setAttributes((android.view.WindowManager.LayoutParams) params); - } - tagData = getIntent().getParcelableExtra(TagViewFragment.EXTRA_TAG_DATA); if (tagData == null) { isNewTag = true; @@ -98,35 +67,7 @@ public class TagSettingsActivity extends InjectingActionBarActivity { setUpSettingsPage(); } - private void setupForDialogOrFullscreen() { - isDialog = preferences.useTabletLayout(); - if (isDialog) { - preferences.applyDialogTheme(); - if (AndroidUtilities.getSdkVersion() < 14) { - requestWindowFeature(Window.FEATURE_NO_TITLE); - } - } else { - preferences.applyTheme(); - } - } - protected void setUpSettingsPage() { - if (isDialog) { - findViewById(R.id.save_and_cancel).setVisibility(View.VISIBLE); - findViewById(R.id.cancel).setOnClickListener(new OnClickListener() { - @Override - public void onClick(View v) { - finish(); - } - }); - findViewById(R.id.save).setOnClickListener(new OnClickListener() { - @Override - public void onClick(View v) { - saveSettings(); - } - }); - } - tagName = (EditText) findViewById(R.id.tag_name); refreshSettingsPage(); @@ -184,7 +125,7 @@ public class TagSettingsActivity extends InjectingActionBarActivity { @Override public void finish() { - finishWithAnimation(!isDialog); + finishWithAnimation(true); } private void finishWithAnimation(boolean backAnimation) { @@ -214,15 +155,7 @@ public class TagSettingsActivity extends InjectingActionBarActivity { @Override public boolean onCreateOptionsMenu(Menu menu) { - MenuItem item = menu.add(Menu.NONE, MENU_DISCARD_ID, 0, R.string.TEA_menu_discard_changes); - item.setIcon(resourceResolver.getResource(R.attr.ic_action_cancel)); - setShowAsAction(item, MenuItem.SHOW_AS_ACTION_IF_ROOM); - - if (isDialog) { - item = menu.add(Menu.NONE, MENU_SAVE_ID, 0, R.string.TEA_menu_save); - item.setIcon(resourceResolver.getResource(R.attr.ic_action_save)); - setShowAsAction(item, MenuItem.SHOW_AS_ACTION_IF_ROOM); - } + getMenuInflater().inflate(R.menu.tag_settings_activity, menu); return super.onCreateOptionsMenu(menu); } @@ -238,10 +171,10 @@ public class TagSettingsActivity extends InjectingActionBarActivity { @Override public boolean onOptionsItemSelected(MenuItem item) { switch(item.getItemId()) { - case MENU_DISCARD_ID: + case R.id.menu_discard: finish(); break; - case MENU_SAVE_ID: + case R.id.menu_save: saveSettings(); break; case android.R.id.home: diff --git a/astrid/src/main/java/com/todoroo/astrid/actfm/TagViewFragment.java b/astrid/src/main/java/com/todoroo/astrid/actfm/TagViewFragment.java index 12be7f00f..549f49fdc 100644 --- a/astrid/src/main/java/com/todoroo/astrid/actfm/TagViewFragment.java +++ b/astrid/src/main/java/com/todoroo/astrid/actfm/TagViewFragment.java @@ -17,7 +17,6 @@ import android.widget.TextView; import com.todoroo.andlib.utility.DateUtilities; import com.todoroo.astrid.activity.AstridActivity; -import com.todoroo.astrid.activity.FilterListFragment; import com.todoroo.astrid.activity.TaskListActivity; import com.todoroo.astrid.activity.TaskListFragment; import com.todoroo.astrid.api.FilterWithCustomIntent; @@ -29,6 +28,7 @@ import com.todoroo.astrid.tags.TagFilterExposer; import com.todoroo.astrid.utility.Flags; import org.tasks.R; +import org.tasks.ui.NavigationDrawerFragment; import javax.inject.Inject; @@ -166,9 +166,9 @@ public class TagViewFragment extends TaskListFragment { Activity activity = getActivity(); if (activity instanceof TaskListActivity) { ((TaskListActivity) activity).setListsTitle(filter.title); - FilterListFragment flf = ((TaskListActivity) activity).getFilterListFragment(); - if (flf != null) { - flf.clear(); + NavigationDrawerFragment navigationDrawer = ((TaskListActivity) activity).getNavigationDrawerFragment(); + if (navigationDrawer != null) { + navigationDrawer.clear(); } } taskAdapter = null; diff --git a/astrid/src/main/java/com/todoroo/astrid/activity/AstridActivity.java b/astrid/src/main/java/com/todoroo/astrid/activity/AstridActivity.java index f818d5009..e39b916f8 100644 --- a/astrid/src/main/java/com/todoroo/astrid/activity/AstridActivity.java +++ b/astrid/src/main/java/com/todoroo/astrid/activity/AstridActivity.java @@ -42,6 +42,7 @@ import org.slf4j.LoggerFactory; import org.tasks.R; import org.tasks.injection.InjectingActionBarActivity; import org.tasks.preferences.Preferences; +import org.tasks.ui.NavigationDrawerFragment; import javax.inject.Inject; @@ -57,7 +58,7 @@ import javax.inject.Inject; * */ public class AstridActivity extends InjectingActionBarActivity - implements FilterListFragment.OnFilterItemClickedListener, + implements NavigationDrawerFragment.OnFilterItemClickedListener, TaskListFragment.OnTaskListItemClickedListener, RecognizerApiListener { @@ -72,11 +73,6 @@ public class AstridActivity extends InjectingActionBarActivity private final RepeatConfirmationReceiver repeatConfirmationReceiver = new RepeatConfirmationReceiver(); - public FilterListFragment getFilterListFragment() { - return (FilterListFragment) getSupportFragmentManager() - .findFragmentByTag(FilterListFragment.TAG_FILTERLIST_FRAGMENT); - } - public TaskListFragment getTaskListFragment() { return (TaskListFragment) getSupportFragmentManager() .findFragmentByTag(TaskListFragment.TAG_TASKLIST_FRAGMENT); @@ -147,9 +143,9 @@ public class AstridActivity extends InjectingActionBarActivity protected Bundle configureIntentAndExtrasWithFilter(Intent intent, Filter filter) { if(filter instanceof FilterWithCustomIntent) { - int lastSelectedList = intent.getIntExtra(FilterListFragment.TOKEN_LAST_SELECTED, 0); + int lastSelectedList = intent.getIntExtra(NavigationDrawerFragment.TOKEN_LAST_SELECTED, 0); intent = ((FilterWithCustomIntent)filter).getCustomIntent(); - intent.putExtra(FilterListFragment.TOKEN_LAST_SELECTED, lastSelectedList); + intent.putExtra(NavigationDrawerFragment.TOKEN_LAST_SELECTED, lastSelectedList); } else { intent.putExtra(TaskListFragment.TOKEN_FILTER, filter); } @@ -355,5 +351,4 @@ public class AstridActivity extends InjectingActionBarActivity } } } - } diff --git a/astrid/src/main/java/com/todoroo/astrid/activity/FilterListFragment.java b/astrid/src/main/java/com/todoroo/astrid/activity/FilterListFragment.java deleted file mode 100644 index 73bbf5edc..000000000 --- a/astrid/src/main/java/com/todoroo/astrid/activity/FilterListFragment.java +++ /dev/null @@ -1,401 +0,0 @@ -/** - * Copyright (c) 2012 Todoroo Inc - * - * See the file "LICENSE" for the full license governing this code. - */ -package com.todoroo.astrid.activity; - -import android.app.Activity; -import android.app.AlertDialog; -import android.app.Dialog; -import android.content.BroadcastReceiver; -import android.content.Context; -import android.content.DialogInterface; -import android.content.Intent; -import android.content.IntentFilter; -import android.graphics.Bitmap; -import android.graphics.drawable.BitmapDrawable; -import android.os.Bundle; -import android.view.ContextMenu; -import android.view.ContextMenu.ContextMenuInfo; -import android.view.KeyEvent; -import android.view.LayoutInflater; -import android.view.Menu; -import android.view.MenuItem; -import android.view.View; -import android.view.ViewGroup; -import android.view.inputmethod.EditorInfo; -import android.widget.AdapterView; -import android.widget.AdapterView.AdapterContextMenuInfo; -import android.widget.AdapterView.OnItemLongClickListener; -import android.widget.ArrayAdapter; -import android.widget.EditText; -import android.widget.FrameLayout; -import android.widget.ListView; -import android.widget.TextView; -import android.widget.TextView.OnEditorActionListener; -import android.widget.Toast; - -import com.todoroo.astrid.adapter.FilterAdapter; -import com.todoroo.astrid.api.AstridApiConstants; -import com.todoroo.astrid.api.Filter; -import com.todoroo.astrid.api.FilterListItem; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.tasks.R; -import org.tasks.filters.FilterCounter; -import org.tasks.injection.InjectingListFragment; -import org.tasks.injection.Injector; - -import javax.inject.Inject; - -/** - * Activity that displays a user's task lists and allows users - * to filter their task list. - * - * @author Tim Su - * - */ -public class FilterListFragment extends InjectingListFragment { - - private static final Logger log = LoggerFactory.getLogger(FilterListFragment.class); - - public static final String TAG_FILTERLIST_FRAGMENT = "filterlist_fragment"; //$NON-NLS-1$ - - public static final String TOKEN_LAST_SELECTED = "lastSelected"; //$NON-NLS-1$ - - // -- extra codes - //public static final String SHOW_BACK_BUTTON = "show_back"; //$NON-NLS-1$ - - // --- menu codes - - private static final int CONTEXT_MENU_SHORTCUT = R.string.FLA_context_shortcut; - private static final int CONTEXT_MENU_INTENT = Menu.FIRST + 4; - - public static final int REQUEST_CUSTOM_INTENT = 10; - public static final int REQUEST_NEW_LIST = 4; - - // --- instance variables - - protected FilterAdapter adapter = null; - - private final RefreshReceiver refreshReceiver = new RefreshReceiver(); - - private OnFilterItemClickedListener mListener; - - @Inject FilterCounter filterCounter; - @Inject Injector injector; - - /* ====================================================================== - * ======================================================= initialization - * ====================================================================== */ - - /** Container Activity must implement this interface and we ensure - * that it does during the onAttach() callback - */ - public interface OnFilterItemClickedListener { - public boolean onFilterItemClicked(FilterListItem item); - } - - @Override - public void onAttach(Activity activity) { - super.onAttach(activity); - // Check that the container activity has implemented the callback interface - try { - mListener = (OnFilterItemClickedListener) activity; - adapter = new FilterAdapter(injector, filterCounter, getActivity(), null, R.layout.filter_adapter_row, false, false); - } catch (ClassCastException e) { - throw new ClassCastException(activity.toString() - + " must implement OnFilterItemClickedListener"); //$NON-NLS-1$ - } - } - - /* (non-Javadoc) - * @see com.todoroo.astrid.fragment.ExpandableListFragment#onCreateView(android.view.LayoutInflater, android.view.ViewGroup, android.os.Bundle) - */ - @Override - public View onCreateView(LayoutInflater inflater, ViewGroup container, - Bundle savedInstanceState) { - Activity activity = getActivity(); - int layout = R.layout.filter_list_activity; - return activity.getLayoutInflater().inflate(layout, container, false); - } - - @Override - public void onActivityCreated(Bundle savedInstanceState) { - super.onActivityCreated(savedInstanceState); - // We have a menu item to show in action bar. - setHasOptionsMenu(true); - - getActivity().setDefaultKeyMode(Activity.DEFAULT_KEYS_SEARCH_LOCAL); - - setUpList(); - } - - /* ====================================================================== - * ============================================================ lifecycle - * ====================================================================== */ - - @Override - public void onResume() { - super.onResume(); - if(adapter != null) { - adapter.registerRecevier(); - } - - // also load sync actions - Activity activity = getActivity(); - - if (activity instanceof TaskListActivity) { - ((TaskListActivity) activity).setupPopoverWithFilterList(this); - } - - activity.registerReceiver(refreshReceiver, - new IntentFilter(AstridApiConstants.BROADCAST_EVENT_REFRESH)); - - } - - @Override - public void onPause() { - super.onPause(); - if(adapter != null) { - adapter.unregisterRecevier(); - } - try { - getActivity().unregisterReceiver(refreshReceiver); - } catch (IllegalArgumentException e) { - // Might not have fully initialized - log.error(e.getMessage(), e); - } - } - - /* ====================================================================== - * ===================================================== populating lists - * ====================================================================== */ - - /** Sets up the coach list adapter */ - protected void setUpList() { - adapter.setListView(getListView()); - setListAdapter(adapter); - - // Can't do context menus when list is in popup menu for some reason--workaround - if (((AstridActivity) getActivity()).fragmentLayout == AstridActivity.LAYOUT_SINGLE) { - getListView().setOnItemLongClickListener(new OnItemLongClickListener() { - @Override - public boolean onItemLongClick(AdapterView parent, View view, - int position, long id) { - // Do stuff - final Filter filter = adapter.getItem(position); - final String[] labels = filter.contextMenuLabels; - final Intent[] intents = filter.contextMenuIntents; - ArrayAdapter intentAdapter = new ArrayAdapter<>(getActivity(), android.R.layout.simple_list_item_1); - intentAdapter.add(getString(R.string.FLA_context_shortcut)); - for (String l : labels) { - intentAdapter.add(l); - } - AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); - builder.setTitle(filter.title); - builder.setAdapter(intentAdapter, new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - if (which == 0) { - showCreateShortcutDialog(getActivity(), ShortcutActivity.createIntent(filter), filter); - } else { - getActivity().startActivityForResult(intents[which - 1], REQUEST_CUSTOM_INTENT); - } - } - }); - - Dialog d = builder.create(); - d.setOwnerActivity(getActivity()); - d.show(); - return true; - } - - }); - } else { - registerForContextMenu(getListView()); - } - } - - - /* ====================================================================== - * ============================================================== actions - * ====================================================================== */ - - - @Override - public void onListItemClick(ListView parent, View v, int position, long id) { - Filter item = adapter.getItem(position); - mListener.onFilterItemClicked(item); - } - - @Override - public void onCreateContextMenu(ContextMenu menu, View v, - ContextMenuInfo menuInfo) { - AdapterContextMenuInfo info = (AdapterContextMenuInfo) menuInfo; - - Filter item = adapter.getItem(info.position); - - android.view.MenuItem menuItem; - - if(item instanceof Filter) { - menuItem = menu.add(0, CONTEXT_MENU_SHORTCUT, 0, R.string.FLA_context_shortcut); - menuItem.setIntent(ShortcutActivity.createIntent(item)); - } - - for(int i = 0; i < item.contextMenuLabels.length; i++) { - if(item.contextMenuIntents.length <= i) { - break; - } - menuItem = menu.add(0, CONTEXT_MENU_INTENT, 0, item.contextMenuLabels[i]); - menuItem.setIntent(item.contextMenuIntents[i]); - } - - if(menu.size() > 0) { - menu.setHeaderTitle(item.listingTitle); - } - } - - /** - * Creates a shortcut on the user's home screen - */ - private static void createShortcut(Activity activity, Intent shortcutIntent, String label) { - if(label.length() == 0) { - return; - } - - Bitmap bitmap = superImposeListIcon(activity); - - Intent createShortcutIntent = new Intent(); - createShortcutIntent.putExtra(Intent.EXTRA_SHORTCUT_INTENT, shortcutIntent); - createShortcutIntent.putExtra(Intent.EXTRA_SHORTCUT_NAME, label); - createShortcutIntent.putExtra(Intent.EXTRA_SHORTCUT_ICON, bitmap); - createShortcutIntent.setAction("com.android.launcher.action.INSTALL_SHORTCUT"); //$NON-NLS-1$ - - activity.sendBroadcast(createShortcutIntent); - Toast.makeText(activity, - activity.getString(R.string.FLA_toast_onCreateShortcut, label), Toast.LENGTH_LONG).show(); - } - - public static Bitmap superImposeListIcon(Activity activity) { - return ((BitmapDrawable)activity.getResources().getDrawable(R.drawable.icon)).getBitmap(); - } - - @Override - public boolean onContextItemSelected(android.view.MenuItem item) { - // called when context menu appears - return onOptionsItemSelected(item); - } - - @Override - public boolean onOptionsItemSelected(final MenuItem item) { - // handle my own menus - switch (item.getItemId()) { - case CONTEXT_MENU_SHORTCUT: { - AdapterContextMenuInfo info = (AdapterContextMenuInfo)item.getMenuInfo(); - final Intent shortcutIntent = item.getIntent(); - FilterListItem filter = ((FilterAdapter.ViewHolder)info.targetView.getTag()).item; - if(filter instanceof Filter) { - showCreateShortcutDialog(getActivity(), shortcutIntent, (Filter) filter); - } - - return true; - } - case CONTEXT_MENU_INTENT: { - Intent intent = item.getIntent(); - getActivity().startActivityForResult(intent, REQUEST_CUSTOM_INTENT); - return true; - } - default: { - TaskListFragment tasklist = (TaskListFragment) getActivity().getSupportFragmentManager().findFragmentByTag(TaskListFragment.TAG_TASKLIST_FRAGMENT); - if (tasklist != null && tasklist.isInLayout()) { - return tasklist.onOptionsItemSelected(item); - } - } - } - return false; - } - - public static void showCreateShortcutDialog(final Activity activity, final Intent shortcutIntent, - final Filter filter) { - FrameLayout frameLayout = new FrameLayout(activity); - frameLayout.setPadding(10, 0, 10, 0); - final EditText editText = new EditText(activity); - if(filter.listingTitle == null) { - filter.listingTitle = ""; //$NON-NLS-1$ - } - editText.setText(filter.listingTitle. - replaceAll("\\(\\d+\\)$", "").trim()); //$NON-NLS-1$ //$NON-NLS-2$ - frameLayout.addView(editText, new FrameLayout.LayoutParams( - FrameLayout.LayoutParams.FILL_PARENT, - FrameLayout.LayoutParams.WRAP_CONTENT)); - - final Runnable createShortcut = new Runnable() { - @Override - public void run() { - String label = editText.getText().toString(); - createShortcut(activity, shortcutIntent, label); - } - }; - editText.setOnEditorActionListener(new OnEditorActionListener() { - @Override - public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { - if(actionId == EditorInfo.IME_NULL) { - createShortcut.run(); - return true; - } - return false; - } - }); - - new AlertDialog.Builder(activity) - .setTitle(R.string.FLA_shortcut_dialog_title) - .setMessage(R.string.FLA_shortcut_dialog) - .setView(frameLayout) - .setIcon(android.R.drawable.ic_dialog_info) - .setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - createShortcut.run(); - } - }) - .setNegativeButton(android.R.string.cancel, null) - .show().setOwnerActivity(activity); - } - - public void clear() { - adapter.clear(); - } - - public void refresh() { - adapter.clear(); - adapter.getLists(); - } - - /** - * Receiver which receives refresh intents - * - * @author Tim Su - * - */ - protected class RefreshReceiver extends BroadcastReceiver { - @Override - public void onReceive(Context context, Intent intent) { - if(intent == null || !AstridApiConstants.BROADCAST_EVENT_REFRESH.equals(intent.getAction())) { - return; - } - - Activity activity = getActivity(); - if (activity != null) { - activity.runOnUiThread(new Runnable() { - @Override - public void run() { - refresh(); - } - }); - } - } - } -} diff --git a/astrid/src/main/java/com/todoroo/astrid/activity/FilterShortcutActivity.java b/astrid/src/main/java/com/todoroo/astrid/activity/FilterShortcutActivity.java index b067f3abc..9a51382e5 100644 --- a/astrid/src/main/java/com/todoroo/astrid/activity/FilterShortcutActivity.java +++ b/astrid/src/main/java/com/todoroo/astrid/activity/FilterShortcutActivity.java @@ -21,6 +21,7 @@ import org.tasks.filters.FilterCounter; import org.tasks.injection.InjectingListActivity; import org.tasks.injection.Injector; import org.tasks.preferences.ActivityPreferences; +import org.tasks.ui.NavigationDrawerFragment; import javax.inject.Inject; @@ -63,7 +64,7 @@ public class FilterShortcutActivity extends InjectingListActivity { } Intent shortcutIntent = ShortcutActivity.createIntent(filter); - Bitmap bitmap = FilterListFragment.superImposeListIcon(FilterShortcutActivity.this); + Bitmap bitmap = NavigationDrawerFragment.superImposeListIcon(FilterShortcutActivity.this); Intent intent = new Intent(); intent.putExtra(Intent.EXTRA_SHORTCUT_INTENT, shortcutIntent); intent.putExtra(Intent.EXTRA_SHORTCUT_NAME, filter.title); diff --git a/astrid/src/main/java/com/todoroo/astrid/activity/TaskEditFragment.java b/astrid/src/main/java/com/todoroo/astrid/activity/TaskEditFragment.java index ede2c8a5e..0496c78f2 100755 --- a/astrid/src/main/java/com/todoroo/astrid/activity/TaskEditFragment.java +++ b/astrid/src/main/java/com/todoroo/astrid/activity/TaskEditFragment.java @@ -922,6 +922,11 @@ ViewPager.OnPageChangeListener, EditNoteActivity.UpdatesChangedListener { @Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { + Activity activity = getActivity(); + if (activity instanceof TaskListActivity && ((TaskListActivity)activity).isDrawerOpen()) { + return; + } + menu.clear(); inflater.inflate(R.menu.task_edit_fragment, menu); if (Build.VERSION.SDK_INT < Build.VERSION_CODES.GINGERBREAD_MR1) { diff --git a/astrid/src/main/java/com/todoroo/astrid/activity/TaskListActivity.java b/astrid/src/main/java/com/todoroo/astrid/activity/TaskListActivity.java index bbad93a59..dc92b7d5d 100644 --- a/astrid/src/main/java/com/todoroo/astrid/activity/TaskListActivity.java +++ b/astrid/src/main/java/com/todoroo/astrid/activity/TaskListActivity.java @@ -12,10 +12,8 @@ import android.content.Context; import android.content.Intent; import android.net.Uri; import android.os.Bundle; -import android.support.v4.app.Fragment; -import android.support.v4.app.FragmentManager; -import android.support.v4.app.FragmentTransaction; import android.support.v4.view.ViewPager.OnPageChangeListener; +import android.support.v4.widget.DrawerLayout; import android.support.v7.app.ActionBar; import android.util.TypedValue; import android.view.KeyEvent; @@ -24,7 +22,6 @@ import android.view.MenuItem; import android.view.View; import android.view.Window; import android.view.inputmethod.InputMethodManager; -import android.widget.FrameLayout; import com.todoroo.andlib.sql.QueryTemplate; import com.todoroo.andlib.utility.AndroidUtilities; @@ -49,24 +46,21 @@ import com.todoroo.astrid.ui.QuickAddBar; import com.todoroo.astrid.utility.Constants; import com.todoroo.astrid.utility.Flags; -import net.simonvt.menudrawer.MenuDrawer; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; import org.tasks.R; import org.tasks.preferences.ActivityPreferences; +import org.tasks.ui.NavigationDrawerFragment; import javax.inject.Inject; -public class TaskListActivity extends AstridActivity implements OnPageChangeListener { +import static org.tasks.ui.NavigationDrawerFragment.OnFilterItemClickedListener; - private static final Logger log = LoggerFactory.getLogger(TaskListActivity.class); +public class TaskListActivity extends AstridActivity implements OnPageChangeListener, OnFilterItemClickedListener { @Inject TagDataDao tagDataDao; @Inject ActivityPreferences preferences; @Inject GtasksPreferenceService gtasksPreferenceService; - MenuDrawer menuDrawer; + private NavigationDrawerFragment navigationDrawer; /** token for indicating source of TLA launch */ public static final String TOKEN_SOURCE = "source"; //$NON-NLS-1$ @@ -97,15 +91,11 @@ public class TaskListActivity extends AstridActivity implements OnPageChangeList actionBar.setDisplayUseLogoEnabled(true); actionBar.setLogo(null); - menuDrawer = MenuDrawer.attach(this, MenuDrawer.Type.OVERLAY); - menuDrawer.setDrawerIndicatorEnabled(true); - menuDrawer.setContentView(contentView); - // cannot use full screen until next menudrawer release - // menuDrawer.setTouchMode(MenuDrawer.TOUCH_MODE_FULLSCREEN); + navigationDrawer = getNavigationDrawerFragment(); + navigationDrawer.setUp((DrawerLayout) findViewById(R.id.drawer_layout)); + TypedValue typedValue = new TypedValue(); getTheme().resolveAttribute(R.attr.ic_drawer, typedValue, true); - menuDrawer.setSlideDrawable(typedValue.resourceId); - menuDrawer.setHardwareLayerEnabled(true); initializeFragments(); @@ -147,6 +137,11 @@ public class TaskListActivity extends AstridActivity implements OnPageChangeList } } + public NavigationDrawerFragment getNavigationDrawerFragment() { + return (NavigationDrawerFragment) getSupportFragmentManager() + .findFragmentById(NavigationDrawerFragment.FRAGMENT_NAVIGATION_DRAWER); + } + @Override protected void onResume() { super.onResume(); @@ -156,6 +151,10 @@ public class TaskListActivity extends AstridActivity implements OnPageChangeList @Override public boolean onCreateOptionsMenu(Menu menu) { + if (isDrawerOpen()) { + return super.onCreateOptionsMenu(menu); + } + getMenuInflater().inflate(R.menu.task_list_activity, menu); TaskListFragment tlf = getTaskListFragment(); if(tlf instanceof TagViewFragment) { @@ -169,7 +168,7 @@ public class TaskListActivity extends AstridActivity implements OnPageChangeList return true; } - protected int getContentView() { + private int getContentView() { if (preferences.useTabletLayout()) { return R.layout.task_list_wrapper_activity_3pane; } else { @@ -189,48 +188,6 @@ public class TaskListActivity extends AstridActivity implements OnPageChangeList } else { fragmentLayout = LAYOUT_SINGLE; } - - setupPopoverWithFilterList((FilterListFragment) setupFragment(FilterListFragment.TAG_FILTERLIST_FRAGMENT, 0, - FilterListFragment.class)); - } - - protected Fragment setupFragment(String tag, int container, Class cls) { - final FragmentManager fm = getSupportFragmentManager(); - Fragment fragment = fm.findFragmentByTag(tag); - if(fragment == null) { - try { - fragment = cls.newInstance(); - } catch (InstantiationException | IllegalAccessException e) { - log.error(e.getMessage(), e); - return null; - } - FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); - if (container == 0) { - ft.add(fragment, tag); - } - else { - ft.replace(container, fragment, tag); - } - ft.commit(); - runOnUiThread(new Runnable() { - @Override - public void run() { - fm.executePendingTransactions(); - } - }); - } - return fragment; - } - - public void setupPopoverWithFilterList(FilterListFragment fla) { - View view = fla.getView(); - if (view != null) { - FrameLayout parent = (FrameLayout) view.getParent(); - if (parent != null) { - parent.removeView(view); - } - menuDrawer.setMenuView(view); - } } @Override @@ -240,7 +197,6 @@ public class TaskListActivity extends AstridActivity implements OnPageChangeList if (tef != null) { onBackPressed(); } - menuDrawer.closeMenu(); return super.onFilterItemClicked(item); } @@ -304,7 +260,7 @@ public class TaskListActivity extends AstridActivity implements OnPageChangeList newTagIntent.putExtra(TagSettingsActivity.TOKEN_AUTOPOPULATE_NAME, thisIntent.getStringExtra(TOKEN_CREATE_NEW_LIST_NAME)); thisIntent.removeExtra(TOKEN_CREATE_NEW_LIST_MEMBERS); thisIntent.removeExtra(TOKEN_CREATE_NEW_LIST_NAME); - startActivityForResult(newTagIntent, FilterListFragment.REQUEST_NEW_LIST); + startActivityForResult(newTagIntent, NavigationDrawerFragment.REQUEST_NEW_LIST); } /** @@ -342,12 +298,6 @@ public class TaskListActivity extends AstridActivity implements OnPageChangeList @Override public void onPageScrollStateChanged(int state) { /* Nothing */ } - @Override - public boolean onPrepareOptionsMenu(Menu menu) { - menuDrawer.closeMenu(); - return super.onPrepareOptionsMenu(menu); - } - @Override public void onBackPressed() { // manage task edit visibility @@ -356,11 +306,6 @@ public class TaskListActivity extends AstridActivity implements OnPageChangeList Flags.set(Flags.TLA_DISMISSED_FROM_TASK_EDIT); onPostResume(); } - int drawerState = menuDrawer.getDrawerState(); - if(drawerState == MenuDrawer.STATE_OPEN || drawerState == MenuDrawer.STATE_OPENING) { - menuDrawer.closeMenu(); - return; - } super.onBackPressed(); } @@ -372,7 +317,7 @@ public class TaskListActivity extends AstridActivity implements OnPageChangeList @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { - if ((requestCode == FilterListFragment.REQUEST_NEW_LIST || + if ((requestCode == NavigationDrawerFragment.REQUEST_NEW_LIST || requestCode == TaskListFragment.ACTIVITY_REQUEST_NEW_FILTER) && resultCode == Activity.RESULT_OK) { if(data == null) { @@ -382,9 +327,9 @@ public class TaskListActivity extends AstridActivity implements OnPageChangeList Filter newList = data.getParcelableExtra(TagSettingsActivity.TOKEN_NEW_FILTER); if (newList != null) { getIntent().putExtra(TOKEN_SWITCH_TO_FILTER, newList); // Handle in onPostResume() - FilterListFragment fla = getFilterListFragment(); - if (fla != null) { - fla.clear(); + NavigationDrawerFragment navigationDrawer = getNavigationDrawerFragment(); + if (navigationDrawer != null) { + navigationDrawer.clear(); } } } else if (requestCode == TaskListFragment.ACTIVITY_EDIT_TASK && resultCode != Activity.RESULT_CANCELED) { @@ -403,14 +348,14 @@ public class TaskListActivity extends AstridActivity implements OnPageChangeList } tlf.refresh(); } - } else if (requestCode == FilterListFragment.REQUEST_CUSTOM_INTENT && resultCode == RESULT_OK && data != null) { + } else if (requestCode == NavigationDrawerFragment.REQUEST_CUSTOM_INTENT && resultCode == RESULT_OK && data != null) { // Tag renamed or deleted String action = data.getAction(); String uuid = data.getStringExtra(TagViewFragment.EXTRA_TAG_UUID); if (AstridApiConstants.BROADCAST_EVENT_TAG_DELETED.equals(action)) { TaskListFragment tlf = getTaskListFragment(); - FilterListFragment fl = getFilterListFragment(); + NavigationDrawerFragment navigationDrawer = getNavigationDrawerFragment(); if (tlf != null) { TagData tagData = tlf.getActiveTagData(); String activeUuid = RemoteModel.NO_UUID; @@ -420,14 +365,14 @@ public class TaskListActivity extends AstridActivity implements OnPageChangeList if (activeUuid.equals(uuid)) { getIntent().putExtra(TOKEN_SWITCH_TO_FILTER, CoreFilterExposer.buildInboxFilter(getResources())); // Handle in onPostResume() - fl.clear(); // Should auto refresh + navigationDrawer.clear(); // Should auto refresh } else { tlf.refresh(); } } - if (fl != null) { - fl.refresh(); + if (navigationDrawer != null) { + navigationDrawer.refresh(); } } else if (AstridApiConstants.BROADCAST_EVENT_TAG_RENAMED.equals(action)) { TaskListFragment tlf = getTaskListFragment(); @@ -444,9 +389,9 @@ public class TaskListActivity extends AstridActivity implements OnPageChangeList } } - FilterListFragment flf = getFilterListFragment(); - if (flf != null) { - flf.refresh(); + NavigationDrawerFragment navigationDrawer = getNavigationDrawerFragment(); + if (navigationDrawer != null) { + navigationDrawer.refresh(); } } } @@ -459,12 +404,12 @@ public class TaskListActivity extends AstridActivity implements OnPageChangeList } private void tagsChanged(boolean onActivityResult) { - FilterListFragment flf = getFilterListFragment(); - if (flf != null) { + NavigationDrawerFragment navigationDrawer = getNavigationDrawerFragment(); + if (navigationDrawer != null) { if (onActivityResult) { - flf.clear(); + navigationDrawer.clear(); } else { - flf.refresh(); + navigationDrawer.refresh(); } } } @@ -477,9 +422,9 @@ public class TaskListActivity extends AstridActivity implements OnPageChangeList } public void refreshFilterCount() { - FilterListFragment flf = getFilterListFragment(); - if (flf != null) { - flf.adapter.refreshFilterCount(); + NavigationDrawerFragment navigationDrawer = getNavigationDrawerFragment(); + if (navigationDrawer != null) { + navigationDrawer.refreshFilterCount(); } } @@ -506,14 +451,6 @@ public class TaskListActivity extends AstridActivity implements OnPageChangeList public boolean onOptionsItemSelected(MenuItem item) { TaskListFragment tlf = getTaskListFragment(); switch(item.getItemId()) { - case android.R.id.home: - if(menuDrawer.getDrawerState() != MenuDrawer.STATE_CLOSED) { - menuDrawer.closeMenu(); - } else { - menuDrawer.openMenu(); - } - hideKeyboard(); - return true; case R.id.menu_settings: tlf.showSettings(); return true; @@ -533,7 +470,7 @@ public class TaskListActivity extends AstridActivity implements OnPageChangeList startActivityForResult(intent, TaskListFragment.ACTIVITY_REQUEST_NEW_FILTER); return true; case R.id.menu_new_list: - startActivityForResult(newTagDialog(), FilterListFragment.REQUEST_NEW_LIST); + startActivityForResult(newTagDialog(), NavigationDrawerFragment.REQUEST_NEW_LIST); if (!preferences.useTabletLayout()) { AndroidUtilities.callOverridePendingTransition(this, R.anim.slide_left_in, R.anim.slide_left_out); } @@ -543,14 +480,14 @@ public class TaskListActivity extends AstridActivity implements OnPageChangeList Intent ret = new Intent(this, DeleteTagActivity.class); ret.putExtra("tag", deleteTag.getName()); ret.putExtra(TagViewFragment.EXTRA_TAG_UUID, deleteTag.getUuid()); - startActivityForResult(ret, FilterListFragment.REQUEST_CUSTOM_INTENT); + startActivityForResult(ret, NavigationDrawerFragment.REQUEST_CUSTOM_INTENT); return true; case R.id.menu_rename_list: TagData renameTag = tlf.getActiveTagData(); Intent rename = new Intent(this, RenameTagActivity.class); rename.putExtra("tag", renameTag.getName()); rename.putExtra(TagViewFragment.EXTRA_TAG_UUID, renameTag.getUuid()); - startActivityForResult(rename, FilterListFragment.REQUEST_CUSTOM_INTENT); + startActivityForResult(rename, NavigationDrawerFragment.REQUEST_CUSTOM_INTENT); return true; case R.id.menu_support: startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("http://abaker.github.io/tasks/"))); @@ -560,7 +497,7 @@ public class TaskListActivity extends AstridActivity implements OnPageChangeList } } - private void hideKeyboard() { + public void hideKeyboard() { TaskListFragment tlf = getTaskListFragment(); if (tlf == null) return; @@ -581,4 +518,8 @@ public class TaskListActivity extends AstridActivity implements OnPageChangeList } return super.onKeyDown(keyCode, event); } + + public boolean isDrawerOpen() { + return navigationDrawer.isDrawerOpen(); + } } diff --git a/astrid/src/main/java/com/todoroo/astrid/activity/TaskListFragment.java b/astrid/src/main/java/com/todoroo/astrid/activity/TaskListFragment.java index 8c43e1363..e1255deb1 100644 --- a/astrid/src/main/java/com/todoroo/astrid/activity/TaskListFragment.java +++ b/astrid/src/main/java/com/todoroo/astrid/activity/TaskListFragment.java @@ -82,6 +82,7 @@ import org.tasks.injection.InjectingListFragment; import org.tasks.injection.Injector; import org.tasks.notifications.NotificationManager; import org.tasks.preferences.ActivityPreferences; +import org.tasks.ui.NavigationDrawerFragment; import java.util.Timer; import java.util.TimerTask; @@ -275,8 +276,8 @@ public class TaskListFragment extends InjectingListFragment implements OnSortSel initializeData(); setupQuickAddBar(); - Fragment filterlistFrame = getFragmentManager().findFragmentByTag( - FilterListFragment.TAG_FILTERLIST_FRAGMENT); + Fragment filterlistFrame = getFragmentManager().findFragmentById( + NavigationDrawerFragment.FRAGMENT_NAVIGATION_DRAWER); mDualFragments = (filterlistFrame != null) && filterlistFrame.isInLayout(); diff --git a/astrid/src/main/java/com/todoroo/astrid/core/CoreFilterExposer.java b/astrid/src/main/java/com/todoroo/astrid/core/CoreFilterExposer.java index f2c085bc1..987af51bc 100644 --- a/astrid/src/main/java/com/todoroo/astrid/core/CoreFilterExposer.java +++ b/astrid/src/main/java/com/todoroo/astrid/core/CoreFilterExposer.java @@ -15,7 +15,6 @@ import com.todoroo.andlib.sql.Criterion; import com.todoroo.andlib.sql.Query; import com.todoroo.andlib.sql.QueryTemplate; import com.todoroo.andlib.utility.AndroidUtilities; -import com.todoroo.astrid.activity.FilterListFragment; import com.todoroo.astrid.api.AstridApiConstants; import com.todoroo.astrid.api.AstridFilterExposer; import com.todoroo.astrid.api.Filter; @@ -39,7 +38,7 @@ import java.util.List; import javax.inject.Inject; /** - * Exposes Astrid's built in filters to the {@link FilterListFragment} + * Exposes Astrid's built in filters to the NavigationDrawerFragment * * @author Tim Su * diff --git a/astrid/src/main/java/com/todoroo/astrid/core/CustomFilterExposer.java b/astrid/src/main/java/com/todoroo/astrid/core/CustomFilterExposer.java index 6719d481a..01f5681ae 100644 --- a/astrid/src/main/java/com/todoroo/astrid/core/CustomFilterExposer.java +++ b/astrid/src/main/java/com/todoroo/astrid/core/CustomFilterExposer.java @@ -16,7 +16,6 @@ import com.todoroo.andlib.sql.Criterion; import com.todoroo.andlib.sql.Order; import com.todoroo.andlib.sql.QueryTemplate; import com.todoroo.andlib.utility.DialogUtilities; -import com.todoroo.astrid.activity.FilterListFragment; import com.todoroo.astrid.api.AstridApiConstants; import com.todoroo.astrid.api.AstridFilterExposer; import com.todoroo.astrid.api.Filter; @@ -38,7 +37,7 @@ import java.util.List; import javax.inject.Inject; /** - * Exposes Astrid's built in filters to the {@link FilterListFragment} + * Exposes Astrid's built in filters to the NavigationDrawerFragment * * @author Tim Su * diff --git a/astrid/src/main/java/com/todoroo/astrid/timers/TimerFilterExposer.java b/astrid/src/main/java/com/todoroo/astrid/timers/TimerFilterExposer.java index 3da013181..4e2961d06 100644 --- a/astrid/src/main/java/com/todoroo/astrid/timers/TimerFilterExposer.java +++ b/astrid/src/main/java/com/todoroo/astrid/timers/TimerFilterExposer.java @@ -13,7 +13,6 @@ import android.content.res.Resources; import com.todoroo.andlib.service.ContextManager; import com.todoroo.andlib.sql.Query; import com.todoroo.andlib.sql.QueryTemplate; -import com.todoroo.astrid.activity.FilterListFragment; import com.todoroo.astrid.api.AstridApiConstants; import com.todoroo.astrid.api.AstridFilterExposer; import com.todoroo.astrid.api.Filter; @@ -29,7 +28,7 @@ import org.tasks.injection.Injector; import javax.inject.Inject; /** - * Exposes "working on" filter to the {@link FilterListFragment} + * Exposes "working on" filter to the NavigationDrawerFragment * * @author Tim Su * diff --git a/astrid/src/main/java/org/tasks/injection/FragmentModule.java b/astrid/src/main/java/org/tasks/injection/FragmentModule.java index b462c6e0c..b6b68a36b 100644 --- a/astrid/src/main/java/org/tasks/injection/FragmentModule.java +++ b/astrid/src/main/java/org/tasks/injection/FragmentModule.java @@ -5,7 +5,6 @@ import android.content.Context; import android.support.v4.app.Fragment; import com.todoroo.astrid.actfm.TagViewFragment; -import com.todoroo.astrid.activity.FilterListFragment; import com.todoroo.astrid.activity.TaskEditFragment; import com.todoroo.astrid.activity.TaskListFragment; import com.todoroo.astrid.core.CoreFilterExposer; @@ -18,6 +17,8 @@ import com.todoroo.astrid.tags.TagFilterExposer; import com.todoroo.astrid.timers.TimerFilterExposer; import com.todoroo.astrid.ui.QuickAddBar; +import org.tasks.ui.NavigationDrawerFragment; + import javax.inject.Singleton; import dagger.Module; @@ -31,7 +32,7 @@ import dagger.Provides; SubtasksTagListFragment.class, TagViewFragment.class, TaskEditFragment.class, - FilterListFragment.class, + NavigationDrawerFragment.class, QuickAddBar.class, CoreFilterExposer.class, TimerFilterExposer.class, diff --git a/astrid/src/main/java/org/tasks/ui/NavigationDrawerFragment.java b/astrid/src/main/java/org/tasks/ui/NavigationDrawerFragment.java new file mode 100644 index 000000000..d10ee7ac1 --- /dev/null +++ b/astrid/src/main/java/org/tasks/ui/NavigationDrawerFragment.java @@ -0,0 +1,467 @@ +package org.tasks.ui; + +import android.app.AlertDialog; +import android.content.BroadcastReceiver; +import android.content.Context; +import android.content.DialogInterface; +import android.content.Intent; +import android.content.IntentFilter; +import android.graphics.Bitmap; +import android.graphics.drawable.BitmapDrawable; +import android.support.v7.app.ActionBarActivity; +import android.app.Activity; +import android.support.v7.app.ActionBar; +import android.support.v4.app.ActionBarDrawerToggle; +import android.support.v4.view.GravityCompat; +import android.support.v4.widget.DrawerLayout; +import android.content.res.Configuration; +import android.os.Bundle; +import android.view.ContextMenu; +import android.view.KeyEvent; +import android.view.LayoutInflater; +import android.view.Menu; +import android.view.MenuInflater; +import android.view.MenuItem; +import android.view.View; +import android.view.ViewGroup; +import android.view.inputmethod.EditorInfo; +import android.widget.AdapterView; +import android.widget.EditText; +import android.widget.FrameLayout; +import android.widget.ListView; +import android.widget.TextView; +import android.widget.Toast; + +import com.todoroo.astrid.activity.ShortcutActivity; +import com.todoroo.astrid.activity.TaskListActivity; +import com.todoroo.astrid.activity.TaskListFragment; +import com.todoroo.astrid.adapter.FilterAdapter; +import com.todoroo.astrid.api.AstridApiConstants; +import com.todoroo.astrid.api.Filter; +import com.todoroo.astrid.api.FilterListItem; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.tasks.R; +import org.tasks.filters.FilterCounter; +import org.tasks.injection.InjectingFragment; +import org.tasks.injection.Injector; + +import javax.inject.Inject; + +public class NavigationDrawerFragment extends InjectingFragment { + + private static final Logger log = LoggerFactory.getLogger(NavigationDrawerFragment.class); + + public static final int FRAGMENT_NAVIGATION_DRAWER = R.id.navigation_drawer; + + public static final String TOKEN_LAST_SELECTED = "lastSelected"; //$NON-NLS-1$ + + private static final int CONTEXT_MENU_SHORTCUT = R.string.FLA_context_shortcut; + private static final int CONTEXT_MENU_INTENT = Menu.FIRST + 4; + + public static final int REQUEST_CUSTOM_INTENT = 10; + public static final int REQUEST_NEW_LIST = 4; + + public FilterAdapter adapter = null; + + private final RefreshReceiver refreshReceiver = new RefreshReceiver(); + + /** + * A pointer to the current callbacks instance (the Activity). + */ + private OnFilterItemClickedListener mCallbacks; + + /** + * Helper component that ties the action bar to the navigation drawer. + */ + private ActionBarDrawerToggle mDrawerToggle; + + private DrawerLayout mDrawerLayout; + private ListView mDrawerListView; + private View mFragmentContainerView; + + private int mCurrentSelectedPosition = 0; + + @Inject FilterCounter filterCounter; + @Inject Injector injector; + + public NavigationDrawerFragment() { + } + + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + if (savedInstanceState != null) { + mCurrentSelectedPosition = savedInstanceState.getInt(TOKEN_LAST_SELECTED); + } + + // Select either the default item (0) or the last selected item. +// selectItem(mCurrentSelectedPosition); + } + + @Override + public void onActivityCreated(Bundle savedInstanceState) { + super.onActivityCreated(savedInstanceState); + // Indicate that this fragment would like to influence the set of actions in the action bar. + setHasOptionsMenu(true); + + getActivity().setDefaultKeyMode(Activity.DEFAULT_KEYS_SEARCH_LOCAL); + + setUpList(); + } + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, + Bundle savedInstanceState) { + mDrawerListView = (ListView) inflater.inflate( + R.layout.fragment_navigation_drawer, container, false); + mDrawerListView.setOnItemClickListener(new AdapterView.OnItemClickListener() { + @Override + public void onItemClick(AdapterView parent, View view, int position, long id) { + selectItem(position); + } + }); + mDrawerListView.setItemChecked(mCurrentSelectedPosition, true); + return mDrawerListView; + } + + protected void setUpList() { + adapter.setListView(mDrawerListView); + mDrawerListView.setAdapter(adapter); + registerForContextMenu(mDrawerListView); + } + + public boolean isDrawerOpen() { + return mDrawerLayout != null && mDrawerLayout.isDrawerOpen(mFragmentContainerView); + } + + /** + * Users of this fragment must call this method to set up the navigation drawer interactions. + * + * @param drawerLayout The DrawerLayout containing this fragment's UI. + */ + public void setUp(DrawerLayout drawerLayout) { + mFragmentContainerView = getActivity().findViewById(FRAGMENT_NAVIGATION_DRAWER); + mDrawerLayout = drawerLayout; + + // set a custom shadow that overlays the main content when the drawer opens + mDrawerLayout.setDrawerShadow(R.drawable.drawer_shadow, GravityCompat.START); + // set up the drawer's list view with items and click listener + + ActionBar actionBar = getActionBar(); + actionBar.setDisplayHomeAsUpEnabled(true); + actionBar.setHomeButtonEnabled(true); + + // ActionBarDrawerToggle ties together the the proper interactions + // between the navigation drawer and the action bar app icon. + mDrawerToggle = new ActionBarDrawerToggle( + getActivity(), /* host Activity */ + mDrawerLayout, /* DrawerLayout object */ + R.drawable.ic_drawer, /* nav drawer image to replace 'Up' caret */ + R.string.navigation_drawer_open, /* "open drawer" description for accessibility */ + R.string.navigation_drawer_close /* "close drawer" description for accessibility */ + ) { + @Override + public void onDrawerClosed(View drawerView) { + super.onDrawerClosed(drawerView); + if (!isAdded()) { + return; + } + + getActivity().supportInvalidateOptionsMenu(); // calls onPrepareOptionsMenu() + } + + @Override + public void onDrawerOpened(View drawerView) { + super.onDrawerOpened(drawerView); + if (!isAdded()) { + return; + } + + getActivity().supportInvalidateOptionsMenu(); // calls onPrepareOptionsMenu() + } + }; + + // Defer code dependent on restoration of previous instance state. + mDrawerLayout.post(new Runnable() { + @Override + public void run() { + mDrawerToggle.syncState(); + } + }); + + mDrawerLayout.setDrawerListener(mDrawerToggle); + } + + @Override + public void onPause() { + super.onPause(); + if(adapter != null) { + adapter.unregisterRecevier(); + } + try { + getActivity().unregisterReceiver(refreshReceiver); + } catch (IllegalArgumentException e) { + // Might not have fully initialized + log.error(e.getMessage(), e); + } + } + + private void selectItem(int position) { + Filter item = adapter.getItem(position); + mCurrentSelectedPosition = position; + if (mDrawerListView != null) { + mDrawerListView.setItemChecked(position, true); + } + closeMenu(); + if (mCallbacks != null) { + mCallbacks.onFilterItemClicked(item); + } + } + + @Override + public void onAttach(Activity activity) { + super.onAttach(activity); + mCallbacks = (OnFilterItemClickedListener) activity; + adapter = new FilterAdapter(injector, filterCounter, getActivity(), null, R.layout.filter_adapter_row, false, false); + } + + @Override + public void onDetach() { + super.onDetach(); + mCallbacks = null; + } + + @Override + public void onSaveInstanceState(Bundle outState) { + super.onSaveInstanceState(outState); + outState.putInt(TOKEN_LAST_SELECTED, mCurrentSelectedPosition); + } + + @Override + public void onConfigurationChanged(Configuration newConfig) { + super.onConfigurationChanged(newConfig); + // Forward the new configuration the drawer toggle component. + mDrawerToggle.onConfigurationChanged(newConfig); + } + + @Override + public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { + if (mDrawerLayout != null && isDrawerOpen()) { + menu.clear(); +// showGlobalContextActionBar(); + } + inflater.inflate(R.menu.global, menu); + super.onCreateOptionsMenu(menu, inflater); + } + + @Override + public boolean onContextItemSelected(android.view.MenuItem item) { + // called when context menu appears + return onOptionsItemSelected(item); + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + if (mDrawerToggle.onOptionsItemSelected(item)) { + ((TaskListActivity) getActivity()).hideKeyboard(); + return true; + } + + switch (item.getItemId()) { + case CONTEXT_MENU_SHORTCUT: { + AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo)item.getMenuInfo(); + final Intent shortcutIntent = item.getIntent(); + FilterListItem filter = ((FilterAdapter.ViewHolder)info.targetView.getTag()).item; + if(filter instanceof Filter) { + showCreateShortcutDialog(getActivity(), shortcutIntent, (Filter) filter); + } + + return true; + } + case CONTEXT_MENU_INTENT: { + Intent intent = item.getIntent(); + getActivity().startActivityForResult(intent, REQUEST_CUSTOM_INTENT); + return true; + } + default: { + TaskListFragment tasklist = (TaskListFragment) getActivity().getSupportFragmentManager().findFragmentByTag(TaskListFragment.TAG_TASKLIST_FRAGMENT); + if (tasklist != null && tasklist.isInLayout()) { + return tasklist.onOptionsItemSelected(item); + } + } + } + return false; + } + + public static void showCreateShortcutDialog(final Activity activity, final Intent shortcutIntent, + final Filter filter) { + FrameLayout frameLayout = new FrameLayout(activity); + frameLayout.setPadding(10, 0, 10, 0); + final EditText editText = new EditText(activity); + if(filter.listingTitle == null) { + filter.listingTitle = ""; //$NON-NLS-1$ + } + editText.setText(filter.listingTitle. + replaceAll("\\(\\d+\\)$", "").trim()); //$NON-NLS-1$ //$NON-NLS-2$ + frameLayout.addView(editText, new FrameLayout.LayoutParams( + FrameLayout.LayoutParams.FILL_PARENT, + FrameLayout.LayoutParams.WRAP_CONTENT)); + + final Runnable createShortcut = new Runnable() { + @Override + public void run() { + String label = editText.getText().toString(); + createShortcut(activity, shortcutIntent, label); + } + }; + editText.setOnEditorActionListener(new TextView.OnEditorActionListener() { + @Override + public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { + if(actionId == EditorInfo.IME_NULL) { + createShortcut.run(); + return true; + } + return false; + } + }); + + new AlertDialog.Builder(activity) + .setTitle(R.string.FLA_shortcut_dialog_title) + .setMessage(R.string.FLA_shortcut_dialog) + .setView(frameLayout) + .setIcon(android.R.drawable.ic_dialog_info) + .setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + createShortcut.run(); + } + }) + .setNegativeButton(android.R.string.cancel, null) + .show().setOwnerActivity(activity); + } + + public static Bitmap superImposeListIcon(Activity activity) { + return ((BitmapDrawable)activity.getResources().getDrawable(R.drawable.icon)).getBitmap(); + } + + /** + * Creates a shortcut on the user's home screen + */ + private static void createShortcut(Activity activity, Intent shortcutIntent, String label) { + if(label.length() == 0) { + return; + } + + Bitmap bitmap = superImposeListIcon(activity); + + Intent createShortcutIntent = new Intent(); + createShortcutIntent.putExtra(Intent.EXTRA_SHORTCUT_INTENT, shortcutIntent); + createShortcutIntent.putExtra(Intent.EXTRA_SHORTCUT_NAME, label); + createShortcutIntent.putExtra(Intent.EXTRA_SHORTCUT_ICON, bitmap); + createShortcutIntent.setAction("com.android.launcher.action.INSTALL_SHORTCUT"); //$NON-NLS-1$ + + activity.sendBroadcast(createShortcutIntent); + Toast.makeText(activity, + activity.getString(R.string.FLA_toast_onCreateShortcut, label), Toast.LENGTH_LONG).show(); + } + + /** + * Per the navigation drawer design guidelines, updates the action bar to show the global app + * 'context', rather than just what's in the current screen. + */ + private void showGlobalContextActionBar() { + ActionBar actionBar = getActionBar(); + actionBar.setDisplayShowTitleEnabled(true); + actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_STANDARD); + actionBar.setTitle(R.string.app_name); + } + + private ActionBar getActionBar() { + return ((ActionBarActivity) getActivity()).getSupportActionBar(); + } + + public void closeMenu() { + if (mDrawerLayout != null) { + mDrawerLayout.closeDrawer(mFragmentContainerView); + } + } + + public void refreshFilterCount() { + adapter.refreshFilterCount(); + } + + public interface OnFilterItemClickedListener { + public boolean onFilterItemClicked(FilterListItem item); + } + + public void clear() { + adapter.clear(); + } + + public void refresh() { + adapter.clear(); + adapter.getLists(); + } + + @Override + public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) { + AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) menuInfo; + + Filter item = adapter.getItem(info.position); + + MenuItem menuItem = menu.add(0, CONTEXT_MENU_SHORTCUT, 0, R.string.FLA_context_shortcut); + menuItem.setIntent(ShortcutActivity.createIntent(item)); + + for(int i = 0; i < item.contextMenuLabels.length; i++) { + if(item.contextMenuIntents.length <= i) { + break; + } + menuItem = menu.add(0, CONTEXT_MENU_INTENT, 0, item.contextMenuLabels[i]); + menuItem.setIntent(item.contextMenuIntents[i]); + } + + if(menu.size() > 0) { + menu.setHeaderTitle(item.listingTitle); + } + } + + @Override + public void onResume() { + super.onResume(); + if(adapter != null) { + adapter.registerRecevier(); + } + + // also load sync actions + getActivity().registerReceiver(refreshReceiver, + new IntentFilter(AstridApiConstants.BROADCAST_EVENT_REFRESH)); + } + + /** + * Receiver which receives refresh intents + * + * @author Tim Su + * + */ + protected class RefreshReceiver extends BroadcastReceiver { + @Override + public void onReceive(Context context, Intent intent) { + if(intent == null || !AstridApiConstants.BROADCAST_EVENT_REFRESH.equals(intent.getAction())) { + return; + } + + Activity activity = getActivity(); + if (activity != null) { + activity.runOnUiThread(new Runnable() { + @Override + public void run() { + refresh(); + } + }); + } + } + } +} diff --git a/astrid/src/main/res/drawable-hdpi/drawer_shadow.9.png b/astrid/src/main/res/drawable-hdpi/drawer_shadow.9.png new file mode 100644 index 000000000..236bff558 Binary files /dev/null and b/astrid/src/main/res/drawable-hdpi/drawer_shadow.9.png differ diff --git a/astrid/src/main/res/drawable-hdpi/ic_launcher.png b/astrid/src/main/res/drawable-hdpi/ic_launcher.png new file mode 100644 index 000000000..96a442e5b Binary files /dev/null and b/astrid/src/main/res/drawable-hdpi/ic_launcher.png differ diff --git a/astrid/src/main/res/drawable-xhdpi/drawer_shadow.9.png b/astrid/src/main/res/drawable-xhdpi/drawer_shadow.9.png new file mode 100644 index 000000000..fabe9d965 Binary files /dev/null and b/astrid/src/main/res/drawable-xhdpi/drawer_shadow.9.png differ diff --git a/astrid/src/main/res/drawable-xhdpi/ic_launcher.png b/astrid/src/main/res/drawable-xhdpi/ic_launcher.png new file mode 100644 index 000000000..71c6d760f Binary files /dev/null and b/astrid/src/main/res/drawable-xhdpi/ic_launcher.png differ diff --git a/astrid/src/main/res/drawable-xxhdpi/drawer_shadow.9.png b/astrid/src/main/res/drawable-xxhdpi/drawer_shadow.9.png new file mode 100644 index 000000000..b91e9d7f2 Binary files /dev/null and b/astrid/src/main/res/drawable-xxhdpi/drawer_shadow.9.png differ diff --git a/astrid/src/main/res/drawable-xxhdpi/ic_launcher.png b/astrid/src/main/res/drawable-xxhdpi/ic_launcher.png new file mode 100644 index 000000000..4df189464 Binary files /dev/null and b/astrid/src/main/res/drawable-xxhdpi/ic_launcher.png differ diff --git a/astrid/src/main/res/drawable/drawer_shadow.9.png b/astrid/src/main/res/drawable/drawer_shadow.9.png new file mode 100644 index 000000000..ffe3a28d7 Binary files /dev/null and b/astrid/src/main/res/drawable/drawer_shadow.9.png differ diff --git a/astrid/src/main/res/drawable/ic_launcher.png b/astrid/src/main/res/drawable/ic_launcher.png new file mode 100644 index 000000000..359047dfa Binary files /dev/null and b/astrid/src/main/res/drawable/ic_launcher.png differ diff --git a/astrid/src/main/res/layout/filter_list_activity.xml b/astrid/src/main/res/layout/filter_list_activity.xml deleted file mode 100644 index c2a8bb93a..000000000 --- a/astrid/src/main/res/layout/filter_list_activity.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - diff --git a/astrid/src/main/res/layout/fragment_navigation_drawer.xml b/astrid/src/main/res/layout/fragment_navigation_drawer.xml new file mode 100644 index 000000000..71b885c1e --- /dev/null +++ b/astrid/src/main/res/layout/fragment_navigation_drawer.xml @@ -0,0 +1,12 @@ + diff --git a/astrid/src/main/res/layout/tag_settings_activity.xml b/astrid/src/main/res/layout/tag_settings_activity.xml index b0af9b46c..987e9eb6e 100644 --- a/astrid/src/main/res/layout/tag_settings_activity.xml +++ b/astrid/src/main/res/layout/tag_settings_activity.xml @@ -23,31 +23,6 @@ android:layout_height="wrap_content" android:orientation="vertical" > - - - - - - - - - - - + + - - - - - + + + + + + + + + + + + + + - - - - - + android:layout_gravity="start" + tools:layout="@layout/fragment_navigation_drawer" /> + + + diff --git a/astrid/src/main/res/layout/task_list_wrapper_activity_no_swipe.xml b/astrid/src/main/res/layout/task_list_wrapper_activity_no_swipe.xml index b7772088a..4832fd4e7 100644 --- a/astrid/src/main/res/layout/task_list_wrapper_activity_no_swipe.xml +++ b/astrid/src/main/res/layout/task_list_wrapper_activity_no_swipe.xml @@ -1,13 +1,29 @@ - - - - + android:layout_height="match_parent"> + + + + + + + + + diff --git a/astrid/src/main/res/menu/global.xml b/astrid/src/main/res/menu/global.xml new file mode 100644 index 000000000..0383f8710 --- /dev/null +++ b/astrid/src/main/res/menu/global.xml @@ -0,0 +1,20 @@ + + + + + + + \ No newline at end of file diff --git a/astrid/src/main/res/menu/tag_settings_activity.xml b/astrid/src/main/res/menu/tag_settings_activity.xml new file mode 100644 index 000000000..5880ce6d3 --- /dev/null +++ b/astrid/src/main/res/menu/tag_settings_activity.xml @@ -0,0 +1,17 @@ + + + + + + + + \ No newline at end of file diff --git a/astrid/src/main/res/menu/task_list_activity.xml b/astrid/src/main/res/menu/task_list_activity.xml index 2070a6b9e..9209d18f3 100644 --- a/astrid/src/main/res/menu/task_list_activity.xml +++ b/astrid/src/main/res/menu/task_list_activity.xml @@ -2,6 +2,7 @@ + - - - - \ No newline at end of file diff --git a/astrid/src/main/res/values-w820dp/dimens.xml b/astrid/src/main/res/values-w820dp/dimens.xml new file mode 100644 index 000000000..6206e2354 --- /dev/null +++ b/astrid/src/main/res/values-w820dp/dimens.xml @@ -0,0 +1,7 @@ + + + + 64dp + \ No newline at end of file diff --git a/astrid/src/main/res/values/dimens.xml b/astrid/src/main/res/values/dimens.xml index e56a13c6f..0f16f5d9f 100644 --- a/astrid/src/main/res/values/dimens.xml +++ b/astrid/src/main/res/values/dimens.xml @@ -1,4 +1,5 @@ + 240dp 8dp \ No newline at end of file diff --git a/astrid/src/main/res/values/strings.xml b/astrid/src/main/res/values/strings.xml index ef40435ba..59b3e6857 100644 --- a/astrid/src/main/res/values/strings.xml +++ b/astrid/src/main/res/values/strings.xml @@ -6,4 +6,7 @@ Support Added task Cannot access external storage + + Open navigation drawer + Close navigation drawer \ No newline at end of file