blob: daef196eddc44f2286521bb631c2db46d886444a [file] [log] [blame]
/*
* 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.google.android.leanbacklauncher.partnercustomizer;
import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.graphics.BitmapFactory;
import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
/**
* 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.google.android.leanbacklauncher.action.PARTNER_CUSTOMIZATION";
private static final String EXTRA_ROW_WRAPPING_CUTOFF =
"com.google.android.leanbacklauncher.extra.ROW_WRAPPING_CUTOFF";
private static final String PARTNER_GROUP = "partner_row_entry";
private static final String BLACKLIST_PACKAGE = "com.google.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 displays 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;
}
}