/* * 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.tvleanback.recommendation; import android.app.IntentService; import android.app.Notification; import android.app.NotificationManager; import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; import android.content.res.Resources; import android.database.Cursor; import android.graphics.Bitmap; import android.preference.PreferenceManager; import android.support.app.recommendation.ContentRecommendation; import android.util.Log; import com.bumptech.glide.Glide; import com.example.android.tvleanback.BuildConfig; import com.example.android.tvleanback.R; import com.example.android.tvleanback.data.VideoContract; import com.example.android.tvleanback.model.Video; import com.example.android.tvleanback.model.VideoCursorMapper; import com.example.android.tvleanback.ui.VideoDetailsActivity; import java.util.concurrent.ExecutionException; /* * This class builds up to MAX_RECOMMENDATIONS of ContentRecommendations and defines what happens * when they're selected from Recommendations section on the Home screen by creating an Intent. */ public class UpdateRecommendationsService extends IntentService { private static final String TAG = "RecommendationService"; private static final int MAX_RECOMMENDATIONS = 3; private static final VideoCursorMapper mVideoCursorMapper = new VideoCursorMapper(); private NotificationManager mNotifManager; public UpdateRecommendationsService() { super(TAG); } @Override public void onCreate() { super.onCreate(); if (mNotifManager == null) { mNotifManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); } } @Override protected void onHandleIntent(Intent intent) { // Generate recommendations, but only if recommendations are enabled SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this); if (!sharedPreferences.getBoolean(getString(R.string.pref_key_recommendations), true)) { Log.d(TAG, "Recommendations disabled"); mNotifManager.cancelAll(); return; } Resources res = getResources(); int cardWidth = res.getDimensionPixelSize(R.dimen.card_width); int cardHeight = res.getDimensionPixelSize(R.dimen.card_height); ContentRecommendation.Builder builder = new ContentRecommendation.Builder() .setBadgeIcon(R.drawable.videos_by_google_icon); Cursor cursor = getContentResolver().query( VideoContract.VideoEntry.CONTENT_URI, null, // projection null, // selection null, // selection clause "RANDOM() LIMIT " + MAX_RECOMMENDATIONS // sort order ); if (cursor != null && cursor.moveToNext()) { try { do { Video video = (Video) mVideoCursorMapper.convert(cursor); int id = Long.valueOf(video.id).hashCode(); builder.setIdTag("Video" + id) .setTitle(video.title) .setText(getString(R.string.popular_header)) .setContentIntentData(ContentRecommendation.INTENT_TYPE_ACTIVITY, buildPendingIntent(video, id), 0, null); Bitmap bitmap = Glide.with(getApplication()) .load(video.cardImageUrl) .asBitmap() .into(cardWidth, cardHeight) // Only use for synchronous .get() .get(); builder.setContentImage(bitmap); // Create an object holding all the information used to recommend the content. ContentRecommendation rec = builder.build(); Notification notification = rec.getNotificationObject(getApplicationContext()); if (BuildConfig.DEBUG) Log.d(TAG, "Recommending video " + video.title); // Recommend the content by publishing the notification. mNotifManager.notify(id, notification); } while (cursor.moveToNext()); } catch (InterruptedException | ExecutionException e) { Log.e(TAG, "Could not create recommendation.", e); } finally { cursor.close(); } } } private Intent buildPendingIntent(Video video, int id) { Intent detailsIntent = new Intent(this, VideoDetailsActivity.class); detailsIntent.putExtra(VideoDetailsActivity.VIDEO, video); detailsIntent.putExtra(VideoDetailsActivity.NOTIFICATION_ID, id); detailsIntent.setAction(Long.toString(video.id)); return detailsIntent; } }