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