diff --git a/astrid/res/drawable/icn_featured_lists.png b/astrid/res/drawable/icn_featured_lists.png new file mode 100644 index 000000000..e2e8f5916 Binary files /dev/null and b/astrid/res/drawable/icn_featured_lists.png differ diff --git a/astrid/res/drawable/icn_friends.png b/astrid/res/drawable/icn_friends.png new file mode 100644 index 000000000..031f06839 Binary files /dev/null and b/astrid/res/drawable/icn_friends.png differ diff --git a/astrid/res/drawable/icn_menu_tasks.png b/astrid/res/drawable/icn_menu_tasks.png new file mode 100644 index 000000000..6e5c25d1c Binary files /dev/null and b/astrid/res/drawable/icn_menu_tasks.png differ diff --git a/astrid/res/drawable/icn_support.png b/astrid/res/drawable/icn_support.png new file mode 100644 index 000000000..88597543c Binary files /dev/null and b/astrid/res/drawable/icn_support.png differ diff --git a/astrid/res/layout-land/filter_list_activity.xml b/astrid/res/layout-land/filter_list_activity.xml index 31c791355..e06640db0 100644 --- a/astrid/res/layout-land/filter_list_activity.xml +++ b/astrid/res/layout-land/filter_list_activity.xml @@ -23,10 +23,8 @@ android:layout_height="50dip" android:orientation="vertical" android:layout_alignParentBottom="true"> - + + - + + - + + - + + + \ No newline at end of file diff --git a/astrid/res/layout/header_nav_views.xml b/astrid/res/layout/header_nav_views.xml index 1395ea4c7..d496af38d 100644 --- a/astrid/res/layout/header_nav_views.xml +++ b/astrid/res/layout/header_nav_views.xml @@ -9,7 +9,6 @@ android:layout_width="51dip" android:padding="10dip" android:layout_height="fill_parent" - android:layout_marginLeft="3dip" android:src="@drawable/menu" android:scaleType="fitCenter"/> diff --git a/astrid/res/layout/list_dropdown_popover.xml b/astrid/res/layout/list_dropdown_popover.xml index 429e66e78..3b595ee2b 100644 --- a/astrid/res/layout/list_dropdown_popover.xml +++ b/astrid/res/layout/list_dropdown_popover.xml @@ -2,11 +2,12 @@ + android:layout_height="wrap_content" + android:paddingLeft="10dip"> diff --git a/astrid/res/layout/main_menu_popover.xml b/astrid/res/layout/main_menu_popover.xml new file mode 100644 index 000000000..8fd5b62a2 --- /dev/null +++ b/astrid/res/layout/main_menu_popover.xml @@ -0,0 +1,34 @@ + + + + + + + + + + diff --git a/astrid/res/layout/main_menu_row.xml b/astrid/res/layout/main_menu_row.xml new file mode 100644 index 000000000..280639daa --- /dev/null +++ b/astrid/res/layout/main_menu_row.xml @@ -0,0 +1,32 @@ + + + + + + + + + + + diff --git a/astrid/res/values/attrs.xml b/astrid/res/values/attrs.xml index cb5186cf8..7ddbbd62d 100644 --- a/astrid/res/values/attrs.xml +++ b/astrid/res/values/attrs.xml @@ -24,6 +24,8 @@ + + diff --git a/astrid/res/values/strings-core.xml b/astrid/res/values/strings-core.xml index d6e3c0975..368e2e072 100644 --- a/astrid/res/values/strings-core.xml +++ b/astrid/res/values/strings-core.xml @@ -102,6 +102,18 @@ Sync Now! + + Tasks + + + Friends + + + Suggestions + + + Tutorial + Settings diff --git a/astrid/res/values/styles.xml b/astrid/res/values/styles.xml index 7c7526f82..63362972a 100644 --- a/astrid/res/values/styles.xml +++ b/astrid/res/values/styles.xml @@ -26,6 +26,8 @@ #171317 @drawable/task_edit_background @drawable/custom_tab_indicator_dark + @drawable/menu + @drawable/menu @drawable/header_background useLogo|showHome|showTitle @@ -76,6 +78,8 @@ @drawable/lists_disclosure_red @drawable/task_edit_background_white @drawable/custom_tab_indicator + @drawable/menu + @drawable/menu @android:color/white useLogo|showHome|showTitle diff --git a/astrid/src/com/todoroo/astrid/activity/TaskListActivity.java b/astrid/src/com/todoroo/astrid/activity/TaskListActivity.java index 0f9437427..ac18cf0bf 100644 --- a/astrid/src/com/todoroo/astrid/activity/TaskListActivity.java +++ b/astrid/src/com/todoroo/astrid/activity/TaskListActivity.java @@ -1308,9 +1308,7 @@ public class TaskListActivity extends ListFragment implements OnScrollListener, startActivityForResult(intent, ACTIVITY_ADDONS); return true; case MENU_SETTINGS_ID: - StatisticsService.reportEvent(StatisticsConstants.TLA_MENU_SETTINGS); - intent = new Intent(getActivity(), EditPreferences.class); - startActivityForResult(intent, ACTIVITY_SETTINGS); + showSettings(); return true; case MENU_SORT_ID: StatisticsService.reportEvent(StatisticsConstants.TLA_MENU_SORT); @@ -1323,9 +1321,7 @@ public class TaskListActivity extends ListFragment implements OnScrollListener, performSyncAction(); return true; case MENU_SUPPORT_ID: - StatisticsService.reportEvent(StatisticsConstants.TLA_MENU_HELP); - intent = new Intent(getActivity(), FeedbackActivity.class); - startActivity(intent); + showSupport(); return true; case MENU_ADDON_INTENT_ID: intent = item.getIntent(); @@ -1412,6 +1408,18 @@ public class TaskListActivity extends ListFragment implements OnScrollListener, } } + public void showSupport() { + StatisticsService.reportEvent(StatisticsConstants.TLA_MENU_HELP); + Intent intent = new Intent(getActivity(), FeedbackActivity.class); + startActivity(intent); + } + + public void showSettings() { + StatisticsService.reportEvent(StatisticsConstants.TLA_MENU_SETTINGS); + Intent intent = new Intent(getActivity(), EditPreferences.class); + startActivityForResult(intent, ACTIVITY_SETTINGS); + } + public void onTaskListItemClicked(long taskId) { mListener.onTaskListItemClicked(taskId); } diff --git a/astrid/src/com/todoroo/astrid/activity/TaskListWrapperActivity.java b/astrid/src/com/todoroo/astrid/activity/TaskListWrapperActivity.java index 525f94b1f..c903da63c 100644 --- a/astrid/src/com/todoroo/astrid/activity/TaskListWrapperActivity.java +++ b/astrid/src/com/todoroo/astrid/activity/TaskListWrapperActivity.java @@ -19,22 +19,36 @@ import android.widget.TextView; import com.timsu.astrid.R; import com.todoroo.andlib.utility.AndroidUtilities; +import com.todoroo.astrid.actfm.ActFmLoginActivity; import com.todoroo.astrid.actfm.TagSettingsActivity; import com.todoroo.astrid.api.Filter; import com.todoroo.astrid.api.FilterListItem; import com.todoroo.astrid.service.ThemeService; import com.todoroo.astrid.ui.FragmentPopover; +import com.todoroo.astrid.ui.MainMenuPopover; +import com.todoroo.astrid.ui.MainMenuPopover.MainMenuListener; import com.todoroo.astrid.utility.Flags; +import com.todoroo.astrid.welcome.tutorial.WelcomeWalkthrough; -public class TaskListWrapperActivity extends AstridWrapperActivity { +public class TaskListWrapperActivity extends AstridWrapperActivity implements MainMenuListener { public static final String TOKEN_SELECTED_FILTER = "selectedFilter"; private View listsNav; private ImageView listsNavDisclosure; private TextView lists; + private ImageView mainMenu; private FragmentPopover listsPopover; private FragmentPopover editPopover; + private MainMenuPopover mainMenuPopover; + + private final OnClickListener mainMenuClickListener = new OnClickListener() { + @Override + public void onClick(View v) { + setMainMenuSelected(true); + mainMenuPopover.show(v); + } + }; private final OnClickListener popupMenuClickListener = new OnClickListener() { @Override @@ -76,8 +90,11 @@ public class TaskListWrapperActivity extends AstridWrapperActivity { listsNav = actionBar.getCustomView().findViewById(R.id.lists_nav); listsNavDisclosure = (ImageView) actionBar.getCustomView().findViewById(R.id.list_disclosure_arrow); lists = (TextView) actionBar.getCustomView().findViewById(R.id.list_title); + mainMenu = (ImageView) actionBar.getCustomView().findViewById(R.id.main_menu); initializeFragments(actionBar); + createMainMenuPopover(); + mainMenu.setOnClickListener(mainMenuClickListener); } /** @@ -136,6 +153,17 @@ public class TaskListWrapperActivity extends AstridWrapperActivity { }); } + private void createMainMenuPopover() { + mainMenuPopover = new MainMenuPopover(this, R.layout.main_menu_popover); + mainMenuPopover.setMenuListener(this); + mainMenuPopover.setOnDismissListener(new OnDismissListener() { + @Override + public void onDismiss() { + setMainMenuSelected(false); + } + }); + } + private void setupPopoverWithFragment(FragmentPopover popover, Fragment frag, LayoutParams params) { if (popover != null) { View view = frag.getView(); @@ -183,6 +211,16 @@ public class TaskListWrapperActivity extends AstridWrapperActivity { listsNavDisclosure.setImageResource(selected ? R.drawable.lists_disclosure_white : tv.data); } + private void setMainMenuSelected(boolean selected) { + TypedValue onImage = new TypedValue(); + TypedValue offImage = new TypedValue(); + + getTheme().resolveAttribute(R.attr.asMainMenuOn, onImage, false); + getTheme().resolveAttribute(R.attr.asMainMenuOff, offImage, false); + + mainMenu.setImageResource(selected ? onImage.data : offImage.data); + } + @Override protected void onPostResume() { super.onPostResume(); @@ -207,6 +245,8 @@ public class TaskListWrapperActivity extends AstridWrapperActivity { listsPopover.dismiss(); if (editPopover != null) editPopover.dismiss(); + if (mainMenuPopover != null) + mainMenuPopover.dismiss(); } public void setSelectedItem(Filter item) { @@ -255,4 +295,34 @@ public class TaskListWrapperActivity extends AstridWrapperActivity { super.onActivityResult(requestCode, resultCode, data); } + + @Override + public void mainMenuItemSelected(int item) { + TaskListActivity tla = getTaskListFragment(); + switch (item) { + case MainMenuPopover.MAIN_MENU_ITEM_TASKS: + // Do nothing + break; + case MainMenuPopover.MAIN_MENU_ITEM_FRIENDS: + // Doesn't exist yet + break; + case MainMenuPopover.MAIN_MENU_ITEM_SUGGESTIONS: + // Doesn't exist yet + break; + case MainMenuPopover.MAIN_MENU_ITEM_TUTORIAL: + Intent showWelcomeLogin = new Intent(this, WelcomeWalkthrough.class); + showWelcomeLogin.putExtra(ActFmLoginActivity.SHOW_TOAST, false); + showWelcomeLogin.putExtra(WelcomeWalkthrough.TOKEN_MANUAL_SHOW, true); + startActivity(showWelcomeLogin); + break; + case MainMenuPopover.MAIN_MENU_ITEM_SETTINGS: + if (tla != null) + tla.showSettings(); + break; + case MainMenuPopover.MAIN_MENU_ITEM_SUPPORT: + if (tla != null) + tla.showSupport(); + break; + } + } } diff --git a/astrid/src/com/todoroo/astrid/ui/FragmentPopover.java b/astrid/src/com/todoroo/astrid/ui/FragmentPopover.java index d9e072726..19eab97bd 100644 --- a/astrid/src/com/todoroo/astrid/ui/FragmentPopover.java +++ b/astrid/src/com/todoroo/astrid/ui/FragmentPopover.java @@ -7,6 +7,7 @@ import java.util.List; import android.content.Context; import android.graphics.Rect; +import android.util.DisplayMetrics; import android.view.View; import android.view.View.MeasureSpec; import android.view.ViewGroup; @@ -18,10 +19,14 @@ import com.timsu.astrid.R; public class FragmentPopover extends QuickActionWidget { + protected DisplayMetrics metrics; + public FragmentPopover(Context context, int layout) { super(context); setContentView(layout); + metrics = context.getResources().getDisplayMetrics(); + setFocusable(true); setTouchable(true); } @@ -58,4 +63,9 @@ public class FragmentPopover extends QuickActionWidget { setWidgetSpecs(popupY, onTop); } + + @Override + protected int getArrowLeftMargin(View arrow) { + return mRect.left + arrow.getMeasuredWidth() / 2 - (int) (10 * metrics.density); + } } diff --git a/astrid/src/com/todoroo/astrid/ui/MainMenuPopover.java b/astrid/src/com/todoroo/astrid/ui/MainMenuPopover.java new file mode 100644 index 000000000..a8a6c199f --- /dev/null +++ b/astrid/src/com/todoroo/astrid/ui/MainMenuPopover.java @@ -0,0 +1,108 @@ +package com.todoroo.astrid.ui; + +import android.content.Context; +import android.view.LayoutInflater; +import android.view.View; +import android.view.View.OnClickListener; +import android.widget.ImageView; +import android.widget.LinearLayout; +import android.widget.TextView; + +import com.timsu.astrid.R; + +public class MainMenuPopover extends FragmentPopover { + + public static final int MAIN_MENU_ITEM_TASKS = 1; + public static final int MAIN_MENU_ITEM_FRIENDS = 2; + public static final int MAIN_MENU_ITEM_SUGGESTIONS = 3; + public static final int MAIN_MENU_ITEM_TUTORIAL = 4; + public static final int MAIN_MENU_ITEM_SETTINGS = 5; + public static final int MAIN_MENU_ITEM_SUPPORT = 6; + + public interface MainMenuListener { + public void mainMenuItemSelected(int item); + } + + private MainMenuListener mListener; + private final LayoutInflater inflater; + private final LinearLayout content; + + public void setMenuListener(MainMenuListener listener) { + this.mListener = listener; + } + + public MainMenuPopover(Context context, int layout) { + super(context, layout); + + inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); + + content = (LinearLayout) getContentView().findViewById(R.id.content); + addTasksItem(); + addFriendsItem(); + addSuggestionsItem(); + addTutorialItem(); + + addSeparator(); + + addSettingsItem(); + addSupportItem(); + } + + @Override + protected int getArrowLeftMargin(View arrow) { + return mRect.centerX() - arrow.getMeasuredWidth() / 2 - (int) (12 * metrics.density); + } + + private void addMenuItem(int title, int imageRes, final int menuItemOption) { + View item = setupItemWithParams(title, imageRes); + content.addView(item); + item.setOnClickListener(new OnClickListener() { + @Override + public void onClick(View v) { + dismiss(); + if (mListener != null) + mListener.mainMenuItemSelected(menuItemOption); + } + }); + } + + private void addSeparator() { + inflater.inflate(R.layout.fla_separator, content); + } + + private void addTasksItem() { + addMenuItem(R.string.TLA_menu_tasks, R.drawable.icn_menu_tasks, MAIN_MENU_ITEM_TASKS); + } + + private void addFriendsItem() { + //addMenuItem(R.string.TLA_menu_friends, R.drawable.icn_friends, MAIN_MENU_ITEM_FRIENDS); + } + + private void addSuggestionsItem() { + //addMenuItem(R.string.TLA_menu_suggestions, R.drawable.icn_featured_lists, MAIN_MENU_ITEM_SUGGESTIONS); + } + + private void addTutorialItem() { + addMenuItem(R.string.TLA_menu_tutorial, 0, MAIN_MENU_ITEM_TUTORIAL); + } + + private void addSettingsItem() { + addMenuItem(R.string.TLA_menu_settings, R.drawable.icn_settings, MAIN_MENU_ITEM_SETTINGS); + } + + private void addSupportItem() { + addMenuItem(R.string.TLA_menu_support, R.drawable.icn_support, MAIN_MENU_ITEM_SUPPORT); + } + + private View setupItemWithParams(int title, int imageRes) { + View itemRow = inflater.inflate(R.layout.main_menu_row, null); + + ImageView image = (ImageView) itemRow.findViewById(R.id.icon); + image.setImageResource(imageRes); + + TextView name = (TextView) itemRow.findViewById(R.id.name); + name.setText(title); + + return itemRow; + } +} diff --git a/greendroid/GreenDroid/src/greendroid/widget/QuickActionWidget.java b/greendroid/GreenDroid/src/greendroid/widget/QuickActionWidget.java index 9c190119f..338058384 100644 --- a/greendroid/GreenDroid/src/greendroid/widget/QuickActionWidget.java +++ b/greendroid/GreenDroid/src/greendroid/widget/QuickActionWidget.java @@ -46,7 +46,7 @@ public abstract class QuickActionWidget extends PopupWindow { private static final int MEASURE_AND_LAYOUT_DONE = 1 << 1; private final int[] mLocation = new int[2]; - private final Rect mRect = new Rect(); + protected final Rect mRect = new Rect(); private int mPrivateFlags; @@ -287,7 +287,11 @@ public abstract class QuickActionWidget extends PopupWindow { } ViewGroup.MarginLayoutParams param = (ViewGroup.MarginLayoutParams) arrow.getLayoutParams(); - param.leftMargin = mRect.centerX() - (arrow.getMeasuredWidth()) / 2; + param.leftMargin = getArrowLeftMargin(arrow); + } + + protected int getArrowLeftMargin(View arrow) { + return mRect.centerX() - (arrow.getMeasuredWidth()) / 2; } private void prepareAnimationStyle() {