package net.coding.program.project.detail; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.view.animation.Animation; import android.view.animation.AnimationUtils; import android.widget.BaseExpandableListAdapter; import android.widget.ExpandableListAdapter; import android.widget.ExpandableListView; import android.widget.TextView; import net.coding.program.MyApp; import net.coding.program.R; import net.coding.program.common.BlankViewDisplay; import net.coding.program.common.Global; import org.androidannotations.annotations.AfterViews; import org.androidannotations.annotations.Click; import org.androidannotations.annotations.EFragment; import org.androidannotations.annotations.ViewById; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; import java.io.Serializable; import java.util.ArrayList; /** * Created by chaochen on 15/1/30. * 代码页面的主入口页面 */ @EFragment(R.layout.project_git_fragment_main) public class ProjectGitFragmentMain extends ProjectGitFragment { private final String HOST_LIST_BRANCHES = Global.HOST_API + "%s/git/branches?pageSize=1000"; private final String HOST_LIST_TAG = Global.HOST_API + "%s/git/list_tags"; @ViewById TextView versionButton; @ViewById View versionLayout; @ViewById ExpandableListView versionList; @ViewById View expandableIndicator; private ArrayList<BranchItem> mDataVers[] = new ArrayList[]{new ArrayList<>(), new ArrayList<>()}; ExpandableListAdapter versionAdapter = new BaseExpandableListAdapter() { @Override public int getGroupCount() { return mDataVers.length; } @Override public int getChildrenCount(int groupPosition) { return mDataVers[groupPosition].size(); } @Override public Object getGroup(int groupPosition) { return ""; } @Override public Object getChild(int groupPosition, int childPosition) { return mDataVers[groupPosition].get(childPosition); } @Override public long getGroupId(int groupPosition) { return groupPosition; } @Override public long getChildId(int groupPosition, int childPosition) { return childPosition; } @Override public boolean hasStableIds() { return false; } @Override public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) { ViewGroupHolder holder; if (convertView == null) { convertView = LayoutInflater.from(parent.getContext()).inflate(R.layout.git_view_group, parent, false); holder = new ViewGroupHolder(convertView); convertView.setTag(holder); } else { holder = (ViewGroupHolder) convertView.getTag(); } final String[] datas = new String[]{"branches", "tags"}; final int[] iconsId = new int[]{R.drawable.icon_git_branch, R.drawable.icon_git_tag}; holder.title.setText(datas[groupPosition]); holder.icon.setBackgroundResource(iconsId[groupPosition]); return convertView; } @Override public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) { if (convertView == null) { convertView = LayoutInflater.from(parent.getContext()).inflate(R.layout.git_view_child, parent, false); } BranchItem data = (BranchItem) getChild(groupPosition, childPosition); ((TextView) convertView).setText(data.name); return convertView; } @Override public boolean isChildSelectable(int groupPosition, int childPosition) { return true; } }; @AfterViews protected void initProjectGitFragmentMain() { setHasOptionsMenu(true); String urlBranches = String.format(HOST_LIST_BRANCHES, mProjectPath); getNetwork(urlBranches, HOST_LIST_BRANCHES); if (mVersion != null && !mVersion.isEmpty()) { switchVersion(mVersion); } String urlTag = String.format(HOST_LIST_TAG, mProjectPath); getNetwork(urlTag, HOST_LIST_TAG); versionList.setAdapter(versionAdapter); int left = Global.dpToPx(MyApp.sWidthDp - 40); int right = Global.dpToPx(MyApp.sWidthDp - 12); if (android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.JELLY_BEAN_MR2) { versionList.setIndicatorBounds(left, right); } else { versionList.setIndicatorBoundsRelative(left, right); } versionList.setOnChildClickListener(new ExpandableListView.OnChildClickListener() { @Override public boolean onChildClick(ExpandableListView parent, View v, int groupPosition, int childPosition, long id) { BranchItem data = (BranchItem) versionAdapter.getChild(groupPosition, childPosition); switchVersion(data.name); showList(versionLayout.getVisibility() != View.VISIBLE); return true; } }); } @Click protected final void versionButton() { showList(versionLayout.getVisibility() != View.VISIBLE); } @Click protected final void versionLayout() { showList(versionLayout.getVisibility() != View.VISIBLE); } @Override public void parseJson(int code, JSONObject respanse, String tag, int pos, Object data) throws JSONException { if (tag.equals(HOST_LIST_BRANCHES)) { if (code == 0) { JSONObject jsonData = respanse.optJSONObject("data"); if (jsonData == null) { if (mDataVers[0].isEmpty()) { branchNotExist(); } } else { JSONArray branchList = jsonData.optJSONArray("list"); if (branchList.length() > 0) { parseVersion(mDataVers[0], branchList); } else { branchNotExist(); } } } else { showErrorMsg(code, respanse); hideProgressDialog(); } } else if (tag.equals(HOST_LIST_TAG)) { if (code == 0) { parseVersion(mDataVers[1], respanse.optJSONArray("data")); } else { showErrorMsg(code, respanse); hideProgressDialog(); } } else { super.parseJson(code, respanse, tag, pos, data); } } private void branchNotExist() { hideProgressDialog(); getView().findViewById(R.id.top).setVisibility(View.INVISIBLE); BlankViewDisplay.setBlank(0, this, true, blankLayout, onClickRetry); } private void switchVersion(String name) { mVersion = name; onRefresh(); } @Override protected void switchVersionSuccess() { showButtomToast(String.format("已切换到 %s", mVersion)); versionButton.setText(mVersion); } private void parseVersion(ArrayList<BranchItem> data, JSONArray jsonArray) { data.clear(); int len = jsonArray.length(); for (int i = 0; i < len; ++i) { BranchItem item = new BranchItem(jsonArray.optJSONObject(i)); data.add(item); if (item.is_default_branch && (mVersion == null || mVersion.isEmpty())) { switchVersion(item.name); } } ((BaseExpandableListAdapter) versionAdapter).notifyDataSetChanged(); } private void showList(boolean show) { Animation animation; Animation fadeIn; if (show) { animation = AnimationUtils.loadAnimation(getActivity(), R.anim.listview_top_down); fadeIn = AnimationUtils.loadAnimation(getActivity(), R.anim.listview_fade_in); fadeIn.setAnimationListener(new Animation.AnimationListener() { @Override public void onAnimationStart(Animation animation) { } @Override public void onAnimationEnd(Animation animation) { expandableIndicator.setBackgroundResource(R.drawable.icon_git_indicator_up); } @Override public void onAnimationRepeat(Animation animation) { } }); } else { animation = AnimationUtils.loadAnimation(getActivity(), R.anim.listview_top_up); fadeIn = AnimationUtils.loadAnimation(getActivity(), R.anim.listview_fade_out); fadeIn.setAnimationListener(new Animation.AnimationListener() { @Override public void onAnimationStart(Animation animation) { } @Override public void onAnimationEnd(Animation animation) { versionLayout.setVisibility(View.INVISIBLE); expandableIndicator.setBackgroundResource(R.drawable.icon_git_indicator_down); } @Override public void onAnimationRepeat(Animation animation) { } }); } versionList.startAnimation(animation); versionLayout.startAnimation(fadeIn); if (show) { versionLayout.setVisibility(View.VISIBLE); } } private static class ViewGroupHolder { View icon; TextView title; public ViewGroupHolder(View parent) { icon = parent.findViewById(R.id.icon); title = (TextView) parent.findViewById(R.id.title); } } public static final class BranchItem implements Serializable { String name = "";// "raml-doc", boolean is_default_branch; // false, boolean is_protected; // false BranchItem(JSONObject json) { name = json.optString("name", ""); is_default_branch = json.optBoolean("is_default_branch"); is_protected = json.optBoolean("is_protected"); } } }