package com.wangdaye.mysplash.user.view.widget; import android.annotation.SuppressLint; import android.content.Context; import android.support.annotation.Nullable; import android.support.design.widget.Snackbar; import android.support.transition.TransitionManager; import android.text.TextUtils; import android.util.AttributeSet; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.view.ViewParent; import android.widget.FrameLayout; import android.widget.ImageView; import android.widget.RelativeLayout; import android.widget.TextView; import com.github.rahatarmanahmed.cpv.CircularProgressView; import com.wangdaye.mysplash.R; import com.wangdaye.mysplash.common.data.entity.unsplash.User; import com.wangdaye.mysplash.common.i.model.LoadModel; import com.wangdaye.mysplash.common.i.model.UserModel; import com.wangdaye.mysplash.common.i.presenter.LoadPresenter; import com.wangdaye.mysplash.common.i.presenter.UserPresenter; import com.wangdaye.mysplash.common.i.view.LoadView; import com.wangdaye.mysplash.common.i.view.UserView; import com.wangdaye.mysplash.common.ui.adapter.MyPagerAdapter; import com.wangdaye.mysplash.common.ui.widget.nestedScrollView.NestedScrollAppBarLayout; import com.wangdaye.mysplash.common.ui.widget.rippleButton.RippleButton; import com.wangdaye.mysplash.common.utils.AnimUtils; import com.wangdaye.mysplash.common.utils.DisplayUtils; import com.wangdaye.mysplash.common.utils.helper.NotificationHelper; import com.wangdaye.mysplash.common.utils.manager.AuthManager; import com.wangdaye.mysplash.common.utils.manager.ThemeManager; import com.wangdaye.mysplash.user.model.widget.LoadObject; import com.wangdaye.mysplash.user.presenter.widget.LoadImplementor; import com.wangdaye.mysplash.user.model.widget.UserObject; import com.wangdaye.mysplash.user.presenter.widget.UserImplementor; import java.util.ArrayList; import java.util.List; import butterknife.BindView; import butterknife.ButterKnife; /** * User profile view. * * This view is used to show user's profile. * * */ public class UserProfileView extends FrameLayout implements UserView, LoadView, RippleButton.OnSwitchListener { @BindView(R.id.container_user_profile_progressView) CircularProgressView progressView; @BindView(R.id.container_user_profile_profileContainer) RelativeLayout profileContainer; @BindView(R.id.container_user_profile_followBtn) RippleButton rippleButton; @BindView(R.id.container_user_profile_locationTxt) TextView locationTxt; @BindView(R.id.container_user_profile_bio) TextView bioTxt; private MyPagerAdapter adapter; private UserModel userModel; private UserPresenter userPresenter; private LoadModel loadModel; private LoadPresenter loadPresenter; private OnRequestUserListener listener; public UserProfileView(Context context) { super(context); this.initialize(); } public UserProfileView(Context context, AttributeSet attrs) { super(context, attrs); this.initialize(); } public UserProfileView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); this.initialize(); } // init. @SuppressLint("InflateParams") private void initialize() { View v = LayoutInflater.from(getContext()).inflate(R.layout.container_user_profile, null); addView(v); ButterKnife.bind(this, this); initModel(); initPresenter(); initView(); } // init. private void initModel() { this.userModel = new UserObject(); this.loadModel = new LoadObject(LoadObject.LOADING_STATE); } private void initPresenter() { this.userPresenter = new UserImplementor(userModel, this); this.loadPresenter = new LoadImplementor(loadModel, this); } private void initView() { progressView.setVisibility(VISIBLE); if (AuthManager.getInstance().isAuthorized()) { rippleButton.setOnSwitchListener(this); } else { rippleButton.setVisibility(GONE); } profileContainer.setVisibility(GONE); DisplayUtils.setTypeface(getContext(), locationTxt); DisplayUtils.setTypeface(getContext(), bioTxt); ImageView locationIcon = ButterKnife.findById(this, R.id.container_user_profile_locationIcon); ThemeManager.setImageResource( locationIcon, R.drawable.ic_location_light, R.drawable.ic_location_dark); } // control. @Nullable private ViewParent getAppBarParent() { ViewParent parent = getParent(); while (parent != null && !(parent instanceof NestedScrollAppBarLayout)) { parent = parent.getParent(); } return parent; } public User getUser() { return userPresenter.getUser(); } public void setUser(User user, MyPagerAdapter adapter) { this.adapter = adapter; userPresenter.setUser(user); } public String getUserPortfolio() { return userPresenter.getUser().portfolio_url; } // HTTP request. public void requestUserProfile() { userPresenter.requestUser(); } public void cancelRequest() { userPresenter.cancelRequest(); } // interface. // on request user listener. public interface OnRequestUserListener { void onRequestUserSucceed(User u); } public void setOnRequestUserListener(OnRequestUserListener l) { this.listener = l; } // on switch listener. @Override public void onSwitch(boolean switchTo) { if (switchTo) { userPresenter.followUser(); } else { userPresenter.cancelFollowUser(); } } // view. // user data view. @SuppressLint("SetTextI18n") @Override public void drawUserInfo(User u) { if (listener != null) { listener.onRequestUserSucceed(u); } ViewParent parent = getAppBarParent(); if (parent != null) { TransitionManager.beginDelayedTransition((ViewGroup) parent); } rippleButton.forceSwitch(u.followed_by_user); if (!TextUtils.isEmpty(u.location)) { locationTxt.setText(u.location); } else { locationTxt.setText("Unknown"); } if (!TextUtils.isEmpty(u.bio)) { bioTxt.setText(u.bio); } else { bioTxt.setVisibility(GONE); } List<String> titleList = new ArrayList<>(); titleList.add( DisplayUtils.abridgeNumber(u.total_photos) + " " + getResources().getStringArray(R.array.user_tabs)[0]); titleList.add( DisplayUtils.abridgeNumber(u.total_likes) + " " + getResources().getStringArray(R.array.user_tabs)[1]); titleList.add( DisplayUtils.abridgeNumber(u.total_collections) + " " + getResources().getStringArray(R.array.user_tabs)[2]); adapter.titleList = titleList; adapter.notifyDataSetChanged(); loadPresenter.setNormalState(); } @Override public void initRefreshStart() { loadPresenter.setLoadingState(); } @Override public void followRequestSuccess(boolean follow) { User user = getUser(); user.followed_by_user = follow; if (follow) { user.followers_count ++; } else { user.followers_count --; } setUser(user, adapter); rippleButton.setSwitchResult(true); } @Override public void followRequestFailed(boolean follow) { rippleButton.setSwitchResult(false); if (follow) { NotificationHelper.showSnackbar( getContext().getString(R.string.feedback_follow_failed), Snackbar.LENGTH_SHORT); } else { NotificationHelper.showSnackbar( getContext().getString(R.string.feedback_cancel_follow_failed), Snackbar.LENGTH_SHORT); } } // load view. @Override public void animShow(final View v) { AnimUtils.animShow(v); } @Override public void animHide(final View v) { AnimUtils.animHide(v); } @Override public void setLoadingState() { // do nothing. } @Override public void setFailedState() { // do nothing. } @Override public void setNormalState() { animShow(profileContainer); animHide(progressView); } @Override public void resetLoadingState() { // do nothing. } }