am 1fb51987: Merge "Show a better list of apps." into lmp-dev

* commit '1fb5198732d627baf39492651364c32848abc1f0':
  Show a better list of apps.
This commit is contained in:
Dan Sandler
2014-09-11 16:01:27 +00:00
committed by Android Git Automerger
2 changed files with 52 additions and 54 deletions

View File

@@ -143,7 +143,7 @@ public class AppNotificationSettings extends SettingsPreferenceFragment {
getPreferenceScreen().removePreference(mSensitive); getPreferenceScreen().removePreference(mSensitive);
} }
mAppRow = NotificationAppList.loadAppRow(pm, info, mBackend); mAppRow = NotificationAppList.loadAppRow(pm, info.applicationInfo, mBackend);
if (intent.hasExtra(EXTRA_HAS_SETTINGS_INTENT)) { if (intent.hasExtra(EXTRA_HAS_SETTINGS_INTENT)) {
// use settings intent from extra // use settings intent from extra
if (intent.getBooleanExtra(EXTRA_HAS_SETTINGS_INTENT, false)) { if (intent.getBooleanExtra(EXTRA_HAS_SETTINGS_INTENT, false)) {

View File

@@ -26,9 +26,9 @@ import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.content.pm.ActivityInfo; import android.content.pm.ActivityInfo;
import android.content.pm.ApplicationInfo; import android.content.pm.ApplicationInfo;
import android.content.pm.PackageInfo; import android.content.pm.LauncherActivityInfo;
import android.content.pm.LauncherApps;
import android.content.pm.PackageManager; import android.content.pm.PackageManager;
import android.content.pm.PackageManager.NameNotFoundException;
import android.content.pm.ResolveInfo; import android.content.pm.ResolveInfo;
import android.content.pm.Signature; import android.content.pm.Signature;
import android.graphics.drawable.Drawable; import android.graphics.drawable.Drawable;
@@ -95,12 +95,19 @@ public class NotificationAppList extends PinnedHeaderListFragment
private Backend mBackend = new Backend(); private Backend mBackend = new Backend();
private UserSpinnerAdapter mProfileSpinnerAdapter; private UserSpinnerAdapter mProfileSpinnerAdapter;
private PackageManager mPM;
private UserManager mUM;
private LauncherApps mLauncherApps;
@Override @Override
public void onCreate(Bundle savedInstanceState) { public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
mContext = getActivity(); mContext = getActivity();
mInflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE); mInflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
mAdapter = new NotificationAppAdapter(mContext); mAdapter = new NotificationAppAdapter(mContext);
mUM = UserManager.get(mContext);
mPM = mContext.getPackageManager();
mLauncherApps = (LauncherApps) mContext.getSystemService(Context.LAUNCHER_APPS_SERVICE);
getActivity().setTitle(R.string.app_notifications_title); getActivity().setTitle(R.string.app_notifications_title);
} }
@@ -113,8 +120,7 @@ public class NotificationAppList extends PinnedHeaderListFragment
@Override @Override
public void onViewCreated(View view, Bundle savedInstanceState) { public void onViewCreated(View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState); super.onViewCreated(view, savedInstanceState);
final UserManager um = (UserManager) getActivity().getSystemService(Context.USER_SERVICE); mProfileSpinnerAdapter = Utils.createUserSpinnerAdapter(mUM, mContext);
mProfileSpinnerAdapter = Utils.createUserSpinnerAdapter(um, mContext);
if (mProfileSpinnerAdapter != null) { if (mProfileSpinnerAdapter != null) {
Spinner spinner = (Spinner) getActivity().getLayoutInflater().inflate( Spinner spinner = (Spinner) getActivity().getLayoutInflater().inflate(
R.layout.spinner_view, null); R.layout.spinner_view, null);
@@ -363,17 +369,18 @@ public class NotificationAppList extends PinnedHeaderListFragment
}; };
public static AppRow loadAppRow(PackageManager pm, PackageInfo pkg, Backend backend) { public static AppRow loadAppRow(PackageManager pm, ApplicationInfo app,
Backend backend) {
final AppRow row = new AppRow(); final AppRow row = new AppRow();
row.pkg = pkg.packageName; row.pkg = app.packageName;
row.uid = pkg.applicationInfo.uid; row.uid = app.uid;
try { try {
row.label = pkg.applicationInfo.loadLabel(pm); row.label = app.loadLabel(pm);
} catch (Throwable t) { } catch (Throwable t) {
Log.e(TAG, "Error loading application label for " + row.pkg, t); Log.e(TAG, "Error loading application label for " + row.pkg, t);
row.label = row.pkg; row.label = row.pkg;
} }
row.icon = pkg.applicationInfo.loadIcon(pm); row.icon = app.loadIcon(pm);
row.banned = backend.getNotificationsBanned(row.pkg, row.uid); row.banned = backend.getNotificationsBanned(row.pkg, row.uid);
row.priority = backend.getHighPriority(row.pkg, row.uid); row.priority = backend.getHighPriority(row.pkg, row.uid);
row.sensitive = backend.getSensitive(row.pkg, row.uid); row.sensitive = backend.getSensitive(row.pkg, row.uid);
@@ -429,40 +436,40 @@ public class NotificationAppList extends PinnedHeaderListFragment
mSortedRows.clear(); mSortedRows.clear();
// collect all launchable apps, plus any packages that have notification settings // collect all launchable apps, plus any packages that have notification settings
final PackageManager pm = mContext.getPackageManager(); final List<ApplicationInfo> appInfos = new ArrayList<ApplicationInfo>();
final List<ResolveInfo> resolvedApps = pm.queryIntentActivities(
new Intent(Intent.ACTION_MAIN).addCategory(Intent.CATEGORY_LAUNCHER),
PackageManager.MATCH_DEFAULT_ONLY
);
final List<ResolveInfo> resolvedConfigActivities
= queryNotificationConfigActivities(pm);
resolvedApps.addAll(resolvedConfigActivities);
for (ResolveInfo info : resolvedApps) { final List<LauncherActivityInfo> lais
String pkgName = info.activityInfo.packageName; = mLauncherApps.getActivityList(null /* all */,
if (mRows.containsKey(pkgName)) { UserHandle.getCallingUserHandle());
if (DEBUG) Log.d(TAG, " launchable activities:");
for (LauncherActivityInfo lai : lais) {
if (DEBUG) Log.d(TAG, " " + lai.getComponentName().toString());
appInfos.add(lai.getApplicationInfo());
}
final List<ResolveInfo> resolvedConfigActivities
= queryNotificationConfigActivities(mPM);
if (DEBUG) Log.d(TAG, " config activities:");
for (ResolveInfo ri : resolvedConfigActivities) {
if (DEBUG) Log.d(TAG, " "
+ ri.activityInfo.packageName + "/" + ri.activityInfo.name);
appInfos.add(ri.activityInfo.applicationInfo);
}
for (ApplicationInfo info : appInfos) {
final String key = info.packageName;
if (mRows.containsKey(key)) {
// we already have this app, thanks // we already have this app, thanks
continue; continue;
} }
PackageInfo pkg = null; final AppRow row = loadAppRow(mPM, info, mBackend);
try { mRows.put(key, row);
pkg = pm.getPackageInfo(pkgName,
PackageManager.GET_SIGNATURES);
} catch (NameNotFoundException e) {
if (DEBUG) Log.d(TAG, "Skipping (NNFE): " + pkg.packageName);
continue;
}
if (info.activityInfo.applicationInfo == null) {
if (DEBUG) Log.d(TAG, "Skipping (no applicationInfo): " + pkg.packageName);
continue;
}
final AppRow row = loadAppRow(pm, pkg, mBackend);
mRows.put(pkgName, row);
} }
// add config activities to the list // add config activities to the list
applyConfigActivities(pm, mRows, resolvedConfigActivities); applyConfigActivities(mPM, mRows, resolvedConfigActivities);
// sort rows // sort rows
mSortedRows.addAll(mRows.values()); mSortedRows.addAll(mRows.values());
Collections.sort(mSortedRows, mRowComparator); Collections.sort(mSortedRows, mRowComparator);
@@ -520,11 +527,12 @@ public class NotificationAppList extends PinnedHeaderListFragment
}; };
public static class Backend { public static class Backend {
public boolean setNotificationsBanned(String pkg, int uid, boolean banned) { static INotificationManager sINM = INotificationManager.Stub.asInterface(
INotificationManager nm = INotificationManager.Stub.asInterface(
ServiceManager.getService(Context.NOTIFICATION_SERVICE)); ServiceManager.getService(Context.NOTIFICATION_SERVICE));
public boolean setNotificationsBanned(String pkg, int uid, boolean banned) {
try { try {
nm.setNotificationsEnabledForPackage(pkg, uid, !banned); sINM.setNotificationsEnabledForPackage(pkg, uid, !banned);
return true; return true;
} catch (Exception e) { } catch (Exception e) {
Log.w(TAG, "Error calling NoMan", e); Log.w(TAG, "Error calling NoMan", e);
@@ -533,10 +541,8 @@ public class NotificationAppList extends PinnedHeaderListFragment
} }
public boolean getNotificationsBanned(String pkg, int uid) { public boolean getNotificationsBanned(String pkg, int uid) {
INotificationManager nm = INotificationManager.Stub.asInterface(
ServiceManager.getService(Context.NOTIFICATION_SERVICE));
try { try {
final boolean enabled = nm.areNotificationsEnabledForPackage(pkg, uid); final boolean enabled = sINM.areNotificationsEnabledForPackage(pkg, uid);
return !enabled; return !enabled;
} catch (Exception e) { } catch (Exception e) {
Log.w(TAG, "Error calling NoMan", e); Log.w(TAG, "Error calling NoMan", e);
@@ -545,10 +551,8 @@ public class NotificationAppList extends PinnedHeaderListFragment
} }
public boolean getHighPriority(String pkg, int uid) { public boolean getHighPriority(String pkg, int uid) {
INotificationManager nm = INotificationManager.Stub.asInterface(
ServiceManager.getService(Context.NOTIFICATION_SERVICE));
try { try {
return nm.getPackagePriority(pkg, uid) == Notification.PRIORITY_MAX; return sINM.getPackagePriority(pkg, uid) == Notification.PRIORITY_MAX;
} catch (Exception e) { } catch (Exception e) {
Log.w(TAG, "Error calling NoMan", e); Log.w(TAG, "Error calling NoMan", e);
return false; return false;
@@ -556,10 +560,8 @@ public class NotificationAppList extends PinnedHeaderListFragment
} }
public boolean setHighPriority(String pkg, int uid, boolean highPriority) { public boolean setHighPriority(String pkg, int uid, boolean highPriority) {
INotificationManager nm = INotificationManager.Stub.asInterface(
ServiceManager.getService(Context.NOTIFICATION_SERVICE));
try { try {
nm.setPackagePriority(pkg, uid, sINM.setPackagePriority(pkg, uid,
highPriority ? Notification.PRIORITY_MAX : Notification.PRIORITY_DEFAULT); highPriority ? Notification.PRIORITY_MAX : Notification.PRIORITY_DEFAULT);
return true; return true;
} catch (Exception e) { } catch (Exception e) {
@@ -569,10 +571,8 @@ public class NotificationAppList extends PinnedHeaderListFragment
} }
public boolean getSensitive(String pkg, int uid) { public boolean getSensitive(String pkg, int uid) {
INotificationManager nm = INotificationManager.Stub.asInterface(
ServiceManager.getService(Context.NOTIFICATION_SERVICE));
try { try {
return nm.getPackageVisibilityOverride(pkg, uid) == Notification.VISIBILITY_PRIVATE; return sINM.getPackageVisibilityOverride(pkg, uid) == Notification.VISIBILITY_PRIVATE;
} catch (Exception e) { } catch (Exception e) {
Log.w(TAG, "Error calling NoMan", e); Log.w(TAG, "Error calling NoMan", e);
return false; return false;
@@ -580,10 +580,8 @@ public class NotificationAppList extends PinnedHeaderListFragment
} }
public boolean setSensitive(String pkg, int uid, boolean sensitive) { public boolean setSensitive(String pkg, int uid, boolean sensitive) {
INotificationManager nm = INotificationManager.Stub.asInterface(
ServiceManager.getService(Context.NOTIFICATION_SERVICE));
try { try {
nm.setPackageVisibilityOverride(pkg, uid, sINM.setPackageVisibilityOverride(pkg, uid,
sensitive ? Notification.VISIBILITY_PRIVATE sensitive ? Notification.VISIBILITY_PRIVATE
: NotificationListenerService.Ranking.VISIBILITY_NO_OVERRIDE); : NotificationListenerService.Ranking.VISIBILITY_NO_OVERRIDE);
return true; return true;