Allow developer options in retail mode

Also, add new tests and fix existing tests.

Bug: 70985064
Test: make -j100 && make RunSettingsRoboTests -j100
Change-Id: Ied84cf0de02e18c10949eed4f3642782c1246e7b
This commit is contained in:
Christine Franks
2018-02-20 11:52:44 -08:00
parent 767743d64d
commit 4c3c7fbfa6
4 changed files with 58 additions and 30 deletions

View File

@@ -63,6 +63,7 @@ import com.android.settings.core.SubSettingLauncher;
import com.android.settings.core.gateway.SettingsGateway; import com.android.settings.core.gateway.SettingsGateway;
import com.android.settings.dashboard.DashboardFeatureProvider; import com.android.settings.dashboard.DashboardFeatureProvider;
import com.android.settings.dashboard.DashboardSummary; import com.android.settings.dashboard.DashboardSummary;
import com.android.settings.development.DevelopmentSettingsDashboardFragment;
import com.android.settings.overlay.FeatureFactory; import com.android.settings.overlay.FeatureFactory;
import com.android.settings.wfd.WifiDisplaySettings; import com.android.settings.wfd.WifiDisplaySettings;
import com.android.settings.widget.SwitchBar; import com.android.settings.widget.SwitchBar;
@@ -686,10 +687,10 @@ public class SettingsActivity extends SettingsDrawerActivity
final boolean showDev = DevelopmentSettingsEnabler.isDevelopmentSettingsEnabled(this) final boolean showDev = DevelopmentSettingsEnabler.isDevelopmentSettingsEnabled(this)
&& !Utils.isMonkeyRunning(); && !Utils.isMonkeyRunning();
final boolean isAdminOrDemo = um.isAdminUser() || um.isDemoUser();
somethingChanged = setTileEnabled(new ComponentName(packageName, somethingChanged = setTileEnabled(new ComponentName(packageName,
Settings.DevelopmentSettingsDashboardActivity.class.getName()), Settings.DevelopmentSettingsDashboardActivity.class.getName()),
showDev, isAdmin) showDev, isAdminOrDemo)
|| somethingChanged; || somethingChanged;
// Enable/disable backup settings depending on whether the user is admin. // Enable/disable backup settings depending on whether the user is admin.
@@ -724,10 +725,11 @@ public class SettingsActivity extends SettingsDrawerActivity
final int tileCount = category.getTilesCount(); final int tileCount = category.getTilesCount();
for (int i = 0; i < tileCount; i++) { for (int i = 0; i < tileCount; i++) {
final ComponentName component = category.getTile(i).intent.getComponent(); final ComponentName component = category.getTile(i).intent.getComponent();
final String name = component.getClassName(); final String name = component.getClassName();
final boolean isEnabledForRestricted = ArrayUtils.contains( final boolean isEnabledForRestricted = ArrayUtils.contains(
SettingsGateway.SETTINGS_FOR_RESTRICTED, name); SettingsGateway.SETTINGS_FOR_RESTRICTED, name) || (isAdminOrDemo
&& Settings.DevelopmentSettingsDashboardActivity.class.getName()
.equals(name));
if (packageName.equals(component.getPackageName()) if (packageName.equals(component.getPackageName())
&& !isEnabledForRestricted) { && !isEnabledForRestricted) {
somethingChanged = setTileEnabled(component, false, isAdmin) somethingChanged = setTileEnabled(component, false, isAdmin)

View File

@@ -18,8 +18,10 @@ package com.android.settings.deviceinfo;
import android.app.Activity; import android.app.Activity;
import android.app.Fragment; import android.app.Fragment;
import android.content.ComponentName;
import android.content.Context; import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.content.pm.ResolveInfo;
import android.os.Build; import android.os.Build;
import android.os.UserHandle; import android.os.UserHandle;
import android.os.UserManager; import android.os.UserManager;
@@ -118,8 +120,8 @@ public class BuildNumberPreferenceController extends AbstractPreferenceControlle
if (Utils.isMonkeyRunning()) { if (Utils.isMonkeyRunning()) {
return false; return false;
} }
// Don't enable developer options for secondary users. // Don't enable developer options for secondary non-demo users.
if (!mUm.isAdminUser()) { if (!(mUm.isAdminUser() || mUm.isDemoUser())) {
mMetricsFeatureProvider.action( mMetricsFeatureProvider.action(
mContext, MetricsEvent.ACTION_SETTINGS_BUILD_NUMBER_PREF); mContext, MetricsEvent.ACTION_SETTINGS_BUILD_NUMBER_PREF);
return false; return false;
@@ -133,6 +135,21 @@ public class BuildNumberPreferenceController extends AbstractPreferenceControlle
} }
if (mUm.hasUserRestriction(UserManager.DISALLOW_DEBUGGING_FEATURES)) { if (mUm.hasUserRestriction(UserManager.DISALLOW_DEBUGGING_FEATURES)) {
if (mUm.isDemoUser()) {
// Route to demo device owner to lift the debugging restriction.
final ComponentName componentName = Utils.getDeviceOwnerComponent(mContext);
if (componentName != null) {
final Intent requestDebugFeatures = new Intent()
.setPackage(componentName.getPackageName())
.setAction("com.android.settings.action.REQUEST_DEBUG_FEATURES");
final ResolveInfo resolveInfo = mContext.getPackageManager().resolveActivity(
requestDebugFeatures, 0);
if (resolveInfo != null) {
mContext.startActivity(requestDebugFeatures);
return false;
}
}
}
if (mDebuggingFeaturesDisallowedAdmin != null && if (mDebuggingFeaturesDisallowedAdmin != null &&
!mDebuggingFeaturesDisallowedBySystem) { !mDebuggingFeaturesDisallowedBySystem) {
RestrictedLockUtils.sendShowAdminSupportDetailsIntent(mContext, RestrictedLockUtils.sendShowAdminSupportDetailsIntent(mContext,

View File

@@ -118,6 +118,7 @@ public class DevelopmentSettingsDashboardFragmentTest {
final Context appContext = RuntimeEnvironment.application; final Context appContext = RuntimeEnvironment.application;
DevelopmentSettingsEnabler.setDevelopmentSettingsEnabled(appContext, true); DevelopmentSettingsEnabler.setDevelopmentSettingsEnabled(appContext, true);
mShadowUserManager.setIsAdminUser(false); mShadowUserManager.setIsAdminUser(false);
mShadowUserManager.setIsDemoUser(false);
final List<String> nonIndexableKeys = final List<String> nonIndexableKeys =
DevelopmentSettingsDashboardFragment.SEARCH_INDEX_DATA_PROVIDER DevelopmentSettingsDashboardFragment.SEARCH_INDEX_DATA_PROVIDER

View File

@@ -22,7 +22,6 @@ import static org.mockito.Matchers.any;
import static org.mockito.Matchers.eq; import static org.mockito.Matchers.eq;
import static org.mockito.Mockito.mock; import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never; import static org.mockito.Mockito.never;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when; import static org.mockito.Mockito.when;
@@ -57,7 +56,6 @@ import org.robolectric.RuntimeEnvironment;
import org.robolectric.Shadows; import org.robolectric.Shadows;
import org.robolectric.annotation.Config; import org.robolectric.annotation.Config;
import org.robolectric.shadows.ShadowUserManager; import org.robolectric.shadows.ShadowUserManager;
import org.robolectric.util.ReflectionHelpers;
@RunWith(SettingsRobolectricTestRunner.class) @RunWith(SettingsRobolectricTestRunner.class)
@Config(shadows = ShadowUtils.class) @Config(shadows = ShadowUtils.class)
@@ -84,24 +82,27 @@ public class BuildNumberPreferenceControllerTest {
MockitoAnnotations.initMocks(this); MockitoAnnotations.initMocks(this);
mContext = RuntimeEnvironment.application; mContext = RuntimeEnvironment.application;
final UserManager userManager = final UserManager userManager =
(UserManager) mContext.getSystemService(Context.USER_SERVICE); (UserManager) mContext.getSystemService(Context.USER_SERVICE);
mShadowUserManager = Shadows.shadowOf(userManager); mShadowUserManager = Shadows.shadowOf(userManager);
mShadowUserManager.setIsAdminUser(true); mShadowUserManager.setIsAdminUser(true);
mFactory = FakeFeatureFactory.setupForTest(); mFactory = FakeFeatureFactory.setupForTest();
mLifecycleOwner = () -> mLifecycle; mLifecycleOwner = () -> mLifecycle;
mLifecycle = new Lifecycle(mLifecycleOwner); mLifecycle = new Lifecycle(mLifecycleOwner);
mController = mController =
new BuildNumberPreferenceController(mContext, mActivity, mFragment, mLifecycle); new BuildNumberPreferenceController(mContext, mActivity, mFragment, mLifecycle);
mPreference = new Preference(mContext); mPreference = new Preference(mContext);
mPreference.setKey(mController.getPreferenceKey()); mPreference.setKey(mController.getPreferenceKey());
DevelopmentSettingsEnabler.setDevelopmentSettingsEnabled(mContext, false); DevelopmentSettingsEnabler.setDevelopmentSettingsEnabled(mContext, false);
Settings.Global.putInt(mContext.getContentResolver(),
Settings.Global.DEVICE_PROVISIONED, 1);
} }
@After @After
public void tearDown() { public void tearDown() {
ShadowUtils.reset(); ShadowUtils.reset();
mShadowUserManager.setIsAdminUser(false); mShadowUserManager.setIsAdminUser(false);
mShadowUserManager.setIsDemoUser(false);
} }
@Test @Test
@@ -119,20 +120,36 @@ public class BuildNumberPreferenceControllerTest {
} }
@Test @Test
public void handlePrefTreeClick_notAdminUser_doNothing() { public void handlePrefTreeClick_notAdminUser_notDemoUser_doNothing() {
mShadowUserManager.setIsAdminUser(false); mShadowUserManager.setIsAdminUser(false);
mShadowUserManager.setIsDemoUser(false);
assertThat(mController.handlePreferenceTreeClick(mPreference)).isFalse(); assertThat(mController.handlePreferenceTreeClick(mPreference)).isFalse();
} }
@Test @Test
public void handlePrefTreeClick_deviceNotProvisioned_doNothing() { public void handlePrefTreeClick_isAdminUser_notDemoUser_handleBuildNumberPref() {
final Context context = RuntimeEnvironment.application; mShadowUserManager.setIsAdminUser(true);
Settings.Global.putInt(context.getContentResolver(), Settings.Global.DEVICE_PROVISIONED, 0); mShadowUserManager.setIsDemoUser(false);
mController = assertThat(mController.handlePreferenceTreeClick(mPreference)).isTrue();
new BuildNumberPreferenceController(context, mActivity, mFragment, mLifecycle); }
ReflectionHelpers.setField(mController, "mContext", context);
@Test
public void handlePrefTreeClick_notAdminUser_isDemoUser_handleBuildNumberPref() {
mShadowUserManager.setIsAdminUser(false);
mShadowUserManager.setIsDemoUser(true);
assertThat(mController.handlePreferenceTreeClick(mPreference)).isTrue();
}
@Test
public void handlePrefTreeClick_deviceNotProvisioned_doNothing() {
mShadowUserManager.setIsAdminUser(true);
mShadowUserManager.setIsDemoUser(false);
Settings.Global.putInt(mContext.getContentResolver(), Settings.Global.DEVICE_PROVISIONED,
0);
assertThat(mController.handlePreferenceTreeClick(mPreference)).isFalse(); assertThat(mController.handlePreferenceTreeClick(mPreference)).isFalse();
verify(mFactory.metricsFeatureProvider).action( verify(mFactory.metricsFeatureProvider).action(
@@ -142,26 +159,17 @@ public class BuildNumberPreferenceControllerTest {
@Test @Test
public void handlePrefTreeClick_isMonkeyRun_doNothing() { public void handlePrefTreeClick_isMonkeyRun_doNothing() {
final Context context = spy(RuntimeEnvironment.application);
Settings.Global.putInt(context.getContentResolver(), Settings.Global.DEVICE_PROVISIONED, 1);
ShadowUtils.setIsUserAMonkey(true); ShadowUtils.setIsUserAMonkey(true);
mController =
new BuildNumberPreferenceController(context, mActivity, mFragment, mLifecycle);
assertThat(mController.handlePreferenceTreeClick(mPreference)).isFalse(); assertThat(mController.handlePreferenceTreeClick(mPreference)).isFalse();
} }
@Test @Test
public void handlePrefTreeClick_userHasRestriction_doNothing() { public void handlePrefTreeClick_userHasRestriction_doNothing() {
final Context context = spy(RuntimeEnvironment.application); mShadowUserManager.setIsAdminUser(true);
Settings.Global.putInt(context.getContentResolver(), Settings.Global.DEVICE_PROVISIONED, 1); mShadowUserManager.setIsDemoUser(false);
mShadowUserManager.setUserRestriction(Process.myUserHandle(), mShadowUserManager.setUserRestriction(Process.myUserHandle(),
UserManager.DISALLOW_DEBUGGING_FEATURES, true); UserManager.DISALLOW_DEBUGGING_FEATURES, true);
mController =
new BuildNumberPreferenceController(mContext, mActivity, mFragment, mLifecycle);
ReflectionHelpers.setField(mController, "mContext", context);
assertThat(mController.handlePreferenceTreeClick(mPreference)).isFalse(); assertThat(mController.handlePreferenceTreeClick(mPreference)).isFalse();
verify(mFactory.metricsFeatureProvider).action( verify(mFactory.metricsFeatureProvider).action(
@@ -197,7 +205,7 @@ public class BuildNumberPreferenceControllerTest {
.thenReturn(mock(DatabaseIndexingManager.class)); .thenReturn(mock(DatabaseIndexingManager.class));
mController = mController =
new BuildNumberPreferenceController(mContext, mActivity, mFragment, mLifecycle); new BuildNumberPreferenceController(mContext, mActivity, mFragment, mLifecycle);
final boolean activityResultHandled = mController.onActivityResult( final boolean activityResultHandled = mController.onActivityResult(
BuildNumberPreferenceController.REQUEST_CONFIRM_PASSWORD_FOR_DEV_PREF, BuildNumberPreferenceController.REQUEST_CONFIRM_PASSWORD_FOR_DEV_PREF,