From 6e78a34d9c348a0e06c2a2e8111af77f7ca986bb Mon Sep 17 00:00:00 2001 From: Angela Wang Date: Fri, 23 Feb 2024 12:11:27 +0000 Subject: [PATCH] Replaces HearingDevicePairingDetail with HearingDevicePairingFragment The new pairing page includes new UI for "See more devices" buttton and can show MFi + ASHA devices in the pairing list while these devices only advertise MFi HAS uuid in pairing mode. As allowed by "Flag Cleanup Policy", this change finishes the rollout of trunkfood flag new_hearing_device_pairing_page by defaulting to the "true" state. Bug: 307473972 Test: atest HearingAidPairingDialogFragmentTest Test: atest AddDevicePreferenceControllerTest Change-Id: I6c3377d535139d62791548557c581317d1878e9d --- res/xml/accessibility_hearing_aids.xml | 1 + .../AccessibilityHearingAidsFragment.java | 1 - .../HearingDevicePairingDetail.java | 96 --------------- .../HearingAidPairingDialogFragment.java | 7 +- .../AddDevicePreferenceController.java | 22 ---- .../HearingAidPairingDialogFragmentTest.java | 25 +--- .../HearingDevicePairingDetailTest.java | 115 ------------------ ...etoothDevicesPreferenceControllerTest.java | 2 +- .../AddDevicePreferenceControllerTest.java | 46 ------- 9 files changed, 4 insertions(+), 311 deletions(-) delete mode 100644 src/com/android/settings/accessibility/HearingDevicePairingDetail.java delete mode 100644 tests/robotests/src/com/android/settings/accessibility/HearingDevicePairingDetailTest.java diff --git a/res/xml/accessibility_hearing_aids.xml b/res/xml/accessibility_hearing_aids.xml index 57a0fe27819..9c6e661235a 100644 --- a/res/xml/accessibility_hearing_aids.xml +++ b/res/xml/accessibility_hearing_aids.xml @@ -32,6 +32,7 @@ android:title="@string/bluetooth_pairing_pref_title" android:icon="@drawable/ic_add_24dp" android:summary="@string/connected_device_add_device_summary" + android:fragment="com.android.settings.accessibility.HearingDevicePairingFragment" settings:userRestriction="no_config_bluetooth" settings:useAdminDisabledSummary="true" settings:controller="com.android.settings.connecteddevice.AddDevicePreferenceController"/> diff --git a/src/com/android/settings/accessibility/AccessibilityHearingAidsFragment.java b/src/com/android/settings/accessibility/AccessibilityHearingAidsFragment.java index 80a03c6ec2b..cad21868e06 100644 --- a/src/com/android/settings/accessibility/AccessibilityHearingAidsFragment.java +++ b/src/com/android/settings/accessibility/AccessibilityHearingAidsFragment.java @@ -38,7 +38,6 @@ import com.android.settingslib.search.SearchIndexable; public class AccessibilityHearingAidsFragment extends AccessibilityShortcutPreferenceFragment { private static final String TAG = "AccessibilityHearingAidsFragment"; private static final String KEY_HEARING_OPTIONS_CATEGORY = "hearing_options_category"; - public static final String KEY_HEARING_DEVICE_ADD_BT_DEVICES = "hearing_device_add_bt_devices"; private static final int SHORTCUT_PREFERENCE_IN_CATEGORY_INDEX = 20; private String mFeatureName; diff --git a/src/com/android/settings/accessibility/HearingDevicePairingDetail.java b/src/com/android/settings/accessibility/HearingDevicePairingDetail.java deleted file mode 100644 index 117a8ed131b..00000000000 --- a/src/com/android/settings/accessibility/HearingDevicePairingDetail.java +++ /dev/null @@ -1,96 +0,0 @@ -/* - * 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 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; - -import com.android.settings.R; -import com.android.settings.bluetooth.BluetoothDevicePairingDetailBase; -import com.android.settingslib.bluetooth.CachedBluetoothDevice; - -import java.util.ArrayList; -import java.util.List; - -/** - * HearingDevicePairingDetail is a page to scan hearing devices. This page shows scanning icons and - * pairing them. - */ -public class HearingDevicePairingDetail extends BluetoothDevicePairingDetailBase { - - private static final String TAG = "HearingDevicePairingDetail"; - @VisibleForTesting - static final String KEY_AVAILABLE_HEARING_DEVICES = "available_hearing_devices"; - - public HearingDevicePairingDetail() { - super(); - final List filterList = new ArrayList<>(); - // Filters for ASHA hearing aids - filterList.add(new ScanFilter.Builder().setServiceUuid(BluetoothUuid.HEARING_AID).build()); - filterList.add(new ScanFilter.Builder() - .setServiceData(BluetoothUuid.HEARING_AID, new byte[0]).build()); - // Filters for LE audio hearing aids - filterList.add(new ScanFilter.Builder().setServiceUuid(BluetoothUuid.HAS).build()); - filterList.add(new ScanFilter.Builder() - .setServiceData(BluetoothUuid.HAS, new byte[0]).build()); - setFilter(filterList); - } - - @Override - public void onAttach(Context context) { - super.onAttach(context); - use(ViewAllBluetoothDevicesPreferenceController.class).init(this); - } - - @Override - public void onStart() { - super.onStart(); - mAvailableDevicesCategory.setProgress(mBluetoothAdapter.isEnabled()); - } - - @Override - public void onDeviceBondStateChanged(CachedBluetoothDevice cachedDevice, int bondState) { - super.onDeviceBondStateChanged(cachedDevice, bondState); - - mAvailableDevicesCategory.setProgress(bondState == BluetoothDevice.BOND_NONE); - } - - @Override - public int getMetricsCategory() { - return SettingsEnums.HEARING_AID_PAIRING; - } - - @Override - protected int getPreferenceScreenResId() { - return R.xml.hearing_device_pairing_detail; - } - - @Override - protected String getLogTag() { - return TAG; - } - - @Override - public String getDeviceListKey() { - return KEY_AVAILABLE_HEARING_DEVICES; - } -} diff --git a/src/com/android/settings/bluetooth/HearingAidPairingDialogFragment.java b/src/com/android/settings/bluetooth/HearingAidPairingDialogFragment.java index 3a16e3e3ebb..73c7d73e856 100644 --- a/src/com/android/settings/bluetooth/HearingAidPairingDialogFragment.java +++ b/src/com/android/settings/bluetooth/HearingAidPairingDialogFragment.java @@ -28,11 +28,9 @@ import androidx.annotation.Nullable; import androidx.appcompat.app.AlertDialog; import com.android.settings.R; -import com.android.settings.accessibility.HearingDevicePairingDetail; import com.android.settings.accessibility.HearingDevicePairingFragment; import com.android.settings.core.SubSettingLauncher; import com.android.settings.core.instrumentation.InstrumentedDialogFragment; -import com.android.settings.flags.Flags; import com.android.settingslib.bluetooth.CachedBluetoothDevice; import com.android.settingslib.bluetooth.HearingAidInfo; import com.android.settingslib.bluetooth.LocalBluetoothManager; @@ -125,11 +123,8 @@ public class HearingAidPairingDialogFragment extends InstrumentedDialogFragment final int launchPage = getArguments().getInt(KEY_LAUNCH_PAGE); final boolean launchFromA11y = (launchPage == SettingsEnums.ACCESSIBILITY) || (launchPage == SettingsEnums.ACCESSIBILITY_HEARING_AID_SETTINGS); - final String a11yDestination = Flags.newHearingDevicePairingPage() - ? HearingDevicePairingFragment.class.getName() - : HearingDevicePairingDetail.class.getName(); final String destination = launchFromA11y - ? a11yDestination + ? HearingDevicePairingFragment.class.getName() : BluetoothPairingDetail.class.getName(); new SubSettingLauncher(getActivity()) .setDestination(destination) diff --git a/src/com/android/settings/connecteddevice/AddDevicePreferenceController.java b/src/com/android/settings/connecteddevice/AddDevicePreferenceController.java index ef448438bbb..d2bc319ce95 100644 --- a/src/com/android/settings/connecteddevice/AddDevicePreferenceController.java +++ b/src/com/android/settings/connecteddevice/AddDevicePreferenceController.java @@ -15,25 +15,18 @@ */ package com.android.settings.connecteddevice; -import static com.android.settings.accessibility.AccessibilityHearingAidsFragment.KEY_HEARING_DEVICE_ADD_BT_DEVICES; - import android.bluetooth.BluetoothAdapter; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.content.pm.PackageManager; -import android.text.TextUtils; import androidx.preference.Preference; import androidx.preference.PreferenceScreen; import com.android.settings.R; -import com.android.settings.accessibility.HearingDevicePairingDetail; -import com.android.settings.accessibility.HearingDevicePairingFragment; import com.android.settings.core.BasePreferenceController; -import com.android.settings.core.SubSettingLauncher; -import com.android.settings.flags.Flags; import com.android.settingslib.core.lifecycle.LifecycleObserver; import com.android.settingslib.core.lifecycle.events.OnStart; import com.android.settingslib.core.lifecycle.events.OnStop; @@ -82,21 +75,6 @@ public class AddDevicePreferenceController extends BasePreferenceController } } - @Override - public boolean handlePreferenceTreeClick(Preference preference) { - if (TextUtils.equals(preference.getKey(), KEY_HEARING_DEVICE_ADD_BT_DEVICES)) { - String destination = Flags.newHearingDevicePairingPage() - ? HearingDevicePairingFragment.class.getName() - : HearingDevicePairingDetail.class.getName(); - new SubSettingLauncher(preference.getContext()) - .setDestination(destination) - .setSourceMetricsCategory(getMetricsCategory()) - .launch(); - return true; - } - return super.handlePreferenceTreeClick(preference); - } - @Override public int getAvailabilityStatus() { return mContext.getPackageManager().hasSystemFeature(PackageManager.FEATURE_BLUETOOTH) diff --git a/tests/robotests/src/com/android/settings/accessibility/HearingAidPairingDialogFragmentTest.java b/tests/robotests/src/com/android/settings/accessibility/HearingAidPairingDialogFragmentTest.java index bd57e9d6ad7..d082b1fe58c 100644 --- a/tests/robotests/src/com/android/settings/accessibility/HearingAidPairingDialogFragmentTest.java +++ b/tests/robotests/src/com/android/settings/accessibility/HearingAidPairingDialogFragmentTest.java @@ -32,10 +32,6 @@ import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.os.Bundle; -import android.platform.test.annotations.RequiresFlagsDisabled; -import android.platform.test.annotations.RequiresFlagsEnabled; -import android.platform.test.flag.junit.CheckFlagsRule; -import android.platform.test.flag.junit.DeviceFlagsValueProvider; import androidx.appcompat.app.AlertDialog; import androidx.fragment.app.FragmentActivity; @@ -47,7 +43,6 @@ import com.android.settings.SettingsActivity; import com.android.settings.bluetooth.BluetoothPairingDetail; import com.android.settings.bluetooth.HearingAidPairingDialogFragment; import com.android.settings.bluetooth.Utils; -import com.android.settings.flags.Flags; import com.android.settings.testutils.shadow.ShadowBluetoothAdapter; import com.android.settings.testutils.shadow.ShadowBluetoothUtils; import com.android.settingslib.bluetooth.CachedBluetoothDevice; @@ -82,9 +77,6 @@ public class HearingAidPairingDialogFragmentTest { @Rule public final MockitoRule mockito = MockitoJUnit.rule(); - @Rule - public final CheckFlagsRule mCheckFlagsRule = DeviceFlagsValueProvider.createCheckFlagsRule(); - private static final String TEST_DEVICE_ADDRESS = "00:A1:A1:A1:A1:A1"; private static final int TEST_LAUNCH_PAGE = SettingsEnums.SETTINGS_CONNECTED_DEVICE_CATEGORY; @@ -137,8 +129,7 @@ public class HearingAidPairingDialogFragmentTest { } @Test - @RequiresFlagsEnabled(Flags.FLAG_NEW_HEARING_DEVICE_PAIRING_PAGE) - public void dialogPositiveButtonClick_intentToNewA11yPairingPage() { + public void dialogPositiveButtonClick_intentToA11yPairingPage() { setupDialog(SettingsEnums.ACCESSIBILITY); final AlertDialog dialog = (AlertDialog) mFragment.onCreateDialog(Bundle.EMPTY); dialog.show(); @@ -150,20 +141,6 @@ public class HearingAidPairingDialogFragmentTest { .isEqualTo(HearingDevicePairingFragment.class.getName()); } - @Test - @RequiresFlagsDisabled(Flags.FLAG_NEW_HEARING_DEVICE_PAIRING_PAGE) - public void dialogPositiveButtonClick_intentToOldA11yPairingPage() { - setupDialog(SettingsEnums.ACCESSIBILITY); - final AlertDialog dialog = (AlertDialog) mFragment.onCreateDialog(Bundle.EMPTY); - dialog.show(); - - dialog.getButton(DialogInterface.BUTTON_POSITIVE).performClick(); - - final Intent intent = shadowOf(mActivity).getNextStartedActivity(); - assertThat(intent.getStringExtra(SettingsActivity.EXTRA_SHOW_FRAGMENT)) - .isEqualTo(HearingDevicePairingDetail.class.getName()); - } - @Test public void dialogNegativeButtonClick_dismissDialog() { final AlertDialog dialog = (AlertDialog) mFragment.onCreateDialog(Bundle.EMPTY); diff --git a/tests/robotests/src/com/android/settings/accessibility/HearingDevicePairingDetailTest.java b/tests/robotests/src/com/android/settings/accessibility/HearingDevicePairingDetailTest.java deleted file mode 100644 index e1651d9d4ed..00000000000 --- a/tests/robotests/src/com/android/settings/accessibility/HearingDevicePairingDetailTest.java +++ /dev/null @@ -1,115 +0,0 @@ -/* - * 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.spy; -import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.when; - -import android.bluetooth.BluetoothAdapter; -import android.bluetooth.BluetoothDevice; -import android.content.Context; - -import androidx.test.core.app.ApplicationProvider; - -import com.android.settings.bluetooth.BluetoothProgressCategory; -import com.android.settings.testutils.shadow.ShadowBluetoothAdapter; -import com.android.settingslib.bluetooth.CachedBluetoothDevice; - -import org.junit.Before; -import org.junit.Rule; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.mockito.Mock; -import org.mockito.junit.MockitoJUnit; -import org.mockito.junit.MockitoRule; -import org.robolectric.RobolectricTestRunner; -import org.robolectric.annotation.Config; -import org.robolectric.shadow.api.Shadow; - -/** Tests for {@link HearingDevicePairingDetail}. */ -@RunWith(RobolectricTestRunner.class) -@Config(shadows = {ShadowBluetoothAdapter.class}) -public class HearingDevicePairingDetailTest { - - @Rule - public final MockitoRule mockito = MockitoJUnit.rule(); - - private final Context mContext = ApplicationProvider.getApplicationContext(); - - @Mock - private CachedBluetoothDevice mCachedBluetoothDevice; - private BluetoothProgressCategory mProgressCategory; - private TestHearingDevicePairingDetail mFragment; - - @Before - public void setUp() { - final BluetoothAdapter bluetoothAdapter = spy(BluetoothAdapter.getDefaultAdapter()); - final ShadowBluetoothAdapter shadowBluetoothAdapter = Shadow.extract( - BluetoothAdapter.getDefaultAdapter()); - shadowBluetoothAdapter.setEnabled(true); - - mProgressCategory = spy(new BluetoothProgressCategory(mContext)); - mFragment = spy(new TestHearingDevicePairingDetail()); - when(mFragment.getContext()).thenReturn(mContext); - when(mFragment.findPreference( - HearingDevicePairingDetail.KEY_AVAILABLE_HEARING_DEVICES)).thenReturn( - mProgressCategory); - mFragment.setBluetoothAdapter(bluetoothAdapter); - - } - - @Test - public void getDeviceListKey_expectedKey() { - assertThat(mFragment.getDeviceListKey()).isEqualTo( - HearingDevicePairingDetail.KEY_AVAILABLE_HEARING_DEVICES); - } - - @Test - public void onDeviceBondStateChanged_bondNone_setProgressFalse() { - mFragment.initPreferencesFromPreferenceScreen(); - - mFragment.onDeviceBondStateChanged(mCachedBluetoothDevice, BluetoothDevice.BOND_NONE); - - verify(mProgressCategory).setProgress(true); - } - - @Test - public void onDeviceBondStateChanged_bonding_setProgressTrue() { - mFragment.initPreferencesFromPreferenceScreen(); - - mFragment.onDeviceBondStateChanged(mCachedBluetoothDevice, BluetoothDevice.BOND_BONDING); - - verify(mProgressCategory).setProgress(false); - } - - private static class TestHearingDevicePairingDetail extends HearingDevicePairingDetail { - TestHearingDevicePairingDetail() { - super(); - } - - public void setBluetoothAdapter(BluetoothAdapter bluetoothAdapter) { - this.mBluetoothAdapter = bluetoothAdapter; - } - - public void enableScanning() { - super.enableScanning(); - } - } -} diff --git a/tests/robotests/src/com/android/settings/accessibility/ViewAllBluetoothDevicesPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/accessibility/ViewAllBluetoothDevicesPreferenceControllerTest.java index 6c9fbfc1f8c..434d6643ba3 100644 --- a/tests/robotests/src/com/android/settings/accessibility/ViewAllBluetoothDevicesPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/accessibility/ViewAllBluetoothDevicesPreferenceControllerTest.java @@ -56,7 +56,7 @@ public class ViewAllBluetoothDevicesPreferenceControllerTest { private final String TEST_KEY = "test_key"; @Spy - private HearingDevicePairingDetail mFragment = new HearingDevicePairingDetail(); + private HearingDevicePairingFragment mFragment = new HearingDevicePairingFragment(); private FragmentActivity mActivity; @Mock private PreferenceScreen mScreen; diff --git a/tests/robotests/src/com/android/settings/connecteddevice/AddDevicePreferenceControllerTest.java b/tests/robotests/src/com/android/settings/connecteddevice/AddDevicePreferenceControllerTest.java index 63fa88d7792..70c73a6aa9c 100644 --- a/tests/robotests/src/com/android/settings/connecteddevice/AddDevicePreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/connecteddevice/AddDevicePreferenceControllerTest.java @@ -15,16 +15,12 @@ */ package com.android.settings.connecteddevice; -import static com.android.settings.accessibility.AccessibilityHearingAidsFragment.KEY_HEARING_DEVICE_ADD_BT_DEVICES; import static com.android.settings.core.BasePreferenceController.AVAILABLE; import static com.android.settings.core.BasePreferenceController.UNSUPPORTED_ON_DEVICE; import static com.google.common.truth.Truth.assertThat; import static org.junit.Assert.assertTrue; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.Mockito.doNothing; -import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import static org.robolectric.Shadows.shadowOf; @@ -33,27 +29,17 @@ import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.pm.PackageManager; -import android.platform.test.annotations.RequiresFlagsDisabled; -import android.platform.test.annotations.RequiresFlagsEnabled; -import android.platform.test.flag.junit.CheckFlagsRule; -import android.platform.test.flag.junit.DeviceFlagsValueProvider; import android.text.TextUtils; import androidx.preference.PreferenceScreen; import androidx.test.core.app.ApplicationProvider; import com.android.settings.R; -import com.android.settings.SettingsActivity; -import com.android.settings.accessibility.HearingDevicePairingDetail; -import com.android.settings.accessibility.HearingDevicePairingFragment; -import com.android.settings.flags.Flags; import com.android.settingslib.RestrictedPreference; import org.junit.Before; -import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; -import org.mockito.ArgumentCaptor; import org.mockito.Mock; import org.mockito.MockitoAnnotations; import org.mockito.Spy; @@ -65,10 +51,6 @@ import org.robolectric.util.ReflectionHelpers; @RunWith(RobolectricTestRunner.class) @Config(shadows = ShadowApplicationPackageManager.class) public class AddDevicePreferenceControllerTest { - - @Rule - public final CheckFlagsRule mCheckFlagsRule = DeviceFlagsValueProvider.createCheckFlagsRule(); - @Mock private PreferenceScreen mScreen; @Mock @@ -100,8 +82,6 @@ public class AddDevicePreferenceControllerTest { when(mBluetoothAdapter.isEnabled()).thenReturn(true); when(mScreen.findPreference(key)).thenReturn(mAddDevicePreference); mAddDevicePreferenceController.displayPreference(mScreen); - - doNothing().when(mContext).startActivity(any(Intent.class)); } @Test @@ -157,30 +137,4 @@ public class AddDevicePreferenceControllerTest { assertThat(mAddDevicePreferenceController.getAvailabilityStatus()) .isEqualTo(UNSUPPORTED_ON_DEVICE); } - - @Test - @RequiresFlagsEnabled(Flags.FLAG_NEW_HEARING_DEVICE_PAIRING_PAGE) - public void handlePreferenceClick_A11yPreference_redirectToNewPairingPage() { - mAddDevicePreference.setKey(KEY_HEARING_DEVICE_ADD_BT_DEVICES); - final ArgumentCaptor intentCaptor = ArgumentCaptor.forClass(Intent.class); - - mAddDevicePreferenceController.handlePreferenceTreeClick(mAddDevicePreference); - - verify(mContext).startActivity(intentCaptor.capture()); - assertThat(intentCaptor.getValue().getStringExtra(SettingsActivity.EXTRA_SHOW_FRAGMENT)) - .isEqualTo(HearingDevicePairingFragment.class.getName()); - } - - @Test - @RequiresFlagsDisabled(Flags.FLAG_NEW_HEARING_DEVICE_PAIRING_PAGE) - public void handlePreferenceClick_A11yPreference_redirectToOldPairingPage() { - mAddDevicePreference.setKey(KEY_HEARING_DEVICE_ADD_BT_DEVICES); - final ArgumentCaptor intentCaptor = ArgumentCaptor.forClass(Intent.class); - - mAddDevicePreferenceController.handlePreferenceTreeClick(mAddDevicePreference); - - verify(mContext).startActivity(intentCaptor.capture()); - assertThat(intentCaptor.getValue().getStringExtra(SettingsActivity.EXTRA_SHOW_FRAGMENT)) - .isEqualTo(HearingDevicePairingDetail.class.getName()); - } }