OSDN Git Service

Introduce BluetoothInbandRingingPreferenceCtrl
authorjeffreyhuang <jeffreyhuang@google.com>
Tue, 26 Sep 2017 20:35:44 +0000 (13:35 -0700)
committerjeffreyhuang <jeffreyhuang@google.com>
Thu, 28 Sep 2017 18:19:21 +0000 (11:19 -0700)
 - Create new BluetoothInbandRingingPreferenceController
 - Create controller inside the DashboardFragment
 - Port logic from DevelopmentSettings into the controller

Bug: 34203528
Test: make RunSettingsRoboTests -j40
Change-Id: I2551803b50323c93ce8f1595d5bbab92b7a18ed4

src/com/android/settings/development/BluetoothInbandRingingPreferenceController.java [new file with mode: 0644]
src/com/android/settings/development/DevelopmentSettingsDashboardFragment.java
tests/robotests/src/com/android/settings/development/BluetoothInbandRingingPreferenceControllerTest.java [new file with mode: 0644]
tests/robotests/src/com/android/settings/development/DevelopmentSettingsDashboardFragmentTest.java

diff --git a/src/com/android/settings/development/BluetoothInbandRingingPreferenceController.java b/src/com/android/settings/development/BluetoothInbandRingingPreferenceController.java
new file mode 100644 (file)
index 0000000..250e84a
--- /dev/null
@@ -0,0 +1,91 @@
+/*
+ * 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.bluetooth.BluetoothHeadset;
+import android.content.Context;
+import android.os.SystemProperties;
+import android.support.annotation.VisibleForTesting;
+import android.support.v14.preference.SwitchPreference;
+import android.support.v7.preference.Preference;
+import android.support.v7.preference.PreferenceScreen;
+
+public class BluetoothInbandRingingPreferenceController extends
+        DeveloperOptionsPreferenceController implements Preference.OnPreferenceChangeListener {
+
+    private static final String BLUETOOTH_ENABLE_INBAND_RINGING_KEY =
+            "bluetooth_enable_inband_ringing";
+    @VisibleForTesting
+    static final String BLUETOOTH_ENABLE_INBAND_RINGING_PROPERTY =
+            "persist.bluetooth.enableinbandringing";
+
+    private SwitchPreference mPreference;
+
+    public BluetoothInbandRingingPreferenceController(Context context) {
+        super(context);
+    }
+
+    @Override
+    public boolean isAvailable() {
+        return isInbandRingingSupported();
+    }
+
+    @Override
+    public String getPreferenceKey() {
+        return BLUETOOTH_ENABLE_INBAND_RINGING_KEY;
+    }
+
+    @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;
+        SystemProperties.set(BLUETOOTH_ENABLE_INBAND_RINGING_PROPERTY,
+                isEnabled ? "true" : "false");
+        return true;
+    }
+
+    @Override
+    public void updateState(Preference preference) {
+        final boolean isEnabled = SystemProperties.getBoolean(
+                BLUETOOTH_ENABLE_INBAND_RINGING_PROPERTY, true /* default */);
+        mPreference.setChecked(isEnabled);
+    }
+
+    @Override
+    protected void onDeveloperOptionsSwitchEnabled() {
+        mPreference.setEnabled(true);
+    }
+
+    @Override
+    protected void onDeveloperOptionsSwitchDisabled() {
+        mPreference.setEnabled(false);
+        // the default setting for this preference is the enabled state
+        mPreference.setChecked(true);
+        SystemProperties.set(BLUETOOTH_ENABLE_INBAND_RINGING_PROPERTY, "true");
+    }
+
+    @VisibleForTesting
+    boolean isInbandRingingSupported() {
+        return BluetoothHeadset.isInbandRingingSupported(mContext);
+    }
+}
index df6afc4..a166528 100644 (file)
@@ -270,7 +270,7 @@ public class DevelopmentSettingsDashboardFragment extends RestrictedDashboardFra
         // select usb configuration
         controllers.add(new BluetoothDeviceNoNamePreferenceController(context));
         controllers.add(new BluetoothAbsoluteVolumePreferenceController(context));
-        // enable in-band ringing
+        controllers.add(new BluetoothInbandRingingPreferenceController(context));
         // bluetooth avrcp version
         // bluetooth audio codec
         // bluetooth audio sample rate
diff --git a/tests/robotests/src/com/android/settings/development/BluetoothInbandRingingPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/development/BluetoothInbandRingingPreferenceControllerTest.java
new file mode 100644 (file)
index 0000000..4074e25
--- /dev/null
@@ -0,0 +1,138 @@
+/*
+ * 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.BluetoothInbandRingingPreferenceController
+        .BLUETOOTH_ENABLE_INBAND_RINGING_PROPERTY;
+
+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.support.v14.preference.SwitchPreference;
+import android.support.v7.preference.PreferenceScreen;
+
+import com.android.settings.TestConfig;
+import com.android.settings.testutils.SettingsRobolectricTestRunner;
+import com.android.settings.testutils.shadow.SettingsShadowSystemProperties;
+
+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;
+import org.robolectric.annotation.Config;
+
+@RunWith(SettingsRobolectricTestRunner.class)
+@Config(manifest = TestConfig.MANIFEST_PATH,
+        sdk = TestConfig.SDK_VERSION,
+        shadows = {SettingsShadowSystemProperties.class})
+public class BluetoothInbandRingingPreferenceControllerTest {
+
+    @Mock
+    private SwitchPreference mPreference;
+    @Mock
+    private PreferenceScreen mPreferenceScreen;
+
+    private Context mContext;
+    private BluetoothInbandRingingPreferenceController mController;
+
+    @Before
+    public void setup() {
+        MockitoAnnotations.initMocks(this);
+        mContext = RuntimeEnvironment.application;
+        mController = spy(new BluetoothInbandRingingPreferenceController(mContext));
+        doReturn(true).when(mController).isInbandRingingSupported();
+        when(mPreferenceScreen.findPreference(mController.getPreferenceKey())).thenReturn(
+                mPreference);
+        mController.displayPreference(mPreferenceScreen);
+    }
+
+    @Test
+    public void isAvailable_inbandRingingNotSupported_shouldReturnFalse() {
+        doReturn(false).when(mController).isInbandRingingSupported();
+        assertThat(mController.isAvailable()).isFalse();
+    }
+
+    @Test
+    public void isAvailable_inbandRingingSupported_shouldReturnTrue() {
+        assertThat(mController.isAvailable()).isTrue();
+    }
+
+    @Test
+    public void onPreferenceChanged_settingEnabled_turnOnBluetoothSnoopLog() {
+        mController.onPreferenceChange(mPreference, true /* new value */);
+
+        final boolean mode = SettingsShadowSystemProperties.getBoolean(
+                BLUETOOTH_ENABLE_INBAND_RINGING_PROPERTY, false /* default */);
+
+        assertThat(mode).isTrue();
+    }
+
+    @Test
+    public void onPreferenceChanged_settingDisabled_turnOffBluetoothSnoopLog() {
+        mController.onPreferenceChange(mPreference, false /* new value */);
+
+        final boolean mode = SettingsShadowSystemProperties.getBoolean(
+                BLUETOOTH_ENABLE_INBAND_RINGING_PROPERTY, false /* default */);
+
+        assertThat(mode).isFalse();
+    }
+
+    @Test
+    public void updateState_settingEnabled_preferenceShouldBeChecked() {
+        SettingsShadowSystemProperties.set(BLUETOOTH_ENABLE_INBAND_RINGING_PROPERTY,
+                Boolean.toString(true));
+        mController.updateState(mPreference);
+
+        verify(mPreference).setChecked(true);
+    }
+
+    @Test
+    public void updateState_settingDisabled_preferenceShouldNotBeChecked() {
+        SettingsShadowSystemProperties.set(BLUETOOTH_ENABLE_INBAND_RINGING_PROPERTY,
+                Boolean.toString(false));
+        mController.updateState(mPreference);
+
+        verify(mPreference).setChecked(false);
+    }
+
+    @Test
+    public void onDeveloperOptionsDisabled_shouldDisablePreference() {
+        mController.onDeveloperOptionsDisabled();
+
+        final boolean mode = SettingsShadowSystemProperties.getBoolean(
+                BLUETOOTH_ENABLE_INBAND_RINGING_PROPERTY, false /* default */);
+
+        assertThat(mode).isTrue();
+        verify(mPreference).setEnabled(false);
+        verify(mPreference).setChecked(true);
+    }
+
+    @Test
+    public void onDeveloperOptionsEnabled_shouldEnablePreference() {
+        mController.onDeveloperOptionsEnabled();
+
+        verify(mPreference).setEnabled(true);
+    }
+}
index 7121a30..2787fc1 100644 (file)
@@ -114,7 +114,8 @@ public class DevelopmentSettingsDashboardFragmentTest {
     @Test
     @Config(shadows = {
             ShadowPictureColorModePreferenceController.class,
-            ShadowAdbPreferenceController.class
+            ShadowAdbPreferenceController.class,
+            ShadowBluetoothInbandRingingPreferenceController.class
     })
     public void searchIndex_pageEnabled_shouldNotAddKeysToNonIndexable() {
         final Context appContext = RuntimeEnvironment.application;
@@ -238,4 +239,13 @@ public class DevelopmentSettingsDashboardFragmentTest {
             return true;
         }
     }
+
+    @Implements(BluetoothInbandRingingPreferenceController.class)
+    public static class ShadowBluetoothInbandRingingPreferenceController {
+
+        @Implementation
+        public boolean isAvailable() {
+            return true;
+        }
+    }
 }