package com.jasonchen.microlang.fragments;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.text.TextUtils;
import android.util.TypedValue;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AbsListView;
import android.widget.RelativeLayout;
import android.widget.TextView;
import android.widget.Toast;
import com.jasonchen.microlang.R;
import com.jasonchen.microlang.activitys.FanListActivity;
import com.jasonchen.microlang.activitys.FollowerListActivity;
import com.jasonchen.microlang.activitys.WriteWeiboActivity;
import com.jasonchen.microlang.adapter.TimeLineAdapter;
import com.jasonchen.microlang.beans.AccountBean;
import com.jasonchen.microlang.beans.MessageBean;
import com.jasonchen.microlang.beans.MessageListBean;
import com.jasonchen.microlang.beans.UserBean;
import com.jasonchen.microlang.dao.ShowUserDao;
import com.jasonchen.microlang.dao.StatusesTimeLineDao;
import com.jasonchen.microlang.database.AccountDBTask;
import com.jasonchen.microlang.exception.WeiboException;
import com.jasonchen.microlang.settings.SettingUtility;
import com.jasonchen.microlang.swiperefresh.LoadListView;
import com.jasonchen.microlang.swiperefresh.SwipeRefreshLayout;
import com.jasonchen.microlang.utils.GlobalContext;
import com.jasonchen.microlang.utils.HackyMovementMethod;
import com.jasonchen.microlang.utils.TimeLineUtility;
import com.jasonchen.microlang.utils.ViewUtility;
import com.jasonchen.microlang.utils.file.FileLocationMethod;
import com.jasonchen.microlang.utils.http.HttpUtility;
import com.jasonchen.microlang.view.AvatarBigImageView;
import com.jasonchen.microlang.view.FloatingActionButton;
import com.jasonchen.microlang.view.HackyTextView;
import com.jasonchen.microlang.workers.TimeLineBitmapDownloader;
import java.util.ArrayList;
import java.util.List;
import java.util.zip.Inflater;
/**
* jasonchen
* 2015/04/16
*/
public class UserFragment extends AbstractAppFragment implements SwipeRefreshLayout.OnRefreshListener, LoadListView.IXListViewListener, View.OnClickListener {
private static final int REFRESH_COMPLETE = 0;
private static final int REFRESH_LOADER_ID = 1;
private static final int LOAD_OLD_STATUSES_COMPLETE = 2;
private static final int REFRESH_MYINFO = 3;
private static final int NETWORK_ERROR = 4;
private View view;
private SwipeRefreshLayout refreshLayout;
private LoadListView listView;
private TimeLineAdapter adapter;
private View header;
private AvatarBigImageView avatar;
private TextView userName;
private TextView gendel;
private TextView location;
private TextView verifyReason;
private HackyTextView description;
private HackyTextView url;
private TextView follow;
private TextView fan;
private TextView status;
private UserBean userBean;
private List<MessageBean> list;
private MyHandler handler;
public UserFragment() {
}
public static UserFragment newInstance(UserBean userBean){
UserFragment fragment = new UserFragment();
Bundle bundle = new Bundle();
bundle.putParcelable("user", userBean);
fragment.setArguments(bundle);
return fragment;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
if (view == null) {
view = inflater.inflate(R.layout.fragment_user, container, false);
}
return view;
}
@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
refreshLayout = ViewUtility.findViewById(view, R.id.refreshLayout);
listView = ViewUtility.findViewById(view, R.id.listView);
refreshLayout.setColorSchemeColors(getResources().getColor(SettingUtility.getThemeColor()));
refreshLayout.setOnRefreshListener(this);
listView.setXListViewListener(this);
listView.setPullLoadEnable(true);
listView.setDivider(null);
userBean = getArguments().getParcelable("user");
list = new ArrayList<MessageBean>();
handler = new MyHandler();
initHeader();
initListView();
getWeiboList();
}
private void getWeiboList() {
refreshLayout.setProgressViewOffset(false, 0, (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 48, getResources().getDisplayMetrics()));
refreshLayout.setRefreshing(true);
asyncDownloadMessage();
}
private void asyncDownloadMessage() {
new Thread() {
public void run() {
StatusesTimeLineDao dao = new StatusesTimeLineDao(GlobalContext
.getInstance().getSpecialToken(), userBean.getId());
dao.setCount(String.valueOf(20));
try {
MessageListBean bean = dao.getGSONMsgList();
Message msg = Message.obtain();
msg.what = REFRESH_COMPLETE;
msg.obj = bean;
handler.sendMessage(msg);
} catch (WeiboException e) {
e.printStackTrace();
Message msg = Message.obtain();
msg.what = NETWORK_ERROR;
msg.obj = e.getError();
handler.sendMessage(msg);
}
}
;
}.start();
}
private void asyncLoadOldStatus() {
if (list != null && list.size() > 0) {
long maxId = list.get(list.size() - 1).getIdLong();
final String max_id = String.valueOf(maxId - 1);
new Thread() {
public void run() {
StatusesTimeLineDao dao = new StatusesTimeLineDao(GlobalContext
.getInstance().getSpecialToken(), userBean.getId());
dao.setCount(String.valueOf(20));
dao.setMax_id(max_id);
try {
MessageListBean bean = dao.getGSONMsgList();
Message msg = Message.obtain();
msg.what = LOAD_OLD_STATUSES_COMPLETE;
msg.obj = bean;
handler.sendMessage(msg);
} catch (WeiboException e) {
e.printStackTrace();
Message msg = Message.obtain();
msg.what = NETWORK_ERROR;
msg.obj = e.getError();
handler.sendMessage(msg);
}
}
;
}.start();
} else {
listView.getFooterView().hide();
Toast.makeText(GlobalContext.getInstance(), getString(R.string.empty), Toast.LENGTH_SHORT).show();
}
}
private void initListView() {
adapter = new TimeLineAdapter(this, listView, list);
listView.setAdapter(adapter);
listView.addHeaderView(header);
listView.getFooterView().hide();
listView.setOnScrollListener(new LoadListView.OnXScrollListener() {
@Override
public void onXScrolling(View view) {
}
@Override
public void onScrollStateChanged(AbsListView absListView, int i) {
switch (i) {
case AbsListView.OnScrollListener.SCROLL_STATE_IDLE:
TimeLineBitmapDownloader.getInstance()
.setPauseDownloadWork(false);
TimeLineBitmapDownloader.getInstance().setPauseReadWork(
false);
break;
case AbsListView.OnScrollListener.SCROLL_STATE_FLING:
adapter.setIsFling(true);
TimeLineBitmapDownloader.getInstance()
.setPauseDownloadWork(true);
TimeLineBitmapDownloader.getInstance().setPauseReadWork(
true);
break;
case AbsListView.OnScrollListener.SCROLL_STATE_TOUCH_SCROLL:
adapter.setIsFling(true);
TimeLineBitmapDownloader.getInstance()
.setPauseDownloadWork(true);
TimeLineBitmapDownloader.getInstance().setPauseReadWork(
true);
break;
}
}
@Override
public void onScroll(AbsListView absListView, int i, int i1, int i2) {
}
});
}
private void initHeader() {
LayoutInflater inflater = getActivity().getLayoutInflater();
header = inflater.inflate(R.layout.userdetail_header_layout, listView, false);
avatar = ViewUtility.findViewById(header, R.id.avatar);
userName = ViewUtility.findViewById(header, R.id.username);
gendel = ViewUtility.findViewById(header, R.id.gendel);
location = ViewUtility.findViewById(header, R.id.location);
description = ViewUtility.findViewById(header, R.id.description);
verifyReason = ViewUtility.findViewById(header, R.id.verify_reason);
url = ViewUtility.findViewById(header, R.id.url);
follow = ViewUtility.findViewById(header, R.id.follow_list);
fan = ViewUtility.findViewById(header, R.id.fan_list);
status = ViewUtility.findViewById(header, R.id.weibo_list);
buildContent();
follow.setOnClickListener(this);
status.setOnClickListener(this);
fan.setOnClickListener(this);
}
private void buildContent() {
TimeLineBitmapDownloader.getInstance().display(
avatar.getImageView(),
avatar.getImageView().getWidth(),
avatar.getImageView().getHeight(),
userBean.getAvatar_large(),
FileLocationMethod.avatar_large, false);
avatar.checkVerified(userBean);
userName.setText(userBean.getScreen_name());
if(!TextUtils.isEmpty(userBean.getGender())) {
gendel.setText("f".equals(userBean.getGender()) ? getString(R.string.f) : getString(R.string.m));
}else{
gendel.setVisibility(View.GONE);
}
if(!TextUtils.isEmpty(userBean.getLocation())){
location.setText(userBean.getLocation());
}else{
location.setVisibility(View.GONE);
}
if(!TextUtils.isEmpty(userBean.getDescription())){
description.setVisibility(View.VISIBLE);
description.setText(userBean.getDescription());
TimeLineUtility.addLinks(description);
description.setMovementMethod(HackyMovementMethod.getInstance());
}
if(!TextUtils.isEmpty(userBean.getVerified_reason())){
verifyReason.setVisibility(View.VISIBLE);
verifyReason.setText("认证:" + userBean.getVerified_reason());
}
if(!TextUtils.isEmpty(userBean.getUrl())){
url.setVisibility(View.VISIBLE);
url.setText(userBean.getUrl());
TimeLineUtility.addLinks(url);
url.setMovementMethod(HackyMovementMethod.getInstance());
}
follow.setText("关注 " + userBean.getFriends_count());
fan.setText("粉丝 " + userBean.getFollowers_count());
status.setText("微博 " + userBean.getStatus_count());
}
protected LoadListView getListView(){
return listView;
}
@Override
public void onRefresh() {
if(GlobalContext.getInstance().getAccountBean().getUid().equals(userBean.getId())){
refreshMyInfo();
}else{
refreshLayout.setRefreshing(false);
}
}
private void refreshMyInfo() {
new Thread(){
@Override
public void run() {
super.run();
ShowUserDao dao = new ShowUserDao(GlobalContext.getInstance().getSpecialToken());
dao.setUid(userBean.getId());
try {
UserBean newuserBean = dao.getUserInfo();
Message msg = Message.obtain();
msg.what = REFRESH_MYINFO;
msg.obj = newuserBean;
handler.sendMessage(msg);
} catch (WeiboException e) {
e.printStackTrace();
Message msg = Message.obtain();
msg.what = NETWORK_ERROR;
msg.obj = e.getError();
handler.sendMessage(msg);
}
}
}.start();
}
@Override
public void onLoadMore() {
asyncLoadOldStatus();
}
@Override
public void onClick(View view) {
switch (view.getId()){
case R.id.follow_list:
getActivity().startActivity(FollowerListActivity.newIntent(getActivity(), userBean.getId()));
getActivity().overridePendingTransition(R.anim.push_left_in, R.anim.stay);
break;
case R.id.fan_list:
getActivity().startActivity(FanListActivity.newIntent(getActivity(), userBean.getId()));
getActivity().overridePendingTransition(R.anim.push_left_in, R.anim.stay);
break;
}
}
private class MyHandler extends Handler{
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
switch (msg.what) {
case REFRESH_COMPLETE:
MessageListBean result = new MessageListBean();
result.replaceData((MessageListBean) msg.obj);
adapter.setList(result.getItemList());
list.clear();
list.addAll(result.getItemList());
adapter.notifyDataSetChanged();
listView.getFooterView().show();
refreshLayout.setRefreshing(false);
if (list.size() > 0) {
listView.getFooterView().show();
} else {
listView.getFooterView().hide();
}
break;
case LOAD_OLD_STATUSES_COMPLETE:
MessageListBean oldResult = (MessageListBean) msg.obj;
int number = oldResult.getSize();
if (number > 0) {
list.addAll(list.size(), oldResult.getItemList());
adapter.setList(list);
adapter.notifyDataSetChanged();
listView.stopLoadMore();
Toast.makeText(GlobalContext.getInstance(), String.format(getString(R.string.old_messages_count), number), Toast.LENGTH_SHORT).show();
} else {
listView.stopLoadMore();
listView.getFooterView().hide();
listView.setPullLoadEnable(false);
Toast.makeText(GlobalContext.getInstance(), getString(R.string.older_message_empty), Toast.LENGTH_SHORT).show();
}
break;
case REFRESH_MYINFO:
UserBean newUserBean = (UserBean) msg.obj;
userBean = newUserBean;
AccountDBTask.asyncUpdateMyProfile(GlobalContext.getInstance().getAccountBean(), userBean);
AccountBean accountBean = GlobalContext.getInstance().getAccountBean();
accountBean.setInfo(userBean);
GlobalContext.getInstance().setAccountBean(accountBean);
buildContent();
refreshLayout.setRefreshing(false);
break;
case NETWORK_ERROR:
listView.stopLoadMore();
refreshLayout.setRefreshing(false);
String errStr = (String) msg.obj;
Toast.makeText(GlobalContext.getInstance(), errStr, Toast.LENGTH_SHORT).show();
break;
}
}
}
@Override
public void onResume() {
super.onResume();
adapter.notifyDataSetChanged();
}
@Override
public void onDestroy() {
super.onDestroy();
}
}