package com.khmelenko.lab.varis.activity; import android.content.Intent; import android.os.Bundle; import android.support.design.widget.TabLayout; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentManager; import android.support.v4.view.ViewPager; import android.support.v7.app.ActionBar; import android.support.v7.widget.Toolbar; import android.view.View; import android.widget.Toast; import com.khmelenko.lab.varis.R; import com.khmelenko.lab.varis.TravisApp; import com.khmelenko.lab.varis.adapter.SmartFragmentStatePagerAdapter; import com.khmelenko.lab.varis.fragment.BranchesFragment; import com.khmelenko.lab.varis.fragment.BuildHistoryFragment; import com.khmelenko.lab.varis.fragment.PullRequestsFragment; import com.khmelenko.lab.varis.mvp.MvpActivity; import com.khmelenko.lab.varis.network.response.Branches; import com.khmelenko.lab.varis.network.response.BuildHistory; import com.khmelenko.lab.varis.network.response.Requests; import com.khmelenko.lab.varis.presenter.RepoDetailsPresenter; import com.khmelenko.lab.varis.view.RepoDetailsView; import javax.inject.Inject; import butterknife.ButterKnife; /** * Repository Details Activity * * @author Dmytro Khmelenko */ public final class RepoDetailsActivity extends MvpActivity<RepoDetailsPresenter> implements RepoDetailsView, BuildHistoryFragment.BuildHistoryListener, BranchesFragment.BranchesListener, PullRequestsFragment.PullRequestsListener { private static final int BUILD_DETAILS_REQUEST_CODE = 0; public static final String REPO_SLUG_KEY = "RepoSlug"; public static final String RELOAD_REQUIRED_KEY = "ReloadRequiredKey"; @Inject RepoDetailsPresenter mPresenter; private boolean mReloadRequired; private boolean mInitialLoad = true; private PagerAdapter mAdapterViewPager; /** * Custom adapter for view pager */ private class PagerAdapter extends SmartFragmentStatePagerAdapter { private static final int ITEMS_COUNT = 3; private static final int INDEX_BUILD_HISTORY = 0; private static final int INDEX_BRANCHES = 1; private static final int INDEX_PULL_REQUESTS = 2; public PagerAdapter(FragmentManager fragmentManager) { super(fragmentManager); } @Override public int getCount() { return ITEMS_COUNT; } @Override public Fragment getItem(int position) { switch (position) { case INDEX_BUILD_HISTORY: return BuildHistoryFragment.newInstance(); case INDEX_BRANCHES: return BranchesFragment.newInstance(); case INDEX_PULL_REQUESTS: return PullRequestsFragment.newInstance(); default: return null; } } @Override public CharSequence getPageTitle(int position) { switch (position) { case INDEX_BUILD_HISTORY: return getString(R.string.repo_details_tab_build_history); case INDEX_BRANCHES: return getString(R.string.repo_details_tab_branches); case INDEX_PULL_REQUESTS: return getString(R.string.repo_details_tab_pull_requests); default: return null; } } } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_repo_details); ButterKnife.bind(this); TravisApp.instance().activityInjector().inject(this); initToolbar(); // setting view pager ViewPager vpPager = (ViewPager) findViewById(R.id.repo_details_view_pager); mAdapterViewPager = new PagerAdapter(getSupportFragmentManager()); vpPager.setAdapter(mAdapterViewPager); vpPager.setOffscreenPageLimit(PagerAdapter.ITEMS_COUNT); TabLayout tabLayout = (TabLayout) findViewById(R.id.repo_details_view_tabs); tabLayout.setupWithViewPager(vpPager); } @Override protected RepoDetailsPresenter getPresenter() { return mPresenter; } @Override protected void attachPresenter() { getPresenter().attach(this); String repoSlug = getIntent().getStringExtra(REPO_SLUG_KEY); String projectName = repoSlug.substring(repoSlug.indexOf("/") + 1); setTitle(projectName); getPresenter().setRepoSlug(repoSlug); if (mInitialLoad || mReloadRequired) { mInitialLoad = false; getPresenter().loadData(); } } @Override public void showProgress() { // do nothing, each fragment of the page adapter is responsible for showing progress } @Override public void hideProgress() { // do nothing, each fragment of the page adapter is responsible for hiding progress } @Override public void updateBuildHistory(BuildHistory buildHistory) { BuildHistoryFragment fragment = (BuildHistoryFragment) mAdapterViewPager.getRegisteredFragment(PagerAdapter.INDEX_BUILD_HISTORY); fragment.setBuildHistory(buildHistory); } @Override public void updateBranches(Branches branches) { BranchesFragment fragment = (BranchesFragment) mAdapterViewPager.getRegisteredFragment(PagerAdapter.INDEX_BRANCHES); fragment.setBranches(branches); } @Override public void updatePullRequests(Requests requests) { PullRequestsFragment fragment = (PullRequestsFragment) mAdapterViewPager.getRegisteredFragment(PagerAdapter.INDEX_PULL_REQUESTS); fragment.setPullRequests(requests); } @Override public void showBuildHistoryLoadingError(String message) { BuildHistoryFragment fragment = (BuildHistoryFragment) mAdapterViewPager.getRegisteredFragment(PagerAdapter.INDEX_BUILD_HISTORY); fragment.setBuildHistory(null); String msg = getString(R.string.error_failed_loading_build_history, message); Toast.makeText(this, msg, Toast.LENGTH_SHORT).show(); } @Override public void showBranchesLoadingError(String message) { BranchesFragment fragment = (BranchesFragment) mAdapterViewPager.getRegisteredFragment(PagerAdapter.INDEX_BRANCHES); fragment.setBranches(null); String msg = getString(R.string.error_failed_loading_branches, message); Toast.makeText(this, msg, Toast.LENGTH_SHORT).show(); } @Override public void showPullRequestsLoadingError(String message) { PullRequestsFragment fragment = (PullRequestsFragment) mAdapterViewPager.getRegisteredFragment(PagerAdapter.INDEX_PULL_REQUESTS); fragment.setPullRequests(null); String msg = getString(R.string.error_failed_loading_pull_requests, message); Toast.makeText(this, msg, Toast.LENGTH_SHORT).show(); } /** * Initializes toolbar */ private void initToolbar() { final Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); setSupportActionBar(toolbar); final ActionBar actionBar = getSupportActionBar(); if (actionBar != null) { actionBar.setDisplayHomeAsUpEnabled(true); actionBar.setDisplayShowHomeEnabled(true); toolbar.setNavigationOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { onBackPressed(); } }); } } @Override public void onBuildSelected(long buildId) { goToBuildDetails(buildId); } @Override public void onReloadBuildHistory() { getPresenter().loadBuildsHistory(); } @Override public void onBranchSelected(long buildId) { goToBuildDetails(buildId); } @Override public void onReloadBranches() { getPresenter().loadBranches(); } @Override public void onPullRequestSelected(long buildId) { goToBuildDetails(buildId); } @Override public void onReloadPullRequests() { getPresenter().loadRequests(); } /** * Navigates to the build details * * @param buildId Build ID */ private void goToBuildDetails(long buildId) { Intent intent = new Intent(this, BuildDetailsActivity.class); intent.putExtra(BuildDetailsActivity.EXTRA_BUILD_ID, buildId); intent.putExtra(BuildDetailsActivity.EXTRA_REPO_SLUG, getPresenter().getRepoSlug()); startActivityForResult(intent, BUILD_DETAILS_REQUEST_CODE); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (resultCode == RESULT_OK) { if (requestCode == BUILD_DETAILS_REQUEST_CODE) { mReloadRequired |= data.getBooleanExtra(BuildDetailsActivity.BUILD_STATE_CHANGED, false); } } } @Override public void onBackPressed() { Intent intent = new Intent(); intent.putExtra(RELOAD_REQUIRED_KEY, mReloadRequired); setResult(RESULT_OK, intent); super.onBackPressed(); } }