Merge "Remove main thread sendBroadcast calls" into tm-dev

This commit is contained in:
Jernej Virag
2022-03-09 16:37:22 +00:00
committed by Android (Google) Code Review
25 changed files with 410 additions and 104 deletions

View File

@@ -0,0 +1,132 @@
package com.android.systemui.broadcast
import android.annotation.AnyThread
import android.content.Context
import android.content.Intent
import android.os.Bundle
import android.os.UserHandle
import com.android.systemui.dagger.SysUISingleton
import com.android.systemui.dagger.qualifiers.Background
import com.android.systemui.util.wakelock.WakeLock
import java.util.concurrent.Executor
import javax.inject.Inject
/**
* SystemUI master Broadcast sender
*
* This class dispatches broadcasts on background thread to avoid synchronous call to binder. Use
* this class instead of calling [Context.sendBroadcast] directly.
*/
@SysUISingleton
class BroadcastSender @Inject constructor(
private val context: Context,
private val wakeLockBuilder: WakeLock.Builder,
@Background private val bgExecutor: Executor
) {
private val WAKE_LOCK_TAG = "SysUI:BroadcastSender"
private val WAKE_LOCK_SEND_REASON = "sendInBackground"
/**
* Sends broadcast via [Context.sendBroadcast] on background thread to avoid blocking
* synchronous binder call.
*/
@AnyThread
fun sendBroadcast(intent: Intent) {
sendInBackground {
context.sendBroadcast(intent)
}
}
/**
* Sends broadcast via [Context.sendBroadcast] on background thread to avoid blocking
* synchronous binder call.
*/
@AnyThread
fun sendBroadcast(intent: Intent, receiverPermission: String?) {
sendInBackground {
context.sendBroadcast(intent, receiverPermission)
}
}
/**
* Sends broadcast via [Context.sendBroadcastAsUser] on background thread to avoid blocking
* synchronous binder call.
*/
@AnyThread
fun sendBroadcastAsUser(intent: Intent, userHandle: UserHandle) {
sendInBackground {
context.sendBroadcastAsUser(intent, userHandle)
}
}
/**
* Sends broadcast via [Context.sendBroadcastAsUser] on background thread to avoid blocking
* synchronous binder call.
*/
@AnyThread
fun sendBroadcastAsUser(intent: Intent, userHandle: UserHandle, receiverPermission: String?) {
sendInBackground {
context.sendBroadcastAsUser(intent, userHandle, receiverPermission)
}
}
/**
* Sends broadcast via [Context.sendBroadcastAsUser] on background thread to avoid blocking
* synchronous binder call.
*/
@AnyThread
fun sendBroadcastAsUser(
intent: Intent,
userHandle: UserHandle,
receiverPermission: String?,
options: Bundle?
) {
sendInBackground {
context.sendBroadcastAsUser(intent, userHandle, receiverPermission, options)
}
}
/**
* Sends broadcast via [Context.sendBroadcastAsUser] on background thread to avoid blocking
* synchronous binder call.
*/
@AnyThread
fun sendBroadcastAsUser(
intent: Intent,
userHandle: UserHandle,
receiverPermission: String?,
appOp: Int
) {
sendInBackground {
context.sendBroadcastAsUser(intent, userHandle, receiverPermission, appOp)
}
}
/**
* Sends [Intent.ACTION_CLOSE_SYSTEM_DIALOGS] broadcast to the system.
*/
@AnyThread
fun closeSystemDialogs() {
sendInBackground {
context.sendBroadcast(Intent(Intent.ACTION_CLOSE_SYSTEM_DIALOGS))
}
}
/**
* Dispatches parameter on background executor while holding a wakelock.
*/
private fun sendInBackground(callable: () -> Unit) {
val broadcastWakelock = wakeLockBuilder.setTag(WAKE_LOCK_TAG)
.setMaxTimeout(5000)
.build()
broadcastWakelock.acquire(WAKE_LOCK_SEND_REASON)
bgExecutor.execute {
try {
callable.invoke()
} finally {
broadcastWakelock.release(WAKE_LOCK_SEND_REASON)
}
}
}
}

View File

@@ -16,11 +16,11 @@
package com.android.systemui.controls.ui
import android.annotation.AnyThread
import android.annotation.MainThread
import android.app.Dialog
import android.app.PendingIntent
import android.content.Context
import android.content.Intent
import android.content.pm.PackageManager
import android.content.pm.ResolveInfo
import android.database.ContentObserver
@@ -35,6 +35,7 @@ import android.service.controls.actions.FloatAction
import android.util.Log
import android.view.HapticFeedbackConstants
import com.android.internal.annotations.VisibleForTesting
import com.android.systemui.broadcast.BroadcastSender
import com.android.systemui.controls.ControlsMetricsLogger
import com.android.systemui.dagger.SysUISingleton
import com.android.systemui.dagger.qualifiers.Main
@@ -53,6 +54,7 @@ class ControlActionCoordinatorImpl @Inject constructor(
private val bgExecutor: DelayableExecutor,
@Main private val uiExecutor: DelayableExecutor,
private val activityStarter: ActivityStarter,
private val broadcastSender: BroadcastSender,
private val keyguardStateController: KeyguardStateController,
private val taskViewFactory: Optional<TaskViewFactory>,
private val controlsMetricsLogger: ControlsMetricsLogger,
@@ -199,11 +201,12 @@ class ControlActionCoordinatorImpl @Inject constructor(
false
}
@AnyThread
@VisibleForTesting
fun bouncerOrRun(action: Action, authRequired: Boolean) {
if (keyguardStateController.isShowing() && authRequired) {
if (isLocked) {
context.sendBroadcast(Intent(Intent.ACTION_CLOSE_SYSTEM_DIALOGS))
broadcastSender.closeSystemDialogs()
// pending actions will only run after the control state has been refreshed
pendingAction = action
@@ -233,7 +236,10 @@ class ControlActionCoordinatorImpl @Inject constructor(
// make sure the intent is valid before attempting to open the dialog
if (activities.isNotEmpty() && taskViewFactory.isPresent) {
taskViewFactory.get().create(context, uiExecutor, {
dialog = DetailDialog(activityContext, it, pendingIntent, cvh).also {
dialog = DetailDialog(
activityContext, broadcastSender,
it, pendingIntent, cvh
).also {
it.setOnDismissListener { _ -> dialog = null }
it.show()
}

View File

@@ -33,6 +33,7 @@ import android.view.WindowManager
import android.widget.ImageView
import com.android.internal.policy.ScreenDecorationsUtils
import com.android.systemui.R
import com.android.systemui.broadcast.BroadcastSender
import com.android.wm.shell.TaskView
/**
@@ -42,6 +43,7 @@ import com.android.wm.shell.TaskView
*/
class DetailDialog(
val activityContext: Context,
val broadcastSender: BroadcastSender,
val taskView: TaskView,
val pendingIntent: PendingIntent,
val cvh: ControlViewHolder
@@ -147,7 +149,7 @@ class DetailDialog(
// startActivity() below is called.
removeDetailTask()
dismiss()
context.sendBroadcast(Intent(Intent.ACTION_CLOSE_SYSTEM_DIALOGS))
broadcastSender.closeSystemDialogs()
pendingIntent.send()
}
}

View File

@@ -54,6 +54,7 @@ import com.android.settingslib.widget.AdaptiveIcon;
import com.android.systemui.R;
import com.android.systemui.animation.ActivityLaunchAnimator;
import com.android.systemui.animation.GhostedViewLaunchAnimatorController;
import com.android.systemui.broadcast.BroadcastSender;
import com.android.systemui.dagger.qualifiers.Background;
import com.android.systemui.media.dialog.MediaOutputDialogFactory;
import com.android.systemui.monet.ColorScheme;
@@ -108,6 +109,7 @@ public class MediaControlPanel {
private SeekBarObserver mSeekBarObserver;
protected final Executor mBackgroundExecutor;
private final ActivityStarter mActivityStarter;
private final BroadcastSender mBroadcastSender;
private Context mContext;
private MediaViewHolder mMediaViewHolder;
@@ -142,14 +144,16 @@ public class MediaControlPanel {
*/
@Inject
public MediaControlPanel(Context context, @Background Executor backgroundExecutor,
ActivityStarter activityStarter, MediaViewController mediaViewController,
SeekBarViewModel seekBarViewModel, Lazy<MediaDataManager> lazyMediaDataManager,
ActivityStarter activityStarter, BroadcastSender broadcastSender,
MediaViewController mediaViewController, SeekBarViewModel seekBarViewModel,
Lazy<MediaDataManager> lazyMediaDataManager,
MediaOutputDialogFactory mediaOutputDialogFactory,
MediaCarouselController mediaCarouselController,
FalsingManager falsingManager, MediaFlags mediaFlags, SystemClock systemClock) {
mContext = context;
mBackgroundExecutor = backgroundExecutor;
mActivityStarter = activityStarter;
mBroadcastSender = broadcastSender;
mSeekBarViewModel = seekBarViewModel;
mMediaViewController = mediaViewController;
mMediaDataManagerLazy = lazyMediaDataManager;
@@ -898,7 +902,7 @@ public class MediaControlPanel {
// Dismiss the card Smartspace data through Smartspace trampoline activity.
mContext.startActivity(dismissIntent);
} else {
mContext.sendBroadcast(dismissIntent);
mBroadcastSender.sendBroadcast(dismissIntent);
}
});

View File

@@ -21,6 +21,7 @@ import android.os.SystemProperties
import android.util.Log
import com.android.internal.annotations.VisibleForTesting
import com.android.systemui.broadcast.BroadcastDispatcher
import com.android.systemui.broadcast.BroadcastSender
import com.android.systemui.dagger.qualifiers.Main
import com.android.systemui.settings.CurrentUserTracker
import com.android.systemui.statusbar.NotificationLockscreenUserManager
@@ -56,6 +57,7 @@ internal val SMARTSPACE_MAX_AGE = SystemProperties
class MediaDataFilter @Inject constructor(
private val context: Context,
private val broadcastDispatcher: BroadcastDispatcher,
private val broadcastSender: BroadcastSender,
private val lockscreenUserManager: NotificationLockscreenUserManager,
@Main private val executor: Executor,
private val systemClock: SystemClock
@@ -249,7 +251,7 @@ class MediaDataFilter @Inject constructor(
// Dismiss the card Smartspace data through Smartspace trampoline activity.
context.startActivity(dismissIntent)
} else {
context.sendBroadcast(dismissIntent)
broadcastSender.sendBroadcast(dismissIntent)
}
smartspaceMediaData = EMPTY_SMARTSPACE_MEDIA_DATA.copy(
targetId = smartspaceMediaData.targetId, isValid = smartspaceMediaData.isValid)

View File

@@ -21,7 +21,6 @@ import static android.view.WindowInsets.Type.statusBars;
import android.app.WallpaperColors;
import android.content.Context;
import android.content.Intent;
import android.content.res.Configuration;
import android.graphics.Bitmap;
import android.graphics.Canvas;
@@ -55,6 +54,7 @@ import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import com.android.systemui.R;
import com.android.systemui.broadcast.BroadcastSender;
import com.android.systemui.statusbar.phone.SystemUIDialog;
/**
@@ -71,6 +71,7 @@ public abstract class MediaOutputBaseDialog extends SystemUIDialog implements
final Context mContext;
final MediaOutputController mMediaOutputController;
final BroadcastSender mBroadcastSender;
@VisibleForTesting
View mDialogView;
@@ -98,11 +99,13 @@ public abstract class MediaOutputBaseDialog extends SystemUIDialog implements
}
};
public MediaOutputBaseDialog(Context context, MediaOutputController mediaOutputController) {
public MediaOutputBaseDialog(Context context, BroadcastSender broadcastSender,
MediaOutputController mediaOutputController) {
super(context, R.style.Theme_SystemUI_Dialog_Media);
// Save the context that is wrapped with our theme.
mContext = getContext();
mBroadcastSender = broadcastSender;
mMediaOutputController = mediaOutputController;
mLayoutManager = new LinearLayoutManager(mContext);
mListMaxHeight = context.getResources().getDimensionPixelSize(
@@ -152,7 +155,7 @@ public abstract class MediaOutputBaseDialog extends SystemUIDialog implements
dismiss();
});
mAppButton.setOnClickListener(v -> {
mContext.sendBroadcast(new Intent(Intent.ACTION_CLOSE_SYSTEM_DIALOGS));
mBroadcastSender.closeSystemDialogs();
if (mMediaOutputController.getAppLaunchIntent() != null) {
mContext.startActivity(mMediaOutputController.getAppLaunchIntent());
}

View File

@@ -53,7 +53,6 @@ import androidx.core.graphics.drawable.IconCompat;
import androidx.mediarouter.media.MediaRouter;
import androidx.mediarouter.media.MediaRouterParams;
import com.android.internal.logging.UiEventLogger;
import com.android.settingslib.RestrictedLockUtilsInternal;
import com.android.settingslib.Utils;
import com.android.settingslib.bluetooth.BluetoothUtils;
@@ -70,7 +69,6 @@ import com.android.systemui.monet.ColorScheme;
import com.android.systemui.plugins.ActivityStarter;
import com.android.systemui.statusbar.notification.collection.NotificationEntry;
import com.android.systemui.statusbar.notification.collection.notifcollection.CommonNotifCollection;
import com.android.systemui.statusbar.phone.ShadeController;
import java.util.ArrayList;
import java.util.Collection;
@@ -95,12 +93,9 @@ public class MediaOutputController implements LocalMediaManager.DeviceCallback,
private final String mPackageName;
private final Context mContext;
private final MediaSessionManager mMediaSessionManager;
private final LocalBluetoothManager mLocalBluetoothManager;
private final ShadeController mShadeController;
private final ActivityStarter mActivityStarter;
private final DialogLaunchAnimator mDialogLaunchAnimator;
private final List<MediaDevice> mGroupMediaDevices = new CopyOnWriteArrayList<>();
private final boolean mAboveStatusbar;
private final CommonNotifCollection mNotifCollection;
@VisibleForTesting
final List<MediaDevice> mMediaDevices = new CopyOnWriteArrayList<>();
@@ -114,7 +109,6 @@ public class MediaOutputController implements LocalMediaManager.DeviceCallback,
LocalMediaManager mLocalMediaManager;
private MediaOutputMetricLogger mMetricLogger;
private UiEventLogger mUiEventLogger;
private int mColorActiveItem;
private int mColorInactiveItem;
@@ -124,23 +118,19 @@ public class MediaOutputController implements LocalMediaManager.DeviceCallback,
@Inject
public MediaOutputController(@NonNull Context context, String packageName,
boolean aboveStatusbar, MediaSessionManager mediaSessionManager, LocalBluetoothManager
lbm, ShadeController shadeController, ActivityStarter starter,
CommonNotifCollection notifCollection, UiEventLogger uiEventLogger,
MediaSessionManager mediaSessionManager, LocalBluetoothManager
lbm, ActivityStarter starter,
CommonNotifCollection notifCollection,
DialogLaunchAnimator dialogLaunchAnimator,
Optional<NearbyMediaDevicesManager> nearbyMediaDevicesManagerOptional) {
mContext = context;
mPackageName = packageName;
mMediaSessionManager = mediaSessionManager;
mLocalBluetoothManager = lbm;
mShadeController = shadeController;
mActivityStarter = starter;
mAboveStatusbar = aboveStatusbar;
mNotifCollection = notifCollection;
InfoMediaManager imm = new InfoMediaManager(mContext, packageName, null, lbm);
mLocalMediaManager = new LocalMediaManager(mContext, lbm, imm, packageName);
mMetricLogger = new MediaOutputMetricLogger(mContext, mPackageName);
mUiEventLogger = uiEventLogger;
mDialogLaunchAnimator = dialogLaunchAnimator;
mNearbyMediaDevicesManager = nearbyMediaDevicesManagerOptional.orElse(null);
mColorActiveItem = Utils.getColorStateListDefaultColor(mContext,
@@ -630,18 +620,6 @@ public class MediaOutputController implements LocalMediaManager.DeviceCallback,
mActivityStarter.startActivity(launchIntent, true, controller);
}
void launchMediaOutputGroupDialog(View mediaOutputDialog) {
// We show the output group dialog from the output dialog.
MediaOutputController controller = new MediaOutputController(mContext, mPackageName,
mAboveStatusbar, mMediaSessionManager, mLocalBluetoothManager, mShadeController,
mActivityStarter, mNotifCollection, mUiEventLogger, mDialogLaunchAnimator,
Optional.of(mNearbyMediaDevicesManager));
MediaOutputGroupDialog dialog = new MediaOutputGroupDialog(mContext, mAboveStatusbar,
controller);
mDialogLaunchAnimator.showFromView(dialog, mediaOutputDialog);
}
boolean isActiveRemoteDevice(@NonNull MediaDevice device) {
final List<String> features = device.getFeatures();
return (features.contains(MediaRoute2Info.FEATURE_REMOTE_PLAYBACK)

View File

@@ -28,6 +28,7 @@ import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.logging.UiEvent;
import com.android.internal.logging.UiEventLogger;
import com.android.systemui.R;
import com.android.systemui.broadcast.BroadcastSender;
import com.android.systemui.dagger.SysUISingleton;
/**
@@ -37,9 +38,9 @@ import com.android.systemui.dagger.SysUISingleton;
public class MediaOutputDialog extends MediaOutputBaseDialog {
final UiEventLogger mUiEventLogger;
MediaOutputDialog(Context context, boolean aboveStatusbar, MediaOutputController
mediaOutputController, UiEventLogger uiEventLogger) {
super(context, mediaOutputController);
MediaOutputDialog(Context context, boolean aboveStatusbar, BroadcastSender broadcastSender,
MediaOutputController mediaOutputController, UiEventLogger uiEventLogger) {
super(context, broadcastSender, mediaOutputController);
mUiEventLogger = uiEventLogger;
mAdapter = new MediaOutputAdapter(mMediaOutputController, this);
if (!aboveStatusbar) {

View File

@@ -22,10 +22,10 @@ import android.view.View
import com.android.internal.logging.UiEventLogger
import com.android.settingslib.bluetooth.LocalBluetoothManager
import com.android.systemui.animation.DialogLaunchAnimator
import com.android.systemui.broadcast.BroadcastSender
import com.android.systemui.media.nearby.NearbyMediaDevicesManager
import com.android.systemui.plugins.ActivityStarter
import com.android.systemui.statusbar.notification.collection.notifcollection.CommonNotifCollection
import com.android.systemui.statusbar.phone.ShadeController
import java.util.Optional
import javax.inject.Inject
@@ -36,8 +36,8 @@ class MediaOutputDialogFactory @Inject constructor(
private val context: Context,
private val mediaSessionManager: MediaSessionManager,
private val lbm: LocalBluetoothManager?,
private val shadeController: ShadeController,
private val starter: ActivityStarter,
private val broadcastSender: BroadcastSender,
private val notifCollection: CommonNotifCollection,
private val uiEventLogger: UiEventLogger,
private val dialogLaunchAnimator: DialogLaunchAnimator,
@@ -52,10 +52,11 @@ class MediaOutputDialogFactory @Inject constructor(
// Dismiss the previous dialog, if any.
mediaOutputDialog?.dismiss()
val controller = MediaOutputController(context, packageName, aboveStatusBar,
mediaSessionManager, lbm, shadeController, starter, notifCollection,
uiEventLogger, dialogLaunchAnimator, nearbyMediaDevicesManagerOptional)
val dialog = MediaOutputDialog(context, aboveStatusBar, controller, uiEventLogger)
val controller = MediaOutputController(context, packageName,
mediaSessionManager, lbm, starter, notifCollection,
dialogLaunchAnimator, nearbyMediaDevicesManagerOptional)
val dialog =
MediaOutputDialog(context, aboveStatusBar, broadcastSender, controller, uiEventLogger)
mediaOutputDialog = dialog
// Show the dialog.

View File

@@ -25,6 +25,7 @@ import android.view.WindowManager;
import androidx.core.graphics.drawable.IconCompat;
import com.android.systemui.R;
import com.android.systemui.broadcast.BroadcastSender;
/**
* Dialog for media output group.
@@ -32,9 +33,9 @@ import com.android.systemui.R;
// TODO(b/203073091): Remove this class once group logic been implemented.
public class MediaOutputGroupDialog extends MediaOutputBaseDialog {
MediaOutputGroupDialog(Context context, boolean aboveStatusbar, MediaOutputController
mediaOutputController) {
super(context, mediaOutputController);
MediaOutputGroupDialog(Context context, boolean aboveStatusbar, BroadcastSender broadcastSender,
MediaOutputController mediaOutputController) {
super(context, broadcastSender, mediaOutputController);
mMediaOutputController.resetGroupMediaDevices();
mAdapter = new MediaOutputGroupAdapter(mMediaOutputController);
if (!aboveStatusbar) {

View File

@@ -60,6 +60,7 @@ import com.android.settingslib.fuelgauge.BatterySaverUtils;
import com.android.settingslib.utils.PowerUtil;
import com.android.systemui.R;
import com.android.systemui.SystemUIApplication;
import com.android.systemui.broadcast.BroadcastSender;
import com.android.systemui.dagger.SysUISingleton;
import com.android.systemui.plugins.ActivityStarter;
import com.android.systemui.statusbar.phone.SystemUIDialog;
@@ -160,17 +161,20 @@ public class PowerNotificationWarnings implements PowerUI.WarningsUI {
@VisibleForTesting SystemUIDialog mUsbHighTempDialog;
private BatteryStateSnapshot mCurrentBatterySnapshot;
private ActivityStarter mActivityStarter;
private final BroadcastSender mBroadcastSender;
/**
*/
@Inject
public PowerNotificationWarnings(Context context, ActivityStarter activityStarter) {
public PowerNotificationWarnings(Context context, ActivityStarter activityStarter,
BroadcastSender broadcastSender) {
mContext = context;
mNoMan = mContext.getSystemService(NotificationManager.class);
mPowerMan = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
mKeyguard = mContext.getSystemService(KeyguardManager.class);
mReceiver.init();
mActivityStarter = activityStarter;
mBroadcastSender = broadcastSender;
mUseSevereDialog = mContext.getResources().getBoolean(R.bool.config_severe_battery_dialog);
}
@@ -258,7 +262,7 @@ public class PowerNotificationWarnings implements PowerUI.WarningsUI {
protected void showWarningNotification() {
if (showSevereLowBatteryDialog()) {
mContext.sendBroadcast(new Intent(ACTION_ENABLE_SEVERE_BATTERY_DIALOG)
mBroadcastSender.sendBroadcast(new Intent(ACTION_ENABLE_SEVERE_BATTERY_DIALOG)
.setPackage(mContext.getPackageName())
.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY
| Intent.FLAG_RECEIVER_FOREGROUND));
@@ -716,9 +720,9 @@ public class PowerNotificationWarnings implements PowerUI.WarningsUI {
mSaverConfirmation.dismiss();
}
// Also close the notification shade, if it's open.
mContext.sendBroadcast(
mBroadcastSender.sendBroadcast(
new Intent(Intent.ACTION_CLOSE_SYSTEM_DIALOGS)
.setFlags(Intent.FLAG_RECEIVER_FOREGROUND));
.setFlags(Intent.FLAG_RECEIVER_FOREGROUND));
final Uri uri = Uri.parse(getURL());
Context context = widget.getContext();

View File

@@ -88,10 +88,12 @@ import com.android.internal.logging.UiEventLogger;
import com.android.internal.policy.PhoneWindow;
import com.android.settingslib.applications.InterestingConfigChanges;
import com.android.systemui.R;
import com.android.systemui.broadcast.BroadcastSender;
import com.android.systemui.clipboardoverlay.ClipboardOverlayController;
import com.android.systemui.dagger.qualifiers.Main;
import com.android.systemui.screenshot.ScreenshotController.SavedImageData.ActionTransition;
import com.android.systemui.screenshot.TakeScreenshotService.RequestCallback;
import com.android.systemui.util.Assert;
import com.google.common.util.concurrent.ListenableFuture;
@@ -247,6 +249,7 @@ public class ScreenshotController {
private final ImageExporter mImageExporter;
private final Executor mMainExecutor;
private final ExecutorService mBgExecutor;
private final BroadcastSender mBroadcastSender;
private final WindowManager mWindowManager;
private final WindowManager.LayoutParams mWindowLayoutParams;
@@ -271,7 +274,6 @@ public class ScreenshotController {
private String mPackageName = "";
private BroadcastReceiver mCopyBroadcastReceiver;
/** Tracks config changes that require re-creating UI */
private final InterestingConfigChanges mConfigChanges = new InterestingConfigChanges(
ActivityInfo.CONFIG_ORIENTATION
@@ -293,7 +295,8 @@ public class ScreenshotController {
ScrollCaptureController scrollCaptureController,
LongScreenshotData longScreenshotHolder,
ActivityManager activityManager,
TimeoutHandler timeoutHandler) {
TimeoutHandler timeoutHandler,
BroadcastSender broadcastSender) {
mScreenshotSmartActions = screenshotSmartActions;
mNotificationsController = screenshotNotificationsController;
mScrollCaptureClient = scrollCaptureClient;
@@ -304,6 +307,7 @@ public class ScreenshotController {
mLongScreenshotHolder = longScreenshotHolder;
mIsLowRamDevice = activityManager.isLowRamDevice();
mBgExecutor = Executors.newSingleThreadExecutor();
mBroadcastSender = broadcastSender;
mScreenshotHandler = timeoutHandler;
mScreenshotHandler.setDefaultTimeoutMillis(SCREENSHOT_CORNER_DEFAULT_TIMEOUT_MILLIS);
@@ -355,8 +359,10 @@ public class ScreenshotController {
ClipboardOverlayController.SELF_PERMISSION, null, Context.RECEIVER_NOT_EXPORTED);
}
@MainThread
void takeScreenshotFullscreen(ComponentName topComponent, Consumer<Uri> finisher,
RequestCallback requestCallback) {
Assert.isMainThread();
mCurrentRequestCallback = requestCallback;
DisplayMetrics displayMetrics = new DisplayMetrics();
getDefaultDisplay().getRealMetrics(displayMetrics);
@@ -365,11 +371,12 @@ public class ScreenshotController {
new Rect(0, 0, displayMetrics.widthPixels, displayMetrics.heightPixels));
}
@MainThread
void handleImageAsScreenshot(Bitmap screenshot, Rect screenshotScreenBounds,
Insets visibleInsets, int taskId, int userId, ComponentName topComponent,
Consumer<Uri> finisher, RequestCallback requestCallback) {
// TODO: use task Id, userId, topComponent for smart handler
Assert.isMainThread();
if (screenshot == null) {
Log.e(TAG, "Got null bitmap from screenshot message");
mNotificationsController.notifyScreenshotError(
@@ -392,8 +399,10 @@ public class ScreenshotController {
/**
* Displays a screenshot selector
*/
@MainThread
void takeScreenshotPartial(ComponentName topComponent,
final Consumer<Uri> finisher, RequestCallback requestCallback) {
Assert.isMainThread();
mScreenshotView.reset();
mCurrentRequestCallback = requestCallback;
@@ -517,7 +526,7 @@ public class ScreenshotController {
saveScreenshot(screenshot, finisher, screenRect, Insets.NONE, topComponent, true);
mContext.sendBroadcast(new Intent(ClipboardOverlayController.SCREENSHOT_ACTION),
mBroadcastSender.sendBroadcast(new Intent(ClipboardOverlayController.SCREENSHOT_ACTION),
ClipboardOverlayController.SELF_PERMISSION);
}

View File

@@ -16,6 +16,7 @@
package com.android.systemui.statusbar.policy;
import android.annotation.WorkerThread;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
@@ -219,6 +220,7 @@ public class FlashlightControllerImpl implements FlashlightController {
new CameraManager.TorchCallback() {
@Override
@WorkerThread
public void onTorchModeUnavailable(String cameraId) {
if (TextUtils.equals(cameraId, mCameraId)) {
setCameraAvailable(false);
@@ -229,6 +231,7 @@ public class FlashlightControllerImpl implements FlashlightController {
}
@Override
@WorkerThread
public void onTorchModeChanged(String cameraId, boolean enabled) {
if (TextUtils.equals(cameraId, mCameraId)) {
setCameraAvailable(true);

View File

@@ -67,6 +67,7 @@ import com.android.systemui.R;
import com.android.systemui.SystemUISecondaryUserService;
import com.android.systemui.animation.DialogLaunchAnimator;
import com.android.systemui.broadcast.BroadcastDispatcher;
import com.android.systemui.broadcast.BroadcastSender;
import com.android.systemui.dagger.SysUISingleton;
import com.android.systemui.dagger.qualifiers.Background;
import com.android.systemui.dagger.qualifiers.Main;
@@ -122,6 +123,7 @@ public class UserSwitcherController implements Dumpable {
protected final Handler mHandler;
private final ActivityStarter mActivityStarter;
private final BroadcastDispatcher mBroadcastDispatcher;
private final BroadcastSender mBroadcastSender;
private final TelephonyListenerManager mTelephonyListenerManager;
private final InteractionJankMonitor mInteractionJankMonitor;
private final LatencyTracker mLatencyTracker;
@@ -165,6 +167,7 @@ public class UserSwitcherController implements Dumpable {
@Main Handler handler,
ActivityStarter activityStarter,
BroadcastDispatcher broadcastDispatcher,
BroadcastSender broadcastSender,
UiEventLogger uiEventLogger,
FalsingManager falsingManager,
TelephonyListenerManager telephonyListenerManager,
@@ -179,6 +182,7 @@ public class UserSwitcherController implements Dumpable {
mActivityManager = activityManager;
mUserTracker = userTracker;
mBroadcastDispatcher = broadcastDispatcher;
mBroadcastSender = broadcastSender;
mTelephonyListenerManager = telephonyListenerManager;
mUiEventLogger = uiEventLogger;
mFalsingManager = falsingManager;
@@ -1194,7 +1198,7 @@ public class UserSwitcherController implements Dumpable {
}
// Use broadcast instead of ShadeController, as this dialog may have started in
// another process and normal dagger bindings are not available
getContext().sendBroadcast(new Intent(Intent.ACTION_CLOSE_SYSTEM_DIALOGS));
mBroadcastSender.closeSystemDialogs();
getContext().startActivityAsUser(
CreateUserActivity.createIntentForStart(getContext()),
mUserTracker.getUserHandle());

View File

@@ -0,0 +1,145 @@
/*
* Copyright (C) 2022 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.broadcast
import android.content.Context
import android.content.Intent
import android.os.Bundle
import android.os.UserHandle
import android.testing.AndroidTestingRunner
import androidx.test.filters.SmallTest
import com.android.systemui.SysuiTestCase
import com.android.systemui.util.concurrency.FakeExecutor
import com.android.systemui.util.time.FakeSystemClock
import com.android.systemui.util.wakelock.WakeLockFake
import com.google.common.truth.Truth.assertThat
import org.junit.Before
import org.junit.Test
import org.junit.runner.RunWith
import org.mockito.ArgumentCaptor
import org.mockito.Mock
import org.mockito.Mockito.verify
import org.mockito.MockitoAnnotations
@RunWith(AndroidTestingRunner::class)
@SmallTest
class BroadcastSenderTest : SysuiTestCase() {
@Mock
private lateinit var mockContext: Context
private lateinit var broadcastSender: BroadcastSender
private lateinit var executor: FakeExecutor
private lateinit var wakeLock: WakeLockFake
@Before
fun setUp() {
MockitoAnnotations.initMocks(this)
executor = FakeExecutor(FakeSystemClock())
wakeLock = WakeLockFake()
val wakeLockBuilder = WakeLockFake.Builder(mContext)
wakeLockBuilder.setWakeLock(wakeLock)
broadcastSender = BroadcastSender(mockContext, wakeLockBuilder, executor)
}
@Test
fun sendBroadcast_dispatchesWithWakelock() {
val intent = Intent(Intent.ACTION_VIEW)
broadcastSender.sendBroadcast(intent)
runExecutorAssertingWakelock {
verify(mockContext).sendBroadcast(intent)
}
}
@Test
fun sendBroadcastWithPermission_dispatchesWithWakelock() {
val intent = Intent(Intent.ACTION_VIEW)
val permission = "Permission"
broadcastSender.sendBroadcast(intent, permission)
runExecutorAssertingWakelock {
verify(mockContext).sendBroadcast(intent, permission)
}
}
@Test
fun sendBroadcastAsUser_dispatchesWithWakelock() {
val intent = Intent(Intent.ACTION_VIEW)
broadcastSender.sendBroadcastAsUser(intent, UserHandle.ALL)
runExecutorAssertingWakelock {
verify(mockContext).sendBroadcastAsUser(intent, UserHandle.ALL)
}
}
@Test
fun sendBroadcastAsUserWithPermission_dispatchesWithWakelock() {
val intent = Intent(Intent.ACTION_VIEW)
val permission = "Permission"
broadcastSender.sendBroadcastAsUser(intent, UserHandle.ALL, permission)
runExecutorAssertingWakelock {
verify(mockContext).sendBroadcastAsUser(intent, UserHandle.ALL, permission)
}
}
@Test
fun sendBroadcastAsUserWithPermissionAndOptions_dispatchesWithWakelock() {
val intent = Intent(Intent.ACTION_VIEW)
val permission = "Permission"
val options = Bundle()
options.putString("key", "value")
broadcastSender.sendBroadcastAsUser(intent, UserHandle.ALL, permission, options)
runExecutorAssertingWakelock {
verify(mockContext).sendBroadcastAsUser(intent, UserHandle.ALL, permission, options)
}
}
@Test
fun sendBroadcastAsUserWithPermissionAndAppOp_dispatchesWithWakelock() {
val intent = Intent(Intent.ACTION_VIEW)
val permission = "Permission"
broadcastSender.sendBroadcastAsUser(intent, UserHandle.ALL, permission, 12)
runExecutorAssertingWakelock {
verify(mockContext).sendBroadcastAsUser(intent, UserHandle.ALL, permission, 12)
}
}
@Test
fun sendCloseSystemDialogs_dispatchesWithWakelock() {
val intentCaptor = ArgumentCaptor.forClass(Intent::class.java)
broadcastSender.closeSystemDialogs()
runExecutorAssertingWakelock {
verify(mockContext).sendBroadcast(intentCaptor.capture())
assertThat(intentCaptor.value.action).isEqualTo(Intent.ACTION_CLOSE_SYSTEM_DIALOGS)
}
}
private fun runExecutorAssertingWakelock(verification: () -> Unit) {
assertThat(wakeLock.isHeld).isTrue()
executor.runAllReady()
verification.invoke()
assertThat(wakeLock.isHeld).isFalse()
}
}

View File

@@ -23,6 +23,7 @@ import android.provider.Settings
import android.test.suitebuilder.annotation.SmallTest
import android.testing.AndroidTestingRunner
import com.android.systemui.SysuiTestCase
import com.android.systemui.broadcast.BroadcastSender
import com.android.systemui.controls.ControlsMetricsLogger
import com.android.systemui.plugins.ActivityStarter
import com.android.systemui.statusbar.VibratorHelper
@@ -62,6 +63,8 @@ class ControlActionCoordinatorImplTest : SysuiTestCase() {
@Mock
private lateinit var activityStarter: ActivityStarter
@Mock
private lateinit var broadcastSender: BroadcastSender
@Mock
private lateinit var taskViewFactory: Optional<TaskViewFactory>
@Mock(answer = Answers.RETURNS_DEEP_STUBS)
private lateinit var cvh: ControlViewHolder
@@ -94,6 +97,7 @@ class ControlActionCoordinatorImplTest : SysuiTestCase() {
bgExecutor,
uiExecutor,
activityStarter,
broadcastSender,
keyguardStateController,
taskViewFactory,
metricsLogger,

View File

@@ -21,6 +21,7 @@ import android.testing.AndroidTestingRunner
import android.testing.TestableLooper
import androidx.test.filters.SmallTest
import com.android.systemui.SysuiTestCase
import com.android.systemui.broadcast.BroadcastSender
import com.android.wm.shell.TaskView
import org.junit.Before
import org.junit.Test
@@ -39,6 +40,8 @@ class DetailDialogTest : SysuiTestCase() {
@Mock
private lateinit var taskView: TaskView
@Mock
private lateinit var broadcastSender: BroadcastSender
@Mock
private lateinit var controlViewHolder: ControlViewHolder
@Mock
private lateinit var pendingIntent: PendingIntent
@@ -63,6 +66,7 @@ class DetailDialogTest : SysuiTestCase() {
private fun createDialog(pendingIntent: PendingIntent): DetailDialog {
return DetailDialog(
mContext,
broadcastSender,
taskView,
pendingIntent,
controlViewHolder

View File

@@ -40,6 +40,7 @@ import androidx.lifecycle.LiveData
import androidx.test.filters.SmallTest
import com.android.systemui.R
import com.android.systemui.SysuiTestCase
import com.android.systemui.broadcast.BroadcastSender
import com.android.systemui.media.dialog.MediaOutputDialogFactory
import com.android.systemui.plugins.ActivityStarter
import com.android.systemui.plugins.FalsingManager
@@ -85,6 +86,7 @@ public class MediaControlPanelTest : SysuiTestCase() {
private lateinit var bgExecutor: FakeExecutor
@Mock private lateinit var activityStarter: ActivityStarter
@Mock private lateinit var broadcastSender: BroadcastSender
@Mock private lateinit var holder: PlayerViewHolder
@Mock private lateinit var sessionHolder: PlayerSessionViewHolder
@@ -144,8 +146,8 @@ public class MediaControlPanelTest : SysuiTestCase() {
whenever(mediaViewController.expandedLayout).thenReturn(expandedSet)
whenever(mediaViewController.collapsedLayout).thenReturn(collapsedSet)
player = MediaControlPanel(context, bgExecutor, activityStarter, mediaViewController,
seekBarViewModel, Lazy { mediaDataManager },
player = MediaControlPanel(context, bgExecutor, activityStarter, broadcastSender,
mediaViewController, seekBarViewModel, Lazy { mediaDataManager },
mediaOutputDialogFactory, mediaCarouselController, falsingManager, mediaFlags, clock)
whenever(seekBarViewModel.progress).thenReturn(seekBarData)

View File

@@ -23,6 +23,7 @@ import android.testing.AndroidTestingRunner
import android.testing.TestableLooper
import com.android.systemui.SysuiTestCase
import com.android.systemui.broadcast.BroadcastDispatcher
import com.android.systemui.broadcast.BroadcastSender
import com.android.systemui.statusbar.NotificationLockscreenUserManager
import com.android.systemui.util.time.FakeSystemClock
import com.google.common.truth.Truth.assertThat
@@ -65,6 +66,8 @@ class MediaDataFilterTest : SysuiTestCase() {
@Mock
private lateinit var broadcastDispatcher: BroadcastDispatcher
@Mock
private lateinit var broadcastSender: BroadcastSender
@Mock
private lateinit var mediaResumeListener: MediaResumeListener
@Mock
private lateinit var mediaDataManager: MediaDataManager
@@ -87,7 +90,7 @@ class MediaDataFilterTest : SysuiTestCase() {
fun setup() {
MockitoAnnotations.initMocks(this)
MediaPlayerData.clear()
mediaDataFilter = MediaDataFilter(context, broadcastDispatcher,
mediaDataFilter = MediaDataFilter(context, broadcastDispatcher, broadcastSender,
lockscreenUserManager, executor, clock)
mediaDataFilter.mediaDataManager = mediaDataManager
mediaDataFilter.addListener(listener)

View File

@@ -37,15 +37,14 @@ import android.widget.TextView;
import androidx.core.graphics.drawable.IconCompat;
import androidx.test.filters.SmallTest;
import com.android.internal.logging.UiEventLogger;
import com.android.settingslib.bluetooth.LocalBluetoothManager;
import com.android.systemui.R;
import com.android.systemui.SysuiTestCase;
import com.android.systemui.animation.DialogLaunchAnimator;
import com.android.systemui.broadcast.BroadcastSender;
import com.android.systemui.media.nearby.NearbyMediaDevicesManager;
import com.android.systemui.plugins.ActivityStarter;
import com.android.systemui.statusbar.notification.NotificationEntryManager;
import com.android.systemui.statusbar.phone.ShadeController;
import org.junit.Before;
import org.junit.Test;
@@ -64,11 +63,10 @@ public class MediaOutputBaseDialogTest extends SysuiTestCase {
private MediaOutputBaseAdapter mMediaOutputBaseAdapter = mock(MediaOutputBaseAdapter.class);
private MediaSessionManager mMediaSessionManager = mock(MediaSessionManager.class);
private LocalBluetoothManager mLocalBluetoothManager = mock(LocalBluetoothManager.class);
private ShadeController mShadeController = mock(ShadeController.class);
private ActivityStarter mStarter = mock(ActivityStarter.class);
private BroadcastSender mBroadcastSender = mock(BroadcastSender.class);
private NotificationEntryManager mNotificationEntryManager =
mock(NotificationEntryManager.class);
private final UiEventLogger mUiEventLogger = mock(UiEventLogger.class);
private NearbyMediaDevicesManager mNearbyMediaDevicesManager = mock(
NearbyMediaDevicesManager.class);
private final DialogLaunchAnimator mDialogLaunchAnimator = mock(DialogLaunchAnimator.class);
@@ -77,17 +75,16 @@ public class MediaOutputBaseDialogTest extends SysuiTestCase {
private MediaOutputController mMediaOutputController;
private int mHeaderIconRes;
private IconCompat mIconCompat;
private Drawable mAppSourceDrawable;
private CharSequence mHeaderTitle;
private CharSequence mHeaderSubtitle;
@Before
public void setUp() {
mMediaOutputController = new MediaOutputController(mContext, TEST_PACKAGE, false,
mMediaSessionManager, mLocalBluetoothManager, mShadeController, mStarter,
mNotificationEntryManager, mUiEventLogger, mDialogLaunchAnimator,
mMediaOutputController = new MediaOutputController(mContext, TEST_PACKAGE,
mMediaSessionManager, mLocalBluetoothManager, mStarter,
mNotificationEntryManager, mDialogLaunchAnimator,
Optional.of(mNearbyMediaDevicesManager));
mMediaOutputBaseDialogImpl = new MediaOutputBaseDialogImpl(mContext,
mMediaOutputBaseDialogImpl = new MediaOutputBaseDialogImpl(mContext, mBroadcastSender,
mMediaOutputController);
mMediaOutputBaseDialogImpl.onCreate(new Bundle());
}
@@ -178,15 +175,16 @@ public class MediaOutputBaseDialogTest extends SysuiTestCase {
class MediaOutputBaseDialogImpl extends MediaOutputBaseDialog {
MediaOutputBaseDialogImpl(Context context, MediaOutputController mediaOutputController) {
super(context, mediaOutputController);
MediaOutputBaseDialogImpl(Context context, BroadcastSender broadcastSender,
MediaOutputController mediaOutputController) {
super(context, broadcastSender, mediaOutputController);
mAdapter = mMediaOutputBaseAdapter;
}
@Override
Drawable getAppSourceIcon() {
return mAppSourceDrawable;
return null;
}
@Override

View File

@@ -45,7 +45,6 @@ import android.text.TextUtils;
import androidx.core.graphics.drawable.IconCompat;
import androidx.test.filters.SmallTest;
import com.android.internal.logging.UiEventLogger;
import com.android.settingslib.bluetooth.CachedBluetoothDeviceManager;
import com.android.settingslib.bluetooth.LocalBluetoothManager;
import com.android.settingslib.media.LocalMediaManager;
@@ -57,7 +56,6 @@ import com.android.systemui.media.nearby.NearbyMediaDevicesManager;
import com.android.systemui.plugins.ActivityStarter;
import com.android.systemui.statusbar.notification.collection.NotificationEntry;
import com.android.systemui.statusbar.notification.collection.notifcollection.CommonNotifCollection;
import com.android.systemui.statusbar.phone.ShadeController;
import com.google.common.collect.ImmutableList;
@@ -96,10 +94,8 @@ public class MediaOutputControllerTest extends SysuiTestCase {
private NearbyDevice mNearbyDevice2 = mock(NearbyDevice.class);
private MediaMetadata mMediaMetadata = mock(MediaMetadata.class);
private RoutingSessionInfo mRemoteSessionInfo = mock(RoutingSessionInfo.class);
private ShadeController mShadeController = mock(ShadeController.class);
private ActivityStarter mStarter = mock(ActivityStarter.class);
private CommonNotifCollection mNotifCollection = mock(CommonNotifCollection.class);
private final UiEventLogger mUiEventLogger = mock(UiEventLogger.class);
private final DialogLaunchAnimator mDialogLaunchAnimator = mock(DialogLaunchAnimator.class);
private final NearbyMediaDevicesManager mNearbyMediaDevicesManager = mock(
NearbyMediaDevicesManager.class);
@@ -124,9 +120,9 @@ public class MediaOutputControllerTest extends SysuiTestCase {
when(mLocalBluetoothManager.getCachedDeviceManager()).thenReturn(
mCachedBluetoothDeviceManager);
mMediaOutputController = new MediaOutputController(mSpyContext, TEST_PACKAGE_NAME, false,
mMediaSessionManager, mLocalBluetoothManager, mShadeController, mStarter,
mNotifCollection, mUiEventLogger, mDialogLaunchAnimator,
mMediaOutputController = new MediaOutputController(mSpyContext, TEST_PACKAGE_NAME,
mMediaSessionManager, mLocalBluetoothManager, mStarter,
mNotifCollection, mDialogLaunchAnimator,
Optional.of(mNearbyMediaDevicesManager));
mLocalMediaManager = spy(mMediaOutputController.mLocalMediaManager);
mMediaOutputController.mLocalMediaManager = mLocalMediaManager;
@@ -176,9 +172,9 @@ public class MediaOutputControllerTest extends SysuiTestCase {
@Test
public void start_withoutPackageName_verifyMediaControllerInit() {
mMediaOutputController = new MediaOutputController(mSpyContext, null, false,
mMediaSessionManager, mLocalBluetoothManager, mShadeController, mStarter,
mNotifCollection, mUiEventLogger, mDialogLaunchAnimator,
mMediaOutputController = new MediaOutputController(mSpyContext, null,
mMediaSessionManager, mLocalBluetoothManager, mStarter,
mNotifCollection, mDialogLaunchAnimator,
Optional.of(mNearbyMediaDevicesManager));
mMediaOutputController.start(mCb);
@@ -205,9 +201,9 @@ public class MediaOutputControllerTest extends SysuiTestCase {
@Test
public void stop_withoutPackageName_verifyMediaControllerDeinit() {
mMediaOutputController = new MediaOutputController(mSpyContext, null, false,
mMediaSessionManager, mLocalBluetoothManager, mShadeController, mStarter,
mNotifCollection, mUiEventLogger, mDialogLaunchAnimator,
mMediaOutputController = new MediaOutputController(mSpyContext, null,
mMediaSessionManager, mLocalBluetoothManager, mStarter,
mNotifCollection, mDialogLaunchAnimator,
Optional.of(mNearbyMediaDevicesManager));
mMediaOutputController.start(mCb);
@@ -510,9 +506,9 @@ public class MediaOutputControllerTest extends SysuiTestCase {
@Test
public void getNotificationLargeIcon_withoutPackageName_returnsNull() {
mMediaOutputController = new MediaOutputController(mSpyContext, null, false,
mMediaSessionManager, mLocalBluetoothManager, mShadeController, mStarter,
mNotifCollection, mUiEventLogger, mDialogLaunchAnimator,
mMediaOutputController = new MediaOutputController(mSpyContext, null,
mMediaSessionManager, mLocalBluetoothManager, mStarter,
mNotifCollection, mDialogLaunchAnimator,
Optional.of(mNearbyMediaDevicesManager));
assertThat(mMediaOutputController.getNotificationIcon()).isNull();

View File

@@ -37,10 +37,10 @@ import com.android.settingslib.media.LocalMediaManager;
import com.android.settingslib.media.MediaDevice;
import com.android.systemui.SysuiTestCase;
import com.android.systemui.animation.DialogLaunchAnimator;
import com.android.systemui.broadcast.BroadcastSender;
import com.android.systemui.media.nearby.NearbyMediaDevicesManager;
import com.android.systemui.plugins.ActivityStarter;
import com.android.systemui.statusbar.notification.NotificationEntryManager;
import com.android.systemui.statusbar.phone.ShadeController;
import org.junit.After;
import org.junit.Before;
@@ -61,8 +61,8 @@ public class MediaOutputDialogTest extends SysuiTestCase {
// Mock
private final MediaSessionManager mMediaSessionManager = mock(MediaSessionManager.class);
private final LocalBluetoothManager mLocalBluetoothManager = mock(LocalBluetoothManager.class);
private final ShadeController mShadeController = mock(ShadeController.class);
private final ActivityStarter mStarter = mock(ActivityStarter.class);
private final BroadcastSender mBroadcastSender = mock(BroadcastSender.class);
private final LocalMediaManager mLocalMediaManager = mock(LocalMediaManager.class);
private final MediaDevice mMediaDevice = mock(MediaDevice.class);
private final NotificationEntryManager mNotificationEntryManager =
@@ -78,12 +78,12 @@ public class MediaOutputDialogTest extends SysuiTestCase {
@Before
public void setUp() {
mMediaOutputController = new MediaOutputController(mContext, TEST_PACKAGE, false,
mMediaSessionManager, mLocalBluetoothManager, mShadeController, mStarter,
mNotificationEntryManager, mUiEventLogger, mDialogLaunchAnimator,
mMediaOutputController = new MediaOutputController(mContext, TEST_PACKAGE,
mMediaSessionManager, mLocalBluetoothManager, mStarter,
mNotificationEntryManager, mDialogLaunchAnimator,
Optional.of(mNearbyMediaDevicesManager));
mMediaOutputController.mLocalMediaManager = mLocalMediaManager;
mMediaOutputDialog = new MediaOutputDialog(mContext, false,
mMediaOutputDialog = new MediaOutputDialog(mContext, false, mBroadcastSender,
mMediaOutputController, mUiEventLogger);
mMediaOutputDialog.show();
@@ -129,7 +129,7 @@ public class MediaOutputDialogTest extends SysuiTestCase {
// Check the visibility metric logging by creating a new MediaOutput dialog,
// and verify if the calling times increases.
public void onCreate_ShouldLogVisibility() {
MediaOutputDialog testDialog = new MediaOutputDialog(mContext, false,
MediaOutputDialog testDialog = new MediaOutputDialog(mContext, false, mBroadcastSender,
mMediaOutputController, mUiEventLogger);
testDialog.show();

View File

@@ -28,17 +28,16 @@ import android.view.View;
import androidx.test.filters.SmallTest;
import com.android.internal.logging.UiEventLogger;
import com.android.settingslib.bluetooth.LocalBluetoothManager;
import com.android.settingslib.media.LocalMediaManager;
import com.android.settingslib.media.MediaDevice;
import com.android.systemui.R;
import com.android.systemui.SysuiTestCase;
import com.android.systemui.animation.DialogLaunchAnimator;
import com.android.systemui.broadcast.BroadcastSender;
import com.android.systemui.media.nearby.NearbyMediaDevicesManager;
import com.android.systemui.plugins.ActivityStarter;
import com.android.systemui.statusbar.notification.NotificationEntryManager;
import com.android.systemui.statusbar.phone.ShadeController;
import org.junit.After;
import org.junit.Before;
@@ -59,14 +58,13 @@ public class MediaOutputGroupDialogTest extends SysuiTestCase {
// Mock
private MediaSessionManager mMediaSessionManager = mock(MediaSessionManager.class);
private LocalBluetoothManager mLocalBluetoothManager = mock(LocalBluetoothManager.class);
private ShadeController mShadeController = mock(ShadeController.class);
private ActivityStarter mStarter = mock(ActivityStarter.class);
private BroadcastSender mBroadcastSender = mock(BroadcastSender.class);
private LocalMediaManager mLocalMediaManager = mock(LocalMediaManager.class);
private MediaDevice mMediaDevice = mock(MediaDevice.class);
private MediaDevice mMediaDevice1 = mock(MediaDevice.class);
private NotificationEntryManager mNotificationEntryManager =
mock(NotificationEntryManager.class);
private final UiEventLogger mUiEventLogger = mock(UiEventLogger.class);
private final DialogLaunchAnimator mDialogLaunchAnimator = mock(DialogLaunchAnimator.class);
private NearbyMediaDevicesManager mNearbyMediaDevicesManager = mock(
NearbyMediaDevicesManager.class);
@@ -77,12 +75,12 @@ public class MediaOutputGroupDialogTest extends SysuiTestCase {
@Before
public void setUp() {
mMediaOutputController = new MediaOutputController(mContext, TEST_PACKAGE, false,
mMediaSessionManager, mLocalBluetoothManager, mShadeController, mStarter,
mNotificationEntryManager, mUiEventLogger, mDialogLaunchAnimator,
mMediaOutputController = new MediaOutputController(mContext, TEST_PACKAGE,
mMediaSessionManager, mLocalBluetoothManager, mStarter,
mNotificationEntryManager, mDialogLaunchAnimator,
Optional.of(mNearbyMediaDevicesManager));
mMediaOutputController.mLocalMediaManager = mLocalMediaManager;
mMediaOutputGroupDialog = new MediaOutputGroupDialog(mContext, false,
mMediaOutputGroupDialog = new MediaOutputGroupDialog(mContext, false, mBroadcastSender,
mMediaOutputController);
mMediaOutputGroupDialog.show();
when(mLocalMediaManager.getSelectedMediaDevice()).thenReturn(mMediaDevices);

View File

@@ -37,6 +37,7 @@ import androidx.test.runner.AndroidJUnit4;
import com.android.internal.messages.nano.SystemMessageProto.SystemMessage;
import com.android.systemui.SysuiTestCase;
import com.android.systemui.broadcast.BroadcastSender;
import com.android.systemui.plugins.ActivityStarter;
import com.android.systemui.util.NotificationChannels;
@@ -59,7 +60,9 @@ public class PowerNotificationWarningsTest extends SysuiTestCase {
// Test Instance.
mContext.addMockSystemService(NotificationManager.class, mMockNotificationManager);
ActivityStarter starter = mDependency.injectMockDependency(ActivityStarter.class);
mPowerNotificationWarnings = new PowerNotificationWarnings(mContext, starter);
BroadcastSender broadcastSender = mDependency.injectMockDependency(BroadcastSender.class);
mPowerNotificationWarnings = new PowerNotificationWarnings(mContext, starter,
broadcastSender);
BatteryStateSnapshot snapshot = new BatteryStateSnapshot(100, false, false, 1,
BatteryManager.BATTERY_HEALTH_GOOD, 5, 15);
mPowerNotificationWarnings.updateSnapshot(snapshot);

View File

@@ -41,6 +41,7 @@ import com.android.systemui.R
import com.android.systemui.SysuiTestCase
import com.android.systemui.animation.DialogLaunchAnimator
import com.android.systemui.broadcast.BroadcastDispatcher
import com.android.systemui.broadcast.BroadcastSender
import com.android.systemui.dump.DumpManager
import com.android.systemui.plugins.ActivityStarter
import com.android.systemui.plugins.FalsingManager
@@ -83,6 +84,7 @@ class UserSwitcherControllerTest : SysuiTestCase() {
@Mock private lateinit var userManager: UserManager
@Mock private lateinit var activityStarter: ActivityStarter
@Mock private lateinit var broadcastDispatcher: BroadcastDispatcher
@Mock private lateinit var broadcastSender: BroadcastSender
@Mock private lateinit var telephonyListenerManager: TelephonyListenerManager
@Mock private lateinit var secureSettings: SecureSettings
@Mock private lateinit var falsingManager: FalsingManager
@@ -159,6 +161,7 @@ class UserSwitcherControllerTest : SysuiTestCase() {
handler,
activityStarter,
broadcastDispatcher,
broadcastSender,
uiEventLogger,
falsingManager,
telephonyListenerManager,