From 4d130705c75896f793f1890b73b1796725921693 Mon Sep 17 00:00:00 2001 From: Yiyi Shen Date: Fri, 8 Dec 2023 14:21:58 +0800 Subject: [PATCH] [Audiosharing] Refine sharing stop dialog. Bug: 305620450 Test: atest AudioSharingStopDialogFragmentTest Change-Id: I1593d1b18af23ffea0ccae0425ad848191b90e8b --- .../AudioSharingStopDialogFragment.java | 31 +++-- .../AudioSharingStopDialogFragmentTest.java | 122 ++++++++++++++++++ 2 files changed, 139 insertions(+), 14 deletions(-) create mode 100644 tests/robotests/src/com/android/settings/connecteddevice/audiosharing/AudioSharingStopDialogFragmentTest.java diff --git a/src/com/android/settings/connecteddevice/audiosharing/AudioSharingStopDialogFragment.java b/src/com/android/settings/connecteddevice/audiosharing/AudioSharingStopDialogFragment.java index 31125def185..1454f76c46c 100644 --- a/src/com/android/settings/connecteddevice/audiosharing/AudioSharingStopDialogFragment.java +++ b/src/com/android/settings/connecteddevice/audiosharing/AudioSharingStopDialogFragment.java @@ -19,11 +19,16 @@ package com.android.settings.connecteddevice.audiosharing; import android.app.Dialog; import android.app.settings.SettingsEnums; import android.os.Bundle; +import android.view.LayoutInflater; +import android.view.View; +import android.widget.ImageView; +import android.widget.TextView; import androidx.appcompat.app.AlertDialog; import androidx.fragment.app.Fragment; import androidx.fragment.app.FragmentManager; +import com.android.settings.R; import com.android.settings.core.instrumentation.InstrumentedDialogFragment; public class AudioSharingStopDialogFragment extends InstrumentedDialogFragment { @@ -68,22 +73,20 @@ public class AudioSharingStopDialogFragment extends InstrumentedDialogFragment { Bundle arguments = requireArguments(); String newDeviceName = arguments.getString(BUNDLE_KEY_NEW_DEVICE_NAME); final AlertDialog.Builder builder = - new AlertDialog.Builder(getActivity()) - .setTitle("Stop sharing audio?") - .setCancelable(false); + new AlertDialog.Builder(getActivity()).setCancelable(false); + LayoutInflater inflater = LayoutInflater.from(builder.getContext()); + View customTitle = + inflater.inflate(R.layout.dialog_custom_title_audio_sharing, /* parent= */ null); + ImageView icon = customTitle.findViewById(R.id.title_icon); + icon.setImageResource(R.drawable.ic_warning_24dp); + TextView title = customTitle.findViewById(R.id.title_text); + title.setText("Stop sharing audio?"); builder.setMessage( - newDeviceName + " is connected, devices in audio sharing will disconnect."); + newDeviceName + " wants to connect, headphones in audio sharing will disconnect."); builder.setPositiveButton( - "Stop sharing", - (dialog, which) -> { - sListener.onStopSharingClick(); - }); - builder.setNegativeButton( - "Cancel", - (dialog, which) -> { - dismiss(); - }); - AlertDialog dialog = builder.create(); + "Stop sharing", (dialog, which) -> sListener.onStopSharingClick()); + builder.setNegativeButton("Cancel", (dialog, which) -> dismiss()); + AlertDialog dialog = builder.setCustomTitle(customTitle).create(); dialog.setCanceledOnTouchOutside(false); return dialog; } diff --git a/tests/robotests/src/com/android/settings/connecteddevice/audiosharing/AudioSharingStopDialogFragmentTest.java b/tests/robotests/src/com/android/settings/connecteddevice/audiosharing/AudioSharingStopDialogFragmentTest.java new file mode 100644 index 00000000000..1de7b2dd1de --- /dev/null +++ b/tests/robotests/src/com/android/settings/connecteddevice/audiosharing/AudioSharingStopDialogFragmentTest.java @@ -0,0 +1,122 @@ +/* + * 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.connecteddevice.audiosharing; + +import static com.google.common.truth.Truth.assertThat; + +import static org.robolectric.shadows.ShadowLooper.shadowMainLooper; + +import android.bluetooth.BluetoothAdapter; +import android.bluetooth.BluetoothStatusCodes; +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.Fragment; +import androidx.fragment.app.FragmentActivity; + +import com.android.settings.flags.Flags; +import com.android.settings.testutils.shadow.ShadowAlertDialogCompat; +import com.android.settings.testutils.shadow.ShadowBluetoothAdapter; + +import org.junit.After; +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; +import org.junit.runner.RunWith; +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; +import org.robolectric.shadows.androidx.fragment.FragmentController; + +import java.util.concurrent.atomic.AtomicBoolean; + +@RunWith(RobolectricTestRunner.class) +@Config( + shadows = { + ShadowAlertDialogCompat.class, + ShadowBluetoothAdapter.class, + }) +public class AudioSharingStopDialogFragmentTest { + + @Rule public final MockitoRule mocks = MockitoJUnit.rule(); + + @Rule + public final CheckFlagsRule mCheckFlagsRule = DeviceFlagsValueProvider.createCheckFlagsRule(); + + private static final String TEST_DEVICE_NAME = "test"; + + private Fragment mParent; + private AudioSharingStopDialogFragment mFragment; + private ShadowBluetoothAdapter mShadowBluetoothAdapter; + + @Before + public void setUp() { + mShadowBluetoothAdapter = Shadow.extract(BluetoothAdapter.getDefaultAdapter()); + mShadowBluetoothAdapter.setEnabled(true); + mShadowBluetoothAdapter.setIsLeAudioBroadcastSourceSupported( + BluetoothStatusCodes.FEATURE_SUPPORTED); + mShadowBluetoothAdapter.setIsLeAudioBroadcastAssistantSupported( + BluetoothStatusCodes.FEATURE_SUPPORTED); + mFragment = new AudioSharingStopDialogFragment(); + mParent = new Fragment(); + FragmentController.setupFragment( + mParent, FragmentActivity.class, /* containerViewId= */ 0, /* bundle= */ null); + } + + @After + public void tearDown() { + ShadowAlertDialogCompat.reset(); + } + + @Test + @RequiresFlagsDisabled(Flags.FLAG_ENABLE_LE_AUDIO_SHARING) + public void onCreateDialog_flagOff_dialogNotExist() { + mFragment.show(mParent, TEST_DEVICE_NAME, () -> {}); + shadowMainLooper().idle(); + AlertDialog dialog = ShadowAlertDialogCompat.getLatestAlertDialog(); + assertThat(dialog).isNull(); + } + + @Test + @RequiresFlagsEnabled(Flags.FLAG_ENABLE_LE_AUDIO_SHARING) + public void onCreateDialog_clickCancel_dialogDismiss() { + mFragment.show(mParent, TEST_DEVICE_NAME, () -> {}); + shadowMainLooper().idle(); + AlertDialog dialog = ShadowAlertDialogCompat.getLatestAlertDialog(); + dialog.findViewById(android.R.id.button2).performClick(); + shadowMainLooper().idle(); + assertThat(dialog.isShowing()).isFalse(); + } + + @Test + @RequiresFlagsEnabled(Flags.FLAG_ENABLE_LE_AUDIO_SHARING) + public void onCreateDialog_clickShare_callbackTriggered() { + AtomicBoolean isStopBtnClicked = new AtomicBoolean(false); + mFragment.show(mParent, TEST_DEVICE_NAME, () -> isStopBtnClicked.set(true)); + shadowMainLooper().idle(); + AlertDialog dialog = ShadowAlertDialogCompat.getLatestAlertDialog(); + dialog.findViewById(android.R.id.button1).performClick(); + shadowMainLooper().idle(); + assertThat(dialog.isShowing()).isFalse(); + assertThat(isStopBtnClicked.get()).isTrue(); + } +}