package com.gnod.geekr.ui.activity; import java.util.ArrayList; import java.util.Random; import android.content.Intent; import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; import android.view.View.OnClickListener; import android.widget.AbsListView; import android.widget.ImageView; import android.widget.ProgressBar; import android.widget.TextView; import com.actionbarsherlock.view.Menu; import com.actionbarsherlock.view.MenuItem; import com.gnod.geekr.R; import com.gnod.geekr.app.AppConfig; import com.gnod.geekr.app.adapter.ProfileTimelineAdapter; import com.gnod.geekr.model.AccountModel; import com.gnod.geekr.model.StatusModel; import com.gnod.geekr.model.UserInfoModel; import com.gnod.geekr.tool.GeekrTool; import com.gnod.geekr.tool.LaunchHelper; import com.gnod.geekr.tool.WeiboBaseTool; import com.gnod.geekr.tool.StringUtils; import com.gnod.geekr.tool.ToastHelper; import com.gnod.geekr.tool.fetcher.BaseFetcher; import com.gnod.geekr.tool.fetcher.BaseFetcher.FetchCompleteListener; import com.gnod.geekr.tool.fetcher.NoticeFetcher; import com.gnod.geekr.tool.fetcher.ProfileFetcher; import com.gnod.geekr.tool.manager.AccountManager; import com.gnod.geekr.tool.manager.DrawableManager; import com.gnod.geekr.widget.ColorToast; import com.gnod.geekr.widget.ColorToast.ToastColor; import com.gnod.geekr.widget.GeekrPanel; import com.gnod.geekr.widget.ListViewFooter; import com.gnod.geekr.widget.ParallaxScollListView; public class ProfileActivity extends BaseActivity { private ProfileTimelineAdapter userStatusAdapter; private ParallaxScollListView statusListView; private ProfileFetcher mProfileFetcher; private DrawableManager drawManager; private ArrayList<StatusModel> mList = new ArrayList<StatusModel>(); private View layoutUserInfo; private UserHeadView headView; private boolean isSelfInfo = false; private boolean allLoaded = false; private UserInfoModel user; private int[] backgrondIds = { R.drawable.header_photo_001, R.drawable.header_photo_002, R.drawable.header_photo_003, R.drawable.header_photo_004, R.drawable.header_photo_005, R.drawable.header_photo_006, R.drawable.header_photo_007, R.drawable.header_photo_008, R.drawable.header_photo_009 }; private MenuItem refresh; private ListViewFooter footer; private ColorToast toastTop; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_profile); mProfileFetcher = new ProfileFetcher(); drawManager = AppConfig.getDrawableManager(); Intent intent = this.getIntent(); user = (UserInfoModel)intent.getSerializableExtra("UserInfoModel"); if(user == null) finish(); if(!StringUtils.isNullOrEmpty(intent.getStringExtra("IsSelfInfo"))){ isSelfInfo = true; } initView(); bindListener(); bindView(); } @Override protected void onResume() { super.onResume(); AppConfig.sImageFetcher.setExitTasksEarly(false); } @Override protected void onPause() { super.onPause(); AppConfig.sImageFetcher.setPauseWork(false); AppConfig.sImageFetcher.setExitTasksEarly(true); AppConfig.sImageFetcher.flushCache(); } @Override public boolean onCreateOptionsMenu(Menu menu) { getSupportMenuInflater().inflate(R.menu.menu_refresh, menu); refresh = menu.findItem(R.id.menu_refresh); setRefreshing(true); footer.startLoading(); fetchView(); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case android.R.id.home: finish(); return true; case R.id.menu_refresh: setRefreshing(true); footer.startLoading(); allLoaded = false; fetchView(); return true; } return super.onOptionsItemSelected(item); } private void setRefreshing(boolean checked) { if(refresh != null){ if(checked) refresh.setActionView(R.layout.layout_loading); else refresh.setActionView(null); } } private void initView() { statusListView = (ParallaxScollListView)findViewById(R.id.view_profile_list); toastTop = (ColorToast)findViewById(R.id.view_profile_top); headView = new UserHeadView(); layoutUserInfo = LayoutInflater.from(this).inflate(R.layout.listitem_profile_header, null); headView.layoutContent = layoutUserInfo.findViewById(R.id.layout_profile_frame); headView.imageBackground = (ImageView)layoutUserInfo.findViewById(R.id.image_profile_bg); headView.imageAvatar = (ImageView)layoutUserInfo.findViewById(R.id.image_profile_avatar); headView.imageVerified = (ImageView)layoutUserInfo.findViewById(R.id.image_profile_verified); headView.imageGender = (ImageView)layoutUserInfo.findViewById(R.id.image_profile_gender); headView.textName = (TextView) layoutUserInfo.findViewById(R.id.text_profile_name); headView.textLocation = (TextView)layoutUserInfo.findViewById(R.id.text_profile_location); headView.layoutDescription = layoutUserInfo.findViewById(R.id.layout_profile_description); headView.textDescription = (TextView)layoutUserInfo.findViewById(R.id.text_profile_description); headView.textverifiedReason = (TextView)layoutUserInfo.findViewById(R.id.text_profile_verified_reason); headView.textFollowersCount = (TextView)layoutUserInfo.findViewById(R.id.text_profile_followers_count); headView.textFriendsCount = (TextView)layoutUserInfo.findViewById(R.id.text_profile_friends_count); headView.textStatusesCount = (TextView)layoutUserInfo.findViewById(R.id.text_profile_statuses_count); headView.layoutBtnView = layoutUserInfo.findViewById(R.id.layout_profile_btn); headView.btnFollowState = layoutUserInfo.findViewById(R.id.btn_profile_follow); headView.progressIndicate = (ProgressBar)layoutUserInfo.findViewById(R.id.view_profile_follow_progress); headView.textFollowState = (TextView)layoutUserInfo.findViewById(R.id.text_profile_followstate); headView.layoutFansCounts = layoutUserInfo.findViewById(R.id.layout_fans_counts); headView.layoutFollowsCounts = layoutUserInfo.findViewById(R.id.layout_follows_counts); headView.layoutStatusCounts = layoutUserInfo.findViewById(R.id.layout_status_counts); footer = new ListViewFooter(this); statusListView.addHeaderView(layoutUserInfo); statusListView.addFooterView(footer); userStatusAdapter = new ProfileTimelineAdapter(this, mList); userStatusAdapter.setSelfFlag(isSelfInfo); userStatusAdapter.setOnPanelItemClickListener(onPanelItemClicked); statusListView.setAdapter(userStatusAdapter); } private void bindListener() { statusListView.setOnScrollListener(new AbsListView.OnScrollListener() { private boolean lastViewVisible = false; @Override public void onScrollStateChanged(AbsListView view, int scrollState) { } @Override public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { if(mList.size() == 0) return; if(firstVisibleItem + visibleItemCount >= totalItemCount && !lastViewVisible) { lastViewVisible = true; if(allLoaded == false && !footer.isLoading()) { setRefreshing(true); footer.startLoading(); long maxId = Long.parseLong(mList.get(mList.size() - 1).ID); mProfileFetcher.fetchUserStatus(user.userID, user.nickName, 0, maxId, 20, 1, onStatusListener); } } else if(firstVisibleItem + visibleItemCount < totalItemCount) { lastViewVisible = false; } } }); } private GeekrPanel.OnItemClcikListener onPanelItemClicked = new GeekrPanel.OnItemClcikListener() { @Override public void onClick(final int position, View v) { switch (v.getId()) { case R.id.sd_btn_fav: WeiboBaseTool.getInstance().favoriteStatus( mList.get(position).ID); break; case R.id.sd_btn_copy: GeekrTool.copyTextToClipboard( mList.get(position).content); break; case R.id.sd_btn_ret: LaunchHelper.startRetweetActivity(v.getContext(), mList.get(position)); break; case R.id.sd_btn_cmt: LaunchHelper.startCommentActivity(v.getContext(), mList.get(position)); break; case R.id.sd_btn_del: ProfileFetcher mProfileFetcher = new ProfileFetcher(); StatusModel item = mList.get(position); mProfileFetcher.deleteStatus(item.ID, new FetchCompleteListener() { @Override public void fetchComplete(int state, int errorCode, Object obj) { if(state == BaseFetcher.FETCH_SUCCEED_NEWS){ mList.remove(position); userStatusAdapter.notifyDataSetChanged(); toastTop.show("删除成功", ToastColor.BLUE); } else { toastTop.show("删除失败", ToastColor.RED); } } }); default: break; } } }; private void bindView() { setTitle("个人主页"); setMagicImage(); // drawManager.loadAvatar(user.largeIconURL, headView.imageAvatar, false); AppConfig.sImageFetcher.loadImage( user.largeIconURL, headView.imageAvatar, R.drawable.avatar_default); } private void setMagicImage() { int backIdx = 0; if (!StringUtils.isNullOrEmpty(user.userID)) { backIdx = (int) Math.abs((Long.parseLong(user.userID)) % backgrondIds.length); } else if (!StringUtils.isNullOrEmpty(user.nickName)) { backIdx = Math.abs(user.nickName.hashCode()) % backgrondIds.length; } else { backIdx = Math.abs(new Random().nextInt()) % backgrondIds.length; } headView.imageBackground.setImageResource(backgrondIds[backIdx]); statusListView.setParallaxImageView(headView.imageBackground); } @Override public void onWindowFocusChanged(boolean hasFocus) { super.onWindowFocusChanged(hasFocus); statusListView.setViewsBounds(ParallaxScollListView.ZOOM_X2); } private void fetchView() { mProfileFetcher.fetchUserInfo(user.userID, user.nickName, onUserInfoListener); mProfileFetcher.fetchUserStatus(user.userID, user.nickName, 0, 0, 10, 1, onStatusListener); } private void updateUserView(final UserInfoModel userInfo) { if(isSelfInfo) { AccountModel account = AccountManager.getActivityAccount(); account.name = userInfo.nickName; account.iconURL = userInfo.iconURL; AccountManager.updateActivityAccount(account); headView.layoutBtnView.setVisibility(View.GONE); } else { headView.layoutBtnView.setVisibility(View.VISIBLE); setFollowState(userInfo.followed); headView.btnFollowState.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { headView.progressIndicate.setVisibility(View.VISIBLE); mProfileFetcher.setFriendships(!userInfo.followed, userInfo.userID, userInfo.nickName, new FetchCompleteListener() { @Override public void fetchComplete(int state, int code, Object obj) { headView.progressIndicate.setVisibility(View.GONE); if(state != NoticeFetcher.FETCH_SUCCEED_NEWS) { return; } userInfo.followed = !userInfo.followed; setFollowState(userInfo.followed); } }); } }); } // drawManager.loadAvatar(userInfo.largeIconURL, // headView.imageAvatar, false); AppConfig.sImageFetcher.loadImage( userInfo.largeIconURL, headView.imageAvatar, R.drawable.avatar_default); headView.textName.setText(userInfo.nickName); if(!StringUtils.isNullOrEmpty(userInfo.description)) { headView.layoutDescription.setVisibility(View.VISIBLE); headView.textDescription.setText(userInfo.description); } else { headView.layoutDescription.setVisibility(View.GONE); } headView.textLocation.setText(userInfo.location); headView.textFollowersCount.setText(userInfo.followersCount); headView.layoutFansCounts.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(v.getContext(), FriendListActivity.class); intent.putExtra("UserInfoModel", userInfo); intent.putExtra("Type", FriendListActivity.TYPE_FOLLOWERS); v.getContext().startActivity(intent); } }); headView.textFriendsCount.setText(userInfo.friendsCount); headView.layoutFollowsCounts.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(v.getContext(), FriendListActivity.class); intent.putExtra("UserInfoModel", userInfo); intent.putExtra("Type", FriendListActivity.TYPE_FOLLOWING); v.getContext().startActivity(intent); } }); headView.textStatusesCount.setText(userInfo.statusCount); headView.layoutStatusCounts.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { if(mList.size() > 0) statusListView.setSelection(1); } }); headView.textverifiedReason.setText(userInfo.verifiedReason); if(!StringUtils.isNullOrEmpty(userInfo.verifiedReason)){ switch (userInfo.verifiedType) { case 0: headView.imageVerified.setVisibility(View.VISIBLE); headView.imageVerified.setImageResource(R.drawable.userinfo_ic_verified); break; case 2: case 3: case 7: headView.imageVerified.setVisibility(View.VISIBLE); headView.imageVerified.setImageResource(R.drawable.userinfo_ic_verified_blue); break; case 220: headView.imageVerified.setVisibility(View.VISIBLE); headView.imageVerified.setImageResource(R.drawable.ic_daren); break; default: headView.imageVerified.setVisibility(View.GONE); break; } } switch (userInfo.getGender()) { case 0: headView.imageGender.setImageResource(R.drawable.ic_boy); break; case 1: headView.imageGender.setImageResource(R.drawable.ic_girl); break; default: break; } } private void setFollowState(boolean followed) { int bgId; String text = ""; if(followed == true) { bgId = R.drawable.bg_grey; text = "取消关注"; } else { bgId = R.drawable.bg_blue; text = "关注"; } headView.btnFollowState.setBackgroundResource(bgId); headView.textFollowState.setText(text); } private FetchCompleteListener onUserInfoListener = new FetchCompleteListener() { @Override public void fetchComplete(int state, int code, Object info) { switch (state) { case NoticeFetcher.FETCH_NOT_NETWORK: case NoticeFetcher.FETCH_AUTH_FAILED: toastTop.show((String) info, ToastColor.RED); break; case NoticeFetcher.FETCH_EMPTY: break; case NoticeFetcher.FETCH_FAILED: if(code == 20003) { ToastHelper.show("该用户不存在", 2); finish(); } break; case NoticeFetcher.FETCH_SUCCEED_NEWS: if(info != null){ UserInfoModel userInfo = (UserInfoModel)info; if(userInfo.userID.equals(AccountManager.getActivityAccount().uID)){ isSelfInfo = true; } updateUserView(userInfo); } break; default: break; } } }; private FetchCompleteListener onStatusListener = new FetchCompleteListener() { @SuppressWarnings("unchecked") @Override public void fetchComplete(int state, int code, Object obj) { setRefreshing(false); switch (state) { case NoticeFetcher.FETCH_NOT_NETWORK: case NoticeFetcher.FETCH_AUTH_FAILED: toastTop.show((String) obj, ToastColor.RED); footer.stopLoading("-FAILED-"); break; case NoticeFetcher.FETCH_EMPTY: footer.stopLoading("-NO STATUS-"); break; case NoticeFetcher.FETCH_FAILED: footer.stopLoading(""); break; case NoticeFetcher.FETCH_SUCCEED_NEWS: ArrayList<StatusModel> lists = (ArrayList<StatusModel>)obj; mList.clear(); mList.addAll(lists); userStatusAdapter.notifyDataSetChanged(); statusListView.setSelection(0); if(lists.size() < 5) { allLoaded = true; footer.stopLoading("-END-"); } else { footer.stopLoading("-MORE-"); } break; case NoticeFetcher.FETCH_SUCCEED_MORE: ArrayList<StatusModel> resultList = (ArrayList<StatusModel>)obj; if(resultList.size() > 1){ int lastIndex = mList.size() - 1; mList.remove(lastIndex); mList.addAll(resultList); userStatusAdapter.notifyDataSetChanged(); } if(resultList.size() < 5) { allLoaded = true; footer.stopLoading("-END-"); } else { footer.stopLoading("-MORE-"); } break; default: footer.stopLoading(""); } } }; public class UserHeadView { public View layoutContent; public ImageView imageBackground; public ImageView imageAvatar; public ImageView imageVerified; public ImageView imageGender; public TextView textName; public TextView textLocation; public View layoutDescription; public TextView textDescription; public View layoutBtnView; public View btnFollowState; public ProgressBar progressIndicate; public TextView textFollowState; public TextView textverifiedReason; public TextView textFollowersCount; public TextView textFriendsCount; public TextView textStatusesCount; public View layoutFansCounts; public View layoutFollowsCounts; public View layoutStatusCounts; } }