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

Commit 1082bca0 authored by tim peng's avatar tim peng Committed by Android (Google) Code Review
Browse files

Merge "Add base preference controller for new Bluetooth developer option"

parents 2e092f5f 54d06d36
Loading
Loading
Loading
Loading
+86 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2019 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.bluetooth;

import android.bluetooth.BluetoothA2dp;
import android.content.Context;

import com.android.settings.development.BluetoothA2dpConfigStore;
import com.android.settings.development.BluetoothServiceConnectionListener;
import com.android.settingslib.core.lifecycle.Lifecycle;
import com.android.settingslib.core.lifecycle.LifecycleObserver;
import com.android.settingslib.core.lifecycle.events.OnDestroy;
import com.android.settingslib.development.DeveloperOptionsPreferenceController;

/**
 * Abstract class for Bluetooth A2DP config controller in developer option.
 */
public abstract class AbstractBluetoothPreferenceController extends
        DeveloperOptionsPreferenceController implements BluetoothServiceConnectionListener,
        LifecycleObserver, OnDestroy {

    protected final BluetoothA2dpConfigStore mBluetoothA2dpConfigStore;
    protected volatile BluetoothA2dp mBluetoothA2dp;

    public AbstractBluetoothPreferenceController(Context context, Lifecycle lifecycle,
                                                 BluetoothA2dpConfigStore store) {
        super(context);
        mBluetoothA2dpConfigStore = store;
        if (lifecycle != null) {
            lifecycle.addObserver(this);
        }
    }

    @Override
    public void onBluetoothServiceConnected(BluetoothA2dp bluetoothA2dp) {
        mBluetoothA2dp = bluetoothA2dp;
        updateState(mPreference);
    }

    @Override
    public void onBluetoothCodecUpdated() {
        updateState(mPreference);
    }

    @Override
    public void onBluetoothServiceDisconnected() {
        mBluetoothA2dp = null;
        updateState(mPreference);
    }

    @Override
    public void onDestroy() {
        mBluetoothA2dp = null;
    }

    /**
     * Callback interface for this class to manipulate data from controller.
     */
    public interface Callback {
        /**
         * Callback method to notify preferences when the Bluetooth A2DP config is changed.
         */
        void onBluetoothCodecChanged();

        /**
         * Callback method to notify preferences when the HD audio(optional codec) state is changed.
         *
         * @param enabled Is {@code true} when the setting is enabled.
         */
        void onBluetoothHDAudioEnabled(boolean enabled);
    }
}
+112 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2019 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.bluetooth;

import static com.google.common.truth.Truth.assertThat;

import static org.mockito.Mockito.any;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.verify;

import android.bluetooth.BluetoothA2dp;
import android.content.Context;

import androidx.lifecycle.LifecycleOwner;

import com.android.settings.development.BluetoothA2dpConfigStore;
import com.android.settingslib.core.lifecycle.Lifecycle;

import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.robolectric.RobolectricTestRunner;
import org.robolectric.RuntimeEnvironment;

@RunWith(RobolectricTestRunner.class)
public class AbstractBluetoothPreferenceControllerTest {

    @Mock
    private BluetoothA2dpConfigStore mBluetoothA2dpConfigStore;
    @Mock
    private BluetoothA2dp mBluetoothA2dp;

    private LifecycleOwner mLifecycleOwner;
    private Lifecycle mLifecycle;
    private Context mContext;
    private AbstractBluetoothPreferenceController mController;

    @Before
    public void setup() {
        MockitoAnnotations.initMocks(this);
        mContext = RuntimeEnvironment.application;
        mLifecycleOwner = () -> mLifecycle;
        mLifecycle = new Lifecycle(mLifecycleOwner);
        mController = spy(new AbstractBluetoothPreferenceControllerImpl(mContext, mLifecycle,
                mBluetoothA2dpConfigStore));
    }

    @Test
    public void onBluetoothServiceConnected_checkProfile() {
        assertThat(mController.mBluetoothA2dp).isNull();
        mController.onBluetoothServiceConnected(mBluetoothA2dp);
        assertThat(mController.mBluetoothA2dp).isEqualTo(mBluetoothA2dp);
    }

    @Test
    public void onBluetoothServiceConnected_updateState() {
        mController.onBluetoothServiceConnected(mBluetoothA2dp);
        verify(mController).updateState(any());
    }

    @Test
    public void onBluetoothCodecUpdated_updateState() {
        mController.onBluetoothCodecUpdated();
        verify(mController).updateState(any());
    }

    @Test
    public void onBluetoothServiceDisconnected_clearA2dpProfile() {
        mController.onBluetoothServiceConnected(mBluetoothA2dp);
        assertThat(mController.mBluetoothA2dp).isEqualTo(mBluetoothA2dp);
        mController.onBluetoothServiceDisconnected();
        assertThat(mController.mBluetoothA2dp).isNull();
    }

    @Test
    public void onDestroy_clearA2dpProfile() {
        mController.onBluetoothServiceConnected(mBluetoothA2dp);
        assertThat(mController.mBluetoothA2dp).isEqualTo(mBluetoothA2dp);
        mController.onDestroy();
        assertThat(mController.mBluetoothA2dp).isNull();
    }

    private static class AbstractBluetoothPreferenceControllerImpl extends
            AbstractBluetoothPreferenceController {

        private AbstractBluetoothPreferenceControllerImpl(Context context, Lifecycle lifecycle,
                BluetoothA2dpConfigStore store) {
            super(context, lifecycle, store);
        }

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