/*
* The MIT License (MIT)
*
* Copyright (c) 2014-2015 Umeng, Inc
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
package com.umeng.comm.ui.activities;
import android.content.Intent;
import android.graphics.Color;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.KeyEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewTreeObserver.OnGlobalFocusChangeListener;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.RelativeLayout;
import android.widget.TextView;
import android.widget.ToggleButton;
import com.umeng.comm.core.beans.BaseBean;
import com.umeng.comm.core.beans.CommConfig;
import com.umeng.comm.core.beans.CommUser;
import com.umeng.comm.core.beans.CommUser.Gender;
import com.umeng.comm.core.beans.CommUser.Permisson;
import com.umeng.comm.core.beans.FeedItem;
import com.umeng.comm.core.constants.Constants;
import com.umeng.comm.core.imageloader.ImgDisplayOption;
import com.umeng.comm.core.listeners.Listeners;
import com.umeng.comm.core.listeners.Listeners.LoginOnViewClickListener;
import com.umeng.comm.core.listeners.Listeners.OnResultListener;
import com.umeng.comm.core.sdkmanager.ImageLoaderManager;
import com.umeng.comm.core.utils.CommonUtils;
import com.umeng.comm.core.utils.DeviceUtils;
import com.umeng.comm.core.utils.ResFinder;
import com.umeng.comm.ui.anim.CustomAnimator;
import com.umeng.comm.ui.anim.UserInfoAnimator;
import com.umeng.comm.ui.dialogs.UserReportDialog;
import com.umeng.comm.ui.fragments.FansFragment;
import com.umeng.comm.ui.fragments.FollowedUserFragment;
import com.umeng.comm.ui.fragments.PostedFeedsFragment;
import com.umeng.comm.ui.fragments.PostedFeedsFragment.OnDeleteListener;
import com.umeng.comm.ui.mvpview.MvpUserInfoView;
import com.umeng.comm.ui.presenter.impl.UserInfoPresenter;
import com.umeng.comm.ui.utils.BroadcastUtils;
import com.umeng.comm.ui.utils.BroadcastUtils.BROADCAST_TYPE;
import com.umeng.comm.ui.utils.BroadcastUtils.DefalutReceiver;
import com.umeng.comm.ui.utils.ViewFinder;
import com.umeng.comm.ui.widgets.CommentEditText;
import com.umeng.comm.ui.widgets.CommentEditText.EditTextBackEventListener;
import com.umeng.comm.ui.widgets.RoundImageView;
/**
* 用户个人信息页面, 包含已发布的消息、已关注的话题、已关注的人三个fragment, 以及用户的头像、个人基本信息等.
*/
public final class UserInfoActivity extends BaseFragmentActivity implements OnClickListener,
MvpUserInfoView {
/**
* 已发送Feed的Fragment
*/
private PostedFeedsFragment mPostedFragment = null;
/**
* 关注的好友Fragment
*/
private FollowedUserFragment mFolloweredUserFragment;
/**
* 粉丝Fragment
*/
private FansFragment mFansFragment;
private TextView mUserNameTv;
private RoundImageView mHeaderImageView;
private ImageView mGenderImageView;
private ToggleButton mFollowToggleButton;
/** 该用户为传递进来的user,可能是好友、陌生人等身份 */
private CommUser mUser;
/**
* 已经发布的消息标签, 用于切换Fragment
*/
private TextView mPostedTv;
/**
* 已经发布的消息数量标签
*/
private TextView mPostedCountTv;
/**
* 已经关注的用户标签, 用于切换Fragment
*/
private TextView mFollowedUserTv;
/**
* 已经关注的用户数量标签
*/
private TextView mFollowedUserCountTv;
/**
* 我的粉丝标签, 用于切换Fragment
*/
private TextView mFansTextView;
/**
* 我的fans用户数量标签
*/
private TextView mFansCountTextView;
private CommentEditText mCommentEditText;
private View mCommentLayout;
private int mSelectedColor = Color.BLUE;
/**
* 相册TextView
*/
TextView mAlbumTextView;
/**
* 话题TextView
*/
TextView mTopicTextView;
/**
* 视图查找器,避免每次findViewById进行强转
*/
ViewFinder mViewFinder;
/**
* 用户信息的Presenter
*/
private UserInfoPresenter mPresenter;
private View mHeaderView;
private View mTitleView;
/**
* 举报用户的Dialog
*/
UserReportDialog mReportDialog;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(ResFinder.getLayout("umeng_comm_user_info_layout"));
mUser = getIntent().getExtras().getParcelable(Constants.TAG_USER);
if (mUser == null) {
return;
}
mPresenter = new UserInfoPresenter(this, this, mUser);
mPostedFragment = PostedFeedsFragment.newInstance(mUser);
mPostedFragment.setOnAnimationResultListener(mListener);
// 视图查找器
mViewFinder = new ViewFinder(getWindow().getDecorView());
mPostedFragment.setCurrentUser(mUser);
mPostedFragment.setOnDeleteListener(new OnDeleteListener() {
@Override
public void onDelete(BaseBean item) {
mPresenter.decreaseFeedCount(1);
}
});
// 初始化UI
initUIComponents();
mPresenter.onCreate(savedInstanceState);
// 设置用户信息View的显示内容
setupUserInfo(mUser);
initHeaderView();
BroadcastUtils.registerFeedBroadcast(getApplicationContext(), mReceiver);
}
private void initCommentView() {
mCommentEditText = mViewFinder.findViewById(ResFinder
.getId("umeng_comm_comment_edittext"));
mCommentLayout = findViewById(ResFinder.getId("umeng_comm_commnet_edit_layout"));
findViewById(ResFinder.getId("umeng_comm_comment_send_button")).setOnClickListener(this);
mCommentEditText.setEditTextBackListener(new EditTextBackEventListener() {
@Override
public boolean onClickBack() {
hideCommentLayout();
return true;
}
});
}
/**
* 隐藏评论布局</br>
*/
private void hideCommentLayout() {
mCommentLayout.setVisibility(View.GONE);
hideInputMethod(mCommentEditText);
}
@SuppressWarnings("deprecation")
private void initUIComponents() {
// 设置Fragment
addFragment(ResFinder.getId("umeng_comm_user_info_fragment_container"),
mPostedFragment);
// 选中的某个tab时的文字颜色
mSelectedColor = ResFinder.getColor("umeng_comm_text_topic_light_color");
// 初始化feed、好友、粉丝、back、设置的listener
findViewById(ResFinder.getId("umeng_comm_posted_layout")).setOnClickListener(this);
findViewById(ResFinder.getId("umeng_comm_follow_user_layout")).setOnClickListener(
this);
findViewById(ResFinder.getId("umeng_comm_my_fans_layout")).setOnClickListener(this);
findViewById(ResFinder.getId("umeng_comm_setting_back")).setOnClickListener(this);
// 举报用户的Dialog
mReportDialog = new UserReportDialog(this);
mReportDialog.setTargetUid(mUser.id);
Button settingButton = (Button) findViewById(ResFinder.getId("umeng_comm_save_bt"));
settingButton.setBackgroundDrawable(ResFinder.getDrawable("umeng_comm_more"));
RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams) settingButton
.getLayoutParams();
params.width = DeviceUtils.dp2px(this, 20);
params.height = DeviceUtils.dp2px(this, 20);
params.rightMargin = DeviceUtils.dp2px(getApplicationContext(), 10);
settingButton.setLayoutParams(params);
settingButton.setOnClickListener(new LoginOnViewClickListener() {
@Override
protected void doAfterLogin(View v) {
mReportDialog.show();
}
});
// 如果是用户自己,则不显示设置菜单按钮【目前菜单只有举报功能,即自己不能举报自己】
if (mUser.id.equals(CommConfig.getConfig().loginedUser.id)
|| mUser.permisson == Permisson.SUPPER_ADMIN) {
settingButton.setVisibility(View.GONE);
}
TextView titleTextView = mViewFinder.findViewById(ResFinder
.getId("umeng_comm_setting_title"));
titleTextView.setText(ResFinder.getString("umeng_comm_user_center"));
//
mPostedTv = mViewFinder.findViewById(ResFinder.getId("umeng_comm_posted_msg_tv"));
mPostedTv.setTextColor(mSelectedColor);
//
mPostedCountTv = mViewFinder.findViewById(ResFinder
.getId("umeng_comm_posted_count_tv"));
mPostedCountTv.setTextColor(mSelectedColor);
mFollowedUserTv = mViewFinder.findViewById(ResFinder.getId(
"umeng_comm_followed_user_tv"));
mFollowedUserCountTv = mViewFinder.findViewById(ResFinder.getId(
"umeng_comm_follow_user_count_tv"));
mFansTextView = mViewFinder.findViewById(ResFinder.getId("umeng_comm_my_fans_tv"));
mFansCountTextView = mViewFinder.findViewById(ResFinder.getId(
"umeng_comm_fans_count_tv"));
// 昵称
mUserNameTv = mViewFinder.findViewById(ResFinder.getId("umeng_comm_user_name_tv"));
mUserNameTv.setText(mUser.name);
mHeaderImageView = mViewFinder.findViewById(ResFinder.getId(
"umeng_comm_user_header"));
ImgDisplayOption option = ImgDisplayOption.getOptionByGender(mUser.gender);
mHeaderImageView.setImageUrl(mUser.iconUrl, option);
// 用户性别
mGenderImageView = mViewFinder.findViewById(ResFinder.getId("umeng_comm_user_gender"));
// 关注按钮
mFollowToggleButton = mViewFinder.findViewById(ResFinder.getId(
"umeng_comm_user_follow"));
mFollowToggleButton.setOnClickListener(new Listeners.LoginOnViewClickListener() {
@Override
protected void doAfterLogin(View v) {
mFollowToggleButton.setClickable(false);
// true为选中状态为已关注,此时显示文本为“取消关注”;false代表未关注,此时显示文本为“关注”
if (mFollowToggleButton.isChecked()) {
mPresenter.followUser(mResultListener);
} else {
mPresenter.cancelFollowUser(mResultListener);
}
}
});
mAlbumTextView = mViewFinder.findViewById(ResFinder.getId("umeng_comm_user_albums_tv"));
mAlbumTextView.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
jumpToActivityWithUid(AlbumActivity.class);
}
});
mTopicTextView = mViewFinder.findViewById(ResFinder.getId("umeng_comm_user_topic_tv"));
mTopicTextView.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
jumpToActivityWithUid(FollowedTopicActivity.class);
}
});
// 用户自己(在未登录的情况下,点击设置跳转到登录,此时传递进来的uid是空的情况),隐藏关注按钮,显示设置按钮
// // 如果是超级管理员且已经关注,则隐藏取消关注按钮
if (isHideFollowStatus()) {
mFollowToggleButton.setVisibility(View.GONE);
}
initCommentView();
}
private boolean isHideFollowStatus() {
if (TextUtils.isEmpty(mUser.id)) {
return true;
}
CommUser loginUser = CommConfig.getConfig().loginedUser;
if (mUser.id.equals(loginUser.id)) { // 如果是用户自己,则不显示关注/取消关注
return true;
}
// 如果是超级管理员且已经被关注,则显示关注/取消关注
if (mUser.permisson == Permisson.SUPPER_ADMIN && mUser.isFollowed) {
return true;
}
return false;
}
private void initHeaderView() {
mHeaderView = findViewById(ResFinder.getId("umeng_comm_portrait_layout"));
mHeaderView.getViewTreeObserver().addOnGlobalFocusChangeListener(mChangeListener);
mTitleView = findViewById(ResFinder.getId("umeng_comm_title_layout"));
}
private CustomAnimator mCustomAnimator = new UserInfoAnimator();
private OnResultListener mListener = new OnResultListener() {
@Override
public void onResult(int status) {
if (status == 1) {// dismiss
mCustomAnimator.startDismissAnimation(mHeaderView);
} else if (status == 0) { // show
mCustomAnimator.startShowAnimation(mHeaderView);
}
}
};
private OnGlobalFocusChangeListener mChangeListener = new OnGlobalFocusChangeListener() {
@Override
public void onGlobalFocusChanged(View oldFocus, View newFocus) {
int pos = mHeaderView.getHeight() - mHeaderView.getPaddingTop()
+ mTitleView.getHeight() / 2;
mCustomAnimator.setStartPosition(pos);
mHeaderView.getViewTreeObserver().removeOnGlobalFocusChangeListener(mChangeListener);
}
};
private void jumpToActivityWithUid(Class<?> activityClass) {
Intent intent = new Intent(getApplicationContext(), activityClass);
intent.putExtra(Constants.USER_ID_KEY, mUser.id);
startActivity(intent);
}
/**
* 避免对此点击,在回调中将状态设置为可点击状态~
*/
private OnResultListener mResultListener = new OnResultListener() {
@Override
public void onResult(int status) {
mFollowToggleButton.setClickable(true);
}
};
@Override
public void onClick(View v) {
int id = v.getId();
if (id == ResFinder.getId("umeng_comm_posted_layout")) {// 已发消息
if (mCurrentFragment instanceof PostedFeedsFragment) { // 已经处于当前页面,判断是否需要滚动到起始位置
mPostedFragment.executeScrollToTop();
} else {
showFragment(mPostedFragment);
}
} else if (id == ResFinder.getId("umeng_comm_follow_user_layout")) {// 关注用户
if (mFolloweredUserFragment == null) {
mFolloweredUserFragment = FollowedUserFragment.newInstance(mUser.id);
mFolloweredUserFragment.setOnAnimationResultListener(mListener);
mFolloweredUserFragment.setOnResultListener(mFollowListener);
}
if (mCurrentFragment instanceof FollowedUserFragment
&& !(mCurrentFragment instanceof FansFragment)) {
mFolloweredUserFragment.executeScrollTop();
} else {
showFragment(mFolloweredUserFragment);
}
} else if (id == ResFinder.getId("umeng_comm_my_fans_layout")) { // 我的粉丝
if (mFansFragment == null) {
mFansFragment = FansFragment.newFansFragment(mUser.id);
mFansFragment.setOnAnimationResultListener(mListener);
mFansFragment.setOnResultListener(mFansListener);
}
if (mCurrentFragment instanceof FansFragment) {
mFansFragment.executeScrollTop();
} else {
showFragment(mFansFragment);
}
} else if (id == ResFinder.getId("umeng_comm_setting_back")) { // 返回
this.finish();
}
changeSelectedText();
}
/**
* 设置用户相关的信息 </br>
*
* @param user
*/
public void setupUserInfo(CommUser user) {
if ( !user.id.equals(mUser.id)) {
return ;
}
mUser = user;
mUserNameTv.setText(user.name);
if (user.gender == Gender.MALE) {
mGenderImageView.setImageDrawable(ResFinder.getDrawable("umeng_comm_gender_male"));
} else if (user.gender == Gender.FEMALE) {
mGenderImageView.setImageDrawable(ResFinder.getDrawable("umeng_comm_gender_female"));
}
ImgDisplayOption option = ImgDisplayOption.getOptionByGender(mUser.gender);
// 设置用户头像
mHeaderImageView.setImageUrl(user.iconUrl, option);
ImageLoaderManager.getInstance().getCurrentSDK().resume();
if (isHideFollowStatus()) {
mFollowToggleButton.setVisibility(View.GONE);
} else {
mFollowToggleButton.setVisibility(View.VISIBLE);
mFollowToggleButton.setChecked(mUser.isFollowed);
}
}
/**
* 修改文本颜色 </br>
*/
private void changeSelectedText() {
if ((mCurrentFragment instanceof PostedFeedsFragment)) {
mFansCountTextView.setTextColor(Color.BLACK);
changeTextColor(mSelectedColor, Color.BLACK, Color.BLACK);
} else if ((mCurrentFragment instanceof FansFragment)) {
changeTextColor(Color.BLACK, Color.BLACK, mSelectedColor);
} else if ((mCurrentFragment instanceof FollowedUserFragment)) {
changeTextColor(Color.BLACK, mSelectedColor, Color.BLACK);
}
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK && mCommentLayout.isShown()) {
mCommentLayout.setVisibility(View.VISIBLE);
return true;
}
return super.onKeyDown(keyCode, event);
}
/**
* 设置文本颜色</br>
*
* @param postedColor 已发送feed文本颜色
* @param followColor 关注文本颜色
* @param fansColor 粉丝文本颜色
*/
private void changeTextColor(int postedColor, int followColor, int fansColor) {
mPostedTv.setTextColor(postedColor);
mPostedCountTv.setTextColor(postedColor);
mFollowedUserTv.setTextColor(followColor);
mFollowedUserCountTv.setTextColor(followColor);
mFansTextView.setTextColor(fansColor);
mFansCountTextView.setTextColor(fansColor);
}
/**
* 关注用户数的回调函数。在加载缓存或者下拉刷新时,可能需要更新显示的用户数字。
*/
private OnResultListener mFollowListener = new OnResultListener() {
@Override
public void onResult(final int status) {
if (mPresenter.isUpdateFollowUserCountTextView()) {
CommonUtils.runOnUIThread(UserInfoActivity.this, new Runnable() {
@Override
public void run() {
mFollowedUserCountTv.setText(String.valueOf(status));
}
});
}
}
};
/**
* 粉丝数的回调函数。在加载缓存或者下拉刷新时,可能需要更新显示的用户数字。
*/
private OnResultListener mFansListener = new OnResultListener() {
@Override
public void onResult(final int status) {
if (mPresenter.isUpdateFansCountTextView()) {
CommonUtils.runOnUIThread(UserInfoActivity.this, new Runnable() {
@Override
public void run() {
mFansCountTextView.setText(String.valueOf(status));
}
});
}
}
};
@Override
public void setToggleButtonStatus(boolean status) {
mFollowToggleButton.setChecked(status);
}
@Override
public void updateFansTextView(int count) {
mFansCountTextView.setText(String.valueOf(count));
}
@Override
public void updateFeedTextView(int count) {
mUser.feedCount = count;
mPostedCountTv.setText(String.valueOf(count));
}
@Override
public void updateFollowTextView(int count) {
mFollowedUserCountTv.setText(String.valueOf(count));
}
@Override
protected void onDestroy() {
mPresenter.onDestroy();
BroadcastUtils.unRegisterBroadcast(getApplicationContext(), mReceiver);
super.onDestroy();
}
/**
* 数据同步处理
*/
protected DefalutReceiver mReceiver = new DefalutReceiver() {
public void onReceiveFeed(Intent intent) {// 发送or删除时
FeedItem feedItem = getFeed(intent);
if (feedItem == null || !CommonUtils.isMyself(mUser)) {
return;
}
BROADCAST_TYPE type = getType(intent);
if (BROADCAST_TYPE.TYPE_FEED_POST == type) {
updateFeedTextView(++mUser.feedCount);
}
}
};
}