package com.lody.virtual.server.notification;
import android.app.Notification;
import android.content.Context;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageInfo;
import android.os.Build;
import android.os.Bundle;
import android.text.TextUtils;
import android.widget.RemoteViews;
import com.lody.virtual.helper.utils.Reflect;
import static com.lody.virtual.os.VEnvironment.getPackageResourcePath;
/**
* @author 247321543
*/
/* package */ class NotificationCompatCompatV21 extends NotificationCompatCompatV14 {
private static final String TAG = NotificationCompatCompatV21.class.getSimpleName();
NotificationCompatCompatV21() {
super();
}
@Override
public boolean dealNotification(int id, Notification notification, String packageName) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
Context appContext = getAppContext(packageName);
return resolveRemoteViews(appContext, packageName, notification)
|| resolveRemoteViews(appContext, packageName, notification.publicVersion);
}
return super.dealNotification(id, notification, packageName);
}
private boolean resolveRemoteViews(Context appContext, String packageName, Notification notification) {
if (notification == null) {
return false;
}
String sourcePath = null;
PackageInfo packageInfo = getPackageInfo(packageName);
ApplicationInfo host = getHostContext().getApplicationInfo();
if (packageInfo != null) {
sourcePath = packageInfo.applicationInfo.sourceDir;
}
if (TextUtils.isEmpty(sourcePath)) {
sourcePath = getPackageResourcePath(packageName).getAbsolutePath();
}
//Fix RemoteViews
getNotificationFixer().fixNotificationRemoteViews(appContext, notification);
//Fix Icon
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
getNotificationFixer().fixIcon(notification.getSmallIcon(), appContext, packageInfo != null);
getNotificationFixer().fixIcon(notification.getLargeIcon(), appContext, packageInfo != null);
} else {
getNotificationFixer().fixIconImage(appContext.getResources(), notification.contentView, false, notification);
}
notification.icon = host.icon;
ApplicationInfo proxyApplicationInfo = new ApplicationInfo(host);
proxyApplicationInfo.packageName = packageName;
proxyApplicationInfo.publicSourceDir = sourcePath;
proxyApplicationInfo.sourceDir = sourcePath;
fixApplicationInfo(notification.tickerView, proxyApplicationInfo);
fixApplicationInfo(notification.contentView, proxyApplicationInfo);
fixApplicationInfo(notification.bigContentView, proxyApplicationInfo);
fixApplicationInfo(notification.headsUpContentView, proxyApplicationInfo);
Bundle bundle = Reflect.on(notification).get("extras");
if (bundle != null) {
bundle.putParcelable(EXTRA_BUILDER_APPLICATION_INFO, proxyApplicationInfo);
}
return true;
}
private ApplicationInfo getApplicationInfo(Notification notification) {
ApplicationInfo ai = getApplicationInfo(notification.tickerView);
if (ai != null) {
return ai;
}
ai = getApplicationInfo(notification.contentView);
if (ai != null) {
return ai;
}
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
ai = getApplicationInfo(notification.bigContentView);
if (ai != null) {
return ai;
}
}
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
ai = getApplicationInfo(notification.headsUpContentView);
if (ai != null) {
return ai;
}
}
return null;
}
private ApplicationInfo getApplicationInfo(RemoteViews remoteViews) {
if (remoteViews != null) {
return mirror.android.widget.RemoteViews.mApplication.get(remoteViews);
}
return null;
}
private void fixApplicationInfo(RemoteViews remoteViews, ApplicationInfo ai) {
if (remoteViews != null) {
mirror.android.widget.RemoteViews.mApplication.set(remoteViews, ai);
}
}
}