/* * Copyright 2023 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.BluetoothAdapter; import android.bluetooth.BluetoothManager; import android.bluetooth.BluetoothStatusCodes; import android.content.Context; import android.os.SystemProperties; import androidx.annotation.VisibleForTesting; import androidx.preference.Preference; import androidx.preference.TwoStatePreference; import com.android.settings.core.PreferenceControllerMixin; import com.android.settingslib.development.DeveloperOptionsPreferenceController; /** * Preference controller to control whether display Bluetooth LE audio toggle in device detail * settings page or not. */ public class BluetoothLeAudioDeviceDetailsPreferenceController extends DeveloperOptionsPreferenceController implements Preference.OnPreferenceChangeListener, PreferenceControllerMixin { private static final String PREFERENCE_KEY = "bluetooth_show_leaudio_device_details"; private static final String LE_AUDIO_CONNECTION_BY_DEFAULT_PROPERTY = "ro.bluetooth.leaudio.le_audio_connection_by_default"; private static final boolean LE_AUDIO_TOGGLE_VISIBLE_DEFAULT_VALUE = true; static int sLeAudioSupportedStateCache = BluetoothStatusCodes.ERROR_UNKNOWN; static final String LE_AUDIO_TOGGLE_VISIBLE_PROPERTY = "persist.bluetooth.leaudio.toggle_visible"; @VisibleForTesting BluetoothAdapter mBluetoothAdapter; @VisibleForTesting boolean mLeAudioEnabledByDefault; public BluetoothLeAudioDeviceDetailsPreferenceController(Context context) { super(context); mBluetoothAdapter = context.getSystemService(BluetoothManager.class).getAdapter(); mLeAudioEnabledByDefault = SystemProperties.getBoolean(LE_AUDIO_CONNECTION_BY_DEFAULT_PROPERTY, true); } @Override public String getPreferenceKey() { return PREFERENCE_KEY; } @Override public boolean isAvailable() { if (sLeAudioSupportedStateCache == BluetoothStatusCodes.ERROR_UNKNOWN && mBluetoothAdapter != null) { int isLeAudioSupported = mBluetoothAdapter.isLeAudioSupported(); if (isLeAudioSupported != BluetoothStatusCodes.ERROR_BLUETOOTH_NOT_ENABLED) { sLeAudioSupportedStateCache = isLeAudioSupported; } } // Display the option only if LE Audio is supported return !mLeAudioEnabledByDefault && (sLeAudioSupportedStateCache == BluetoothStatusCodes.FEATURE_SUPPORTED); } @Override public boolean onPreferenceChange(Preference preference, Object newValue) { final boolean isEnabled = (Boolean) newValue; SystemProperties.set(LE_AUDIO_TOGGLE_VISIBLE_PROPERTY, Boolean.toString(isEnabled)); return true; } @Override public void updateState(Preference preference) { if (!isAvailable()) { return; } final boolean isLeAudioToggleVisible = SystemProperties.getBoolean( LE_AUDIO_TOGGLE_VISIBLE_PROPERTY, LE_AUDIO_TOGGLE_VISIBLE_DEFAULT_VALUE); ((TwoStatePreference) mPreference).setChecked(isLeAudioToggleVisible); } }