diff options
Diffstat (limited to 'apps/LeanbackCustomizer/src/com/android/leanbacklauncher/partnercustomizer/PartnerReceiver.java')
-rw-r--r-- | apps/LeanbackCustomizer/src/com/android/leanbacklauncher/partnercustomizer/PartnerReceiver.java | 168 |
1 files changed, 168 insertions, 0 deletions
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; + } + +} |