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

Commit 80016ad9 authored by Jason Hsu's avatar Jason Hsu Committed by Android (Google) Code Review
Browse files

Merge "Fix pair another dialog doesn't show up after pairing in all bluetooth...

Merge "Fix pair another dialog doesn't show up after pairing in all bluetooth device page." into udc-dev
parents 2a0d6ead c8a53a93
Loading
Loading
Loading
Loading
+3 −3
Original line number Diff line number Diff line
@@ -26,11 +26,11 @@
        android:key="device_control_category"
        android:title="@string/accessibility_found_all_devices">
        <com.android.settingslib.RestrictedPreference
            android:key="add_bt_devices"
            android:key="list_bt_devices"
            android:title="@string/accessibility_list_all_devices_title"
            android:fragment="com.android.settings.bluetooth.BluetoothPairingDetail"
            settings:userRestriction="no_config_bluetooth"
            settings:useAdminDisabledSummary="true" />
            settings:useAdminDisabledSummary="true"
            settings:controller="com.android.settings.accessibility.ViewAllBluetoothDevicesPreferenceController"/>
    </PreferenceCategory>

    <com.android.settings.accessibility.AccessibilityFooterPreference
+7 −0
Original line number Diff line number Diff line
@@ -20,6 +20,7 @@ import android.app.settings.SettingsEnums;
import android.bluetooth.BluetoothDevice;
import android.bluetooth.BluetoothUuid;
import android.bluetooth.le.ScanFilter;
import android.content.Context;

import androidx.annotation.VisibleForTesting;

@@ -47,6 +48,12 @@ public class HearingDevicePairingDetail extends BluetoothDevicePairingDetailBase
        setFilter(Collections.singletonList(filter));
    }

    @Override
    public void onAttach(Context context) {
        super.onAttach(context);
        use(ViewAllBluetoothDevicesPreferenceController.class).init(this);
    }

    @Override
    public void onStart() {
        super.onStart();
+88 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 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.accessibility;

import static android.app.Activity.RESULT_OK;

import android.content.Context;
import android.content.Intent;
import android.preference.PreferenceManager;
import android.text.TextUtils;

import androidx.preference.Preference;

import com.android.settings.bluetooth.BluetoothPairingDetail;
import com.android.settings.core.BasePreferenceController;
import com.android.settings.core.SubSettingLauncher;
import com.android.settings.dashboard.DashboardFragment;

import androidx.annotation.VisibleForTesting;

/** Preference controller for all bluetooth device preference. */
public class ViewAllBluetoothDevicesPreferenceController extends BasePreferenceController implements
        PreferenceManager.OnActivityResultListener {

    private static final int REQUEST_CODE_BONDED_DEVICE = 270;
    private DashboardFragment mFragment;

    public ViewAllBluetoothDevicesPreferenceController(Context context, String preferenceKey) {
        super(context, preferenceKey);
    }

    /**
     * Initializes objects in this controller. Needs to call this before using the controller.
     *
     * @param fragment The {@link DashboardFragment} uses the controller
     */
    public void init(DashboardFragment fragment) {
        mFragment = fragment;
    }

    @Override
    public int getAvailabilityStatus() {
        return AVAILABLE;
    }

    @Override
    public boolean handlePreferenceTreeClick(Preference preference) {
        if (TextUtils.equals(preference.getKey(), getPreferenceKey())) {
            launchBluetoothPairingDetail();
            return true;
        }

        return false;
    }

    @Override
    public boolean onActivityResult(int requestCode, int resultCode, Intent data) {
        // If back from BONDED device page, then no need to show scan result again.
        // Finish the fragment.
        if (requestCode == REQUEST_CODE_BONDED_DEVICE && resultCode == RESULT_OK) {
            mFragment.finish();
        }
        return false;
    }

    @VisibleForTesting
    void launchBluetoothPairingDetail() {
        new SubSettingLauncher(mContext)
                .setDestination(BluetoothPairingDetail.class.getName())
                .setSourceMetricsCategory(mFragment.getMetricsCategory())
                .setResultListener(mFragment, REQUEST_CODE_BONDED_DEVICE)
                .launch();
    }
}
+3 −0
Original line number Diff line number Diff line
@@ -16,6 +16,7 @@

package com.android.settings.bluetooth;

import static android.app.Activity.RESULT_OK;
import static android.os.UserManager.DISALLOW_CONFIG_BLUETOOTH;

import android.bluetooth.BluetoothAdapter;
@@ -93,6 +94,7 @@ public abstract class BluetoothDevicePairingDetailBase extends DeviceListPrefere
    public void onDeviceBondStateChanged(CachedBluetoothDevice cachedDevice, int bondState) {
        if (bondState == BluetoothDevice.BOND_BONDED) {
            // If one device is connected(bonded), then close this fragment.
            setResult(RESULT_OK);
            finish();
            return;
        } else if (bondState == BluetoothDevice.BOND_BONDING) {
@@ -124,6 +126,7 @@ public abstract class BluetoothDevicePairingDetailBase extends DeviceListPrefere
        if (cachedDevice != null && cachedDevice.isConnected()) {
            final BluetoothDevice device = cachedDevice.getDevice();
            if (device != null && mSelectedList.contains(device)) {
                setResult(RESULT_OK);
                finish();
            } else if (mDevicePreferenceMap.containsKey(cachedDevice)) {
                onDeviceDeleted(cachedDevice);
+82 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 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.accessibility;

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

import static org.mockito.Mockito.doNothing;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;

import android.content.Context;

import androidx.fragment.app.FragmentActivity;
import androidx.preference.Preference;
import androidx.preference.PreferenceScreen;
import androidx.test.core.app.ApplicationProvider;

import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.Spy;
import org.mockito.junit.MockitoJUnit;
import org.mockito.junit.MockitoRule;
import org.robolectric.Robolectric;
import org.robolectric.RobolectricTestRunner;

/** Tests for {@link ViewAllBluetoothDevicesPreferenceController}. */
@RunWith(RobolectricTestRunner.class)
public class ViewAllBluetoothDevicesPreferenceControllerTest {

    @Rule
    public MockitoRule mocks = MockitoJUnit.rule();
    private final Context mContext = ApplicationProvider.getApplicationContext();
    private final Preference mPreference = new Preference(mContext);
    private final String TEST_KEY = "test_key";

    @Spy
    private HearingDevicePairingDetail mFragment = new HearingDevicePairingDetail();
    private FragmentActivity mActivity;
    @Mock
    private PreferenceScreen mScreen;
    private ViewAllBluetoothDevicesPreferenceController mController;

    @Before
    public void setUp() {
        mActivity = Robolectric.setupActivity(FragmentActivity.class);
        when(mFragment.getContext()).thenReturn(mContext);
        when(mFragment.getActivity()).thenReturn(mActivity);

        mController = spy(new ViewAllBluetoothDevicesPreferenceController(mActivity, TEST_KEY));
        mController.init(mFragment);
        mController.displayPreference(mScreen);
    }

    @Test
    public void handlePreferenceTreeClick_expectedPreference_launchBluetoothPairingDetail() {
        doNothing().when(mController).launchBluetoothPairingDetail();
        mPreference.setKey(TEST_KEY);

        boolean status = mController.handlePreferenceTreeClick(mPreference);

        verify(mController).launchBluetoothPairingDetail();
        assertThat(status).isTrue();
    }
}