package cz.destil.wearsquare.activity; import android.os.Build; import android.os.Bundle; import android.support.wearable.view.DotsPageIndicator; import android.support.wearable.view.FragmentGridPagerAdapter; import android.support.wearable.view.GridViewPager; import android.view.View; import android.view.WindowInsets; import cz.destil.wearsquare.R; /** * Activity which uses FragmentGridViewPager in a generic way. * * @author David Vávra (david@vavra.me) */ public abstract class GridPagerActivity extends ProgressActivity { GridViewPager vPager; DotsPageIndicator vPagerIndicator; @Override int getMainViewResourceId() { return R.layout.activity_gridpager; } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setup(); } public void setAdapter(FragmentGridPagerAdapter adapter) { vPager.setAdapter(adapter); } void setPagerListener(final PagerListener listener) { vPager.setOnPageChangeListener(new GridViewPager.OnPageChangeListener() { @Override public void onPageScrolled(int i, int i2, float v, float v2, int i3, int i4) { } @Override public void onPageSelected(int i, int i2) { listener.onPageChanged(); } @Override public void onPageScrollStateChanged(int i) { } }); } private void setup() { vPager = (GridViewPager) getMainView().findViewById(R.id.pager); vPagerIndicator = (DotsPageIndicator) getMainView().findViewById(R.id.page_indicator); vPagerIndicator.setPager(vPager); vPager.setOnApplyWindowInsetsListener(new View.OnApplyWindowInsetsListener() { @Override public WindowInsets onApplyWindowInsets(View v, WindowInsets insets) { // Adjust page margins: // A little extra horizontal spacing between pages looks a bit // less crowded on a round display. final boolean round = insets.isRound(); int rowMargin = getResources().getDimensionPixelOffset(R.dimen.page_row_margin); int colMargin = getResources().getDimensionPixelOffset(round ? R.dimen.page_column_margin_round : R.dimen.page_column_margin); vPager.setPageMargins(rowMargin, colMargin); // add padding if black bar is present (Moto 360) // hack because the insets.getSystemWindowInsetBottom() is always 0 // see: http://stackoverflow.com/questions/27660447/how-to-detect-height-of-black-bar-on-moto-360 if (Build.MODEL.equals("Moto 360")) { vPagerIndicator.setPadding(0, 0, 0, 70); } // GridViewPager relies on insets to properly handle // layout for round displays. They must be explicitly // applied since this listener has taken them over. vPager.onApplyWindowInsets(insets); return insets; } }); } public interface PagerListener { void onPageChanged(); } }