package licola.demo.com.huabandemo.Module.User;
import android.app.Activity;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.Color;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.support.design.widget.AppBarLayout;
import android.support.design.widget.CollapsingToolbarLayout;
import android.support.design.widget.FloatingActionButton;
import android.support.design.widget.TabLayout;
import android.support.v4.view.ViewPager;
import android.support.v7.widget.Toolbar;
import android.text.TextUtils;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.LinearLayout;
import android.widget.TextView;
import com.facebook.common.references.CloseableReference;
import com.facebook.datasource.DataSource;
import com.facebook.drawee.view.SimpleDraweeView;
import com.facebook.imagepipeline.datasource.BaseBitmapDataSubscriber;
import com.facebook.imagepipeline.image.CloseableImage;
import com.jakewharton.rxbinding.view.RxView;
import java.util.ArrayList;
import java.util.concurrent.TimeUnit;
import butterknife.BindColor;
import butterknife.BindString;
import butterknife.BindView;
import licola.demo.com.huabandemo.API.Dialog.OnAddDialogInteractionListener;
import licola.demo.com.huabandemo.API.Fragment.OnBoardFragmentInteractionListener;
import licola.demo.com.huabandemo.API.Fragment.OnPinsFragmentInteractionListener;
import licola.demo.com.huabandemo.API.HttpsAPI.OperateAPI;
import licola.demo.com.huabandemo.API.HttpsAPI.UserAPI;
import licola.demo.com.huabandemo.Base.BaseRecyclerHeadFragment;
import licola.demo.com.huabandemo.Base.BaseSwipeViewPagerActivity;
import licola.demo.com.huabandemo.Entity.BoardListInfoBean;
import licola.demo.com.huabandemo.Entity.PinsMainEntity;
import licola.demo.com.huabandemo.HttpUtils.ImageLoad.ImageLoadBuilder;
import licola.demo.com.huabandemo.HttpUtils.ImageLoad.ImageLoadFresco;
import licola.demo.com.huabandemo.HttpUtils.RetrofitClient;
import licola.demo.com.huabandemo.Module.BoardDetail.BoardDetailActivity;
import licola.demo.com.huabandemo.Module.ImageDetail.ImageDetailActivity;
import licola.demo.com.huabandemo.Module.Login.UserMeAndOtherBean;
import licola.demo.com.huabandemo.R;
import licola.demo.com.huabandemo.Util.CompatUtils;
import licola.demo.com.huabandemo.Util.Constant;
import licola.demo.com.huabandemo.Util.FastBlurUtil;
import licola.demo.com.huabandemo.Util.Logger;
import licola.demo.com.huabandemo.Util.SPUtils;
import licola.demo.com.huabandemo.Util.Utils;
import licola.demo.com.huabandemo.Widget.MyDialog.BoardAddDialogFragment;
import rx.Subscriber;
import rx.Subscription;
import rx.android.schedulers.AndroidSchedulers;
import rx.functions.Action1;
import rx.schedulers.Schedulers;
/**
* 用户界面 我和其他的用户界面用公用
* 区别 在toolbar不同功能
* 在于每个Fragment中的的Adapter中的item项目操作不同
*/
public class UserActivity
extends BaseSwipeViewPagerActivity<BaseRecyclerHeadFragment>
implements OnBoardFragmentInteractionListener<UserBoardItemBean>,
OnPinsFragmentInteractionListener, OnAddDialogInteractionListener {
private static final String TYPE_KEY = "TYPE_KEY";
private static final String TYPE_TITLE = "TYPE_TITLE";
@BindColor(R.color.white)
int mColorTabIndicator;
@BindString(R.string.url_image_small)
String mFormatUrlSmall;
@BindString(R.string.httpRoot)
String mHttpRoot;
@BindString(R.string.text_fans_attention)
String mFansFollowingFormat;
@BindView(R.id.toolbar_user)
Toolbar mToolbar;
@BindView(R.id.app_bar)
AppBarLayout mAppBar;
@BindView(R.id.collapsingtoolbar_user)
CollapsingToolbarLayout mCollapsingToolbar;
@BindView(R.id.linearlayout_user_info)
LinearLayout mLayoutUser;
@BindView(R.id.img_image_user)
SimpleDraweeView mImageUser;
@BindView(R.id.tv_user_name)
TextView mTvUserName;
@BindView(R.id.tv_user_location_job)
TextView mTvUserLocationJob;
@BindView(R.id.tv_user_friend)
TextView mTvUserFriend;
@BindView(R.id.tablayout_user)
TabLayout mTabLayout;
@BindView(R.id.fab_operate)
FloatingActionButton mFabOperate;
public String mKey;
public String mTitle;
public boolean isMe;
public boolean isFollow;
@Override
protected int getLayoutId() {
return R.layout.activity_user;
}
public static void launch(Activity activity, String key, String title) {
Intent intent = new Intent(activity, UserActivity.class);
intent.putExtra(TYPE_TITLE, title);
intent.putExtra(TYPE_KEY, key);
activity.startActivity(intent);
}
@Override
protected String getTAG() {
return this.toString();
}
@Override
protected String[] getTitleList() {
return getResources().getStringArray(R.array.title_user_info);
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setSupportActionBar(mToolbar);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
mCollapsingToolbar.setExpandedTitleColor(Color.TRANSPARENT);//设置打开时的文字颜色
//// TODO: 2016/5/29 0029
if (isMe) {
addSubscription(getMyBoardListInfo());
}
initView();
}
private void initView() {
mTvUserFriend.setCompoundDrawablesWithIntrinsicBounds(
null,
null,
CompatUtils.getTintDrawable(mContext,R.drawable.ic_chevron_right_white_24dp,Color.WHITE),
null);
}
@Override
protected void initResAndListener() {
super.initResAndListener();
RxView.clicks(mFabOperate)
.throttleFirst(Constant.throttDuration, TimeUnit.MILLISECONDS)//防止抖动处理
.subscribe(new Action1<Void>() {
@Override
public void call(Void aVoid) {
startOperate();
}
});
mAppBar.addOnOffsetChangedListener(new AppBarLayout.OnOffsetChangedListener() {
@Override
public void onOffsetChanged(AppBarLayout appBarLayout, int verticalOffset) {
// Logger.d("verticalOffset=" + verticalOffset + " getTotalScrollRange=" + appBarLayout.getTotalScrollRange());
final float size = -verticalOffset;
final float total = appBarLayout.getTotalScrollRange();
double per = 1.0f - (size / total);
// Logger.d("per" + per);
mLayoutUser.setAlpha((float) per);
}
});
}
private void startOperate() {
if (isMe) {
Logger.d("is me add broad");
showAddBoardDialog();
} else {
Logger.d("httpFollowUser");
httpFollowUser();
}
}
private void showAddBoardDialog() {
BoardAddDialogFragment fragment = BoardAddDialogFragment.create();
fragment.setListener(this);//注入已经实现接口的 自己
fragment.show(getSupportFragmentManager(), null);
}
private void httpFollowUser() {
String operate = isFollow ? Constant.OPERATEUNFOLLOW : Constant.OPERATEFOLLOW;
RetrofitClient.createService(OperateAPI.class)
.httpsFollowUserOperate(mAuthorization, mKey, operate)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Subscriber<FollowUserOperateBean>() {
@Override
public void onCompleted() {
Logger.d();
int res = isFollow ? R.drawable.ic_done_black_24dp : R.drawable.ic_loyalty_black_24dp;
setFabDrawableAnimator(res, mFabOperate);
// TODO: 2016/5/29 0029 如果当前正在显示画板Fragment 需要刷新操作
}
@Override
public void onError(Throwable e) {
Logger.d(e.toString());
checkException(e, mAppBar);
setFabDrawableAnimator(R.drawable.ic_report_black_24dp, mFabOperate);
}
@Override
public void onNext(FollowUserOperateBean followUserOperateBean) {
Logger.d();
isFollow = !isFollow;
}
});
}
/**
* 配置fab的drawable 和动画显示
*
* @param resId
* @param mFabActionBtn
*/
private void setFabDrawableAnimator(int resId, FloatingActionButton mFabActionBtn) {
mFabActionBtn.hide(new FloatingActionButton.OnVisibilityChangedListener() {
@Override
public void onHidden(FloatingActionButton fab) {
super.onHidden(fab);
Logger.d("onHidden");
fab.setImageResource(resId);
fab.show();
mSwipeRefresh.setRefreshing(true);
mListenerRefresh.getHttpRefresh();
// NetUtils.showSnackBar(mFabOperate,"关注用户成功");
}
});
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
super.onCreateOptionsMenu(menu);
getMenuInflater().inflate(isMe ? R.menu.menu_user_me : R.menu.menu_user, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
int id = item.getItemId();
switch (id) {
case R.id.action_follow:
httpFollowUser();
break;
case R.id.action_user_setting:
//// TODO: 2016/5/29 0029 用户设置相关跳转
Logger.d("action_user_setting");
break;
}
// boolean Return false to allow normal menu processing to
// proceed, true to consume it here.
// false:允许继续事件传递 true:就自己消耗事件 不再传递
return true;
}
@Override
protected ArrayList<BaseRecyclerHeadFragment> initFragmentList() {
ArrayList<BaseRecyclerHeadFragment> fragments = new ArrayList<>(3);
fragments.add(UserBoardFragment.newInstance(mKey));
fragments.add(UserPinsFragment.newInstance(mKey));
fragments.add(UserLikeFragment.newInstance(mKey));
return fragments;
}
@Override
protected void setupTabLayoutWithViewPager(ViewPager mViewPager) {
mTabLayout.setupWithViewPager(mViewPager);
mTabLayout.setSelectedTabIndicatorColor(mColorTabIndicator);
}
@Override
protected void getNecessaryData() {
super.getNecessaryData();
mTitle = getIntent().getStringExtra(TYPE_TITLE);
mKey = getIntent().getStringExtra(TYPE_KEY);
String userId = (String) SPUtils.get(mContext, Constant.USERID, "");
Logger.d("is me " + mKey.equals(userId));
isMe = mKey.equals(userId);
}
@Override
protected void onResume() {
super.onResume();
addSubscription(getHttpsUserInfo());
}
//获取我的画板字段 没有UI效果
private Subscription getMyBoardListInfo() {
return RetrofitClient.createService(UserAPI.class)
.httpsBoardListInfo(mAuthorization, Constant.OPERATEBOARDEXTRA)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Subscriber<BoardListInfoBean>() {
@Override
public void onCompleted() {
Logger.d();
}
@Override
public void onError(Throwable e) {
Logger.d(e.toString());
}
@Override
public void onNext(BoardListInfoBean boardListInfoBean) {
Logger.d(boardListInfoBean.getBoards().size() + " ");
}
});
}
//联网获取用户信息
private Subscription getHttpsUserInfo() {
return RetrofitClient.createService(UserAPI.class)
.httpsUserInfoRx(mAuthorization, mKey)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Subscriber<UserMeAndOtherBean>() {
@Override
public void onCompleted() {
Logger.d();
}
@Override
public void onError(Throwable e) {
Logger.d(e.toString());
}
@Override
public void onNext(UserMeAndOtherBean userInfoBean) {
setUserHeadAndBackGround(userInfoBean);//设置用户头像和 模糊背景
setUserTextInfo(userInfoBean);//设置用户文字信息
setUserFollow(userInfoBean);
}
});
}
@Override
protected void ViewPagerPageSelected(int position) {
// Logger.d("position=" + position + " view=" + mFabOperate.getVisibility() + " Y=" + mFabOperate.getTranslationY());
if (position != 0) {
//如果不在第一版面 重置第一页影响的Y值 然后隐藏
mFabOperate.setTranslationY(0);
if (mFabOperate.getVisibility() != View.GONE) {
mFabOperate.hide();
}
} else {
//如果回带第一版面 显示
if (mFabOperate.getVisibility() != View.VISIBLE) {
mFabOperate.show();
}
}
}
/**
* 设置网络返回数据 主要判断是否已经关注过
*
* @param bean
*/
private void setUserFollow(UserMeAndOtherBean bean) {
isFollow = bean.getFollowing() == 1;
//网络返回成功后 如果是我显示添加 否则根据关注状态 显示
mFabOperate.setImageResource(
isMe ? R.drawable.ic_add_black_24dp :
(isFollow ? R.drawable.ic_done_black_24dp : R.drawable.ic_loyalty_black_24dp));
mFabOperate.show();
}
private void setUserTextInfo(UserMeAndOtherBean bean) {
String name = bean.getUsername();
if (!TextUtils.isEmpty(name)) {
mTvUserName.setText(name);
} else {
mTvUserName.setText("用户名为空");
}
String location = bean.getProfile().getLocation();
String job = bean.getProfile().getJob();
StringBuffer buffer = new StringBuffer();
if (!TextUtils.isEmpty(location)) {
buffer.append(location);
buffer.append(" ");
}
if (!TextUtils.isEmpty(job)) {
buffer.append(job);
}
if (!TextUtils.isEmpty(buffer)) {
mTvUserLocationJob.setText(buffer);
}
mTvUserFriend.setText(String.format(mFansFollowingFormat, bean.getFollower_count(), bean.getFollowing_count()));
}
private void setUserHeadAndBackGround(UserMeAndOtherBean bean) {
String url = bean.getAvatar();
if (!TextUtils.isEmpty(url)) {
if (!url.contains(mHttpRoot)) {
url = String.format(mFormatUrlSmall, url);
}
ImageLoadBuilder.Start(getApplicationContext(), mImageUser, url)
.setPlaceHolderImage(CompatUtils.getTintDrawable(mContext,R.drawable.ic_account_circle_white_48dp,Color.WHITE))
.setIsCircle(true, true)
.setBitmapDataSubscriber(new BaseBitmapDataSubscriber() {
@Override
protected void onNewResultImpl(Bitmap bitmap) {
//得到缓存中的Bitmap对象 这里可以进行操作
//构造Drawable对象 模糊化设置给View控件
Logger.d("onNewResultImpl = " + Thread.currentThread().toString());
if (bitmap == null) {
Logger.d("bitmap is null");
} else {
Logger.d("bitmap is not null");
Drawable backDrawable = new BitmapDrawable(getResources(), FastBlurUtil.doBlur(bitmap, 25, false));
if (Utils.checkUiThreadBoolean()) {
mAppBar.setBackground(backDrawable);
} else {
mAppBar.post(new Runnable() {
@Override
public void run() {
mAppBar.setBackground(backDrawable);
}
});
}
}
}
@Override
protected void onFailureImpl(DataSource<CloseableReference<CloseableImage>> dataSource) {
Logger.d("onFailureImpl");
}
})
.build();
}
}
@Override
public void onClickBoardItemImage(UserBoardItemBean bean, View view) {
String boardId = String.valueOf(bean.getBoard_id());
BoardDetailActivity.launch(this, boardId, bean.getTitle());
}
@Override
public void onClickPinsItemImage(PinsMainEntity bean, View view) {
ImageDetailActivity.launch(this);
}
@Override
public void onClickPinsItemText(PinsMainEntity bean, View view) {
ImageDetailActivity.launch(this);
}
@Override
public void onDialogPositiveClick(String name, String describe, String selectType) {
Logger.d(name + " " + describe + " " + selectType);
}
}