package org.qii.weiciyuan.ui.userinfo; import org.qii.weiciyuan.R; import org.qii.weiciyuan.bean.MessageBean; import org.qii.weiciyuan.bean.MessageListBean; import org.qii.weiciyuan.bean.UserBean; import org.qii.weiciyuan.bean.android.AsyncTaskLoaderResult; import org.qii.weiciyuan.bean.android.MyStatusTimeLineData; import org.qii.weiciyuan.bean.android.TimeLinePosition; import org.qii.weiciyuan.dao.show.ShowUserDao; import org.qii.weiciyuan.dao.topic.UserTopicListDao; import org.qii.weiciyuan.support.asyncdrawable.TimeLineBitmapDownloader; import org.qii.weiciyuan.support.database.AccountDBTask; import org.qii.weiciyuan.support.database.MyStatusDBTask; import org.qii.weiciyuan.support.database.TopicDBTask; import org.qii.weiciyuan.support.debug.AppLogger; import org.qii.weiciyuan.support.error.WeiboException; import org.qii.weiciyuan.support.file.FileLocationMethod; import org.qii.weiciyuan.support.file.FileManager; import org.qii.weiciyuan.support.imageutility.ImageUtility; import org.qii.weiciyuan.support.lib.BlurImageView; import org.qii.weiciyuan.support.lib.MyAsyncTask; import org.qii.weiciyuan.support.lib.SwipeFrameLayout; import org.qii.weiciyuan.support.lib.TimeLineAvatarImageView; import org.qii.weiciyuan.support.lib.pulltorefresh.PullToRefreshBase; import org.qii.weiciyuan.support.utils.AnimationUtility; import org.qii.weiciyuan.support.utils.GlobalContext; import org.qii.weiciyuan.support.utils.TimeLineUtility; import org.qii.weiciyuan.support.utils.Utility; import org.qii.weiciyuan.support.utils.ViewUtility; import org.qii.weiciyuan.ui.basefragment.AbstractMessageTimeLineFragment; import org.qii.weiciyuan.ui.browser.BrowserWeiboMsgActivity; import org.qii.weiciyuan.ui.loader.StatusesByIdLoader; import org.qii.weiciyuan.ui.main.LeftMenuFragment; import org.qii.weiciyuan.ui.main.MainTimeLineActivity; import org.qii.weiciyuan.ui.topic.UserTopicListActivity; import android.animation.Animator; import android.app.ActionBar; import android.content.Context; import android.content.Intent; import android.graphics.Rect; import android.os.Bundle; import android.support.v4.content.Loader; import android.support.v4.view.PagerAdapter; import android.support.v4.view.ViewPager; import android.text.TextPaint; import android.text.TextUtils; import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; import android.view.MotionEvent; import android.view.View; import android.view.ViewConfiguration; import android.view.ViewGroup; import android.view.animation.Animation; import android.view.animation.DecelerateInterpolator; import android.view.animation.TranslateAnimation; import android.widget.AdapterView; import android.widget.ImageView; import android.widget.TextView; import java.util.ArrayList; import java.util.concurrent.atomic.AtomicInteger; /** * User: qii * Date: 13-6-20 */ public class UserInfoFragment extends AbstractMessageTimeLineFragment<MessageListBean> implements MainTimeLineActivity.ScrollableListFragment, Animator.AnimatorListener { private static final String LIMITED_READ_MESSAGE_COUNT = "10"; protected UserBean userBean; protected String token; private MessageListBean bean = new MessageListBean(); private ViewPager viewPager; private ImageView cover; private BlurImageView blur; private TextView friendsCount; private TextView fansCount; private TextView topicsCount; private TextView weiboCount; public View header; private View headerFirst; private View headerSecond; private View headerThird; private TimeLineAvatarImageView avatar; private TextView nickname; private TextView bio; private TextView location; private TextView url; private TextView verifiedReason; private TextView followsYou; private ImageView leftPoint; private ImageView centerPoint; private ImageView rightPoint; private View progressFooter; private View moreFooter; private MenuItem refreshItem; private ArrayList<String> topicList; private TopicListTask topicListTask; private RefreshTask refreshTask; private DBCacheTask dbTask; private AtomicInteger finishedWatcher; private TimeLinePosition position; public static UserInfoFragment newInstance(UserBean userBean, String token) { UserInfoFragment fragment = new UserInfoFragment(userBean, token); fragment.setArguments(new Bundle()); return fragment; } public UserInfoFragment() { } @Override public MessageListBean getList() { return bean; } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setRetainInstance(true); } @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { if (data == null) { return; } MessageBean msg = (MessageBean) data.getParcelableExtra("msg"); if (msg != null) { for (int i = 0; i < getList().getSize(); i++) { if (msg.equals(getList().getItem(i))) { getList().getItem(i).setReposts_count(msg.getReposts_count()); getList().getItem(i).setComments_count(msg.getComments_count()); break; } } getAdapter().notifyDataSetChanged(); } } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = super.onCreateView(inflater, container, savedInstanceState); view.setBackground(null); header = inflater .inflate(R.layout.newuserinfofragment_header_layout, getListView(), false); getListView().addHeaderView(header); footerView.setVisibility(View.GONE); progressFooter = inflater .inflate(R.layout.newuserinfofragment_progress_footer, getListView(), false); progressFooter.setVisibility(View.GONE); getListView().addFooterView(progressFooter); moreFooter = inflater .inflate(R.layout.newuserinfofragment_more_footer, getListView(), false); moreFooter.setVisibility(View.GONE); getListView().addFooterView(moreFooter); viewPager = ViewUtility.findViewById(header, R.id.viewpager); cover = ViewUtility.findViewById(header, R.id.cover); blur = ViewUtility.findViewById(header, R.id.blur); friendsCount = ViewUtility.findViewById(header, R.id.friends_count); fansCount = ViewUtility.findViewById(header, R.id.fans_count); topicsCount = ViewUtility.findViewById(header, R.id.topics_count); weiboCount = ViewUtility.findViewById(header, R.id.weibo_count); headerFirst = inflater .inflate(R.layout.newuserinfofragment_header_viewpager_first_layout, null, false); headerSecond = inflater .inflate(R.layout.newuserinfofragment_header_viewpager_second_layout, null, false); headerThird = inflater .inflate(R.layout.newuserinfofragment_header_viewpager_third_layout, null, false); avatar = ViewUtility.findViewById(headerFirst, R.id.avatar); nickname = ViewUtility.findViewById(headerFirst, R.id.nickname); location = ViewUtility.findViewById(headerFirst, R.id.location); followsYou = ViewUtility.findViewById(headerFirst, R.id.follows_you); bio = ViewUtility.findViewById(headerSecond, R.id.bio); url = ViewUtility.findViewById(headerSecond, R.id.url); verifiedReason = ViewUtility.findViewById(headerThird, R.id.verified_reason); leftPoint = ViewUtility.findViewById(header, R.id.left_point); centerPoint = ViewUtility.findViewById(header, R.id.center_point); rightPoint = ViewUtility.findViewById(header, R.id.right_point); leftPoint.getDrawable().setLevel(1); View weiboCountLayout = ViewUtility.findViewById(header, R.id.weibo_count_layout); View friendsCountLayout = ViewUtility.findViewById(header, R.id.friends_count_layout); View fansCountLayout = ViewUtility.findViewById(header, R.id.fans_count_layout); View topicCountLayout = ViewUtility.findViewById(header, R.id.topics_count_layout); weiboCountLayout.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent = UserTimeLineActivity .newIntent(GlobalContext.getInstance().getSpecialToken(), userBean); startActivity(intent); } }); friendsCountLayout.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent = FriendListActivity .newIntent(GlobalContext.getInstance().getSpecialToken(), userBean); startActivity(intent); } }); fansCountLayout.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent = FanListActivity .newIntent(GlobalContext.getInstance().getSpecialToken(), userBean); startActivity(intent); } }); topicCountLayout.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent = UserTopicListActivity.newIntent(userBean, topicList); startActivity(intent); } }); View result = view; if (!isOpenedFromMainPage()) { SwipeFrameLayout swipeFrameLayout = new SwipeFrameLayout(getActivity()); swipeFrameLayout.addView(result, new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT)); result = swipeFrameLayout; } return result; } @Override public void onViewCreated(View view, Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); getPullToRefreshListView().setMode(PullToRefreshBase.Mode.DISABLED); getPullToRefreshListView().setOnLastItemVisibleListener(null); getPullToRefreshListView().getRefreshableView().setOverScrollMode(View.OVER_SCROLL_ALWAYS); viewPager.setOnTouchListener(new View.OnTouchListener() { float rawX; @Override public boolean onTouch(View v, MotionEvent event) { switch (event.getActionMasked()) { case MotionEvent.ACTION_DOWN: rawX = event.getRawX(); return false; case MotionEvent.ACTION_CANCEL: case MotionEvent.ACTION_UP: viewPager.getParent().requestDisallowInterceptTouchEvent(false); rawX = 0f; return false; case MotionEvent.ACTION_MOVE: if (Math.abs(rawX - event.getRawX()) > ViewConfiguration.get(getActivity()) .getScaledTouchSlop()) { viewPager.getParent().requestDisallowInterceptTouchEvent(true); } break; } return false; } }); viewPager.setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() { @Override public void onPageSelected(int position) { super.onPageSelected(position); switch (position) { case 0: leftPoint.getDrawable().setLevel(1); centerPoint.getDrawable().setLevel(0); rightPoint.getDrawable().setLevel(0); break; case 1: leftPoint.getDrawable().setLevel(0); centerPoint.getDrawable().setLevel(1); rightPoint.getDrawable().setLevel(0); break; case 2: leftPoint.getDrawable().setLevel(0); centerPoint.getDrawable().setLevel(0); rightPoint.getDrawable().setLevel(1); break; } } @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { super.onPageScrolled(position, positionOffset, positionOffsetPixels); if (position == 0) { if (positionOffset > 0) { blur.setAlpha(positionOffset); } } } }); } private void displayBasicInfo() { HeaderPagerAdapter adapter = new HeaderPagerAdapter(); viewPager.setAdapter(adapter); friendsCount.setText( Utility.convertStateNumberToString(getActivity(), userBean.getFriends_count())); fansCount.setText( Utility.convertStateNumberToString(getActivity(), userBean.getFollowers_count())); weiboCount.setText( Utility.convertStateNumberToString(getActivity(), userBean.getStatuses_count())); TextPaint tp = nickname.getPaint(); tp.setFakeBoldText(true); if (TextUtils.isEmpty(userBean.getRemark())) { nickname.setText(userBean.getScreen_name()); } else { nickname.setText(userBean.getScreen_name() + "(" + userBean.getRemark() + ")"); } getActivity().getActionBar().setTitle(userBean.getScreen_name()); avatar.checkVerified(userBean); if (!userBean.isVerified()) { rightPoint.setVisibility(View.GONE); } else { rightPoint.setVisibility(View.VISIBLE); } avatar.getImageView().post(new Runnable() { @Override public void run() { TimeLineBitmapDownloader.getInstance() .display(avatar.getImageView(), avatar.getImageView().getWidth() , avatar.getImageView().getHeight(), userBean.getAvatar_large(), FileLocationMethod.avatar_large); } }); // TimeLineBitmapDownloader.getInstance().downloadAvatar(avatar.getImageView(), userBean, (AbstractTimeLineFragment) this); avatar.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { String path = FileManager.getFilePathFromUrl(userBean.getAvatar_large(), FileLocationMethod.avatar_large); if (!ImageUtility.isThisBitmapCanRead(path)) { path = FileManager.getFilePathFromUrl(userBean.getProfile_image_url(), FileLocationMethod.avatar_small); if (!ImageUtility.isThisBitmapCanRead(path)) { return; } } Rect rect = AnimationUtility.getBitmapRectFromImageView(avatar); UserAvatarDialog dialog = UserAvatarDialog.newInstance(path, rect); dialog.show(getFragmentManager(), ""); } }); if (!TextUtils.isEmpty(userBean.getDescription())) { bio.setText(userBean.getDescription()); bio.setVisibility(View.VISIBLE); } else { bio.setVisibility(View.GONE); } if (!TextUtils.isEmpty(userBean.getLocation())) { location.setText(userBean.getLocation()); location.setVisibility(View.VISIBLE); } else { location.setVisibility(View.GONE); } if (!TextUtils.isEmpty(userBean.getUrl())) { url.setText(userBean.getUrl()); TimeLineUtility.addLinks(url); url.setVisibility(View.VISIBLE); } else { url.setVisibility(View.GONE); } if (userBean.isVerified()) { verifiedReason.setVisibility(View.VISIBLE); verifiedReason.setText(userBean.getVerified_reason()); } else { verifiedReason.setVisibility(View.GONE); } if (userBean.isFollow_me()) { followsYou.setVisibility(View.VISIBLE); followsYou.setText( getString(R.string.is_following_me) + "@" + GlobalContext.getInstance() .getCurrentAccountName()); } else { followsYou.setVisibility(View.GONE); } } private void displayCoverPicture() { if (cover.getDrawable() != null) { return; } // final int height = viewPager.getHeight(); final int height = Utility.dip2px(200); final int width = Utility.getMaxLeftWidthOrHeightImageViewCanRead(height); final String picPath = userBean.getCover_image(); blur.setAlpha(0f); blur.setOriImageUrl(picPath); ArrayList<ImageView> imageViewArrayList = new ArrayList<ImageView>(); imageViewArrayList.add(cover); imageViewArrayList.add(blur); TranslateAnimation animation = new TranslateAnimation(Animation.RELATIVE_TO_SELF, 0, Animation.RELATIVE_TO_SELF, 0, Animation.RELATIVE_TO_SELF, -100f, Animation.RELATIVE_TO_SELF, 0f); animation.setDuration(3000); animation.setInterpolator(new DecelerateInterpolator()); ArrayList<Animation> animationArray = new ArrayList<Animation>(); animationArray.add(animation); TimeLineBitmapDownloader.getInstance() .display(imageViewArrayList, width, height, picPath, FileLocationMethod.cover, animationArray); } @Override public void onResume() { super.onResume(); if (userBean != null && userBean.getId() != null && userBean.getId().equals(GlobalContext.getInstance().getCurrentAccountId())) { GlobalContext.getInstance() .registerForAccountChangeListener(myProfileInfoChangeListener); } } @Override public void onDestroy() { super.onDestroy(); Utility.cancelTasks(refreshTask, topicListTask); GlobalContext.getInstance().unRegisterForAccountChangeListener(myProfileInfoChangeListener); } private GlobalContext.MyProfileInfoChangeListener myProfileInfoChangeListener = new GlobalContext.MyProfileInfoChangeListener() { @Override public void onChange(UserBean newUserBean) { if (getActivity() == null) { return; } userBean = newUserBean; displayBasicInfo(); displayCoverPicture(); for (MessageBean msg : getList().getItemList()) { msg.setUser(newUserBean); } getAdapter().notifyDataSetChanged(); } }; public UserInfoFragment(UserBean userBean, String token) { this.userBean = userBean; this.token = token; } @Override public void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); outState.putParcelable("bean", getList()); outState.putParcelable("userBean", userBean); outState.putString("token", token); } @Override public void onActivityCreated(Bundle savedInstanceState) { switch (getCurrentState(savedInstanceState)) { case FIRST_TIME_START: displayBasicInfo(); break; case SCREEN_ROTATE: //nothing refreshLayout(getList()); displayBasicInfo(); displayCoverPicture(); if (bean.getSize() > 0) { moreFooter.setVisibility(View.VISIBLE); getListView().removeFooterView(progressFooter); } break; case ACTIVITY_DESTROY_AND_CREATE: getList().replaceData((MessageListBean) savedInstanceState.getParcelable("bean")); userBean = (UserBean) savedInstanceState.getParcelable("userBean"); token = savedInstanceState.getString("token"); getAdapter().notifyDataSetChanged(); refreshLayout(getList()); displayBasicInfo(); displayCoverPicture(); break; } super.onActivityCreated(savedInstanceState); if ((getActivity() instanceof MainTimeLineActivity) && (((MainTimeLineActivity) getActivity()).getMenuFragment()).getCurrentIndex() == LeftMenuFragment.PROFILE_INDEX) { buildActionBarAndViewPagerTitles(); } } private void fetchTopicInfoFromServer() { topicListTask = new TopicListTask(); topicListTask.executeOnExecutor(MyAsyncTask.THREAD_POOL_EXECUTOR); } @Override public void onHiddenChanged(boolean hidden) { super.onHiddenChanged(hidden); if ((getActivity() instanceof MainTimeLineActivity) && !hidden) { buildActionBarAndViewPagerTitles(); } } public void buildActionBarAndViewPagerTitles() { ((MainTimeLineActivity) getActivity()).setCurrentFragment(this); if (Utility.isDevicePort()) { ((MainTimeLineActivity) getActivity()).setTitle(getString(R.string.profile)); getActivity().getActionBar().setIcon(R.drawable.ic_menu_profile); } else { ((MainTimeLineActivity) getActivity()).setTitle(getString(R.string.profile)); getActivity().getActionBar().setIcon(R.drawable.ic_launcher); } getActivity().getActionBar().setNavigationMode(ActionBar.NAVIGATION_MODE_STANDARD); getActivity().getActionBar().removeAllTabs(); } protected void listViewItemClick(AdapterView parent, View view, int position, long id) { startActivityForResult( BrowserWeiboMsgActivity.newIntent(getList().getItem(position), GlobalContext.getInstance().getSpecialToken()), 0); } private boolean isMyself() { if (!TextUtils.isEmpty(userBean.getId())) { return userBean.getId().equals(GlobalContext.getInstance().getCurrentAccountId()); } if (!TextUtils.isEmpty(userBean.getScreen_name())) { return userBean.getScreen_name() .equals(GlobalContext.getInstance().getCurrentAccountName()); } return false; } private boolean isOpenedFromMainPage() { return getActivity() instanceof MainTimeLineActivity; } @Override protected boolean allowLoadOldMsgBeforeReachListBottom() { return false; } @Override protected void newMsgLoaderSuccessCallback(MessageListBean newValue, Bundle loaderArgs) { stopRefreshMenuAnimationIfPossible(); getListView().removeFooterView(progressFooter); if (getActivity() != null && newValue.getSize() > 0) { getList().addNewData(newValue); getAdapter().notifyDataSetChanged(); getListView().setSelectionAfterHeaderView(); getActivity().invalidateOptionsMenu(); moreFooter.setVisibility(View.VISIBLE); if (isMyself()) { MyStatusDBTask.asyncReplace(getList(), userBean.getId()); } UserBean userInfoFromServer = newValue.getItem(0).getUser(); if (userInfoFromServer != null && !isSinaWeiboBlockWeiciyuanFetchUserInfo(userInfoFromServer)) { UserInfoFragment.this.userBean = userInfoFromServer; displayBasicInfo(); displayCoverPicture(); if (getActivity() instanceof UserInfoActivity) { ((UserInfoActivity) getActivity()).setUser(userInfoFromServer); getActivity().invalidateOptionsMenu(); } } } } @Override protected void newMsgLoaderFailedCallback(WeiboException exception) { super.newMsgLoaderFailedCallback(exception); stopRefreshMenuAnimationIfPossible(); getListView().removeFooterView(progressFooter); } @Override protected void oldMsgLoaderSuccessCallback(MessageListBean newValue) { } private void readDBCache() { if (Utility.isTaskStopped(dbTask) && getList().getSize() == 0) { dbTask = new DBCacheTask(); dbTask.executeOnExecutor(MyAsyncTask.THREAD_POOL_EXECUTOR); } } @Override public void loadNewMsg() { progressFooter.setVisibility(View.VISIBLE); moreFooter.setVisibility(View.GONE); getLoaderManager().destroyLoader(MIDDLE_MSG_LOADER_ID); getLoaderManager().destroyLoader(OLD_MSG_LOADER_ID); dismissFooterView(); getLoaderManager().restartLoader(NEW_MSG_LOADER_ID, null, msgAsyncTaskLoaderCallback); } @Override protected void loadOldMsg(View view) { Intent intent = UserTimeLineActivity .newIntent(GlobalContext.getInstance().getSpecialToken(), userBean); startActivity(intent); } protected Loader<AsyncTaskLoaderResult<MessageListBean>> onCreateNewMsgLoader(int id, Bundle args) { String uid = userBean.getId(); String screenName = userBean.getScreen_name(); String sinceId = null; if (getList().getItemList().size() > 0) { sinceId = getList().getItemList().get(0).getId(); } return new StatusesByIdLoader(getActivity(), uid, screenName, token, sinceId, null, LIMITED_READ_MESSAGE_COUNT); } @Override public void scrollToTop() { Utility.stopListViewScrollingAndScrollToTop(getListView()); } @Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { super.onCreateOptionsMenu(menu, inflater); if (isMyself() && isOpenedFromMainPage()) { inflater.inflate(R.menu.actionbar_menu_newuserinfofragment_main_page, menu); MenuItem edit = menu.findItem(R.id.menu_edit); edit.setVisible(GlobalContext.getInstance().getAccountBean().isBlack_magic()); refreshItem = menu.findItem(R.id.menu_refresh_my_profile); } } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case R.id.menu_refresh_my_profile: startRefreshMenuAnimation(); finishedWatcher = new AtomicInteger(3); fetchLastestUserInfoFromServer(); fetchTopicInfoFromServer(); loadNewMsg(); return true; case R.id.menu_edit: if (isMyself() && isOpenedFromMainPage()) { Intent intent = new Intent(getActivity(), EditMyProfileActivity.class); intent.putExtra("userBean", GlobalContext.getInstance().getAccountBean().getInfo()); startActivity(intent); return true; } else { return super.onOptionsItemSelected(item); } } return super.onOptionsItemSelected(item); } private void startRefreshMenuAnimation() { LayoutInflater inflater = (LayoutInflater) getActivity() .getSystemService(Context.LAYOUT_INFLATER_SERVICE); View v = inflater.inflate(R.layout.newuserinfofragment_refresh_actionbar_view_layout, null); refreshItem.setActionView(v); } private void stopRefreshMenuAnimation() { if (refreshItem.getActionView() != null) { refreshItem.setActionView(null); } } private void stopRefreshMenuAnimationIfPossible() { if (!isMyself() || !isOpenedFromMainPage()) { return; } if (finishedWatcher == null) { return; } finishedWatcher.getAndDecrement(); if (finishedWatcher.get() == 0) { stopRefreshMenuAnimation(); } } @Override public void onPause() { super.onPause(); if (!getActivity().isChangingConfigurations() && isMyself() && isOpenedFromMainPage()) { savePositionToDB(); } } @Override protected void onListViewScrollStop() { savePositionToPositionsCache(); } private void savePositionToDB() { if (position == null) { savePositionToPositionsCache(); } MyStatusDBTask .asyncUpdatePosition(position, GlobalContext.getInstance().getCurrentAccountId()); } private void savePositionToPositionsCache() { position = Utility.getCurrentPositionFromListView(getListView()); } private void setListViewPositionFromPositionsCache() { Utility.setListViewAdapterPosition(getListView(), position != null ? position.getPosition(bean) : 0, position != null ? position.top : 0, null); } @Override public void onAnimationStart(Animator animation) { AnimationUtility.forceConvertActivityToTranslucent(getActivity()); } @Override public void onAnimationEnd(Animator animation) { if (getActivity() == null) { return; } AnimationUtility.forceConvertActivityFromTranslucent(getActivity()); displayCoverPicture(); if (isMyself() && isOpenedFromMainPage()) { readDBCache(); } else { fetchLastestUserInfoFromServer(); loadNewMsg(); fetchTopicInfoFromServer(); } } @Override public void onAnimationCancel(Animator animation) { } @Override public void onAnimationRepeat(Animator animation) { } //http://open.weibo.com/qa/index.php?qa=32088 private boolean isSinaWeiboBlockWeiciyuanFetchUserInfo(UserBean userInfoFromServer) { return userInfoFromServer.getStatuses_count().equals("0") && userInfoFromServer.getFollowers_count().equals("0") && userInfoFromServer.getFriends_count().equals("0"); } class HeaderPagerAdapter extends PagerAdapter { @Override public Object instantiateItem(ViewGroup container, int position) { View view = null; switch (position) { case 0: view = headerFirst; break; case 1: view = headerSecond; break; case 2: view = headerThird; break; } container.addView(view, 0); return view; } @Override public void destroyItem(ViewGroup container, int position, Object object) { ((ViewPager) container).removeView((View) object); } @Override public int getCount() { return userBean.isVerified() ? 3 : 2; } @Override public boolean isViewFromObject(View view, Object object) { return view == (View) object; } } private class TopicListTask extends MyAsyncTask<Void, ArrayList<String>, ArrayList<String>> { WeiboException e; @Override protected ArrayList<String> doInBackground(Void... params) { UserTopicListDao dao = new UserTopicListDao( GlobalContext.getInstance().getSpecialToken(), userBean.getId()); try { return dao.getGSONMsgList(); } catch (WeiboException e) { this.e = e; cancel(true); return null; } } @Override protected void onCancelled(ArrayList<String> strings) { super.onCancelled(strings); stopRefreshMenuAnimationIfPossible(); } @Override protected void onPostExecute(ArrayList<String> result) { super.onPostExecute(result); stopRefreshMenuAnimationIfPossible(); if (isCancelled()) { return; } if (result == null || result.size() == 0) { return; } topicList = result; topicsCount.setText(Utility.convertStateNumberToString(getActivity(), String.valueOf(result.size()))); ArrayList<String> dbCache = new ArrayList<String>(); dbCache.addAll(topicList); TopicDBTask.asyncReplace(userBean.getId(), dbCache); } } //sina api has bug,so must refresh to get actual data public void forceReloadData(UserBean bean) { this.userBean = bean; fetchLastestUserInfoFromServer(); } private void fetchLastestUserInfoFromServer() { if (Utility.isTaskStopped(refreshTask)) { refreshTask = new RefreshTask(); refreshTask.executeOnExecutor(MyAsyncTask.THREAD_POOL_EXECUTOR); } } private class RefreshTask extends MyAsyncTask<Object, UserBean, UserBean> { WeiboException e; @Override protected void onPreExecute() { super.onPreExecute(); } @Override protected UserBean doInBackground(Object... params) { if (!isCancelled()) { ShowUserDao dao = new ShowUserDao(GlobalContext.getInstance().getSpecialToken()); boolean haveId = !TextUtils.isEmpty(userBean.getId()); boolean haveName = !TextUtils.isEmpty(userBean.getScreen_name()); if (haveId) { dao.setUid(userBean.getId()); } else if (haveName) { dao.setScreen_name(userBean.getScreen_name()); } else { cancel(true); return null; } UserBean user = null; try { user = dao.getUserInfo(); } catch (WeiboException e) { this.e = e; cancel(true); } if (user == null) { cancel(true); } return user; } else { return null; } } @Override protected void onCancelled(UserBean userBean) { super.onCancelled(userBean); if (Utility.isAllNotNull(getActivity(), this.e)) { newMsgTipBar.setError(e.getError()); } stopRefreshMenuAnimationIfPossible(); } @Override protected void onPostExecute(UserBean userInfoFromServer) { if (userInfoFromServer == null || getActivity() == null) { return; } //hack to fix sina weibo issue if (isSinaWeiboBlockWeiciyuanFetchUserInfo(userInfoFromServer)) { AppLogger.e("Sina Weibo block Weiciyuan fetch user info from server!"); return; } UserInfoFragment.this.userBean = userInfoFromServer; displayBasicInfo(); displayCoverPicture(); if (getActivity() instanceof UserInfoActivity) { ((UserInfoActivity) getActivity()).setUser(userInfoFromServer); getActivity().invalidateOptionsMenu(); } for (MessageBean msg : bean.getItemList()) { msg.setUser(userInfoFromServer); } if (isMyself()) { GlobalContext.getInstance().updateUserInfo(userInfoFromServer); AccountDBTask.asyncUpdateMyProfile(GlobalContext.getInstance().getAccountBean(), userInfoFromServer); } getAdapter().notifyDataSetChanged(); stopRefreshMenuAnimationIfPossible(); super.onPostExecute(userInfoFromServer); } } private class DBCacheTask extends MyAsyncTask<Void, ArrayList<String>, MyStatusTimeLineData> { @Override protected void onPreExecute() { super.onPreExecute(); progressFooter.setVisibility(View.VISIBLE); } @Override protected MyStatusTimeLineData doInBackground(Void... params) { ArrayList<String> topicList = TopicDBTask.get(userBean.getId()); publishProgress(topicList); return MyStatusDBTask.get(userBean.getId()); } @Override protected void onProgressUpdate(ArrayList<String>... values) { super.onProgressUpdate(values); ArrayList<String> result = values[0]; if (result == null || result.size() == 0) { return; } topicList = result; topicsCount.setText(Utility.convertStateNumberToString(getActivity(), String.valueOf(result.size()))); } @Override protected void onPostExecute(MyStatusTimeLineData result) { super.onPostExecute(result); if (getActivity() == null) { return; } if (result != null && getActivity() != null) { getListView().removeFooterView(progressFooter); getList().addNewData(result.msgList); getAdapter().notifyDataSetChanged(); position = result.position; setListViewPositionFromPositionsCache(); getActivity().invalidateOptionsMenu(); moreFooter.setVisibility(View.VISIBLE); } refreshLayout(getList()); if (getList().getSize() == 0) { loadNewMsg(); } } } }