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
This commit is contained in:
Yi-Ling Chuang
2020-04-01 10:01:15 +08:00
parent 947cb48303
commit f31d38620c
2 changed files with 47 additions and 2 deletions

View File

@@ -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

View File

@@ -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