use of android.app.AppOpsManager in project android_packages_apps_Settings by crdroidandroid.
the class AppOpsState method buildState.
public List<AppOpEntry> buildState(OpsTemplate tpl, int uid, String packageName, Comparator<AppOpEntry> comparator, boolean privacyGuard) {
final Context context = mContext;
final HashMap<String, AppEntry> appEntries = new HashMap<String, AppEntry>();
final List<AppOpEntry> entries = new ArrayList<AppOpEntry>();
final ArrayList<String> perms = new ArrayList<String>();
final ArrayList<Integer> permOps = new ArrayList<Integer>();
final int[] opToOrder = new int[AppOpsManager._NUM_OP];
final Set<Integer> privacyGuardOps = new HashSet<>();
for (int i = 0; i < tpl.ops.length; i++) {
if (privacyGuard && isPrivacyGuardOp(tpl.ops[i])) {
// If there's a permission for this Privacy Guard OP, then
// we don't have to treat it in a special way. The application
// should have the permission declared if it uses it, so we
// will add this later when we query PackageManager
String perm = AppOpsManager.opToPermission(tpl.ops[i]);
if (perm != null) {
if (DEBUG)
Log.d(TAG, "Adding " + AppOpsManager.opToName(tpl.ops[i]) + " (" + tpl.ops[i] + ") to privacyGuardOps");
privacyGuardOps.add(tpl.ops[i]);
} else {
if (DEBUG)
Log.d(TAG, "Not adding " + AppOpsManager.opToName(tpl.ops[i]) + " (" + tpl.ops[i] + ") with perm " + perm + " to privacyGuardOps");
}
}
if (tpl.showPerms[i]) {
String perm = AppOpsManager.opToPermission(tpl.ops[i]);
if (perm != null && !perms.contains(perm)) {
perms.add(perm);
permOps.add(tpl.ops[i]);
opToOrder[tpl.ops[i]] = i;
}
}
}
// Whether to apply hide user / system app filters
final boolean applyFilters = (packageName == null);
List<AppOpsManager.PackageOps> pkgs;
if (packageName != null) {
pkgs = mAppOps.getOpsForPackage(uid, packageName, tpl.ops);
} else {
pkgs = mAppOps.getPackagesForOps(tpl.ops);
}
if (pkgs != null) {
for (int i = 0; i < pkgs.size(); i++) {
AppOpsManager.PackageOps pkgOps = pkgs.get(i);
AppEntry appEntry = getAppEntry(context, appEntries, pkgOps.getPackageName(), null, applyFilters);
if (appEntry == null) {
continue;
}
for (int j = 0; j < pkgOps.getOps().size(); j++) {
AppOpsManager.OpEntry opEntry = pkgOps.getOps().get(j);
if (privacyGuard && privacyGuardOps.contains(opEntry.getOp())) {
// for this application.
if (DEBUG)
Log.d(TAG, "Not adding " + AppOpsManager.opToName(opEntry.getOp()) + " (" + opEntry.getOp() + ")");
continue;
}
addOp(entries, pkgOps, appEntry, opEntry, packageName == null, packageName == null ? 0 : opToOrder[opEntry.getOp()]);
}
}
}
List<PackageInfo> apps;
if (packageName != null) {
apps = new ArrayList<PackageInfo>();
try {
PackageInfo pi = mPm.getPackageInfo(packageName, PackageManager.GET_PERMISSIONS);
apps.add(pi);
} catch (NameNotFoundException e) {
}
} else {
String[] permsArray = new String[perms.size()];
perms.toArray(permsArray);
apps = mPm.getPackagesHoldingPermissions(permsArray, 0);
}
for (int i = 0; i < apps.size(); i++) {
PackageInfo appInfo = apps.get(i);
AppEntry appEntry = getAppEntry(context, appEntries, appInfo.packageName, appInfo.applicationInfo, applyFilters);
if (appEntry == null) {
continue;
}
List<AppOpsManager.OpEntry> dummyOps = null;
AppOpsManager.PackageOps pkgOps = null;
if (appInfo.requestedPermissions != null) {
for (int j = 0; j < appInfo.requestedPermissions.length; j++) {
if (appInfo.requestedPermissionsFlags != null) {
if (!privacyGuard && (appInfo.requestedPermissionsFlags[j] & PackageInfo.REQUESTED_PERMISSION_GRANTED) == 0) {
if (DEBUG)
Log.d(TAG, "Pkg " + appInfo.packageName + " perm " + appInfo.requestedPermissions[j] + " not granted; skipping");
continue;
}
}
if (DEBUG)
Log.d(TAG, "Pkg " + appInfo.packageName + ": requested perm " + appInfo.requestedPermissions[j]);
for (int k = 0; k < perms.size(); k++) {
if (!perms.get(k).equals(appInfo.requestedPermissions[j])) {
continue;
}
if (DEBUG)
Log.d(TAG, "Pkg " + appInfo.packageName + " perm " + perms.get(k) + " has op " + permOps.get(k) + ": " + appEntry.hasOp(permOps.get(k)));
if (appEntry.hasOp(permOps.get(k))) {
continue;
}
if (dummyOps == null) {
dummyOps = new ArrayList<AppOpsManager.OpEntry>();
pkgOps = new AppOpsManager.PackageOps(appInfo.packageName, appInfo.applicationInfo.uid, dummyOps);
}
AppOpsManager.OpEntry opEntry = new AppOpsManager.OpEntry(permOps.get(k), AppOpsManager.MODE_ALLOWED, 0, 0, 0, -1, null, 0, 0);
dummyOps.add(opEntry);
addOp(entries, pkgOps, appEntry, opEntry, packageName == null, packageName == null ? 0 : opToOrder[opEntry.getOp()]);
}
}
}
}
// Sort the list.
Collections.sort(entries, comparator);
// Done!
return entries;
}
use of android.app.AppOpsManager in project android_packages_apps_Settings by crdroidandroid.
the class DevelopmentSettings method updateMockLocation.
private void updateMockLocation() {
AppOpsManager appOpsManager = (AppOpsManager) getSystemService(Context.APP_OPS_SERVICE);
List<PackageOps> packageOps = appOpsManager.getPackagesForOps(MOCK_LOCATION_APP_OPS);
if (packageOps != null) {
for (PackageOps packageOp : packageOps) {
if (packageOp.getOps().get(0).getMode() == AppOpsManager.MODE_ALLOWED) {
mMockLocationApp = packageOps.get(0).getPackageName();
break;
}
}
}
if (!TextUtils.isEmpty(mMockLocationApp)) {
String label = mMockLocationApp;
try {
ApplicationInfo ai = getActivity().getPackageManager().getApplicationInfo(mMockLocationApp, PackageManager.GET_DISABLED_COMPONENTS);
CharSequence appLabel = getPackageManager().getApplicationLabel(ai);
if (appLabel != null) {
label = appLabel.toString();
}
} catch (PackageManager.NameNotFoundException e) {
/* ignore */
}
mMockLocationAppPref.setSummary(getString(R.string.mock_location_app_set, label));
mHaveDebugSettings = true;
} else {
mMockLocationAppPref.setSummary(getString(R.string.mock_location_app_not_set));
}
}
use of android.app.AppOpsManager in project android_packages_apps_Settings by crdroidandroid.
the class DevelopmentSettings method writeMockLocation.
private void writeMockLocation() {
AppOpsManager appOpsManager = (AppOpsManager) getSystemService(Context.APP_OPS_SERVICE);
// Disable the app op of the previous mock location app if such.
List<PackageOps> packageOps = appOpsManager.getPackagesForOps(MOCK_LOCATION_APP_OPS);
if (packageOps != null) {
// Should be one but in case we are in a bad state due to use of command line tools.
for (PackageOps packageOp : packageOps) {
if (packageOp.getOps().get(0).getMode() != AppOpsManager.MODE_ERRORED) {
String oldMockLocationApp = packageOp.getPackageName();
try {
ApplicationInfo ai = getActivity().getPackageManager().getApplicationInfo(oldMockLocationApp, PackageManager.GET_DISABLED_COMPONENTS);
appOpsManager.setMode(AppOpsManager.OP_MOCK_LOCATION, ai.uid, oldMockLocationApp, AppOpsManager.MODE_ERRORED);
} catch (NameNotFoundException e) {
/* ignore */
}
}
}
}
// Enable the app op of the new mock location app if such.
if (!TextUtils.isEmpty(mMockLocationApp)) {
try {
ApplicationInfo ai = getActivity().getPackageManager().getApplicationInfo(mMockLocationApp, PackageManager.GET_DISABLED_COMPONENTS);
appOpsManager.setMode(AppOpsManager.OP_MOCK_LOCATION, ai.uid, mMockLocationApp, AppOpsManager.MODE_ALLOWED);
} catch (NameNotFoundException e) {
/* ignore */
}
}
}
use of android.app.AppOpsManager in project android_packages_apps_Settings by crdroidandroid.
the class VpnSettings method getVpnApps.
static List<AppVpnInfo> getVpnApps(Context context, boolean includeProfiles) {
List<AppVpnInfo> result = Lists.newArrayList();
final Set<Integer> profileIds;
if (includeProfiles) {
profileIds = new ArraySet<>();
for (UserHandle profile : UserManager.get(context).getUserProfiles()) {
profileIds.add(profile.getIdentifier());
}
} else {
profileIds = Collections.singleton(UserHandle.myUserId());
}
// Fetch VPN-enabled apps from AppOps.
AppOpsManager aom = (AppOpsManager) context.getSystemService(Context.APP_OPS_SERVICE);
List<AppOpsManager.PackageOps> apps = aom.getPackagesForOps(new int[] { OP_ACTIVATE_VPN });
if (apps != null) {
for (AppOpsManager.PackageOps pkg : apps) {
int userId = UserHandle.getUserId(pkg.getUid());
if (!profileIds.contains(userId)) {
// Skip packages for users outside of our profile group.
continue;
}
// Look for a MODE_ALLOWED permission to activate VPN.
boolean allowed = false;
for (AppOpsManager.OpEntry op : pkg.getOps()) {
if (op.getOp() == OP_ACTIVATE_VPN && op.getMode() == AppOpsManager.MODE_ALLOWED) {
allowed = true;
}
}
if (allowed) {
result.add(new AppVpnInfo(userId, pkg.getPackageName()));
}
}
}
Collections.sort(result);
return result;
}
use of android.app.AppOpsManager in project android_packages_apps_Settings by crdroidandroid.
the class AppManagementFragment method appHasVpnPermission.
@VisibleForTesting
static boolean appHasVpnPermission(Context context, @NonNull ApplicationInfo application) {
final AppOpsManager service = (AppOpsManager) context.getSystemService(Context.APP_OPS_SERVICE);
final List<AppOpsManager.PackageOps> ops = service.getOpsForPackage(application.uid, application.packageName, new int[] { OP_ACTIVATE_VPN });
return !ArrayUtils.isEmpty(ops);
}
Aggregations