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

Commit 0ef326f3 authored by jeffreyhuang's avatar jeffreyhuang
Browse files

Introduce BluetoothAudioCodecPreferenceController

 - Create new BluetoothAudioCodecPreferenceController
 - Create controller inside the DashboardFragment
 - Port logic from DevelopmentSettings into the controller

Bug: 34203528
Test: make RunSettingsRoboTests -j40
Change-Id: I90a0e58328196315fccbecd6d46531b4f0fcaef1
parent 32b0f1d4
Loading
Loading
Loading
Loading
+5 −21
Original line number Diff line number Diff line
@@ -40,17 +40,15 @@ public abstract class AbstractBluetoothA2dpPreferenceController extends
    static final int STREAMING_LABEL_ID = R.string.bluetooth_select_a2dp_codec_streaming_label;

    protected final BluetoothA2dpConfigStore mBluetoothA2dpConfigStore;
    protected final Object mBluetoothA2dpLock;
    protected BluetoothA2dp mBluetoothA2dp;
    protected ListPreference mPreference;
    private final String[] mListValues;
    private final String[] mListSummaries;
    private ListPreference mPreference;

    public AbstractBluetoothA2dpPreferenceController(Context context, Lifecycle lifecycle,
            Object bluetoothA2dpLock, BluetoothA2dpConfigStore store) {
            BluetoothA2dpConfigStore store) {
        super(context);

        mBluetoothA2dpLock = bluetoothA2dpLock;
        mBluetoothA2dpConfigStore = store;
        mListValues = getListValues();
        mListSummaries = getListSummaries();
@@ -80,7 +78,7 @@ public abstract class AbstractBluetoothA2dpPreferenceController extends
        writeConfigurationValues(newValue);

        final BluetoothCodecConfig codecConfig = mBluetoothA2dpConfigStore.createCodecConfig();
        synchronized (mBluetoothA2dpLock) {
        synchronized (mBluetoothA2dpConfigStore) {
            if (mBluetoothA2dp != null) {
                setCodecConfigPreference(codecConfig);
            }
@@ -106,7 +104,7 @@ public abstract class AbstractBluetoothA2dpPreferenceController extends
        }

        BluetoothCodecConfig codecConfig;
        synchronized (mBluetoothA2dpLock) {
        synchronized (mBluetoothA2dpConfigStore) {
            codecConfig = getCodecConfig();
        }

@@ -168,7 +166,7 @@ public abstract class AbstractBluetoothA2dpPreferenceController extends
    protected abstract String[] getListSummaries();

    /**
     * Updates the new value to the {@link BluetoothA2dpConfigStore}.
     * Updates the new value to the {@link BluetoothA2dpConfigStore} and the {@link BluetoothA2dp}.
     *
     * @param newValue the new setting value
     */
@@ -197,18 +195,4 @@ public abstract class AbstractBluetoothA2dpPreferenceController extends

        return mBluetoothA2dp.getCodecStatus().getCodecConfig();
    }

    @VisibleForTesting
    BluetoothCodecConfig createCodecConfig(int codecTypeValue, int codecPriorityValue,
            int sampleRateValue, int bitsPerSampleValue,
            int channelModeValue, long codecSpecific1Value,
            long codecSpecific2Value, long codecSpecific3Value,
            long codecSpecific4Value) {
        return new BluetoothCodecConfig(codecTypeValue, codecPriorityValue,
                sampleRateValue, bitsPerSampleValue,
                channelModeValue, codecSpecific1Value,
                codecSpecific2Value, codecSpecific3Value,
                codecSpecific4Value);
    }

}
+25 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2017 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.BluetoothA2dp;

/**
 * Utility class to provide synchronization locks for {@link BluetoothA2dp}
 */
public class BluetoothA2dpLock {
}
+156 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2017 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.BluetoothCodecConfig;
import android.content.Context;

import com.android.settings.R;
import com.android.settingslib.core.lifecycle.Lifecycle;

public class BluetoothAudioCodecPreferenceController extends
        AbstractBluetoothA2dpPreferenceController {

    private static final int DEFAULT_INDEX = 0;
    private static final String BLUETOOTH_SELECT_A2DP_CODEC_KEY = "bluetooth_select_a2dp_codec";

    public BluetoothAudioCodecPreferenceController(Context context, Lifecycle lifecycle,
            BluetoothA2dpConfigStore store) {
        super(context, lifecycle, store);
    }

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

    @Override
    protected String[] getListValues() {
        return mContext.getResources().getStringArray(
                R.array.bluetooth_a2dp_codec_values);
    }

    @Override
    protected String[] getListSummaries() {
        return mContext.getResources().getStringArray(
                R.array.bluetooth_a2dp_codec_summaries);
    }

    @Override
    protected int getDefaultIndex() {
        return DEFAULT_INDEX;
    }

    @Override
    protected void writeConfigurationValues(Object newValue) {
        final int index = mPreference.findIndexOfValue(newValue.toString());
        int codecTypeValue = BluetoothCodecConfig.SAMPLE_RATE_NONE; // default
        int codecPriorityValue = BluetoothCodecConfig.CODEC_PRIORITY_DEFAULT;
        switch (index) {
            case 0:
                // Reset the priority of the current codec to default
                final String oldValue = mPreference.getValue();
                switch (mPreference.findIndexOfValue(oldValue)) {
                    case 0:
                        break;      // No current codec
                    case 1:
                        codecTypeValue = BluetoothCodecConfig.SOURCE_CODEC_TYPE_SBC;
                        break;
                    case 2:
                        codecTypeValue = BluetoothCodecConfig.SOURCE_CODEC_TYPE_AAC;
                        break;
                    case 3:
                        codecTypeValue = BluetoothCodecConfig.SOURCE_CODEC_TYPE_APTX;
                        break;
                    case 4:
                        codecTypeValue = BluetoothCodecConfig.SOURCE_CODEC_TYPE_APTX_HD;
                        break;
                    case 5:
                        codecTypeValue = BluetoothCodecConfig.SOURCE_CODEC_TYPE_LDAC;
                        break;
                    default:
                        break;
                }
                break;
            case 1:
                codecTypeValue = BluetoothCodecConfig.SOURCE_CODEC_TYPE_SBC;
                codecPriorityValue = BluetoothCodecConfig.CODEC_PRIORITY_HIGHEST;
                break;
            case 2:
                codecTypeValue = BluetoothCodecConfig.SOURCE_CODEC_TYPE_AAC;
                codecPriorityValue = BluetoothCodecConfig.CODEC_PRIORITY_HIGHEST;
                break;
            case 3:
                codecTypeValue = BluetoothCodecConfig.SOURCE_CODEC_TYPE_APTX;
                codecPriorityValue = BluetoothCodecConfig.CODEC_PRIORITY_HIGHEST;
                break;
            case 4:
                codecTypeValue = BluetoothCodecConfig.SOURCE_CODEC_TYPE_APTX_HD;
                codecPriorityValue = BluetoothCodecConfig.CODEC_PRIORITY_HIGHEST;
                break;
            case 5:
                codecTypeValue = BluetoothCodecConfig.SOURCE_CODEC_TYPE_LDAC;
                codecPriorityValue = BluetoothCodecConfig.CODEC_PRIORITY_HIGHEST;
                break;
            case 6:
                synchronized (mBluetoothA2dpConfigStore) {
                    if (mBluetoothA2dp != null) {
                        mBluetoothA2dp.enableOptionalCodecs();
                    }
                }
                return;
            case 7:
                synchronized (mBluetoothA2dpConfigStore) {
                    if (mBluetoothA2dp != null) {
                        mBluetoothA2dp.disableOptionalCodecs();
                    }
                }
                return;
            default:
                break;
        }
        mBluetoothA2dpConfigStore.setCodecType(codecTypeValue);
        mBluetoothA2dpConfigStore.setCodecPriority(codecPriorityValue);
    }

    @Override
    protected int getCurrentA2dpSettingIndex(BluetoothCodecConfig config) {
        final int codecType = config.getCodecType();
        int index = DEFAULT_INDEX;
        switch (codecType) {
            case BluetoothCodecConfig.SOURCE_CODEC_TYPE_SBC:
                index = 1;
                break;
            case BluetoothCodecConfig.SOURCE_CODEC_TYPE_AAC:
                index = 2;
                break;
            case BluetoothCodecConfig.SOURCE_CODEC_TYPE_APTX:
                index = 3;
                break;
            case BluetoothCodecConfig.SOURCE_CODEC_TYPE_APTX_HD:
                index = 4;
                break;
            case BluetoothCodecConfig.SOURCE_CODEC_TYPE_LDAC:
                index = 5;
                break;
            case BluetoothCodecConfig.SOURCE_CODEC_TYPE_INVALID:
            default:
                break;
        }
        return index;
    }
}
+2 −13
Original line number Diff line number Diff line
@@ -18,8 +18,6 @@ package com.android.settings.development;

import android.bluetooth.BluetoothCodecConfig;
import android.content.Context;
import android.support.v7.preference.ListPreference;
import android.support.v7.preference.PreferenceScreen;

import com.android.settings.R;
import com.android.settingslib.core.lifecycle.Lifecycle;
@@ -31,11 +29,9 @@ public class BluetoothAudioSampleRatePreferenceController extends
    private static final String BLUETOOTH_SELECT_A2DP_SAMPLE_RATE_KEY =
            "bluetooth_select_a2dp_sample_rate";

    private ListPreference mPreference;

    public BluetoothAudioSampleRatePreferenceController(Context context, Lifecycle lifecycle,
            Object bluetoothA2dpLock, BluetoothA2dpConfigStore store) {
        super(context, lifecycle, bluetoothA2dpLock, store);
            BluetoothA2dpConfigStore store) {
        super(context, lifecycle, store);
    }

    @Override
@@ -43,13 +39,6 @@ public class BluetoothAudioSampleRatePreferenceController extends
        return BLUETOOTH_SELECT_A2DP_SAMPLE_RATE_KEY;
    }

    @Override
    public void displayPreference(PreferenceScreen screen) {
        super.displayPreference(screen);

        mPreference = (ListPreference) screen.findPreference(getPreferenceKey());
    }

    @Override
    protected String[] getListValues() {
        return mContext.getResources().getStringArray(
+10 −9
Original line number Diff line number Diff line
@@ -60,7 +60,8 @@ public class DevelopmentSettingsDashboardFragment extends RestrictedDashboardFra

    private static final String TAG = "DevSettingsDashboard";

    private final Object mBluetoothA2dpLock = new Object();
    private final BluetoothA2dpConfigStore mBluetoothA2dpConfigStore =
            new BluetoothA2dpConfigStore();

    private boolean mIsAvailable = true;
    private SwitchBar mSwitchBar;
@@ -104,7 +105,7 @@ public class DevelopmentSettingsDashboardFragment extends RestrictedDashboardFra
                @Override
                public void onServiceConnected(int profile,
                        BluetoothProfile proxy) {
                    synchronized (mBluetoothA2dpLock) {
                    synchronized (mBluetoothA2dpConfigStore) {
                        mBluetoothA2dp = (BluetoothA2dp) proxy;
                    }
                    for (AbstractPreferenceController controller : mPreferenceControllers) {
@@ -117,7 +118,7 @@ public class DevelopmentSettingsDashboardFragment extends RestrictedDashboardFra

                @Override
                public void onServiceDisconnected(int profile) {
                    synchronized (mBluetoothA2dpLock) {
                    synchronized (mBluetoothA2dpConfigStore) {
                        mBluetoothA2dp = null;
                    }
                    for (AbstractPreferenceController controller : mPreferenceControllers) {
@@ -298,7 +299,7 @@ public class DevelopmentSettingsDashboardFragment extends RestrictedDashboardFra
    @Override
    protected List<AbstractPreferenceController> getPreferenceControllers(Context context) {
        mPreferenceControllers = buildPreferenceControllers(context, getActivity(), getLifecycle(),
                this /* devOptionsDashboardFragment */, mBluetoothA2dpLock,
                this /* devOptionsDashboardFragment */,
                new BluetoothA2dpConfigStore());
        return mPreferenceControllers;
    }
@@ -334,7 +335,7 @@ public class DevelopmentSettingsDashboardFragment extends RestrictedDashboardFra

    private static List<AbstractPreferenceController> buildPreferenceControllers(Context context,
            Activity activity, Lifecycle lifecycle, DevelopmentSettingsDashboardFragment fragment,
            Object bluetoothA2dpLock, BluetoothA2dpConfigStore bluetoothA2dpConfigStore) {
            BluetoothA2dpConfigStore bluetoothA2dpConfigStore) {
        final List<AbstractPreferenceController> controllers = new ArrayList<>();
        controllers.add(new BugReportPreferenceControllerV2(context));
        controllers.add(new LocalBackupPasswordPreferenceController(context));
@@ -376,10 +377,10 @@ public class DevelopmentSettingsDashboardFragment extends RestrictedDashboardFra
        controllers.add(new BluetoothAbsoluteVolumePreferenceController(context));
        controllers.add(new BluetoothInbandRingingPreferenceController(context));
        controllers.add(new BluetoothAvrcpVersionPreferenceController(context));
        //controllers.add(new BluetoothAudioCodecPreferenceController(context, lifecycle,
        //        bluetoothA2dpLock, bluetoothA2dpConfigStore));
        controllers.add(new BluetoothAudioCodecPreferenceController(context, lifecycle,
                bluetoothA2dpConfigStore));
        controllers.add(new BluetoothAudioSampleRatePreferenceController(context, lifecycle,
                bluetoothA2dpLock, bluetoothA2dpConfigStore));
                bluetoothA2dpConfigStore));
        // bluetooth audio bits per sample
        // bluetooth audio channel mode
        // bluetooth audio ldac codec: playback quality
@@ -447,7 +448,7 @@ public class DevelopmentSettingsDashboardFragment extends RestrictedDashboardFra
                        context) {
                    return buildPreferenceControllers(context, null /* activity */,
                            null /* lifecycle */, null /* devOptionsDashboardFragment */,
                            null /* bluetoothA2dpLock */, null /* bluetoothA2dpConfigStore */);
                            null /* bluetoothA2dpConfigStore */);
                }
            };
}
Loading