diff options
Diffstat (limited to 'src')
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); |