package net.coding.program.project.detail;
import android.content.Context;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.animation.Animation;
import android.view.animation.AnimationUtils;
import android.widget.ImageView;
import net.coding.program.FootUpdate;
import net.coding.program.R;
import net.coding.program.common.BlankViewDisplay;
import net.coding.program.common.Global;
import net.coding.program.common.MyImageGetter;
import net.coding.program.common.base.CustomMoreFragment;
import net.coding.program.model.DynamicObject;
import net.coding.program.model.ProjectObject;
import net.coding.program.model.TaskObject;
import net.coding.program.project.DateSectionDynamicAdapter;
import org.androidannotations.annotations.AfterViews;
import org.androidannotations.annotations.EFragment;
import org.androidannotations.annotations.FragmentArg;
import org.androidannotations.annotations.ViewById;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import se.emilsjolander.stickylistheaders.ExpandableStickyListHeadersListView;
@EFragment(R.layout.fragment_project_dynamic)
public class ProjectDynamicFragment extends CustomMoreFragment implements FootUpdate.LoadMore {
final String HOST = Global.HOST_API + "/project/%d/activities?last_id=%s&user_id=%s&type=%s";
final String HOST_USER = Global.HOST_API + "/project/%d/activities/user/%s?last_id=%s";
final String TAG_PROJECT_DYNMAIC = "TAG_PROJECT_DYNMAIC";
@FragmentArg
protected ProjectObject mProjectObject;
@FragmentArg
protected String mType;
@FragmentArg
protected int mUser_id;
@FragmentArg
protected TaskObject.Members mMember;
@ViewById
protected View blankLayout;
@ViewById
protected ExpandableStickyListHeadersListView listView;
int mLastId = UPDATE_ALL_INT;
boolean mNoMore = false;
ArrayList<DynamicObject.DynamicBaseObject> mData = new ArrayList<>();
ProjectDynamicAdapter mAdapter;
String sToday = "";
String sYesterday = "";
View.OnClickListener onClickRetry = new View.OnClickListener() {
@Override
public void onClick(View v) {
onRefresh();
}
};
private LayoutInflater inflater;
private SimpleDateFormat mDataDyanmicItem = new SimpleDateFormat("HH:mm");
private MyImageGetter myImageGetter;
private LoadingAnimation mLoadingAnimation;
protected void destoryLoadingAnimation() {
if (mLoadingAnimation != null) {
mLoadingAnimation.destory();
mLoadingAnimation = null;
}
}
@Override
public void onCreate(Bundle saveInstanceState) {
super.onCreate(saveInstanceState);
setHasOptionsMenu(true);
mAdapter = new ProjectDynamicAdapter(getContext(), myImageGetter, this);
}
@AfterViews
final protected void init() {
initRefreshLayout();
mLoadingAnimation = new LoadingAnimation();
mLoadingAnimation.startAnimation();
myImageGetter = new MyImageGetter(getActivity());
inflater = LayoutInflater.from(getActivity());
Calendar calendar = Calendar.getInstance();
Long today = calendar.getTimeInMillis();
sToday = Global.mDateFormat.format(today);
Long yesterday = calendar.getTimeInMillis() - 1000 * 60 * 60 * 24;
sYesterday = Global.mDateFormat.format(yesterday);
mLastId = UPDATE_ALL_INT;
listView.setDividerHeight(0);
mFootUpdate.init(listView, mInflater, this);
listView.setAdapter(mAdapter);
loadMore();
}
@Override
public void loadMore() {
mLastId = mAdapter.lastId();
String getUrl;
if (mUser_id == 0) {
getUrl = String.format(HOST, mProjectObject.getId(), mLastId, mProjectObject.owner_id, mType);
} else {
getUrl = String.format(HOST_USER, mProjectObject.getId(), mUser_id, mLastId);
}
getNetwork(getUrl, TAG_PROJECT_DYNMAIC, 0, mLastId);
}
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
if (mMember != null) {
inflater.inflate(R.menu.common_more, menu);
}
super.onCreateOptionsMenu(menu, inflater);
}
@Override
public void onRefresh() {
mAdapter.resetLastId();
mLastId = mAdapter.lastId();
loadMore();
}
@Override
public void parseJson(int code, JSONObject respanse, String tag, int pos, Object data) throws JSONException {
if (tag.equals(TAG_PROJECT_DYNMAIC)) {
if (((int) data) == UPDATE_ALL_INT) {
if (mLoadingAnimation != null) {
mLoadingAnimation.destory();
mLoadingAnimation = null;
}
setRefreshing(false);
if (code == 0) {
mData.clear();
}
}
if (code == 0) {
JSONArray array = respanse.getJSONArray("data");
for (int i = 0; i < array.length(); ++i) {
JSONObject json = array.getJSONObject(i);
DynamicObject.DynamicBaseObject baseObject = getDynamicObject(json, mProjectObject.getId());
mData.add(baseObject);
}
if (array.length() == 0) {
mNoMore = true;
mAdapter.setHasMore(false);
mFootUpdate.dismiss();
} else {
mNoMore = false;
mAdapter.setHasMore(true);
mFootUpdate.showLoading();
}
BlankViewDisplay.setBlank(mData.size(), this, true, blankLayout, onClickRetry);
mAdapter.resetData(mData);
} else {
if (mData.isEmpty()) {
mFootUpdate.dismiss();
} else {
mFootUpdate.showFail();
}
showErrorMsg(code, respanse);
BlankViewDisplay.setBlank(mData.size(), this, false, blankLayout, onClickRetry);
}
}
}
public static DynamicObject.DynamicBaseObject getDynamicObject(JSONObject json, int projectId) throws JSONException {
String itemType = json.optString("target_type");
DynamicObject.DynamicBaseObject baseObject;
if (itemType.equals("ProjectMember")) {
baseObject = new DynamicObject.DynamicProjectMember(json);
} else if (itemType.equals("Depot")) { // 项目分支
baseObject = new DynamicObject.DynamicDepotPush(json);
} else if (itemType.equals("Task")) {
baseObject = new DynamicObject.DynamicTask(json);
} else if (itemType.equals("ProjectFile")) {
baseObject = new DynamicObject.DynamicProjectFile(json).projectId(projectId);
} else if (itemType.equals("QcTask")) {
baseObject = new DynamicObject.DynamicQcTask(json);
} else if (itemType.equals("ProjectTopic")) {
baseObject = new DynamicObject.DynamicProjectTopic(json);
} else if (itemType.equals("Project")) {
baseObject = new DynamicObject.DynamicProject(json);
} else if (itemType.equals("ProjectStar")) {
baseObject = new DynamicObject.ProjectStar(json);
} else if (itemType.equals("ProjectWatcher")) {
baseObject = new DynamicObject.ProjectWatcher(json);
} else if (itemType.equals("PullRequestComment")) {
baseObject = new DynamicObject.PullRequestComment(json);
} else if (itemType.equals("PullRequestBean")) {
baseObject = new DynamicObject.PullRequestBean(json);
} else if (itemType.equals("MergeRequestComment")) {
baseObject = new DynamicObject.MergeRequestComment(json);
} else if (itemType.equals("MergeRequestBean")) {
baseObject = new DynamicObject.MergeRequestBean(json);
} else if (itemType.equals("TaskComment")) {
baseObject = new DynamicObject.MyTaskComment(json);
} else if (itemType.equals("CommitLineNote")) {
baseObject = new DynamicObject.CommitLineNote(json);
} else if (itemType.equals("ProjectFileComment")) {
baseObject = new DynamicObject.DynamicProjectFileComment(json);
} else {
Log.e("", "新的动态类型 " + itemType);
baseObject = new DynamicObject.DynamicBaseObject(json);
}
return baseObject;
}
protected int getListSectionResourceId() {
return R.layout.fragment_project_dynamic_list_head;
}
@Override
protected String getLink() {
return mProjectObject.getPath() + "/members/" + mMember.user.global_key;
}
class LoadingAnimation {
ImageView loadingLogo;
ImageView loadingRound;
View v;
private Animation loadingLogoAnimation;
private Animation loadingRoundAnimation;
public LoadingAnimation() {
v = getActivity().getLayoutInflater().inflate(R.layout.common_loading, null);
this.loadingLogo = (ImageView) v.findViewById(R.id.loading_logo);
this.loadingRound = (ImageView) v.findViewById(R.id.loading_round);
loadingLogoAnimation = AnimationUtils.loadAnimation(getActivity(), R.anim.loading_alpha);
loadingRoundAnimation = AnimationUtils.loadAnimation(getActivity(), R.anim.loading_rotate);
((ViewGroup) getView()).addView(v);
}
public void startAnimation() {
loadingRoundAnimation.setStartTime(500L);//不然会跳帧
loadingRound.setAnimation(loadingRoundAnimation);
loadingLogo.startAnimation(loadingLogoAnimation);
}
public void destory() {
((ViewGroup) getView()).removeView(v);
}
}
private class ProjectDynamicAdapter extends DateSectionDynamicAdapter {
public ProjectDynamicAdapter(Context context, MyImageGetter imageGetter, FootUpdate.LoadMore loader) {
super(context, imageGetter, loader);
}
@Override
public void afterGetView(int position, View convertView, ViewGroup parent, DateSectionDynamicAdapter.ViewHolder holder) {
super.afterGetView(position, convertView, parent, holder);
if (position < mProjectObject.un_read_activities_count) {
holder.timeLinePoint.setBackgroundResource(R.drawable.ic_dynamic_timeline_new);
} else {
holder.timeLinePoint.setBackgroundResource(R.drawable.ic_dynamic_timeline_old);
}
if (position == mProjectObject.un_read_activities_count - 1) {
holder.divideLeft.setVisibility(View.VISIBLE);
holder.timeLineDown.setVisibility(View.INVISIBLE);
} else {
holder.divideLeft.setVisibility(View.INVISIBLE);
}
if (position == mProjectObject.un_read_activities_count) {
holder.timeLineUp.setVisibility(View.INVISIBLE);
}
}
}
}