package net.oschina.gitapp.ui;
import android.annotation.SuppressLint;
import android.content.Intent;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Message;
import android.support.v4.view.MenuItemCompat;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.webkit.WebView;
import android.widget.ProgressBar;
import net.oschina.gitapp.AppContext;
import net.oschina.gitapp.AppException;
import net.oschina.gitapp.R;
import net.oschina.gitapp.bean.Commit;
import net.oschina.gitapp.bean.CommitDiff;
import net.oschina.gitapp.bean.Project;
import net.oschina.gitapp.common.Contanst;
import net.oschina.gitapp.common.UIHelper;
import net.oschina.gitapp.interfaces.OnStatusListener;
import net.oschina.gitapp.ui.baseactivity.BaseActionBarActivity;
import net.oschina.gitapp.util.SourceEditor;
/**
* 代码文件详情
*
* @created 2014-06-13
* @author 火蚁
*
*/
@SuppressLint("SetJavaScriptEnabled")
public class CommitFileDetailActivity extends BaseActionBarActivity implements
OnStatusListener {
private final int MENU_REFRESH_ID = 0;
private final int MENU_MORE_ID = 1;
private Menu optionsMenu;
private WebView mWebView;
private ProgressBar mLoading;
private SourceEditor mEditor;
private Project mProject;
private CommitDiff mCommitDiff;
private Commit mCommit;
private AppContext appContext;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 设置actionbar加载动态
setContentView(R.layout.activity_code_file_view);
appContext = getGitApplication();
Intent intent = getIntent();
mProject = (Project) intent.getSerializableExtra(Contanst.PROJECT);
mCommitDiff = (CommitDiff) intent.getSerializableExtra(Contanst.COMMITDIFF);
mCommit = (Commit) intent.getSerializableExtra(Contanst.COMMIT);
init();
}
private void init() {
String path = mCommitDiff.getNew_path();
int index = path.lastIndexOf("/");
if (index == -1) {
mActionBar.setTitle(path);
} else {
mActionBar.setTitle(path.substring(index + 1));
}
mActionBar.setSubtitle("提交" + mCommit.getShortId());
mWebView = (WebView) findViewById(R.id.code_file_webview);
mEditor = new SourceEditor(mWebView);
mLoading = (ProgressBar) findViewById(R.id.code_file_loading);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
optionsMenu = menu;
// 刷新按钮
MenuItem refreshItem = menu.add(0, MENU_REFRESH_ID, MENU_REFRESH_ID,
"刷新");
refreshItem.setIcon(R.drawable.abc_ic_menu_refresh);
MenuItem moreOption = menu.add(0, MENU_MORE_ID, MENU_MORE_ID, "更多");
moreOption.setIcon(R.drawable.abc_ic_menu_moreoverflow_normal_holo_dark);
MenuItemCompat.setShowAsAction(refreshItem,
MenuItemCompat.SHOW_AS_ACTION_ALWAYS);
/*MenuItemCompat.setShowAsAction(moreOption,
MenuItemCompat.SHOW_AS_ACTION_ALWAYS);*/
loadDatasCode(mProject.getId(), mCommit.getId(), mCommitDiff.getNew_path());
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
int id = item.getItemId();
switch (id) {
case MENU_REFRESH_ID:
loadDatasCode(mProject.getId(), mCommit.getId(), mCommitDiff.getNew_path());
break;
case MENU_MORE_ID:
break;
}
return super.onOptionsItemSelected(item);
}
@Override
public void onStatus(int status) {
if(optionsMenu == null) {
return;
}
// 更新状态
if(status == STATUS_LOADING) {
mLoading.setVisibility(View.VISIBLE);
mWebView.setVisibility(View.GONE);
} else {
mLoading.setVisibility(View.GONE);
mWebView.setVisibility(View.VISIBLE);
if (status == STATUS_NONE) {
}
}
}
private void loadDatasCode(final String projectId, final String commitId, final String filePath) {
onStatus(STATUS_LOADING);
new AsyncTask<Void, Void, Message>() {
@Override
protected Message doInBackground(Void... params) {
Message msg = new Message();
try {
AppContext ac = getGitApplication();
String body = ac.getCommitFileDetail(projectId, commitId, filePath);
msg.what = 1;
msg.obj = body;
} catch (Exception e) {
msg.what = -1;
msg.obj = e;
}
return msg;
}
@Override
protected void onPreExecute() {
super.onPreExecute();
}
@Override
protected void onPostExecute(Message msg) {
super.onPostExecute(msg);
if (msg.what == 1 && msg.obj != null) {
onStatus(STATUS_LOADED);
String body = (String) msg.obj;
if (body != null) {
mEditor.setSource(filePath, body, false);
}
} else {
onStatus(STATUS_NONE);
if (msg.obj instanceof AppException) {
AppException e = ((AppException)msg.obj);
if (e.getCode() == 404) {
UIHelper.ToastMessage(appContext, "读取失败,文件已被删除");
} else {
((AppException)msg.obj).makeToast(appContext);
}
}else {
UIHelper.ToastMessage(appContext, ((Exception)msg.obj).getMessage());
}
}
}
}.execute();
}
}