package org.qii.weiciyuan.ui.userinfo;
import org.qii.weiciyuan.R;
import org.qii.weiciyuan.bean.UserBean;
import org.qii.weiciyuan.bean.android.AsyncTaskLoaderResult;
import org.qii.weiciyuan.dao.group.ModifyGroupMemberDao;
import org.qii.weiciyuan.dao.relationship.FanDao;
import org.qii.weiciyuan.dao.relationship.FriendshipsDao;
import org.qii.weiciyuan.dao.show.ShowUserDao;
import org.qii.weiciyuan.dao.user.RemarkDao;
import org.qii.weiciyuan.support.database.FilterDBTask;
import org.qii.weiciyuan.support.debug.AppLogger;
import org.qii.weiciyuan.support.error.ErrorCode;
import org.qii.weiciyuan.support.error.WeiboException;
import org.qii.weiciyuan.support.lib.MyAsyncTask;
import org.qii.weiciyuan.support.utils.AnimationUtility;
import org.qii.weiciyuan.support.utils.GlobalContext;
import org.qii.weiciyuan.support.utils.ThemeUtility;
import org.qii.weiciyuan.support.utils.Utility;
import org.qii.weiciyuan.ui.common.CommonErrorDialogFragment;
import org.qii.weiciyuan.ui.common.CommonProgressDialogFragment;
import org.qii.weiciyuan.ui.interfaces.AbstractAppActivity;
import org.qii.weiciyuan.ui.loader.AbstractAsyncNetRequestTaskLoader;
import org.qii.weiciyuan.ui.main.MainTimeLineActivity;
import org.qii.weiciyuan.ui.send.WriteWeiboActivity;
import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.nfc.NdefMessage;
import android.nfc.NfcAdapter;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.os.Parcelable;
import android.support.v4.app.LoaderManager;
import android.support.v4.content.Loader;
import android.text.TextUtils;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.Toast;
import java.util.List;
/**
* User: Jiang Qi
* Date: 12-8-14
*/
public class UserInfoActivity extends AbstractAppActivity {
private static final int REFRESH_LOADER_ID = 0;
private String token;
private UserBean bean;
private MyAsyncTask<Void, UserBean, UserBean> followOrUnfollowTask;
private ModifyGroupMemberTask modifyGroupMemberTask;
public String getToken() {
if (TextUtils.isEmpty(token)) {
token = GlobalContext.getInstance().getSpecialToken();
}
return token;
}
public UserBean getUser() {
return bean;
}
public void setUser(UserBean bean) {
this.bean = bean;
}
@Override
protected void onPause() {
super.onPause();
}
@Override
protected void onDestroy() {
super.onDestroy();
Utility.cancelTasks(followOrUnfollowTask, modifyGroupMemberTask);
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
initLayout();
token = getIntent().getStringExtra("token");
bean = getIntent().getParcelableExtra("user");
if (bean == null) {
String id = getIntent().getStringExtra("id");
if (!TextUtils.isEmpty(id)) {
bean = new UserBean();
bean.setId(id);
} else {
String domain = getIntent().getStringExtra("domain");
if (!TextUtils.isEmpty(domain)) {
bean = new UserBean();
bean.setDomain(domain);
} else {
Uri data = getIntent().getData();
if (data != null) {
String d = data.toString();
int index = d.lastIndexOf("@");
String newValue = d.substring(index + 1);
bean = new UserBean();
bean.setScreen_name(newValue);
} else if (NfcAdapter.ACTION_NDEF_DISCOVERED.equals(getIntent().getAction())) {
processIntent(getIntent());
}
}
}
fetchUserInfoFromServer();
findViewById(android.R.id.content).setBackgroundDrawable(
ThemeUtility.getDrawable(android.R.attr.windowBackground));
} else {
findViewById(android.R.id.content).setBackgroundDrawable(
ThemeUtility.getDrawable(android.R.attr.windowBackground));
buildContent();
}
if (isMyselfProfile()) {
if (getClass() == MyInfoActivity.class) {
return;
}
Intent intent = new Intent(this, MyInfoActivity.class);
intent.putExtra("token", getToken());
UserBean userBean = new UserBean();
userBean.setId(GlobalContext.getInstance().getCurrentAccountId());
intent.putExtra("user", bean);
intent.putExtra("account", GlobalContext.getInstance().getAccountBean());
startActivity(intent);
finish();
}
}
private boolean isMyselfProfile() {
boolean screenNameEqualCurrentAccount = bean.getScreen_name() != null
&& bean.getScreen_name()
.equals(GlobalContext.getInstance().getCurrentAccountName());
boolean idEqualCurrentAccount = bean.getId() != null && bean.getId()
.equals(GlobalContext.getInstance().getCurrentAccountId());
return screenNameEqualCurrentAccount || idEqualCurrentAccount;
}
private void fetchUserInfoFromServer() {
getActionBar().setDisplayHomeAsUpEnabled(true);
getActionBar().setDisplayShowHomeEnabled(false);
String title = bean.getScreen_name();
if (TextUtils.isEmpty(title)) {
title = bean.getDomain();
}
if (TextUtils.isEmpty(title)) {
title = bean.getId();
}
getActionBar().setTitle(title);
CommonProgressDialogFragment dialog = CommonProgressDialogFragment
.newInstance(getString(R.string.fetching_user_info));
getSupportFragmentManager().beginTransaction()
.add(dialog, CommonProgressDialogFragment.class.getName()).commit();
getSupportLoaderManager().initLoader(REFRESH_LOADER_ID, null, refreshCallback);
}
private void initLayout() {
getWindow().setBackgroundDrawable(getResources().getDrawable(R.color.transparent));
getActionBar().setDisplayHomeAsUpEnabled(true);
getActionBar().setDisplayShowHomeEnabled(false);
getActionBar().setTitle(getString(R.string.personal_info));
}
private void buildContent() {
//if you open this activity with user id, must set title with nickname again
getActionBar().setTitle(bean.getScreen_name());
new Handler(Looper.getMainLooper()).post(new Runnable() {
@Override
public void run() {
if (getSupportFragmentManager()
.findFragmentByTag(UserInfoFragment.class.getName()) == null) {
UserInfoFragment userInfoFragment = UserInfoFragment
.newInstance(getUser(),
getToken());
getSupportFragmentManager().beginTransaction()
.replace(android.R.id.content,
userInfoFragment,
UserInfoFragment.class.getName())
.commit();
getSupportFragmentManager().executePendingTransactions();
AnimationUtility
.translateFragmentY(userInfoFragment, -400, 0, userInfoFragment);
}
}
});
}
private void processIntent(Intent intent) {
Parcelable[] rawMsgs = intent.getParcelableArrayExtra(
NfcAdapter.EXTRA_NDEF_MESSAGES);
// only one message sent during the beam
NdefMessage msg = (NdefMessage) rawMsgs[0];
Toast.makeText(this, new String(msg.getRecords()[0].getPayload()), Toast.LENGTH_SHORT)
.show();
bean = new UserBean();
bean.setScreen_name(new String(msg.getRecords()[0].getPayload()));
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
if (isMyselfProfile()) {
getMenuInflater().inflate(R.menu.actionbar_menu_myinfoactivity, menu);
MenuItem edit = menu.findItem(R.id.menu_edit);
edit.setVisible(GlobalContext.getInstance().getAccountBean().isBlack_magic());
} else {
getMenuInflater().inflate(R.menu.actionbar_menu_infofragment, menu);
if (bean.isFollowing()) {
menu.findItem(R.id.menu_follow).setVisible(false);
menu.findItem(R.id.menu_unfollow).setVisible(true);
menu.findItem(R.id.menu_manage_group).setVisible(true);
} else {
menu.findItem(R.id.menu_follow).setVisible(true);
menu.findItem(R.id.menu_unfollow).setVisible(false);
menu.findItem(R.id.menu_manage_group).setVisible(false);
}
if (!bean.isFollowing() && bean.isFollow_me()) {
menu.findItem(R.id.menu_remove_fan).setVisible(true);
} else {
menu.findItem(R.id.menu_remove_fan).setVisible(false);
}
}
return super.onCreateOptionsMenu(menu);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
Intent intent;
switch (item.getItemId()) {
case android.R.id.home:
intent = MainTimeLineActivity.newIntent();
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
return true;
case R.id.menu_edit:
intent = new Intent(this, EditMyProfileActivity.class);
intent.putExtra("userBean", GlobalContext.getInstance().getAccountBean().getInfo());
startActivity(intent);
return true;
case R.id.menu_at:
intent = new Intent(this, WriteWeiboActivity.class);
intent.putExtra("token", getToken());
intent.putExtra("content", "@" + bean.getScreen_name());
intent.putExtra("account", GlobalContext.getInstance().getAccountBean());
startActivity(intent);
break;
case R.id.menu_modify_remark:
UpdateRemarkDialog dialog = new UpdateRemarkDialog();
dialog.show(getFragmentManager(), "");
break;
case R.id.menu_follow:
if (followOrUnfollowTask == null
|| followOrUnfollowTask.getStatus() == MyAsyncTask.Status.FINISHED) {
followOrUnfollowTask = new FollowTask();
followOrUnfollowTask.execute();
}
break;
case R.id.menu_unfollow:
if (followOrUnfollowTask == null
|| followOrUnfollowTask.getStatus() == MyAsyncTask.Status.FINISHED) {
followOrUnfollowTask = new UnFollowTask();
followOrUnfollowTask.execute();
}
break;
case R.id.menu_remove_fan:
if (followOrUnfollowTask == null
|| followOrUnfollowTask.getStatus() == MyAsyncTask.Status.FINISHED) {
followOrUnfollowTask = new RemoveFanTask();
followOrUnfollowTask.execute();
}
break;
case R.id.menu_add_to_app_filter:
if (!TextUtils.isEmpty(bean.getScreen_name())) {
FilterDBTask.addFilterKeyword(FilterDBTask.TYPE_USER, bean.getScreen_name());
Toast.makeText(this, getString(R.string.filter_successfully),
Toast.LENGTH_SHORT).show();
}
break;
case R.id.menu_manage_group:
manageGroup();
break;
}
return false;
}
public void updateRemark(String remark) {
new UpdateRemarkTask(remark).executeOnExecutor(MyAsyncTask.THREAD_POOL_EXECUTOR);
}
private UserInfoFragment getInfoFragment() {
return ((UserInfoFragment) getSupportFragmentManager().findFragmentByTag(
UserInfoFragment.class.getName()));
}
private void manageGroup() {
ManageGroupDialog dialog = new ManageGroupDialog(GlobalContext.getInstance().getGroup(),
bean.getId());
dialog.show(getSupportFragmentManager(), "");
}
public void handleGroup(List<String> add, List<String> remove) {
if (Utility.isTaskStopped(modifyGroupMemberTask)) {
modifyGroupMemberTask = new ModifyGroupMemberTask(add, remove);
modifyGroupMemberTask.executeOnExecutor(MyAsyncTask.THREAD_POOL_EXECUTOR);
}
}
private class ModifyGroupMemberTask extends MyAsyncTask<Void, Void, Void> {
List<String> add;
List<String> remove;
public ModifyGroupMemberTask(List<String> add, List<String> remove) {
this.add = add;
this.remove = remove;
}
@Override
protected Void doInBackground(Void... params) {
ModifyGroupMemberDao dao = new ModifyGroupMemberDao(token, bean.getId());
for (String id : add) {
try {
dao.add(id);
} catch (WeiboException e) {
AppLogger.e(e.getMessage());
cancel(true);
}
}
for (String id : remove) {
try {
dao.delete(id);
} catch (WeiboException e) {
AppLogger.e(e.getMessage());
cancel(true);
}
}
return null;
}
@Override
protected void onPostExecute(Void aVoid) {
super.onPostExecute(aVoid);
Toast.makeText(UserInfoActivity.this, getString(R.string.modify_successfully),
Toast.LENGTH_SHORT).show();
}
}
private class UnFollowTask extends MyAsyncTask<Void, UserBean, UserBean> {
WeiboException e;
@Override
protected void onPreExecute() {
super.onPreExecute();
}
@Override
protected UserBean doInBackground(Void... params) {
FriendshipsDao dao = new FriendshipsDao(getToken());
if (!TextUtils.isEmpty(bean.getId())) {
dao.setUid(bean.getId());
} else {
dao.setScreen_name(bean.getScreen_name());
}
try {
return dao.unFollowIt();
} catch (WeiboException e) {
AppLogger.e(e.getError());
this.e = e;
cancel(true);
return null;
}
}
@Override
protected void onCancelled(UserBean userBean) {
super.onCancelled(userBean);
}
@Override
protected void onPostExecute(UserBean o) {
super.onPostExecute(o);
Toast.makeText(UserInfoActivity.this, getString(R.string.unfollow_successfully),
Toast.LENGTH_SHORT).show();
bean = o;
bean.setFollowing(false);
invalidateOptionsMenu();
}
}
private class FollowTask extends MyAsyncTask<Void, UserBean, UserBean> {
WeiboException e;
@Override
protected void onPreExecute() {
super.onPreExecute();
}
@Override
protected UserBean doInBackground(Void... params) {
FriendshipsDao dao = new FriendshipsDao(getToken());
if (!TextUtils.isEmpty(bean.getId())) {
dao.setUid(bean.getId());
} else {
dao.setScreen_name(bean.getScreen_name());
}
try {
return dao.followIt();
} catch (WeiboException e) {
AppLogger.e(e.getError());
this.e = e;
cancel(true);
return null;
}
}
@Override
protected void onCancelled(UserBean userBean) {
super.onCancelled(userBean);
if (e != null) {
Toast.makeText(UserInfoActivity.this, e.getMessage(), Toast.LENGTH_SHORT).show();
switch (e.getError_code()) {
case ErrorCode.ALREADY_FOLLOWED:
break;
}
}
}
@Override
protected void onPostExecute(UserBean o) {
super.onPostExecute(o);
Toast.makeText(UserInfoActivity.this, getString(R.string.follow_successfully),
Toast.LENGTH_SHORT).show();
bean = o;
bean.setFollowing(true);
invalidateOptionsMenu();
manageGroup();
}
}
private class RemoveFanTask extends MyAsyncTask<Void, UserBean, UserBean> {
WeiboException e;
@Override
protected void onPreExecute() {
super.onPreExecute();
}
@Override
protected UserBean doInBackground(Void... params) {
FanDao dao = new FanDao(getToken(), bean.getId());
try {
return dao.removeFan();
} catch (WeiboException e) {
AppLogger.e(e.getError());
this.e = e;
cancel(true);
return null;
}
}
@Override
protected void onCancelled(UserBean userBean) {
super.onCancelled(userBean);
if (e != null) {
Toast.makeText(UserInfoActivity.this, e.getMessage(), Toast.LENGTH_SHORT).show();
}
}
@Override
protected void onPostExecute(UserBean o) {
super.onPostExecute(o);
Toast.makeText(UserInfoActivity.this, getString(R.string.remove_fan_successfully),
Toast.LENGTH_SHORT).show();
bean = o;
getInfoFragment().forceReloadData(o);
}
}
class UpdateRemarkTask extends MyAsyncTask<Void, UserBean, UserBean> {
WeiboException e;
String remark;
UpdateRemarkTask(String remark) {
this.remark = remark;
}
@Override
protected UserBean doInBackground(Void... params) {
try {
return new RemarkDao(getToken(), bean.getId(), remark).updateRemark();
} catch (WeiboException e) {
this.e = e;
cancel(true);
}
return null;
}
@Override
protected void onCancelled(UserBean userBean) {
super.onCancelled(userBean);
if (this.e != null) {
Toast.makeText(UserInfoActivity.this, this.e.getError(), Toast.LENGTH_SHORT).show();
}
}
@Override
protected void onPostExecute(UserBean userBean) {
super.onPostExecute(userBean);
bean = userBean;
if (getInfoFragment() != null) {
getInfoFragment().forceReloadData(userBean);
}
}
}
private static class RefreshLoader extends AbstractAsyncNetRequestTaskLoader<UserBean> {
private UserBean bean;
public RefreshLoader(Context context, UserBean userBean) {
super(context);
this.bean = userBean;
}
@Override
protected UserBean loadData() throws WeiboException {
ShowUserDao dao = new ShowUserDao(GlobalContext.getInstance().getSpecialToken());
boolean haveId = !TextUtils.isEmpty(bean.getId());
boolean haveName = !TextUtils.isEmpty(bean.getScreen_name());
boolean haveDomain = !TextUtils.isEmpty(bean.getDomain());
if (haveId) {
dao.setUid(bean.getId());
} else if (haveName) {
dao.setScreen_name(bean.getScreen_name());
} else if (haveDomain) {
dao.setDomain(bean.getDomain());
} else {
return null;
}
return dao.getUserInfo();
}
}
private LoaderManager.LoaderCallbacks<AsyncTaskLoaderResult<UserBean>> refreshCallback
= new LoaderManager.LoaderCallbacks<AsyncTaskLoaderResult<UserBean>>() {
@Override
public Loader<AsyncTaskLoaderResult<UserBean>> onCreateLoader(int id, Bundle args) {
return new RefreshLoader(UserInfoActivity.this, bean);
}
@Override
public void onLoadFinished(Loader<AsyncTaskLoaderResult<UserBean>> loader,
AsyncTaskLoaderResult<UserBean> result) {
UserBean data = result != null ? result.data : null;
final WeiboException exception = result != null ? result.exception : null;
new Handler(Looper.getMainLooper()).post(new Runnable() {
@Override
public void run() {
CommonProgressDialogFragment dialog
= (CommonProgressDialogFragment) getSupportFragmentManager()
.findFragmentByTag(CommonProgressDialogFragment.class.getName());
if (dialog != null) {
dialog.dismissAllowingStateLoss();
}
if (exception != null) {
CommonErrorDialogFragment userInfoActivityErrorDialog
= CommonErrorDialogFragment.newInstance(exception.getError());
getSupportFragmentManager().beginTransaction()
.add(userInfoActivityErrorDialog,
CommonErrorDialogFragment.class.getName()).commit();
}
}
});
if (data != null) {
bean = data;
buildContent();
}
getLoaderManager().destroyLoader(loader.getId());
}
@Override
public void onLoaderReset(Loader<AsyncTaskLoaderResult<UserBean>> loader) {
}
};
}