package org.aisen.weibo.sina.ui.fragment.profile; import java.util.ArrayList; import java.util.List; import org.aisen.weibo.sina.R; import org.aisen.weibo.sina.support.utils.AisenUtil; import org.aisen.weibo.sina.support.utils.AppContext; import org.aisen.weibo.sina.support.utils.AppSettings; import org.aisen.weibo.sina.support.utils.BaiduAnalyzeUtils; import org.aisen.weibo.sina.support.utils.ImageConfigUtils; import org.aisen.weibo.sina.ui.activity.common.FragmentContainerActivity; import org.aisen.weibo.sina.ui.fragment.base.BizFragment; import org.aisen.weibo.sina.ui.fragment.base.BizFragment.OnCreateFriendshipCallback; import org.aisen.weibo.sina.ui.fragment.base.BizFragment.OnDestoryFollowerCallback; import org.aisen.weibo.sina.ui.fragment.base.BizFragment.OnDestoryFriendshipCallback; import org.aisen.weibo.sina.ui.fragment.base.BizFragment.OnModifyUserRemarkCallback; import org.aisen.weibo.sina.ui.fragment.friendship.FriendshipPagerFragment; import org.aisen.weibo.sina.ui.fragment.group.GroupSortFragment; import org.aisen.weibo.sina.ui.fragment.timeline.ATimelineFragment; import org.android.loader.BitmapLoader; import org.sina.android.SinaSDK; import org.sina.android.bean.FriendshipShow; import org.sina.android.bean.Group; import org.sina.android.bean.GroupListed; import org.sina.android.bean.GroupMemberListed; import org.sina.android.bean.StatusContent; import org.sina.android.bean.StatusContents; import org.sina.android.bean.WeiBoUser; import android.app.Activity; import android.app.AlertDialog; import android.content.DialogInterface; import android.os.Bundle; import android.text.TextUtils; import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; import android.view.View; import android.view.View.OnClickListener; import android.widget.ImageView; import android.widget.ListView; import android.widget.TextView; import com.m.common.params.Params; import com.m.common.utils.ActivityHelper; import com.m.support.task.TaskException; import com.m.support.task.WorkTask; import com.m.ui.activity.BaseActivity; import com.m.ui.fragment.ABaseFragment; import com.m.ui.utils.FragmentArgs; import com.m.ui.utils.ViewUtils; /** * 用户信息,用户微博列表 * * @author wangdan * */ public class UserProfileFragment extends ATimelineFragment implements OnClickListener, OnModifyUserRemarkCallback, OnCreateFriendshipCallback, OnDestoryFriendshipCallback, OnDestoryFollowerCallback { public static void launch(Activity from, WeiBoUser user) { FragmentArgs args = new FragmentArgs(); args.add("user", user); FragmentContainerActivity.launch(from, UserProfileFragment.class, args); } public static ABaseFragment newInstance() { UserProfileFragment fragment = new UserProfileFragment(); Bundle args = new Bundle(); args.putSerializable("user", AppContext.getUser()); fragment.setArguments(args); return fragment; } public static ABaseFragment newInstance(WeiBoUser searchResult) { UserProfileFragment fragment = new UserProfileFragment(); Bundle args = new Bundle(); args.putSerializable("newUser", searchResult); fragment.setArguments(args); return fragment; } private WeiBoUser mUser; private WeiBoUser mNewUser; private FriendshipShow mFriendship; private GroupMemberListed mGroupMemberListed; private View viewProfile; @Override protected int inflateContentView() { return R.layout.ui_user_timeline; } @Override protected RefreshListType configListType() { return RefreshListType.androidPulltorefresh; } @Override protected void initRefreshList(Bundle savedInstanceState) { super.initRefreshList(savedInstanceState); ListView listView = (ListView) getRefreshView(); viewProfile = View.inflate(getActivity(), R.layout.lay_profile_v2, null); AisenUtil.setAlpha(viewProfile); listView.addHeaderView(viewProfile); } @Override protected void layoutInit(LayoutInflater inflater, Bundle savedInstanceSate) { super.layoutInit(inflater, savedInstanceSate); getActivity().getActionBar().setDisplayHomeAsUpEnabled(true); getActivity().getActionBar().setTitle(R.string.title_user_profile); mNewUser = savedInstanceSate == null ? (WeiBoUser) getArguments().getSerializable("newUser") : (WeiBoUser) savedInstanceSate.getSerializable("mNewUser"); if (mNewUser != null) { mUser = mNewUser; } else { mUser = savedInstanceSate == null ? (WeiBoUser) getArguments().getSerializable("user") : (WeiBoUser) savedInstanceSate.getSerializable("user"); } mFriendship = savedInstanceSate == null ? (FriendshipShow) getArguments().getSerializable("friendship") : (FriendshipShow) savedInstanceSate.getSerializable("friendship"); mGroupMemberListed = savedInstanceSate == null ? (GroupMemberListed) getArguments().getSerializable("groupListed") : (GroupMemberListed) savedInstanceSate.getSerializable("groupListed"); viewProfile = getRootView(); if (savedInstanceSate == null) { loadFriendship(); } setHasOptionsMenu(true); } public int refreshLayoutInfo() { return R.id.layContent; } private void loadFriendship() { // 加载用户关系 if (mUser != null && !mUser.getIdstr().equals(AppContext.getUser().getIdstr())) { new FriendshipTask().execute(); } } @Override protected void config(RefreshConfig config) { super.config(config); config.savePosition = false; } @Override public void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); outState.putSerializable("mNewUser", mNewUser); outState.putSerializable("user", mUser); outState.putSerializable("friendship", mFriendship); outState.putSerializable("groupListed", mGroupMemberListed); } private void setProfileView() { ImageView imgPhoto = (ImageView) viewProfile.findViewById(R.id.imgPhoto); BitmapLoader.getInstance().display(this, AisenUtil.getUserPhoto(mUser), imgPhoto, ImageConfigUtils.getLargePhotoConfig()); TextView txtName = (TextView) viewProfile.findViewById(R.id.txtName); txtName.setText(mUser.getName()); // fuck 2014-09-04 当名字过长大于6个字时,截取部分文字 int maxLength = AisenUtil.getStrLength("当名字过长大于个"); if (AisenUtil.getStrLength(mUser.getName()) > maxLength) { StringBuffer sb = new StringBuffer(); int index = 0; while (AisenUtil.getStrLength(sb.toString()) < maxLength) { if (index >= mUser.getName().length()) break; sb.append(mUser.getName().charAt(index)); index++; } sb.append("..."); txtName.setText(sb.toString()); } // 性别 ImageView imgGender = (ImageView) viewProfile.findViewById(R.id.imgGender); imgGender.setVisibility(View.VISIBLE); if ("m".equals(mUser.getGender())) imgGender.setImageResource(R.drawable.list_male); else if ("f".equals(mUser.getGender())) imgGender.setImageResource(R.drawable.list_female); else imgGender.setVisibility(View.GONE); // 认证 ImageView imgVerified = (ImageView) viewProfile.findViewById(R.id.imgVerified); AisenUtil.setImageVerified(imgVerified, mUser); // 简介 TextView txtDesc = (TextView) viewProfile.findViewById(R.id.txtDesc); if (!TextUtils.isEmpty(mUser.getDescription())) txtDesc.setText(String.format(getString(R.string.profile_des_hint), mUser.getDescription())); else txtDesc.setText(String.format(String.format(getString(R.string.profile_des_hint), getString(R.string.profile_des_none)))); // 认证原因 TextView txtVerifiedReason = (TextView) viewProfile.findViewById(R.id.txtVerifiedReason); txtVerifiedReason.setVisibility(!TextUtils.isEmpty(mUser.getVerified_reason()) ? View.VISIBLE : View.GONE); txtVerifiedReason.setText(String.format(getString(R.string.profile_ver_reason), mUser.getVerified_reason() + "")); // 备注 TextView txtRemark = (TextView) viewProfile.findViewById(R.id.txtRemark); txtRemark.setVisibility(mFriendship == null || !mFriendship.getSource().getFollowing() ? View.GONE : View.VISIBLE); if (mFriendship != null) { try { BizFragment.getBizFragment(this).modifyUserMark(txtRemark, mUser, this); } catch (Exception e) { } if (!TextUtils.isEmpty(mUser.getRemark())) txtRemark.setText(String.format(getString(R.string.profile_remark), mUser.getRemark())); else txtRemark.setText(R.string.profile_remark_none); } // 分组 TextView txtGroups = (TextView) viewProfile.findViewById(R.id.txtGroups); txtGroups.setVisibility(mGroupMemberListed == null ? View.GONE : View.VISIBLE); txtGroups.setOnClickListener(this); if (mGroupMemberListed != null) { if (mGroupMemberListed.getLists().size() == 0) { txtGroups.setText(R.string.profile_group_none); } else { StringBuffer sb = new StringBuffer(); for (GroupListed groupListed : mGroupMemberListed.getLists()) sb.append(groupListed.getName()).append(" "); txtGroups.setText(String.format(getString(R.string.profile_group_hint), sb.toString().trim())); } } // 所在地 TextView txtLocation = (TextView) viewProfile.findViewById(R.id.txtLocation); txtLocation.setText(mUser.getLocation()); // 微博数 TextView txtStatusCount = (TextView) viewProfile.findViewById(R.id.txtStatusCount); txtStatusCount.setText(AisenUtil.getCounter(mUser.getStatuses_count())); // 关注数 viewProfile.findViewById(R.id.btnFriendCounter).setOnClickListener(this); TextView txtFriendCount = (TextView) viewProfile.findViewById(R.id.txtFriendCount); txtFriendCount.setText(AisenUtil.getCounter(mUser.getFriends_count())); // 粉丝数 viewProfile.findViewById(R.id.btnFollowerCounter).setOnClickListener(this); TextView txtFollowerCount = (TextView) viewProfile.findViewById(R.id.txtFollowerCount); txtFollowerCount.setText(AisenUtil.getCounter(mUser.getFollowers_count())); } @Override protected void requestData(RefreshMode mode) { new UserTimelineTask(mode).execute(); } @Override public void onResume() { super.onResume(); setProfileView(); BaiduAnalyzeUtils.onPageStart("个人微博"); // 分组发生改变 if (ActivityHelper.getInstance().getBooleanShareData("ChanneSortHasChanged", false) || ActivityHelper.getInstance().getBooleanShareData("offlineChanneChanged", false)) { setGroupList(); } } @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); MenuItem mentionItem = menu.findItem(R.id.mention); MenuItem createItem = menu.findItem(R.id.create); MenuItem destoryItem = menu.findItem(R.id.destory); MenuItem followerDestoryItem = menu.findItem(R.id.followDestory); if (mUser == null || AppContext.getUser().getIdstr().equals(mUser.getIdstr())) { mentionItem.setVisible(false); createItem.setVisible(false); destoryItem.setVisible(false); followerDestoryItem.setVisible(false); } else { mentionItem.setVisible(true); createItem.setVisible(mFriendship != null && !mFriendship.getSource().getFollowing()); destoryItem.setVisible(mFriendship != null && mFriendship.getSource().getFollowing()); followerDestoryItem.setVisible(mFriendship != null && mFriendship.getTarget().getFollowing()); } } @Override public boolean onOptionsItemSelected(MenuItem item) { // @Ta if (item.getItemId() == R.id.mention) { BizFragment.getBizFragment(this).mentionUser(getActivity(), mUser); } // 关注 else if (item.getItemId() == R.id.create) { BizFragment.getBizFragment(this).createFriendship(mUser, this); } // 取消关注 else if (item.getItemId() == R.id.destory) { BizFragment.getBizFragment(this).destoryFriendship(mUser, this); } // 移除粉丝 else if (item.getItemId() == R.id.followDestory) { BizFragment.getBizFragment(this).destoryFollower(mUser, this); } return super.onOptionsItemSelected(item); } /** * 设置分组信息 */ AlertDialog groupDialog; private void setGroupList() { if (groupDialog != null && groupDialog.isShowing()) groupDialog.dismiss(); String[] items = new String[AppContext.getGroups().getLists().size()]; final boolean[] checkedItems = new boolean[AppContext.getGroups().getLists().size()]; final boolean[] editCheckedItems = new boolean[AppContext.getGroups().getLists().size()]; for (int i = 0; i < AppContext.getGroups().getLists().size(); i++) { Group group = AppContext.getGroups().getLists().get(i); items[i] = group.getName(); checkedItems[i] = false; editCheckedItems[i] = false; for (GroupListed groupListed : mGroupMemberListed.getLists()) { if (groupListed.getIdstr().equals(group.getIdstr())) { checkedItems[i] = true; editCheckedItems[i] = true; break; } } } View customTitle = View.inflate(getActivity(), R.layout.lay_group_dialogtitle, null); customTitle.findViewById(R.id.btnSettings).setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // 设置分组 GroupSortFragment.lanuch(getActivity()); } }); groupDialog = new AlertDialog.Builder(getActivity()).setCustomTitle(customTitle) .setMultiChoiceItems(items, editCheckedItems, new DialogInterface.OnMultiChoiceClickListener() { @Override public void onClick(DialogInterface dialog, int which, boolean isChecked) { editCheckedItems[which] = isChecked; } }) .setOnDismissListener(new DialogInterface.OnDismissListener() { @Override public void onDismiss(DialogInterface dialog) { groupDialog = null; } }) .setNegativeButton(R.string.cancel, null) .setPositiveButton(R.string.confirm, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { new SetGroupTask().execute(checkedItems, editCheckedItems); } }) .show(); } // 获取用户关系 class FriendshipTask extends WorkTask<Void, Void, FriendshipShow> { @Override public FriendshipShow workInBackground(Void... params) throws TaskException { FriendshipShow friendshipShow = SinaSDK.getInstance(AppContext.getToken()).friendshipsShow(AppContext.getUser().getIdstr(), mUser.getIdstr()); if (friendshipShow.getSource().getFollowing()) { GroupMemberListed[] result = SinaSDK.getInstance(AppContext.getToken()).friendshipGroupsListed(mUser.getIdstr()); if (result != null && result.length > 0) { mGroupMemberListed = result[0]; } else { mGroupMemberListed = new GroupMemberListed(); mGroupMemberListed.setLists(new ArrayList<GroupListed>()); mGroupMemberListed.setUid(mUser.getId()); } } return friendshipShow; } @Override protected void onFailure(TaskException exception) { super.onFailure(exception); // 如果界面没有被销毁,就加载 if (getActivity() != null) { BaseActivity baseActivity = (BaseActivity) getActivity(); if (!baseActivity.mIsDestoryed()) { new FriendshipTask().execute(); } } } @Override protected void onSuccess(FriendshipShow result) { super.onSuccess(result); if (getActivity() != null) { mFriendship = result; getActivity().invalidateOptionsMenu(); setProfileView(); } } } // 设置分组 class SetGroupTask extends WorkTask<boolean[], String, Boolean> { @Override protected void onPrepare() { super.onPrepare(); ViewUtils.createNormalProgressDialog(getActivity(), getString(R.string.profile_group_update_loading)).show(); } @Override public Boolean workInBackground(boolean[]... params) throws TaskException { final boolean[] checkedItems = params[0]; final boolean[] editCheckedItems = params[1]; mGroupMemberListed = new GroupMemberListed(); mGroupMemberListed.setLists(new ArrayList<GroupListed>()); for (int i = 0; i < editCheckedItems.length; i++) { Group group = AppContext.getGroups().getLists().get(i); GroupListed groupListed = new GroupListed(); groupListed.setIdstr(group.getIdstr()); groupListed.setName(group.getName()); // 这个分组没有选中 if (editCheckedItems[i]) { // 如果这个分组原来也是选中的,则不需要编辑 if (checkedItems[i]) { mGroupMemberListed.getLists().add(groupListed); } // 如果这个分组原来没有选中,则添加 else { // 添加好友到分组 SinaSDK.getInstance(AppContext.getToken()).friendshipsGroupdMembersAdd(mUser.getIdstr(), group.getIdstr()); publishProgress(String.format(getString(R.string.profile_add_to_group), group.getName())); mGroupMemberListed.getLists().add(groupListed); } } else { // 如果原来有这个分组,现在没有勾选,则删除 if (checkedItems[i]) { // 从分组中删除好友 SinaSDK.getInstance(AppContext.getToken()).friendshipsGroupdMembersDestory(mUser.getIdstr(), group.getIdstr()); publishProgress(String.format(getString(R.string.profile_group_remvoe_friend), group.getName())); } // 原来没有勾选,现在也没有勾选,不做处理 } } return true; } @Override protected void onProgressUpdate(String... values) { super.onProgressUpdate(values); if (getActivity() != null && values != null && values.length > 0) ViewUtils.updateNormalProgressDialog(values[0]); } @Override protected void onFinished() { super.onFinished(); ViewUtils.dismissNormalProgressDialog(); setProfileView(); } @Override protected void onFailure(TaskException exception) { super.onFailure(exception); showMessage(R.string.profile_edit_group_faild); } @Override protected void onSuccess(Boolean result) { super.onSuccess(result); showMessage(R.string.profile_edit_group_success); } } // 用户微博列表 class UserTimelineTask extends TimelineTask { public UserTimelineTask(RefreshMode mode) { super(mode); } @Override protected StatusContents workInBackground(RefreshMode mode, String previousPage, String nextPage, Void... p) throws TaskException { Params params = new Params(); if (mode == RefreshMode.refresh && !TextUtils.isEmpty(previousPage)) params.addParameter("since_id", previousPage); if (mode == RefreshMode.update && !TextUtils.isEmpty(nextPage)) params.addParameter("max_id", nextPage); // params.addParameter("feature", feature); // 不管user_id字段传值什么,都返回登录用户的微博 if (AppContext.getUser().getIdstr().equals(mUser.getIdstr())) { params.addParameter("user_id", mUser.getIdstr()); } else { params.addParameter("screen_name", mUser.getScreen_name()); } params.addParameter("count", String.valueOf(AppSettings.getTimelineCount())); StatusContents statusContents = SinaSDK.getInstance(AppContext.getToken(), getTaskCacheMode(this)).statusesUserTimeLine(params); if (mNewUser == null && (mUser != null && !mUser.getIdstr().equals(AppContext.getUser().getIdstr()))) { mNewUser = SinaSDK.getInstance(AppContext.getToken()).userShow(null, mUser.getScreen_name()); mUser = mNewUser; if (mNewUser.getStatus() != null) mUser.getStatus().setUser(mNewUser); if (mUser.getStatus() != null && statusContents != null && (statusContents.getStatuses() == null || statusContents.getStatuses().size() == 0)) { List<StatusContent> statusList = new ArrayList<StatusContent>(); statusList.add(mNewUser.getStatus()); statusContents.setStatuses(statusList); } } if (statusContents != null && statusContents.getStatuses() != null && statusContents.getStatuses().size() > 0) { for (StatusContent status : statusContents.getStatuses()) status.setUser(mUser); } return statusContents; } @Override protected void onSuccess(StatusContents result) { super.onSuccess(result); if (result == null) return; setProfileView(); getActivity().invalidateOptionsMenu(); if (result != null && result.getStatuses().size() == 1 && getTaskCount(getTaskId()) == 1 && !ActivityHelper.getInstance().getBooleanShareData("donotRemindFuckSina", false)) { new AlertDialog.Builder(getActivity()) .setMessage(R.string.profile_fuck_sina) .setPositiveButton(R.string.i_know, null) .setNegativeButton(R.string.donnot_remind, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { ActivityHelper.getInstance().putBooleanShareData("donotRemindFuckSina", true); } }) .show(); } } } @Override public void onClick(View v) { // 关注群 if (v.getId() == R.id.btnFriendCounter) { FriendshipPagerFragment.launch(getActivity(), mUser, 0); // FriendsFragment.launch(getActivity(), mUser); } // 粉丝群 else if (v.getId() == R.id.btnFollowerCounter) { FriendshipPagerFragment.launch(getActivity(), mUser, 1); // FollowersFragment.launch(getActivity(), mUser); } // 分组 else if (v.getId() == R.id.txtGroups) { setGroupList(); } } @Override public void onModifyUserRemark(String remark) { mUser.setRemark(remark); setProfileView(); getAdapter().notifyDataSetChanged(); } @Override public void onFriendshipCreated(WeiBoUser targetUser) { if (mFriendship != null) mFriendship.getSource().setFollowing(true); mUser.setRecentStatusId(targetUser.getRecentStatusId()); if (mNewUser != null) mNewUser.setRecentStatusId(targetUser.getRecentStatusId()); mGroupMemberListed = new GroupMemberListed(); mGroupMemberListed.setLists(new ArrayList<GroupListed>()); mGroupMemberListed.setUid(mUser.getIdstr()); setProfileView(); setGroupList(); getActivity().invalidateOptionsMenu(); getAdapter().notifyDataSetChanged(); } @Override public void onFriendshipDestoryed(WeiBoUser targetUser) { if (mFriendship != null) mFriendship.getSource().setFollowing(false); mGroupMemberListed = null; mUser.setRemark(""); if (mNewUser != null) mNewUser.setRemark(""); setProfileView(); getActivity().invalidateOptionsMenu(); getAdapter().notifyDataSetChanged(); } @Override public void onDestoryFollower(WeiBoUser user) { if (mFriendship != null) mFriendship.getTarget().setFollowing(false); getActivity().invalidateOptionsMenu(); } @Override public String getLastReadKey() { if (AppContext.isLogedin()) return String.format("UserProfile-%s", AppContext.getUser().getIdstr()); return super.getLastReadKey(); } @Override public void onPause() { super.onPause(); BaiduAnalyzeUtils.onPageEnd("个人微博"); } }