/**
*
*/
package com.gmail.charleszq.picorner.ui;
import android.app.Activity;
import android.app.ProgressDialog;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView;
import android.widget.Toast;
import com.github.yuyang226.j500px.users.User;
import com.gmail.charleszq.picorner.R;
import com.gmail.charleszq.picorner.SPUtil;
import com.gmail.charleszq.picorner.model.Author;
import com.gmail.charleszq.picorner.model.MediaSourceType;
import com.gmail.charleszq.picorner.task.AbstractContextAwareTask;
import com.gmail.charleszq.picorner.task.IGeneralTaskDoneListener;
import com.gmail.charleszq.picorner.task.ig.InstagramCheckRelationshipTask;
import com.gmail.charleszq.picorner.task.ig.InstagramFollowUserTask;
import com.gmail.charleszq.picorner.task.px500.PxFetchUserProfileTask;
import com.gmail.charleszq.picorner.task.px500.PxFollowUserTask;
import com.gmail.charleszq.picorner.ui.command.flickr.FlickrUserPhotosCommand;
import com.gmail.charleszq.picorner.ui.command.ig.InstagramUserPhotosCommand;
import com.gmail.charleszq.picorner.ui.command.px500.PxUserPhotosCommand;
import com.gmail.charleszq.picorner.utils.IConstants;
/**
* @author charles(charleszq@gmail.com)
*
*/
public class UserPhotoListFragment extends AbstractPhotoGridFragment {
/**
* The current user of the photos to be shown.
*/
private Author mCurrentUser;
/**
* the ordinal of <code>MediaSourceType</code>
*/
private int mMediaSourceType = 0;
/**
* The marker to show the follow menu item or not, when this fragment is
* attached on activity, we need to check the relationship with the photo
* owner, if it's instagram photo, we will show the menu item, and according
* the current relationship, we change the menu item title.
*/
private boolean mShowFollowMenuItem = false;
/**
* 0: not ready yet, we don't know the relaitonship now; <br/>
* 1: following <br/>
* 2: not following
*/
private int mFollowing = 0;
/**
* Constructor
*/
public UserPhotoListFragment() {
}
@Override
protected void loadFirstPage() {
if (mMediaSourceType == MediaSourceType.FLICKR.ordinal()) {
mCurrentCommand = new FlickrUserPhotosCommand(getActivity(),
mCurrentUser);
} else if (mMediaSourceType == MediaSourceType.INSTAGRAM.ordinal()) {
mCurrentCommand = new InstagramUserPhotosCommand(getActivity(),
mCurrentUser);
} else {
// 500px
mCurrentCommand = new PxUserPhotosCommand(getActivity(),
mCurrentUser);
}
mCurrentCommand.setCommndDoneListener(mCommandDoneListener);
mCurrentCommand.execute();
if (getActivity() != null) {
getActivity().getActionBar().setSubtitle(
mCurrentCommand.getDescription());
}
}
@Override
protected void initialIntentData(Intent intent) {
mMediaSourceType = intent.getIntExtra(
UserPhotoListActivity.MD_TYPE_KEY, 0);
mCurrentUser = (Author) intent
.getSerializableExtra(UserPhotoListActivity.USER_KEY);
}
@Override
protected String getLoadingMessage() {
return getString(R.string.msg_loading_more_photo_of_user);
}
@Override
protected void bindData() {
if (mCurrentUser != null && mLoadingMessageText != null) {
String s = String.format(mLoadingMessage,
mCurrentUser.getUserName());
mLoadingMessageText.setText(s);
if (mCurrentCommand != null) {
// configuraton change
mLoadingMessageText.setVisibility(View.GONE);
}
}
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setHasOptionsMenu(true);
}
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
inflater.inflate(R.menu.menu_ig_follow, menu);
inflater.inflate(R.menu.menu_flickr_user_photo_list, menu);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
if (item.getItemId() == R.id.menu_item_follow) {
final ProgressDialog dialog1 = ProgressDialog.show(getActivity(),
"", //$NON-NLS-1$
getString(R.string.msg_working));
dialog1.setCanceledOnTouchOutside(true);
IGeneralTaskDoneListener<Boolean> relationshipListener = new IGeneralTaskDoneListener<Boolean>() {
@Override
public void onTaskDone(Boolean result) {
if (dialog1 != null && dialog1.isShowing()) {
try {
dialog1.dismiss();
} catch (Exception e) {
}
}
if (result) {
mFollowing = mFollowing == 1 ? 2 : 1;
getActivity().invalidateOptionsMenu();
} else {
Toast.makeText(
getActivity(),
getString(R.string.msg_ig_chg_relationship_failed),
Toast.LENGTH_SHORT).show();
}
}
};
AbstractContextAwareTask<String, Integer, Boolean> followTask = null;
if (mMediaSourceType == MediaSourceType.INSTAGRAM.ordinal()) {
followTask = new InstagramFollowUserTask(getActivity());
} else if (mMediaSourceType == MediaSourceType.PX500.ordinal()) {
followTask = new PxFollowUserTask(getActivity());
}
if (followTask != null) {
followTask.addTaskDoneListener(relationshipListener);
followTask.execute(mCurrentUser.getUserId(),
mFollowing == 1 ? Boolean.FALSE.toString()
: Boolean.TRUE.toString());
}
return true;
}
// show flickr user's web site.
if (item.getItemId() == R.id.menu_item_f_user_website) {
String url = IConstants.FLICKR_WEB_SITE_URL
+ this.mCurrentUser.getUserId();
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
getActivity().startActivity(intent);
return true;
}
return super.onOptionsItemSelected(item);
}
@Override
public void onPrepareOptionsMenu(Menu menu) {
MenuItem item = menu.findItem(R.id.menu_item_follow);
if (!mShowFollowMenuItem) {
item.setVisible(false);
}
switch (mFollowing) {
case 0:
item.setEnabled(false);
break;
case 1:
item.setEnabled(true);
item.setTitle(getString(R.string.menu_item_ig_unfollow_user));
break;
case 2:
item.setEnabled(true);
item.setTitle(getString(R.string.menu_item_ig_follow_user));
break;
}
menu.setGroupVisible(R.id.group_f_u_photo_list,
this.mMediaSourceType == MediaSourceType.FLICKR.ordinal());
}
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
// now we have the user information, we need to check the relationship.
if (mMediaSourceType == MediaSourceType.INSTAGRAM.ordinal()) {
if (SPUtil.getInstagramUserId(getActivity()) == null) {
mShowFollowMenuItem = false;
getActivity().invalidateOptionsMenu();
} else {
mShowFollowMenuItem = true;
InstagramCheckRelationshipTask task = new InstagramCheckRelationshipTask(
getActivity());
task.addTaskDoneListener(new IGeneralTaskDoneListener<Boolean>() {
@Override
public void onTaskDone(Boolean result) {
mFollowing = result ? 1 : 2;
mShowFollowMenuItem = true;
if (getActivity() != null)
getActivity().invalidateOptionsMenu();
}
});
task.execute(mCurrentUser.getUserId());
}
} else if (mMediaSourceType == MediaSourceType.PX500.ordinal()) {
if (SPUtil.getPx500OauthToken(getActivity()) == null) {
mShowFollowMenuItem = false;
getActivity().invalidateOptionsMenu();
} else {
PxFetchUserProfileTask pxUserTask = new PxFetchUserProfileTask(
getActivity());
pxUserTask
.addTaskDoneListener(new IGeneralTaskDoneListener<User>() {
@Override
public void onTaskDone(User result) {
if (result != null) {
mFollowing = result.isFollowing() ? 1 : 2;
mShowFollowMenuItem = true;
if (getActivity() != null) {
getActivity().invalidateOptionsMenu();
}
}
}
});
pxUserTask.execute(mCurrentUser.getUserId());
}
}
}
@Override
public void onItemClick(AdapterView<?> parent, View view, int position,
long id) {
final Intent i = new Intent(getActivity(), ImageDetailActivity.class);
i.putExtra(ImageDetailActivity.DP_KEY, mPhotosProvider);
i.putExtra(ImageDetailActivity.LARGE_IMAGE_POSITION, position);
startActivity(i);
}
@Override
public void onResume() {
super.onResume();
if (mCurrentCommand != null) {
getActivity().getActionBar().setSubtitle(
mCurrentCommand.getDescription());
}
}
}