package tellh.com.gitclub.presentation.view.activity.repo_page;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.support.v4.content.ContextCompat;
import android.support.v4.widget.DrawerLayout;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.Toolbar;
import android.text.TextUtils;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.webkit.WebView;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.ProgressBar;
import android.widget.Spinner;
import java.util.Arrays;
import java.util.List;
import javax.inject.Inject;
import me.zhanghai.android.materialprogressbar.MaterialProgressBar;
import tellh.com.gitclub.R;
import tellh.com.gitclub.common.AndroidApplication;
import tellh.com.gitclub.common.base.BaseActivity;
import tellh.com.gitclub.common.config.ExtraKey;
import tellh.com.gitclub.common.utils.StringUtils;
import tellh.com.gitclub.common.utils.Utils;
import tellh.com.gitclub.di.component.DaggerRepoPageComponent;
import tellh.com.gitclub.model.entity.Branch;
import tellh.com.gitclub.model.entity.File;
import tellh.com.gitclub.presentation.contract.RepoSourceContract;
import tellh.com.gitclub.presentation.view.adapter.viewbinder.DirectoryNodeBinder;
import tellh.com.gitclub.presentation.view.adapter.EasySpinnerAdapter;
import tellh.com.gitclub.presentation.view.adapter.viewbinder.FileNodeBinder;
import tellh.com.gitclub.presentation.widget.WebViewHelper;
import tellh.com.recyclertreeview_lib.TreeNode;
import tellh.com.recyclertreeview_lib.TreeViewAdapter;
public class RepoSourceActivity extends BaseActivity implements RepoSourceContract.View, View.OnClickListener {
@Inject
RepoSourceContract.Presenter presenter;
private String mOwner;
private String mRepo;
private WebViewHelper webViewHelper;
private MaterialProgressBar treeViewProgressBar;
private ImageButton btnSourceTreeRefresh;
private DrawerLayout drawer;
private View drawerSourceTree;
private EasySpinnerAdapter<Branch> branchSpinnerAdapter;
private TreeViewAdapter treeViewAdapter;
public static void launch(Activity srcActivity, String owner, String repo) {
Intent intent = new Intent(srcActivity, RepoSourceActivity.class);
intent.putExtra(ExtraKey.USER_NAME, owner);
intent.putExtra(ExtraKey.REPO_NAME, repo);
srcActivity.startActivity(intent);
}
@Override
protected void onDestroy() {
super.onDestroy();
webViewHelper.detach();
presenter.detachView();
presenter = null;
}
@Override
public void initData(Bundle savedInstanceState) {
presenter.getReadMe(mOwner, mRepo);
treeViewProgressBar.setVisibility(View.VISIBLE);
btnSourceTreeRefresh.setVisibility(View.INVISIBLE);
presenter.initSourceTree(mOwner, mRepo);
}
@Override
public void initView() {
Intent intent = getIntent();
if (intent != null && mOwner == null && mRepo == null) {
mOwner = intent.getStringExtra(ExtraKey.USER_NAME);
mRepo = intent.getStringExtra(ExtraKey.REPO_NAME);
}
if (presenter == null) {
DaggerRepoPageComponent.builder()
.appComponent(AndroidApplication.getInstance().getAppComponent())
.build().inject(this);
presenter.attachView(this);
}
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
final WebView webView = (WebView) findViewById(R.id.web_view);
ProgressBar webViewProgressBar = (ProgressBar) findViewById(R.id.webView_progressBar);
Spinner spinnerBranchList = (Spinner) findViewById(R.id.spinner_branchList);
treeViewProgressBar = (MaterialProgressBar) findViewById(R.id.treeView_progressBar);
btnSourceTreeRefresh = (ImageButton) findViewById(R.id.btn_refresh_source_tree);
RecyclerView treeView = (RecyclerView) findViewById(R.id.treeView);
drawer = (DrawerLayout) findViewById(R.id.drawer);
drawerSourceTree = findViewById(R.id.drawer_source_tree);
btnSourceTreeRefresh.setOnClickListener(this);
webView.setVerticalScrollBarEnabled(false);
webViewHelper = new WebViewHelper(webView, webViewProgressBar);
branchSpinnerAdapter = new EasySpinnerAdapter<>(spinnerBranchList, new EasySpinnerAdapter.onItemSelectedListener<Branch>() {
@Override
public void onItemSelected(Branch entity, int position) {
treeViewProgressBar.setVisibility(View.VISIBLE);
btnSourceTreeRefresh.setVisibility(View.INVISIBLE);
presenter.getSourceTree(mOwner, mRepo, entity);
}
});
spinnerBranchList.setAdapter(branchSpinnerAdapter);
treeView.setLayoutManager(new LinearLayoutManager(this));
treeViewAdapter = new TreeViewAdapter(Arrays.asList(new FileNodeBinder(), new DirectoryNodeBinder()));
treeViewAdapter.setOnTreeNodeClickListener(new TreeViewAdapter.OnTreeNodeClickListener() {
@Override
public boolean onClick(TreeNode node, RecyclerView.ViewHolder holder) {
if (node.isLeaf()) {
webView.loadUrl(((File) node.getContent()).html_url);
drawer.closeDrawer(drawerSourceTree);
return false;
}
try {
long lastClickTime = (long) holder.itemView.getTag();
if (System.currentTimeMillis() - lastClickTime < 500)
return true;
} catch (Exception e) {
holder.itemView.setTag(System.currentTimeMillis());
}
holder.itemView.setTag(System.currentTimeMillis());
DirectoryNodeBinder.ViewHolder dirViewHolder = (DirectoryNodeBinder.ViewHolder) holder;
final ImageView ivArrow = dirViewHolder.getIvArrow();
int rotateDegree = node.isExpand() ? -90 : 90;
ivArrow.animate().rotationBy(rotateDegree)
.start();
return false;
}
});
treeView.setAdapter(treeViewAdapter);
String repoName = StringUtils.append(mOwner, "/", mRepo);
toolbar.setTitle(repoName);
toolbar.setTitleTextColor(ContextCompat.getColor(this, R.color.white));
setSupportActionBar(toolbar);
toolbar.setNavigationOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
finish();
}
});
drawer.postDelayed(new Runnable() {
@Override
public void run() {
drawer.openDrawer(drawerSourceTree);
}
}, 800);
}
@Override
public int getLayoutId() {
return R.layout.activity_repo_source;
}
@Override
public void onGetBranchList(List<Branch> branches) {
branchSpinnerAdapter.refresh(branches);
}
@Override
public void onGetSourceTree(List<TreeNode> treeNodes) {
treeViewAdapter.refresh(treeNodes);
treeViewProgressBar.setVisibility(View.INVISIBLE);
btnSourceTreeRefresh.setVisibility(View.VISIBLE);
}
@Override
public void onGetReadMe(String html_url) {
if (TextUtils.isEmpty(webViewHelper.getUrl()))
webViewHelper.loadUrl(html_url);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.btn_refresh_source_tree:
treeViewProgressBar.setVisibility(View.VISIBLE);
btnSourceTreeRefresh.setVisibility(View.INVISIBLE);
presenter.initSourceTree(mOwner, mRepo);
break;
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.menu_repo_page, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
if (item.getItemId() == R.id.action_drawer) {
drawer.openDrawer(drawerSourceTree);
return true;
} else if (item.getItemId() == R.id.action_reload) {
webViewHelper.reLoad();
return true;
}
return super.onOptionsItemSelected(item);
}
@Override
public void showOnError(String s) {
super.showOnError(s);
if (s.startsWith(Utils.getString(R.string.error_get_source_tree))) {
btnSourceTreeRefresh.setVisibility(View.VISIBLE);
treeViewProgressBar.setVisibility(View.INVISIBLE);
}
}
}