diff --git a/aconfig/catalyst/sound_screen.aconfig b/aconfig/catalyst/sound_screen.aconfig new file mode 100644 index 00000000000..ea5f77131dc --- /dev/null +++ b/aconfig/catalyst/sound_screen.aconfig @@ -0,0 +1,9 @@ +package: "com.android.settings.flags" +container: "system" + +flag { + name: "catalyst_sound_screen" + namespace: "android_settings" + description: "Flag for sound and vibration page" + bug: "323791114" +} \ No newline at end of file diff --git a/src/com/android/settings/notification/SoundScreen.kt b/src/com/android/settings/notification/SoundScreen.kt new file mode 100644 index 00000000000..ecb0c85ed5d --- /dev/null +++ b/src/com/android/settings/notification/SoundScreen.kt @@ -0,0 +1,47 @@ +/* + * 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 androidx.fragment.app.Fragment +import com.android.settings.R +import com.android.settings.flags.Flags +import com.android.settingslib.metadata.ProvidePreferenceScreen +import com.android.settingslib.metadata.preferenceHierarchy +import com.android.settingslib.preference.PreferenceScreenCreator + +@ProvidePreferenceScreen +class SoundScreen : PreferenceScreenCreator { + override val key: String + get() = KEY + + override val title: Int + get() = R.string.sound_settings + + override val keywords: Int + get() = R.string.keywords_sounds + + override fun isFlagEnabled(context: Context): Boolean = Flags.catalystSoundScreen() + + override fun fragmentClass(): Class? = SoundSettings::class.java + + override fun getPreferenceHierarchy(context: Context) = + preferenceHierarchy(this) {} + + companion object { + const val KEY = "sound_screen" + } +} \ No newline at end of file diff --git a/src/com/android/settings/notification/SoundSettings.java b/src/com/android/settings/notification/SoundSettings.java index 4575708bbbd..596f19bc62a 100644 --- a/src/com/android/settings/notification/SoundSettings.java +++ b/src/com/android/settings/notification/SoundSettings.java @@ -29,6 +29,8 @@ import android.os.UserHandle; import android.preference.SeekBarVolumizer; import android.text.TextUtils; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; import androidx.annotation.VisibleForTesting; import androidx.preference.ListPreference; import androidx.preference.Preference; @@ -193,21 +195,23 @@ public class SoundSettings extends DashboardFragment implements OnActivityResult @Override public void onAttach(Context context) { super.onAttach(context); - ArrayList volumeControllers = new ArrayList<>(); - volumeControllers.add(use(AlarmVolumePreferenceController.class)); - volumeControllers.add(use(MediaVolumePreferenceController.class)); - volumeControllers.add(use(SeparateRingVolumePreferenceController.class)); - volumeControllers.add(use(NotificationVolumePreferenceController.class)); - volumeControllers.add(use(CallVolumePreferenceController.class)); + if (!isCatalystEnabled()) { + ArrayList volumeControllers = new ArrayList<>(); + volumeControllers.add(use(AlarmVolumePreferenceController.class)); + volumeControllers.add(use(MediaVolumePreferenceController.class)); + volumeControllers.add(use(SeparateRingVolumePreferenceController.class)); + volumeControllers.add(use(NotificationVolumePreferenceController.class)); + volumeControllers.add(use(CallVolumePreferenceController.class)); - use(HandsFreeProfileOutputPreferenceController.class).setCallback(listPreference -> - onPreferenceDataChanged(listPreference)); - mHfpOutputControllerKey = - use(HandsFreeProfileOutputPreferenceController.class).getPreferenceKey(); + use(HandsFreeProfileOutputPreferenceController.class).setCallback(listPreference -> + onPreferenceDataChanged(listPreference)); + mHfpOutputControllerKey = + use(HandsFreeProfileOutputPreferenceController.class).getPreferenceKey(); - for (VolumeSeekBarPreferenceController controller : volumeControllers) { - controller.setCallback(mVolumeCallback); - getSettingsLifecycle().addObserver(controller); + for (VolumeSeekBarPreferenceController controller : volumeControllers) { + controller.setCallback(mVolumeCallback); + getSettingsLifecycle().addObserver(controller); + } } } @@ -321,4 +325,9 @@ public class SoundSettings extends DashboardFragment implements OnActivityResult mDialogFragment.onListPreferenceUpdated(preference); } } + + @Override + public @Nullable String getPreferenceScreenBindingKey(@NonNull Context context) { + return SoundScreen.KEY; + } } diff --git a/tests/robotests/src/com/android/settings/notification/SoundScreenTest.kt b/tests/robotests/src/com/android/settings/notification/SoundScreenTest.kt new file mode 100644 index 00000000000..83b29d2907f --- /dev/null +++ b/tests/robotests/src/com/android/settings/notification/SoundScreenTest.kt @@ -0,0 +1,53 @@ +/* + * 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.platform.test.annotations.DisableFlags +import android.platform.test.annotations.EnableFlags +import android.platform.test.flag.junit.SetFlagsRule +import androidx.test.core.app.ApplicationProvider +import androidx.test.ext.junit.runners.AndroidJUnit4 +import com.android.settings.flags.Flags +import com.google.common.truth.Truth.assertThat +import org.junit.Rule +import org.junit.Test +import org.junit.runner.RunWith + +@RunWith(AndroidJUnit4::class) +class SoundScreenTest { + @get:Rule val setFlagsRule = SetFlagsRule() + private val context: Context = ApplicationProvider.getApplicationContext() + private val soundScreen = SoundScreen() + + @Test + fun key() { + assertThat(soundScreen.key).isEqualTo(SoundScreen.KEY) + } + + @Test + @EnableFlags(Flags.FLAG_CATALYST_SOUND_SCREEN) + fun isFlagEnabled_returnTrue() { + assertThat(soundScreen.isFlagEnabled(context)).isTrue() + } + + @Test + @DisableFlags(Flags.FLAG_CATALYST_SOUND_SCREEN) + fun isFlagEnabled_returnFalse() { + assertThat(soundScreen.isFlagEnabled(context)).isFalse() + } + +} \ No newline at end of file