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:
@@ -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)
|
||||||
|
@@ -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,
|
||||||
|
@@ -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
|
||||||
|
@@ -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)
|
||||||
@@ -96,12 +94,15 @@ public class BuildNumberPreferenceControllerTest {
|
|||||||
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,27 +159,18 @@ 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(
|
||||||
any(Context.class),
|
any(Context.class),
|
||||||
|
Reference in New Issue
Block a user