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
diff --git a/src/com/android/settings/SettingsActivity.java b/src/com/android/settings/SettingsActivity.java
index 15b3c66..83bb082 100644
--- a/src/com/android/settings/SettingsActivity.java
+++ b/src/com/android/settings/SettingsActivity.java
@@ -63,6 +63,7 @@
 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 @@
 
         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 @@
                     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 0f3bfb8..46bc120 100644
--- a/src/com/android/settings/deviceinfo/BuildNumberPreferenceController.java
+++ b/src/com/android/settings/deviceinfo/BuildNumberPreferenceController.java
@@ -18,8 +18,10 @@
 
 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 @@
         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 @@
         }
 
         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,