summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rwxr-xr-xsrc/com/android/packageinstaller/InstallInstalling.java2
-rw-r--r--src/com/android/packageinstaller/PackageInstallerActivity.java9
-rw-r--r--src/com/android/packageinstaller/UninstallUninstalling.java1
-rw-r--r--src/com/android/packageinstaller/permission/model/AppPermissions.java3
-rw-r--r--src/com/android/packageinstaller/permission/ui/handheld/GrantPermissionsViewHandlerImpl.java3
-rw-r--r--src/com/android/packageinstaller/permission/ui/handheld/PermissionAppsFragment.java20
-rw-r--r--src/com/android/packageinstaller/permission/ui/television/AllAppPermissionsFragment.java3
-rw-r--r--src/com/android/packageinstaller/permission/ui/wear/AppPermissionsFragmentWear.java123
-rw-r--r--src/com/android/packageinstaller/permission/utils/Utils.java6
-rwxr-xr-xsrc/com/android/packageinstaller/television/UninstallAppProgress.java9
10 files changed, 143 insertions, 36 deletions
diff --git a/src/com/android/packageinstaller/InstallInstalling.java b/src/com/android/packageinstaller/InstallInstalling.java
index 1eea4954..9f23e001 100755
--- a/src/com/android/packageinstaller/InstallInstalling.java
+++ b/src/com/android/packageinstaller/InstallInstalling.java
@@ -384,6 +384,8 @@ public class InstallInstalling extends Activity {
protected void onPostExecute(PackageInstaller.Session session) {
if (session != null) {
Intent broadcastIntent = new Intent(BROADCAST_ACTION);
+ broadcastIntent.setPackage(
+ getPackageManager().getPermissionControllerPackageName());
broadcastIntent.putExtra(EventResultPersister.EXTRA_ID, mInstallId);
PendingIntent pendingIntent = PendingIntent.getBroadcast(
diff --git a/src/com/android/packageinstaller/PackageInstallerActivity.java b/src/com/android/packageinstaller/PackageInstallerActivity.java
index 92f73b1f..e3d18ccf 100644
--- a/src/com/android/packageinstaller/PackageInstallerActivity.java
+++ b/src/com/android/packageinstaller/PackageInstallerActivity.java
@@ -326,13 +326,8 @@ public class PackageInstallerActivity extends Activity implements OnCancelListen
}
}
})
- .setOnDismissListener(new DialogInterface.OnDismissListener() {
- @Override
- public void onDismiss(DialogInterface dialog) {
- finish();
- }
- })
- .setNegativeButton(R.string.cancel, null)
+ .setOnCancelListener(dialog -> finish())
+ .setNegativeButton(R.string.cancel, (dialog, which) -> finish())
.create();
}
return null;
diff --git a/src/com/android/packageinstaller/UninstallUninstalling.java b/src/com/android/packageinstaller/UninstallUninstalling.java
index 47f6dfed..14ab60db 100644
--- a/src/com/android/packageinstaller/UninstallUninstalling.java
+++ b/src/com/android/packageinstaller/UninstallUninstalling.java
@@ -86,6 +86,7 @@ public class UninstallUninstalling extends Activity implements
Intent broadcastIntent = new Intent(BROADCAST_ACTION);
broadcastIntent.putExtra(EventResultPersister.EXTRA_ID, mUninstallId);
+ broadcastIntent.setPackage(getPackageName());
PendingIntent pendingIntent = PendingIntent.getBroadcast(this, mUninstallId,
broadcastIntent, PendingIntent.FLAG_UPDATE_CURRENT);
diff --git a/src/com/android/packageinstaller/permission/model/AppPermissions.java b/src/com/android/packageinstaller/permission/model/AppPermissions.java
index 342b9f37..3a45843e 100644
--- a/src/com/android/packageinstaller/permission/model/AppPermissions.java
+++ b/src/com/android/packageinstaller/permission/model/AppPermissions.java
@@ -78,8 +78,7 @@ public final class AppPermissions {
}
public boolean isReviewRequired() {
- if (!mContext.getResources().getBoolean(
- com.android.internal.R.bool.config_permissionReviewRequired)) {
+ if (!mContext.getPackageManager().isPermissionReviewModeEnabled()) {
return false;
}
final int groupCount = mGroups.size();
diff --git a/src/com/android/packageinstaller/permission/ui/handheld/GrantPermissionsViewHandlerImpl.java b/src/com/android/packageinstaller/permission/ui/handheld/GrantPermissionsViewHandlerImpl.java
index 4b61d416..eec43b76 100644
--- a/src/com/android/packageinstaller/permission/ui/handheld/GrantPermissionsViewHandlerImpl.java
+++ b/src/com/android/packageinstaller/permission/ui/handheld/GrantPermissionsViewHandlerImpl.java
@@ -85,8 +85,7 @@ public class GrantPermissionsViewHandlerImpl implements GrantPermissionsViewHand
public GrantPermissionsViewHandlerImpl(Activity activity, String appPackageName) {
mActivity = activity;
mAppPackageName = appPackageName;
- mPermissionReviewRequired = activity.getResources().getBoolean(
- com.android.internal.R.bool.config_permissionReviewRequired);
+ mPermissionReviewRequired = activity.getPackageManager().isPermissionReviewModeEnabled();
}
@Override
diff --git a/src/com/android/packageinstaller/permission/ui/handheld/PermissionAppsFragment.java b/src/com/android/packageinstaller/permission/ui/handheld/PermissionAppsFragment.java
index 899c3c2c..f4dceb76 100644
--- a/src/com/android/packageinstaller/permission/ui/handheld/PermissionAppsFragment.java
+++ b/src/com/android/packageinstaller/permission/ui/handheld/PermissionAppsFragment.java
@@ -15,6 +15,8 @@
*/
package com.android.packageinstaller.permission.ui.handheld;
+import static com.android.settingslib.RestrictedLockUtils.EnforcedAdmin;
+
import android.app.ActionBar;
import android.app.AlertDialog;
import android.app.Fragment;
@@ -34,6 +36,7 @@ import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
+
import com.android.packageinstaller.DeviceUtils;
import com.android.packageinstaller.R;
import com.android.packageinstaller.permission.model.AppPermissionGroup;
@@ -49,8 +52,6 @@ import com.android.settingslib.RestrictedLockUtils;
import java.util.ArrayList;
import java.util.List;
-import static com.android.settingslib.RestrictedLockUtils.EnforcedAdmin;
-
public final class PermissionAppsFragment extends PermissionsFrameFragment implements Callback,
Preference.OnPreferenceChangeListener {
@@ -58,6 +59,9 @@ public final class PermissionAppsFragment extends PermissionsFrameFragment imple
private static final int MENU_HIDE_SYSTEM = Menu.FIRST + 1;
private static final String KEY_SHOW_SYSTEM_PREFS = "_showSystem";
+ private static final String SHOW_SYSTEM_KEY = PermissionAppsFragment.class.getName()
+ + KEY_SHOW_SYSTEM_PREFS;
+
public static PermissionAppsFragment newInstance(String permissionName) {
return setPermissionName(new PermissionAppsFragment(), permissionName);
}
@@ -87,6 +91,11 @@ public final class PermissionAppsFragment extends PermissionsFrameFragment imple
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
+
+ if (savedInstanceState != null) {
+ mShowSystem = savedInstanceState.getBoolean(SHOW_SYSTEM_KEY);
+ }
+
setLoading(true /* loading */, false /* animate */);
setHasOptionsMenu(true);
final ActionBar ab = getActivity().getActionBar();
@@ -101,6 +110,13 @@ public final class PermissionAppsFragment extends PermissionsFrameFragment imple
}
@Override
+ public void onSaveInstanceState(Bundle outState) {
+ super.onSaveInstanceState(outState);
+
+ outState.putBoolean(SHOW_SYSTEM_KEY, mShowSystem);
+ }
+
+ @Override
public void onResume() {
super.onResume();
mPermissionApps.refresh(true);
diff --git a/src/com/android/packageinstaller/permission/ui/television/AllAppPermissionsFragment.java b/src/com/android/packageinstaller/permission/ui/television/AllAppPermissionsFragment.java
index f6df40f0..167fb42e 100644
--- a/src/com/android/packageinstaller/permission/ui/television/AllAppPermissionsFragment.java
+++ b/src/com/android/packageinstaller/permission/ui/television/AllAppPermissionsFragment.java
@@ -294,8 +294,7 @@ public final class AllAppPermissionsFragment extends SettingsWithHeader {
}
private boolean isMutableGranularPermission(String name) {
- if (!getResources().getBoolean(
- com.android.internal.R.bool.config_permissionReviewRequired)) {
+ if (!getContext().getPackageManager().isPermissionReviewModeEnabled()) {
return false;
}
switch (name) {
diff --git a/src/com/android/packageinstaller/permission/ui/wear/AppPermissionsFragmentWear.java b/src/com/android/packageinstaller/permission/ui/wear/AppPermissionsFragmentWear.java
index 6210eaa4..4e665dc5 100644
--- a/src/com/android/packageinstaller/permission/ui/wear/AppPermissionsFragmentWear.java
+++ b/src/com/android/packageinstaller/permission/ui/wear/AppPermissionsFragmentWear.java
@@ -19,10 +19,12 @@ package com.android.packageinstaller.permission.ui.wear;
import android.Manifest;
import android.app.Activity;
import android.app.Fragment;
+import android.content.DialogInterface;
import android.content.Intent;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.pm.PermissionInfo;
+import android.os.Build;
import android.os.Bundle;
import android.os.UserHandle;
import android.preference.Preference;
@@ -40,6 +42,7 @@ import com.android.packageinstaller.R;
import com.android.packageinstaller.permission.model.AppPermissionGroup;
import com.android.packageinstaller.permission.model.AppPermissions;
import com.android.packageinstaller.permission.model.Permission;
+import com.android.packageinstaller.permission.utils.ArrayUtils;
import com.android.packageinstaller.permission.utils.LocationUtils;
import com.android.packageinstaller.permission.utils.SafetyNetLogger;
import com.android.packageinstaller.permission.utils.Utils;
@@ -209,14 +212,108 @@ public final class AppPermissionsFragmentWear extends PreferenceFragment {
pref.setOnPreferenceChangeListener((p, newVal) -> {
if((Boolean) newVal) {
group.grantRuntimePermissions(false, new String[]{ perm.name });
+
+ if (Utils.areGroupPermissionsIndividuallyControlled(getContext(), group.getName())
+ && group.doesSupportRuntimePermissions()) {
+ // We are granting a permission from a group but since this is an
+ // individual permission control other permissions in the group may
+ // be revoked, hence we need to mark them user fixed to prevent the
+ // app from requesting a non-granted permission and it being granted
+ // because another permission in the group is granted. This applies
+ // only to apps that support runtime permissions.
+ String[] revokedPermissionsToFix = null;
+ final int permissionCount = group.getPermissions().size();
+
+ for (int i = 0; i < permissionCount; i++) {
+ Permission current = group.getPermissions().get(i);
+ if (!current.isGranted() && !current.isUserFixed()) {
+ revokedPermissionsToFix = ArrayUtils.appendString(
+ revokedPermissionsToFix, current.getName());
+ }
+ }
+
+ if (revokedPermissionsToFix != null) {
+ // If some permissions were not granted then they should be fixed.
+ group.revokeRuntimePermissions(true, revokedPermissionsToFix);
+ }
+ }
} else {
- group.revokeRuntimePermissions(true, new String[]{ perm.name });
+ final Permission appPerm = getPermissionFromGroup(group, perm.name);
+ if (appPerm == null) {
+ return false;
+ }
+
+ final boolean grantedByDefault = appPerm.isGrantedByDefault();
+ if (grantedByDefault
+ || (!group.doesSupportRuntimePermissions() && !mHasConfirmedRevoke)) {
+ showRevocationWarningDialog(
+ (dialog, which) -> {
+ revokePermissionInGroup(group, perm.name);
+ pref.setChecked(false);
+ if (!appPerm.isGrantedByDefault()) {
+ mHasConfirmedRevoke = true;
+ }
+ },
+ grantedByDefault
+ ? R.string.system_warning
+ : R.string.old_sdk_deny_warning);
+ return false;
+ } else {
+ revokePermissionInGroup(group, perm.name);
+ }
}
+
return true;
});
return pref;
}
+ private void showRevocationWarningDialog(
+ DialogInterface.OnClickListener confirmListener,
+ int warningMessageId) {
+ new WearableDialogHelper.DialogBuilder(getContext())
+ .setNegativeIcon(R.drawable.confirm_button)
+ .setPositiveIcon(R.drawable.cancel_button)
+ .setNegativeButton(R.string.grant_dialog_button_deny_anyway, confirmListener)
+ .setPositiveButton(R.string.cancel, null)
+ .setMessage(warningMessageId)
+ .show();
+ }
+
+ private static Permission getPermissionFromGroup(AppPermissionGroup group, String permName) {
+ final int permissionCount = group.getPermissions().size();
+
+ for (int i = 0; i < permissionCount; i++) {
+ Permission currentPerm = group.getPermissions().get(i);
+ if(currentPerm.getName().equals(permName)) {
+ return currentPerm;
+ };
+ }
+
+ if ("user".equals(Build.TYPE)) {
+ Log.e(LOG_TAG, String.format("The impossible happens, permission %s is not in group %s.",
+ permName, group.getName()));
+ return null;
+ } else {
+ // This is impossible, throw a fatal error in non-user build.
+ throw new IllegalArgumentException(
+ String.format("Permission %s is not in group %s", permName, group.getName()));
+ }
+ }
+
+ private void revokePermissionInGroup(AppPermissionGroup group, String permName) {
+ group.revokeRuntimePermissions(true, new String[]{ permName });
+
+ if (Utils.areGroupPermissionsIndividuallyControlled(getContext(), group.getName())
+ && group.doesSupportRuntimePermissions()
+ && !group.areRuntimePermissionsGranted()) {
+ // If we just revoked the last permission we need to clear
+ // the user fixed state as now the app should be able to
+ // request them at runtime if supported.
+ group.revokeRuntimePermissions(false);
+ }
+ }
+
private SwitchPreference createSwitchPreferenceForGroup(AppPermissionGroup group) {
final SwitchPreference pref = new PermissionSwitchPreference(getActivity());
@@ -241,20 +338,16 @@ public final class AppPermissionsFragmentWear extends PreferenceFragment {
final boolean grantedByDefault = group.hasGrantedByDefaultPermission();
if (grantedByDefault
|| (!group.doesSupportRuntimePermissions() && !mHasConfirmedRevoke)) {
- new WearableDialogHelper.DialogBuilder(getContext())
- .setNegativeIcon(R.drawable.confirm_button)
- .setPositiveIcon(R.drawable.cancel_button)
- .setNegativeButton(R.string.grant_dialog_button_deny_anyway,
- (dialog, which) -> {
- setPermission(group, pref, false);
- if (!group.hasGrantedByDefaultPermission()) {
- mHasConfirmedRevoke = true;
- }
- })
- .setPositiveButton(R.string.cancel, (dialog, which) -> {})
- .setMessage(grantedByDefault ?
- R.string.system_warning : R.string.old_sdk_deny_warning)
- .show();
+ showRevocationWarningDialog(
+ (dialog, which) -> {
+ setPermission(group, pref, false);
+ if (!group.hasGrantedByDefaultPermission()) {
+ mHasConfirmedRevoke = true;
+ }
+ },
+ grantedByDefault
+ ? R.string.system_warning
+ : R.string.old_sdk_deny_warning);
return false;
} else {
setPermission(group, pref, false);
diff --git a/src/com/android/packageinstaller/permission/utils/Utils.java b/src/com/android/packageinstaller/permission/utils/Utils.java
index 81a31f91..3d64c85c 100644
--- a/src/com/android/packageinstaller/permission/utils/Utils.java
+++ b/src/com/android/packageinstaller/permission/utils/Utils.java
@@ -151,8 +151,7 @@ public final class Utils {
}
public static boolean areGroupPermissionsIndividuallyControlled(Context context, String group) {
- if (!context.getResources().getBoolean(
- com.android.internal.R.bool.config_permissionReviewRequired)) {
+ if (!context.getPackageManager().isPermissionReviewModeEnabled()) {
return false;
}
return Manifest.permission_group.SMS.equals(group)
@@ -161,8 +160,7 @@ public final class Utils {
}
public static boolean isPermissionIndividuallyControlled(Context context, String permission) {
- if (!context.getResources().getBoolean(
- com.android.internal.R.bool.config_permissionReviewRequired)) {
+ if (!context.getPackageManager().isPermissionReviewModeEnabled()) {
return false;
}
return Manifest.permission.READ_CONTACTS.equals(permission)
diff --git a/src/com/android/packageinstaller/television/UninstallAppProgress.java b/src/com/android/packageinstaller/television/UninstallAppProgress.java
index 0418792e..a4f217c4 100755
--- a/src/com/android/packageinstaller/television/UninstallAppProgress.java
+++ b/src/com/android/packageinstaller/television/UninstallAppProgress.java
@@ -290,8 +290,13 @@ public class UninstallAppProgress extends Activity {
getWindow().setStatusBarColor(Color.TRANSPARENT);
getWindow().setNavigationBarColor(Color.TRANSPARENT);
- getPackageManager().deletePackageAsUser(mAppInfo.packageName, observer,
- mAllUsers ? PackageManager.DELETE_ALL_USERS : 0, user.getIdentifier());
+ try {
+ getPackageManager().deletePackageAsUser(mAppInfo.packageName, observer,
+ mAllUsers ? PackageManager.DELETE_ALL_USERS : 0, user.getIdentifier());
+ } catch (IllegalArgumentException e) {
+ // Couldn't find the package, no need to call uninstall.
+ Log.w(TAG, "Could not find package, not deleting " + mAppInfo.packageName, e);
+ }
mHandler.sendMessageDelayed(mHandler.obtainMessage(UNINSTALL_IS_SLOW),
QUICK_INSTALL_DELAY_MILLIS);