package org.solovyev.android.calculator.view;
import android.app.Activity;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.design.widget.TabLayout;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
import android.support.v4.view.ViewPager;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import butterknife.Bind;
import butterknife.ButterKnife;
import org.solovyev.android.calculator.AppModule;
import org.solovyev.android.calculator.FragmentTab;
import org.solovyev.android.calculator.R;
import org.solovyev.android.calculator.entities.BaseEntitiesFragment;
import org.solovyev.android.calculator.entities.Category;
import javax.annotation.Nonnull;
import javax.inject.Inject;
import javax.inject.Named;
import java.util.ArrayList;
import java.util.List;
import static org.solovyev.android.calculator.App.cast;
public class Tabs {
@Nonnull
private final AppCompatActivity activity;
@Nonnull
private final TabFragments adapter;
@Inject
@Named(AppModule.PREFS_TABS)
SharedPreferences preferences;
@Nullable
@Bind(R.id.tabs)
TabLayout tabLayout;
@Nullable
@Bind(R.id.viewPager)
ViewPager viewPager;
private int defaultSelectedTab = -1;
public Tabs(@Nonnull AppCompatActivity activity) {
this.activity = activity;
this.adapter = new TabFragments(activity.getSupportFragmentManager());
}
@Nonnull
private static String makeTabKey(@Nonnull Activity activity) {
return activity.getClass().getSimpleName();
}
public void onCreate() {
cast(activity.getApplicationContext()).getComponent().inject(this);
ButterKnife.bind(this, activity);
if (tabLayout == null || viewPager == null) {
return;
}
final int tabs = adapter.getCount();
if (tabs == 0) {
tabLayout.setVisibility(View.GONE);
return;
}
viewPager.setAdapter(adapter);
tabLayout.setTabMode(tabs > 3 ? TabLayout.MODE_SCROLLABLE : TabLayout.MODE_FIXED);
tabLayout.setupWithViewPager(viewPager);
restoreSelectedTab();
}
public void addTab(@Nonnull Category category, @Nonnull FragmentTab tab) {
addTab(category, tab, activity.getString(category.title()));
}
public final void addTab(@Nonnull Category category, @Nonnull FragmentTab tab, @Nonnull CharSequence title) {
final Bundle arguments = new Bundle(1);
arguments.putString(BaseEntitiesFragment.ARG_CATEGORY, category.name());
addTab(tab.type, arguments, title);
}
public void addTab(@Nonnull FragmentTab tab) {
addTab(tab.type, null, activity.getString(tab.title));
}
public void addTab(@Nonnull Class<? extends Fragment> fragmentClass, @Nullable Bundle fragmentArgs, @Nonnull CharSequence title) {
adapter.add(new TabFragment(fragmentClass, fragmentArgs, title));
}
@Nullable
public Fragment getCurrentFragment() {
if (viewPager == null) {
return null;
}
return adapter.getItem(viewPager.getCurrentItem());
}
public int getCurrentTab() {
if (viewPager == null) {
return -1;
}
return viewPager.getCurrentItem();
}
public int getTabCount() {
return adapter.getCount();
}
public void selectTab(int index) {
if (tabLayout == null) {
return;
}
final TabLayout.Tab tab = tabLayout.getTabAt(index);
if (tab != null) {
tab.select();
}
}
public void setDefaultSelectedTab(int defaultSelectedTab) {
this.defaultSelectedTab = defaultSelectedTab;
}
public void restoreSelectedTab() {
final int selectedTab = preferences.getInt(makeTabKey(activity), defaultSelectedTab);
if (selectedTab >= 0 && selectedTab < getTabCount()) {
selectTab(selectedTab);
}
}
public void onPause() {
saveSelectedTab();
}
private void saveSelectedTab() {
final int selectedTab = getCurrentTab();
if (selectedTab >= 0) {
final SharedPreferences.Editor editor = preferences.edit();
editor.putInt(makeTabKey(activity), selectedTab);
editor.apply();
}
}
private final class TabFragments extends FragmentPagerAdapter {
@Nonnull
private final List<TabFragment> list = new ArrayList<>();
public TabFragments(@Nonnull FragmentManager fm) {
super(fm);
}
@Override
public Fragment getItem(int position) {
return list.get(position).makeFragment();
}
public void add(@Nonnull TabFragment tabFragment) {
list.add(tabFragment);
notifyDataSetChanged();
}
@Override
public CharSequence getPageTitle(int position) {
return list.get(position).title;
}
@Override
public int getCount() {
return list.size();
}
}
private final class TabFragment {
@Nonnull
final Class<? extends Fragment> fragmentClass;
@Nullable
final Bundle fragmentArgs;
@Nonnull
final CharSequence title;
public TabFragment(@Nonnull Class<? extends Fragment> fragmentClass, @Nullable Bundle fragmentArgs, @Nonnull CharSequence title) {
this.fragmentClass = fragmentClass;
this.fragmentArgs = fragmentArgs;
this.title = title;
}
@Nonnull
public Fragment makeFragment() {
return Fragment.instantiate(activity, fragmentClass.getName(), fragmentArgs);
}
}
}