/*
* Copyright (C) 2015 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.settings.notification;
import android.app.INotificationManager;
import android.app.Notification;
import android.content.Context;
import android.content.Intent;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.graphics.drawable.Drawable;
import android.os.ServiceManager;
import android.os.UserHandle;
import android.service.notification.NotificationListenerService;
import android.util.Log;
import com.android.internal.widget.LockPatternUtils;
import com.android.settingslib.Utils;
public class NotificationBackend {
private static final String TAG = "NotificationBackend";
static INotificationManager sINM = INotificationManager.Stub.asInterface(
ServiceManager.getService(Context.NOTIFICATION_SERVICE));
public AppRow loadAppRow(Context context, PackageManager pm, ApplicationInfo app) {
final AppRow row = new AppRow();
row.pkg = app.packageName;
row.uid = app.uid;
try {
row.label = app.loadLabel(pm);
} catch (Throwable t) {
Log.e(TAG, "Error loading application label for " + row.pkg, t);
row.label = row.pkg;
}
row.icon = app.loadIcon(pm);
row.banned = getNotificationsBanned(row.pkg, row.uid);
row.appImportance = getImportance(row.pkg, row.uid);
row.appBypassDnd = getBypassZenMode(row.pkg, row.uid);
row.appVisOverride = getVisibilityOverride(row.pkg, row.uid);
row.soundTimeout = getNotificationSoundTimeout(row.pkg, row.uid);
row.lockScreenSecure = new LockPatternUtils(context).isSecure(
UserHandle.myUserId());
return row;
}
public AppRow loadAppRow(Context context, PackageManager pm, PackageInfo app) {
final AppRow row = loadAppRow(context, pm, app.applicationInfo);
row.cantBlock = Utils.isSystemPackage(context.getResources(), pm, app);
final String[] nonBlockablePkgs = context.getResources().getStringArray(
com.android.internal.R.array.config_nonBlockableNotificationPackages);
if (nonBlockablePkgs != null) {
int N = nonBlockablePkgs.length;
for (int i = 0; i < N; i++) {
if (app.packageName.equals(nonBlockablePkgs[i])) {
row.cantBlock = row.cantSilence = true;
}
}
}
return row;
}
public boolean getNotificationsBanned(String pkg, int uid) {
try {
final boolean enabled = sINM.areNotificationsEnabledForPackage(pkg, uid);
return !enabled;
} catch (Exception e) {
Log.w(TAG, "Error calling NoMan", e);
return false;
}
}
public boolean getBypassZenMode(String pkg, int uid) {
try {
return sINM.getPriority(pkg, uid) == Notification.PRIORITY_MAX;
} catch (Exception e) {
Log.w(TAG, "Error calling NoMan", e);
return false;
}
}
public boolean setBypassZenMode(String pkg, int uid, boolean bypassZen) {
try {
sINM.setPriority(pkg, uid,
bypassZen ? Notification.PRIORITY_MAX : Notification.PRIORITY_DEFAULT);
return true;
} catch (Exception e) {
Log.w(TAG, "Error calling NoMan", e);
return false;
}
}
public int getVisibilityOverride(String pkg, int uid) {
try {
return sINM.getVisibilityOverride(pkg, uid);
} catch (Exception e) {
Log.w(TAG, "Error calling NoMan", e);
return NotificationListenerService.Ranking.VISIBILITY_NO_OVERRIDE;
}
}
public boolean setVisibilityOverride(String pkg, int uid, int override) {
try {
sINM.setVisibilityOverride(pkg, uid, override);
return true;
} catch (Exception e) {
Log.w(TAG, "Error calling NoMan", e);
return false;
}
}
public boolean setImportance(String pkg, int uid, int importance) {
try {
sINM.setImportance(pkg, uid, importance);
return true;
} catch (Exception e) {
Log.w(TAG, "Error calling NoMan", e);
return false;
}
}
public int getImportance(String pkg, int uid) {
try {
return sINM.getImportance(pkg, uid);
} catch (Exception e) {
Log.w(TAG, "Error calling NoMan", e);
return NotificationListenerService.Ranking.IMPORTANCE_UNSPECIFIED;
}
}
public long getNotificationSoundTimeout(String pkg, int uid) {
try {
return sINM.getNotificationSoundTimeout(pkg, uid);
} catch (Exception e) {
Log.w(TAG, "Error calling NoMan", e);
return 0;
}
}
public boolean setNotificationSoundTimeout(String pkg, int uid, long timeout) {
try {
sINM.setNotificationSoundTimeout(pkg, uid, timeout);
return true;
} catch (Exception e) {
Log.w(TAG, "Error calling NoMan", e);
return false;
}
}
static class Row {
public String section;
}
public static class AppRow extends Row {
public String pkg;
public int uid;
public Drawable icon;
public CharSequence label;
public Intent settingsIntent;
public boolean banned;
public boolean first; // first app in section
public boolean cantBlock;
public boolean cantSilence;
public int appImportance;
public boolean appBypassDnd;
public int appVisOverride;
public long soundTimeout;
public boolean lockScreenSecure;
}
}