Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 3c209b06 authored by Treehugger Robot's avatar Treehugger Robot Committed by Gerrit Code Review
Browse files

Merge "Add LE audio hardware offload development option"

parents 2f4962c8 25c2e312
Loading
Loading
Loading
Loading
+10 −8
Original line number Diff line number Diff line
@@ -329,14 +329,16 @@
    <!-- UI debug setting: Disable Bluetooth A2DP hardware offload [CHAR LIMIT=none] -->
    <string name="bluetooth_disable_a2dp_hw_offload">Disable Bluetooth A2DP hardware offload</string>
    <!-- UI debug setting: Disable Bluetooth A2DP hardware offload [CHAR LIMIT=none] -->
    <string name="bluetooth_disable_a2dp_hw_offload_dialog_title">Restart Device?</string>
    <!-- UI debug setting: Disable Bluetooth A2DP hardware offload [CHAR LIMIT=none] -->
    <string name="bluetooth_disable_a2dp_hw_offload_dialog_message">You need to restart your device to change this setting.</string>
    <!-- UI debug setting: Disable Bluetooth A2DP hardware offload [CHAR LIMIT=none] -->
    <string name="bluetooth_disable_a2dp_hw_offload_dialog_confirm">Restart</string>
    <!-- UI debug setting: Disable Bluetooth A2DP hardware offload [CHAR LIMIT=none] -->
    <string name="bluetooth_disable_a2dp_hw_offload_dialog_cancel">Cancel</string>
    <!-- UI debug setting: Disable Bluetooth LE AUDIO hardware offload [CHAR LIMIT=none] -->
    <string name="bluetooth_disable_le_audio_hw_offload">Disable Bluetooth LE AUDIO hardware offload</string>
    <!-- UI debug setting: Disable Bluetooth hardware offload [CHAR LIMIT=none] -->
    <string name="bluetooth_disable_hw_offload_dialog_title">Restart Device?</string>
    <!-- UI debug setting: Disable Bluetooth hardware offload [CHAR LIMIT=none] -->
    <string name="bluetooth_disable_hw_offload_dialog_message">You need to restart your device to change this setting.</string>
    <!-- UI debug setting: Disable Bluetooth hardware offload [CHAR LIMIT=none] -->
    <string name="bluetooth_disable_hw_offload_dialog_confirm">Restart</string>
    <!-- UI debug setting: Disable Bluetooth hardware offload [CHAR LIMIT=none] -->
    <string name="bluetooth_disable_hw_offload_dialog_cancel">Cancel</string>
    <!-- Title for Bluetooth device group with media capability group [CHAR LIMIT=none]-->
    <string name="connected_device_media_device_title">Media devices</string>
+4 −0
Original line number Diff line number Diff line
@@ -306,6 +306,10 @@
            android:key="bluetooth_disable_a2dp_hw_offload"
            android:title="@string/bluetooth_disable_a2dp_hw_offload" />

        <SwitchPreference
            android:key="bluetooth_disable_le_audio_hw_offload"
            android:title="@string/bluetooth_disable_le_audio_hw_offload" />

        <ListPreference
            android:key="bluetooth_select_avrcp_version"
            android:title="@string/bluetooth_select_avrcp_version_string"
+25 −2
Original line number Diff line number Diff line
@@ -16,9 +16,12 @@

package com.android.settings.development;

import static com.android.settings.development.BluetoothLeAudioHwOffloadPreferenceController.LE_AUDIO_OFFLOAD_DISABLED_PROPERTY;

import android.content.Context;
import android.os.SystemProperties;

import androidx.annotation.VisibleForTesting;
import androidx.preference.Preference;
import androidx.preference.SwitchPreference;

@@ -34,6 +37,9 @@ public class BluetoothA2dpHwOffloadPreferenceController extends DeveloperOptions
    static final String A2DP_OFFLOAD_DISABLED_PROPERTY = "persist.bluetooth.a2dp_offload.disabled";
    static final String A2DP_OFFLOAD_SUPPORTED_PROPERTY = "ro.bluetooth.a2dp_offload.supported";

    @VisibleForTesting
    boolean mChanged = false;

    public BluetoothA2dpHwOffloadPreferenceController(Context context,
            DevelopmentSettingsDashboardFragment fragment) {
        super(context);
@@ -47,7 +53,8 @@ public class BluetoothA2dpHwOffloadPreferenceController extends DeveloperOptions

    @Override
    public boolean onPreferenceChange(Preference preference, Object newValue) {
        BluetoothA2dpHwOffloadRebootDialog.show(mFragment, this);
        BluetoothHwOffloadRebootDialog.show(mFragment);
        mChanged = true;
        return false;
    }

@@ -85,10 +92,26 @@ public class BluetoothA2dpHwOffloadPreferenceController extends DeveloperOptions
        return offloadSupported ? !offloadDisabled : true;
    }

    public void onA2dpHwDialogConfirmed() {
    /**
     * Called when the HwOffloadDialog confirm is clicked.
     */
    public void onHwOffloadDialogConfirmed() {
        if (!mChanged) {
            return;
        }
        final boolean offloadDisabled =
                SystemProperties.getBoolean(A2DP_OFFLOAD_DISABLED_PROPERTY, false);
        SystemProperties.set(A2DP_OFFLOAD_DISABLED_PROPERTY, Boolean.toString(!offloadDisabled));
        if (offloadDisabled) {
            SystemProperties.set(LE_AUDIO_OFFLOAD_DISABLED_PROPERTY,
                    Boolean.toString(!offloadDisabled));
        }
    }

    /**
     * Called when the HwOffloadDialog cancel is clicked.
     */
    public void onHwOffloadDialogCanceled() {
        mChanged = false;
    }
}
+32 −15
Original line number Diff line number Diff line
@@ -28,17 +28,23 @@ import androidx.fragment.app.FragmentManager;
import com.android.settings.R;
import com.android.settings.core.instrumentation.InstrumentedDialogFragment;

public class BluetoothA2dpHwOffloadRebootDialog extends InstrumentedDialogFragment
/**
 * The a2dp and LE audio offload switch should reboot the device to take effect, the dialog is
 * to ask the user to reboot the device after a2dp or LE audio offload user preference changed
 */
public class BluetoothHwOffloadRebootDialog extends InstrumentedDialogFragment
        implements DialogInterface.OnClickListener {

    public static final String TAG = "BluetoothA2dpHwOffloadReboot";
    public static final String TAG = "BluetoothHwOffloadReboot";

    public static void show(DevelopmentSettingsDashboardFragment host,
            BluetoothA2dpHwOffloadPreferenceController controller) {
    /**
     * The function to show the HwOffloadReboot Dialog.
     */
    public static void show(DevelopmentSettingsDashboardFragment host) {
        final FragmentManager manager = host.getActivity().getSupportFragmentManager();
        if (manager.findFragmentByTag(TAG) == null) {
            final BluetoothA2dpHwOffloadRebootDialog dialog =
                    new BluetoothA2dpHwOffloadRebootDialog();
            final BluetoothHwOffloadRebootDialog dialog =
                    new BluetoothHwOffloadRebootDialog();
            dialog.setTargetFragment(host, 0 /* requestCode */);
            dialog.show(manager, TAG);
        }
@@ -52,33 +58,44 @@ public class BluetoothA2dpHwOffloadRebootDialog extends InstrumentedDialogFragme
    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        return new AlertDialog.Builder(getActivity())
                .setMessage(R.string.bluetooth_disable_a2dp_hw_offload_dialog_message)
                .setTitle(R.string.bluetooth_disable_a2dp_hw_offload_dialog_title)
                .setMessage(R.string.bluetooth_disable_hw_offload_dialog_message)
                .setTitle(R.string.bluetooth_disable_hw_offload_dialog_title)
                .setPositiveButton(
                        R.string.bluetooth_disable_a2dp_hw_offload_dialog_confirm, this)
                        R.string.bluetooth_disable_hw_offload_dialog_confirm, this)
                .setNegativeButton(
                        R.string.bluetooth_disable_a2dp_hw_offload_dialog_cancel, this)
                        R.string.bluetooth_disable_hw_offload_dialog_cancel, this)
                .create();
    }

    @Override
    public void onClick(DialogInterface dialog, int which) {
        final OnA2dpHwDialogConfirmedListener host =
                (OnA2dpHwDialogConfirmedListener) getTargetFragment();
        final OnHwOffloadDialogListener host =
                (OnHwOffloadDialogListener) getTargetFragment();
        if (host == null) {
            return;
        }
        if (which == DialogInterface.BUTTON_POSITIVE) {
            host.onA2dpHwDialogConfirmed();
            host.onHwOffloadDialogConfirmed();
            PowerManager pm = getContext().getSystemService(PowerManager.class);
            pm.reboot(null);
        } else {
            host.onHwOffloadDialogCanceled();
        }
    }

    public interface OnA2dpHwDialogConfirmedListener {
    /**
     * The interface for the HsOffloadDialogListener to provide the action as the
     * confirmed or canceled clicked.
     */
    public interface OnHwOffloadDialogListener {
        /**
         * Called when the user presses reboot on the warning dialog.
         */
        void onA2dpHwDialogConfirmed();
        void onHwOffloadDialogConfirmed();

        /**
         * Called when the user presses cancel on the warning dialog.
         */
        void onHwOffloadDialogCanceled();
    }
}
+127 −0
Original line number Diff line number Diff line
/*
 * Copyright 2022 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.BluetoothA2dpHwOffloadPreferenceController.A2DP_OFFLOAD_SUPPORTED_PROPERTY;

import android.content.Context;
import android.os.SystemProperties;

import androidx.annotation.VisibleForTesting;
import androidx.preference.Preference;
import androidx.preference.SwitchPreference;

import com.android.settings.core.PreferenceControllerMixin;
import com.android.settingslib.development.DeveloperOptionsPreferenceController;

/**
 * Preference controller to control Bluetooth LE audio offload
 */
public class BluetoothLeAudioHwOffloadPreferenceController
        extends DeveloperOptionsPreferenceController
        implements Preference.OnPreferenceChangeListener, PreferenceControllerMixin {

    private static final String PREFERENCE_KEY = "bluetooth_disable_le_audio_hw_offload";
    private final DevelopmentSettingsDashboardFragment mFragment;

    static final String LE_AUDIO_OFFLOAD_DISABLED_PROPERTY =
            "persist.bluetooth.leaudio_offload.disabled";
    static final String LE_AUDIO_OFFLOAD_SUPPORTED_PROPERTY =
            "ro.bluetooth.leaudio_offload.supported";

    @VisibleForTesting
    boolean mChanged = false;

    public BluetoothLeAudioHwOffloadPreferenceController(Context context,
            DevelopmentSettingsDashboardFragment fragment) {
        super(context);
        mFragment = fragment;
    }

    @Override
    public String getPreferenceKey() {
        return PREFERENCE_KEY;
    }

    @Override
    public boolean onPreferenceChange(Preference preference, Object newValue) {
        BluetoothHwOffloadRebootDialog.show(mFragment);
        mChanged = true;
        return false;
    }

    @Override
    public void updateState(Preference preference) {
        final boolean offloadSupported =
                SystemProperties.getBoolean(A2DP_OFFLOAD_SUPPORTED_PROPERTY, false)
                && SystemProperties.getBoolean(LE_AUDIO_OFFLOAD_SUPPORTED_PROPERTY, false);
        if (offloadSupported) {
            final boolean offloadDisabled =
                    SystemProperties.getBoolean(LE_AUDIO_OFFLOAD_DISABLED_PROPERTY, true);
            ((SwitchPreference) mPreference).setChecked(offloadDisabled);
        } else {
            mPreference.setEnabled(false);
            ((SwitchPreference) mPreference).setChecked(true);
        }
    }

    @Override
    protected void onDeveloperOptionsSwitchDisabled() {
        super.onDeveloperOptionsSwitchDisabled();
        final boolean offloadSupported =
                SystemProperties.getBoolean(A2DP_OFFLOAD_SUPPORTED_PROPERTY, false)
                && SystemProperties.getBoolean(LE_AUDIO_OFFLOAD_SUPPORTED_PROPERTY, false);
        if (offloadSupported) {
            ((SwitchPreference) mPreference).setChecked(true);
            SystemProperties.set(LE_AUDIO_OFFLOAD_DISABLED_PROPERTY, "true");
        }
    }

    /**
     * Check if the le audio offload setting is default value.
     */
    public boolean isDefaultValue() {
        final boolean offloadSupported =
                SystemProperties.getBoolean(A2DP_OFFLOAD_SUPPORTED_PROPERTY, false)
                && SystemProperties.getBoolean(LE_AUDIO_OFFLOAD_SUPPORTED_PROPERTY, false);
        final boolean offloadDisabled =
                    SystemProperties.getBoolean(LE_AUDIO_OFFLOAD_DISABLED_PROPERTY, false);
        return offloadSupported ? offloadDisabled : true;
    }

    /**
     * Called when the HwOffloadDialog confirm is clicked.
     */
    public void onHwOffloadDialogConfirmed() {
        if (!mChanged) {
            return;
        }

        final boolean offloadDisabled =
                SystemProperties.getBoolean(LE_AUDIO_OFFLOAD_DISABLED_PROPERTY,
                false);
        SystemProperties.set(LE_AUDIO_OFFLOAD_DISABLED_PROPERTY,
                Boolean.toString(!offloadDisabled));
    }

    /**
     * Called when the HwOffloadDialog cancel is clicked.
     */
    public void onHwOffloadDialogCanceled() {
        mChanged = false;
    }
}
Loading