Loading res/xml/hearing_device_pairing_detail.xml +3 −3 Original line number Diff line number Diff line Loading @@ -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 Loading src/com/android/settings/accessibility/HearingDevicePairingDetail.java +7 −0 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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(); Loading src/com/android/settings/accessibility/ViewAllBluetoothDevicesPreferenceController.java 0 → 100644 +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(); } } src/com/android/settings/bluetooth/BluetoothDevicePairingDetailBase.java +3 −0 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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) { Loading Loading @@ -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); Loading tests/robotests/src/com/android/settings/accessibility/ViewAllBluetoothDevicesPreferenceControllerTest.java 0 → 100644 +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(); } } Loading
res/xml/hearing_device_pairing_detail.xml +3 −3 Original line number Diff line number Diff line Loading @@ -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 Loading
src/com/android/settings/accessibility/HearingDevicePairingDetail.java +7 −0 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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(); Loading
src/com/android/settings/accessibility/ViewAllBluetoothDevicesPreferenceController.java 0 → 100644 +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(); } }
src/com/android/settings/bluetooth/BluetoothDevicePairingDetailBase.java +3 −0 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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) { Loading Loading @@ -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); Loading
tests/robotests/src/com/android/settings/accessibility/ViewAllBluetoothDevicesPreferenceControllerTest.java 0 → 100644 +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(); } }