package com.alorma.github.ui.activity.repo;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.support.annotation.DrawableRes;
import android.support.annotation.NonNull;
import android.support.annotation.StringRes;
import android.support.design.widget.TabLayout;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentTransaction;
import android.support.v4.app.TaskStackBuilder;
import butterknife.BindView;
import butterknife.ButterKnife;
import com.afollestad.materialdialogs.MaterialDialog;
import com.alorma.github.GitskariosSettings;
import com.alorma.github.R;
import com.alorma.github.sdk.bean.info.RepoInfo;
import com.alorma.github.ui.activity.MainActivity;
import com.alorma.github.ui.activity.base.RepositoryThemeActivity;
import com.alorma.github.ui.fragment.detail.repo.BackManager;
import com.alorma.github.ui.fragment.detail.repo.RepoContributorsFragment;
import com.alorma.github.ui.fragment.issues.RepositoryIssuesListFragment;
import java.util.ArrayList;
public class RepoDetailActivity extends RepositoryThemeActivity {
@BindView(R.id.tabLayout) TabLayout tabLayout;
public static final String FROM_URL = "FROM_URL";
public static final String REPO_INFO = "REPO_INFO";
public static final String REPO_INFO_NAME = "REPO_INFO_NAME";
public static final String REPO_INFO_OWNER = "REPO_INFO_OWNER";
//private Repo currentRepo;
private RepoInfo requestRepoInfo;
private ArrayList<Fragment> fragments;
private RepoAboutFragment repoAboutFragment;
private RepositoryIssuesListFragment repositoryIssuesListFragment;
private RepoContributorsFragment repoContributorsFragment;
private TabLayout.Tab codeTab;
private TabLayout.Tab issuesTab;
private TabLayout.Tab pullrequestsTab;
private TabLayout.Tab contributorsTab;
public static Intent createLauncherIntent(Context context, RepoInfo repoInfo) {
Bundle bundle = new Bundle();
bundle.putParcelable(REPO_INFO, repoInfo);
Intent intent = new Intent(context, RepoDetailActivity.class);
intent.putExtras(bundle);
return intent;
}
public static Intent createShortcutLauncherIntent(Context context, RepoInfo repoInfo) {
Bundle bundle = new Bundle();
bundle.putString(REPO_INFO_NAME, repoInfo.name);
bundle.putString(REPO_INFO_OWNER, repoInfo.owner);
Intent intent = new Intent(context, RepoDetailActivity.class);
intent.putExtras(bundle);
return intent;
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_repo_detail);
ButterKnife.bind(this);
if (getIntent().getExtras() != null) {
requestRepoInfo = getIntent().getExtras().getParcelable(REPO_INFO);
if (requestRepoInfo == null) {
if (getIntent().getExtras().containsKey(REPO_INFO_NAME) && getIntent().getExtras().containsKey(REPO_INFO_OWNER)) {
String name = getIntent().getExtras().getString(REPO_INFO_NAME);
String owner = getIntent().getExtras().getString(REPO_INFO_OWNER);
requestRepoInfo = new RepoInfo();
requestRepoInfo.name = name;
requestRepoInfo.owner = owner;
}
}
if (requestRepoInfo != null) {
setTitle(requestRepoInfo.name);
showNewRepoScreenDialog();
listFragments();
setupTabs();
setupContent();
} else {
finish();
}
} else {
finish();
}
}
private void showNewRepoScreenDialog() {
SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this);
boolean first_time = preferences.getBoolean("repo_screen_first_time", true);
if (first_time) {
new MaterialDialog.Builder(this).title("Repository")
.content("This is the new repository screen!\n\nThere are two new settings to show full readme, and set default tab as selected.")
.dismissListener(dialog1 -> preferences.edit().putBoolean("repo_screen_first_time", false).apply())
.show();
}
}
private void listFragments() {
fragments = new ArrayList<>();
repoAboutFragment = RepoAboutFragment.newInstance(requestRepoInfo);
fragments.add(repoAboutFragment);
repositoryIssuesListFragment = RepositoryIssuesListFragment.newInstance(requestRepoInfo);
fragments.add(repositoryIssuesListFragment);
repoContributorsFragment = RepoContributorsFragment.newInstance(requestRepoInfo);
fragments.add(repoContributorsFragment);
}
private void setupTabs() {
codeTab = getTab(R.drawable.ic_home, R.string.repo_detail_home);
tabLayout.addTab(codeTab, true);
issuesTab = getTab(R.drawable.ic_issue_opened, R.string.repo_detail_issues);
tabLayout.addTab(issuesTab, false);
contributorsTab = getTab(R.drawable.ic_person, R.string.repo_detail_contributors);
tabLayout.addTab(contributorsTab, false);
tabLayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
@Override
public void onTabSelected(TabLayout.Tab tab) {
switch (tab.getPosition()) {
case 0:
setFragment(repoAboutFragment);
break;
case 1:
setFragment(repositoryIssuesListFragment);
break;
case 2:
setFragment(repoContributorsFragment);
break;
}
}
@Override
public void onTabUnselected(TabLayout.Tab tab) {
}
@Override
public void onTabReselected(TabLayout.Tab tab) {
}
});
}
private void setupContent() {
GitskariosSettings gitskariosSettings = new GitskariosSettings(this);
String repoDefaulTab = gitskariosSettings.getRepoDefaulTab();
if (getString(R.string.repo_settings_defalut_tab_items_issues_value).equals(repoDefaulTab)) {
setFragment(repositoryIssuesListFragment);
issuesTab.select();
} else if (getString(R.string.repo_settings_defalut_tab_items_contributors_value).equals(repoDefaulTab)) {
setFragment(repoContributorsFragment);
contributorsTab.select();
} else {
setFragment(repoAboutFragment);
codeTab.select();
}
}
@NonNull
private TabLayout.Tab getTab(@DrawableRes int drawable, @StringRes int text) {
boolean tabletMode = getResources().getBoolean(R.bool.md_is_tablet);
TabLayout.Tab tab = tabLayout.newTab();
if (tabletMode) {
tab.setText(text);
} else {
tab.setIcon(drawable).setText("");
}
return tab;
}
private void setFragment(Fragment fragment) {
FragmentTransaction fm = getSupportFragmentManager().beginTransaction();
fm.replace(R.id.content, fragment);
fm.commit();
}
@Override
protected int getAppLightTheme() {
return R.style.AppTheme_Repository;
}
@Override
protected int getAppDarkTheme() {
return R.style.AppTheme_Dark_Repository;
}
@Override
protected void close(boolean navigateUp) {
if (fragments != null) {
boolean fromUrl = getIntent().getExtras().getBoolean(FROM_URL, false);
Fragment currentFragment = fragments.get(tabLayout.getSelectedTabPosition());
if (navigateUp && fromUrl) {
Intent upIntent = new Intent(this, MainActivity.class);
TaskStackBuilder.create(this).addNextIntentWithParentStack(upIntent).startActivities();
finish();
} else if (currentFragment != null && currentFragment instanceof BackManager) {
if (((BackManager) currentFragment).onBackPressed()) {
finish();
}
} else {
finish();
}
} else {
finish();
}
}
}