From 1df627e556d8eb9213320c66a5134d33a49f872d Mon Sep 17 00:00:00 2001 From: Jose Lima Date: Tue, 5 Aug 2014 15:13:42 -0700 Subject: Handle Launcher Start broadcast Change-Id: I609e022e6fa420490c3f011123168882f12d3326 --- apps/LeanbackCustomizer/AndroidManifest.xml | 6 +- .../partnercustomizer/BootReceiver.java | 157 ------------------- .../partnercustomizer/PartnerReceiver.java | 168 +++++++++++++++++++++ 3 files changed, 171 insertions(+), 160 deletions(-) delete mode 100644 apps/LeanbackCustomizer/src/com/android/leanbacklauncher/partnercustomizer/BootReceiver.java create mode 100644 apps/LeanbackCustomizer/src/com/android/leanbacklauncher/partnercustomizer/PartnerReceiver.java (limited to 'apps') diff --git a/apps/LeanbackCustomizer/AndroidManifest.xml b/apps/LeanbackCustomizer/AndroidManifest.xml index be2bb3d..bf3af02 100644 --- a/apps/LeanbackCustomizer/AndroidManifest.xml +++ b/apps/LeanbackCustomizer/AndroidManifest.xml @@ -7,12 +7,12 @@ - + - + @@ -20,4 +20,4 @@ - + \ No newline at end of file diff --git a/apps/LeanbackCustomizer/src/com/android/leanbacklauncher/partnercustomizer/BootReceiver.java b/apps/LeanbackCustomizer/src/com/android/leanbacklauncher/partnercustomizer/BootReceiver.java deleted file mode 100644 index 84ff367..0000000 --- a/apps/LeanbackCustomizer/src/com/android/leanbacklauncher/partnercustomizer/BootReceiver.java +++ /dev/null @@ -1,157 +0,0 @@ -/* - * 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.android.leanbacklauncher.partnercustomizer; - -import android.app.Activity; -import android.app.Notification; -import android.app.NotificationManager; -import android.app.PendingIntent; -import android.content.BroadcastReceiver; -import android.content.ComponentName; -import android.content.Context; -import android.content.Intent; -import android.content.IntentFilter; -import android.content.pm.ActivityInfo; -import android.content.pm.ApplicationInfo; -import android.content.pm.PackageInfo; -import android.content.pm.PackageManager; -import android.content.pm.ResolveInfo; -import android.graphics.Bitmap; -import android.graphics.BitmapFactory; -import android.net.Uri; -import android.os.AsyncTask; -import android.os.Bundle; -import android.os.Handler; -import android.provider.Settings; -import android.text.TextUtils; - -import java.io.IOException; -import java.io.InputStream; -import java.net.HttpURLConnection; -import java.util.ArrayList; -import java.util.List; - -/** - * This class posts notifications that are used to populate the Partner Row of the Leanback Launcher - * It also allows the system/launcher to find the correct partner customization - * package. - * - * Packages using this broadcast receiver must also be a system app to be used for - * partner customization. - */ -public class BootReceiver extends BroadcastReceiver { - - private static final String PARTNER_GROUP = "partner_row_entry"; - private static final String BLACKLIST_PACKAGE = "com.android.leanbacklauncher.replacespackage"; - - private static final String TED_PKG_NAME = "com.ted.android.tv"; - private static final String PLAY_MOVIES_PKG_NAME = "com.google.android.videos"; - - private Context mContext; - private NotificationManager mNotifMan; - private PackageManager mPkgMan; - - @Override - public void onReceive(Context context, Intent intent) { - if (mContext == null) { - mContext = context; - mNotifMan = (NotificationManager) - mContext.getSystemService(Context.NOTIFICATION_SERVICE); - mPkgMan = mContext.getPackageManager(); - } - - String action = intent.getAction(); - if (Intent.ACTION_PACKAGE_ADDED.equals(action)|| - Intent.ACTION_PACKAGE_REMOVED.equals(action)) { - postNotification(getPackageName(intent)); - } else { - postNotification(TED_PKG_NAME); - postNotification(PLAY_MOVIES_PKG_NAME); - } - } - - private void postNotification(String pkgName) { - int sort; - int resId; - int backupResId; - int titleId; - int backupTitleId; - - switch (pkgName) { - case TED_PKG_NAME: - sort = 1; - resId = R.drawable.ic_ted_banner; - backupResId = R.drawable.ic_try_ted_banner; - titleId = R.string.ted; - backupTitleId = R.string.try_ted; - break; - case PLAY_MOVIES_PKG_NAME: - sort = 2; - resId = R.drawable.ic_play_movies_banner; - backupResId = R.drawable.ic_try_play_movies_banner; - titleId = R.string.play_movies; - backupTitleId = R.string.try_play_movies; - break; - default: - return; - } - - postNotification(sort, resId, backupResId, titleId, backupTitleId, pkgName); - } - - private void postNotification(int sort, int resId, int backupResId, - int titleId, int backupTitleId, String pkgName) { - int id = resId; - Intent intent = mPkgMan.getLeanbackLaunchIntentForPackage(pkgName); - - if (intent == null) { - titleId = backupTitleId; - resId = backupResId; - intent = getBackupIntent(pkgName); - } - - Notification.Builder bob = new Notification.Builder(mContext); - Bundle extras = new Bundle(); - extras.putString(BLACKLIST_PACKAGE, pkgName); - - bob.setContentTitle(mContext.getString(titleId)) - .setSmallIcon(R.drawable.ic_launcher) - .setLargeIcon(BitmapFactory.decodeResource(mContext.getResources(), resId)) - .setContentIntent(PendingIntent.getActivity(mContext, 0, intent, 0)) - .setCategory(Notification.CATEGORY_RECOMMENDATION) - .setGroup(PARTNER_GROUP) - .setSortKey(sort+"") - .setColor(mContext.getResources().getColor(R.color.partner_color)) - .setExtras(extras); - - mNotifMan.notify(id, bob.build()); - } - - private Intent getBackupIntent(String pkgName) { - Intent intent = new Intent(Intent.ACTION_VIEW); - intent.setData(Uri.parse("market://details?id=" + pkgName)); - - return intent; - } - - private String getPackageName(Intent intent) { - Uri uri = intent.getData(); - String pkg = uri != null ? uri.getSchemeSpecificPart() : null; - return pkg; - } - -} diff --git a/apps/LeanbackCustomizer/src/com/android/leanbacklauncher/partnercustomizer/PartnerReceiver.java b/apps/LeanbackCustomizer/src/com/android/leanbacklauncher/partnercustomizer/PartnerReceiver.java new file mode 100644 index 0000000..46e4b2f --- /dev/null +++ b/apps/LeanbackCustomizer/src/com/android/leanbacklauncher/partnercustomizer/PartnerReceiver.java @@ -0,0 +1,168 @@ +/* + * 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.android.leanbacklauncher.partnercustomizer; + +import android.app.Activity; +import android.app.Notification; +import android.app.NotificationManager; +import android.app.PendingIntent; +import android.content.BroadcastReceiver; +import android.content.ComponentName; +import android.content.Context; +import android.content.Intent; +import android.content.IntentFilter; +import android.content.pm.ActivityInfo; +import android.content.pm.ApplicationInfo; +import android.content.pm.PackageInfo; +import android.content.pm.PackageManager; +import android.content.pm.ResolveInfo; +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; +import android.net.Uri; +import android.os.AsyncTask; +import android.os.Bundle; +import android.os.Handler; +import android.provider.Settings; +import android.text.TextUtils; + +import java.io.IOException; +import java.io.InputStream; +import java.net.HttpURLConnection; +import java.util.ArrayList; +import java.util.List; + +/** + * This class posts notifications that are used to populate the Partner Row of the Leanback Launcher + * It also allows the system/launcher to find the correct partner customization + * package. + * + * Packages using this broadcast receiver must also be a system app to be used for + * partner customization. + */ +public class PartnerReceiver extends BroadcastReceiver { + private static final String ACTION_PARTNER_CUSTOMIZATION = + "com.android.leanbacklauncher.action.PARTNER_CUSTOMIZATION"; + + private static final String EXTRA_ROW_WRAPPING_CUTOFF = + "com.android.leanbacklauncher.extra.ROW_WRAPPING_CUTOFF"; + + private static final String PARTNER_GROUP = "partner_row_entry"; + private static final String BLACKLIST_PACKAGE = "com.android.leanbacklauncher.replacespackage"; + + private static final String TED_PKG_NAME = "com.ted.android.tv"; + private static final String PLAY_MOVIES_PKG_NAME = "com.google.android.videos"; + + private Context mContext; + private NotificationManager mNotifMan; + private PackageManager mPkgMan; + + // Cutoff value for when the Launcher displayes the Partner row as a single + // row, or a two row grid. Can be used for correctly positioning the partner + // app entries. + private int mRowCutoff = 0; + + @Override + public void onReceive(Context context, Intent intent) { + if (mContext == null) { + mContext = context; + mNotifMan = (NotificationManager) + mContext.getSystemService(Context.NOTIFICATION_SERVICE); + mPkgMan = mContext.getPackageManager(); + } + + String action = intent.getAction(); + if (Intent.ACTION_PACKAGE_ADDED.equals(action)|| + Intent.ACTION_PACKAGE_REMOVED.equals(action)) { + postNotification(getPackageName(intent)); + } else if (ACTION_PARTNER_CUSTOMIZATION.equals(action)) { + mRowCutoff = intent.getIntExtra(EXTRA_ROW_WRAPPING_CUTOFF, 0); + postNotification(TED_PKG_NAME); + postNotification(PLAY_MOVIES_PKG_NAME); + } + } + + private void postNotification(String pkgName) { + int sort; + int resId; + int backupResId; + int titleId; + int backupTitleId; + + switch (pkgName) { + case TED_PKG_NAME: + sort = 1; + resId = R.drawable.ic_ted_banner; + backupResId = R.drawable.ic_try_ted_banner; + titleId = R.string.ted; + backupTitleId = R.string.try_ted; + break; + case PLAY_MOVIES_PKG_NAME: + sort = 2; + resId = R.drawable.ic_play_movies_banner; + backupResId = R.drawable.ic_try_play_movies_banner; + titleId = R.string.play_movies; + backupTitleId = R.string.try_play_movies; + break; + default: + return; + } + + postNotification(sort, resId, backupResId, titleId, backupTitleId, pkgName); + } + + private void postNotification(int sort, int resId, int backupResId, + int titleId, int backupTitleId, String pkgName) { + int id = resId; + Intent intent = mPkgMan.getLeanbackLaunchIntentForPackage(pkgName); + + if (intent == null) { + titleId = backupTitleId; + resId = backupResId; + intent = getBackupIntent(pkgName); + } + + Notification.Builder bob = new Notification.Builder(mContext); + Bundle extras = new Bundle(); + extras.putString(BLACKLIST_PACKAGE, pkgName); + + bob.setContentTitle(mContext.getString(titleId)) + .setSmallIcon(R.drawable.ic_launcher) + .setLargeIcon(BitmapFactory.decodeResource(mContext.getResources(), resId)) + .setContentIntent(PendingIntent.getActivity(mContext, 0, intent, 0)) + .setCategory(Notification.CATEGORY_RECOMMENDATION) + .setGroup(PARTNER_GROUP) + .setSortKey(sort+"") + .setColor(mContext.getResources().getColor(R.color.partner_color)) + .setExtras(extras); + + mNotifMan.notify(id, bob.build()); + } + + private Intent getBackupIntent(String pkgName) { + Intent intent = new Intent(Intent.ACTION_VIEW); + intent.setData(Uri.parse("market://details?id=" + pkgName)); + + return intent; + } + + private String getPackageName(Intent intent) { + Uri uri = intent.getData(); + String pkg = uri != null ? uri.getSchemeSpecificPart() : null; + return pkg; + } + +} -- cgit v1.2.3