diff --git a/res/layout/parentfragment_viewpager.xml b/res/layout/parentfragment_viewpager.xml new file mode 100644 index 0000000000000000000000000000000000000000..4c5a75910ee7b2181e969049727c64a1997d539d --- /dev/null +++ b/res/layout/parentfragment_viewpager.xml @@ -0,0 +1,12 @@ +<?xml version="1.0" encoding="utf-8"?> +<android.support.v4.view.ViewPager + xmlns:android="http://schemas.android.com/apk/res/android" + android:id="@+id/pager" + android:layout_width="match_parent" + android:layout_height="match_parent" > + <android.support.v4.view.PagerTitleStrip + android:id="@+id/pager_title_strip" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_gravity="top" /> +</android.support.v4.view.ViewPager> diff --git a/src/net/i2p/android/router/activity/I2PActivityBase.java b/src/net/i2p/android/router/activity/I2PActivityBase.java index 04691d8e8ed181b659be2d49b8caa904c865d9b5..a5017fb2a18d4dc25036d098fff809758ea1b089 100644 --- a/src/net/i2p/android/router/activity/I2PActivityBase.java +++ b/src/net/i2p/android/router/activity/I2PActivityBase.java @@ -323,7 +323,7 @@ public abstract class I2PActivityBase extends ActionBarActivity implements } public static class TabListener implements ActionBar.TabListener { - private Fragment mFragment; + protected Fragment mFragment; public TabListener(Fragment fragment) { mFragment = fragment; diff --git a/src/net/i2p/android/router/activity/NetDbActivity.java b/src/net/i2p/android/router/activity/NetDbActivity.java index e30600da7e7547b43e36310aaf7ca1ae9af061ee..267320843ce534e8f9cfdbcc3b56138bc9099fb5 100644 --- a/src/net/i2p/android/router/activity/NetDbActivity.java +++ b/src/net/i2p/android/router/activity/NetDbActivity.java @@ -1,27 +1,25 @@ package net.i2p.android.router.activity; import net.i2p.android.router.R; -import net.i2p.android.router.fragment.NetDbSummaryTableFragment; +import net.i2p.android.router.fragment.NetDbListFragment; +import net.i2p.android.router.fragment.NetDbSummaryPagerFragment; import android.os.Bundle; import android.support.v4.app.Fragment; -import android.support.v4.app.FragmentManager; -import android.support.v4.app.FragmentStatePagerAdapter; import android.support.v4.app.FragmentTransaction; -import android.support.v4.view.ViewPager; import android.support.v7.app.ActionBar; import android.support.v7.app.ActionBar.Tab; public class NetDbActivity extends I2PActivityBase { - static final int TAB_SUMMARY = 0; - static final int TAB_ROUTERS = 1; - static final int TAB_LEASESETS = 2; - private static final String SELECTED_TAB = "selected_tab"; + /** + * Whether or not the activity is in two-pane mode, i.e. running on a tablet + * device. + */ + private boolean mTwoPane; - NetDbPagerAdapter mNetDbPagerAdapter; - ViewPager mViewPager; + private static final String SELECTED_TAB = "selected_tab"; @Override - protected boolean useViewPager() { + protected boolean canUseTwoPanes() { return true; } @@ -33,54 +31,50 @@ public class NetDbActivity extends I2PActivityBase { ActionBar actionBar = getSupportActionBar(); actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); - // Set up NetDbPagerAdapter containing the categories - mNetDbPagerAdapter = new NetDbPagerAdapter(getSupportFragmentManager()); - - // Set up ViewPager for swiping between categories - mViewPager = (ViewPager) findViewById(R.id.pager); - mViewPager.setAdapter(mNetDbPagerAdapter); - mViewPager.setOnPageChangeListener( - new ViewPager.SimpleOnPageChangeListener() { - @Override - public void onPageSelected(int position) { - mViewPager.setCurrentItem(position); - } - }); - - // Set up TabListener to update NetDbPagerAdapter with the - // current section to display categories for - ActionBar.TabListener tabListener = new ActionBar.TabListener() { - - public void onTabSelected(Tab tab, FragmentTransaction ft) { - mNetDbPagerAdapter.setCurrentSection(tab.getPosition()); - } - - public void onTabUnselected(Tab tab, FragmentTransaction ft) { - mNetDbPagerAdapter.setCurrentSection(TAB_SUMMARY); - } - - public void onTabReselected(Tab tab, FragmentTransaction ft) { - // User selected the already selected tab. - } - }; - + // Statistics tab + NetDbSummaryPagerFragment sf = new NetDbSummaryPagerFragment(); actionBar.addTab( actionBar.newTab() .setText("Statistics") - .setTabListener(tabListener)); + .setTabListener(new NetDbSummaryPagerTabListener(sf))); + + // Routers tab + NetDbListFragment rf = new NetDbListFragment(); + Bundle args = new Bundle(); + args.putBoolean(NetDbListFragment.SHOW_ROUTERS, true); + rf.setArguments(args); actionBar.addTab( actionBar.newTab() .setText("Routers") - .setTabListener(tabListener)); + .setTabListener(new TabListener(rf))); + + // LeaseSets tab + NetDbListFragment lf = new NetDbListFragment(); + args = new Bundle(); + args.putBoolean(NetDbListFragment.SHOW_ROUTERS, false); + lf.setArguments(args); actionBar.addTab( actionBar.newTab() .setText("LeaseSets") - .setTabListener(tabListener)); + .setTabListener(new TabListener(lf))); if (savedInstanceState != null) { int selected = savedInstanceState.getInt(SELECTED_TAB); actionBar.setSelectedNavigationItem(selected); } + + if (findViewById(R.id.detail_fragment) != null) { + // The detail container view will be present only in the + // large-screen layouts (res/values-large and + // res/values-sw600dp). If this view is present, then the + // activity should be in two-pane mode. + mTwoPane = true; + + // In two-pane mode, list items should be given the + // 'activated' state when touched. + //rf.setActivateOnItemClick(true); + //lf.setActivateOnItemClick(true); + } } @Override @@ -90,61 +84,22 @@ public class NetDbActivity extends I2PActivityBase { getSupportActionBar().getSelectedNavigationIndex()); } - public class NetDbPagerAdapter extends FragmentStatePagerAdapter { - private int mSection; - - public NetDbPagerAdapter(FragmentManager fm) { - super(fm); - mSection = TAB_SUMMARY; - } - - public void setCurrentSection(int section) { - // Change the ViewPager item (in case the - // new section doesn't have as many items) - mViewPager.setCurrentItem(0); - // Update the section - mSection = section; - notifyDataSetChanged(); - } - - @Override - public Fragment getItem(int i) { - switch (mSection) { - case TAB_ROUTERS: - case TAB_LEASESETS: - default: // TAB_SUMMARY - return NetDbSummaryTableFragment.newInstance(i); - } - } - - @Override - public int getCount() { - switch (mSection) { - case TAB_ROUTERS: - return 2; - case TAB_LEASESETS: - return 1; - default: // TAB_SUMMARY - return 3; - } + public static class NetDbSummaryPagerTabListener extends TabListener { + public NetDbSummaryPagerTabListener(Fragment fragment) { + super(fragment); } @Override - public CharSequence getPageTitle(int i) { - switch (mSection) { - case TAB_ROUTERS: - case TAB_LEASESETS: - return "CAT " + (i + 1); - default: // TAB_SUMMARY - switch (i) { - case 1: - return "Countries"; - case 2: - return "Transports"; - default: - return "Versions"; - } - } + public void onTabSelected(Tab tab, FragmentTransaction ft) { + /** + * This is a work-around for Issue 42601 + * https://code.google.com/p/android/issues/detail?id=42601 + * + * The method getChildFragmentManager() does not clear up + * when the Fragment is detached. + */ + mFragment = new NetDbSummaryPagerFragment(); + super.onTabSelected(tab, ft); } } } diff --git a/src/net/i2p/android/router/fragment/NetDbListFragment.java b/src/net/i2p/android/router/fragment/NetDbListFragment.java new file mode 100644 index 0000000000000000000000000000000000000000..aa3cf320fa4163c1d5090103504af67acdba62c3 --- /dev/null +++ b/src/net/i2p/android/router/fragment/NetDbListFragment.java @@ -0,0 +1,8 @@ +package net.i2p.android.router.fragment; + +import android.support.v4.app.Fragment; + +public class NetDbListFragment extends Fragment { + public static final String SHOW_ROUTERS = "show_routers"; + +} diff --git a/src/net/i2p/android/router/fragment/NetDbSummaryPagerFragment.java b/src/net/i2p/android/router/fragment/NetDbSummaryPagerFragment.java new file mode 100644 index 0000000000000000000000000000000000000000..872e782d35666411c67303256649134cabecdf12 --- /dev/null +++ b/src/net/i2p/android/router/fragment/NetDbSummaryPagerFragment.java @@ -0,0 +1,69 @@ +package net.i2p.android.router.fragment; + +import net.i2p.android.router.R; +import android.os.Bundle; +import android.support.v4.app.Fragment; +import android.support.v4.app.FragmentManager; +import android.support.v4.app.FragmentStatePagerAdapter; +import android.support.v4.view.ViewPager; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; + +public class NetDbSummaryPagerFragment extends Fragment { + NetDbPagerAdapter mNetDbPagerAdapter; + ViewPager mViewPager; + + public View onCreateView(LayoutInflater inflater, ViewGroup container, + Bundle savedInstanceState) { + View v = inflater.inflate(R.layout.parentfragment_viewpager, container, false); + return v; + } + + @Override + public void onViewCreated(View view, Bundle savedInstanceState) { + super.onViewCreated(view, savedInstanceState); + + // Set up NetDbPagerAdapter containing the categories + mNetDbPagerAdapter = new NetDbPagerAdapter(getChildFragmentManager()); + + // Set up ViewPager for swiping between categories + mViewPager = (ViewPager) getActivity().findViewById(R.id.pager); + mViewPager.setAdapter(mNetDbPagerAdapter); + mViewPager.setOnPageChangeListener( + new ViewPager.SimpleOnPageChangeListener() { + @Override + public void onPageSelected(int position) { + mViewPager.setCurrentItem(position); + } + }); + } + + public class NetDbPagerAdapter extends FragmentStatePagerAdapter { + public NetDbPagerAdapter(FragmentManager fm) { + super(fm); + } + + @Override + public Fragment getItem(int i) { + return NetDbSummaryTableFragment.newInstance(i); + } + + @Override + public int getCount() { + return 3; + } + + @Override + public CharSequence getPageTitle(int i) { + switch (i) { + case 1: + return "Countries"; + case 2: + return "Transports"; + default: + return "Versions"; + } + } + } +}