package com.jdroid.android.provider; import android.content.Context; import android.graphics.Rect; import android.support.v4.view.ActionProvider; import android.view.Gravity; import android.view.LayoutInflater; import android.view.View; import android.view.View.OnClickListener; import android.view.View.OnLongClickListener; import android.widget.ImageView; import android.widget.Toast; import android.widget.ViewFlipper; import com.jdroid.android.R; import com.jdroid.android.utils.LocalizationUtils; public abstract class TwoStateActionProvider extends ActionProvider { private static final int FIRST_STATE = 0; private static final int LOADING_STATE = 1; private static final int SECOND_STATE = 2; private ViewFlipper viewFlipper; private TwoStateClickListener onItemClickListener; public TwoStateActionProvider(final Context context) { super(context); viewFlipper = (ViewFlipper)LayoutInflater.from(context).inflate(getLayoutResId(), null); ImageView firstStateView = (ImageView)viewFlipper.findViewById(R.id.firstState); firstStateView.setOnClickListener(new StateViewClickListener()); firstStateView.setOnLongClickListener(new LongClickListener(context)); firstStateView.setImageResource(getFirstStateImageResId()); viewFlipper.setDisplayedChild(FIRST_STATE); if (getSecondStateImageResId() != null) { ImageView secondStateView = (ImageView)viewFlipper.findViewById(R.id.secondState); secondStateView.setOnClickListener(new StateViewClickListener()); secondStateView.setOnLongClickListener(new LongClickListener(context)); secondStateView.setImageResource(getSecondStateImageResId()); secondStateView.setVisibility(View.VISIBLE); } } public void stopLoading(boolean firstState) { viewFlipper.setDisplayedChild(firstState ? FIRST_STATE : SECOND_STATE); } public void startLoading() { viewFlipper.setDisplayedChild(LOADING_STATE); } protected Integer getLayoutResId() { return R.layout.jdroid_two_state_action_item; } protected abstract Integer getFirstStateImageResId(); protected abstract Integer getFirstStateCheatSheetResId(); protected Integer getSecondStateImageResId() { return null; } protected Integer getSecondStateCheatSheetResId() { return null; } protected String getFirstStateCheatSheet() { return LocalizationUtils.getString(getFirstStateCheatSheetResId()); } protected String getSecondStateCheatSheet() { return LocalizationUtils.getString(getSecondStateCheatSheetResId()); } /** * @see android.support.v4.view.ActionProvider#onCreateActionView() */ @Override public View onCreateActionView() { return viewFlipper; } private class LongClickListener implements OnLongClickListener { private final Context context; private LongClickListener(Context context) { this.context = context; } @Override public boolean onLongClick(View view) { final int[] screenPos = new int[2]; final Rect displayFrame = new Rect(); view.getLocationOnScreen(screenPos); view.getWindowVisibleDisplayFrame(displayFrame); final int width = view.getWidth(); final int height = view.getHeight(); final int midy = screenPos[1] + (height / 2); final int screenWidth = context.getResources().getDisplayMetrics().widthPixels; String title = viewFlipper.getDisplayedChild() == FIRST_STATE ? getFirstStateCheatSheet() : getSecondStateCheatSheet(); Toast cheatSheet = Toast.makeText(context, title, Toast.LENGTH_SHORT); if (midy < displayFrame.height()) { // Show along the top; follow action buttons cheatSheet.setGravity(Gravity.TOP | Gravity.RIGHT, screenWidth - screenPos[0] - (width / 2), height); } else { // Show along the bottom center cheatSheet.setGravity(Gravity.BOTTOM | Gravity.CENTER_HORIZONTAL, 0, height); } cheatSheet.show(); return true; } } private final class StateViewClickListener implements OnClickListener { @Override public void onClick(View v) { viewFlipper.setDisplayedChild(LOADING_STATE); if (onItemClickListener != null) { onItemClickListener.onClick(); } } } /** * @param onItemClickListener the onItemClickListener to set */ public void setOnItemClickListener(TwoStateClickListener onItemClickListener) { this.onItemClickListener = onItemClickListener; } }