Merge "Show all apps that can perform an op."

This commit is contained in:
Dianne Hackborn
2013-01-17 02:52:17 +00:00
committed by Android (Google) Code Review
2 changed files with 59 additions and 9 deletions

View File

@@ -3,6 +3,7 @@ package com.android.settings.applications;
import android.app.AppOpsManager; import android.app.AppOpsManager;
import android.app.ListFragment; import android.app.ListFragment;
import android.app.LoaderManager; import android.app.LoaderManager;
import android.app.AppOpsManager.OpEntry;
import android.content.AsyncTaskLoader; import android.content.AsyncTaskLoader;
import android.content.BroadcastReceiver; import android.content.BroadcastReceiver;
import android.content.Context; import android.content.Context;
@@ -11,6 +12,7 @@ import android.content.IntentFilter;
import android.content.Loader; import android.content.Loader;
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.PackageManager; import android.content.pm.PackageManager;
import android.content.res.Configuration; import android.content.res.Configuration;
import android.content.res.Resources; import android.content.res.Resources;
@@ -112,9 +114,10 @@ public class AppOpsCategory extends ListFragment implements
public AppOpsCategory() { public AppOpsCategory() {
} }
public AppOpsCategory(int[] ops) { public AppOpsCategory(int[] ops, String[] perms) {
Bundle args = new Bundle(); Bundle args = new Bundle();
args.putIntArray("ops", ops); args.putIntArray("ops", ops);
args.putStringArray("perms", perms);
setArguments(args); setArguments(args);
} }
@@ -228,17 +231,19 @@ public class AppOpsCategory extends ListFragment implements
final AppOpsManager mAppOps; final AppOpsManager mAppOps;
final PackageManager mPm; final PackageManager mPm;
final int[] mOps; final int[] mOps;
final String[] mPerms;
final HashMap<String, AppEntry> mAppEntries = new HashMap<String, AppEntry>(); final HashMap<String, AppEntry> mAppEntries = new HashMap<String, AppEntry>();
List<AppOpEntry> mApps; List<AppOpEntry> mApps;
PackageIntentReceiver mPackageObserver; PackageIntentReceiver mPackageObserver;
public AppListLoader(Context context, int[] ops) { public AppListLoader(Context context, int[] ops, String[] perms) {
super(context); super(context);
mAppOps = (AppOpsManager)context.getSystemService(Context.APP_OPS_SERVICE); mAppOps = (AppOpsManager)context.getSystemService(Context.APP_OPS_SERVICE);
mPm = context.getPackageManager(); mPm = context.getPackageManager();
mOps = ops; mOps = ops;
mPerms = perms;
} }
@Override public List<AppOpEntry> loadInBackground() { @Override public List<AppOpEntry> loadInBackground() {
@@ -268,6 +273,26 @@ public class AppOpsCategory extends ListFragment implements
} }
} }
if (mPerms != null) {
List<PackageInfo> apps = mPm.getPackagesHoldingPermissions(mPerms, 0);
for (int i=0; i<apps.size(); i++) {
PackageInfo appInfo = apps.get(i);
AppEntry appEntry = mAppEntries.get(appInfo.packageName);
if (appEntry == null) {
appEntry = new AppEntry(this, appInfo.applicationInfo);
appEntry.loadLabel(context);
mAppEntries.put(appInfo.packageName, appEntry);
List<AppOpsManager.OpEntry> dummyOps = new ArrayList<AppOpsManager.OpEntry>();
AppOpsManager.OpEntry opEntry = new AppOpsManager.OpEntry(0, 0, 0);
dummyOps.add(opEntry);
AppOpsManager.PackageOps pkgOps = new AppOpsManager.PackageOps(
appInfo.packageName, appInfo.applicationInfo.uid, dummyOps);
AppOpEntry entry = new AppOpEntry(pkgOps, opEntry, appEntry);
entries.add(entry);
}
}
}
// Sort the list. // Sort the list.
Collections.sort(entries, APP_OP_COMPARATOR); Collections.sort(entries, APP_OP_COMPARATOR);
@@ -404,7 +429,7 @@ public class AppOpsCategory extends ListFragment implements
CharSequence opTimeToString(AppOpsManager.OpEntry op) { CharSequence opTimeToString(AppOpsManager.OpEntry op) {
if (op.isRunning()) { if (op.isRunning()) {
return "Running"; return mRunningStr;
} }
return DateUtils.getRelativeTimeSpanString(op.getTime(), return DateUtils.getRelativeTimeSpanString(op.getTime(),
System.currentTimeMillis(), System.currentTimeMillis(),
@@ -428,9 +453,14 @@ public class AppOpsCategory extends ListFragment implements
((ImageView)view.findViewById(R.id.app_icon)).setImageDrawable( ((ImageView)view.findViewById(R.id.app_icon)).setImageDrawable(
item.getAppEntry().getIcon()); item.getAppEntry().getIcon());
((TextView)view.findViewById(R.id.app_name)).setText(item.getAppEntry().getLabel()); ((TextView)view.findViewById(R.id.app_name)).setText(item.getAppEntry().getLabel());
((TextView)view.findViewById(R.id.op_name)).setText( if (item.getOpEntry().getTime() != 0) {
mOpNames[item.getOpEntry().getOp()]); ((TextView)view.findViewById(R.id.op_name)).setText(
((TextView)view.findViewById(R.id.op_time)).setText(opTimeToString(item.getOpEntry())); mOpNames[item.getOpEntry().getOp()]);
((TextView)view.findViewById(R.id.op_time)).setText(opTimeToString(item.getOpEntry()));
} else {
((TextView)view.findViewById(R.id.op_name)).setText("");
((TextView)view.findViewById(R.id.op_time)).setText("");
}
return view; return view;
} }
@@ -465,7 +495,13 @@ public class AppOpsCategory extends ListFragment implements
@Override public Loader<List<AppOpEntry>> onCreateLoader(int id, Bundle args) { @Override public Loader<List<AppOpEntry>> onCreateLoader(int id, Bundle args) {
Bundle fargs = getArguments(); Bundle fargs = getArguments();
return new AppListLoader(getActivity(), fargs != null ? fargs.getIntArray("ops") : null); int[] ops = null;
String[] perms = null;
if (fargs != null) {
ops = fargs.getIntArray("ops");
perms = fargs.getStringArray("perms");
}
return new AppListLoader(getActivity(), ops, perms);
} }
@Override public void onLoadFinished(Loader<List<AppOpEntry>> loader, List<AppOpEntry> data) { @Override public void onLoadFinished(Loader<List<AppOpEntry>> loader, List<AppOpEntry> data) {

View File

@@ -26,7 +26,7 @@ public class AppOpsSummary extends Fragment {
static int[][] sPageOps = new int[][] { static int[][] sPageOps = new int[][] {
// "Location" page. // "Location" page.
new int[] { AppOpsManager.OP_COARSE_LOCATION, AppOpsManager.OP_FINE_LOCATION, new int[] { AppOpsManager.OP_COARSE_LOCATION, AppOpsManager.OP_FINE_LOCATION,
AppOpsManager.OP_GPS}, AppOpsManager.OP_GPS },
// "Personal" page. // "Personal" page.
new int[] { AppOpsManager.OP_READ_CONTACTS, AppOpsManager.OP_WRITE_CONTACTS, new int[] { AppOpsManager.OP_READ_CONTACTS, AppOpsManager.OP_WRITE_CONTACTS,
@@ -35,6 +35,20 @@ public class AppOpsSummary extends Fragment {
// "Device" page. // "Device" page.
new int[] { AppOpsManager.OP_VIBRATE }, new int[] { AppOpsManager.OP_VIBRATE },
}; };
static String[][] sPagePerms = new String[][] {
// "Location" page.
new String[] { android.Manifest.permission.ACCESS_COARSE_LOCATION,
android.Manifest.permission.ACCESS_FINE_LOCATION },
// "Personal" page.
new String[] { android.Manifest.permission.READ_CONTACTS,
android.Manifest.permission.WRITE_CONTACTS,
android.Manifest.permission.READ_CALL_LOG,
android.Manifest.permission.WRITE_CALL_LOG },
// "Device" page.
new String[] { android.Manifest.permission.VIBRATE },
};
int mCurPos; int mCurPos;
@@ -46,7 +60,7 @@ public class AppOpsSummary extends Fragment {
@Override @Override
public Fragment getItem(int position) { public Fragment getItem(int position) {
return new AppOpsCategory(sPageOps[position]); return new AppOpsCategory(sPageOps[position], sPagePerms[position]);
} }
@Override @Override