From 29c7cc0cb54f1a0a5c3f60c3674a756e930d3174 Mon Sep 17 00:00:00 2001 From: "Chaitanya Cheemala (xWF)" Date: Thu, 29 Aug 2024 10:25:04 +0000 Subject: [PATCH] Revert "Show a dialog if bluetooth key is missing when reconnecting" Revert submission 28985385-bt_key_missing_dialog Reason for revert: Likely culprit for b/362901443 - verifying through ABTD before revert submission. This is part of the standard investigation process, and does not mean your CL will be reverted. Reverted changes: /q/submissionid:28985385-bt_key_missing_dialog Change-Id: I2a3ab8f0dbd2c81eda49d11abc6d586f59f149e9 --- AndroidManifest.xml | 20 --- .../settings_bluetooth_declarations.aconfig | 10 -- res/layout/bluetooth_key_missing.xml | 58 ------- res/values/strings.xml | 9 - .../bluetooth/BluetoothKeyMissingDialog.java | 47 ----- .../BluetoothKeyMissingDialogFragment.java | 94 ---------- .../BluetoothKeyMissingReceiver.java | 122 ------------- .../BluetoothKeyMissingDialogTest.java | 76 --------- .../BluetoothKeyMissingReceiverTest.java | 160 ------------------ 9 files changed, 596 deletions(-) delete mode 100644 res/layout/bluetooth_key_missing.xml delete mode 100644 src/com/android/settings/bluetooth/BluetoothKeyMissingDialog.java delete mode 100644 src/com/android/settings/bluetooth/BluetoothKeyMissingDialogFragment.java delete mode 100644 src/com/android/settings/bluetooth/BluetoothKeyMissingReceiver.java delete mode 100644 tests/robotests/src/com/android/settings/bluetooth/BluetoothKeyMissingDialogTest.java delete mode 100644 tests/robotests/src/com/android/settings/bluetooth/BluetoothKeyMissingReceiverTest.java diff --git a/AndroidManifest.xml b/AndroidManifest.xml index 13aafc9dbb7..7b79611ca65 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -3230,19 +3230,6 @@ - - - - - - - - - - - - - diff --git a/aconfig/settings_bluetooth_declarations.aconfig b/aconfig/settings_bluetooth_declarations.aconfig index 0c423b5a1b7..3d14288fcd2 100644 --- a/aconfig/settings_bluetooth_declarations.aconfig +++ b/aconfig/settings_bluetooth_declarations.aconfig @@ -34,13 +34,3 @@ flag { purpose: PURPOSE_BUGFIX } } - -flag { - name: "enable_bluetooth_key_missing_dialog" - namespace: "cross_device_experiences" - description: "Show a dialog if the bluetooth key is missing when reconnecting" - bug: "360031750" - metadata { - purpose: PURPOSE_BUGFIX - } -} diff --git a/res/layout/bluetooth_key_missing.xml b/res/layout/bluetooth_key_missing.xml deleted file mode 100644 index b9f8d866bd3..00000000000 --- a/res/layout/bluetooth_key_missing.xml +++ /dev/null @@ -1,58 +0,0 @@ - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/res/values/strings.xml b/res/values/strings.xml index 17a9a08f48d..0fcb0d68502 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -1860,15 +1860,6 @@ Change - - %1$s not connected - - For your security, forget this device, then pair it again - - Forget device - - Cancel - Device details diff --git a/src/com/android/settings/bluetooth/BluetoothKeyMissingDialog.java b/src/com/android/settings/bluetooth/BluetoothKeyMissingDialog.java deleted file mode 100644 index 46975f77726..00000000000 --- a/src/com/android/settings/bluetooth/BluetoothKeyMissingDialog.java +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Copyright (C) 2024 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.bluetooth; - -import static android.view.WindowManager.LayoutParams.SYSTEM_FLAG_HIDE_NON_SYSTEM_OVERLAY_WINDOWS; - -import android.bluetooth.BluetoothDevice; -import android.content.Intent; -import android.os.Bundle; - -import androidx.annotation.Nullable; -import androidx.fragment.app.FragmentActivity; - -/** A dialog to ask the user to forget a bluetooth device when the key is missing. */ -public class BluetoothKeyMissingDialog extends FragmentActivity { - public static final String FRAGMENT_TAG = "BtKeyMissingFrg"; - - @Override - protected void onCreate(@Nullable Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - - getWindow().addSystemFlags(SYSTEM_FLAG_HIDE_NON_SYSTEM_OVERLAY_WINDOWS); - Intent intent = getIntent(); - BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE); - if (device == null) { - finish(); - return; - } - BluetoothKeyMissingDialogFragment fragment = new BluetoothKeyMissingDialogFragment(device); - fragment.show(getSupportFragmentManager(), FRAGMENT_TAG); - closeSystemDialogs(); - } -} diff --git a/src/com/android/settings/bluetooth/BluetoothKeyMissingDialogFragment.java b/src/com/android/settings/bluetooth/BluetoothKeyMissingDialogFragment.java deleted file mode 100644 index a8e3aae175a..00000000000 --- a/src/com/android/settings/bluetooth/BluetoothKeyMissingDialogFragment.java +++ /dev/null @@ -1,94 +0,0 @@ -/* - * Copyright (C) 2024 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.bluetooth; - -import android.app.Dialog; -import android.app.settings.SettingsEnums; -import android.bluetooth.BluetoothDevice; -import android.content.DialogInterface; -import android.content.DialogInterface.OnClickListener; -import android.os.Bundle; -import android.util.Log; -import android.view.View; -import android.widget.TextView; - -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; -import androidx.appcompat.app.AlertDialog; - -import com.android.settings.R; -import com.android.settings.core.instrumentation.InstrumentedDialogFragment; - -/** - * A dialogFragment used by {@link BluetoothKeyMissingDialog} to create a dialog for the - * bluetooth device. - */ -public class BluetoothKeyMissingDialogFragment extends InstrumentedDialogFragment - implements OnClickListener { - - private static final String TAG = "BTKeyMissingDialogFragment"; - - private BluetoothDevice mBluetoothDevice; - - public BluetoothKeyMissingDialogFragment(@NonNull BluetoothDevice bluetoothDevice) { - mBluetoothDevice = bluetoothDevice; - } - - @NonNull - @Override - public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) { - AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); - View view = getActivity().getLayoutInflater().inflate(R.layout.bluetooth_key_missing, null); - TextView keyMissingTitle = view.findViewById(R.id.bluetooth_key_missing_title); - keyMissingTitle.setText( - getString(R.string.bluetooth_key_missing_title, mBluetoothDevice.getName())); - builder.setView(view); - builder.setPositiveButton(getString(R.string.bluetooth_key_missing_forget), this); - builder.setNegativeButton(getString(R.string.bluetooth_key_missing_cancel), this); - AlertDialog dialog = builder.create(); - dialog.setCanceledOnTouchOutside(false); - return dialog; - } - - @Override - public void onDestroy() { - super.onDestroy(); - if (!getActivity().isFinishing()) { - getActivity().finish(); - } - } - - @Override - public void onClick(DialogInterface dialog, int which) { - if (which == DialogInterface.BUTTON_POSITIVE) { - Log.i( - TAG, - "Positive button clicked, remove bond for " - + mBluetoothDevice.getAnonymizedAddress()); - mBluetoothDevice.removeBond(); - } else if (which == DialogInterface.BUTTON_NEGATIVE) { - Log.i(TAG, "Negative button clicked for " + mBluetoothDevice.getAnonymizedAddress()); - } - if (!getActivity().isFinishing()) { - getActivity().finish(); - } - } - - @Override - public int getMetricsCategory() { - return SettingsEnums.BLUETOOTH_KEY_MISSING_DIALOG_FRAGMENT; - } -} diff --git a/src/com/android/settings/bluetooth/BluetoothKeyMissingReceiver.java b/src/com/android/settings/bluetooth/BluetoothKeyMissingReceiver.java deleted file mode 100644 index d7a5343d694..00000000000 --- a/src/com/android/settings/bluetooth/BluetoothKeyMissingReceiver.java +++ /dev/null @@ -1,122 +0,0 @@ -/* - * Copyright (C) 2024 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.bluetooth; - -import android.app.Notification; -import android.app.NotificationChannel; -import android.app.NotificationManager; -import android.app.PendingIntent; -import android.bluetooth.BluetoothDevice; -import android.content.BroadcastReceiver; -import android.content.Context; -import android.content.Intent; -import android.os.PowerManager; -import android.os.UserHandle; -import android.text.TextUtils; -import android.util.Log; - -import androidx.core.app.NotificationCompat; - -import com.android.settings.R; -import com.android.settings.flags.Flags; - -/** - * BluetoothKeyMissingReceiver is a receiver for Bluetooth key missing error when reconnecting to a - * bonded bluetooth device. - */ -public final class BluetoothKeyMissingReceiver extends BroadcastReceiver { - private static final String TAG = "BtKeyMissingReceiver"; - private static final String CHANNEL_ID = "bluetooth_notification_channel"; - private static final int NOTIFICATION_ID = android.R.drawable.stat_sys_data_bluetooth; - - @Override - public void onReceive(Context context, Intent intent) { - if (!Flags.enableBluetoothKeyMissingDialog()) { - return; - } - String action = intent.getAction(); - if (action == null) { - return; - } - - BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE); - PowerManager powerManager = context.getSystemService(PowerManager.class); - if (TextUtils.equals(action, BluetoothDevice.ACTION_KEY_MISSING)) { - Log.d(TAG, "Receive ACTION_KEY_MISSING"); - if (shouldShowDialog(context, device, powerManager)) { - Intent pairingIntent = getKeyMissingDialogIntent(context, device); - Log.d(TAG, "Show key missing dialog:" + device); - context.startActivityAsUser(pairingIntent, UserHandle.CURRENT); - } else { - Log.d(TAG, "Show key missing notification: " + device); - showNotification(context, device); - } - } - } - - private Intent getKeyMissingDialogIntent(Context context, BluetoothDevice device) { - Intent pairingIntent = new Intent(); - pairingIntent.setClass(context, BluetoothKeyMissingDialog.class); - pairingIntent.putExtra(BluetoothDevice.EXTRA_DEVICE, device); - pairingIntent.setAction(BluetoothDevice.ACTION_KEY_MISSING); - pairingIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); - return pairingIntent; - } - - private boolean shouldShowDialog( - Context context, BluetoothDevice device, PowerManager powerManager) { - return LocalBluetoothPreferences.shouldShowDialogInForeground(context, device) - && powerManager.isInteractive(); - } - - private void showNotification(Context context, BluetoothDevice bluetoothDevice) { - NotificationManager nm = context.getSystemService(NotificationManager.class); - NotificationChannel notificationChannel = - new NotificationChannel( - CHANNEL_ID, - context.getString(R.string.bluetooth), - NotificationManager.IMPORTANCE_HIGH); - nm.createNotificationChannel(notificationChannel); - - PendingIntent pairIntent = - PendingIntent.getActivity( - context, - 0, - getKeyMissingDialogIntent(context, bluetoothDevice), - PendingIntent.FLAG_ONE_SHOT - | PendingIntent.FLAG_UPDATE_CURRENT - | PendingIntent.FLAG_IMMUTABLE); - - NotificationCompat.Builder builder = new NotificationCompat.Builder(context, - CHANNEL_ID) - .setSmallIcon(android.R.drawable.stat_sys_data_bluetooth) - .setTicker(context.getString(R.string.bluetooth_notif_ticker)) - .setLocalOnly(true); - builder.setContentTitle( - context.getString( - R.string.bluetooth_key_missing_title, bluetoothDevice.getName())) - .setContentText(context.getString(R.string.bluetooth_key_missing_message)) - .setContentIntent(pairIntent) - .setAutoCancel(true) - .setDefaults(Notification.DEFAULT_SOUND) - .setColor( - context.getColor( - com.android.internal.R.color.system_notification_accent_color)); - - nm.notify(NOTIFICATION_ID, builder.build()); - } -} diff --git a/tests/robotests/src/com/android/settings/bluetooth/BluetoothKeyMissingDialogTest.java b/tests/robotests/src/com/android/settings/bluetooth/BluetoothKeyMissingDialogTest.java deleted file mode 100644 index a47101e7b79..00000000000 --- a/tests/robotests/src/com/android/settings/bluetooth/BluetoothKeyMissingDialogTest.java +++ /dev/null @@ -1,76 +0,0 @@ -/* - * Copyright (C) 2024 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.bluetooth; - -import static com.google.common.truth.Truth.assertThat; - -import static org.mockito.Mockito.never; -import static org.mockito.Mockito.verify; -import static org.robolectric.shadows.ShadowLooper.shadowMainLooper; - -import android.bluetooth.BluetoothDevice; - -import androidx.appcompat.app.AlertDialog; -import androidx.fragment.app.FragmentActivity; - -import com.android.settings.testutils.shadow.ShadowAlertDialogCompat; - -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.mockito.Mock; -import org.mockito.MockitoAnnotations; -import org.robolectric.Robolectric; -import org.robolectric.RobolectricTestRunner; -import org.robolectric.annotation.Config; - -@RunWith(RobolectricTestRunner.class) -@Config(shadows = ShadowAlertDialogCompat.class) -public class BluetoothKeyMissingDialogTest { - @Mock private BluetoothDevice mBluetoothDevice; - - private BluetoothKeyMissingDialogFragment mFragment = null; - private FragmentActivity mActivity = null; - - @Before - public void setUp() { - MockitoAnnotations.initMocks(this); - mActivity = Robolectric.setupActivity(FragmentActivity.class); - mFragment = new BluetoothKeyMissingDialogFragment(mBluetoothDevice); - mActivity - .getSupportFragmentManager() - .beginTransaction() - .add(mFragment, null) - .commit(); - shadowMainLooper().idle(); - } - - @Test - public void clickForgetDevice_removeBond() { - mFragment.onClick(mFragment.getDialog(), AlertDialog.BUTTON_POSITIVE); - - verify(mBluetoothDevice).removeBond(); - assertThat(mActivity.isFinishing()).isTrue(); - } - - @Test - public void clickCancel_notRemoveBond() { - mFragment.onClick(mFragment.getDialog(), AlertDialog.BUTTON_NEGATIVE); - - verify(mBluetoothDevice, never()).removeBond(); - assertThat(mActivity.isFinishing()).isTrue(); - } -} diff --git a/tests/robotests/src/com/android/settings/bluetooth/BluetoothKeyMissingReceiverTest.java b/tests/robotests/src/com/android/settings/bluetooth/BluetoothKeyMissingReceiverTest.java deleted file mode 100644 index c764ed6cd97..00000000000 --- a/tests/robotests/src/com/android/settings/bluetooth/BluetoothKeyMissingReceiverTest.java +++ /dev/null @@ -1,160 +0,0 @@ -/* - * Copyright (C) 2024 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.bluetooth; - -import static com.google.common.truth.Truth.assertThat; - -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.ArgumentMatchers.eq; -import static org.mockito.Mockito.never; -import static org.mockito.Mockito.spy; -import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.verifyNoInteractions; -import static org.mockito.Mockito.when; - -import android.app.Notification; -import android.app.NotificationManager; -import android.bluetooth.BluetoothAdapter; -import android.bluetooth.BluetoothDevice; -import android.content.BroadcastReceiver; -import android.content.Context; -import android.content.Intent; -import android.os.UserHandle; -import android.platform.test.annotations.DisableFlags; -import android.platform.test.annotations.EnableFlags; -import android.platform.test.flag.junit.SetFlagsRule; - -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.LocalBluetoothManager; - -import org.junit.After; -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.junit.MockitoJUnit; -import org.mockito.junit.MockitoRule; -import org.robolectric.RobolectricTestRunner; -import org.robolectric.RuntimeEnvironment; -import org.robolectric.annotation.Config; -import org.robolectric.shadow.api.Shadow; -import org.robolectric.shadows.ShadowApplication; - -import java.util.List; -import java.util.stream.Collectors; - -@RunWith(RobolectricTestRunner.class) -@Config(shadows = {ShadowBluetoothAdapter.class, ShadowBluetoothUtils.class}) -public class BluetoothKeyMissingReceiverTest { - @Rule public final MockitoRule mMockitoRule = MockitoJUnit.rule(); - @Rule public final SetFlagsRule mSetFlagsRule = new SetFlagsRule(); - - private Context mContext; - private ShadowApplication mShadowApplication; - private ShadowBluetoothAdapter mShadowBluetoothAdapter; - @Mock private LocalBluetoothManager mLocalBtManager; - @Mock private NotificationManager mNm; - @Mock private BluetoothDevice mBluetoothDevice; - - @Before - public void setUp() { - mContext = spy(RuntimeEnvironment.getApplication()); - mShadowApplication = Shadow.extract(mContext); - mShadowApplication.setSystemService(Context.NOTIFICATION_SERVICE, mNm); - mShadowBluetoothAdapter = Shadow.extract(BluetoothAdapter.getDefaultAdapter()); - mShadowBluetoothAdapter.setEnabled(true); - ShadowBluetoothUtils.sLocalBluetoothManager = mLocalBtManager; - } - - @After - public void tearDown() { - ShadowBluetoothUtils.reset(); - } - - @Test - public void broadcastReceiver_isRegistered() { - List registeredReceivers = - mShadowApplication.getRegisteredReceivers(); - - int matchedCount = - registeredReceivers.stream() - .filter( - receiver -> - BluetoothKeyMissingReceiver.class - .getSimpleName() - .equals( - receiver.broadcastReceiver - .getClass() - .getSimpleName())) - .collect(Collectors.toList()) - .size(); - assertThat(matchedCount).isEqualTo(1); - } - - @Test - @DisableFlags(Flags.FLAG_ENABLE_BLUETOOTH_KEY_MISSING_DIALOG) - public void broadcastReceiver_receiveKeyMissingIntentFlagOff_doNothing() { - Intent intent = spy(new Intent(BluetoothDevice.ACTION_KEY_MISSING)); - when(intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE)).thenReturn(mBluetoothDevice); - BluetoothKeyMissingReceiver bluetoothKeyMissingReceiver = getReceiver(intent); - bluetoothKeyMissingReceiver.onReceive(mContext, intent); - - verifyNoInteractions(mNm); - } - - @Test - @EnableFlags(Flags.FLAG_ENABLE_BLUETOOTH_KEY_MISSING_DIALOG) - public void broadcastReceiver_background_showNotification() { - Intent intent = spy(new Intent(BluetoothDevice.ACTION_KEY_MISSING)); - when(intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE)).thenReturn(mBluetoothDevice); - BluetoothKeyMissingReceiver bluetoothKeyMissingReceiver = getReceiver(intent); - bluetoothKeyMissingReceiver.onReceive(mContext, intent); - - verify(mNm).notify(eq(android.R.drawable.stat_sys_data_bluetooth), any(Notification.class)); - verify(mContext, never()).startActivityAsUser(any(), any()); - } - - @Test - @EnableFlags(Flags.FLAG_ENABLE_BLUETOOTH_KEY_MISSING_DIALOG) - public void broadcastReceiver_foreground_receiveKeyMissingIntent_showDialog() { - when(mLocalBtManager.isForegroundActivity()).thenReturn(true); - Intent intent = spy(new Intent(BluetoothDevice.ACTION_KEY_MISSING)); - when(intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE)).thenReturn(mBluetoothDevice); - BluetoothKeyMissingReceiver bluetoothKeyMissingReceiver = getReceiver(intent); - bluetoothKeyMissingReceiver.onReceive(mContext, intent); - - verifyNoInteractions(mNm); - ArgumentCaptor captor = ArgumentCaptor.forClass(Intent.class); - verify(mContext).startActivityAsUser(captor.capture(), eq(UserHandle.CURRENT)); - assertThat(captor.getValue().getComponent().getClassName()) - .isEqualTo(BluetoothKeyMissingDialog.class.getName()); - } - - private BluetoothKeyMissingReceiver getReceiver(Intent intent) { - assertThat(mShadowApplication.hasReceiverForIntent(intent)).isTrue(); - List receiversForIntent = - mShadowApplication.getReceiversForIntent(intent); - assertThat(receiversForIntent).hasSize(1); - BroadcastReceiver broadcastReceiver = receiversForIntent.get(0); - assertThat(broadcastReceiver).isInstanceOf(BluetoothKeyMissingReceiver.class); - return (BluetoothKeyMissingReceiver) broadcastReceiver; - } -}