| /* |
| * Copyright (C) 2014 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| package com.example.android.wearable.gridviewpager; |
| |
| import android.app.Fragment; |
| import android.app.FragmentManager; |
| import android.content.Context; |
| import android.content.res.Resources; |
| import android.graphics.Point; |
| import android.graphics.drawable.ColorDrawable; |
| import android.graphics.drawable.Drawable; |
| import android.graphics.drawable.TransitionDrawable; |
| import android.os.AsyncTask; |
| import android.support.v4.util.LruCache; |
| import android.support.wearable.view.CardFragment; |
| import android.support.wearable.view.FragmentGridPagerAdapter; |
| import android.support.wearable.view.GridPagerAdapter; |
| import android.util.Log; |
| |
| import java.util.ArrayList; |
| import java.util.List; |
| |
| /** |
| * Constructs fragments as requested by the GridViewPager. For each row a different background is |
| * provided. |
| * <p> |
| * Always avoid loading resources from the main thread. In this sample, the background images are |
| * loaded from an background task and then updated using {@link #notifyRowBackgroundChanged(int)} |
| * and {@link #notifyPageBackgroundChanged(int, int)}. |
| */ |
| public class SampleGridPagerAdapter extends FragmentGridPagerAdapter { |
| private static final int TRANSITION_DURATION_MILLIS = 100; |
| |
| private final Context mContext; |
| private List<Row> mRows; |
| private ColorDrawable mDefaultBg; |
| |
| private ColorDrawable mClearBg; |
| |
| public SampleGridPagerAdapter(Context ctx, FragmentManager fm) { |
| super(fm); |
| mContext = ctx; |
| |
| mRows = new ArrayList<SampleGridPagerAdapter.Row>(); |
| |
| mRows.add(new Row(cardFragment(R.string.welcome_title, R.string.welcome_text))); |
| mRows.add(new Row(cardFragment(R.string.about_title, R.string.about_text))); |
| mRows.add(new Row( |
| cardFragment(R.string.cards_title, R.string.cards_text), |
| cardFragment(R.string.expansion_title, R.string.expansion_text))); |
| mRows.add(new Row( |
| cardFragment(R.string.backgrounds_title, R.string.backgrounds_text), |
| cardFragment(R.string.columns_title, R.string.columns_text))); |
| mRows.add(new Row(new CustomFragment())); |
| mRows.add(new Row(cardFragment(R.string.dismiss_title, R.string.dismiss_text))); |
| mDefaultBg = new ColorDrawable(R.color.dark_grey); |
| mClearBg = new ColorDrawable(android.R.color.transparent); |
| } |
| |
| LruCache<Integer, Drawable> mRowBackgrounds = new LruCache<Integer, Drawable>(3) { |
| @Override |
| protected Drawable create(final Integer row) { |
| int resid = BG_IMAGES[row % BG_IMAGES.length]; |
| new DrawableLoadingTask(mContext) { |
| @Override |
| protected void onPostExecute(Drawable result) { |
| TransitionDrawable background = new TransitionDrawable(new Drawable[] { |
| mDefaultBg, |
| result |
| }); |
| mRowBackgrounds.put(row, background); |
| notifyRowBackgroundChanged(row); |
| background.startTransition(TRANSITION_DURATION_MILLIS); |
| } |
| }.execute(resid); |
| return mDefaultBg; |
| } |
| }; |
| |
| LruCache<Point, Drawable> mPageBackgrounds = new LruCache<Point, Drawable>(3) { |
| @Override |
| protected Drawable create(final Point page) { |
| // place bugdroid as the background at row 2, column 1 |
| if (page.y == 2 && page.x == 1) { |
| int resid = R.drawable.bugdroid_large; |
| new DrawableLoadingTask(mContext) { |
| @Override |
| protected void onPostExecute(Drawable result) { |
| TransitionDrawable background = new TransitionDrawable(new Drawable[] { |
| mClearBg, |
| result |
| }); |
| mPageBackgrounds.put(page, background); |
| notifyPageBackgroundChanged(page.y, page.x); |
| background.startTransition(TRANSITION_DURATION_MILLIS); |
| } |
| }.execute(resid); |
| } |
| return GridPagerAdapter.BACKGROUND_NONE; |
| } |
| }; |
| |
| private Fragment cardFragment(int titleRes, int textRes) { |
| Resources res = mContext.getResources(); |
| CardFragment fragment = |
| CardFragment.create(res.getText(titleRes), res.getText(textRes)); |
| // Add some extra bottom margin to leave room for the page indicator |
| fragment.setCardMarginBottom( |
| res.getDimensionPixelSize(R.dimen.card_margin_bottom)); |
| return fragment; |
| } |
| |
| static final int[] BG_IMAGES = new int[] { |
| R.drawable.debug_background_1, |
| R.drawable.debug_background_2, |
| R.drawable.debug_background_3, |
| R.drawable.debug_background_4, |
| R.drawable.debug_background_5 |
| }; |
| |
| /** A convenient container for a row of fragments. */ |
| private class Row { |
| final List<Fragment> columns = new ArrayList<Fragment>(); |
| |
| public Row(Fragment... fragments) { |
| for (Fragment f : fragments) { |
| add(f); |
| } |
| } |
| |
| public void add(Fragment f) { |
| columns.add(f); |
| } |
| |
| Fragment getColumn(int i) { |
| return columns.get(i); |
| } |
| |
| public int getColumnCount() { |
| return columns.size(); |
| } |
| } |
| |
| @Override |
| public Fragment getFragment(int row, int col) { |
| Row adapterRow = mRows.get(row); |
| return adapterRow.getColumn(col); |
| } |
| |
| @Override |
| public Drawable getBackgroundForRow(final int row) { |
| return mRowBackgrounds.get(row); |
| } |
| |
| @Override |
| public Drawable getBackgroundForPage(final int row, final int column) { |
| return mPageBackgrounds.get(new Point(column, row)); |
| } |
| |
| @Override |
| public int getRowCount() { |
| return mRows.size(); |
| } |
| |
| @Override |
| public int getColumnCount(int rowNum) { |
| return mRows.get(rowNum).getColumnCount(); |
| } |
| |
| class DrawableLoadingTask extends AsyncTask<Integer, Void, Drawable> { |
| private static final String TAG = "Loader"; |
| private Context context; |
| |
| DrawableLoadingTask(Context context) { |
| this.context = context; |
| } |
| |
| @Override |
| protected Drawable doInBackground(Integer... params) { |
| Log.d(TAG, "Loading asset 0x" + Integer.toHexString(params[0])); |
| return context.getResources().getDrawable(params[0]); |
| } |
| } |
| } |