1*90c8c64dSAndroid Build Coastguard Worker /* 2*90c8c64dSAndroid Build Coastguard Worker * Copyright (C) 2014 The Android Open Source Project 3*90c8c64dSAndroid Build Coastguard Worker * 4*90c8c64dSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License"); 5*90c8c64dSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License. 6*90c8c64dSAndroid Build Coastguard Worker * You may obtain a copy of the License at 7*90c8c64dSAndroid Build Coastguard Worker * 8*90c8c64dSAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0 9*90c8c64dSAndroid Build Coastguard Worker * 10*90c8c64dSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software 11*90c8c64dSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS, 12*90c8c64dSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13*90c8c64dSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and 14*90c8c64dSAndroid Build Coastguard Worker * limitations under the License. 15*90c8c64dSAndroid Build Coastguard Worker */ 16*90c8c64dSAndroid Build Coastguard Worker 17*90c8c64dSAndroid Build Coastguard Worker package com.example.android.wearable.gridviewpager; 18*90c8c64dSAndroid Build Coastguard Worker 19*90c8c64dSAndroid Build Coastguard Worker import android.app.Fragment; 20*90c8c64dSAndroid Build Coastguard Worker import android.app.FragmentManager; 21*90c8c64dSAndroid Build Coastguard Worker import android.content.Context; 22*90c8c64dSAndroid Build Coastguard Worker import android.content.res.Resources; 23*90c8c64dSAndroid Build Coastguard Worker import android.graphics.Point; 24*90c8c64dSAndroid Build Coastguard Worker import android.graphics.drawable.ColorDrawable; 25*90c8c64dSAndroid Build Coastguard Worker import android.graphics.drawable.Drawable; 26*90c8c64dSAndroid Build Coastguard Worker import android.graphics.drawable.TransitionDrawable; 27*90c8c64dSAndroid Build Coastguard Worker import android.os.AsyncTask; 28*90c8c64dSAndroid Build Coastguard Worker import android.support.v4.util.LruCache; 29*90c8c64dSAndroid Build Coastguard Worker import android.support.wearable.view.CardFragment; 30*90c8c64dSAndroid Build Coastguard Worker import android.support.wearable.view.FragmentGridPagerAdapter; 31*90c8c64dSAndroid Build Coastguard Worker import android.support.wearable.view.GridPagerAdapter; 32*90c8c64dSAndroid Build Coastguard Worker import android.util.Log; 33*90c8c64dSAndroid Build Coastguard Worker 34*90c8c64dSAndroid Build Coastguard Worker import java.util.ArrayList; 35*90c8c64dSAndroid Build Coastguard Worker import java.util.List; 36*90c8c64dSAndroid Build Coastguard Worker 37*90c8c64dSAndroid Build Coastguard Worker /** 38*90c8c64dSAndroid Build Coastguard Worker * Constructs fragments as requested by the GridViewPager. For each row a different background is 39*90c8c64dSAndroid Build Coastguard Worker * provided. 40*90c8c64dSAndroid Build Coastguard Worker * <p> 41*90c8c64dSAndroid Build Coastguard Worker * Always avoid loading resources from the main thread. In this sample, the background images are 42*90c8c64dSAndroid Build Coastguard Worker * loaded from an background task and then updated using {@link #notifyRowBackgroundChanged(int)} 43*90c8c64dSAndroid Build Coastguard Worker * and {@link #notifyPageBackgroundChanged(int, int)}. 44*90c8c64dSAndroid Build Coastguard Worker */ 45*90c8c64dSAndroid Build Coastguard Worker public class SampleGridPagerAdapter extends FragmentGridPagerAdapter { 46*90c8c64dSAndroid Build Coastguard Worker private static final int TRANSITION_DURATION_MILLIS = 100; 47*90c8c64dSAndroid Build Coastguard Worker 48*90c8c64dSAndroid Build Coastguard Worker private final Context mContext; 49*90c8c64dSAndroid Build Coastguard Worker private List<Row> mRows; 50*90c8c64dSAndroid Build Coastguard Worker private ColorDrawable mDefaultBg; 51*90c8c64dSAndroid Build Coastguard Worker 52*90c8c64dSAndroid Build Coastguard Worker private ColorDrawable mClearBg; 53*90c8c64dSAndroid Build Coastguard Worker SampleGridPagerAdapter(Context ctx, FragmentManager fm)54*90c8c64dSAndroid Build Coastguard Worker public SampleGridPagerAdapter(Context ctx, FragmentManager fm) { 55*90c8c64dSAndroid Build Coastguard Worker super(fm); 56*90c8c64dSAndroid Build Coastguard Worker mContext = ctx; 57*90c8c64dSAndroid Build Coastguard Worker 58*90c8c64dSAndroid Build Coastguard Worker mRows = new ArrayList<SampleGridPagerAdapter.Row>(); 59*90c8c64dSAndroid Build Coastguard Worker 60*90c8c64dSAndroid Build Coastguard Worker mRows.add(new Row(cardFragment(R.string.welcome_title, R.string.welcome_text))); 61*90c8c64dSAndroid Build Coastguard Worker mRows.add(new Row(cardFragment(R.string.about_title, R.string.about_text))); 62*90c8c64dSAndroid Build Coastguard Worker mRows.add(new Row( 63*90c8c64dSAndroid Build Coastguard Worker cardFragment(R.string.cards_title, R.string.cards_text), 64*90c8c64dSAndroid Build Coastguard Worker cardFragment(R.string.expansion_title, R.string.expansion_text))); 65*90c8c64dSAndroid Build Coastguard Worker mRows.add(new Row( 66*90c8c64dSAndroid Build Coastguard Worker cardFragment(R.string.backgrounds_title, R.string.backgrounds_text), 67*90c8c64dSAndroid Build Coastguard Worker cardFragment(R.string.columns_title, R.string.columns_text))); 68*90c8c64dSAndroid Build Coastguard Worker mRows.add(new Row(new CustomFragment())); 69*90c8c64dSAndroid Build Coastguard Worker mRows.add(new Row(cardFragment(R.string.dismiss_title, R.string.dismiss_text))); 70*90c8c64dSAndroid Build Coastguard Worker mDefaultBg = new ColorDrawable(R.color.dark_grey); 71*90c8c64dSAndroid Build Coastguard Worker mClearBg = new ColorDrawable(android.R.color.transparent); 72*90c8c64dSAndroid Build Coastguard Worker } 73*90c8c64dSAndroid Build Coastguard Worker 74*90c8c64dSAndroid Build Coastguard Worker LruCache<Integer, Drawable> mRowBackgrounds = new LruCache<Integer, Drawable>(3) { 75*90c8c64dSAndroid Build Coastguard Worker @Override 76*90c8c64dSAndroid Build Coastguard Worker protected Drawable create(final Integer row) { 77*90c8c64dSAndroid Build Coastguard Worker int resid = BG_IMAGES[row % BG_IMAGES.length]; 78*90c8c64dSAndroid Build Coastguard Worker new DrawableLoadingTask(mContext) { 79*90c8c64dSAndroid Build Coastguard Worker @Override 80*90c8c64dSAndroid Build Coastguard Worker protected void onPostExecute(Drawable result) { 81*90c8c64dSAndroid Build Coastguard Worker TransitionDrawable background = new TransitionDrawable(new Drawable[] { 82*90c8c64dSAndroid Build Coastguard Worker mDefaultBg, 83*90c8c64dSAndroid Build Coastguard Worker result 84*90c8c64dSAndroid Build Coastguard Worker }); 85*90c8c64dSAndroid Build Coastguard Worker mRowBackgrounds.put(row, background); 86*90c8c64dSAndroid Build Coastguard Worker notifyRowBackgroundChanged(row); 87*90c8c64dSAndroid Build Coastguard Worker background.startTransition(TRANSITION_DURATION_MILLIS); 88*90c8c64dSAndroid Build Coastguard Worker } 89*90c8c64dSAndroid Build Coastguard Worker }.execute(resid); 90*90c8c64dSAndroid Build Coastguard Worker return mDefaultBg; 91*90c8c64dSAndroid Build Coastguard Worker } 92*90c8c64dSAndroid Build Coastguard Worker }; 93*90c8c64dSAndroid Build Coastguard Worker 94*90c8c64dSAndroid Build Coastguard Worker LruCache<Point, Drawable> mPageBackgrounds = new LruCache<Point, Drawable>(3) { 95*90c8c64dSAndroid Build Coastguard Worker @Override 96*90c8c64dSAndroid Build Coastguard Worker protected Drawable create(final Point page) { 97*90c8c64dSAndroid Build Coastguard Worker // place bugdroid as the background at row 2, column 1 98*90c8c64dSAndroid Build Coastguard Worker if (page.y == 2 && page.x == 1) { 99*90c8c64dSAndroid Build Coastguard Worker int resid = R.drawable.bugdroid_large; 100*90c8c64dSAndroid Build Coastguard Worker new DrawableLoadingTask(mContext) { 101*90c8c64dSAndroid Build Coastguard Worker @Override 102*90c8c64dSAndroid Build Coastguard Worker protected void onPostExecute(Drawable result) { 103*90c8c64dSAndroid Build Coastguard Worker TransitionDrawable background = new TransitionDrawable(new Drawable[] { 104*90c8c64dSAndroid Build Coastguard Worker mClearBg, 105*90c8c64dSAndroid Build Coastguard Worker result 106*90c8c64dSAndroid Build Coastguard Worker }); 107*90c8c64dSAndroid Build Coastguard Worker mPageBackgrounds.put(page, background); 108*90c8c64dSAndroid Build Coastguard Worker notifyPageBackgroundChanged(page.y, page.x); 109*90c8c64dSAndroid Build Coastguard Worker background.startTransition(TRANSITION_DURATION_MILLIS); 110*90c8c64dSAndroid Build Coastguard Worker } 111*90c8c64dSAndroid Build Coastguard Worker }.execute(resid); 112*90c8c64dSAndroid Build Coastguard Worker } 113*90c8c64dSAndroid Build Coastguard Worker return GridPagerAdapter.BACKGROUND_NONE; 114*90c8c64dSAndroid Build Coastguard Worker } 115*90c8c64dSAndroid Build Coastguard Worker }; 116*90c8c64dSAndroid Build Coastguard Worker cardFragment(int titleRes, int textRes)117*90c8c64dSAndroid Build Coastguard Worker private Fragment cardFragment(int titleRes, int textRes) { 118*90c8c64dSAndroid Build Coastguard Worker Resources res = mContext.getResources(); 119*90c8c64dSAndroid Build Coastguard Worker CardFragment fragment = 120*90c8c64dSAndroid Build Coastguard Worker CardFragment.create(res.getText(titleRes), res.getText(textRes)); 121*90c8c64dSAndroid Build Coastguard Worker // Add some extra bottom margin to leave room for the page indicator 122*90c8c64dSAndroid Build Coastguard Worker fragment.setCardMarginBottom( 123*90c8c64dSAndroid Build Coastguard Worker res.getDimensionPixelSize(R.dimen.card_margin_bottom)); 124*90c8c64dSAndroid Build Coastguard Worker return fragment; 125*90c8c64dSAndroid Build Coastguard Worker } 126*90c8c64dSAndroid Build Coastguard Worker 127*90c8c64dSAndroid Build Coastguard Worker static final int[] BG_IMAGES = new int[] { 128*90c8c64dSAndroid Build Coastguard Worker R.drawable.debug_background_1, 129*90c8c64dSAndroid Build Coastguard Worker R.drawable.debug_background_2, 130*90c8c64dSAndroid Build Coastguard Worker R.drawable.debug_background_3, 131*90c8c64dSAndroid Build Coastguard Worker R.drawable.debug_background_4, 132*90c8c64dSAndroid Build Coastguard Worker R.drawable.debug_background_5 133*90c8c64dSAndroid Build Coastguard Worker }; 134*90c8c64dSAndroid Build Coastguard Worker 135*90c8c64dSAndroid Build Coastguard Worker /** A convenient container for a row of fragments. */ 136*90c8c64dSAndroid Build Coastguard Worker private class Row { 137*90c8c64dSAndroid Build Coastguard Worker final List<Fragment> columns = new ArrayList<Fragment>(); 138*90c8c64dSAndroid Build Coastguard Worker Row(Fragment... fragments)139*90c8c64dSAndroid Build Coastguard Worker public Row(Fragment... fragments) { 140*90c8c64dSAndroid Build Coastguard Worker for (Fragment f : fragments) { 141*90c8c64dSAndroid Build Coastguard Worker add(f); 142*90c8c64dSAndroid Build Coastguard Worker } 143*90c8c64dSAndroid Build Coastguard Worker } 144*90c8c64dSAndroid Build Coastguard Worker add(Fragment f)145*90c8c64dSAndroid Build Coastguard Worker public void add(Fragment f) { 146*90c8c64dSAndroid Build Coastguard Worker columns.add(f); 147*90c8c64dSAndroid Build Coastguard Worker } 148*90c8c64dSAndroid Build Coastguard Worker getColumn(int i)149*90c8c64dSAndroid Build Coastguard Worker Fragment getColumn(int i) { 150*90c8c64dSAndroid Build Coastguard Worker return columns.get(i); 151*90c8c64dSAndroid Build Coastguard Worker } 152*90c8c64dSAndroid Build Coastguard Worker getColumnCount()153*90c8c64dSAndroid Build Coastguard Worker public int getColumnCount() { 154*90c8c64dSAndroid Build Coastguard Worker return columns.size(); 155*90c8c64dSAndroid Build Coastguard Worker } 156*90c8c64dSAndroid Build Coastguard Worker } 157*90c8c64dSAndroid Build Coastguard Worker 158*90c8c64dSAndroid Build Coastguard Worker @Override getFragment(int row, int col)159*90c8c64dSAndroid Build Coastguard Worker public Fragment getFragment(int row, int col) { 160*90c8c64dSAndroid Build Coastguard Worker Row adapterRow = mRows.get(row); 161*90c8c64dSAndroid Build Coastguard Worker return adapterRow.getColumn(col); 162*90c8c64dSAndroid Build Coastguard Worker } 163*90c8c64dSAndroid Build Coastguard Worker 164*90c8c64dSAndroid Build Coastguard Worker @Override getBackgroundForRow(final int row)165*90c8c64dSAndroid Build Coastguard Worker public Drawable getBackgroundForRow(final int row) { 166*90c8c64dSAndroid Build Coastguard Worker return mRowBackgrounds.get(row); 167*90c8c64dSAndroid Build Coastguard Worker } 168*90c8c64dSAndroid Build Coastguard Worker 169*90c8c64dSAndroid Build Coastguard Worker @Override getBackgroundForPage(final int row, final int column)170*90c8c64dSAndroid Build Coastguard Worker public Drawable getBackgroundForPage(final int row, final int column) { 171*90c8c64dSAndroid Build Coastguard Worker return mPageBackgrounds.get(new Point(column, row)); 172*90c8c64dSAndroid Build Coastguard Worker } 173*90c8c64dSAndroid Build Coastguard Worker 174*90c8c64dSAndroid Build Coastguard Worker @Override getRowCount()175*90c8c64dSAndroid Build Coastguard Worker public int getRowCount() { 176*90c8c64dSAndroid Build Coastguard Worker return mRows.size(); 177*90c8c64dSAndroid Build Coastguard Worker } 178*90c8c64dSAndroid Build Coastguard Worker 179*90c8c64dSAndroid Build Coastguard Worker @Override getColumnCount(int rowNum)180*90c8c64dSAndroid Build Coastguard Worker public int getColumnCount(int rowNum) { 181*90c8c64dSAndroid Build Coastguard Worker return mRows.get(rowNum).getColumnCount(); 182*90c8c64dSAndroid Build Coastguard Worker } 183*90c8c64dSAndroid Build Coastguard Worker 184*90c8c64dSAndroid Build Coastguard Worker class DrawableLoadingTask extends AsyncTask<Integer, Void, Drawable> { 185*90c8c64dSAndroid Build Coastguard Worker private static final String TAG = "Loader"; 186*90c8c64dSAndroid Build Coastguard Worker private Context context; 187*90c8c64dSAndroid Build Coastguard Worker DrawableLoadingTask(Context context)188*90c8c64dSAndroid Build Coastguard Worker DrawableLoadingTask(Context context) { 189*90c8c64dSAndroid Build Coastguard Worker this.context = context; 190*90c8c64dSAndroid Build Coastguard Worker } 191*90c8c64dSAndroid Build Coastguard Worker 192*90c8c64dSAndroid Build Coastguard Worker @Override doInBackground(Integer... params)193*90c8c64dSAndroid Build Coastguard Worker protected Drawable doInBackground(Integer... params) { 194*90c8c64dSAndroid Build Coastguard Worker Log.d(TAG, "Loading asset 0x" + Integer.toHexString(params[0])); 195*90c8c64dSAndroid Build Coastguard Worker return context.getResources().getDrawable(params[0]); 196*90c8c64dSAndroid Build Coastguard Worker } 197*90c8c64dSAndroid Build Coastguard Worker } 198*90c8c64dSAndroid Build Coastguard Worker } 199