package net.oschina.gitapp.ui; import java.util.ArrayList; import java.util.List; import android.text.ClipboardManager; import android.content.Context; import android.content.Intent; import android.graphics.Bitmap; import android.os.AsyncTask; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.webkit.WebView; import android.widget.ProgressBar; import net.oschina.gitapp.AppConfig; import net.oschina.gitapp.AppContext; import net.oschina.gitapp.AppException; import net.oschina.gitapp.R; import net.oschina.gitapp.api.ApiClient; import net.oschina.gitapp.bean.CodeFile; import net.oschina.gitapp.bean.MoreMenuItem; import net.oschina.gitapp.bean.Project; import net.oschina.gitapp.bean.URLs; import net.oschina.gitapp.common.Contanst; import net.oschina.gitapp.common.FileUtils; import net.oschina.gitapp.common.UIHelper; import net.oschina.gitapp.interfaces.OnStatusListener; import net.oschina.gitapp.ui.baseactivity.BaseActionBarActivity; import net.oschina.gitapp.util.MarkdownUtils; import net.oschina.gitapp.util.SourceEditor; import net.oschina.gitapp.widget.DropDownMenu; /** * 代码文件详情 * * @created 2014-06-04 * @author 火蚁 * */ @SuppressWarnings("deprecation") public class CodeFileDetailActivity extends BaseActionBarActivity implements OnStatusListener { private final int MORE_MENU_SHARE = 00;// 分享 private final int MORE_MENU_COPY_LINK = 01;// 复制链接 private final int MORE_MENU_OPEN_WITH_BROWS = 02;// 在浏览器中打开 private final int MORE_MENU_DOWNLOAD = 03; private final int MORE_MENU_EDIT = 04; private AppContext mContext; private Menu optionsMenu; private WebView mWebView; private ProgressBar mLoading; private SourceEditor editor; private CodeFile mCodeFile; private Project mProject; private String mFileName; private String mPath; private String mRef; private DropDownMenu mMoreMenuWindow; private List<MoreMenuItem> mMoreItems = new ArrayList<MoreMenuItem>(); private String url_link = null; private Bitmap bitmap; private View.OnClickListener onMoreItemClickListener = new View.OnClickListener() { @Override public void onClick(View v) { if (mMoreMenuWindow != null && mMoreMenuWindow.isShowing()) { mMoreMenuWindow.dismiss(); } if (mProject == null) { return; } int id = v.getId(); switch (id) { case MORE_MENU_SHARE: UIHelper.showShareOption(CodeFileDetailActivity.this, mFileName, url_link, "我正在看项目《" + mProject.getName() + "》的文件" + mFileName + ",你也来瞧瞧呗!", bitmap); break; case MORE_MENU_COPY_LINK: ClipboardManager cbm = (ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE); cbm.setText(url_link); UIHelper.ToastMessage(mContext, "已复制到剪贴板"); break; case MORE_MENU_OPEN_WITH_BROWS: if (!mProject.isPublic()) { if (!mContext.isLogin()) { UIHelper.showLoginActivity(CodeFileDetailActivity.this); return; } url_link = url_link + "?private_token=" + ApiClient.getToken(mContext); } UIHelper.openBrowser(CodeFileDetailActivity.this, url_link); break; case MORE_MENU_DOWNLOAD: downloadFile(); break; case MORE_MENU_EDIT: showEditCodeFileActivity(); break; default: break; } } }; private void downloadFile() { String path = AppConfig.DEFAULT_SAVE_FILE_PATH; boolean res = FileUtils.writeFile(mCodeFile.getContent().getBytes(), path, mFileName); if (res) { UIHelper.ToastMessage(mContext, "文件已经保存在" + path); } else { UIHelper.ToastMessage(mContext, "保存文件失败"); } } private void showEditCodeFileActivity() { Intent intent = new Intent(CodeFileDetailActivity.this, CodeFileEditActivity.class); Bundle bundle = new Bundle(); bundle.putSerializable(Contanst.CODE_FILE, mCodeFile); bundle.putSerializable(Contanst.PROJECT, mProject); bundle.putString(Contanst.BRANCH, mRef); bundle.putString(Contanst.PATH, mPath); intent.putExtras(bundle); startActivity(intent); } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // 设置actionbar加载动态 setContentView(R.layout.activity_code_file_view); mContext = getGitApplication(); Intent intent = getIntent(); mProject = (Project) intent.getSerializableExtra(Contanst.PROJECT); mFileName = intent.getStringExtra("fileName"); mPath = intent.getStringExtra("path"); mRef = intent.getStringExtra("ref"); init(); loadDatasCode(mProject.getId(), mPath, mRef); url_link = URLs.URL_HOST + mProject.getOwner().getUsername() + URLs.URL_SPLITTER + mProject.getPath() + URLs.URL_SPLITTER + "blob" + URLs.URL_SPLITTER + mRef + URLs.URL_SPLITTER + mPath; } private void init() { mTitle = mFileName; mSubTitle = mRef; mWebView = (WebView) findViewById(R.id.code_file_webview); editor = new SourceEditor(mWebView); mLoading = (ProgressBar) findViewById(R.id.code_file_loading); } private void initMoreMenu() { mMoreMenuWindow = new DropDownMenu(CodeFileDetailActivity.this, onMoreItemClickListener); MoreMenuItem shar = new MoreMenuItem(MORE_MENU_SHARE, R.drawable.more_menu_icon_share, "分享"); mMoreItems.add(shar); MoreMenuItem copy_link = new MoreMenuItem(MORE_MENU_COPY_LINK, R.drawable.more_menu_icon_copy, "复制链接"); mMoreItems.add(copy_link); MoreMenuItem open_with_brows = new MoreMenuItem( MORE_MENU_OPEN_WITH_BROWS, R.drawable.more_menu_icon_browser, "在浏览器中打开"); mMoreItems.add(open_with_brows); MoreMenuItem download = new MoreMenuItem(MORE_MENU_DOWNLOAD, R.drawable.more_menu_icon_download, "下载该文件"); mMoreItems.add(download); // 如果该文件是属于登陆用户的项目,则显示有编辑的操作 if (mProject.getRelation() != null && (mProject.getRelation().equalsIgnoreCase( Project.RELATION_TYPE_DEVELOPER) || mProject .getRelation().equalsIgnoreCase( Project.RELATION_TYPE_MASTER))) { MoreMenuItem edit = new MoreMenuItem(MORE_MENU_EDIT, R.drawable.more_menu_icon_edit, "编辑"); mMoreItems.add(edit); } mMoreMenuWindow.addItems(mMoreItems); } @Override public boolean onCreateOptionsMenu(Menu menu) { optionsMenu = menu; getMenuInflater().inflate(R.menu.projet_code_detail_menu, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { int id = item.getItemId(); switch (id) { case R.id.project_detail_menu_refresh: loadDatasCode(mProject.getId(), mPath, mRef); break; case R.id.project_detail_menu_more: showMoreOptionMenu(); break; } return super.onOptionsItemSelected(item); } private void showMoreOptionMenu() { if (mMoreMenuWindow != null) { View v = findViewById(R.id.project_detail_menu_more); int x = mMoreMenuWindow.getWidth() - v.getWidth() + 20; mMoreMenuWindow.showAsDropDown(v, -x, 0); } } @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 path, final String ref_name) { onStatus(STATUS_LOADING); new AsyncTask<Void, Void, Message>() { @Override protected Message doInBackground(Void... params) { Message msg = new Message(); try { AppContext ac = getGitApplication(); CodeFile codeFile = ac.getCodeFile(projectId, path, ref_name); msg.what = 1; msg.obj = codeFile; } 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) { if (mMoreMenuWindow == null) { initMoreMenu(); } mCodeFile = (CodeFile) msg.obj; editor.setMarkdown(MarkdownUtils.isMarkdown(mPath)); editor.setSource(mPath, mCodeFile); onStatus(STATUS_LOADED); // 截取屏幕 Handler mHandler = new Handler(); mHandler.postDelayed(new Runnable() { @Override public void run() { if (bitmap == null) { bitmap = UIHelper .takeScreenShot(CodeFileDetailActivity.this); } } }, 500); } else { onStatus(STATUS_NONE); if (msg.obj instanceof AppException) { AppException appException = (AppException) msg.obj; appException.makeToast(mContext); } else { UIHelper.ToastMessage(mContext, ((Exception) msg.obj).getMessage()); } } } }.execute(); } }