aboutsummaryrefslogtreecommitdiff
path: root/apps/LeanbackCustomizer/src/com/android/leanbacklauncher/partnercustomizer/PartnerReceiver.java
diff options
context:
space:
mode:
Diffstat (limited to 'apps/LeanbackCustomizer/src/com/android/leanbacklauncher/partnercustomizer/PartnerReceiver.java')
-rw-r--r--apps/LeanbackCustomizer/src/com/android/leanbacklauncher/partnercustomizer/PartnerReceiver.java168
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;
+ }
+
+}