/**
* Copyright (c) 2012 Todoroo Inc
*
* See the file "LICENSE" for the full license governing this code.
*/
package com.todoroo.astrid.ui;
import android.content.Context;
import android.content.Intent;
import android.graphics.drawable.Drawable;
import android.view.KeyEvent;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.View.OnTouchListener;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import com.timsu.astrid.R;
import com.todoroo.andlib.utility.Preferences;
import com.todoroo.astrid.service.ThemeService;
import com.todoroo.astrid.ui.TouchInterceptingFrameLayout.InterceptTouchListener;
import com.todoroo.astrid.utility.AstridPreferences;
public class MainMenuPopover extends FragmentPopover implements InterceptTouchListener {
public static final int MAIN_MENU_ITEM_LISTS = R.string.TLA_menu_lists;
public static final int MAIN_MENU_ITEM_FRIENDS = R.string.TLA_menu_friends;
public static final int MAIN_MENU_ITEM_FEATURED_LISTS = R.string.TLA_menu_featured_lists;
public static final int MAIN_MENU_ITEM_SEARCH = R.string.TLA_menu_search;
public static final int MAIN_MENU_ITEM_SUGGESTIONS = R.string.TLA_menu_suggestions;
public static final int MAIN_MENU_ITEM_SETTINGS = R.string.TLA_menu_settings;
public interface MainMenuListener {
public boolean shouldAddMenuItem(int itemId);
public void mainMenuItemSelected(int item, Intent customIntent);
}
private MainMenuListener mListener;
private final LayoutInflater inflater;
private final LinearLayout content;
private final LinearLayout topFixed;
private final LinearLayout bottomFixed;
private final int rowLayout;
private boolean suppressNextKeyEvent = false;
private final boolean isTablet;
public void setMenuListener(MainMenuListener listener) {
this.mListener = listener;
}
public MainMenuPopover(Context context, int layout, boolean isTablet, MainMenuListener listener) {
super(context, layout);
TouchInterceptingFrameLayout rootLayout = (TouchInterceptingFrameLayout) getContentView();
rootLayout.setInterceptTouchListener(this);
rootLayout.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
dismiss();
return false;
}
});
if (AstridPreferences.useTabletLayout(context))
rowLayout = R.layout.main_menu_row_tablet;
else
rowLayout = R.layout.main_menu_row;
inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
content = (LinearLayout) getContentView().findViewById(R.id.content);
topFixed = (LinearLayout) getContentView().findViewById(R.id.topFixedItems);
bottomFixed = (LinearLayout) getContentView().findViewById(R.id.bottomFixedItems);
this.isTablet = isTablet;
mListener = listener;
addFixedItems();
}
public boolean didInterceptTouch(KeyEvent event) {
int keyCode = event.getKeyCode();
if (!suppressNextKeyEvent) {
if ((keyCode == KeyEvent.KEYCODE_MENU || keyCode == KeyEvent.KEYCODE_BACK) && isShowing()) {
dismiss();
return true;
}
}
suppressNextKeyEvent = false;
return false;
}
public void suppressNextKeyEvent() {
suppressNextKeyEvent = true;
}
@Override
public void setBackgroundDrawable(Drawable background) {
super.setBackgroundDrawable(null);
}
private void addFixedItems() {
int themeFlags = isTablet ? ThemeService.FLAG_FORCE_DARK : 0;
if (Preferences.getBoolean(R.string.p_show_menu_search, true))
addMenuItem(R.string.TLA_menu_search,
ThemeService.getDrawable(R.drawable.icn_menu_search, themeFlags),
MAIN_MENU_ITEM_SEARCH, null, topFixed);
addMenuItem(R.string.TLA_menu_lists,
ThemeService.getDrawable(R.drawable.icn_menu_lists, themeFlags),
MAIN_MENU_ITEM_LISTS, null, topFixed); // Lists item
if (Preferences.getBoolean(R.string.p_show_friends_view, false) && Preferences.getBoolean(R.string.p_show_menu_friends, true))
addMenuItem(R.string.TLA_menu_friends,
ThemeService.getDrawable(R.drawable.icn_menu_friends, themeFlags),
MAIN_MENU_ITEM_FRIENDS, null, topFixed);
addMenuItem(R.string.TLA_menu_settings,
ThemeService.getDrawable(R.drawable.icn_menu_settings, themeFlags),
MAIN_MENU_ITEM_SETTINGS, null, bottomFixed); // Settings item
}
public void refreshFixedItems() {
topFixed.removeAllViews();
bottomFixed.removeAllViews();
addFixedItems();
}
public void setFixedItemVisibility(int index, int visibility, boolean top) {
LinearLayout container = top ? topFixed : bottomFixed;
if (index < 0 || index >= container.getChildCount())
return;
container.getChildAt(index).setVisibility(visibility);
}
@Override
protected int getArrowLeftMargin(View arrow) {
return mRect.centerX() - arrow.getMeasuredWidth() / 2 - (int) (12 * metrics.density);
}
// --- Public interface ---
public void addMenuItem(int title, int imageRes, int id) {
addMenuItem(title, imageRes, id, null, content);
}
public void addMenuItem(int title, int imageRes, Intent customIntent, int id) {
addMenuItem(title, imageRes, id, customIntent, content);
}
public void addMenuItem(CharSequence title, Drawable image, Intent customIntent, int id) {
addMenuItem(title, image, id, customIntent, content);
}
public void addSeparator() {
inflater.inflate(R.layout.fla_separator, content);
}
public void clear() {
content.removeAllViews();
}
// --- Private helpers ---
private void addMenuItem(int title, int imageRes, int id, Intent customIntent, ViewGroup container) {
if (mListener != null && !mListener.shouldAddMenuItem(id))
return;
View item = setupItemWithParams(title, imageRes);
addViewWithListener(item, container, id, customIntent);
}
private void addMenuItem(CharSequence title, Drawable image, int id, Intent customIntent, ViewGroup container) {
if (mListener != null && !mListener.shouldAddMenuItem(id))
return;
View item = setupItemWithParams(title, image);
addViewWithListener(item, container, id, customIntent);
}
private void addViewWithListener(View view, ViewGroup container, final int id, final Intent customIntent) {
container.addView(view);
view.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
dismiss();
if (mListener != null)
mListener.mainMenuItemSelected(id, customIntent);
}
});
}
private View setupItemWithParams(int title, int imageRes) {
View itemRow = inflater.inflate(rowLayout, 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;
}
private View setupItemWithParams(CharSequence title, Drawable imageDrawable) {
View itemRow = inflater.inflate(rowLayout, null);
ImageView image = (ImageView) itemRow.findViewById(R.id.icon);
image.setImageDrawable(imageDrawable);
TextView name = (TextView) itemRow.findViewById(R.id.name);
name.setText(title);
return itemRow;
}
}