package net.coding.program.project.detail;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.view.ViewPager;
import android.util.TypedValue;
import android.view.View;
import com.melnykov.fab.FloatingActionButton;
import net.coding.program.MyApp;
import net.coding.program.R;
import net.coding.program.common.BlankViewDisplay;
import net.coding.program.common.Global;
import net.coding.program.common.ListModify;
import net.coding.program.common.SaveFragmentPagerAdapter;
import net.coding.program.common.ui.BaseFragment;
import net.coding.program.model.AccountInfo;
import net.coding.program.model.ProjectObject;
import net.coding.program.model.TaskObject;
import net.coding.program.task.TaskListParentUpdate;
import net.coding.program.task.TaskListUpdate;
import net.coding.program.task.add.TaskAddActivity;
import net.coding.program.task.add.TaskAddActivity_;
import net.coding.program.third.MyPagerSlidingTabStrip;
import org.androidannotations.annotations.AfterViews;
import org.androidannotations.annotations.Click;
import org.androidannotations.annotations.EFragment;
import org.androidannotations.annotations.FragmentArg;
import org.androidannotations.annotations.OnActivityResult;
import org.androidannotations.annotations.ViewById;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.lang.ref.WeakReference;
import java.util.ArrayList;
import java.util.List;
@EFragment(R.layout.fragment_project_task)
public class ProjectTaskFragment extends BaseFragment implements TaskListParentUpdate, TaskListFragment.FloatButton {
final String HOST_MEMBERS = Global.HOST_API + "/project/%d/members?pageSize=1000";
@FragmentArg
ProjectObject mProjectObject;
@ViewById
MyPagerSlidingTabStrip tabs;
@ViewById(R.id.pagerProjectTask)
ViewPager pager;
@ViewById
View blankLayout;
@ViewById
FloatingActionButton floatButton;
ArrayList<TaskObject.Members> mUsersInfo = new ArrayList<>();
ArrayList<TaskObject.Members> mMembersAll = new ArrayList<>();
ArrayList<TaskObject.Members> mMembersAllAll = new ArrayList<>();
String HOST_TASK_MEMBER = Global.HOST_API + "/project/%d/task/user/count";
View.OnClickListener onClickRetry = v -> refresh();
MemberTaskCount mMemberTask = new MemberTaskCount();
private MyPagerAdapter adapter;
@AfterViews
protected final void initProjectTaskFragment() {
showDialogLoading();
tabs.setLayoutInflater(mInflater);
HOST_TASK_MEMBER = String.format(HOST_TASK_MEMBER, mProjectObject.getId());
refresh();
adapter = new MyPagerAdapter(getChildFragmentManager());
pager.setAdapter(adapter);
// 必须添加,否则回收恢复的时候,TaskListFragment 的 actionmenu 会显示几个出来
setHasOptionsMenu(true);
}
private void refresh() {
getNetwork(HOST_TASK_MEMBER, HOST_TASK_MEMBER);
}
@Override
public void parseJson(int code, JSONObject respanse, String tag, int pos, Object data) throws JSONException {
if (tag.equals(HOST_MEMBERS)) {
hideProgressDialog();
if (code == 0) {
ArrayList<TaskObject.Members> usersInfo = new ArrayList<>();
JSONArray jsonArray = respanse.getJSONObject("data").getJSONArray("list");
for (int i = 0; i < jsonArray.length(); ++i) {
TaskObject.Members userInfo = new TaskObject.Members(jsonArray.getJSONObject(i));
if (mMemberTask.memberHasTask(userInfo.user_id)) { // 只显示有任务的
if (userInfo.user.global_key.equals(MyApp.sUserObject.global_key)) {
usersInfo.add(0, userInfo);
} else {
usersInfo.add(userInfo);
}
}
mMembersAllAll.add(userInfo);
}
mUsersInfo = usersInfo;
mMembersAll = new ArrayList<>();
mMembersAll.add(new TaskObject.Members());
mMembersAll.addAll(mUsersInfo);
adapter.notifyDataSetChanged();
final int pageMargin = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 4, getResources()
.getDisplayMetrics());
pager.setPageMargin(pageMargin);
tabs.setViewPager(pager);
} else {
showErrorMsg(code, respanse);
BlankViewDisplay.setBlank(mMembersAllAll.size(), this, false, blankLayout, onClickRetry);
}
} else if (tag.equals(HOST_TASK_MEMBER)) {
if (code == 0) {
mMemberTask.addItems(respanse.getJSONArray("data"));
String getMembers = String.format(HOST_MEMBERS, mProjectObject.getId());
getNetwork(getMembers, HOST_MEMBERS);
} else {
hideProgressDialog();
showErrorMsg(code, respanse);
BlankViewDisplay.setBlank(mMembersAllAll.size(), this, false, blankLayout, onClickRetry);
}
}
}
@OnActivityResult(ListModify.RESULT_EDIT_LIST)
void onResultEditList(int resultCode, Intent data) {
if (resultCode == Activity.RESULT_OK) {
taskListParentUpdate();
String globarKey = data.getStringExtra(TaskAddActivity.RESULT_GLOBARKEY);
TaskObject.Members modifyMember = null;
for (int i = 0; i < mMembersAllAll.size(); ++i) {
if (mMembersAllAll.get(i).user.global_key.equals(globarKey)) {
modifyMember = mMembersAllAll.get(i);
break;
}
}
if (modifyMember != null) {
if (!mMembersAll.contains(modifyMember)) {
mMembersAll.add(modifyMember);
adapter.notifyDataSetChanged();
tabs.setViewPager(pager);
}
}
}
}
@Override
public void taskListParentUpdate() {
List<WeakReference<Fragment>> fragmentArray = adapter.getFragments();
for (WeakReference<Fragment> ref : fragmentArray) {
Fragment item = ref.get();
if (item instanceof TaskListUpdate) {
((TaskListUpdate) item).taskListUpdate(true);
}
}
}
@Click
public final void floatButton() {
TaskObject.Members member = adapter.getItemData(pager.getCurrentItem());
// Intent intent = new Intent(getActivity(), TaskAddActivity_.class);
TaskObject.SingleTask task = new TaskObject.SingleTask();
task.project = mProjectObject;
task.project_id = mProjectObject.getId();
task.owner = AccountInfo.loadAccount(getActivity());
task.owner_id = task.owner.id;
TaskAddActivity_.intent(this)
.mSingleTask(task)
.mUserOwner(member.user)
.startForResult(ListModify.RESULT_EDIT_LIST);
}
@Override
public void showFloatButton(boolean show) {
if (show) {
floatButton.show();
} else {
floatButton.hide();
}
}
private static class MemberTaskCount {
private ArrayList<Count> mData = new ArrayList<>();
public void addItems(JSONArray jsonArray) throws JSONException {
for (int i = 0; i < jsonArray.length(); ++i) {
Count count = new Count(jsonArray.getJSONObject(i));
mData.add(count);
}
}
public boolean memberHasTask(int id) {
for (Count item : mData) {
if (item.user == id) {
return true;
}
}
return false;
}
static class Count {
public int done;
public int processing;
public int user;
public Count(JSONObject json) {
done = json.optInt("done");
processing = json.optInt("processing");
user = json.optInt("user");
}
}
}
public class MyPagerAdapter extends SaveFragmentPagerAdapter implements MyPagerSlidingTabStrip.IconTabProvider {
public MyPagerAdapter(FragmentManager fm) {
super(fm);
}
@Override
public CharSequence getPageTitle(int position) {
return "";
}
@Override
public int getCount() {
return mMembersAll.size();
}
@Override
public Fragment getItem(int position) {
TaskListFragment_ fragment = new TaskListFragment_();
Bundle bundle = new Bundle();
bundle.putSerializable("mMembers", mMembersAll.get(position));
bundle.putSerializable("mProjectObject", mProjectObject);
bundle.putSerializable("mMembersArray", mUsersInfo);
bundle.putSerializable("mMemberPos", position);
bundle.putBoolean("mShowAdd", true);
fragment.setParent(ProjectTaskFragment.this);
fragment.setArguments(bundle);
saveFragment(fragment);
return fragment;
}
public TaskObject.Members getItemData(int postion) {
return mMembersAll.get(postion);
}
@Override
public int getItemPosition(Object object) {
return POSITION_NONE;
}
@Override
public String getPageIconUrl(int position) {
return mMembersAll.get(position).user.avatar;
}
}
}