From c215b3c4e96ee23f2ab449158c1e887021aa8c70 Mon Sep 17 00:00:00 2001 From: jeffreyhuang Date: Mon, 25 Sep 2017 10:19:51 -0700 Subject: [PATCH] Introduce CameraLaserSensorPreferenceControllerV2 - Create new CameraLaserSensorPreferenceControllerV2 - Copy logic from CameraLaserSensorPreferenceController with slight modifications for dashboard fragment compatibility - Deprecate CameraLaserSensorPreferenceController Bug: 34203528 Test: make RunSettingsRoboTests -j40 Change-Id: I8854d3e891afab607025a427a376e33e9b61dcc3 --- ...CameraLaserSensorPreferenceController.java | 4 + ...meraLaserSensorPreferenceControllerV2.java | 108 +++++++++++ .../DevelopmentSettingsDashboardFragment.java | 2 +- tests/robotests/res/values-mcc999/config.xml | 1 + tests/robotests/res/values/config.xml | 1 + ...raLaserSensorPreferenceControllerTest.java | 4 + ...LaserSensorPreferenceControllerV2Test.java | 173 ++++++++++++++++++ 7 files changed, 292 insertions(+), 1 deletion(-) create mode 100644 src/com/android/settings/development/CameraLaserSensorPreferenceControllerV2.java create mode 100644 tests/robotests/src/com/android/settings/development/CameraLaserSensorPreferenceControllerV2Test.java diff --git a/src/com/android/settings/development/CameraLaserSensorPreferenceController.java b/src/com/android/settings/development/CameraLaserSensorPreferenceController.java index 26bfc805227..3f47b88b90e 100644 --- a/src/com/android/settings/development/CameraLaserSensorPreferenceController.java +++ b/src/com/android/settings/development/CameraLaserSensorPreferenceController.java @@ -28,6 +28,10 @@ import com.android.settings.R; import com.android.settings.core.PreferenceControllerMixin; import com.android.settingslib.core.AbstractPreferenceController; +/** + * deprecated in favor of {@link CameraLaserSensorPreferenceControllerV2} + */ +@Deprecated public class CameraLaserSensorPreferenceController extends AbstractPreferenceController implements PreferenceControllerMixin { diff --git a/src/com/android/settings/development/CameraLaserSensorPreferenceControllerV2.java b/src/com/android/settings/development/CameraLaserSensorPreferenceControllerV2.java new file mode 100644 index 00000000000..c3a5f164b0f --- /dev/null +++ b/src/com/android/settings/development/CameraLaserSensorPreferenceControllerV2.java @@ -0,0 +1,108 @@ +/* + * Copyright (C) 2017 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 android.content.Context; +import android.os.SystemProperties; +import android.support.v14.preference.SwitchPreference; +import android.support.v7.preference.Preference; +import android.support.v7.preference.PreferenceScreen; +import android.text.TextUtils; + +import com.android.internal.annotations.VisibleForTesting; +import com.android.settings.R; + +public class CameraLaserSensorPreferenceControllerV2 extends + DeveloperOptionsPreferenceController implements + Preference.OnPreferenceChangeListener { + + private static final String KEY_CAMERA_LASER_SENSOR_SWITCH = "camera_laser_sensor_switch"; + @VisibleForTesting + static final String BUILD_TYPE = "ro.build.type"; + @VisibleForTesting + static final String PROPERTY_CAMERA_LASER_SENSOR = "persist.camera.stats.disablehaf"; + @VisibleForTesting + static final int ENABLED = 0; + @VisibleForTesting + static final int DISABLED = 2; + @VisibleForTesting + static final String USERDEBUG_BUILD = "userdebug"; + @VisibleForTesting + static final String ENG_BUILD = "eng"; + @VisibleForTesting + static final String USER_BUILD = "user"; + + private SwitchPreference mPreference; + + public CameraLaserSensorPreferenceControllerV2(Context context) { + super(context); + } + + @Override + public boolean isAvailable() { + final String buildType = SystemProperties.get(BUILD_TYPE); + return mContext.getResources().getBoolean(R.bool.config_show_camera_laser_sensor) && + (TextUtils.equals(USERDEBUG_BUILD, buildType) || TextUtils.equals(ENG_BUILD, + buildType)); + } + + @Override + public String getPreferenceKey() { + return KEY_CAMERA_LASER_SENSOR_SWITCH; + } + + @Override + public void displayPreference(PreferenceScreen screen) { + super.displayPreference(screen); + + mPreference = (SwitchPreference) screen.findPreference(getPreferenceKey()); + } + + @Override + public boolean onPreferenceChange(Preference preference, Object newValue) { + final boolean isEnabled = (Boolean) newValue; + String value = Integer.toString(isEnabled ? ENABLED : DISABLED); + SystemProperties.set(PROPERTY_CAMERA_LASER_SENSOR, value); + return true; + } + + @Override + public void updateState(Preference preference) { + final boolean enabled = isLaserSensorEnabled(); + mPreference.setChecked(enabled); + } + + @Override + protected void onDeveloperOptionsSwitchEnabled() { + mPreference.setEnabled(true); + } + + @Override + protected void onDeveloperOptionsSwitchDisabled() { + SystemProperties.set(PROPERTY_CAMERA_LASER_SENSOR, Integer.toString(DISABLED)); + mPreference.setChecked(false); + mPreference.setEnabled(false); + } + + private boolean isLaserSensorEnabled() { + final String prop = SystemProperties.get(PROPERTY_CAMERA_LASER_SENSOR, + Integer.toString(ENABLED)); + return TextUtils.equals(Integer.toString(ENABLED), prop); + } + +} diff --git a/src/com/android/settings/development/DevelopmentSettingsDashboardFragment.java b/src/com/android/settings/development/DevelopmentSettingsDashboardFragment.java index 141f1ba64ed..5f6b048698f 100644 --- a/src/com/android/settings/development/DevelopmentSettingsDashboardFragment.java +++ b/src/com/android/settings/development/DevelopmentSettingsDashboardFragment.java @@ -199,7 +199,7 @@ public class DevelopmentSettingsDashboardFragment extends RestrictedDashboardFra // logger buffer sizes // store logger data persistently on device // telephony monitor - // camera laser sensor + controllers.add(new CameraLaserSensorPreferenceControllerV2(context)); // camera HAL HDR+ // feature flags // wireless display certification diff --git a/tests/robotests/res/values-mcc999/config.xml b/tests/robotests/res/values-mcc999/config.xml index 800c6449eea..5f9596e99e6 100644 --- a/tests/robotests/res/values-mcc999/config.xml +++ b/tests/robotests/res/values-mcc999/config.xml @@ -17,4 +17,5 @@ false + false \ No newline at end of file diff --git a/tests/robotests/res/values/config.xml b/tests/robotests/res/values/config.xml index 411412cffed..07fa08ea48a 100644 --- a/tests/robotests/res/values/config.xml +++ b/tests/robotests/res/values/config.xml @@ -18,4 +18,5 @@ true true + true \ No newline at end of file diff --git a/tests/robotests/src/com/android/settings/development/CameraLaserSensorPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/development/CameraLaserSensorPreferenceControllerTest.java index 7aab99d7c87..25c09fe673a 100644 --- a/tests/robotests/src/com/android/settings/development/CameraLaserSensorPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/development/CameraLaserSensorPreferenceControllerTest.java @@ -40,6 +40,10 @@ import static com.google.common.truth.Truth.assertThat; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; +/** + * deprecated in favour of {@link CameraLaserSensorPreferenceControllerV2} + */ +@Deprecated @RunWith(SettingsRobolectricTestRunner.class) @Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION, shadows = {SettingsShadowSystemProperties.class}) diff --git a/tests/robotests/src/com/android/settings/development/CameraLaserSensorPreferenceControllerV2Test.java b/tests/robotests/src/com/android/settings/development/CameraLaserSensorPreferenceControllerV2Test.java new file mode 100644 index 00000000000..87967b99d7d --- /dev/null +++ b/tests/robotests/src/com/android/settings/development/CameraLaserSensorPreferenceControllerV2Test.java @@ -0,0 +1,173 @@ +/* + * Copyright (C) 2017 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 com.android.settings.development.CameraLaserSensorPreferenceControllerV2.ENG_BUILD; +import static com.android.settings.development + .CameraLaserSensorPreferenceControllerV2.USERDEBUG_BUILD; +import static com.android.settings.development.CameraLaserSensorPreferenceControllerV2.USER_BUILD; + +import android.content.Context; +import android.content.res.Resources; +import android.os.SystemProperties; +import android.support.v14.preference.SwitchPreference; +import android.support.v7.preference.PreferenceScreen; + +import com.android.settings.R; +import com.android.settings.testutils.SettingsRobolectricTestRunner; +import com.android.settings.TestConfig; +import com.android.settings.testutils.shadow.SettingsShadowSystemProperties; + +import org.junit.After; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Answers; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; +import org.robolectric.annotation.Config; +import org.robolectric.RuntimeEnvironment; + +import static com.google.common.truth.Truth.assertThat; + +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +@RunWith(SettingsRobolectricTestRunner.class) +@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION, + shadows = {SettingsShadowSystemProperties.class}) +public class CameraLaserSensorPreferenceControllerV2Test { + + @Mock + private PreferenceScreen mScreen; + @Mock + private SwitchPreference mPreference; + + private Context mContext; + + private CameraLaserSensorPreferenceControllerV2 mController; + + @Before + public void setUp() { + MockitoAnnotations.initMocks(this); + mContext = RuntimeEnvironment.application; + mController = new CameraLaserSensorPreferenceControllerV2(mContext); + when(mScreen.findPreference(mController.getPreferenceKey())).thenReturn(mPreference); + when(mPreference.getKey()).thenReturn(mController.getPreferenceKey()); + mController.displayPreference(mScreen); + } + + @After + public void tearDown() { + SettingsShadowSystemProperties.clear(); + } + + @Test + @Config(qualifiers = "mcc999") + public void isAvailable_withConfigNoShow_shouldReturnFalse() { + assertThat(mController.isAvailable()).isFalse(); + } + + @Test + public void isAvailable_withUserdebugBuild_shouldReturnTrue() { + SettingsShadowSystemProperties.set( + CameraLaserSensorPreferenceControllerV2.BUILD_TYPE, USERDEBUG_BUILD); + + assertThat(mController.isAvailable()).isTrue(); + } + + @Test + public void isAvailable_withEngBuild_shouldReturnTrue() { + SettingsShadowSystemProperties.set( + CameraLaserSensorPreferenceControllerV2.BUILD_TYPE, ENG_BUILD); + + assertThat(mController.isAvailable()).isTrue(); + } + + @Test + public void isAvailable_withUserBuild_shouldReturnFalse() { + SettingsShadowSystemProperties.set( + CameraLaserSensorPreferenceControllerV2.BUILD_TYPE, USER_BUILD); + + assertThat(mController.isAvailable()).isFalse(); + } + + @Test + public void updateState_cameraLaserSensorEnabled_shouldCheckedPreference() { + SettingsShadowSystemProperties.set( + CameraLaserSensorPreferenceControllerV2.PROPERTY_CAMERA_LASER_SENSOR, + Integer.toString(CameraLaserSensorPreferenceControllerV2.ENABLED)); + SettingsShadowSystemProperties.set( + CameraLaserSensorPreferenceControllerV2.BUILD_TYPE, USERDEBUG_BUILD); + + mController.updateState(mScreen); + + verify(mPreference).setChecked(true); + } + + @Test + public void updateState_cameraLaserSensorEnabled_shouldUncheckedPreference() { + SettingsShadowSystemProperties.set( + CameraLaserSensorPreferenceControllerV2.PROPERTY_CAMERA_LASER_SENSOR, + Integer.toString(CameraLaserSensorPreferenceControllerV2.DISABLED)); + SettingsShadowSystemProperties.set( + CameraLaserSensorPreferenceControllerV2.BUILD_TYPE, USERDEBUG_BUILD); + + mController.updateState(mScreen); + + verify(mPreference).setChecked(false); + } + + @Test + public void onPreferenceChange_preferenceChecked_shouldEnableCameraLaserSensor() { + mController.onPreferenceChange(mPreference, true); + + assertThat(Integer.toString(CameraLaserSensorPreferenceControllerV2.ENABLED)).isEqualTo( + SystemProperties.get( + CameraLaserSensorPreferenceControllerV2.PROPERTY_CAMERA_LASER_SENSOR, + Integer.toString(CameraLaserSensorPreferenceControllerV2.ENABLED))); + } + + @Test + public void onPreferenceChange__preferenceUnchecked_shouldDisableCameraLaserSensor() { + mController.onPreferenceChange(mPreference, false); + + assertThat(Integer.toString(CameraLaserSensorPreferenceControllerV2.DISABLED)).isEqualTo( + SystemProperties.get( + CameraLaserSensorPreferenceControllerV2.PROPERTY_CAMERA_LASER_SENSOR, + Integer.toString(CameraLaserSensorPreferenceControllerV2.ENABLED))); + } + + @Test + public void onDeveloperOptionsSwitchEnabled_preferenceShouldBeEnabled() { + mController.onDeveloperOptionsSwitchEnabled(); + + verify(mPreference).setEnabled(true); + } + + @Test + public void onDeveloperOptionsSwitchDisabled_preferenceShouldBeEnabled() { + mController.onDeveloperOptionsSwitchDisabled(); + + verify(mPreference).setEnabled(false); + verify(mPreference).setChecked(false); + assertThat(Integer.toString(CameraLaserSensorPreferenceControllerV2.DISABLED)).isEqualTo( + SystemProperties.get( + CameraLaserSensorPreferenceControllerV2.PROPERTY_CAMERA_LASER_SENSOR, + Integer.toString(CameraLaserSensorPreferenceControllerV2.ENABLED))); + } +}