package net.oschina.gitapp.ui;
import java.util.ArrayList;
import java.util.List;
import android.app.ProgressDialog;
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.view.View.OnClickListener;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.ProgressBar;
import android.widget.ScrollView;
import android.widget.TextView;
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.MoreMenuItem;
import net.oschina.gitapp.bean.Project;
import net.oschina.gitapp.bean.StarWatchOptionResult;
import net.oschina.gitapp.bean.URLs;
import net.oschina.gitapp.common.Contanst;
import net.oschina.gitapp.common.StringUtils;
import net.oschina.gitapp.common.UIHelper;
import net.oschina.gitapp.ui.baseactivity.BaseActionBarActivity;
import net.oschina.gitapp.widget.DropDownMenu;
/**
* 项目详情界面
*
* @created 2014-05-26 上午10:26
* @author 火蚁(http://my.oschina.net/LittleDY)
*
* @最后更新:
* @更新内容:
* @更新者:
*/
@SuppressWarnings("deprecation")
public class ProjectActivity extends BaseActionBarActivity implements
OnClickListener {
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 ACTION_LOAD_PROJECT = 0;// 加载项目
private final int ACTION_LOAD_PARENT_PROJECT = 1;// 加载项目的父项目信息
private Project mProject;
private String projectId;
private ProgressBar mLoading;
private ScrollView mContent;
private TextView mProjectName;
private TextView mUpdateTime;
private ImageView mFlag;
private TextView mDescription;
private TextView mStarNum;
private ImageView mStarStared;// 项目的star状态
private TextView mWatchNum;
private ImageView mWatchStared;// 项目的Watch状态
private TextView mCreated;
private TextView mForkNum;
private TextView mLocked;
private TextView mLanguage;
private TextView mOwnerName;
private View mForkView;
private TextView mForkMes;
private AppContext mAppContext;
private LinearLayout mLLStar;
private LinearLayout mLLWatch;
private LinearLayout mLLOwner;
private LinearLayout mLLReadMe;
private LinearLayout mLLCodes;
private LinearLayout mLLCommits;
private LinearLayout mLLIssues;
private DropDownMenu mMoreMenuWindow;
private List<MoreMenuItem> mMoreItems = new ArrayList<MoreMenuItem>();
private String url_link = null;
private Bitmap bitmap;
private View.OnClickListener onMoreMenuItemClick = new 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(ProjectActivity.this, mProject.getName(), url_link ,
"我在关注《" + mProject.getOwner().getName() + "的项目" + mProject.getName() + "》" + ",你也来瞧瞧呗!", bitmap);
break;
case MORE_MENU_COPY_LINK:
ClipboardManager cbm = (ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE);
cbm.setText(url_link);
UIHelper.ToastMessage(mAppContext, "已复制到剪贴板");
break;
case MORE_MENU_OPEN_WITH_BROWS:
UIHelper.openBrowser(ProjectActivity.this, url_link);
break;
default:
break;
}
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_project);
mAppContext = getGitApplication();
initView();
}
private void initView() {
// 拿到传过来的project对象
Intent intent = getIntent();
mProject = (Project) intent.getSerializableExtra(Contanst.PROJECT);
projectId = intent.getStringExtra(Contanst.PROJECTID);
mLoading = (ProgressBar) findViewById(R.id.project_detail_loading);
mContent = (ScrollView) findViewById(R.id.project_content);
mProjectName = (TextView) findViewById(R.id.project_name);
mUpdateTime = (TextView) findViewById(R.id.project_update);
mFlag = (ImageView) findViewById(R.id.project_flag);
mDescription = (TextView) findViewById(R.id.project_description);
mStarNum = (TextView) findViewById(R.id.project_starnum);
mStarStared = (ImageView) findViewById(R.id.project_star_stared);
mWatchNum = (TextView) findViewById(R.id.project_watchnum);
mWatchStared = (ImageView) findViewById(R.id.project_watch_stared);
mCreated = (TextView) findViewById(R.id.project_createed);
mForkNum = (TextView) findViewById(R.id.project_forknum);
mLocked = (TextView) findViewById(R.id.project_locked);
mLanguage = (TextView) findViewById(R.id.project_language);
mOwnerName = (TextView) findViewById(R.id.project_ownername);
mForkView = findViewById(R.id.project_ll_fork);
mForkMes = (TextView) findViewById(R.id.project_fork_form);
mLLStar = (LinearLayout) findViewById(R.id.project_star);
mLLWatch = (LinearLayout) findViewById(R.id.project_watch);
mLLOwner = (LinearLayout) findViewById(R.id.project_owner);
mLLReadMe = (LinearLayout) findViewById(R.id.project_readme);
mLLCodes = (LinearLayout) findViewById(R.id.project_issues);
mLLCommits = (LinearLayout) findViewById(R.id.project_commits);
mLLIssues = (LinearLayout) findViewById(R.id.project_code);
mLLStar.setOnClickListener(this);
mLLWatch.setOnClickListener(this);
mLLOwner.setOnClickListener(this);
mLLReadMe.setOnClickListener(this);
mLLCodes.setOnClickListener(this);
mLLCommits.setOnClickListener(this);
mLLIssues.setOnClickListener(this);
if (null == mProject) {
loadProject(ACTION_LOAD_PROJECT, projectId);
} else {
initData();
initMoreMenu();
}
}
private void initData() {
mActionBar.setTitle(mProject.getName());
mActionBar.setSubtitle(mProject.getOwner().getName());
mProjectName.setText(mProject.getName());
mUpdateTime.setText("更新于 " + getUpdateTime());
setFlag();
mDescription.setText(getDescription(mProject.getDescription()));
mStarNum.setText(mProject.getStars_count() + "");
setStared(mProject.isStared());
mWatchNum.setText(mProject.getWatches_count() + "");
setWatched(mProject.isWatched());
mCreated.setText(StringUtils.friendly_time(mProject.getCreatedAt()));
mForkNum.setText(mProject.getForks_count() + "");
mLocked.setText(getLocked());
mLanguage.setText(getLanguage());
mOwnerName.setText(mProject.getOwner().getName());
// 显示是否有fork信息
initForkMess();
// 记录项目的地址链接:
url_link = URLs.URL_HOST + mProject.getOwner().getUsername() + URLs.URL_SPLITTER + mProject.getPath();
// 截取屏幕
Handler mHandler = new Handler();
mHandler.postDelayed(new Runnable() {
@Override
public void run() {
if (bitmap == null) {
bitmap = UIHelper.takeScreenShot(ProjectActivity.this);
}
}
}, 500);
}
private void setStared(boolean stared) {
if (stared) {
mStarStared.setBackgroundResource(R.drawable.project_star);
((TextView)findViewById(R.id.project_star_text)).setText("unstar");
} else {
mStarStared.setBackgroundResource(R.drawable.project_unstar);
((TextView)findViewById(R.id.project_star_text)).setText("star");
}
}
private void setWatched(boolean watched) {
if (watched) {
mWatchStared.setBackgroundResource(R.drawable.project_watch);
((TextView)findViewById(R.id.project_watch_text)).setText("unwatch");
} else {
mWatchStared.setBackgroundResource(R.drawable.project_unwatch);
((TextView)findViewById(R.id.project_watch_text)).setText("watch");
}
}
private void setFlag() {
// 判断项目的类型,显示不同的图标(私有项目、公有项目、fork项目)
if (mProject.getParent_id() != null) {
mFlag.setBackgroundResource(R.drawable.project_flag_fork);
} else if (mProject.isPublic()) {
mFlag.setBackgroundResource(R.drawable.project_flag_public);
} else {
mFlag.setBackgroundResource(R.drawable.project_flag_private);
}
}
private void initMoreMenu() {
mMoreMenuWindow = new DropDownMenu(ProjectActivity.this, onMoreMenuItemClick);
MoreMenuItem share = new MoreMenuItem(MORE_MENU_SHARE, R.drawable.more_menu_icon_share, "分享项目");
mMoreItems.add(share);
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);
mMoreMenuWindow.addItems(mMoreItems);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.projet_menu, menu);
return super.onCreateOptionsMenu(menu);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
if (mProject == null) {
return false;
}
int id = item.getItemId();
switch (id) {
case R.id.project_menu_more:
showMoreOptionMenu();
break;
case R.id.project_menu_create_issue:
// 新增issue
UIHelper.showIssueEditOrCreate(getGitApplication(), mProject, null);
break;
}
return super.onOptionsItemSelected(item);
}
private void showMoreOptionMenu() {
if (mMoreMenuWindow == null) {
return;
}
View v = findViewById(R.id.project_menu_more);
int x = mMoreMenuWindow.getWidth() - v.getWidth() + 20;
mMoreMenuWindow.showAsDropDown(v, -x, 0);
}
private String getUpdateTime() {
if (mProject.getLast_push_at() !=null) {
return StringUtils.friendly_time(mProject.getLast_push_at());
} else {
return StringUtils.friendly_time(mProject.getCreatedAt());
}
}
private String getDescription(String description) {
if (description == null || StringUtils.isEmpty(description)) {
return "该项目暂无简介!";
} else {
return description;
}
}
private String getLocked() {
if (mProject.isPublic()) {
return "Public";
} else {
return "Private";
}
}
private String getLanguage() {
if (mProject.getLanguage() == null) {
return "未指定";
} else {
return mProject.getLanguage();
}
}
private void initForkMess() {
if (mProject.getParent_id() == null) {
return;
} else {
mForkView.setVisibility(View.VISIBLE);
findViewById(R.id.project_fork_ll_line).setVisibility(View.VISIBLE);
loadProject(ACTION_LOAD_PARENT_PROJECT, mProject.getParent_id() + "");
mForkView.setOnClickListener(this);
}
}
private void loadProject(final int action, final String projectId) {
new AsyncTask<Void, Void, Message>() {
@Override
protected Message doInBackground(Void... params) {
Message msg = new Message();
try {
msg.obj = mAppContext.getProject(projectId);
msg.what = 1;
} catch (AppException e) {
mLoading.setVisibility(View.GONE);
msg.what = -1;
msg.obj = e;
e.printStackTrace();
}
return msg;
}
@Override
protected void onPreExecute() {
super.onPreExecute();
if (action == ACTION_LOAD_PROJECT) {
mLoading.setVisibility(View.VISIBLE);
mContent.setVisibility(View.GONE);
}
}
@Override
protected void onPostExecute(Message msg) {
super.onPostExecute(msg);
if (action == ACTION_LOAD_PROJECT) {
mLoading.setVisibility(View.GONE);
mContent.setVisibility(View.VISIBLE);
}
if (msg != null) {
if (msg.what == 1) {
if (action == ACTION_LOAD_PROJECT) {
mProject = (Project) msg.obj;
initData();
if (mMoreMenuWindow == null) {
initMoreMenu();
}
} else {
Project p = (Project) msg.obj;
if (p != null) {
mForkMes.setText(p.getOwner().getName() + " / " + p.getName());
}
}
} else {
if (action == ACTION_LOAD_PROJECT) {
if (msg.obj instanceof AppException) {
((AppException) msg.obj).makeToast(mAppContext);
}
}
}
}
}
}.execute();
}
@Override
public void onClick(View v) {
if (mProject == null ) {
return;
}
int id = v.getId();
switch (id) {
case R.id.project_star:
starOption();
break;
case R.id.project_watch:
watchOption();
break;
case R.id.project_owner:
if (mProject.getOwner() != null) {
UIHelper.showUserInfoDetail(ProjectActivity.this, mProject.getOwner(), mProject.getOwner().getId());
}
break;
case R.id.project_ll_fork:
if (mProject.getParent_id() != null) {
UIHelper.showProjectDetail(ProjectActivity.this, null, mProject.getParent_id() + "");
}
break;
case R.id.project_readme:
UIHelper.showProjectReadMeActivity(ProjectActivity.this, mProject);
break;
case R.id.project_code:
UIHelper.showProjectCodeActivity(ProjectActivity.this, mProject);
break;
case R.id.project_commits:
UIHelper.showProjectListActivity(ProjectActivity.this, mProject, ProjectSomeInfoListActivity.PROJECT_LIST_TYPE_COMMITS);
break;
case R.id.project_issues:
UIHelper.showProjectListActivity(ProjectActivity.this, mProject, ProjectSomeInfoListActivity.PROJECT_LIST_TYPE_ISSUES);
break;
}
}
private void watchOption() {
if (mProject == null) {
return;
}
if (!mAppContext.isLogin()) {
UIHelper.showLoginActivity(ProjectActivity.this);
return;
}
final ProgressDialog loadingDialog = new ProgressDialog(this);
loadingDialog.setCanceledOnTouchOutside(false);
if (mProject.isWatched()) {
loadingDialog.setMessage("正在unwatch该项目...");
} else {
loadingDialog.setMessage("正在watch该项目...");
}
new AsyncTask<Void, Void, Message>() {
@Override
protected Message doInBackground(Void... params) {
Message msg = new Message();
try {
if (mProject.isWatched()) {
msg.obj = ApiClient.watchProject(mAppContext, mProject.getId(), "unwatch");
} else {
msg.obj = ApiClient.watchProject(mAppContext, mProject.getId(), "watch");
}
msg.what = 1;
} catch (AppException e) {
e.printStackTrace();
msg.what = -1;
msg.obj = e;
}
return msg;
}
@Override
protected void onPreExecute() {
super.onPreExecute();
if (loadingDialog != null) {
loadingDialog.show();
}
}
@Override
protected void onPostExecute(Message msg) {
super.onPostExecute(msg);
loadingDialog.hide();
if (msg.what == 1) {
String resMsg = "";
StarWatchOptionResult res = (StarWatchOptionResult) msg.obj;
if (res.getCount() > mProject.getWatches_count()) {
setWatched(true);
mProject.setWatched(true);
resMsg = "watch成功";
} else {
setWatched(false);
mProject.setWatched(false);
resMsg = "unwatch成功";
}
mProject.setWatches_count(res.getCount());
mWatchNum.setText(res.getCount() + "");
UIHelper.ToastMessage(mAppContext, resMsg);
} else {
((AppException)msg.obj).makeToast(mAppContext);
}
}
}.execute();
}
private void starOption() {
if (mProject == null) {
return;
}
if (!mAppContext.isLogin()) {
UIHelper.showLoginActivity(ProjectActivity.this);
return;
}
final ProgressDialog loadingDialog = new ProgressDialog(this);
loadingDialog.setCanceledOnTouchOutside(false);
if (mProject.isStared()) {
loadingDialog.setMessage("正在unstar该项目...");
} else {
loadingDialog.setMessage("正在star该项目...");
}
new AsyncTask<Void, Void, Message>() {
@Override
protected Message doInBackground(Void... params) {
Message msg = new Message();
try {
if (mProject.isStared()) {
msg.obj = ApiClient.starProject(mAppContext, mProject.getId(), "unstar");
} else {
msg.obj = ApiClient.starProject(mAppContext, mProject.getId(), "star");
}
msg.what = 1;
} catch (AppException e) {
e.printStackTrace();
msg.what = -1;
msg.obj = e;
}
return msg;
}
@Override
protected void onPreExecute() {
super.onPreExecute();
if (loadingDialog != null) {
loadingDialog.show();
}
}
@Override
protected void onPostExecute(Message msg) {
super.onPostExecute(msg);
loadingDialog.hide();
if (msg.what == 1) {
String resMsg = "";
StarWatchOptionResult res = (StarWatchOptionResult) msg.obj;
if (res.getCount() > mProject.getStars_count()) {
setStared(true);
mProject.setStared(true);
resMsg = "star成功";
} else {
setStared(false);
mProject.setStared(false);
resMsg = "unstar成功";
}
mProject.setStars_count(res.getCount());
mStarNum.setText(res.getCount() + "");
UIHelper.ToastMessage(mAppContext, resMsg);
} else {
((AppException)msg.obj).makeToast(mAppContext);
}
}
}.execute();
}
}