aboutsummaryrefslogtreecommitdiff
path: root/src/com/android/tv/menu/ChannelsPosterPrefetcher.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/com/android/tv/menu/ChannelsPosterPrefetcher.java')
-rw-r--r--src/com/android/tv/menu/ChannelsPosterPrefetcher.java109
1 files changed, 109 insertions, 0 deletions
diff --git a/src/com/android/tv/menu/ChannelsPosterPrefetcher.java b/src/com/android/tv/menu/ChannelsPosterPrefetcher.java
new file mode 100644
index 00000000..1dca6834
--- /dev/null
+++ b/src/com/android/tv/menu/ChannelsPosterPrefetcher.java
@@ -0,0 +1,109 @@
+/*
+ * 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.android.tv.menu;
+
+import android.content.Context;
+import android.os.Handler;
+import android.os.Message;
+import android.util.Log;
+
+import com.android.tv.R;
+import com.android.tv.data.Channel;
+import com.android.tv.data.Program;
+import com.android.tv.data.ProgramDataManager;
+
+import java.util.List;
+
+/**
+ * A poster image prefetcher to show the program poster art in the Channels row faster.
+ */
+public class ChannelsPosterPrefetcher {
+ private static final String TAG = "PosterPrefetcher";
+ private static final boolean DEBUG = false;
+
+ private final ProgramDataManager mProgramDataManager;
+ private final ChannelsRowAdapter mChannelsAdapter;
+ private final int mPosterArtWidth;
+ private final int mPosterArtHeight;
+ private final Context mContext;
+
+ private static final int MSG_PREFETCH_IMAGE = 1000;
+
+ private static final int ONDEMAND_POSTER_PREFETCH_DELAY_MILLIS = 500; // 500 milliseconds
+
+ private final Handler mHandler = new Handler() {
+ @Override
+ public void handleMessage(Message msg) {
+ switch (msg.what) {
+ case MSG_PREFETCH_IMAGE:
+ doPrefetchImages();
+ break;
+ }
+ }
+ };
+
+ /**
+ * Create {@link ChannelsPosterPrefetcher} object with given parameters.
+ */
+ public ChannelsPosterPrefetcher(Context context, ProgramDataManager programDataManager,
+ ChannelsRowAdapter adapter) {
+ mProgramDataManager = programDataManager;
+ mChannelsAdapter = adapter;
+ mPosterArtWidth = context.getResources().getDimensionPixelSize(
+ R.dimen.card_image_layout_width);
+ mPosterArtHeight = context.getResources().getDimensionPixelSize(
+ R.dimen.card_image_layout_height);
+ mContext = context;
+ }
+
+ /**
+ * Start prefetching of program poster art of recommendation.
+ */
+ public void prefetch() {
+ if (DEBUG) {
+ Log.d(TAG, "startPrefetching()");
+ }
+ /*
+ * When a user browse channels, this method could be called many times. We don't need to
+ * prefetch the intermediate channels. So ignore previous schedule.
+ */
+ mHandler.removeMessages(MSG_PREFETCH_IMAGE);
+ mHandler.sendMessageDelayed(
+ mHandler.obtainMessage(MSG_PREFETCH_IMAGE), ONDEMAND_POSTER_PREFETCH_DELAY_MILLIS);
+ }
+
+ private void doPrefetchImages() {
+ if (DEBUG) {
+ Log.d(TAG, "doPrefetchImages()");
+ }
+
+ List<Channel> channelList = mChannelsAdapter.getItemList();
+ if (channelList != null) {
+ for (Channel channel : channelList) {
+ if (!Channel.isValid(channel)) {
+ continue;
+ }
+ channel.prefetchImage(mContext, Channel.LOAD_IMAGE_TYPE_CHANNEL_LOGO,
+ mPosterArtWidth, mPosterArtHeight);
+ Program program = mProgramDataManager.getCurrentProgram(channel.getId());
+ if (program != null) {
+ program.prefetchPosterArt(mContext, mPosterArtWidth, mPosterArtHeight);
+ }
+ }
+ }
+ }
+}