From 898feed16ad67da9de9caedce12619e3443a1265 Mon Sep 17 00:00:00 2001 From: Mill Chen Date: Wed, 9 Oct 2024 18:52:03 +0000 Subject: [PATCH] Migrate Dial pad tones preference Bug: 364899400 Test: atest DialPadTonePreferenceTest Flag: com.android.settings.flags.catalyst_sound_screen Change-Id: I5939a4d41ad61337f38bd5d48a1cb74f14f1e397 --- res/xml/sound_settings.xml | 2 +- .../notification/DialPadTonePreference.kt | 35 ++++++ .../DialPadTonePreferenceController.java | 11 +- .../settings/notification/SoundScreen.kt | 5 +- .../DialPadTonePreferenceControllerTest.java | 2 + .../notification/DialPadTonePreferenceTest.kt | 106 ++++++++++++++++++ 6 files changed, 154 insertions(+), 7 deletions(-) create mode 100644 src/com/android/settings/notification/DialPadTonePreference.kt create mode 100644 tests/robotests/src/com/android/settings/notification/DialPadTonePreferenceTest.kt diff --git a/res/xml/sound_settings.xml b/res/xml/sound_settings.xml index 15312c8b067..eed44067619 100644 --- a/res/xml/sound_settings.xml +++ b/res/xml/sound_settings.xml @@ -170,7 +170,7 @@ diff --git a/src/com/android/settings/notification/DialPadTonePreference.kt b/src/com/android/settings/notification/DialPadTonePreference.kt new file mode 100644 index 00000000000..9f1818063ab --- /dev/null +++ b/src/com/android/settings/notification/DialPadTonePreference.kt @@ -0,0 +1,35 @@ +/* + * Copyright (C) 2024 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.notification + +import android.content.Context +import android.provider.Settings.System.DTMF_TONE_WHEN_DIALING +import com.android.settings.R +import com.android.settings.Utils +import com.android.settingslib.datastore.SettingsSystemStore +import com.android.settingslib.metadata.PreferenceAvailabilityProvider +import com.android.settingslib.metadata.SwitchPreference +import com.android.settingslib.preference.SwitchPreferenceBinding + +// LINT.IfChange +class DialPadTonePreference : + SwitchPreference(DTMF_TONE_WHEN_DIALING, R.string.dial_pad_tones_title), + SwitchPreferenceBinding, PreferenceAvailabilityProvider { + override fun storage(context: Context) = SettingsSystemStore.get(context) + + override fun isAvailable(context: Context) = Utils.isVoiceCapable(context) +} +// LINT.ThenChange(DialPadTonePreferenceController.java) \ No newline at end of file diff --git a/src/com/android/settings/notification/DialPadTonePreferenceController.java b/src/com/android/settings/notification/DialPadTonePreferenceController.java index 1b05ce21187..bfbf1204af2 100644 --- a/src/com/android/settings/notification/DialPadTonePreferenceController.java +++ b/src/com/android/settings/notification/DialPadTonePreferenceController.java @@ -16,24 +16,24 @@ package com.android.settings.notification; +import static android.provider.Settings.System.DTMF_TONE_WHEN_DIALING; + import static com.android.settings.notification.SettingPref.TYPE_SYSTEM; import android.content.Context; -import android.provider.Settings.System; import com.android.settings.SettingsPreferenceFragment; import com.android.settings.Utils; import com.android.settingslib.core.lifecycle.Lifecycle; +// LINT.IfChange public class DialPadTonePreferenceController extends SettingPrefController { - private static final String KEY_DIAL_PAD_TONES = "dial_pad_tones"; - public DialPadTonePreferenceController(Context context, SettingsPreferenceFragment parent, Lifecycle lifecycle) { super(context, parent, lifecycle); - mPreference = new SettingPref( - TYPE_SYSTEM, KEY_DIAL_PAD_TONES, System.DTMF_TONE_WHEN_DIALING, DEFAULT_ON) { + mPreference = new SettingPref(TYPE_SYSTEM, DTMF_TONE_WHEN_DIALING, DTMF_TONE_WHEN_DIALING, + DEFAULT_ON) { @Override public boolean isApplicable(Context context) { return Utils.isVoiceCapable(context); @@ -42,3 +42,4 @@ public class DialPadTonePreferenceController extends SettingPrefController { } } +// LINT.ThenChange(DialPadTonePreference.kt) diff --git a/src/com/android/settings/notification/SoundScreen.kt b/src/com/android/settings/notification/SoundScreen.kt index f1f27497e38..300169d9c6d 100644 --- a/src/com/android/settings/notification/SoundScreen.kt +++ b/src/com/android/settings/notification/SoundScreen.kt @@ -40,7 +40,10 @@ class SoundScreen : PreferenceScreenCreator { override fun fragmentClass(): Class? = SoundSettings::class.java - override fun getPreferenceHierarchy(context: Context) = preferenceHierarchy(this) {} + override fun getPreferenceHierarchy(context: Context) = + preferenceHierarchy(this) { + +DialPadTonePreference() + } companion object { const val KEY = "sound_screen" diff --git a/tests/robotests/src/com/android/settings/notification/DialPadTonePreferenceControllerTest.java b/tests/robotests/src/com/android/settings/notification/DialPadTonePreferenceControllerTest.java index c6511ef3cf5..362660860f9 100644 --- a/tests/robotests/src/com/android/settings/notification/DialPadTonePreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/notification/DialPadTonePreferenceControllerTest.java @@ -39,6 +39,7 @@ import org.robolectric.RobolectricTestRunner; import org.robolectric.RuntimeEnvironment; import org.robolectric.annotation.Config; +// LINT.IfChange @RunWith(RobolectricTestRunner.class) @Config(shadows = { com.android.settings.testutils.shadow.ShadowFragment.class, @@ -123,3 +124,4 @@ public class DialPadTonePreferenceControllerTest { assertThat(System.getInt(mContentResolver, System.DTMF_TONE_WHEN_DIALING, 1)).isEqualTo(0); } } +// LINT.ThenChange(DialPadTonePreferenceTest.kt) diff --git a/tests/robotests/src/com/android/settings/notification/DialPadTonePreferenceTest.kt b/tests/robotests/src/com/android/settings/notification/DialPadTonePreferenceTest.kt new file mode 100644 index 00000000000..02ee0ee5d1e --- /dev/null +++ b/tests/robotests/src/com/android/settings/notification/DialPadTonePreferenceTest.kt @@ -0,0 +1,106 @@ +/* + * Copyright (C) 2024 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.notification + +import android.content.Context +import android.content.ContextWrapper +import android.provider.Settings.System.DTMF_TONE_WHEN_DIALING +import android.telephony.TelephonyManager +import androidx.preference.SwitchPreferenceCompat +import androidx.test.core.app.ApplicationProvider +import androidx.test.ext.junit.runners.AndroidJUnit4 +import com.android.settingslib.datastore.SettingsSystemStore +import com.google.common.truth.Truth.assertThat +import org.junit.Test +import org.junit.runner.RunWith +import org.mockito.kotlin.doReturn +import org.mockito.kotlin.mock + +// LINT.IfChange +@RunWith(AndroidJUnit4::class) +class DialPadTonePreferenceTest { + private var telephonyManager: TelephonyManager? = null + + private val context = + object : ContextWrapper(ApplicationProvider.getApplicationContext()) { + override fun getSystemService(name: String): Any? = + when (name) { + Context.TELEPHONY_SERVICE -> telephonyManager + else -> super.getSystemService(name) + } + } + + private val dialPadTonePreference = DialPadTonePreference() + + @Test + fun isAvailable_voiceCapable_shouldReturnTrue() { + telephonyManager = mock { on { isVoiceCapable } doReturn true } + + assertThat(dialPadTonePreference.isAvailable(context)).isTrue() + } + + @Test + fun isAvailable_noVoicCapable_shouldReturnFalse() { + telephonyManager = mock { on { isVoiceCapable } doReturn false } + + assertThat(dialPadTonePreference.isAvailable(context)).isFalse() + } + + @Test + fun performClick_shouldPreferenceChangeToChecked() { + setDialPadToneEnabled(false) + + val preference = getSwitchPreference().apply { performClick() } + + assertThat(preference.isChecked).isTrue() + } + + @Test + fun performClick_shouldPreferenceChangeToUnchecked() { + setDialPadToneEnabled(true) + + val preference = getSwitchPreference().apply { performClick() } + + assertThat(preference.isChecked).isFalse() + } + + @Test + fun dialToneEnabled_shouldCheckedPreference() { + setDialPadToneEnabled(true) + + assertThat(getSwitchPreference().isChecked).isTrue() + } + + @Test + fun dialToneDisabled_shouldUncheckedPreference() { + setDialPadToneEnabled(false) + + assertThat(getSwitchPreference().isChecked).isFalse() + } + + private fun getSwitchPreference(): SwitchPreferenceCompat = + dialPadTonePreference.run { + val preference = createWidget(context) + bind(preference, this) + preference as SwitchPreferenceCompat + } + + private fun setDialPadToneEnabled(enabled: Boolean) { + SettingsSystemStore.get(context) + .setValue(DTMF_TONE_WHEN_DIALING, Boolean::class.javaObjectType, enabled) + } +} +// LINT.ThenChange(DialPadTonePreferenceControllerTest.java) \ No newline at end of file