From f31d38620c6b0d147e40ae558fdd2f8d576bf407 Mon Sep 17 00:00:00 2001 From: Yi-Ling Chuang Date: Wed, 1 Apr 2020 10:01:15 +0800 Subject: [PATCH] Update permission summary when permission changing. Some apps have pre-grant permissions, so when they get disabled and then enabled again, those pre-granted ones will come back automatically. This CL handles this kind of cases by listening to permission changes and update the summary accordingly. Fixes: 142053555 Test: robotests Change-Id: I75b010139657ec3b4ff875de77573a46387e42c8 --- .../AppPermissionPreferenceController.java | 26 ++++++++++++++++++- ...AppPermissionPreferenceControllerTest.java | 23 +++++++++++++++- 2 files changed, 47 insertions(+), 2 deletions(-) diff --git a/src/com/android/settings/applications/appinfo/AppPermissionPreferenceController.java b/src/com/android/settings/applications/appinfo/AppPermissionPreferenceController.java index 12393ad13f7..cf0be207472 100644 --- a/src/com/android/settings/applications/appinfo/AppPermissionPreferenceController.java +++ b/src/com/android/settings/applications/appinfo/AppPermissionPreferenceController.java @@ -19,6 +19,7 @@ package com.android.settings.applications.appinfo; import android.content.ActivityNotFoundException; import android.content.Context; import android.content.Intent; +import android.content.pm.PackageManager; import android.content.res.Resources; import android.icu.text.ListFormatter; import android.util.Log; @@ -28,15 +29,24 @@ import androidx.preference.Preference; import com.android.settings.R; import com.android.settingslib.applications.PermissionsSummaryHelper; +import com.android.settingslib.core.lifecycle.LifecycleObserver; +import com.android.settingslib.core.lifecycle.events.OnStart; +import com.android.settingslib.core.lifecycle.events.OnStop; import java.util.ArrayList; import java.util.List; -public class AppPermissionPreferenceController extends AppInfoPreferenceControllerBase { +/** + * A PreferenceController handling the logic for permissions of apps. + */ +public class AppPermissionPreferenceController extends AppInfoPreferenceControllerBase implements + LifecycleObserver, OnStart, OnStop { private static final String TAG = "PermissionPrefControl"; private static final String EXTRA_HIDE_INFO_BUTTON = "hideInfoButton"; + private final PackageManager mPackageManager; + private String mPackageName; @VisibleForTesting @@ -73,8 +83,22 @@ public class AppPermissionPreferenceController extends AppInfoPreferenceControll } }; + private final PackageManager.OnPermissionsChangedListener mOnPermissionsChangedListener = + uid -> updateState(mPreference); + public AppPermissionPreferenceController(Context context, String key) { super(context, key); + mPackageManager = context.getPackageManager(); + } + + @Override + public void onStart() { + mPackageManager.addOnPermissionsChangeListener(mOnPermissionsChangedListener); + } + + @Override + public void onStop() { + mPackageManager.removeOnPermissionsChangeListener(mOnPermissionsChangedListener); } @Override diff --git a/tests/robotests/src/com/android/settings/applications/appinfo/AppPermissionPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/applications/appinfo/AppPermissionPreferenceControllerTest.java index 022de97cbb0..f00471d9ecc 100644 --- a/tests/robotests/src/com/android/settings/applications/appinfo/AppPermissionPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/applications/appinfo/AppPermissionPreferenceControllerTest.java @@ -28,6 +28,7 @@ import static org.mockito.Mockito.when; import android.content.Context; import android.content.Intent; import android.content.pm.ApplicationInfo; +import android.content.pm.PackageManager; import androidx.preference.Preference; import androidx.preference.PreferenceScreen; @@ -43,6 +44,7 @@ import org.mockito.Mock; import org.mockito.MockitoAnnotations; import org.robolectric.RobolectricTestRunner; import org.robolectric.RuntimeEnvironment; +import org.robolectric.util.ReflectionHelpers; import java.util.ArrayList; @@ -57,6 +59,8 @@ public class AppPermissionPreferenceControllerTest { private PreferenceScreen mScreen; @Mock private Preference mPreference; + @Mock + private PackageManager mPackageManager; private Context mContext; private AppPermissionPreferenceController mController; @@ -68,6 +72,7 @@ public class AppPermissionPreferenceControllerTest { mController = new AppPermissionPreferenceController(mContext, "permission_settings"); mController.setPackageName("package1"); mController.setParentFragment(mFragment); + ReflectionHelpers.setField(mController, "mPackageManager", mPackageManager); when(mScreen.findPreference(any())).thenReturn(mPreference); final String key = mController.getPreferenceKey(); @@ -75,10 +80,26 @@ public class AppPermissionPreferenceControllerTest { when(mFragment.getActivity()).thenReturn(mActivity); } + @Test + public void onStart_shouldAddPermissionsChangeListener() { + mController.onStart(); + + verify(mPackageManager).addOnPermissionsChangeListener( + any(PackageManager.OnPermissionsChangedListener.class)); + } + + @Test + public void onStop_shouldRemovePermissionsChangeListener() { + mController.onStop(); + + verify(mPackageManager).removeOnPermissionsChangeListener( + any(PackageManager.OnPermissionsChangedListener.class)); + } + @Test public void getAvailabilityStatus_isAlwaysAvailable() { assertThat(mController.getAvailabilityStatus()) - .isEqualTo(AppPermissionPreferenceController.AVAILABLE); + .isEqualTo(AppPermissionPreferenceController.AVAILABLE); } @Test