summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--core/res/res/values/config.xml4
-rw-r--r--core/res/res/values/symbols.xml1
-rw-r--r--packages/SystemUI/src/com/android/systemui/mediaprojection/devicepolicy/ScreenCaptureDisabledDialog.kt33
-rw-r--r--packages/SystemUI/src/com/android/systemui/mediaprojection/devicepolicy/ScreenCaptureDisabledDialogDelegate.kt44
-rw-r--r--packages/SystemUI/src/com/android/systemui/mediaprojection/permission/MediaProjectionPermissionActivity.java15
-rw-r--r--packages/SystemUI/src/com/android/systemui/qs/tiles/dialog/InternetDialogDelegate.java3
-rw-r--r--packages/SystemUI/src/com/android/systemui/recordissue/RecordIssueDialogDelegate.kt5
-rw-r--r--packages/SystemUI/src/com/android/systemui/screenrecord/RecordingController.java52
-rw-r--r--packages/SystemUI/src/com/android/systemui/screenrecord/ScreenRecordDialogDelegate.java (renamed from packages/SystemUI/src/com/android/systemui/screenrecord/ScreenRecordDialog.java)61
-rw-r--r--packages/SystemUI/src/com/android/systemui/screenrecord/ScreenRecordPermissionDialogDelegate.kt30
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/SystemUIDialog.java2
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/recordissue/RecordIssueDialogDelegateTest.kt38
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/screenrecord/RecordingControllerTest.java55
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/screenrecord/ScreenRecordPermissionDialogDelegateTest.kt23
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