diff --git a/src/com/android/settings/sound/AudioSwitchPreferenceController.java b/src/com/android/settings/sound/AudioSwitchPreferenceController.java index 5938362a14e..e9787a704bc 100644 --- a/src/com/android/settings/sound/AudioSwitchPreferenceController.java +++ b/src/com/android/settings/sound/AudioSwitchPreferenceController.java @@ -45,6 +45,7 @@ import androidx.preference.PreferenceScreen; import com.android.settings.bluetooth.Utils; import com.android.settings.core.BasePreferenceController; import com.android.settings.core.FeatureFlags; +import com.android.settings.sounde.AudioSwitchUtils; import com.android.settingslib.bluetooth.A2dpProfile; import com.android.settingslib.bluetooth.BluetoothCallback; import com.android.settingslib.bluetooth.CachedBluetoothDevice; @@ -68,7 +69,8 @@ import java.util.concurrent.FutureTask; * updating the current status of switcher entry. Subclasses must overwrite */ public abstract class AudioSwitchPreferenceController extends BasePreferenceController - implements BluetoothCallback, LifecycleObserver, OnStart, OnStop { + implements BluetoothCallback, LifecycleObserver, OnStart, OnStop, + LocalBluetoothProfileManager.ServiceListener { private static final String TAG = "AudioSwitchPrefCtrl"; @@ -149,6 +151,11 @@ public abstract class AudioSwitchPreferenceController extends BasePreferenceCont return; } mLocalBluetoothManager.setForegroundActivity(mContext); + if (!AudioSwitchUtils.isLeAudioProfileReady(mProfileManager)) { + if (mProfileManager != null) { + mProfileManager.addServiceListener(this); + } + } register(); } @@ -159,6 +166,9 @@ public abstract class AudioSwitchPreferenceController extends BasePreferenceCont return; } mLocalBluetoothManager.setForegroundActivity(null); + if (mProfileManager != null) { + mProfileManager.removeServiceListener(this); + } unregister(); } @@ -193,6 +203,20 @@ public abstract class AudioSwitchPreferenceController extends BasePreferenceCont updateState(mPreference); } + @Override + public void onServiceConnected() { + Log.d(TAG, "onServiceConnected"); + if (AudioSwitchUtils.isLeAudioProfileReady(mProfileManager)) { + updateState(mPreference); + } + } + + @Override + public void onServiceDisconnected() { + Log.d(TAG, "onServiceDisconnected()"); + // Do nothing. + } + public void setCallback(AudioSwitchCallback callback) { mAudioSwitchPreferenceCallback = callback; } diff --git a/src/com/android/settings/sound/AudioSwitchUtils.kt b/src/com/android/settings/sound/AudioSwitchUtils.kt new file mode 100644 index 00000000000..de36bb14d31 --- /dev/null +++ b/src/com/android/settings/sound/AudioSwitchUtils.kt @@ -0,0 +1,32 @@ +/* + * 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.sounde + +import com.android.settingslib.bluetooth.LocalBluetoothProfileManager + +/** + * Utilities class for audio switcher controllers + */ +class AudioSwitchUtils { + companion object { + + /** Check if LE Audio profile is ready. */ + @JvmStatic + fun isLeAudioProfileReady(profileManager: LocalBluetoothProfileManager?): Boolean = + profileManager?.getLeAudioProfile()?.isProfileReady() ?: false + } +} \ No newline at end of file