/**
* galaxy inc.
* meetup client for android
*/
package com.galaxy.meetup.client.android.ui.view;
import android.app.Activity;
import android.content.Context;
import android.content.res.Resources;
import android.graphics.Rect;
import android.os.Build;
import android.os.Handler;
import android.os.Looper;
import android.os.Parcel;
import android.os.Parcelable;
import android.text.TextUtils;
import android.util.AttributeSet;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewConfiguration;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.PopupMenu;
import android.widget.RelativeLayout;
import android.widget.Spinner;
import android.widget.SpinnerAdapter;
import android.widget.TextView;
import android.widget.Toast;
import com.galaxy.meetup.client.android.R;
import com.galaxy.meetup.client.util.AccessibilityUtils;
import com.galaxy.meetup.client.util.ScreenMetrics;
/**
*
* @author sihai
*
*/
public class HostActionBar extends RelativeLayout implements View.OnClickListener,
View.OnLongClickListener, AdapterView.OnItemSelectedListener {
private static Handler sHandler;
private ImageView mActionButton1;
private boolean mActionButton1Visible;
private ImageView mActionButton2;
private boolean mActionButton2Visible;
private int mActionId1;
private int mActionId2;
private boolean mActive;
private ImageView mAppIcon;
private boolean mContextActionMode;
private String mCurrentButtonActionText;
private SpinnerAdapter mDefaultPrimarySpinnerAdapter;
private View mDoneButton;
private OnDoneButtonClickListener mDoneButtonListener;
private Runnable mInvalidateActionBarRunnable = new Runnable() {
public final void run() {
if (mListener != null)
mListener.onActionBarInvalidated();
}
};
private HostActionBarListener mListener;
private int mNotificationCount;
private View mNotificationCountOverflow;
private TextView mNotificationCountText;
private View mOverflowMenuButton;
private PopupMenu mOverflowPopupMenu;
private boolean mOverflowPopupMenuVisible;
private Spinner mPrimarySpinner;
private View mPrimarySpinnerContainer;
private boolean mPrimarySpinnerVisible;
private View mProgressIndicator;
private boolean mProgressIndicatorVisible;
private ImageView mRefreshButton;
private boolean mRefreshButtonVisible;
private boolean mRefreshButtonVisibleIfRoom;
private boolean mRefreshHighlighted;
private SearchViewAdapter mSearchViewAdapter;
private View mSearchViewContainer;
private boolean mSearchViewVisible;
private View mShareMenuButton;
private boolean mShareMenuVisible;
private PopupMenu mSharePopupMenu;
private boolean mSharePopupMenuVisible;
private TextView mTitle;
private boolean mTitleVisible;
private View mUpButton;
private OnUpButtonClickListener mUpButtonListener;
//===========================================================================
// Constructor
//===========================================================================
public HostActionBar(Context context) {
super(context);
}
public HostActionBar(Context context, AttributeSet attrs) {
super(context, attrs);
}
public HostActionBar(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
//===========================================================================
// Private function
//===========================================================================
private void configurePopupMenuListeners(PopupMenu popupMenu) {
Object listener;
if (Build.VERSION.SDK_INT >= 14) {
listener = new PopupMenuListenerV14();
popupMenu.setOnDismissListener((PopupMenuListenerV14) listener);
} else {
listener = new PopupMenuListener();
}
popupMenu.setOnMenuItemClickListener(((PopupMenu.OnMenuItemClickListener) (listener)));
}
private PopupMenu getOverflowPopupMenu() {
if (mOverflowPopupMenu == null) {
mOverflowPopupMenu = new PopupMenu(getContext(), mOverflowMenuButton);
configurePopupMenuListeners(mOverflowPopupMenu);
((Activity) getContext()).onCreateOptionsMenu(mOverflowPopupMenu.getMenu());
}
return mOverflowPopupMenu;
}
private boolean isOverflowMenuSupported() {
boolean flag = true;
if (android.os.Build.VERSION.SDK_INT < 14) {
if (android.os.Build.VERSION.SDK_INT < 11) {
return false;
} else {
return true;
}
} else {
return !ViewConfiguration.get(getContext()).hasPermanentMenuKey();
}
}
private boolean prepareOverflowMenu() {
if(null == mOverflowPopupMenu) {
return false;
} else {
boolean flag = false;
Menu menu = ((PopupMenu)mOverflowPopupMenu).getMenu();
((Activity)getContext()).onPrepareOptionsMenu(menu);
int i = menu.size();
for(int j = 0; j < i; j++) {
if(menu.getItem(j).isVisible()) {
flag = true;
break;
}
}
return flag;
}
}
private boolean prepareSharePopupMenu() {
boolean flag;
if (mSharePopupMenu == null) {
flag = false;
} else {
Menu menu = ((PopupMenu) mSharePopupMenu).getMenu();
((Activity) getContext()).onPrepareOptionsMenu(menu);
flag = false;
int i = menu.size();
int j = 0;
for (; j < i; j++) {
MenuItem menuitem = menu.getItem(j);
flag = true;
menuitem.setVisible(false);
}
}
return flag;
}
private void showOverflowMenu() {
mSharePopupMenuVisible = false;
PopupMenu popupmenu = getOverflowPopupMenu();
prepareOverflowMenu();
mOverflowPopupMenuVisible = true;
popupmenu.show();
}
private void showSharePopupMenu() {
mOverflowPopupMenuVisible = false;
if (mSharePopupMenu == null) {
mSharePopupMenu = new PopupMenu(getContext(), mShareMenuButton);
configurePopupMenuListeners(mSharePopupMenu);
((Activity) getContext()).onCreateOptionsMenu(mSharePopupMenu
.getMenu());
}
if (prepareSharePopupMenu()) {
mSharePopupMenuVisible = true;
mSharePopupMenu.show();
}
}
private boolean showTooltip(View view, CharSequence charsequence) {
int ai[] = new int[2];
Rect rect = new Rect();
view.getLocationOnScreen(ai);
view.getWindowVisibleDisplayFrame(rect);
Context context = getContext();
int i = view.getWidth();
int j = view.getHeight();
int k = context.getResources().getDisplayMetrics().widthPixels;
Toast toast = Toast.makeText(context, charsequence, 0);
toast.setGravity(53, k - ai[0] - i / 2, j);
toast.show();
return true;
}
//===========================================================================
// Public function
//===========================================================================
public final void commit() {
if(mContextActionMode)
mUpButton.setVisibility(View.GONE);
else
mUpButton.setVisibility(View.VISIBLE);
if(mContextActionMode)
mDoneButton.setVisibility(View.VISIBLE);
else
mDoneButton.setVisibility(View.GONE);
if(mTitleVisible)
mTitle.setVisibility(View.VISIBLE);
else
mTitle.setVisibility(View.GONE);
if(mPrimarySpinnerVisible && mPrimarySpinner.getAdapter().getCount() > 0)
mPrimarySpinnerContainer.setVisibility(View.VISIBLE);
else
mPrimarySpinnerContainer.setVisibility(View.GONE);
if(!mPrimarySpinnerVisible)
mPrimarySpinner.setAdapter(mDefaultPrimarySpinnerAdapter);
if(mSearchViewVisible)
mSearchViewContainer.setVisibility(View.VISIBLE);
else
mSearchViewContainer.setVisibility(View.GONE);
mSearchViewAdapter.setVisible(mSearchViewVisible);
if(isRefreshButtonVisible() && !mProgressIndicatorVisible)
mRefreshButton.setVisibility(View.VISIBLE);
else
mRefreshButton.setVisibility(View.GONE);
Resources resources = getResources();
if(mRefreshHighlighted)
mRefreshButton.setImageDrawable(resources.getDrawable(R.drawable.ic_refresh_blue));
else
mRefreshButton.setImageDrawable(resources.getDrawable(R.drawable.ic_refresh));
if(mProgressIndicatorVisible)
mProgressIndicator.setVisibility(View.VISIBLE);
else
mProgressIndicator.setVisibility(View.GONE);
if(mActionButton1Visible)
mActionButton1.setVisibility(View.VISIBLE);
else
mActionButton1.setVisibility(View.GONE);
if(mActionButton2Visible)
mActionButton2.setVisibility(View.VISIBLE);
else
mActionButton2.setVisibility(View.GONE);
mShareMenuButton.setVisibility(View.GONE);
if(isOverflowMenuSupported()) {
if(mSharePopupMenuVisible)
prepareSharePopupMenu();
else if(mOverflowPopupMenuVisible) {
prepareOverflowMenu();
} else {
View view5 = mOverflowMenuButton;
getOverflowPopupMenu();
boolean flag = prepareOverflowMenu();
if(!flag)
mOverflowMenuButton.setVisibility(View.GONE);
else
mOverflowMenuButton.setVisibility(View.VISIBLE);
}
}
mActive = true;
}
public final void dismissPopupMenus() {
if (mOverflowPopupMenu != null)
mOverflowPopupMenu.dismiss();
if (mSharePopupMenu != null)
mSharePopupMenu.dismiss();
}
public final void finishContextActionMode() {
if (mContextActionMode) {
mContextActionMode = false;
if (mActive) {
mUpButton.setVisibility(View.VISIBLE);
mDoneButton.setVisibility(View.GONE);
}
}
}
public final SearchViewAdapter getSearchViewAdapter() {
return mSearchViewAdapter;
}
public final void hideProgressIndicator() {
mProgressIndicatorVisible = false;
if (mActive) {
mProgressIndicator.setVisibility(View.GONE);
if (isRefreshButtonVisible())
mRefreshButton.setVisibility(View.VISIBLE);
else
mRefreshButton.setVisibility(View.GONE);
if (mActionButton1Visible)
mActionButton1.setVisibility(View.VISIBLE);
else
mActionButton1.setVisibility(View.GONE);
if (mActionButton2Visible) {
mActionButton2.setVisibility(View.VISIBLE);
} else {
mActionButton2.setVisibility(View.GONE);
}
}
}
public final void invalidateActionBar() {
if (sHandler == null)
sHandler = new Handler(Looper.getMainLooper());
sHandler.removeCallbacks(mInvalidateActionBarRunnable);
sHandler.post(mInvalidateActionBarRunnable);
}
public final boolean isRefreshButtonVisible() {
boolean flag = true;
if (mRefreshButtonVisible) {
return flag;
}
if (mRefreshButtonVisibleIfRoom) {
if (mActionButton1Visible) {
ScreenMetrics screenmetrics = ScreenMetrics
.getInstance(getContext());
boolean flag1;
if (getResources().getConfiguration().orientation == 2)
flag1 = flag;
else
flag1 = false;
if (screenmetrics.screenDisplayType == 0 && !flag1)
flag = false;
}
} else {
flag = false;
}
return flag;
}
public void onClick(View view) {
if (view == mUpButton && mUpButtonListener != null) {
mUpButtonListener.onUpButtonClick();
} else if (view == mDoneButton && mDoneButtonListener != null) {
mDoneButtonListener.onDoneButtonClick();
} else if (view == mOverflowMenuButton)
showOverflowMenu();
else if (view == mShareMenuButton)
showSharePopupMenu();
else if (view == mRefreshButton && mListener != null) {
mListener.onRefreshButtonClicked();
} else if (view == mActionButton1 && mListener != null) {
mListener.onActionButtonClicked(mActionId1);
} else if (view == mActionButton2 && mListener != null)
mListener.onActionButtonClicked(mActionId2);
}
protected void onFinishInflate() {
super.onFinishInflate();
mUpButton = findViewById(R.id.up);
mUpButton.setOnClickListener(this);
mDoneButton = findViewById(R.id.done);
mDoneButton.setOnClickListener(this);
mAppIcon = (ImageView) findViewById(R.id.icon);
mTitle = (TextView) findViewById(R.id.title);
mPrimarySpinnerContainer = findViewById(R.id.primary_spinner_container);
mPrimarySpinner = (Spinner) findViewById(R.id.primary_spinner);
mPrimarySpinner.setOnItemSelectedListener(this);
mDefaultPrimarySpinnerAdapter = new ArrayAdapter(getContext(),
R.layout.simple_spinner_item);
mPrimarySpinner.setAdapter(mDefaultPrimarySpinnerAdapter);
mSearchViewContainer = findViewById(R.id.search_view_container);
mSearchViewAdapter = SearchViewAdapter
.createInstance(findViewById(R.id.search_src_text));
mSearchViewAdapter.requestFocus(false);
mShareMenuButton = findViewById(R.id.share_menu_anchor);
if (isOverflowMenuSupported()) {
mShareMenuButton.setOnClickListener(this);
mShareMenuButton.setOnLongClickListener(this);
}
mRefreshButton = (ImageView) findViewById(R.id.refresh_button);
mRefreshButton.setOnClickListener(this);
mRefreshButton.setOnLongClickListener(this);
mActionButton1 = (ImageView) findViewById(R.id.action_button_1);
mActionButton1.setOnClickListener(this);
mActionButton1.setOnLongClickListener(this);
mActionButton2 = (ImageView) findViewById(R.id.action_button_2);
mActionButton2.setOnClickListener(this);
mActionButton2.setOnLongClickListener(this);
mProgressIndicator = findViewById(R.id.progress_indicator);
mNotificationCountText = (TextView) findViewById(R.id.notification_count);
mNotificationCountText.setText("99");
mNotificationCountText.setVisibility(View.GONE);
mNotificationCountOverflow = findViewById(R.id.notification_count_overflow);
mOverflowMenuButton = findViewById(R.id.menu);
if (isOverflowMenuSupported())
mOverflowMenuButton.setOnClickListener(this);
else
mOverflowMenuButton.setVisibility(View.GONE);
mCurrentButtonActionText = "";
}
public void onItemSelected(AdapterView adapterview, View view, int i, long l) {
if (mListener != null)
mListener.onPrimarySpinnerSelectionChange(i);
}
public boolean onLongClick(View view) {
boolean flag = true;
if (view == mShareMenuButton)
showTooltip(
view,
getContext().getString(
R.string.share_menu_anchor_content_description));
else if (view == mRefreshButton)
showTooltip(view, getContext().getString(R.string.menu_refresh));
else if (view == mActionButton1)
showTooltip(view, mActionButton1.getContentDescription());
else if (view == mActionButton2)
showTooltip(view, mActionButton2.getContentDescription());
else
flag = false;
return flag;
}
public void onNothingSelected(AdapterView adapterview) {
}
public void onRestoreInstanceState(Parcelable parcelable) {
SavedState savedstate = (SavedState) parcelable;
super.onRestoreInstanceState(savedstate.getSuperState());
if (savedstate.overflowPopupMenuVisible)
post(new Runnable() {
public final void run() {
showOverflowMenu();
}
});
if (savedstate.sharePopupMenuVisible)
post(new Runnable() {
public final void run() {
showSharePopupMenu();
}
});
}
public Parcelable onSaveInstanceState() {
SavedState savedstate = new SavedState(super.onSaveInstanceState());
if (android.os.Build.VERSION.SDK_INT >= 14) {
savedstate.overflowPopupMenuVisible = mOverflowPopupMenuVisible;
savedstate.sharePopupMenuVisible = mSharePopupMenuVisible;
}
return savedstate;
}
public final void reset() {
mActive = false;
mContextActionMode = false;
mTitleVisible = false;
mPrimarySpinnerVisible = false;
mSearchViewVisible = false;
mRefreshButtonVisible = false;
mRefreshButtonVisibleIfRoom = false;
mActionButton1Visible = false;
mActionButton2Visible = false;
mProgressIndicatorVisible = false;
mShareMenuVisible = false;
mRefreshHighlighted = false;
}
public void setHostActionBarListener(HostActionBarListener hostactionbarlistener) {
mListener = hostactionbarlistener;
}
public void setNotificationCount(int i) {
mNotificationCount = i;
if (mNotificationCount == 0) {
mAppIcon.setVisibility(View.VISIBLE);
mNotificationCountText.setVisibility(View.GONE);
mNotificationCountOverflow.setVisibility(View.GONE);
} else {
mAppIcon.setVisibility(View.INVISIBLE);
if (mNotificationCount <= 99) {
mNotificationCountText.setText(Integer.toString(mNotificationCount));
mNotificationCountText.setVisibility(View.VISIBLE);
mNotificationCountOverflow.setVisibility(View.GONE);
} else {
mNotificationCountText.setVisibility(View.GONE);
mNotificationCountOverflow.setVisibility(View.VISIBLE);
}
}
setUpButtonContentDescription(null);
}
public void setOnDoneButtonClickListener(
OnDoneButtonClickListener ondonebuttonclicklistener) {
mDoneButtonListener = ondonebuttonclicklistener;
}
public void setOnUpButtonClickListener(
OnUpButtonClickListener onupbuttonclicklistener) {
mUpButtonListener = onupbuttonclicklistener;
}
public void setPrimarySpinnerSelection(int i) {
if (i < mPrimarySpinner.getCount() && i >= 0)
mPrimarySpinner.setSelection(i);
}
public void setUpButtonContentDescription(String s)
{
StringBuilder stringbuilder = new StringBuilder();
if(!TextUtils.isEmpty(s))
{
mCurrentButtonActionText = s;
AccessibilityUtils.appendAndSeparateIfNotEmpty(stringbuilder, s);
} else
{
AccessibilityUtils.appendAndSeparateIfNotEmpty(stringbuilder, mCurrentButtonActionText);
}
if(mNotificationCount > 0)
{
Resources resources = getResources();
int i = R.plurals.accessibility_notification_count_description;
int j = mNotificationCount;
Object aobj[] = new Object[1];
aobj[0] = Integer.valueOf(mNotificationCount);
AccessibilityUtils.appendAndSeparateIfNotEmpty(stringbuilder, resources.getQuantityString(i, j, aobj));
}
mUpButton.setContentDescription(stringbuilder.toString());
}
public final void showActionButton(int i, int j, int k) {
if(mActionButton1Visible) {
if(mActionButton2Visible) {
throw new IllegalArgumentException("Only two action buttons are supported");
}
mActionButton2Visible = true;
mActionId2 = i;
mActionButton2.setImageResource(j);
mActionButton2.setContentDescription(getContext().getString(k));
if(mActive)
{
ImageView imageview = mActionButton2;
boolean flag = mActionButton2Visible;
int l = 0;
if(!flag)
l = 8;
imageview.setVisibility(l);
}
} else {
mActionButton1Visible = true;
mActionId1 = i;
mActionButton1.setImageResource(j);
mActionButton1.setContentDescription(getContext().getString(k));
if(!mActive) {
return;
} else {
int j1;
ImageView imageview1 = mActionButton1;
int i1;
ImageView imageview2;
boolean flag1;
if(mActionButton1Visible)
i1 = 0;
else
i1 = 8;
imageview1.setVisibility(i1);
imageview2 = mRefreshButton;
if(!isRefreshButtonVisible()) {
j1 = 8;
} else {
flag1 = mProgressIndicatorVisible;
j1 = 0;
if(flag1) {
j1 = 8;
}
}
imageview2.setVisibility(j1);
}
}
}
public final void showPrimarySpinner(SpinnerAdapter spinneradapter, int i) {
mPrimarySpinnerVisible = true;
mPrimarySpinner.setAdapter(spinneradapter);
int j = spinneradapter.getCount();
if (j > 0)
mPrimarySpinner.setSelection(i);
if (mActive) {
if (j > 0)
mPrimarySpinnerContainer.setVisibility(View.VISIBLE);
else
mPrimarySpinnerContainer.setVisibility(View.GONE);
}
}
public final void showProgressIndicator() {
mProgressIndicatorVisible = true;
if (mActive) {
mRefreshButton.setVisibility(View.GONE);
if (mRefreshButtonVisibleIfRoom && !isRefreshButtonVisible()) {
mActionButton1.setVisibility(View.GONE);
mActionButton2.setVisibility(View.GONE);
}
mProgressIndicator.setVisibility(View.VISIBLE);
}
}
public final void showRefreshButton() {
mRefreshButtonVisible = true;
if (mActive && !mProgressIndicatorVisible)
mRefreshButton.setVisibility(View.VISIBLE);
}
public final void showRefreshButtonIfRoom() {
mRefreshButtonVisibleIfRoom = true;
if (mActive && !mProgressIndicatorVisible && isRefreshButtonVisible())
mRefreshButton.setVisibility(View.VISIBLE);
}
public final void showSearchView() {
mSearchViewVisible = true;
if (mActive)
mSearchViewContainer.setVisibility(View.VISIBLE);
}
public final void showTitle(int i) {
if (i != 0)
mTitleVisible = true;
else
mTitleVisible = false;
mTitle.setText(i);
if (mActive) {
if (mTitleVisible) {
mTitle.setVisibility(View.VISIBLE);
} else {
mTitle.setVisibility(View.GONE);
}
}
}
public final void showTitle(String s) {
if (!TextUtils.isEmpty(s))
mTitleVisible = true;
else
mTitleVisible = false;
mTitle.setText(s);
if (mActive) {
if (mTitleVisible) {
mTitle.setVisibility(View.VISIBLE);
} else {
mTitle.setVisibility(View.GONE);
}
}
}
public final void startContextActionMode() {
if (!mContextActionMode) {
mContextActionMode = true;
if (mActive) {
mUpButton.setVisibility(View.GONE);
mDoneButton.setVisibility(View.VISIBLE);
}
}
}
public final void updateRefreshButtonIcon(boolean refreshHighlighted) {
mRefreshHighlighted = refreshHighlighted;
int i;
if (mRefreshHighlighted)
i = R.drawable.ic_refresh_blue;
else
i = R.drawable.ic_refresh;
mRefreshButton.setImageDrawable(getResources().getDrawable(i));
}
//===========================================================================
// Inner class
//===========================================================================
public static interface HostActionBarListener {
void onActionBarInvalidated();
void onActionButtonClicked(int i);
void onPrimarySpinnerSelectionChange(int i);
void onRefreshButtonClicked();
}
public static interface OnDoneButtonClickListener {
void onDoneButtonClick();
}
public static interface OnUpButtonClickListener {
void onUpButtonClick();
}
private class PopupMenuListener implements PopupMenu.OnMenuItemClickListener {
public boolean onMenuItemClick(MenuItem menuitem) {
return ((Activity) getContext()).onOptionsItemSelected(menuitem);
}
}
private final class PopupMenuListenerV14 extends PopupMenuListener
implements PopupMenu.OnDismissListener {
public final void onDismiss(PopupMenu popupmenu) {
if (popupmenu == mOverflowPopupMenu)
mOverflowPopupMenuVisible = false;
else
mSharePopupMenuVisible = false;
}
}
static class SavedState extends View.BaseSavedState {
boolean overflowPopupMenuVisible;
boolean sharePopupMenuVisible;
public String toString() {
String s = Integer.toHexString(System.identityHashCode(this));
return (new StringBuilder("HostActionBar.SavedState{")).append(s)
.append(" overflowPopupMenuVisible=")
.append(overflowPopupMenuVisible)
.append(" sharePopupMenuVisible=")
.append(sharePopupMenuVisible).append("}").toString();
}
public void writeToParcel(Parcel parcel, int i) {
super.writeToParcel(parcel, i);
if (overflowPopupMenuVisible)
parcel.writeInt(1);
else
parcel.writeInt(0);
if (sharePopupMenuVisible)
parcel.writeInt(1);
else
parcel.writeInt(0);
}
public static final android.os.Parcelable.Creator CREATOR = new android.os.Parcelable.Creator() {
public final Object createFromParcel(Parcel parcel) {
return new SavedState(parcel, (byte) 0);
}
public final Object[] newArray(int i) {
return new SavedState[i];
}
};
private SavedState(Parcel parcel) {
super(parcel);
if (parcel.readInt() != 0)
overflowPopupMenuVisible = true;
else
overflowPopupMenuVisible = false;
if (parcel.readInt() == 0)
sharePopupMenuVisible = false;
else
sharePopupMenuVisible = true;
}
SavedState(Parcel parcel, byte byte0) {
this(parcel);
}
SavedState(Parcelable parcelable) {
super(parcelable);
}
}
}