package net.coding.program.project.detail; import android.content.Intent; import android.os.Bundle; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentTransaction; import android.support.v7.app.ActionBar; import android.widget.Toast; import net.coding.program.FileUrlActivity; import net.coding.program.R; import net.coding.program.common.Global; import net.coding.program.common.network.NetworkCallback; import net.coding.program.common.network.NetworkImpl; import net.coding.program.common.ui.BackActivity; import net.coding.program.model.ProjectObject; import net.coding.program.project.detail.merge.ProjectMergeFragment_; import net.coding.program.project.detail.merge.ProjectPullFragment_; import net.coding.program.project.detail.readme.ReadmeFragment_; import org.androidannotations.annotations.EActivity; import org.androidannotations.annotations.Extra; import org.androidannotations.annotations.OnActivityResult; import org.json.JSONException; import org.json.JSONObject; import java.io.Serializable; import java.lang.ref.WeakReference; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; @EActivity(R.layout.activity_project) public class ProjectActivity extends BackActivity implements NetworkCallback { public static final ProjectJumpParam.JumpType[] PRIVATE_JUMP_TYPES = new ProjectJumpParam.JumpType[]{ ProjectJumpParam.JumpType.typeDynamic, ProjectJumpParam.JumpType.typeTask, ProjectJumpParam.JumpType.typeTopic, ProjectJumpParam.JumpType.typeDocument, ProjectJumpParam.JumpType.typeCode, ProjectJumpParam.JumpType.typeMember, ProjectJumpParam.JumpType.typeReadme, ProjectJumpParam.JumpType.typeMerge }; public static final ProjectJumpParam.JumpType[] PUBLIC_JUMP_TYPES = new ProjectJumpParam.JumpType[]{ ProjectJumpParam.JumpType.typeDynamic, ProjectJumpParam.JumpType.typeTopic, ProjectJumpParam.JumpType.typeCode, ProjectJumpParam.JumpType.typeMember, ProjectJumpParam.JumpType.typeReadme, ProjectJumpParam.JumpType.typeMerge }; @Extra ProjectObject mProjectObject; @Extra ProjectJumpParam mJumpParam; @Extra ProjectJumpParam.JumpType mJumpType = ProjectJumpParam.JumpType.typeDynamic; List<WeakReference<Fragment>> mFragments = new ArrayList<>(); ArrayList<String> project_activity_action_list = new ArrayList<>(Arrays.asList( "项目动态", "项目讨论", "项目代码", "项目成员", "readme", "mergerequest" )); String urlProject; // MySpinnerAdapter mSpinnerAdapter; ArrayList<Integer> spinnerIcons = new ArrayList<>(Arrays.asList( R.drawable.ic_spinner_dynamic, R.drawable.ic_spinner_topic, R.drawable.ic_spinner_git, R.drawable.ic_spinner_user, R.drawable.ic_spinner_user, R.drawable.ic_spinner_user )); ArrayList<Class> spinnerFragments = new ArrayList<Class>(Arrays.asList( ProjectDynamicParentFragment_.class, TopicFragment_.class, ProjectGitFragmentMain_.class, MembersListFragment_.class, ReadmeFragment_.class, ProjectPullFragment_.class )); private NetworkImpl networkImpl; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); ActionBar actionBar = getSupportActionBar(); if (mJumpParam != null) { urlProject = String.format(FileUrlActivity.HOST_PROJECT, mJumpParam.mUser, mJumpParam.mProject); setActionBarTitle(mJumpParam.mProject); networkImpl = new NetworkImpl(this, this); networkImpl.initSetting(); getNetwork(urlProject, urlProject); } else if (mProjectObject != null) { setActionBarTitle(mProjectObject.name); initData(); } else { finish(); } } @Override public void parseJson(int code, JSONObject respanse, String tag, int pos, Object data) throws JSONException { if (tag.equals(urlProject)) { if (code == 0) { mProjectObject = new ProjectObject(respanse.getJSONObject("data")); initData(); } else { Toast.makeText(this, Global.getErrorMsg(respanse), Toast.LENGTH_LONG).show(); } } } @Override public void getNetwork(String uri, String tag) { networkImpl.loadData(uri, null, tag, -1, null, NetworkImpl.Request.Get); } private void initData() { // 私有项目才有任务 if (!mProjectObject.isPublic()) { final int insertPos = 1; spinnerIcons.add(insertPos, R.drawable.ic_spinner_task); spinnerFragments.add(insertPos, ProjectTaskFragment_.class); project_activity_action_list.add(insertPos, "项目任务"); // 私有项目添加项目文档 final int insertAttPos = 3; spinnerIcons.add(insertAttPos, R.drawable.ic_spinner_attachment); spinnerFragments.add(insertAttPos, ProjectAttachmentFragment_.class); project_activity_action_list.add(insertAttPos, "项目文件"); } selectFragment(getJumpPos()); } private int getJumpPos() { if (mProjectObject.isPublic()) { for (int i = 0; i < PUBLIC_JUMP_TYPES.length; ++i) { if (PUBLIC_JUMP_TYPES[i] == mJumpType) { return i; } } } else { for (int i = 0; i < PRIVATE_JUMP_TYPES.length; ++i) { if (PRIVATE_JUMP_TYPES[i] == mJumpType) { return i; } } } return 0; } private void selectFragment(int position) { Fragment fragment; Bundle bundle = new Bundle(); try { Class fragmentClass = spinnerFragments.get(position); if (fragmentClass == ProjectPullFragment_.class && !mProjectObject.isPublic()) { fragmentClass = ProjectMergeFragment_.class; } fragment = (Fragment) fragmentClass.newInstance(); bundle.putSerializable("mProjectObject", mProjectObject); bundle.putSerializable("mProjectPath", ProjectObject.translatePath(mProjectObject.project_path)); fragment.setArguments(bundle); FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); ft.replace(R.id.container, fragment, project_activity_action_list.get(position)); ft.commit(); mFragments.add(new WeakReference(fragment)); } catch (Exception e) { Global.errorLog(e); } } @OnActivityResult(ProjectAttachmentFragment.RESULT_REQUEST_FILES) void onFileResult(int resultCode, Intent data) { for (WeakReference<Fragment> item : mFragments) { Fragment f = item.get(); if (f instanceof ProjectAttachmentFragment_) { ((ProjectAttachmentFragment_) f).onFileResult(resultCode, data); } } } public static class ProjectJumpParam implements Serializable { public String mProject = ""; public String mUser = ""; public ProjectJumpParam(String mUser, String mProject) { this.mUser = mUser; this.mProject = mProject; } public ProjectJumpParam(String path) { String[] regexs = new String[] { "^/u/(.*)/p/(.*)$", "^/user/(.*)/project/(.*)$", "^/t/(.*)/p/(.*)$", "^/team/(.*)/p/(.*)$" }; for (String item : regexs) { if (isMatch(path, item)) { break; } } } private boolean isMatch(String path, String regex) { Pattern pattern = Pattern.compile(regex); Matcher matcher = pattern.matcher(path); if (matcher.find()) { this.mUser = matcher.group(1); this.mProject = matcher.group(2); return true; } return false; } public enum JumpType { typeDynamic, typeTask, typeTopic, typeDocument, typeCode, typeMember, typeReadme, typeMerge, typeHome } } }