/* * Copyright (c) 2016 Zhang Hai <Dreaming.in.Code.ZH@Gmail.com> * All Rights Reserved. */ package me.zhanghai.android.douya.profile.ui; import android.app.Activity; import android.os.Bundle; import android.support.annotation.Nullable; import android.support.v4.app.Fragment; import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.support.v7.widget.StaggeredGridLayoutManager; import android.support.v7.widget.Toolbar; import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; import com.android.volley.VolleyError; import java.util.List; import butterknife.BindView; import butterknife.ButterKnife; import me.zhanghai.android.customtabshelper.CustomTabsHelperFragment; import me.zhanghai.android.douya.R; import me.zhanghai.android.douya.followship.content.FollowUserManager; import me.zhanghai.android.douya.link.NotImplementedManager; import me.zhanghai.android.douya.network.api.ApiError; import me.zhanghai.android.douya.network.api.info.apiv2.Broadcast; import me.zhanghai.android.douya.network.api.info.apiv2.SimpleUser; import me.zhanghai.android.douya.network.api.info.apiv2.User; import me.zhanghai.android.douya.network.api.info.frodo.Diary; import me.zhanghai.android.douya.network.api.info.frodo.Review; import me.zhanghai.android.douya.network.api.info.frodo.UserItems; import me.zhanghai.android.douya.profile.content.ProfileResource; import me.zhanghai.android.douya.profile.util.ProfileUtils; import me.zhanghai.android.douya.ui.ContentStateLayout; import me.zhanghai.android.douya.ui.CopyTextDialogFragment; import me.zhanghai.android.douya.util.FragmentUtils; import me.zhanghai.android.douya.util.LogUtils; import me.zhanghai.android.douya.util.ToastUtils; import me.zhanghai.android.douya.util.ViewUtils; public class ProfileFragment extends Fragment implements ProfileResource.Listener, ProfileHeaderLayout.Listener, ProfileIntroductionLayout.Listener, ConfirmUnfollowUserDialogFragment.Listener { private static final String KEY_PREFIX = ProfileFragment.class.getName() + '.'; private static final String EXTRA_USER_ID_OR_UID = KEY_PREFIX + "user_id_or_uid"; private static final String EXTRA_SIMPLE_USER = KEY_PREFIX + "simple_user"; private static final String EXTRA_USER = KEY_PREFIX + "user"; @BindView(R.id.scroll) ProfileLayout mScrollLayout; @BindView(R.id.header) ProfileHeaderLayout mHeaderLayout; @BindView(R.id.dismiss) View mDismissView; @BindView(R.id.toolbar) Toolbar mToolbar; @BindView(R.id.contentState) ContentStateLayout mContentStateLayout; @BindView(R.id.content) RecyclerView mContentList; private String mUserIdOrUid; private SimpleUser mSimpleUser; private User mUser; private ProfileResource mResource; private ProfileAdapter mAdapter; public static ProfileFragment newInstance(String userIdOrUid, SimpleUser simpleUser, User user) { //noinspection deprecation ProfileFragment fragment = new ProfileFragment(); Bundle arguments = FragmentUtils.ensureArguments(fragment); arguments.putString(EXTRA_USER_ID_OR_UID, userIdOrUid); arguments.putParcelable(EXTRA_SIMPLE_USER, simpleUser); arguments.putParcelable(EXTRA_USER, user); return fragment; } /** * @deprecated Use {@link #newInstance(String, SimpleUser, User)} instead. */ public ProfileFragment() {} @Override public void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); Bundle arguments = getArguments(); mUserIdOrUid = arguments.getString(EXTRA_USER_ID_OR_UID); mSimpleUser = arguments.getParcelable(EXTRA_SIMPLE_USER); mUser = arguments.getParcelable(EXTRA_USER); setHasOptionsMenu(true); } @Nullable @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { int layoutRes = ProfileUtils.shouldUseWideLayout(inflater.getContext()) ? R.layout.profile_fragment_wide : R.layout.profile_fragment; return inflater.inflate(layoutRes, container, false); } @Override public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); ButterKnife.bind(this, view); } @Override public void onActivityCreated(@Nullable Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); CustomTabsHelperFragment.attachTo(this); mResource = ProfileResource.attachTo(mUserIdOrUid, mSimpleUser, mUser, this); mScrollLayout.setListener(new ProfileLayout.Listener() { @Override public void onEnterAnimationEnd() {} @Override public void onExitAnimationEnd() { getActivity().finish(); } }); if (savedInstanceState == null) { mScrollLayout.enter(); } mDismissView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { exit(); } }); AppCompatActivity activity = (AppCompatActivity) getActivity(); activity.setSupportActionBar(mToolbar); activity.getSupportActionBar().setTitle(null); if (mResource.hasUser()) { mHeaderLayout.bindUser(mResource.getUser()); } else if (mResource.hasSimpleUser()) { mHeaderLayout.bindSimpleUser(mResource.getSimpleUser()); } mHeaderLayout.setListener(this); if (ViewUtils.hasSw600Dp(activity)) { mContentList.setLayoutManager(new StaggeredGridLayoutManager(2, StaggeredGridLayoutManager.VERTICAL)); } else { mContentList.setLayoutManager(new LinearLayoutManager(activity)); } mAdapter = new ProfileAdapter(this); mContentList.setAdapter(mAdapter); if (mResource.isLoaded()) { mResource.notifyChangedIfLoaded(); } else { mContentStateLayout.setLoading(); } } @Override public void onDestroy() { super.onDestroy(); mResource.detach(); } public void onBackPressed() { exit(); } private void exit() { mScrollLayout.exit(); } @Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { super.onCreateOptionsMenu(menu, inflater); inflater.inflate(R.menu.profile, menu); } @Override public void onPrepareOptionsMenu(Menu menu) { super.onPrepareOptionsMenu(menu); // TODO: Block or unblock. } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case R.id.action_send_doumail: // HACK: For testing //startActivity(ItemCollectionActivity.makeIntent(null, getActivity())); // TODO NotImplementedManager.showNotYetImplementedToast(getActivity()); return true; case R.id.action_blacklist: // TODO NotImplementedManager.showNotYetImplementedToast(getActivity()); return true; case R.id.action_report_abuse: // TODO NotImplementedManager.showNotYetImplementedToast(getActivity()); return true; default: return super.onOptionsItemSelected(item); } } @Override public void onLoadError(int requestCode, VolleyError error) { LogUtils.e(error.toString()); mContentStateLayout.setError(); Activity activity = getActivity(); ToastUtils.show(ApiError.getErrorString(error, activity), activity); } @Override public void onUserChanged(int requestCode, User newUser) { mHeaderLayout.bindUser(newUser); } @Override public void onUserWriteStarted(int requestCode) { mHeaderLayout.bindUser(mResource.getUser()); } @Override public void onUserWriteFinished(int requestCode) { mHeaderLayout.bindUser(mResource.getUser()); } @Override public void onChanged(int requestCode, User newUser, List<Broadcast> newBroadcastList, List<SimpleUser> newFollowingList, List<Diary> newDiaryList, List<UserItems> newUserItemList, List<Review> newReviewList) { mAdapter.setData(new ProfileAdapter.Data(newUser, newBroadcastList, newFollowingList, newDiaryList, newUserItemList, newReviewList)); mContentStateLayout.setLoaded(true); } @Override public void onEditProfile(User user) { NotImplementedManager.editProfile(getActivity()); } @Override public void onFollowUser(User user, boolean follow) { if (follow) { FollowUserManager.getInstance().write(user, true, getActivity()); } else { ConfirmUnfollowUserDialogFragment.show(this); } } @Override public void onUnfollowUser() { FollowUserManager.getInstance().write(mResource.getUser(), false, getActivity()); } @Override public void onCopyText(String text) { CopyTextDialogFragment.show(text, this); } }