diff --git a/res/values/config.xml b/res/values/config.xml index 92c11f6c27e..f964d5ee241 100755 --- a/res/values/config.xml +++ b/res/values/config.xml @@ -44,6 +44,9 @@ false + + false + com.android.settings.overlay.FeatureFactoryImpl diff --git a/res/values/strings.xml b/res/values/strings.xml index b53dbde40c6..c778b685ddb 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -8236,6 +8236,9 @@ To apply Camera HAL HDR+ change, reboot device + + Camera Laser Sensor + Automatic system updates diff --git a/res/xml/development_prefs.xml b/res/xml/development_prefs.xml index 1846a8c43e0..147c5bcce7c 100644 --- a/res/xml/development_prefs.xml +++ b/res/xml/development_prefs.xml @@ -163,6 +163,10 @@ android:title="@string/telephony_monitor_switch" android:summary="@string/telephony_monitor_switch_summary"/> + + diff --git a/src/com/android/settings/development/CameraLaserSensorPreferenceController.java b/src/com/android/settings/development/CameraLaserSensorPreferenceController.java new file mode 100644 index 00000000000..26bfc805227 --- /dev/null +++ b/src/com/android/settings/development/CameraLaserSensorPreferenceController.java @@ -0,0 +1,104 @@ +/* + * 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.widget.Toast; + +import com.android.internal.annotations.VisibleForTesting; +import com.android.settings.R; +import com.android.settings.core.PreferenceControllerMixin; +import com.android.settingslib.core.AbstractPreferenceController; + +public class CameraLaserSensorPreferenceController extends AbstractPreferenceController + implements PreferenceControllerMixin { + + 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; + + private SwitchPreference mPreference; + + public CameraLaserSensorPreferenceController(Context context) { + super(context); + } + + @Override + public void displayPreference(PreferenceScreen screen) { + super.displayPreference(screen); + mPreference = (SwitchPreference) screen.findPreference(KEY_CAMERA_LASER_SENSOR_SWITCH); + updatePreference(); + } + + @Override + public String getPreferenceKey() { + return KEY_CAMERA_LASER_SENSOR_SWITCH; + } + + @Override + public boolean isAvailable() { + String buildType = SystemProperties.get(BUILD_TYPE); + return mContext.getResources().getBoolean(R.bool.config_show_camera_laser_sensor) && + (buildType.equals("userdebug") || buildType.equals("eng")); + } + + @Override + public void updateState(Preference preference) { + updatePreference(); + } + + @Override + public boolean handlePreferenceTreeClick(Preference preference) { + if (KEY_CAMERA_LASER_SENSOR_SWITCH.equals(preference.getKey())) { + final SwitchPreference switchPreference = (SwitchPreference)preference; + String value = Integer.toString(switchPreference.isChecked() ? ENABLED : DISABLED); + SystemProperties.set(PROPERTY_CAMERA_LASER_SENSOR, value); + return true; + } + return false; + } + + public void enablePreference(boolean enabled) { + if (isAvailable()) { + mPreference.setEnabled(enabled); + } + } + + public boolean updatePreference() { + if (!isAvailable()) { + return false; + } + final boolean enabled = isLaserSensorEnabled(); + mPreference.setChecked(enabled); + return enabled; + } + + private boolean isLaserSensorEnabled() { + String prop = SystemProperties.get(PROPERTY_CAMERA_LASER_SENSOR, Integer.toString(ENABLED)); + return prop.equals(Integer.toString(ENABLED)); + } +} diff --git a/src/com/android/settings/development/DevelopmentSettings.java b/src/com/android/settings/development/DevelopmentSettings.java index 137b697314c..ae271ff57d3 100644 --- a/src/com/android/settings/development/DevelopmentSettings.java +++ b/src/com/android/settings/development/DevelopmentSettings.java @@ -365,6 +365,7 @@ public class DevelopmentSettings extends RestrictedSettingsFragment private BugReportInPowerPreferenceController mBugReportInPowerController; private TelephonyMonitorPreferenceController mTelephonyMonitorController; private CameraHalHdrplusPreferenceController mCameraHalHdrplusController; + private CameraLaserSensorPreferenceController mCameraLaserSensorController; private BroadcastReceiver mEnableAdbReceiver; @@ -406,6 +407,7 @@ public class DevelopmentSettings extends RestrictedSettingsFragment mWebViewAppPrefController = new WebViewAppPreferenceController(getActivity()); mVerifyAppsOverUsbController = new VerifyAppsOverUsbPreferenceController(getActivity()); mCameraHalHdrplusController = new CameraHalHdrplusPreferenceController(getActivity()); + mCameraLaserSensorController = new CameraLaserSensorPreferenceController(getActivity()); setIfOnlyAvailableForAdmins(true); if (isUiRestricted() || !Utils.isDeviceProvisioned(getActivity())) { @@ -441,6 +443,8 @@ public class DevelopmentSettings extends RestrictedSettingsFragment mCameraHalHdrplusController.displayPreference(getPreferenceScreen()); mEnableAdbController.displayPreference(getPreferenceScreen()); + mCameraLaserSensorController.displayPreference(getPreferenceScreen()); + mKeepScreenOn = (RestrictedSwitchPreference) findAndInitSwitchPref(KEEP_SCREEN_ON); mBtHciSnoopLog = findAndInitSwitchPref(BT_HCI_SNOOP_LOG); mEnableOemUnlock = (RestrictedSwitchPreference) findAndInitSwitchPref(ENABLE_OEM_UNLOCK); @@ -660,6 +664,7 @@ public class DevelopmentSettings extends RestrictedSettingsFragment mTelephonyMonitorController.enablePreference(enabled); mWebViewAppPrefController.enablePreference(enabled); mCameraHalHdrplusController.enablePreference(enabled); + mCameraLaserSensorController.enablePreference(enabled); updateAllOptions(); } @@ -794,6 +799,7 @@ public class DevelopmentSettings extends RestrictedSettingsFragment mHaveDebugSettings |= mBugReportInPowerController.updatePreference(); mHaveDebugSettings |= mTelephonyMonitorController.updatePreference(); mHaveDebugSettings |= mCameraHalHdrplusController.updatePreference(); + mHaveDebugSettings |= mCameraLaserSensorController.updatePreference(); updateSwitchPreference(mKeepScreenOn, Settings.Global.getInt(cr, Settings.Global.STAY_ON_WHILE_PLUGGED_IN, 0) != 0); updateSwitchPreference(mBtHciSnoopLog, SystemProperties.getBoolean( @@ -2471,6 +2477,10 @@ public class DevelopmentSettings extends RestrictedSettingsFragment return true; } + if (mCameraLaserSensorController.handlePreferenceTreeClick(preference)) { + return true; + } + if (preference == mClearAdbKeys) { if (mAdbKeysDialog != null) dismissDialogs(); mAdbKeysDialog = new AlertDialog.Builder(getActivity()) diff --git a/tests/robotests/src/com/android/settings/development/CameraLaserSensorPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/development/CameraLaserSensorPreferenceControllerTest.java new file mode 100644 index 00000000000..7aab99d7c87 --- /dev/null +++ b/tests/robotests/src/com/android/settings/development/CameraLaserSensorPreferenceControllerTest.java @@ -0,0 +1,175 @@ +/* + * 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.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 CameraLaserSensorPreferenceControllerTest { + + @Mock(answer = Answers.RETURNS_DEEP_STUBS) + private Context mContext; + @Mock + private PreferenceScreen mScreen; + @Mock + private SwitchPreference mPreference; + + static final String USERDEBUG_BUILD = "userdebug"; + static final String ENG_BUILD = "eng"; + static final String USER_BUILD = "user"; + + private CameraLaserSensorPreferenceController mController; + + @Before + public void setUp() { + MockitoAnnotations.initMocks(this); + mController = new CameraLaserSensorPreferenceController(mContext); + when(mScreen.findPreference(mController.getPreferenceKey())).thenReturn(mPreference); + when(mPreference.getKey()).thenReturn(mController.getPreferenceKey()); + } + + @After + public void tearDown() { + SettingsShadowSystemProperties.clear(); + } + + @Test + public void isAvailable_withConfigNoShow_shouldReturnFalse() { + when(mContext.getResources().getBoolean(R.bool.config_show_camera_laser_sensor)) + .thenReturn(false); + assertThat(mController.isAvailable()).isFalse(); + } + + @Test + public void isAvailable_withUserdebugBuild_shouldReturnTrue() { + when(mContext.getResources().getBoolean(R.bool.config_show_camera_laser_sensor)) + .thenReturn(true); + + SettingsShadowSystemProperties.set( + CameraLaserSensorPreferenceController.BUILD_TYPE, USERDEBUG_BUILD); + + assertThat(mController.isAvailable()).isTrue(); + } + + @Test + public void isAvailable_withEngBuild_shouldReturnTrue() { + when(mContext.getResources().getBoolean(R.bool.config_show_camera_laser_sensor)) + .thenReturn(true); + + SettingsShadowSystemProperties.set( + CameraLaserSensorPreferenceController.BUILD_TYPE, ENG_BUILD); + + assertThat(mController.isAvailable()).isTrue(); + } + + @Test + public void isAvailable_withUserBuild_shouldReturnFalse() { + when(mContext.getResources().getBoolean(R.bool.config_show_camera_laser_sensor)) + .thenReturn(true); + + SettingsShadowSystemProperties.set( + CameraLaserSensorPreferenceController.BUILD_TYPE, USER_BUILD); + + assertThat(mController.isAvailable()).isFalse(); + } + + @Test + public void displayPreference_cameraLaserSensorEnabled_shouldCheckedPreference() { + when(mContext.getResources().getBoolean(R.bool.config_show_camera_laser_sensor)) + .thenReturn(true); + + SettingsShadowSystemProperties.set( + CameraLaserSensorPreferenceController.PROPERTY_CAMERA_LASER_SENSOR, + Integer.toString(CameraLaserSensorPreferenceController.ENABLED)); + SettingsShadowSystemProperties.set( + CameraLaserSensorPreferenceController.BUILD_TYPE, USERDEBUG_BUILD); + + mController.displayPreference(mScreen); + + verify(mPreference).setChecked(true); + } + + @Test + public void displayPreference_cameraLaserSensorEnabled_shouldUncheckedPreference() { + when(mContext.getResources().getBoolean(R.bool.config_show_camera_laser_sensor)) + .thenReturn(true); + + SettingsShadowSystemProperties.set( + CameraLaserSensorPreferenceController.PROPERTY_CAMERA_LASER_SENSOR, + Integer.toString(CameraLaserSensorPreferenceController.DISABLED)); + SettingsShadowSystemProperties.set( + CameraLaserSensorPreferenceController.BUILD_TYPE, USERDEBUG_BUILD); + + mController.displayPreference(mScreen); + + verify(mPreference).setChecked(false); + } + + @Test + public void handlePreferenceTreeClick_preferenceChecked_shouldEnableCameraLaserSensor() { + when(mContext.getResources().getBoolean(R.bool.config_show_camera_laser_sensor)) + .thenReturn(true); + + when(mPreference.isChecked()).thenReturn(true); + + mController.handlePreferenceTreeClick(mPreference); + + assertThat(Integer.toString(CameraLaserSensorPreferenceController.ENABLED).equals( + SystemProperties.get( + CameraLaserSensorPreferenceController.PROPERTY_CAMERA_LASER_SENSOR, + Integer.toString(CameraLaserSensorPreferenceController.ENABLED)))).isTrue(); + } + + @Test + public void handlePreferenceTreeClick_preferenceUnchecked_shouldDisableCameraLaserSensor() { + when(mContext.getResources().getBoolean(R.bool.config_show_camera_laser_sensor)) + .thenReturn(true); + + when(mPreference.isChecked()).thenReturn(false); + + mController.handlePreferenceTreeClick(mPreference); + + assertThat(Integer.toString(CameraLaserSensorPreferenceController.DISABLED).equals( + SystemProperties.get( + CameraLaserSensorPreferenceController.PROPERTY_CAMERA_LASER_SENSOR, + Integer.toString(CameraLaserSensorPreferenceController.ENABLED)))).isTrue(); + } +}