diff options
14 files changed, 208 insertions, 158 deletions
diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml index 90f27311d7c3..4f20fceef8d1 100644 --- a/core/res/res/values/config.xml +++ b/core/res/res/values/config.xml @@ -3551,10 +3551,6 @@ <string name="config_keyguardComponent" translatable="false" >com.android.systemui/com.android.systemui.keyguard.KeyguardService</string> - <!-- Screen record dialog component --> - <string name="config_screenRecorderComponent" translatable="false" - >com.android.systemui/com.android.systemui.screenrecord.ScreenRecordDialog</string> - <!-- The component name of a special dock app that merely launches a dream. We don't want to launch this app when docked because it causes an unnecessary activity transition. We just want to start the dream. --> diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml index a025c8db547f..150951fd57f8 100644 --- a/core/res/res/values/symbols.xml +++ b/core/res/res/values/symbols.xml @@ -375,7 +375,6 @@ <java-symbol type="string" name="config_recentsComponentName" /> <java-symbol type="string" name="config_systemUIServiceComponent" /> <java-symbol type="string" name="config_controlsPackage" /> - <java-symbol type="string" name="config_screenRecorderComponent" /> <java-symbol type="string" name="config_somnambulatorComponent" /> <java-symbol type="string" name="config_screenshotAppClipsServiceComponent" /> <java-symbol type="string" name="config_screenshotServiceComponent" /> diff --git a/packages/SystemUI/src/com/android/systemui/mediaprojection/devicepolicy/ScreenCaptureDisabledDialog.kt b/packages/SystemUI/src/com/android/systemui/mediaprojection/devicepolicy/ScreenCaptureDisabledDialog.kt deleted file mode 100644 index fc452288f86d..000000000000 --- a/packages/SystemUI/src/com/android/systemui/mediaprojection/devicepolicy/ScreenCaptureDisabledDialog.kt +++ /dev/null @@ -1,33 +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.systemui.mediaprojection.devicepolicy - -import android.content.Context -import com.android.systemui.res.R -import com.android.systemui.statusbar.phone.SystemUIDialog - -/** Dialog that shows that screen capture is disabled on this device. */ -class ScreenCaptureDisabledDialog(context: Context) : SystemUIDialog(context) { - - init { - setTitle(context.getString(R.string.screen_capturing_disabled_by_policy_dialog_title)) - setMessage( - context.getString(R.string.screen_capturing_disabled_by_policy_dialog_description) - ) - setIcon(R.drawable.ic_cast) - setButton(BUTTON_POSITIVE, context.getString(android.R.string.ok)) { _, _ -> cancel() } - } -} diff --git a/packages/SystemUI/src/com/android/systemui/mediaprojection/devicepolicy/ScreenCaptureDisabledDialogDelegate.kt b/packages/SystemUI/src/com/android/systemui/mediaprojection/devicepolicy/ScreenCaptureDisabledDialogDelegate.kt new file mode 100644 index 000000000000..8aed535956b7 --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/mediaprojection/devicepolicy/ScreenCaptureDisabledDialogDelegate.kt @@ -0,0 +1,44 @@ +/* + * 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.systemui.mediaprojection.devicepolicy + +import android.content.DialogInterface.BUTTON_POSITIVE +import android.content.res.Resources +import com.android.systemui.dagger.qualifiers.Main +import com.android.systemui.res.R +import com.android.systemui.statusbar.phone.SystemUIDialog +import javax.inject.Inject + +/** Dialog that shows that screen capture is disabled on this device. */ +class ScreenCaptureDisabledDialogDelegate @Inject constructor( + @Main private val resources: Resources, + private val systemUIDialogFactory: SystemUIDialog.Factory +) : SystemUIDialog.Delegate { + + override fun createDialog(): SystemUIDialog { + val dialog = systemUIDialogFactory.create(this) + dialog.setTitle(resources.getString(R.string.screen_capturing_disabled_by_policy_dialog_title)) + dialog.setMessage( + resources.getString(R.string.screen_capturing_disabled_by_policy_dialog_description) + ) + dialog.setIcon(R.drawable.ic_cast) + dialog.setButton(BUTTON_POSITIVE, resources.getString(android.R.string.ok)) { + _, _ -> dialog.cancel() + } + + return dialog + } +} diff --git a/packages/SystemUI/src/com/android/systemui/mediaprojection/permission/MediaProjectionPermissionActivity.java b/packages/SystemUI/src/com/android/systemui/mediaprojection/permission/MediaProjectionPermissionActivity.java index 8b034b293dcb..17f9cafcb650 100644 --- a/packages/SystemUI/src/com/android/systemui/mediaprojection/permission/MediaProjectionPermissionActivity.java +++ b/packages/SystemUI/src/com/android/systemui/mediaprojection/permission/MediaProjectionPermissionActivity.java @@ -59,7 +59,7 @@ import com.android.systemui.mediaprojection.MediaProjectionServiceHelper; import com.android.systemui.mediaprojection.SessionCreationSource; import com.android.systemui.mediaprojection.appselector.MediaProjectionAppSelectorActivity; import com.android.systemui.mediaprojection.devicepolicy.ScreenCaptureDevicePolicyResolver; -import com.android.systemui.mediaprojection.devicepolicy.ScreenCaptureDisabledDialog; +import com.android.systemui.mediaprojection.devicepolicy.ScreenCaptureDisabledDialogDelegate; import com.android.systemui.res.R; import com.android.systemui.statusbar.phone.AlertDialogWithDelegate; import com.android.systemui.statusbar.phone.SystemUIDialog; @@ -79,6 +79,7 @@ public class MediaProjectionPermissionActivity extends Activity private final Lazy<ScreenCaptureDevicePolicyResolver> mScreenCaptureDevicePolicyResolver; private final StatusBarManager mStatusBarManager; private final MediaProjectionMetricsLogger mMediaProjectionMetricsLogger; + private final ScreenCaptureDisabledDialogDelegate mScreenCaptureDisabledDialogDelegate; private String mPackageName; private int mUid; @@ -93,14 +94,17 @@ public class MediaProjectionPermissionActivity extends Activity private boolean mUserSelectingTask = false; @Inject - public MediaProjectionPermissionActivity(FeatureFlags featureFlags, + public MediaProjectionPermissionActivity( + FeatureFlags featureFlags, Lazy<ScreenCaptureDevicePolicyResolver> screenCaptureDevicePolicyResolver, StatusBarManager statusBarManager, - MediaProjectionMetricsLogger mediaProjectionMetricsLogger) { + MediaProjectionMetricsLogger mediaProjectionMetricsLogger, + ScreenCaptureDisabledDialogDelegate screenCaptureDisabledDialogDelegate) { mFeatureFlags = featureFlags; mScreenCaptureDevicePolicyResolver = screenCaptureDevicePolicyResolver; mStatusBarManager = statusBarManager; mMediaProjectionMetricsLogger = mediaProjectionMetricsLogger; + mScreenCaptureDisabledDialogDelegate = screenCaptureDisabledDialogDelegate; } @Override @@ -315,10 +319,7 @@ public class MediaProjectionPermissionActivity extends Activity final UserHandle hostUserHandle = getHostUserHandle(); if (mScreenCaptureDevicePolicyResolver.get() .isScreenCaptureCompletelyDisabled(hostUserHandle)) { - // Using application context for the dialog, instead of the activity context, so we get - // the correct screen width when in split screen. - Context dialogContext = getApplicationContext(); - AlertDialog dialog = new ScreenCaptureDisabledDialog(dialogContext); + AlertDialog dialog = mScreenCaptureDisabledDialogDelegate.createDialog(); setUpDialog(dialog); dialog.show(); return true; diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/dialog/InternetDialogDelegate.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/dialog/InternetDialogDelegate.java index 0dd0a60b128a..52cf4ec57e1d 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tiles/dialog/InternetDialogDelegate.java +++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/dialog/InternetDialogDelegate.java @@ -481,7 +481,8 @@ public class InternetDialogDelegate implements mSecondaryMobileTitleText.setTextAppearance( R.style.TextAppearance_InternetDialog_Active); - TextView mSecondaryMobileSummaryText = mDialogView.requireViewById(R.id.secondary_mobile_summary); + TextView mSecondaryMobileSummaryText = + mDialogView.requireViewById(R.id.secondary_mobile_summary); summary = getMobileNetworkSummary(autoSwitchNonDdsSubId); if (!TextUtils.isEmpty(summary)) { mSecondaryMobileSummaryText.setText( diff --git a/packages/SystemUI/src/com/android/systemui/recordissue/RecordIssueDialogDelegate.kt b/packages/SystemUI/src/com/android/systemui/recordissue/RecordIssueDialogDelegate.kt index 80f11f1e1874..1c07d00e4195 100644 --- a/packages/SystemUI/src/com/android/systemui/recordissue/RecordIssueDialogDelegate.kt +++ b/packages/SystemUI/src/com/android/systemui/recordissue/RecordIssueDialogDelegate.kt @@ -40,7 +40,7 @@ import com.android.systemui.flags.Flags.WM_ENABLE_PARTIAL_SCREEN_SHARING_ENTERPR import com.android.systemui.mediaprojection.MediaProjectionMetricsLogger import com.android.systemui.mediaprojection.SessionCreationSource import com.android.systemui.mediaprojection.devicepolicy.ScreenCaptureDevicePolicyResolver -import com.android.systemui.mediaprojection.devicepolicy.ScreenCaptureDisabledDialog +import com.android.systemui.mediaprojection.devicepolicy.ScreenCaptureDisabledDialogDelegate import com.android.systemui.qs.tiles.RecordIssueTile import com.android.systemui.res.R import com.android.systemui.screenrecord.RecordingService @@ -65,6 +65,7 @@ constructor( private val devicePolicyResolver: dagger.Lazy<ScreenCaptureDevicePolicyResolver>, private val mediaProjectionMetricsLogger: MediaProjectionMetricsLogger, private val userFileManager: UserFileManager, + private val screenCaptureDisabledDialogDelegate: ScreenCaptureDisabledDialogDelegate, @Assisted private val onStarted: Runnable, ) : SystemUIDialog.Delegate { @@ -124,7 +125,7 @@ constructor( .isScreenCaptureCompletelyDisabled(UserHandle.of(userTracker.userId)) ) { mainExecutor.execute { - ScreenCaptureDisabledDialog(context).show() + screenCaptureDisabledDialogDelegate.createDialog().show() screenRecordSwitch.isChecked = false } return@execute diff --git a/packages/SystemUI/src/com/android/systemui/screenrecord/RecordingController.java b/packages/SystemUI/src/com/android/systemui/screenrecord/RecordingController.java index a4ba2a241275..8fe84c98866b 100644 --- a/packages/SystemUI/src/com/android/systemui/screenrecord/RecordingController.java +++ b/packages/SystemUI/src/com/android/systemui/screenrecord/RecordingController.java @@ -42,11 +42,9 @@ import com.android.systemui.flags.Flags; import com.android.systemui.mediaprojection.MediaProjectionMetricsLogger; import com.android.systemui.mediaprojection.SessionCreationSource; import com.android.systemui.mediaprojection.devicepolicy.ScreenCaptureDevicePolicyResolver; -import com.android.systemui.mediaprojection.devicepolicy.ScreenCaptureDisabledDialog; +import com.android.systemui.mediaprojection.devicepolicy.ScreenCaptureDisabledDialogDelegate; import com.android.systemui.plugins.ActivityStarter; -import com.android.systemui.settings.UserContextProvider; import com.android.systemui.settings.UserTracker; -import com.android.systemui.statusbar.phone.SystemUIDialog; import com.android.systemui.statusbar.policy.CallbackController; import dagger.Lazy; @@ -71,18 +69,19 @@ public class RecordingController private CountDownTimer mCountDownTimer = null; private final Executor mMainExecutor; private final BroadcastDispatcher mBroadcastDispatcher; - private final Context mContext; private final FeatureFlags mFlags; - private final UserContextProvider mUserContextProvider; private final UserTracker mUserTracker; private final MediaProjectionMetricsLogger mMediaProjectionMetricsLogger; - private final SystemUIDialog.Factory mDialogFactory; + private final ScreenCaptureDisabledDialogDelegate mScreenCaptureDisabledDialogDelegate; + private final ScreenRecordDialogDelegate.Factory mScreenRecordDialogFactory; + private final ScreenRecordPermissionDialogDelegate.Factory + mScreenRecordPermissionDialogDelegateFactory; protected static final String INTENT_UPDATE_STATE = "com.android.systemui.screenrecord.UPDATE_STATE"; protected static final String EXTRA_STATE = "extra_state"; - private CopyOnWriteArrayList<RecordingStateChangeCallback> mListeners = + private final CopyOnWriteArrayList<RecordingStateChangeCallback> mListeners = new CopyOnWriteArrayList<>(); private final Lazy<ScreenCaptureDevicePolicyResolver> mDevicePolicyResolver; @@ -115,24 +114,26 @@ public class RecordingController * Create a new RecordingController */ @Inject - public RecordingController(@Main Executor mainExecutor, + public RecordingController( + @Main Executor mainExecutor, BroadcastDispatcher broadcastDispatcher, - Context context, FeatureFlags flags, - UserContextProvider userContextProvider, Lazy<ScreenCaptureDevicePolicyResolver> devicePolicyResolver, UserTracker userTracker, MediaProjectionMetricsLogger mediaProjectionMetricsLogger, - SystemUIDialog.Factory dialogFactory) { + ScreenCaptureDisabledDialogDelegate screenCaptureDisabledDialogDelegate, + ScreenRecordDialogDelegate.Factory screenRecordDialogFactory, + ScreenRecordPermissionDialogDelegate.Factory + screenRecordPermissionDialogDelegateFactory) { mMainExecutor = mainExecutor; - mContext = context; mFlags = flags; mDevicePolicyResolver = devicePolicyResolver; mBroadcastDispatcher = broadcastDispatcher; - mUserContextProvider = userContextProvider; mUserTracker = userTracker; mMediaProjectionMetricsLogger = mediaProjectionMetricsLogger; - mDialogFactory = dialogFactory; + mScreenCaptureDisabledDialogDelegate = screenCaptureDisabledDialogDelegate; + mScreenRecordDialogFactory = screenRecordDialogFactory; + mScreenRecordPermissionDialogDelegateFactory = screenRecordPermissionDialogDelegateFactory; BroadcastOptions options = BroadcastOptions.makeBasic(); options.setInteractive(true); @@ -163,27 +164,18 @@ public class RecordingController if (mFlags.isEnabled(Flags.WM_ENABLE_PARTIAL_SCREEN_SHARING_ENTERPRISE_POLICIES) && mDevicePolicyResolver.get() .isScreenCaptureCompletelyDisabled(getHostUserHandle())) { - return new ScreenCaptureDisabledDialog(mContext); + return mScreenCaptureDisabledDialogDelegate.createDialog(); } mMediaProjectionMetricsLogger.notifyProjectionInitiated( getHostUid(), SessionCreationSource.SYSTEM_UI_SCREEN_RECORDER); - return flags.isEnabled(Flags.WM_ENABLE_PARTIAL_SCREEN_SHARING) - ? mDialogFactory.create(new ScreenRecordPermissionDialogDelegate( - getHostUserHandle(), - getHostUid(), - /* controller= */ this, - activityStarter, - mUserContextProvider, - onStartRecordingClicked, - mMediaProjectionMetricsLogger, - mDialogFactory)) - : new ScreenRecordDialog( - context, - /* controller= */ this, - mUserContextProvider, - onStartRecordingClicked); + return (flags.isEnabled(Flags.WM_ENABLE_PARTIAL_SCREEN_SHARING) + ? mScreenRecordPermissionDialogDelegateFactory + .create(this, getHostUserHandle(), getHostUid(), onStartRecordingClicked) + : mScreenRecordDialogFactory + .create(this, onStartRecordingClicked)) + .createDialog(); } /** diff --git a/packages/SystemUI/src/com/android/systemui/screenrecord/ScreenRecordDialog.java b/packages/SystemUI/src/com/android/systemui/screenrecord/ScreenRecordDialogDelegate.java index b98093e50920..9f1447b1f509 100644 --- a/packages/SystemUI/src/com/android/systemui/screenrecord/ScreenRecordDialog.java +++ b/packages/SystemUI/src/com/android/systemui/screenrecord/ScreenRecordDialogDelegate.java @@ -49,52 +49,69 @@ import com.android.systemui.res.R; import com.android.systemui.settings.UserContextProvider; import com.android.systemui.statusbar.phone.SystemUIDialog; +import dagger.assisted.Assisted; +import dagger.assisted.AssistedFactory; +import dagger.assisted.AssistedInject; + import java.util.Arrays; import java.util.List; /** * Dialog to select screen recording options */ -public class ScreenRecordDialog extends SystemUIDialog { +public class ScreenRecordDialogDelegate implements SystemUIDialog.Delegate { private static final List<ScreenRecordingAudioSource> MODES = Arrays.asList(INTERNAL, MIC, MIC_AND_INTERNAL); private static final long DELAY_MS = 3000; private static final long INTERVAL_MS = 1000; - private final RecordingController mController; + private final SystemUIDialog.Factory mSystemUIDialogFactory; private final UserContextProvider mUserContextProvider; - @Nullable + private final RecordingController mController; private final Runnable mOnStartRecordingClicked; private Switch mTapsSwitch; private Switch mAudioSwitch; private Spinner mOptions; - public ScreenRecordDialog(Context context, - RecordingController controller, - UserContextProvider userContextProvider, - @Nullable Runnable onStartRecordingClicked) { - super(context); - mController = controller; + @AssistedFactory + public interface Factory { + ScreenRecordDialogDelegate create( + RecordingController recordingController, + @Nullable Runnable onStartRecordingClicked + ); + } + + @AssistedInject + public ScreenRecordDialogDelegate( + SystemUIDialog.Factory systemUIDialogFactory, + UserContextProvider userContextProvider, + @Assisted RecordingController controller, + @Assisted @Nullable Runnable onStartRecordingClicked) { + mSystemUIDialogFactory = systemUIDialogFactory; mUserContextProvider = userContextProvider; + mController = controller; mOnStartRecordingClicked = onStartRecordingClicked; } @Override - public void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); + public SystemUIDialog createDialog() { + return mSystemUIDialogFactory.create(this); + } - Window window = getWindow(); + @Override + public void onCreate(SystemUIDialog dialog, Bundle savedInstanceState) { + Window window = dialog.getWindow(); window.addPrivateFlags(WindowManager.LayoutParams.SYSTEM_FLAG_SHOW_FOR_ALL_USERS); window.setGravity(Gravity.CENTER); - setTitle(R.string.screenrecord_title); + dialog.setTitle(R.string.screenrecord_title); - setContentView(R.layout.screen_record_dialog); + dialog.setContentView(R.layout.screen_record_dialog); - TextView cancelBtn = findViewById(R.id.button_cancel); - cancelBtn.setOnClickListener(v -> dismiss()); - TextView startBtn = findViewById(R.id.button_start); + TextView cancelBtn = dialog.findViewById(R.id.button_cancel); + cancelBtn.setOnClickListener(v -> dialog.dismiss()); + TextView startBtn = dialog.findViewById(R.id.button_start); startBtn.setOnClickListener(v -> { if (mOnStartRecordingClicked != null) { // Note that it is important to run this callback before dismissing, so that the @@ -104,13 +121,13 @@ public class ScreenRecordDialog extends SystemUIDialog { // Start full-screen recording requestScreenCapture(/* captureTarget= */ null); - dismiss(); + dialog.dismiss(); }); - mAudioSwitch = findViewById(R.id.screenrecord_audio_switch); - mTapsSwitch = findViewById(R.id.screenrecord_taps_switch); - mOptions = findViewById(R.id.screen_recording_options); - ArrayAdapter a = new ScreenRecordingAdapter(getContext().getApplicationContext(), + mAudioSwitch = dialog.findViewById(R.id.screenrecord_audio_switch); + mTapsSwitch = dialog.findViewById(R.id.screenrecord_taps_switch); + mOptions = dialog.findViewById(R.id.screen_recording_options); + ArrayAdapter a = new ScreenRecordingAdapter(dialog.getContext().getApplicationContext(), android.R.layout.simple_spinner_dropdown_item, MODES); a.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); diff --git a/packages/SystemUI/src/com/android/systemui/screenrecord/ScreenRecordPermissionDialogDelegate.kt b/packages/SystemUI/src/com/android/systemui/screenrecord/ScreenRecordPermissionDialogDelegate.kt index 3eb26f498921..ba775cd3cd82 100644 --- a/packages/SystemUI/src/com/android/systemui/screenrecord/ScreenRecordPermissionDialogDelegate.kt +++ b/packages/SystemUI/src/com/android/systemui/screenrecord/ScreenRecordPermissionDialogDelegate.kt @@ -46,17 +46,20 @@ import com.android.systemui.plugins.ActivityStarter import com.android.systemui.res.R import com.android.systemui.settings.UserContextProvider import com.android.systemui.statusbar.phone.SystemUIDialog +import dagger.assisted.Assisted +import dagger.assisted.AssistedFactory +import dagger.assisted.AssistedInject /** Dialog to select screen recording options */ -class ScreenRecordPermissionDialogDelegate( - private val hostUserHandle: UserHandle, - private val hostUid: Int, - private val controller: RecordingController, +class ScreenRecordPermissionDialogDelegate @AssistedInject constructor( + @Assisted private val hostUserHandle: UserHandle, + @Assisted private val hostUid: Int, + @Assisted private val controller: RecordingController, private val activityStarter: ActivityStarter, private val userContextProvider: UserContextProvider, - private val onStartRecordingClicked: Runnable?, + @Assisted private val onStartRecordingClicked: Runnable?, mediaProjectionMetricsLogger: MediaProjectionMetricsLogger, - private val systemUIDialogFactory: SystemUIDialog.Factory + private val systemUIDialogFactory: SystemUIDialog.Factory, ) : BaseMediaProjectionPermissionDialogDelegate<SystemUIDialog>( createOptionList(), @@ -65,8 +68,19 @@ class ScreenRecordPermissionDialogDelegate( mediaProjectionMetricsLogger, R.drawable.ic_screenrecord, R.color.screenrecord_icon_color - ), - SystemUIDialog.Delegate { + ), SystemUIDialog.Delegate { + + + @AssistedFactory + interface Factory { + fun create( + recordingController: RecordingController, + hostUserHandle: UserHandle, + hostUid: Int, + onStartRecordingClicked: Runnable? + ): ScreenRecordPermissionDialogDelegate + } + private lateinit var tapsSwitch: Switch private lateinit var tapsSwitchContainer: ViewGroup private lateinit var tapsView: View diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/SystemUIDialog.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/SystemUIDialog.java index f12a09b1062c..82d9fc7d0152 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/SystemUIDialog.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/SystemUIDialog.java @@ -93,7 +93,7 @@ public class SystemUIDialog extends AlertDialog implements ViewRootImpl.ConfigCh /** * @deprecated Don't subclass SystemUIDialog. Please subclass {@link Delegate} and pass it to - * {@link Factory#create(DialogDelegate)} to create a custom dialog. + * {@link Factory#create(Delegate)} to create a custom dialog. */ @Deprecated public SystemUIDialog(Context context) { diff --git a/packages/SystemUI/tests/src/com/android/systemui/recordissue/RecordIssueDialogDelegateTest.kt b/packages/SystemUI/tests/src/com/android/systemui/recordissue/RecordIssueDialogDelegateTest.kt index 7b285abe83ce..ada93db537e5 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/recordissue/RecordIssueDialogDelegateTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/recordissue/RecordIssueDialogDelegateTest.kt @@ -33,6 +33,7 @@ import com.android.systemui.flags.Flags import com.android.systemui.mediaprojection.MediaProjectionMetricsLogger import com.android.systemui.mediaprojection.SessionCreationSource import com.android.systemui.mediaprojection.devicepolicy.ScreenCaptureDevicePolicyResolver +import com.android.systemui.mediaprojection.devicepolicy.ScreenCaptureDisabledDialogDelegate import com.android.systemui.model.SysUiState import com.android.systemui.qs.tiles.RecordIssueTile import com.android.systemui.res.R @@ -41,18 +42,18 @@ import com.android.systemui.settings.UserFileManager import com.android.systemui.settings.UserTracker import com.android.systemui.statusbar.phone.SystemUIDialog import com.android.systemui.statusbar.phone.SystemUIDialogManager +import com.android.systemui.util.concurrency.FakeExecutor import com.android.systemui.util.mockito.any import com.android.systemui.util.mockito.eq import com.android.systemui.util.mockito.whenever +import com.android.systemui.util.time.FakeSystemClock import com.google.common.truth.Truth.assertThat import java.util.concurrent.CountDownLatch -import java.util.concurrent.Executor import java.util.concurrent.TimeUnit import org.junit.After import org.junit.Before import org.junit.Test import org.junit.runner.RunWith -import org.mockito.ArgumentCaptor import org.mockito.ArgumentMatchers.anyBoolean import org.mockito.ArgumentMatchers.anyInt import org.mockito.Mock @@ -74,12 +75,16 @@ class RecordIssueDialogDelegateTest : SysuiTestCase() { @Mock private lateinit var userTracker: UserTracker @Mock private lateinit var userFileManager: UserFileManager @Mock private lateinit var sharedPreferences: SharedPreferences + @Mock private lateinit var screenCaptureDisabledDialogDelegate: + ScreenCaptureDisabledDialogDelegate + @Mock private lateinit var screenCaptureDisabledDialog: SystemUIDialog @Mock private lateinit var sysuiState: SysUiState @Mock private lateinit var systemUIDialogManager: SystemUIDialogManager @Mock private lateinit var broadcastDispatcher: BroadcastDispatcher - @Mock private lateinit var bgExecutor: Executor - @Mock private lateinit var mainExecutor: Executor + private val systemClock = FakeSystemClock() + private val bgExecutor = FakeExecutor(systemClock) + private val mainExecutor = FakeExecutor(systemClock) @Mock private lateinit var mDialogTransitionAnimator: DialogTransitionAnimator private lateinit var dialog: SystemUIDialog @@ -92,6 +97,8 @@ class RecordIssueDialogDelegateTest : SysuiTestCase() { whenever(dprLazy.get()).thenReturn(devicePolicyResolver) whenever(sysuiState.setFlag(anyInt(), anyBoolean())).thenReturn(sysuiState) whenever(userContextProvider.userContext).thenReturn(mContext) + whenever(screenCaptureDisabledDialogDelegate.createDialog()) + .thenReturn(screenCaptureDisabledDialog) whenever( userFileManager.getSharedPreferences( eq(RecordIssueTile.TILE_SPEC), @@ -124,6 +131,7 @@ class RecordIssueDialogDelegateTest : SysuiTestCase() { dprLazy, mediaProjectionMetricsLogger, userFileManager, + screenCaptureDisabledDialogDelegate, ) { latch.countDown() } @@ -163,13 +171,8 @@ class RecordIssueDialogDelegateTest : SysuiTestCase() { val screenRecordSwitch = dialog.requireViewById<Switch>(R.id.screenrecord_switch) screenRecordSwitch.isChecked = true - val bgCaptor = ArgumentCaptor.forClass(Runnable::class.java) - verify(bgExecutor).execute(bgCaptor.capture()) - bgCaptor.value.run() - - val mainCaptor = ArgumentCaptor.forClass(Runnable::class.java) - verify(mainExecutor).execute(mainCaptor.capture()) - mainCaptor.value.run() + bgExecutor.runAllReady() + mainExecutor.runAllReady() verify(mediaProjectionMetricsLogger, never()) .notifyProjectionInitiated( @@ -192,13 +195,8 @@ class RecordIssueDialogDelegateTest : SysuiTestCase() { val screenRecordSwitch = dialog.requireViewById<Switch>(R.id.screenrecord_switch) screenRecordSwitch.isChecked = true - val bgCaptor = ArgumentCaptor.forClass(Runnable::class.java) - verify(bgExecutor).execute(bgCaptor.capture()) - bgCaptor.value.run() - - val mainCaptor = ArgumentCaptor.forClass(Runnable::class.java) - verify(mainExecutor).execute(mainCaptor.capture()) - mainCaptor.value.run() + bgExecutor.runAllReady() + mainExecutor.runAllReady() verify(mediaProjectionMetricsLogger) .notifyProjectionInitiated( @@ -219,9 +217,7 @@ class RecordIssueDialogDelegateTest : SysuiTestCase() { val screenRecordSwitch = dialog.requireViewById<Switch>(R.id.screenrecord_switch) screenRecordSwitch.isChecked = true - val bgCaptor = ArgumentCaptor.forClass(Runnable::class.java) - verify(bgExecutor).execute(bgCaptor.capture()) - bgCaptor.value.run() + bgExecutor.runAllReady() verify(mediaProjectionMetricsLogger) .notifyProjectionInitiated( diff --git a/packages/SystemUI/tests/src/com/android/systemui/screenrecord/RecordingControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/screenrecord/RecordingControllerTest.java index 6cbe8c9a939b..b3df12ee2c10 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/screenrecord/RecordingControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/screenrecord/RecordingControllerTest.java @@ -17,13 +17,11 @@ package com.android.systemui.screenrecord; import static android.os.Process.myUid; - import static com.google.common.truth.Truth.assertThat; - import static junit.framework.Assert.assertFalse; import static junit.framework.Assert.assertTrue; - import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.verify; @@ -48,10 +46,9 @@ import com.android.systemui.flags.Flags; import com.android.systemui.mediaprojection.MediaProjectionMetricsLogger; import com.android.systemui.mediaprojection.SessionCreationSource; import com.android.systemui.mediaprojection.devicepolicy.ScreenCaptureDevicePolicyResolver; -import com.android.systemui.mediaprojection.devicepolicy.ScreenCaptureDisabledDialog; +import com.android.systemui.mediaprojection.devicepolicy.ScreenCaptureDisabledDialogDelegate; import com.android.systemui.model.SysUiState; import com.android.systemui.plugins.ActivityStarter; -import com.android.systemui.settings.UserContextProvider; import com.android.systemui.settings.UserTracker; import com.android.systemui.statusbar.phone.DialogDelegate; import com.android.systemui.statusbar.phone.SystemUIDialog; @@ -84,8 +81,6 @@ public class RecordingControllerTest extends SysuiTestCase { @Mock private BroadcastDispatcher mBroadcastDispatcher; @Mock - private UserContextProvider mUserContextProvider; - @Mock private ScreenCaptureDevicePolicyResolver mDevicePolicyResolver; @Mock private DialogTransitionAnimator mDialogTransitionAnimator; @@ -96,6 +91,22 @@ public class RecordingControllerTest extends SysuiTestCase { @Mock private MediaProjectionMetricsLogger mMediaProjectionMetricsLogger; + @Mock + private ScreenCaptureDisabledDialogDelegate mScreenCaptureDisabledDialogDelegate; + @Mock + private SystemUIDialog mScreenCaptureDisabledDialog; + @Mock + private ScreenRecordDialogDelegate.Factory mScreenRecordDialogFactory; + @Mock + private ScreenRecordDialogDelegate mScreenRecordDialogDelegate; + @Mock + private ScreenRecordPermissionDialogDelegate.Factory + mScreenRecordPermissionDialogDelegateFactory; + @Mock + private ScreenRecordPermissionDialogDelegate mScreenRecordPermissionDialogDelegate; + @Mock + private SystemUIDialog mScreenRecordSystemUIDialog; + private FakeFeatureFlags mFeatureFlags; private RecordingController mController; private TestSystemUIDialogFactory mDialogFactory; @@ -108,8 +119,6 @@ public class RecordingControllerTest extends SysuiTestCase { Context spiedContext = spy(mContext); when(spiedContext.getUserId()).thenReturn(TEST_USER_ID); - when(mUserContextProvider.getUserContext()).thenReturn(spiedContext); - mDialogFactory = new TestSystemUIDialogFactory( mContext, Dependency.get(SystemUIDialogManager.class), @@ -119,16 +128,26 @@ public class RecordingControllerTest extends SysuiTestCase { ); mFeatureFlags = new FakeFeatureFlags(); + when(mScreenCaptureDisabledDialogDelegate.createDialog()) + .thenReturn(mScreenCaptureDisabledDialog); + when(mScreenRecordDialogFactory.create(any(), any())) + .thenReturn(mScreenRecordDialogDelegate); + when(mScreenRecordDialogDelegate.createDialog()).thenReturn(mScreenRecordSystemUIDialog); + when(mScreenRecordPermissionDialogDelegateFactory.create(any(), any(), anyInt(), any())) + .thenReturn(mScreenRecordPermissionDialogDelegate); + when(mScreenRecordPermissionDialogDelegate.createDialog()) + .thenReturn(mScreenRecordSystemUIDialog); mController = new RecordingController( mMainExecutor, mBroadcastDispatcher, - mContext, mFeatureFlags, - mUserContextProvider, () -> mDevicePolicyResolver, mUserTracker, mMediaProjectionMetricsLogger, - mDialogFactory); + mScreenCaptureDisabledDialogDelegate, + mScreenRecordDialogFactory, + mScreenRecordPermissionDialogDelegateFactory + ); mController.addCallback(mCallback); } @@ -242,8 +261,8 @@ public class RecordingControllerTest extends SysuiTestCase { mActivityStarter, /* onStartRecordingClicked= */ null); - assertThat(dialog).isSameInstanceAs(mDialogFactory.mLastCreatedDialog); - assertThat(mDialogFactory.mLastDelegate) + assertThat(dialog).isSameInstanceAs(mScreenRecordSystemUIDialog); + assertThat(mScreenRecordPermissionDialogDelegate) .isInstanceOf(ScreenRecordPermissionDialogDelegate.class); } @@ -255,7 +274,7 @@ public class RecordingControllerTest extends SysuiTestCase { Dialog dialog = mController.createScreenRecordDialog(mContext, mFeatureFlags, mDialogTransitionAnimator, mActivityStarter, /* onStartRecordingClicked= */ null); - assertThat(dialog).isInstanceOf(ScreenRecordDialog.class); + assertThat(dialog).isEqualTo(mScreenRecordSystemUIDialog); } @Test @@ -267,7 +286,7 @@ public class RecordingControllerTest extends SysuiTestCase { Dialog dialog = mController.createScreenRecordDialog(mContext, mFeatureFlags, mDialogTransitionAnimator, mActivityStarter, /* onStartRecordingClicked= */ null); - assertThat(dialog).isInstanceOf(ScreenCaptureDisabledDialog.class); + assertThat(dialog).isEqualTo(mScreenCaptureDisabledDialog); } @Test @@ -284,8 +303,8 @@ public class RecordingControllerTest extends SysuiTestCase { mActivityStarter, /* onStartRecordingClicked= */ null); - assertThat(dialog).isSameInstanceAs(mDialogFactory.mLastCreatedDialog); - assertThat(mDialogFactory.mLastDelegate) + assertThat(dialog).isSameInstanceAs(mScreenRecordSystemUIDialog); + assertThat(mScreenRecordPermissionDialogDelegate) .isInstanceOf(ScreenRecordPermissionDialogDelegate.class); } diff --git a/packages/SystemUI/tests/src/com/android/systemui/screenrecord/ScreenRecordPermissionDialogDelegateTest.kt b/packages/SystemUI/tests/src/com/android/systemui/screenrecord/ScreenRecordPermissionDialogDelegateTest.kt index 90ced92c7f30..6e480746a076 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/screenrecord/ScreenRecordPermissionDialogDelegateTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/screenrecord/ScreenRecordPermissionDialogDelegateTest.kt @@ -39,6 +39,7 @@ import com.android.systemui.res.R import com.android.systemui.settings.UserContextProvider import com.android.systemui.statusbar.phone.SystemUIDialog import com.android.systemui.statusbar.phone.SystemUIDialogManager +import com.android.systemui.util.mockito.any import com.android.systemui.util.mockito.argumentCaptor import com.android.systemui.util.mockito.mock import com.google.common.truth.Truth.assertThat @@ -58,6 +59,7 @@ import org.mockito.MockitoAnnotations @TestableLooper.RunWithLooper(setAsMainLooper = true) class ScreenRecordPermissionDialogDelegateTest : SysuiTestCase() { + //@Mock private lateinit var dialogFactory: SystemUIDialog.Factory @Mock private lateinit var starter: ActivityStarter @Mock private lateinit var controller: RecordingController @Mock private lateinit var userContextProvider: UserContextProvider @@ -71,14 +73,17 @@ class ScreenRecordPermissionDialogDelegateTest : SysuiTestCase() { fun setUp() { MockitoAnnotations.initMocks(this) + whenever(flags.isEnabled(Flags.WM_ENABLE_PARTIAL_SCREEN_SHARING)).thenReturn(true) + val systemUIDialogFactory = - SystemUIDialog.Factory( - context, - Dependency.get(SystemUIDialogManager::class.java), - Dependency.get(SysUiState::class.java), - Dependency.get(BroadcastDispatcher::class.java), - Dependency.get(DialogTransitionAnimator::class.java), - ) + SystemUIDialog.Factory( + context, + Dependency.get(SystemUIDialogManager::class.java), + Dependency.get(SysUiState::class.java), + Dependency.get(BroadcastDispatcher::class.java), + Dependency.get(DialogTransitionAnimator::class.java), + ) + val delegate = ScreenRecordPermissionDialogDelegate( UserHandle.of(0), @@ -88,11 +93,9 @@ class ScreenRecordPermissionDialogDelegateTest : SysuiTestCase() { userContextProvider, onStartRecordingClicked, mediaProjectionMetricsLogger, - systemUIDialogFactory + systemUIDialogFactory, ) dialog = delegate.createDialog() - delegate.onCreate(dialog, savedInstanceState = null) - whenever(flags.isEnabled(Flags.WM_ENABLE_PARTIAL_SCREEN_SHARING)).thenReturn(true) } @After |