/**
*
*/
package com.gmail.charleszq.picorner.ui;
import java.util.ArrayList;
import java.util.List;
import android.animation.Animator;
import android.animation.AnimatorListenerAdapter;
import android.animation.AnimatorSet;
import android.animation.ObjectAnimator;
import android.app.ProgressDialog;
import android.content.Context;
import android.os.Bundle;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.FrameLayout;
import android.widget.FrameLayout.LayoutParams;
import android.widget.ListView;
import com.gmail.charleszq.picorner.PicornerApplication;
import com.gmail.charleszq.picorner.R;
import com.gmail.charleszq.picorner.SPUtil;
import com.gmail.charleszq.picorner.msg.IMessageConsumer;
import com.gmail.charleszq.picorner.msg.Message;
import com.gmail.charleszq.picorner.msg.MessageBus;
import com.gmail.charleszq.picorner.ui.command.AboutCommand;
import com.gmail.charleszq.picorner.ui.command.HelpCommand;
import com.gmail.charleszq.picorner.ui.command.ICommand;
import com.gmail.charleszq.picorner.ui.command.ICommandDoneListener;
import com.gmail.charleszq.picorner.ui.command.MenuSectionHeaderCommand;
import com.gmail.charleszq.picorner.ui.command.PhotoListCommand;
import com.gmail.charleszq.picorner.ui.command.RateCommand;
import com.gmail.charleszq.picorner.ui.command.SettingsCommand;
import com.gmail.charleszq.picorner.ui.command.flickr.FlickrFriendPhotosCommand;
import com.gmail.charleszq.picorner.ui.command.flickr.FlickrTagSearchCommand;
import com.gmail.charleszq.picorner.ui.command.flickr.GroupSearchPhotosCommand;
import com.gmail.charleszq.picorner.ui.command.flickr.MyFrequentlyUsedTagsCommand;
import com.gmail.charleszq.picorner.ui.command.ig.InstagramFollowingPhotosCommand;
import com.gmail.charleszq.picorner.ui.command.ig.InstagramSearchNearPhotosCommand;
import com.gmail.charleszq.picorner.ui.command.px500.Px500FriendPhotosCommand;
import com.gmail.charleszq.picorner.ui.command.px500.TermTagSearchCommand;
import com.gmail.charleszq.picorner.ui.helper.CommandSectionListAdapter;
import com.gmail.charleszq.picorner.ui.helper.IHiddenView;
import com.gmail.charleszq.picorner.ui.helper.IHiddenView.IHiddenViewActionListener;
/**
* Represents the fragment to show the secondary menus.
*
* @author charles(charleszq@gmail.com)
*
*/
public class SecondaryMenuFragment extends AbstractFragmentWithImageFetcher
implements OnItemClickListener, IMessageConsumer {
private ListView mListView;
private FrameLayout mBackViewContainer;
private CommandSectionListAdapter mSectionAdapter;
private ProgressDialog mProgressDialog;
/**
* Records the latest command user clicks, then when the command finishes, we know
* which one to load.
*/
private ICommand<?> mCurrentCommand;
/**
* The listener to cancel the hidden view.
*/
private IHiddenViewActionListener mHideViewCancelListener = new IHiddenViewActionListener() {
@SuppressWarnings("unchecked")
@Override
public void onAction(int action, ICommand<?> command, IHiddenView view,
Object... data) {
Context ctx = (Context) command.getAdapter(Context.class);
switch (action) {
case IHiddenView.ACTION_CANCEL:
hideHiddenView(view.getView(ctx));
break;
case IHiddenView.ACTION_DO:
doCommand((ICommand<Object>) command, data);
hideHiddenView(view.getView(ctx));
break;
case IHiddenView.ACTION_JUST_CMD:
doCommand((ICommand<Object>) command, data);
break;
}
}
};
private ICommandDoneListener<Object> mCommandDoneListener = new ICommandDoneListener<Object>() {
@Override
public void onCommandDone(ICommand<Object> command, Object t) {
if (mProgressDialog != null && mProgressDialog.isShowing()) {
try {
mProgressDialog.cancel();
} catch (Exception e) {
}
}
if (command != mCurrentCommand)
return;
MainSlideMenuActivity act = (MainSlideMenuActivity) SecondaryMenuFragment.this
.getActivity();
if (act == null) {
Context ctx = (Context) command.getAdapter(Context.class);
if (ctx != null && ctx instanceof MainSlideMenuActivity) {
act = (MainSlideMenuActivity) ctx;
}
}
if (act != null)
act.onCommandDone(command, t);
}
};
/**
*
*/
public SecondaryMenuFragment() {
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.secondary_menu, null);
mListView = (ListView) v.findViewById(R.id.secondary_menu_list);
mBackViewContainer = (FrameLayout) v
.findViewById(R.id.back_view_container);
mSectionAdapter = new CommandSectionListAdapter(getActivity());
mListView.setAdapter(mSectionAdapter);
mListView.setOnItemClickListener(this);
return v;
}
/*
* (non-Javadoc)
*
* @see android.support.v4.app.Fragment#onResume()
*/
@Override
public void onResume() {
super.onResume();
prepareMenuItems();
}
private void prepareMenuItems() {
PicornerApplication app = (PicornerApplication) getActivity()
.getApplication();
mSectionAdapter.clearSections();
List<ICommand<?>> commands = new ArrayList<ICommand<?>>();
// general
ICommand<?> command = new MenuSectionHeaderCommand(getActivity(),
getString(R.string.secondary_menus_general));
commands.add(command);
command = new SettingsCommand(getActivity());
commands.add(command);
command = new RateCommand(getActivity());
commands.add(command);
// search
command = new MenuSectionHeaderCommand(getActivity(),
getString(R.string.secondary_menus_search));
commands.add(command);
command = new InstagramSearchNearPhotosCommand(getActivity());
commands.add(command);
command = new TermTagSearchCommand(getActivity());
commands.add(command);
command = new FlickrTagSearchCommand(getActivity());
commands.add(command);
command = new GroupSearchPhotosCommand(getActivity());
commands.add(command);
if (SPUtil.isFlickrAuthed(getActivity())) {
command = new MyFrequentlyUsedTagsCommand(getActivity());
commands.add(command);
}
int index = commands.size();
boolean accountReady = false;
if (app.getPxUserProfile() != null) {
command = new Px500FriendPhotosCommand(getActivity());
commands.add(command);
accountReady = true;
}
if (SPUtil.isFlickrAuthed(getActivity())) {
// friends
command = new FlickrFriendPhotosCommand(getActivity());
commands.add(command);
accountReady = true;
}
if (SPUtil.getInstagramUserId(getActivity()) != null) {
command = new InstagramFollowingPhotosCommand(getActivity());
commands.add(command);
accountReady = true;
}
if (accountReady) {
command = new MenuSectionHeaderCommand(getActivity(),
getString(R.string.menu_header_friends));
commands.add(index, command);
}
//labs
// command = new MenuSectionHeaderCommand(getActivity(), getString(R.string.cmd_labs_label));
// commands.add(command);
// command = new BigPictureRssCommand(getActivity());
// commands.add(command);
// help & about
command = new MenuSectionHeaderCommand(getActivity(),
getString(R.string.cmd_help_label));
commands.add(command);
command = new AboutCommand(getActivity());
commands.add(command);
command = new HelpCommand(getActivity());
commands.add(command);
mSectionAdapter.addCommands(commands);
mSectionAdapter.notifyDataSetChanged();
}
@Override
public void onItemClick(AdapterView<?> parent, View view, int position,
long id) {
// execute the command
@SuppressWarnings("unchecked")
ICommand<Object> command = (ICommand<Object>) parent.getAdapter()
.getItem(position);
Context ctx = (Context) command.getAdapter(Context.class);
//save the current command
if( mCurrentCommand != null )
mCurrentCommand.cancel();
mCurrentCommand = command;
IHiddenView hiddenView = (IHiddenView) command
.getAdapter(IHiddenView.class);
if (hiddenView == null) {
doCommand(command);
} else {
hiddenView.init(command, mHideViewCancelListener);
FrameLayout.LayoutParams param = new FrameLayout.LayoutParams(
LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT,
Gravity.CENTER_VERTICAL);
View hv = hiddenView.getView(ctx);
hv.setLayoutParams(param);
mBackViewContainer.addView(hv);
showHiddenView(hv);
}
}
private void doCommand(ICommand<Object> command, Object... params) {
if (PhotoListCommand.class.isInstance(command)) {
Message msg = new Message(Message.CANCEL_COMMAND, null, null,
command);
MessageBus.broadcastMessage(msg);
mProgressDialog = ProgressDialog.show(getActivity(),
"", getActivity() //$NON-NLS-1$
.getString(R.string.loading_photos));
mProgressDialog.setCanceledOnTouchOutside(true);
}
command.setCommndDoneListener(mCommandDoneListener);
command.execute(params);
// close the menu.
MainSlideMenuActivity act = (MainSlideMenuActivity) getActivity();
act.closeMenu();
}
/**
* Animate the view to show the hidden view
*
* @param view
*/
private void showHiddenView(final View view) {
view.setRotationY(90f);
mListView.setRotationY(0f);
ObjectAnimator r1 = ObjectAnimator
.ofFloat(mListView, "rotationY", -90f).setDuration(500); //$NON-NLS-1$
ObjectAnimator r2 = ObjectAnimator
.ofFloat(view, "rotationY", 0).setDuration(500); //$NON-NLS-1$
AnimatorSet set = new AnimatorSet();
set.playSequentially(r1, r2);
set.start();
}
private void hideHiddenView(final View view) {
ObjectAnimator r1 = ObjectAnimator
.ofFloat(mListView, "rotationY", 0f).setDuration(500); //$NON-NLS-1$
ObjectAnimator r2 = ObjectAnimator
.ofFloat(view, "rotationY", 90f).setDuration(500); //$NON-NLS-1$
AnimatorSet set = new AnimatorSet();
set.playSequentially(r2, r1);
set.addListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
mBackViewContainer.removeView(view);
}
});
set.start();
}
@Override
public boolean consumeMessage(Message msg) {
if (msg.getMessageType() == Message.USER_LOGIN_IN) {
prepareMenuItems();
}
// return false, so other UI might also be interested in this message.
return false;
}
/*
* (non-Javadoc)
*
* @see
* com.gmail.charleszq.picorner.ui.AbstractFragmentWithImageFetcher#onCreate
* (android.os.Bundle)
*/
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
MessageBus.addConsumer(this);
}
/*
* (non-Javadoc)
*
* @see
* com.gmail.charleszq.picorner.ui.AbstractFragmentWithImageFetcher#onDestroy
* ()
*/
@Override
public void onDestroy() {
MessageBus.removeConsumer(this);
super.onDestroy();
}
}