From cada78686054bee000158e326cc40d7178cc36ab Mon Sep 17 00:00:00 2001 From: Craig Stout Date: Tue, 10 Feb 2015 13:37:24 -0800 Subject: Add backgrounds. Change-Id: I1f48ab3f6b914132f0c2560657e419b3f3ace882 --- .../example/android/leanback/BackgroundHelper.java | 140 +++++++++++++++++++++ .../example/android/leanback/BrowseFragment.java | 8 ++ .../example/android/leanback/DetailsFragment.java | 3 + 3 files changed, 151 insertions(+) create mode 100644 samples/SupportLeanbackDemos/src/com/example/android/leanback/BackgroundHelper.java (limited to 'samples/SupportLeanbackDemos') diff --git a/samples/SupportLeanbackDemos/src/com/example/android/leanback/BackgroundHelper.java b/samples/SupportLeanbackDemos/src/com/example/android/leanback/BackgroundHelper.java new file mode 100644 index 000000000..95d3cb68d --- /dev/null +++ b/samples/SupportLeanbackDemos/src/com/example/android/leanback/BackgroundHelper.java @@ -0,0 +1,140 @@ +/* + * Copyright (C) 2015 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.leanback; + +import android.app.Activity; +import android.graphics.Bitmap; +import android.graphics.drawable.BitmapDrawable; +import android.graphics.drawable.Drawable; +import android.os.AsyncTask; +import android.os.Handler; +import android.support.v17.leanback.app.BackgroundManager; +import android.util.Log; + +public class BackgroundHelper { + + private static final String TAG = "BackgroundHelper"; + private static final boolean DEBUG = false; + private static final boolean ENABLED = true; + + // Background delay serves to avoid kicking off expensive bitmap loading + // in case multiple backgrounds are set in quick succession. + private static final int SET_BACKGROUND_DELAY_MS = 100; + + static class Request { + Object mImageToken; + Activity mActivity; + Bitmap mResult; + + Request(Activity activity, Object imageToken) { + mActivity = activity; + mImageToken = imageToken; + } + } + + public BackgroundHelper() { + if (DEBUG && !ENABLED) Log.v(TAG, "BackgroundHelper: disabled"); + } + + class LoadBackgroundRunnable implements Runnable { + Request mRequest; + + LoadBackgroundRunnable(Activity activity, Object imageToken) { + mRequest = new Request(activity, imageToken); + } + + @Override + public void run() { + if (mTask != null) { + if (DEBUG) Log.v(TAG, "Cancelling task"); + mTask.cancel(true); + } + if (DEBUG) Log.v(TAG, "Executing task"); + mTask = new LoadBitmapTask(); + mTask.execute(mRequest); + mRunnable = null; + } + }; + + class LoadBitmapTask extends AsyncTask { + @Override + protected Request doInBackground(Request... params) { + boolean cancelled = isCancelled(); + if (DEBUG) Log.v(TAG, "doInBackground cancelled " + cancelled); + Request request = params[0]; + if (!cancelled) { + request.mResult = loadBitmap(request.mActivity, request.mImageToken); + } + return request; + } + + @Override + protected void onPostExecute(Request request) { + if (DEBUG) Log.v(TAG, "onPostExecute"); + applyBackground(request.mActivity, request.mResult); + if (mTask == this) { + mTask = null; + } + } + + @Override + protected void onCancelled(Request request) { + if (DEBUG) Log.v(TAG, "onCancelled"); + } + + private Bitmap loadBitmap(Activity activity, Object imageToken) { + if (imageToken instanceof Integer) { + final int resourceId = (Integer) imageToken; + Drawable drawable = activity.getDrawable(resourceId); + if (drawable instanceof BitmapDrawable) { + return ((BitmapDrawable) drawable).getBitmap(); + } + } + return null; + } + + private void applyBackground(Activity activity, Bitmap bitmap) { + BackgroundManager backgroundManager = BackgroundManager.getInstance(activity); + if (bitmap == null || backgroundManager == null || !backgroundManager.isAttached()) { + return; + } + backgroundManager.setBitmap(bitmap); + } + } + + private LoadBackgroundRunnable mRunnable; + private LoadBitmapTask mTask; + + public void attach(Activity activity) { + if (!ENABLED) { + return; + } + BackgroundManager.getInstance(activity).attach(activity.getWindow()); + } + + public void setBackground(Activity activity, Object imageToken) { + if (!ENABLED) { + return; + } + Handler handler = activity.getWindow().getDecorView().getHandler(); + if (mRunnable != null) { + handler.removeCallbacks(mRunnable); + } + mRunnable = new LoadBackgroundRunnable(activity, imageToken); + handler.postDelayed(mRunnable, SET_BACKGROUND_DELAY_MS); + } +} diff --git a/samples/SupportLeanbackDemos/src/com/example/android/leanback/BrowseFragment.java b/samples/SupportLeanbackDemos/src/com/example/android/leanback/BrowseFragment.java index 91fec5fdc..a0a62f03e 100644 --- a/samples/SupportLeanbackDemos/src/com/example/android/leanback/BrowseFragment.java +++ b/samples/SupportLeanbackDemos/src/com/example/android/leanback/BrowseFragment.java @@ -37,6 +37,7 @@ public class BrowseFragment extends android.support.v17.leanback.app.BrowseFragm private static final boolean TEST_ENTRANCE_TRANSITION = true; private static final int NUM_ROWS = 10; private ArrayObjectAdapter mRowsAdapter; + private BackgroundHelper mBackgroundHelper = new BackgroundHelper(); @Override public void onCreate(Bundle savedInstanceState) { @@ -62,6 +63,11 @@ public class BrowseFragment extends android.support.v17.leanback.app.BrowseFragm public void onItemSelected(Presenter.ViewHolder itemViewHolder, Object item, RowPresenter.ViewHolder rowViewHolder, Row row) { Log.i(TAG, "onItemSelected: " + item + " row " + row); + + if (item instanceof PhotoItem) { + mBackgroundHelper.setBackground( + getActivity(), ((PhotoItem) item).getImageResourceId()); + } } }); if (TEST_ENTRANCE_TRANSITION) { @@ -76,6 +82,8 @@ public class BrowseFragment extends android.support.v17.leanback.app.BrowseFragm } }, 2000); } + + mBackgroundHelper.attach(getActivity()); } private void setupRows() { diff --git a/samples/SupportLeanbackDemos/src/com/example/android/leanback/DetailsFragment.java b/samples/SupportLeanbackDemos/src/com/example/android/leanback/DetailsFragment.java index bc88e2109..32f829c83 100644 --- a/samples/SupportLeanbackDemos/src/com/example/android/leanback/DetailsFragment.java +++ b/samples/SupportLeanbackDemos/src/com/example/android/leanback/DetailsFragment.java @@ -44,6 +44,7 @@ public class DetailsFragment extends android.support.v17.leanback.app.DetailsFra private ArrayObjectAdapter mRowsAdapter; private PhotoItem mPhotoItem; final CardPresenter cardPresenter = new CardPresenter(); + private BackgroundHelper mBackgroundHelper = new BackgroundHelper(); private static final int ACTION_BUY = 1; private static final int ACTION_RENT = 2; @@ -131,6 +132,8 @@ public class DetailsFragment extends android.support.v17.leanback.app.DetailsFra prepareEntranceTransition(); } } + + mBackgroundHelper.attach(getActivity()); } @Override -- cgit v1.2.3