Use AppCompat navigation drawer

Closes #81
pull/253/head
Alex Baker 10 years ago
parent b6ac4cb2c0
commit 658c5e2871

@ -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

@ -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:

@ -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;

@ -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
}
}
}
}

@ -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 <tim@todoroo.com>
*
*/
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<String> 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 <tim@todoroo.com>
*
*/
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();
}
});
}
}
}
}

@ -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);

@ -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) {

@ -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<? extends Fragment> 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();
}
}

@ -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();

@ -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 <tim@todoroo.com>
*

@ -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 <tim@todoroo.com>
*

@ -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 <tim@todoroo.com>
*

@ -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,

@ -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 <tim@todoroo.com>
*
*/
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();
}
});
}
}
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 161 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 174 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 208 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 142 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.1 KiB

@ -1,25 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
** Copyright (c) 2012 Todoroo Inc
**
** See the file "LICENSE" for the full license governing this code.
-->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical">
<!-- List -->
<ListView
android:id="@android:id/list"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_alignParentTop="true"
android:scrollbars="vertical"
android:dividerHeight="1px"
android:background="?attr/drawer_background"
android:cacheColorHint="#00000000"/>
</LinearLayout>

@ -0,0 +1,12 @@
<ListView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@android:id/list"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:choiceMode="singleChoice"
android:dividerHeight="1px"
android:background="?attr/drawer_background"
android:scrollbars="vertical"
android:layout_alignParentTop="true"
android:cacheColorHint="#00000000"
tools:context=".NavigationDrawerFragment" />

@ -23,31 +23,6 @@
android:layout_height="wrap_content"
android:orientation="vertical" >
<LinearLayout
android:id="@+id/save_and_cancel"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:gravity="right"
android:orientation="horizontal"
android:visibility="gone" >
<ImageButton
android:id="@+id/cancel"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginRight="10dip"
android:background="@android:color/transparent"
android:src="@drawable/ic_menu_close" />
<ImageButton
android:id="@+id/save"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginRight="10dip"
android:background="@android:color/transparent"
android:src="@drawable/ic_action_save" />
</LinearLayout>
<RelativeLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"

@ -1,39 +1,49 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
** Copyright (c) 2012 Todoroo Inc
**
** See the file "LICENSE" for the full license governing this code.
-->
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/drawer_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
style="@style/Content"
android:orientation="horizontal">
<View
android:layout_width="1px"
android:layout_height="match_parent">
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
style="@style/Content"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="?attr/asSeparatorBackground"/>
<!-- Task List -->
<FrameLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="60"
android:id="@+id/tasklist_fragment_container" />
<View
android:layout_width="1px"
android:orientation="horizontal">
<View
android:layout_width="1px"
android:layout_height="match_parent"
android:background="?attr/asSeparatorBackground" />
<!-- Task List -->
<FrameLayout
android:id="@+id/tasklist_fragment_container"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="60" />
<View
android:layout_width="1px"
android:layout_height="match_parent"
android:background="?attr/asSeparatorBackground" />
<!-- Task Edit -->
<FrameLayout
android:id="@+id/taskedit_fragment_container"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="40"
android:visibility="invisible" />
</LinearLayout>
<fragment
android:id="@+id/navigation_drawer"
android:name="org.tasks.ui.NavigationDrawerFragment"
android:layout_width="@dimen/navigation_drawer_width"
android:layout_height="match_parent"
android:background="?attr/asSeparatorBackground"/>
<!-- Task Edit -->
<FrameLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="40"
android:id="@+id/taskedit_fragment_container"
android:visibility="invisible" />
</LinearLayout>
android:layout_gravity="start"
tools:layout="@layout/fragment_navigation_drawer" />
</android.support.v4.widget.DrawerLayout>

@ -1,13 +1,29 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
** Copyright (c) 2012 Todoroo Inc
**
** See the file "LICENSE" for the full license governing this code.
-->
<FrameLayout
xmlns:android="http://schemas.android.com/apk/res/android"
<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/drawer_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
style="@style/Content"
android:id="@+id/tasklist_fragment_container">
</FrameLayout>
android:layout_height="match_parent">
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/tasklist_fragment_container"
style="@style/Content"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
<!-- android:layout_gravity="start" tells DrawerLayout to treat
this as a sliding drawer on the left side for left-to-right
languages and on the right side for right-to-left languages.
If you're not building against API 17 or higher, use
android:layout_gravity="left" instead. -->
<!-- The drawer is given a fixed width in dp and extends the full height of
the container. -->
<fragment
android:id="@+id/navigation_drawer"
android:name="org.tasks.ui.NavigationDrawerFragment"
android:layout_width="@dimen/navigation_drawer_width"
android:layout_height="match_parent"
android:layout_gravity="start"
tools:layout="@layout/fragment_navigation_drawer" />
</android.support.v4.widget.DrawerLayout>

@ -0,0 +1,20 @@
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tasks="http://schemas.android.com/apk/res-auto">
<item
android:id="@+id/menu_new_list"
android:title="@string/FLA_new_list"
tasks:showAsAction="never" />
<item
android:id="@+id/menu_new_filter"
android:title="@string/FLA_new_filter"
tasks:showAsAction="never" />
<item
android:id="@+id/menu_support"
android:title="@string/TLA_menu_support"
tasks:showAsAction="never" />
<item
android:id="@+id/menu_settings"
android:title="@string/TLA_menu_settings"
tasks:showAsAction="never" />
</menu>

@ -0,0 +1,17 @@
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tasks="http://schemas.android.com/apk/res-auto">
<item
android:id="@+id/menu_save"
android:title="@string/TEA_menu_save"
android:icon="?attr/ic_action_save"
tasks:showAsAction="ifRoom"/>
<item
android:id="@+id/menu_discard"
android:title="@string/TEA_menu_discard_changes"
android:icon="?attr/ic_action_cancel"
tasks:showAsAction="ifRoom"/>
</menu>

@ -2,6 +2,7 @@
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tasks="http://schemas.android.com/apk/res-auto">
<item
android:id="@+id/menu_search"
android:title="@string/TLA_menu_search"
@ -30,20 +31,4 @@
android:title="@string/gtasks_GTA_clear_completed"
android:visible="false"
tasks:showAsAction="never" />
<item
android:id="@+id/menu_new_list"
android:title="@string/FLA_new_list"
tasks:showAsAction="never" />
<item
android:id="@+id/menu_new_filter"
android:title="@string/FLA_new_filter"
tasks:showAsAction="never" />
<item
android:id="@+id/menu_support"
android:title="@string/TLA_menu_support"
tasks:showAsAction="never"/>
<item
android:id="@+id/menu_settings"
android:title="@string/TLA_menu_settings"
tasks:showAsAction="never" />
</menu>

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<!-- Example customization of dimensions originally defined in res/values/dimens.xml
(such as screen margins) for screens with more than 820dp of available width. This
would include 7" and 10" devices in landscape (~960dp and ~1280dp respectively). -->
<dimen name="activity_horizontal_margin">64dp</dimen>
</resources>

@ -1,4 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<dimen name="navigation_drawer_width">240dp</dimen>
<dimen name="widget_margin">8dp</dimen>
</resources>

@ -6,4 +6,7 @@
<string name="TLA_menu_support">Support</string>
<string name="voice_command_added_task">Added task</string>
<string name="external_storage_unavailable">Cannot access external storage</string>
<string name="navigation_drawer_open">Open navigation drawer</string>
<string name="navigation_drawer_close">Close navigation drawer</string>
</resources>
Loading…
Cancel
Save