196 lines
5.7 KiB
Java
196 lines
5.7 KiB
Java
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);
|
|
}
|
|
}
|
|
}
|