diff --git a/src/com/android/settings/SettingsActivity.java b/src/com/android/settings/SettingsActivity.java index 15b3c663f12..83bb082ffa5 100644 --- a/src/com/android/settings/SettingsActivity.java +++ b/src/com/android/settings/SettingsActivity.java @@ -63,6 +63,7 @@ import com.android.settings.core.SubSettingLauncher; import com.android.settings.core.gateway.SettingsGateway; import com.android.settings.dashboard.DashboardFeatureProvider; import com.android.settings.dashboard.DashboardSummary; +import com.android.settings.development.DevelopmentSettingsDashboardFragment; import com.android.settings.overlay.FeatureFactory; import com.android.settings.wfd.WifiDisplaySettings; import com.android.settings.widget.SwitchBar; @@ -686,10 +687,10 @@ public class SettingsActivity extends SettingsDrawerActivity final boolean showDev = DevelopmentSettingsEnabler.isDevelopmentSettingsEnabled(this) && !Utils.isMonkeyRunning(); - + final boolean isAdminOrDemo = um.isAdminUser() || um.isDemoUser(); somethingChanged = setTileEnabled(new ComponentName(packageName, Settings.DevelopmentSettingsDashboardActivity.class.getName()), - showDev, isAdmin) + showDev, isAdminOrDemo) || somethingChanged; // 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(); for (int i = 0; i < tileCount; i++) { final ComponentName component = category.getTile(i).intent.getComponent(); - final String name = component.getClassName(); 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()) && !isEnabledForRestricted) { somethingChanged = setTileEnabled(component, false, isAdmin) diff --git a/src/com/android/settings/deviceinfo/BuildNumberPreferenceController.java b/src/com/android/settings/deviceinfo/BuildNumberPreferenceController.java index 0f3bfb8ec76..46bc120de4f 100644 --- a/src/com/android/settings/deviceinfo/BuildNumberPreferenceController.java +++ b/src/com/android/settings/deviceinfo/BuildNumberPreferenceController.java @@ -18,8 +18,10 @@ package com.android.settings.deviceinfo; import android.app.Activity; import android.app.Fragment; +import android.content.ComponentName; import android.content.Context; import android.content.Intent; +import android.content.pm.ResolveInfo; import android.os.Build; import android.os.UserHandle; import android.os.UserManager; @@ -118,8 +120,8 @@ public class BuildNumberPreferenceController extends AbstractPreferenceControlle if (Utils.isMonkeyRunning()) { return false; } - // Don't enable developer options for secondary users. - if (!mUm.isAdminUser()) { + // Don't enable developer options for secondary non-demo users. + if (!(mUm.isAdminUser() || mUm.isDemoUser())) { mMetricsFeatureProvider.action( mContext, MetricsEvent.ACTION_SETTINGS_BUILD_NUMBER_PREF); return false; @@ -133,6 +135,21 @@ public class BuildNumberPreferenceController extends AbstractPreferenceControlle } 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 && !mDebuggingFeaturesDisallowedBySystem) { RestrictedLockUtils.sendShowAdminSupportDetailsIntent(mContext, diff --git a/tests/robotests/src/com/android/settings/development/DevelopmentSettingsDashboardFragmentTest.java b/tests/robotests/src/com/android/settings/development/DevelopmentSettingsDashboardFragmentTest.java index 7c49a06f481..9272b46b283 100644 --- a/tests/robotests/src/com/android/settings/development/DevelopmentSettingsDashboardFragmentTest.java +++ b/tests/robotests/src/com/android/settings/development/DevelopmentSettingsDashboardFragmentTest.java @@ -118,6 +118,7 @@ public class DevelopmentSettingsDashboardFragmentTest { final Context appContext = RuntimeEnvironment.application; DevelopmentSettingsEnabler.setDevelopmentSettingsEnabled(appContext, true); mShadowUserManager.setIsAdminUser(false); + mShadowUserManager.setIsDemoUser(false); final List nonIndexableKeys = DevelopmentSettingsDashboardFragment.SEARCH_INDEX_DATA_PROVIDER diff --git a/tests/robotests/src/com/android/settings/deviceinfo/BuildNumberPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/deviceinfo/BuildNumberPreferenceControllerTest.java index 37b85ea05dc..09fa019e1fc 100644 --- a/tests/robotests/src/com/android/settings/deviceinfo/BuildNumberPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/deviceinfo/BuildNumberPreferenceControllerTest.java @@ -22,7 +22,6 @@ import static org.mockito.Matchers.any; import static org.mockito.Matchers.eq; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.never; -import static org.mockito.Mockito.spy; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; @@ -57,7 +56,6 @@ import org.robolectric.RuntimeEnvironment; import org.robolectric.Shadows; import org.robolectric.annotation.Config; import org.robolectric.shadows.ShadowUserManager; -import org.robolectric.util.ReflectionHelpers; @RunWith(SettingsRobolectricTestRunner.class) @Config(shadows = ShadowUtils.class) @@ -84,24 +82,27 @@ public class BuildNumberPreferenceControllerTest { MockitoAnnotations.initMocks(this); mContext = RuntimeEnvironment.application; final UserManager userManager = - (UserManager) mContext.getSystemService(Context.USER_SERVICE); + (UserManager) mContext.getSystemService(Context.USER_SERVICE); mShadowUserManager = Shadows.shadowOf(userManager); mShadowUserManager.setIsAdminUser(true); mFactory = FakeFeatureFactory.setupForTest(); mLifecycleOwner = () -> mLifecycle; mLifecycle = new Lifecycle(mLifecycleOwner); mController = - new BuildNumberPreferenceController(mContext, mActivity, mFragment, mLifecycle); + new BuildNumberPreferenceController(mContext, mActivity, mFragment, mLifecycle); mPreference = new Preference(mContext); mPreference.setKey(mController.getPreferenceKey()); DevelopmentSettingsEnabler.setDevelopmentSettingsEnabled(mContext, false); + Settings.Global.putInt(mContext.getContentResolver(), + Settings.Global.DEVICE_PROVISIONED, 1); } @After public void tearDown() { ShadowUtils.reset(); mShadowUserManager.setIsAdminUser(false); + mShadowUserManager.setIsDemoUser(false); } @Test @@ -119,20 +120,36 @@ public class BuildNumberPreferenceControllerTest { } @Test - public void handlePrefTreeClick_notAdminUser_doNothing() { + public void handlePrefTreeClick_notAdminUser_notDemoUser_doNothing() { mShadowUserManager.setIsAdminUser(false); + mShadowUserManager.setIsDemoUser(false); assertThat(mController.handlePreferenceTreeClick(mPreference)).isFalse(); } @Test - public void handlePrefTreeClick_deviceNotProvisioned_doNothing() { - final Context context = RuntimeEnvironment.application; - Settings.Global.putInt(context.getContentResolver(), Settings.Global.DEVICE_PROVISIONED, 0); + public void handlePrefTreeClick_isAdminUser_notDemoUser_handleBuildNumberPref() { + mShadowUserManager.setIsAdminUser(true); + mShadowUserManager.setIsDemoUser(false); - mController = - new BuildNumberPreferenceController(context, mActivity, mFragment, mLifecycle); - ReflectionHelpers.setField(mController, "mContext", context); + assertThat(mController.handlePreferenceTreeClick(mPreference)).isTrue(); + } + + @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(); verify(mFactory.metricsFeatureProvider).action( @@ -142,26 +159,17 @@ public class BuildNumberPreferenceControllerTest { @Test public void handlePrefTreeClick_isMonkeyRun_doNothing() { - final Context context = spy(RuntimeEnvironment.application); - Settings.Global.putInt(context.getContentResolver(), Settings.Global.DEVICE_PROVISIONED, 1); ShadowUtils.setIsUserAMonkey(true); - mController = - new BuildNumberPreferenceController(context, mActivity, mFragment, mLifecycle); - assertThat(mController.handlePreferenceTreeClick(mPreference)).isFalse(); } @Test public void handlePrefTreeClick_userHasRestriction_doNothing() { - final Context context = spy(RuntimeEnvironment.application); - Settings.Global.putInt(context.getContentResolver(), Settings.Global.DEVICE_PROVISIONED, 1); + mShadowUserManager.setIsAdminUser(true); + mShadowUserManager.setIsDemoUser(false); mShadowUserManager.setUserRestriction(Process.myUserHandle(), - UserManager.DISALLOW_DEBUGGING_FEATURES, true); - - mController = - new BuildNumberPreferenceController(mContext, mActivity, mFragment, mLifecycle); - ReflectionHelpers.setField(mController, "mContext", context); + UserManager.DISALLOW_DEBUGGING_FEATURES, true); assertThat(mController.handlePreferenceTreeClick(mPreference)).isFalse(); verify(mFactory.metricsFeatureProvider).action( @@ -197,7 +205,7 @@ public class BuildNumberPreferenceControllerTest { .thenReturn(mock(DatabaseIndexingManager.class)); mController = - new BuildNumberPreferenceController(mContext, mActivity, mFragment, mLifecycle); + new BuildNumberPreferenceController(mContext, mActivity, mFragment, mLifecycle); final boolean activityResultHandled = mController.onActivityResult( BuildNumberPreferenceController.REQUEST_CONFIRM_PASSWORD_FOR_DEV_PREF,