This CL updates the DO Disclosures page (aka "Enterprise Privacy")

to make items that shows admin granted permissions actionable.
Item click will result in opening the list of apps for a permission.

Test: make RunSettingsRoboTests
Bug: 32692748

Change-Id: I5f2536b116998810857e379f48a26a1c40055590
This commit is contained in:
Denis Kuznetsov
2017-03-10 16:24:15 +01:00
parent 92ae1f2d8e
commit 9392681afa
9 changed files with 65 additions and 17 deletions

View File

@@ -24,7 +24,7 @@ public class AdminGrantedCameraPermissionPreferenceController extends
= "enterprise_privacy_number_camera_access_packages"; = "enterprise_privacy_number_camera_access_packages";
public AdminGrantedCameraPermissionPreferenceController(Context context) { public AdminGrantedCameraPermissionPreferenceController(Context context) {
super(context, new String[] {Manifest.permission.CAMERA}); super(context, new String[] {Manifest.permission.CAMERA}, Manifest.permission_group.CAMERA);
} }
@Override @Override

View File

@@ -25,7 +25,7 @@ public class AdminGrantedLocationPermissionsPreferenceController extends
public AdminGrantedLocationPermissionsPreferenceController(Context context) { public AdminGrantedLocationPermissionsPreferenceController(Context context) {
super(context, new String[] {Manifest.permission.ACCESS_COARSE_LOCATION, super(context, new String[] {Manifest.permission.ACCESS_COARSE_LOCATION,
Manifest.permission.ACCESS_FINE_LOCATION}); Manifest.permission.ACCESS_FINE_LOCATION}, Manifest.permission_group.LOCATION);
} }
@Override @Override

View File

@@ -24,7 +24,8 @@ public class AdminGrantedMicrophonePermissionPreferenceController extends
= "enterprise_privacy_number_microphone_access_packages"; = "enterprise_privacy_number_microphone_access_packages";
public AdminGrantedMicrophonePermissionPreferenceController(Context context) { public AdminGrantedMicrophonePermissionPreferenceController(Context context) {
super(context, new String[] {Manifest.permission.RECORD_AUDIO}); super(context, new String[] {Manifest.permission.RECORD_AUDIO},
Manifest.permission_group.MICROPHONE);
} }
@Override @Override

View File

@@ -15,7 +15,7 @@
package com.android.settings.enterprise; package com.android.settings.enterprise;
import android.content.Context; import android.content.Context;
import android.content.res.Resources; import android.content.Intent;
import android.support.v7.preference.Preference; import android.support.v7.preference.Preference;
import com.android.settings.R; import com.android.settings.R;
@@ -26,11 +26,15 @@ import com.android.settings.overlay.FeatureFactory;
public abstract class AdminGrantedPermissionsPreferenceControllerBase extends PreferenceController { public abstract class AdminGrantedPermissionsPreferenceControllerBase extends PreferenceController {
private final String[] mPermissions; private final String[] mPermissions;
private final String mPermissionGroup;
private final ApplicationFeatureProvider mFeatureProvider; private final ApplicationFeatureProvider mFeatureProvider;
public AdminGrantedPermissionsPreferenceControllerBase(Context context, String[] permissions) { public AdminGrantedPermissionsPreferenceControllerBase(Context context,
String[] permissions,
String permissionGroup) {
super(context); super(context);
mPermissions = permissions; mPermissions = permissions;
mPermissionGroup = permissionGroup;
mFeatureProvider = FeatureFactory.getFactory(context) mFeatureProvider = FeatureFactory.getFactory(context)
.getApplicationFeatureProvider(context); .getApplicationFeatureProvider(context);
} }
@@ -44,7 +48,7 @@ public abstract class AdminGrantedPermissionsPreferenceControllerBase extends Pr
} else { } else {
preference.setVisible(true); preference.setVisible(true);
preference.setSummary(mContext.getResources().getQuantityString( preference.setSummary(mContext.getResources().getQuantityString(
R.plurals.enterprise_privacy_number_packages, num, num)); R.plurals.enterprise_privacy_number_packages_actionable, num, num));
} }
}); });
} }
@@ -53,4 +57,15 @@ public abstract class AdminGrantedPermissionsPreferenceControllerBase extends Pr
public boolean isAvailable() { public boolean isAvailable() {
return true; return true;
} }
@Override
public boolean handlePreferenceTreeClick(Preference preference) {
if (!getPreferenceKey().equals(preference.getKey())) {
return false;
}
final Intent intent = new Intent(Intent.ACTION_MANAGE_PERMISSION_APPS)
.putExtra(Intent.EXTRA_PERMISSION_NAME, mPermissionGroup);
mContext.startActivity(intent);
return true;
}
} }

View File

@@ -20,6 +20,7 @@ import android.Manifest;
import com.android.settings.SettingsRobolectricTestRunner; import com.android.settings.SettingsRobolectricTestRunner;
import com.android.settings.TestConfig; import com.android.settings.TestConfig;
import org.junit.runner.RunWith; import org.junit.runner.RunWith;
import org.robolectric.annotation.Config; import org.robolectric.annotation.Config;
@@ -33,7 +34,8 @@ public final class AdminGrantedCameraPermissionPreferenceControllerTest extends
public AdminGrantedCameraPermissionPreferenceControllerTest() { public AdminGrantedCameraPermissionPreferenceControllerTest() {
super("enterprise_privacy_number_camera_access_packages", super("enterprise_privacy_number_camera_access_packages",
new String[] {Manifest.permission.CAMERA}); new String[] {Manifest.permission.CAMERA},
Manifest.permission_group.CAMERA);
} }
@Override @Override

View File

@@ -20,6 +20,7 @@ import android.Manifest;
import com.android.settings.SettingsRobolectricTestRunner; import com.android.settings.SettingsRobolectricTestRunner;
import com.android.settings.TestConfig; import com.android.settings.TestConfig;
import org.junit.runner.RunWith; import org.junit.runner.RunWith;
import org.robolectric.annotation.Config; import org.robolectric.annotation.Config;
@@ -34,7 +35,8 @@ public final class AdminGrantedLocationPermissionsPreferenceControllerTest exten
public AdminGrantedLocationPermissionsPreferenceControllerTest() { public AdminGrantedLocationPermissionsPreferenceControllerTest() {
super("enterprise_privacy_number_location_access_packages", super("enterprise_privacy_number_location_access_packages",
new String[] {Manifest.permission.ACCESS_COARSE_LOCATION, new String[] {Manifest.permission.ACCESS_COARSE_LOCATION,
Manifest.permission.ACCESS_FINE_LOCATION}); Manifest.permission.ACCESS_FINE_LOCATION},
Manifest.permission_group.LOCATION);
} }
@Override @Override

View File

@@ -20,6 +20,7 @@ import android.Manifest;
import com.android.settings.SettingsRobolectricTestRunner; import com.android.settings.SettingsRobolectricTestRunner;
import com.android.settings.TestConfig; import com.android.settings.TestConfig;
import org.junit.runner.RunWith; import org.junit.runner.RunWith;
import org.robolectric.annotation.Config; import org.robolectric.annotation.Config;
@@ -33,7 +34,8 @@ public final class AdminGrantedMicrophonePermissionPreferenceControllerTest exte
public AdminGrantedMicrophonePermissionPreferenceControllerTest() { public AdminGrantedMicrophonePermissionPreferenceControllerTest() {
super("enterprise_privacy_number_microphone_access_packages", super("enterprise_privacy_number_microphone_access_packages",
new String[] {Manifest.permission.RECORD_AUDIO}); new String[] {Manifest.permission.RECORD_AUDIO},
Manifest.permission_group.MICROPHONE);
} }
@Override @Override

View File

@@ -16,8 +16,14 @@
package com.android.settings.enterprise; package com.android.settings.enterprise;
import android.Manifest;
import android.content.Intent;
import android.support.v7.preference.Preference;
import android.text.TextUtils;
import com.android.settings.SettingsRobolectricTestRunner; import com.android.settings.SettingsRobolectricTestRunner;
import com.android.settings.TestConfig; import com.android.settings.TestConfig;
import org.junit.runner.RunWith; import org.junit.runner.RunWith;
import org.robolectric.annotation.Config; import org.robolectric.annotation.Config;
@@ -30,7 +36,7 @@ public final class AdminGrantedPermissionsPreferenceControllerBaseTest extends
AdminGrantedPermissionsPreferenceControllerTestBase { AdminGrantedPermissionsPreferenceControllerTestBase {
public AdminGrantedPermissionsPreferenceControllerBaseTest() { public AdminGrantedPermissionsPreferenceControllerBaseTest() {
super(null, new String[] {"some.permission"}); super("some.key", new String[] {"some.permission"}, "some.permission");
} }
@Override @Override
@@ -43,12 +49,14 @@ public final class AdminGrantedPermissionsPreferenceControllerBaseTest extends
AdminGrantedPermissionsPreferenceControllerBase { AdminGrantedPermissionsPreferenceControllerBase {
AdminGrantedPermissionsPreferenceControllerBaseTestable() { AdminGrantedPermissionsPreferenceControllerBaseTestable() {
super(AdminGrantedPermissionsPreferenceControllerBaseTest.this.mContext, mPermissions); super(AdminGrantedPermissionsPreferenceControllerBaseTest.this.mContext, mPermissions,
mPermissionGroup);
} }
@Override @Override
public String getPreferenceKey() { public String getPreferenceKey() {
return null; return "some.key";
} }
} }
} }

View File

@@ -17,6 +17,7 @@
package com.android.settings.enterprise; package com.android.settings.enterprise;
import android.content.Context; import android.content.Context;
import android.content.Intent;
import android.content.res.Resources; import android.content.res.Resources;
import android.support.v7.preference.Preference; import android.support.v7.preference.Preference;
@@ -27,6 +28,7 @@ import com.android.settings.testutils.FakeFeatureFactory;
import org.junit.Before; import org.junit.Before;
import org.junit.Test; import org.junit.Test;
import org.mockito.Answers; import org.mockito.Answers;
import org.mockito.ArgumentCaptor;
import org.mockito.Mock; import org.mockito.Mock;
import org.mockito.MockitoAnnotations; import org.mockito.MockitoAnnotations;
import org.mockito.invocation.InvocationOnMock; import org.mockito.invocation.InvocationOnMock;
@@ -36,6 +38,7 @@ import static com.google.common.truth.Truth.assertThat;
import static org.mockito.Mockito.anyObject; import static org.mockito.Mockito.anyObject;
import static org.mockito.Mockito.doAnswer; import static org.mockito.Mockito.doAnswer;
import static org.mockito.Mockito.eq; import static org.mockito.Mockito.eq;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when; import static org.mockito.Mockito.when;
/** /**
@@ -45,6 +48,7 @@ public abstract class AdminGrantedPermissionsPreferenceControllerTestBase {
protected final String mKey; protected final String mKey;
protected final String[] mPermissions; protected final String[] mPermissions;
protected final String mPermissionGroup;
@Mock(answer = Answers.RETURNS_DEEP_STUBS) @Mock(answer = Answers.RETURNS_DEEP_STUBS)
protected Context mContext; protected Context mContext;
@@ -52,9 +56,11 @@ public abstract class AdminGrantedPermissionsPreferenceControllerTestBase {
protected AdminGrantedPermissionsPreferenceControllerBase mController; protected AdminGrantedPermissionsPreferenceControllerBase mController;
public AdminGrantedPermissionsPreferenceControllerTestBase(String key, String[] permissions) { public AdminGrantedPermissionsPreferenceControllerTestBase(String key, String[] permissions,
String permissionGroup) {
mKey = key; mKey = key;
mPermissions = permissions; mPermissions = permissions;
mPermissionGroup = permissionGroup;
} }
@Before @Before
@@ -81,8 +87,9 @@ public abstract class AdminGrantedPermissionsPreferenceControllerTestBase {
preference.setVisible(false); preference.setVisible(false);
setNumberOfPackagesWithAdminGrantedPermissions(20); setNumberOfPackagesWithAdminGrantedPermissions(20);
when(mContext.getResources().getQuantityString(R.plurals.enterprise_privacy_number_packages, when(mContext.getResources().getQuantityString(
20, 20)).thenReturn("20 packages"); R.plurals.enterprise_privacy_number_packages_actionable,20, 20))
.thenReturn("20 packages");
mController.updateState(preference); mController.updateState(preference);
assertThat(preference.getSummary()).isEqualTo("20 packages"); assertThat(preference.getSummary()).isEqualTo("20 packages");
assertThat(preference.isVisible()).isTrue(); assertThat(preference.isVisible()).isTrue();
@@ -99,8 +106,19 @@ public abstract class AdminGrantedPermissionsPreferenceControllerTestBase {
@Test @Test
public void testHandlePreferenceTreeClick() { public void testHandlePreferenceTreeClick() {
assertThat(mController.handlePreferenceTreeClick(new Preference(mContext, null, 0, 0))) final Preference preference = new Preference(mContext, null, 0, 0);
.isFalse(); preference.setKey(mKey);
assertThat(mController.handlePreferenceTreeClick(preference)).isTrue();
final ArgumentCaptor<Intent> argumentCaptor = ArgumentCaptor.forClass(Intent.class);
verify(mContext).startActivity(argumentCaptor.capture());
final Intent intent = argumentCaptor.getValue();
assertThat(intent.getAction()).isEqualTo(Intent.ACTION_MANAGE_PERMISSION_APPS);
assertThat(intent.getStringExtra(Intent.EXTRA_PERMISSION_NAME)).
isEqualTo(mPermissionGroup);
} }
@Test @Test