From 8e3859bc5a28ec38c9ae7c9968fc9c276de55d96 Mon Sep 17 00:00:00 2001 From: Andrii Kulian Date: Fri, 19 Oct 2018 11:24:47 -0700 Subject: [PATCH] Add dev option to force desktop mode Bug: 112451761 Test: DesktopModePreferenceControllerTest Test: FreeformWindowsPreferenceControllerTest Change-Id: I7df995d1bd8731b813cfa0c72c4dc6d35973e939 --- res/values/strings.xml | 5 + res/xml/development_settings.xml | 5 + .../DesktopModePreferenceController.java | 79 +++++++++++ .../DevelopmentSettingsDashboardFragment.java | 1 + .../FreeformWindowsPreferenceController.java | 8 -- .../DesktopModePreferenceControllerTest.java | 132 ++++++++++++++++++ ...eeformWindowsPreferenceControllerTest.java | 6 +- tests/uitests/assets/search_results_list | 1 + 8 files changed, 226 insertions(+), 11 deletions(-) create mode 100644 src/com/android/settings/development/DesktopModePreferenceController.java create mode 100644 tests/robotests/src/com/android/settings/development/DesktopModePreferenceControllerTest.java diff --git a/res/values/strings.xml b/res/values/strings.xml index e14135ccd7c..aa66d28cfc2 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -10281,4 +10281,9 @@ No connected devices + + + Force desktop mode + + Force experimental desktop mode on secondary displays diff --git a/res/xml/development_settings.xml b/res/xml/development_settings.xml index 6528cf74716..49018f8048e 100644 --- a/res/xml/development_settings.xml +++ b/res/xml/development_settings.xml @@ -510,6 +510,11 @@ android:title="@string/enable_freeform_support" android:summary="@string/enable_freeform_support_summary" /> + + diff --git a/src/com/android/settings/development/DesktopModePreferenceController.java b/src/com/android/settings/development/DesktopModePreferenceController.java new file mode 100644 index 00000000000..528af8aee80 --- /dev/null +++ b/src/com/android/settings/development/DesktopModePreferenceController.java @@ -0,0 +1,79 @@ +/* + * Copyright (C) 2018 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.settings.development; + +import static android.provider.Settings.Global.DEVELOPMENT_FORCE_DESKTOP_MODE_ON_EXTERNAL_DISPLAYS; + +import android.content.Context; +import android.os.Build; +import android.provider.Settings; + +import androidx.annotation.VisibleForTesting; +import androidx.preference.Preference; +import androidx.preference.SwitchPreference; + +import com.android.settings.core.PreferenceControllerMixin; +import com.android.settingslib.development.DeveloperOptionsPreferenceController; + +public class DesktopModePreferenceController extends DeveloperOptionsPreferenceController + implements Preference.OnPreferenceChangeListener, PreferenceControllerMixin { + + private static final String FORCE_DESKTOP_MODE_KEY = "force_desktop_mode_on_external_displays"; + + @VisibleForTesting + static final int SETTING_VALUE_OFF = 0; + @VisibleForTesting + static final int SETTING_VALUE_ON = 1; + + public DesktopModePreferenceController(Context context) { + super(context); + } + + @Override + public String getPreferenceKey() { + return FORCE_DESKTOP_MODE_KEY; + } + + @Override + public boolean onPreferenceChange(Preference preference, Object newValue) { + final boolean isEnabled = (Boolean) newValue; + Settings.Global.putInt(mContext.getContentResolver(), + DEVELOPMENT_FORCE_DESKTOP_MODE_ON_EXTERNAL_DISPLAYS, + isEnabled ? SETTING_VALUE_ON : SETTING_VALUE_OFF); + return true; + } + + @Override + public void updateState(Preference preference) { + final int mode = Settings.Global.getInt(mContext.getContentResolver(), + DEVELOPMENT_FORCE_DESKTOP_MODE_ON_EXTERNAL_DISPLAYS, SETTING_VALUE_OFF); + ((SwitchPreference) mPreference).setChecked(mode != SETTING_VALUE_OFF); + } + + @Override + protected void onDeveloperOptionsSwitchDisabled() { + super.onDeveloperOptionsSwitchDisabled(); + Settings.Global.putInt(mContext.getContentResolver(), + DEVELOPMENT_FORCE_DESKTOP_MODE_ON_EXTERNAL_DISPLAYS, SETTING_VALUE_OFF); + ((SwitchPreference) mPreference).setChecked(false); + } + + @VisibleForTesting + String getBuildType() { + return Build.TYPE; + } +} diff --git a/src/com/android/settings/development/DevelopmentSettingsDashboardFragment.java b/src/com/android/settings/development/DevelopmentSettingsDashboardFragment.java index 82c98288973..5663d1e309b 100644 --- a/src/com/android/settings/development/DevelopmentSettingsDashboardFragment.java +++ b/src/com/android/settings/development/DevelopmentSettingsDashboardFragment.java @@ -458,6 +458,7 @@ public class DevelopmentSettingsDashboardFragment extends RestrictedDashboardFra controllers.add(new AllowAppsOnExternalPreferenceController(context)); controllers.add(new ResizableActivityPreferenceController(context)); controllers.add(new FreeformWindowsPreferenceController(context)); + controllers.add(new DesktopModePreferenceController(context)); controllers.add(new SmsAccessRestrictionPreferenceController(context)); controllers.add(new ShortcutManagerThrottlingPreferenceController(context)); controllers.add(new EnableGnssRawMeasFullTrackingPreferenceController(context)); diff --git a/src/com/android/settings/development/FreeformWindowsPreferenceController.java b/src/com/android/settings/development/FreeformWindowsPreferenceController.java index 5b19f36c152..4d384809464 100644 --- a/src/com/android/settings/development/FreeformWindowsPreferenceController.java +++ b/src/com/android/settings/development/FreeformWindowsPreferenceController.java @@ -19,7 +19,6 @@ package com.android.settings.development; import android.content.Context; import android.os.Build; import android.provider.Settings; -import android.text.TextUtils; import androidx.annotation.VisibleForTesting; import androidx.preference.Preference; @@ -37,18 +36,11 @@ public class FreeformWindowsPreferenceController extends DeveloperOptionsPrefere static final int SETTING_VALUE_OFF = 0; @VisibleForTesting static final int SETTING_VALUE_ON = 1; - @VisibleForTesting - static final String USER_BUILD_TYPE = "user"; public FreeformWindowsPreferenceController(Context context) { super(context); } - @Override - public boolean isAvailable() { - return !TextUtils.equals(USER_BUILD_TYPE, getBuildType()); - } - @Override public String getPreferenceKey() { return ENABLE_FREEFORM_SUPPORT_KEY; diff --git a/tests/robotests/src/com/android/settings/development/DesktopModePreferenceControllerTest.java b/tests/robotests/src/com/android/settings/development/DesktopModePreferenceControllerTest.java new file mode 100644 index 00000000000..e6e8cb9e850 --- /dev/null +++ b/tests/robotests/src/com/android/settings/development/DesktopModePreferenceControllerTest.java @@ -0,0 +1,132 @@ +/* + * Copyright (C) 2018 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.settings.development; + +import static android.provider.Settings.Global.DEVELOPMENT_FORCE_DESKTOP_MODE_ON_EXTERNAL_DISPLAYS; + +import static com.android.settings.development.DesktopModePreferenceController.SETTING_VALUE_OFF; +import static com.android.settings.development.DesktopModePreferenceController.SETTING_VALUE_ON; + +import static com.google.common.truth.Truth.assertThat; + +import static org.mockito.Mockito.doReturn; +import static org.mockito.Mockito.spy; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +import android.content.Context; +import android.provider.Settings; + +import androidx.preference.PreferenceScreen; +import androidx.preference.SwitchPreference; + +import com.android.settings.testutils.SettingsRobolectricTestRunner; + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; +import org.robolectric.RuntimeEnvironment; + +@RunWith(SettingsRobolectricTestRunner.class) +public class DesktopModePreferenceControllerTest { + + private static final String ENG_BUILD_TYPE = "eng"; + private static final String USER_BUILD_TYPE = "user"; + + @Mock + private SwitchPreference mPreference; + @Mock + private PreferenceScreen mScreen; + + private Context mContext; + private DesktopModePreferenceController mController; + + @Before + public void setup() { + MockitoAnnotations.initMocks(this); + mContext = RuntimeEnvironment.application; + mController = new DesktopModePreferenceController(mContext); + when(mScreen.findPreference(mController.getPreferenceKey())).thenReturn(mPreference); + mController.displayPreference(mScreen); + } + + @Test + public void isAvailable_engBuild_shouldBeTrue() { + mController = spy(mController); + doReturn(ENG_BUILD_TYPE).when(mController).getBuildType(); + + assertThat(mController.isAvailable()).isTrue(); + } + + @Test + public void isAvaiable_userBuild_shouldBeTrue() { + mController = spy(mController); + doReturn(USER_BUILD_TYPE).when(mController).getBuildType(); + + assertThat(mController.isAvailable()).isTrue(); + } + + @Test + public void onPreferenceChange_switchEnabled_shouldEnableFreeformWindows() { + mController.onPreferenceChange(mPreference, true /* new value */); + + final int mode = Settings.Global.getInt(mContext.getContentResolver(), + DEVELOPMENT_FORCE_DESKTOP_MODE_ON_EXTERNAL_DISPLAYS, -1 /* default */); + assertThat(mode).isEqualTo(SETTING_VALUE_ON); + } + + @Test + public void onPreferenceChange_switchDisabled_shouldDisableFreeformWindows() { + mController.onPreferenceChange(mPreference, false /* new value */); + + final int mode = Settings.Global.getInt(mContext.getContentResolver(), + DEVELOPMENT_FORCE_DESKTOP_MODE_ON_EXTERNAL_DISPLAYS, -1 /* default */); + assertThat(mode).isEqualTo(SETTING_VALUE_OFF); + } + + @Test + public void updateState_settingEnabled_preferenceShouldBeChecked() { + Settings.Global.putInt(mContext.getContentResolver(), + DEVELOPMENT_FORCE_DESKTOP_MODE_ON_EXTERNAL_DISPLAYS, SETTING_VALUE_ON); + + mController.updateState(mPreference); + + verify(mPreference).setChecked(true); + } + + @Test + public void updateState_settingDisabled_preferenceShouldNotBeChecked() { + Settings.Global.putInt(mContext.getContentResolver(), + DEVELOPMENT_FORCE_DESKTOP_MODE_ON_EXTERNAL_DISPLAYS, SETTING_VALUE_OFF); + + mController.updateState(mPreference); + + verify(mPreference).setChecked(false); + } + + @Test + public void onDeveloperOptionsSwitchDisabled_shouldDisablePreference() { + mController.onDeveloperOptionsSwitchDisabled(); + + final int mode = Settings.Global.getInt(mContext.getContentResolver(), + DEVELOPMENT_FORCE_DESKTOP_MODE_ON_EXTERNAL_DISPLAYS, -1 /* default */); + assertThat(mode).isEqualTo(SETTING_VALUE_OFF); + verify(mPreference).setEnabled(false); + } +} diff --git a/tests/robotests/src/com/android/settings/development/FreeformWindowsPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/development/FreeformWindowsPreferenceControllerTest.java index b58f756169a..08fb23e885f 100644 --- a/tests/robotests/src/com/android/settings/development/FreeformWindowsPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/development/FreeformWindowsPreferenceControllerTest.java @@ -19,7 +19,6 @@ package com.android.settings.development; import static com.android.settings.development.FreeformWindowsPreferenceController .SETTING_VALUE_OFF; import static com.android.settings.development.FreeformWindowsPreferenceController.SETTING_VALUE_ON; -import static com.android.settings.development.FreeformWindowsPreferenceController.USER_BUILD_TYPE; import static com.google.common.truth.Truth.assertThat; @@ -47,6 +46,7 @@ import org.robolectric.RuntimeEnvironment; public class FreeformWindowsPreferenceControllerTest { private static final String ENG_BUILD_TYPE = "eng"; + private static final String USER_BUILD_TYPE = "user"; @Mock private SwitchPreference mPreference; @@ -74,11 +74,11 @@ public class FreeformWindowsPreferenceControllerTest { } @Test - public void isAvaiable_userBuild_shouldBeFalse() { + public void isAvaiable_userBuild_shouldBeTrue() { mController = spy(mController); doReturn(USER_BUILD_TYPE).when(mController).getBuildType(); - assertThat(mController.isAvailable()).isFalse(); + assertThat(mController.isAvailable()).isTrue(); } @Test diff --git a/tests/uitests/assets/search_results_list b/tests/uitests/assets/search_results_list index a0cc894f705..817164e3dee 100644 --- a/tests/uitests/assets/search_results_list +++ b/tests/uitests/assets/search_results_list @@ -236,6 +236,7 @@ Force 4x MSAA;force_msaa Force RTL layout direction;force_rtl_layout_all_locales Force activities to be resizable;force_resizable_activities Force allow apps on external;force_allow_on_external +Force desktop mode;force_desktop_mode_on_external_displays Force full GNSS measurements;enable_gnss_raw_meas_full_tracking Free up space;storage_settings_free_space Games;pref_games