Convert all SCREEN_OFF receivers to BroadcastDispatcher

All broadcast receivers that filter for ACTION_SCREEN_OFF have been converted
to register with BroadcastDispatcher instead of Context. In many cases
this involves other Intents being covered by BroadcastDispatcher.

Additionally, UserBroadcastDispatcher propagates the PendingResult so
the individual receivers can access it (mostly to query getSendingUser).

Test: enable logging of BroadcastQueue for ACTION_SCREEN_OFF only shows 2
receivers (user 0 and user -1)
Test: Dump of BroadcastDispatcher shows all the classes registered to it
Test: enable logging of UserBroadcastDispatcher
Test: atest PowerUITest StatusBarTest VolumeDialogControllerImplTest
        SystemUIDialogTest NavigationBarFragmentTest
Bug: 134566046

Change-Id: I0caa2a6b53f3f6b360bf2e8598dde29c45f1d4e3
This commit is contained in:
Fabian Kozynski
2019-09-24 15:38:08 -04:00
parent a620de30f4
commit ff5e91f252
19 changed files with 229 additions and 53 deletions

View File

@@ -17,6 +17,7 @@
package com.android.systemui;
import com.android.systemui.keyguard.KeyguardViewMediator;
import com.android.systemui.power.PowerUI;
import dagger.Binds;
import dagger.Module;
@@ -33,4 +34,10 @@ public abstract class SystemUIBinder {
@IntoMap
@ClassKey(KeyguardViewMediator.class)
public abstract SystemUI bindKeyguardViewMediator(KeyguardViewMediator sysui);
/** Inject into PowerUI. */
@Binds
@IntoMap
@ClassKey(PowerUI.class)
public abstract SystemUI bindPowerUI(PowerUI sysui);
}

View File

@@ -75,7 +75,7 @@ open class BroadcastDispatcher @Inject constructor (
* @param filter A filter to determine what broadcasts should be dispatched to this receiver.
* It will only take into account actions and categories for filtering.
* @param handler A handler to dispatch [BroadcastReceiver.onReceive]. By default, it is the
* main handler.
* main handler. Pass `null` to use the default.
* @param user A user handle to determine which broadcast should be dispatched to this receiver.
* By default, it is the current user.
*/
@@ -83,10 +83,12 @@ open class BroadcastDispatcher @Inject constructor (
fun registerReceiver(
receiver: BroadcastReceiver,
filter: IntentFilter,
handler: Handler = mainHandler,
handler: Handler? = mainHandler,
user: UserHandle = context.user
) {
this.handler.obtainMessage(MSG_ADD_RECEIVER, ReceiverData(receiver, filter, handler, user))
this.handler
.obtainMessage(MSG_ADD_RECEIVER,
ReceiverData(receiver, filter, handler ?: mainHandler, user))
.sendToTarget()
}

View File

@@ -34,7 +34,7 @@ import java.util.concurrent.atomic.AtomicBoolean
private const val MSG_REGISTER_RECEIVER = 0
private const val MSG_UNREGISTER_RECEIVER = 1
private const val TAG = "UniversalReceiver"
private const val TAG = "UserBroadcastDispatcher"
private const val DEBUG = false
/**
@@ -97,7 +97,7 @@ class UserBroadcastDispatcher(
private val receiverToReceiverData = ArrayMap<BroadcastReceiver, MutableSet<ReceiverData>>()
override fun onReceive(context: Context, intent: Intent) {
bgHandler.post(HandleBroadcastRunnable(actionsToReceivers, context, intent))
bgHandler.post(HandleBroadcastRunnable(actionsToReceivers, context, intent, pendingResult))
}
/**
@@ -160,7 +160,8 @@ class UserBroadcastDispatcher(
private class HandleBroadcastRunnable(
val actionsToReceivers: Map<String, Set<ReceiverData>>,
val context: Context,
val intent: Intent
val intent: Intent,
val pendingResult: PendingResult
) : Runnable {
override fun run() {
if (DEBUG) Log.w(TAG, "Dispatching $intent")
@@ -171,6 +172,7 @@ class UserBroadcastDispatcher(
?.forEach {
it.handler.post {
if (DEBUG) Log.w(TAG, "Dispatching to ${it.receiver}")
it.receiver.pendingResult = pendingResult
it.receiver.onReceive(context, intent)
}
}

View File

@@ -90,6 +90,7 @@ import com.android.systemui.Dependency;
import com.android.systemui.Interpolators;
import com.android.systemui.MultiListLayout;
import com.android.systemui.MultiListLayout.MultiListAdapter;
import com.android.systemui.broadcast.BroadcastDispatcher;
import com.android.systemui.colorextraction.SysuiColorExtractor;
import com.android.systemui.plugins.ActivityStarter;
import com.android.systemui.plugins.GlobalActions.GlobalActionsManager;
@@ -187,7 +188,7 @@ public class GlobalActionsDialog implements DialogInterface.OnDismissListener,
filter.addAction(Intent.ACTION_CLOSE_SYSTEM_DIALOGS);
filter.addAction(Intent.ACTION_SCREEN_OFF);
filter.addAction(TelephonyIntents.ACTION_EMERGENCY_CALLBACK_MODE_CHANGED);
context.registerReceiver(mBroadcastReceiver, filter);
Dependency.get(BroadcastDispatcher.class).registerReceiver(mBroadcastReceiver, filter);
ConnectivityManager cm = (ConnectivityManager)
context.getSystemService(Context.CONNECTIVITY_SERVICE);

View File

@@ -45,6 +45,7 @@ import com.android.settingslib.utils.ThreadUtils;
import com.android.systemui.Dependency;
import com.android.systemui.R;
import com.android.systemui.SystemUI;
import com.android.systemui.broadcast.BroadcastDispatcher;
import com.android.systemui.statusbar.phone.StatusBar;
import java.io.FileDescriptor;
@@ -53,6 +54,8 @@ import java.time.Duration;
import java.util.Arrays;
import java.util.concurrent.Future;
import javax.inject.Inject;
public class PowerUI extends SystemUI {
static final String TAG = "PowerUI";
@@ -97,6 +100,12 @@ public class PowerUI extends SystemUI {
private IThermalEventListener mSkinThermalEventListener;
private IThermalEventListener mUsbThermalEventListener;
private final BroadcastDispatcher mBroadcastDispatcher;
@Inject
public PowerUI(BroadcastDispatcher broadcastDispatcher) {
mBroadcastDispatcher = broadcastDispatcher;
}
public void start() {
mPowerManager = (PowerManager) mContext.getSystemService(Context.POWER_SERVICE);
@@ -211,7 +220,7 @@ public class PowerUI extends SystemUI {
filter.addAction(Intent.ACTION_SCREEN_OFF);
filter.addAction(Intent.ACTION_SCREEN_ON);
filter.addAction(Intent.ACTION_USER_SWITCHED);
mContext.registerReceiver(this, filter, null, mHandler);
mBroadcastDispatcher.registerReceiver(this, filter, mHandler);
}
@Override

View File

@@ -61,8 +61,10 @@ import android.view.animation.DecelerateInterpolator;
import android.widget.ImageView;
import android.widget.TextView;
import com.android.systemui.Dependency;
import com.android.systemui.Prefs;
import com.android.systemui.R;
import com.android.systemui.broadcast.BroadcastDispatcher;
import com.android.systemui.shared.recents.IOverviewProxy;
import com.android.systemui.shared.system.ActivityManagerWrapper;
import com.android.systemui.shared.system.QuickStepContract;
@@ -245,10 +247,15 @@ public class RecentsOnboarding {
private final View.OnAttachStateChangeListener mOnAttachStateChangeListener
= new View.OnAttachStateChangeListener() {
private final BroadcastDispatcher mBroadcastDispatcher = Dependency.get(
BroadcastDispatcher.class);
@Override
public void onViewAttachedToWindow(View view) {
if (view == mLayout) {
mContext.registerReceiver(mReceiver, new IntentFilter(Intent.ACTION_SCREEN_OFF));
mBroadcastDispatcher.registerReceiver(mReceiver,
new IntentFilter(Intent.ACTION_SCREEN_OFF));
mLayoutAttachedToWindow = true;
if (view.getTag().equals(R.string.recents_swipe_up_onboarding)) {
mHasDismissedSwipeUpTip = false;
@@ -273,7 +280,7 @@ public class RecentsOnboarding {
}
mOverviewOpenedCountSinceQuickScrubTipDismiss = 0;
}
mContext.unregisterReceiver(mReceiver);
mBroadcastDispatcher.unregisterReceiver(mReceiver);
}
}
};
@@ -335,10 +342,11 @@ public class RecentsOnboarding {
private void notifyOnTip(int action, int target) {
try {
IOverviewProxy overviewProxy = mOverviewProxyService.getProxy();
if(overviewProxy != null) {
if (overviewProxy != null) {
overviewProxy.onTip(action, target);
}
} catch (RemoteException e) {}
} catch (RemoteException e) {
}
}
public void onNavigationModeChanged(int mode) {

View File

@@ -47,6 +47,7 @@ import android.widget.TextView;
import com.android.systemui.Dependency;
import com.android.systemui.R;
import com.android.systemui.SysUiServiceProvider;
import com.android.systemui.broadcast.BroadcastDispatcher;
import com.android.systemui.shared.system.QuickStepContract;
import com.android.systemui.shared.system.WindowManagerWrapper;
import com.android.systemui.statusbar.phone.NavigationBarView;
@@ -159,6 +160,8 @@ public class ScreenPinningRequest implements View.OnClickListener,
private ValueAnimator mColorAnim;
private ViewGroup mLayout;
private boolean mShowCancel;
private final BroadcastDispatcher mBroadcastDispatcher =
Dependency.get(BroadcastDispatcher.class);
public RequestWindowView(Context context, boolean showCancel) {
super(context);
@@ -212,7 +215,7 @@ public class ScreenPinningRequest implements View.OnClickListener,
IntentFilter filter = new IntentFilter(Intent.ACTION_CONFIGURATION_CHANGED);
filter.addAction(Intent.ACTION_USER_SWITCHED);
filter.addAction(Intent.ACTION_SCREEN_OFF);
mContext.registerReceiver(mReceiver, filter);
mBroadcastDispatcher.registerReceiver(mReceiver, filter);
}
private void inflateView(int rotation) {
@@ -313,7 +316,7 @@ public class ScreenPinningRequest implements View.OnClickListener,
@Override
public void onDetachedFromWindow() {
mContext.unregisterReceiver(mReceiver);
mBroadcastDispatcher.unregisterReceiver(mReceiver);
}
protected void onConfigurationChanged() {

View File

@@ -89,6 +89,7 @@ import com.android.systemui.R;
import com.android.systemui.ScreenDecorations;
import com.android.systemui.SysUiServiceProvider;
import com.android.systemui.assist.AssistManager;
import com.android.systemui.broadcast.BroadcastDispatcher;
import com.android.systemui.fragments.FragmentHostManager;
import com.android.systemui.fragments.FragmentHostManager.FragmentListener;
import com.android.systemui.model.SysUiState;
@@ -170,6 +171,8 @@ public class NavigationBarFragment extends LifecycleFragment implements Callback
private OverviewProxyService mOverviewProxyService;
private final BroadcastDispatcher mBroadcastDispatcher;
@VisibleForTesting
public int mDisplayId;
private boolean mIsOnDefaultDisplay;
@@ -248,7 +251,8 @@ public class NavigationBarFragment extends LifecycleFragment implements Callback
AssistManager assistManager, OverviewProxyService overviewProxyService,
NavigationModeController navigationModeController,
StatusBarStateController statusBarStateController,
SysUiState sysUiFlagsContainer) {
SysUiState sysUiFlagsContainer,
BroadcastDispatcher broadcastDispatcher) {
mAccessibilityManagerWrapper = accessibilityManagerWrapper;
mDeviceProvisionedController = deviceProvisionedController;
mStatusBarStateController = statusBarStateController;
@@ -258,6 +262,7 @@ public class NavigationBarFragment extends LifecycleFragment implements Callback
mAssistantAvailable = mAssistManager.getAssistInfoForUser(UserHandle.USER_CURRENT) != null;
mOverviewProxyService = overviewProxyService;
mNavBarMode = navigationModeController.addListener(this);
mBroadcastDispatcher = broadcastDispatcher;
}
// ----- Fragment Lifecycle Callbacks -----
@@ -334,7 +339,8 @@ public class NavigationBarFragment extends LifecycleFragment implements Callback
IntentFilter filter = new IntentFilter(Intent.ACTION_SCREEN_OFF);
filter.addAction(Intent.ACTION_SCREEN_ON);
filter.addAction(Intent.ACTION_USER_SWITCHED);
getContext().registerReceiverAsUser(mBroadcastReceiver, UserHandle.ALL, filter, null, null);
mBroadcastDispatcher.registerReceiver(mBroadcastReceiver, filter, Handler.getMain(),
UserHandle.ALL);
notifyNavigationBarScreenOn();
mOverviewProxyService.addCallback(mOverviewProxyListener);
@@ -372,7 +378,7 @@ public class NavigationBarFragment extends LifecycleFragment implements Callback
mNavigationBarView.getLightTransitionsController().destroy(getContext());
}
mOverviewProxyService.removeCallback(mOverviewProxyListener);
getContext().unregisterReceiver(mBroadcastReceiver);
mBroadcastDispatcher.unregisterReceiver(mBroadcastReceiver);
}
@Override

View File

@@ -147,6 +147,7 @@ import com.android.systemui.SystemUIFactory;
import com.android.systemui.UiOffloadThread;
import com.android.systemui.appops.AppOpsController;
import com.android.systemui.assist.AssistManager;
import com.android.systemui.broadcast.BroadcastDispatcher;
import com.android.systemui.bubbles.BubbleController;
import com.android.systemui.charging.WirelessChargingAnimation;
import com.android.systemui.classifier.FalsingLog;
@@ -222,7 +223,6 @@ import com.android.systemui.statusbar.policy.DeviceProvisionedController.DeviceP
import com.android.systemui.statusbar.policy.ExtensionController;
import com.android.systemui.statusbar.policy.HeadsUpManager;
import com.android.systemui.statusbar.policy.KeyguardStateController;
import com.android.systemui.statusbar.policy.KeyguardStateControllerImpl;
import com.android.systemui.statusbar.policy.KeyguardUserSwitcher;
import com.android.systemui.statusbar.policy.NetworkController;
import com.android.systemui.statusbar.policy.OnHeadsUpChangedListener;
@@ -391,6 +391,9 @@ public class StatusBar extends SystemUI implements DemoMode,
@Named(ALLOW_NOTIFICATION_LONG_PRESS_NAME)
boolean mAllowNotificationLongPress;
@VisibleForTesting
BroadcastDispatcher mBroadcastDispatcher;
// expanded notifications
protected NotificationPanelView mNotificationPanel; // the sliding/resizing panel within the notification window
@@ -665,6 +668,7 @@ public class StatusBar extends SystemUI implements DemoMode,
mBubbleController = Dependency.get(BubbleController.class);
mBubbleController.setExpandListener(mBubbleExpandListener);
mActivityIntentHelper = new ActivityIntentHelper(mContext);
mBroadcastDispatcher = Dependency.get(BroadcastDispatcher.class);
KeyguardSliceProvider sliceProvider = KeyguardSliceProvider.getAttachedInstance();
if (sliceProvider != null) {
sliceProvider.initDependencies(mMediaManager, mStatusBarStateController,
@@ -1046,11 +1050,7 @@ public class StatusBar extends SystemUI implements DemoMode,
}
// receive broadcasts
IntentFilter filter = new IntentFilter();
filter.addAction(Intent.ACTION_CLOSE_SYSTEM_DIALOGS);
filter.addAction(Intent.ACTION_SCREEN_OFF);
filter.addAction(DevicePolicyManager.ACTION_SHOW_DEVICE_MONITORING_DIALOG);
context.registerReceiverAsUser(mBroadcastReceiver, UserHandle.ALL, filter, null, null);
registerBroadcastReceiver();
IntentFilter demoFilter = new IntentFilter();
if (DEBUG_MEDIA_FAKE_ARTWORK) {
@@ -1071,6 +1071,15 @@ public class StatusBar extends SystemUI implements DemoMode,
ThreadedRenderer.overrideProperty("ambientRatio", String.valueOf(1.5f));
}
@VisibleForTesting
protected void registerBroadcastReceiver() {
IntentFilter filter = new IntentFilter();
filter.addAction(Intent.ACTION_CLOSE_SYSTEM_DIALOGS);
filter.addAction(Intent.ACTION_SCREEN_OFF);
filter.addAction(DevicePolicyManager.ACTION_SHOW_DEVICE_MONITORING_DIALOG);
mBroadcastDispatcher.registerReceiver(mBroadcastReceiver, filter, null, UserHandle.ALL);
}
protected QS createDefaultQSFragment() {
return FragmentHostManager.get(mStatusBarWindow).create(QSFragment.class);
}

View File

@@ -28,6 +28,7 @@ import android.view.WindowManager.LayoutParams;
import com.android.systemui.Dependency;
import com.android.systemui.R;
import com.android.systemui.broadcast.BroadcastDispatcher;
import com.android.systemui.statusbar.policy.KeyguardStateController;
@@ -138,20 +139,21 @@ public class SystemUIDialog extends AlertDialog {
private final Dialog mDialog;
private boolean mRegistered;
private final BroadcastDispatcher mBroadcastDispatcher;
DismissReceiver(Dialog dialog) {
mDialog = dialog;
mBroadcastDispatcher = Dependency.get(BroadcastDispatcher.class);
}
void register() {
mDialog.getContext()
.registerReceiverAsUser(this, UserHandle.CURRENT, INTENT_FILTER, null, null);
mBroadcastDispatcher.registerReceiver(this, INTENT_FILTER, null, UserHandle.CURRENT);
mRegistered = true;
}
void unregister() {
if (mRegistered) {
mDialog.getContext().unregisterReceiver(this);
mBroadcastDispatcher.unregisterReceiver(this);
mRegistered = false;
}
}

View File

@@ -16,6 +16,8 @@
package com.android.systemui.statusbar.policy;
import static com.android.systemui.util.InjectionInflationController.VIEW_CONTEXT;
import android.app.StatusBarManager;
import android.content.BroadcastReceiver;
import android.content.Context;
@@ -44,6 +46,7 @@ import com.android.systemui.Dependency;
import com.android.systemui.FontSizeUtils;
import com.android.systemui.R;
import com.android.systemui.SysUiServiceProvider;
import com.android.systemui.broadcast.BroadcastDispatcher;
import com.android.systemui.plugins.DarkIconDispatcher;
import com.android.systemui.plugins.DarkIconDispatcher.DarkReceiver;
import com.android.systemui.settings.CurrentUserTracker;
@@ -60,6 +63,9 @@ import java.util.Calendar;
import java.util.Locale;
import java.util.TimeZone;
import javax.inject.Inject;
import javax.inject.Named;
/**
* Digital clock for the status bar.
*/
@@ -107,15 +113,20 @@ public class Clock extends TextView implements DemoMode, Tunable, CommandQueue.C
*/
private int mNonAdaptedColor;
public Clock(Context context) {
this(context, null);
}
private final BroadcastDispatcher mBroadcastDispatcher;
public Clock(Context context, AttributeSet attrs) {
this(context, attrs, 0);
this(context, attrs, null);
}
public Clock(Context context, AttributeSet attrs, int defStyle) {
@Inject
public Clock(@Named(VIEW_CONTEXT) Context context, AttributeSet attrs,
BroadcastDispatcher broadcastDispatcher) {
this(context, attrs, 0, broadcastDispatcher);
}
public Clock(Context context, AttributeSet attrs, int defStyle,
BroadcastDispatcher broadcastDispatcher) {
super(context, attrs, defStyle);
TypedArray a = context.getTheme().obtainStyledAttributes(
attrs,
@@ -134,6 +145,7 @@ public class Clock extends TextView implements DemoMode, Tunable, CommandQueue.C
mCurrentUserId = newUserId;
}
};
mBroadcastDispatcher = broadcastDispatcher;
}
@Override
@@ -358,11 +370,11 @@ public class Clock extends TextView implements DemoMode, Tunable, CommandQueue.C
}
IntentFilter filter = new IntentFilter(Intent.ACTION_SCREEN_OFF);
filter.addAction(Intent.ACTION_SCREEN_ON);
mContext.registerReceiver(mScreenReceiver, filter);
mBroadcastDispatcher.registerReceiver(mScreenReceiver, filter);
}
} else {
if (mSecondsHandler != null) {
mContext.unregisterReceiver(mScreenReceiver);
mBroadcastDispatcher.unregisterReceiver(mScreenReceiver);
mSecondsHandler.removeCallbacks(mSecondTick);
mSecondsHandler = null;
updateClock();

View File

@@ -37,6 +37,7 @@ import com.android.systemui.statusbar.NotificationShelf;
import com.android.systemui.statusbar.notification.stack.NotificationStackScrollLayout;
import com.android.systemui.statusbar.phone.LockIcon;
import com.android.systemui.statusbar.phone.NotificationPanelView;
import com.android.systemui.statusbar.policy.Clock;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
@@ -178,6 +179,11 @@ public class InjectionInflationController {
* Creates the QSCustomizer.
*/
QSCustomizer createQSCustomizer();
/**
* Creates a Clock.
*/
Clock createClock();
}
/**

View File

@@ -59,6 +59,7 @@ import com.android.settingslib.volume.MediaSessions;
import com.android.systemui.Dumpable;
import com.android.systemui.R;
import com.android.systemui.SysUiServiceProvider;
import com.android.systemui.broadcast.BroadcastDispatcher;
import com.android.systemui.keyguard.WakefulnessLifecycle;
import com.android.systemui.plugins.VolumeDialogController;
import com.android.systemui.qs.tiles.DndTile;
@@ -137,9 +138,10 @@ public class VolumeDialogControllerImpl implements VolumeDialogController, Dumpa
private UserActivityListener mUserActivityListener;
protected final VC mVolumeController = new VC();
protected final BroadcastDispatcher mBroadcastDispatcher;
@Inject
public VolumeDialogControllerImpl(Context context) {
public VolumeDialogControllerImpl(Context context, BroadcastDispatcher broadcastDispatcher) {
mContext = context.getApplicationContext();
mNotificationManager = (NotificationManager) mContext.getSystemService(
Context.NOTIFICATION_SERVICE);
@@ -152,6 +154,7 @@ public class VolumeDialogControllerImpl implements VolumeDialogController, Dumpa
mAudio = (AudioManager) mContext.getSystemService(Context.AUDIO_SERVICE);
mNoMan = (NotificationManager) mContext.getSystemService(Context.NOTIFICATION_SERVICE);
mObserver = new SettingObserver(mWorker);
mBroadcastDispatcher = broadcastDispatcher;
mObserver.init();
mReceiver.init();
mVibrator = (Vibrator) mContext.getSystemService(Context.VIBRATOR_SERVICE);
@@ -1004,11 +1007,11 @@ public class VolumeDialogControllerImpl implements VolumeDialogController, Dumpa
filter.addAction(Intent.ACTION_CONFIGURATION_CHANGED);
filter.addAction(Intent.ACTION_SCREEN_OFF);
filter.addAction(Intent.ACTION_CLOSE_SYSTEM_DIALOGS);
mContext.registerReceiver(this, filter, null, mWorker);
mBroadcastDispatcher.registerReceiver(this, filter, mWorker);
}
public void destroy() {
mContext.unregisterReceiver(this);
mBroadcastDispatcher.unregisterReceiver(this);
}
@Override

View File

@@ -70,6 +70,8 @@ class UserBroadcastDispatcherTest : SysuiTestCase() {
private lateinit var mockContext: Context
@Mock
private lateinit var mockHandler: Handler
@Mock
private lateinit var mPendingResult: BroadcastReceiver.PendingResult
@Captor
private lateinit var argumentCaptor: ArgumentCaptor<IntentFilter>
@@ -88,6 +90,7 @@ class UserBroadcastDispatcherTest : SysuiTestCase() {
universalBroadcastReceiver = UserBroadcastDispatcher(
mockContext, USER_ID, handler, testableLooper.looper)
universalBroadcastReceiver.pendingResult = mPendingResult
}
@Test
@@ -227,4 +230,19 @@ class UserBroadcastDispatcherTest : SysuiTestCase() {
verify(broadcastReceiver).onReceive(mockContext, intent)
verify(broadcastReceiverOther).onReceive(mockContext, intent)
}
@Test
fun testPendingResult() {
intentFilter = IntentFilter(ACTION_1)
universalBroadcastReceiver.registerReceiver(
ReceiverData(broadcastReceiver, intentFilter, handler, USER_HANDLE))
val intent = Intent(ACTION_1)
universalBroadcastReceiver.onReceive(mockContext, intent)
testableLooper.processAllMessages()
verify(broadcastReceiver).onReceive(mockContext, intent)
verify(broadcastReceiver).pendingResult = mPendingResult
}
}

View File

@@ -19,6 +19,7 @@ import static android.provider.Settings.Global.SHOW_USB_TEMPERATURE_ALARM;
import static com.google.common.truth.Truth.assertThat;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Matchers.eq;
import static org.mockito.Mockito.anyObject;
import static org.mockito.Mockito.mock;
@@ -27,8 +28,11 @@ import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.IntentFilter;
import android.os.BatteryManager;
import android.os.Handler;
import android.os.IThermalEventListener;
import android.os.IThermalService;
import android.os.PowerManager;
@@ -43,6 +47,7 @@ import android.testing.TestableResources;
import com.android.settingslib.fuelgauge.Estimate;
import com.android.systemui.R;
import com.android.systemui.SysuiTestCase;
import com.android.systemui.broadcast.BroadcastDispatcher;
import com.android.systemui.power.PowerUI.WarningsUI;
import com.android.systemui.statusbar.phone.StatusBar;
@@ -80,6 +85,7 @@ public class PowerUITest extends SysuiTestCase {
@Mock private IThermalService mThermalServiceMock;
private IThermalEventListener mUsbThermalEventListener;
private IThermalEventListener mSkinThermalEventListener;
@Mock private BroadcastDispatcher mBroadcastDispatcher;
@Before
public void setup() {
@@ -95,6 +101,15 @@ public class PowerUITest extends SysuiTestCase {
mUsbThermalEventListener = mPowerUI.new UsbThermalEventListener();
}
@Test
public void testReceiverIsRegisteredToDispatcherOnStart() {
mPowerUI.start();
verify(mBroadcastDispatcher).registerReceiver(
any(BroadcastReceiver.class),
any(IntentFilter.class),
any(Handler.class)); //PowerUI does not call with User
}
@Test
public void testSkinWarning_throttlingCritical() throws Exception {
mPowerUI.start();
@@ -667,7 +682,7 @@ public class PowerUITest extends SysuiTestCase {
}
private void createPowerUi() {
mPowerUI = new PowerUI();
mPowerUI = new PowerUI(mBroadcastDispatcher);
mPowerUI.mContext = mContext;
mPowerUI.mComponents = mContext.getComponents();
mPowerUI.mThermalService = mThermalServiceMock;

View File

@@ -24,9 +24,11 @@ import static android.view.DisplayAdjustments.DEFAULT_DISPLAY_ADJUSTMENTS;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyBoolean;
import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import android.annotation.LayoutRes;
@@ -34,11 +36,14 @@ import android.annotation.Nullable;
import android.app.Fragment;
import android.app.FragmentController;
import android.app.FragmentHostCallback;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.IntentFilter;
import android.hardware.display.DisplayManagerGlobal;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.os.UserHandle;
import android.testing.AndroidTestingRunner;
import android.testing.LeakCheck.Tracker;
import android.testing.TestableLooper;
@@ -58,6 +63,7 @@ import com.android.systemui.Dependency;
import com.android.systemui.SysuiBaseFragmentTest;
import com.android.systemui.SysuiTestableContext;
import com.android.systemui.assist.AssistManager;
import com.android.systemui.broadcast.BroadcastDispatcher;
import com.android.systemui.model.SysUiState;
import com.android.systemui.plugins.statusbar.StatusBarStateController;
import com.android.systemui.recents.OverviewProxyService;
@@ -70,6 +76,8 @@ import com.android.systemui.statusbar.policy.DeviceProvisionedController;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
@RunWith(AndroidTestingRunner.class)
@RunWithLooper()
@@ -85,6 +93,8 @@ public class NavigationBarFragmentTest extends SysuiBaseFragmentTest {
private OverviewProxyService mOverviewProxyService;
private CommandQueue mCommandQueue;
private SysUiState mMockSysUiState;
@Mock
private BroadcastDispatcher mBroadcastDispatcher;
private AccessibilityManagerWrapper mAccessibilityWrapper =
new AccessibilityManagerWrapper(mContext) {
@@ -112,6 +122,8 @@ public class NavigationBarFragmentTest extends SysuiBaseFragmentTest {
@Before
public void setupFragment() throws Exception {
MockitoAnnotations.initMocks(this);
setupSysuiDependency();
createRootView();
mOverviewProxyService =
@@ -176,6 +188,18 @@ public class NavigationBarFragmentTest extends SysuiBaseFragmentTest {
navigationBarFragment.onHomeLongClick(navigationBarFragment.getView());
}
@Test
public void testRegisteredWithDispatcher() {
mFragments.dispatchResume();
processAllMessages();
verify(mBroadcastDispatcher).registerReceiver(
any(BroadcastReceiver.class),
any(IntentFilter.class),
any(Handler.class),
any(UserHandle.class));
}
@Test
public void testSetImeWindowStatusWhenImeSwitchOnDisplay() {
// Create default & external NavBar fragment.
@@ -227,7 +251,8 @@ public class NavigationBarFragmentTest extends SysuiBaseFragmentTest {
mOverviewProxyService,
mock(NavigationModeController.class),
mock(StatusBarStateController.class),
mMockSysUiState);
mMockSysUiState,
mBroadcastDispatcher);
}
private class HostCallbacksForExternalDisplay extends

View File

@@ -41,7 +41,9 @@ import static org.mockito.Mockito.when;
import android.app.Notification;
import android.app.StatusBarManager;
import android.app.trust.TrustManager;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.IntentFilter;
import android.hardware.display.AmbientDisplayConfiguration;
import android.hardware.fingerprint.FingerprintManager;
import android.metrics.LogMaker;
@@ -51,6 +53,7 @@ import android.os.IPowerManager;
import android.os.Looper;
import android.os.PowerManager;
import android.os.RemoteException;
import android.os.UserHandle;
import android.service.dreams.IDreamManager;
import android.support.test.metricshelper.MetricsAsserts;
import android.testing.AndroidTestingRunner;
@@ -75,6 +78,7 @@ import com.android.systemui.SysuiTestCase;
import com.android.systemui.UiOffloadThread;
import com.android.systemui.appops.AppOpsController;
import com.android.systemui.assist.AssistManager;
import com.android.systemui.broadcast.BroadcastDispatcher;
import com.android.systemui.bubbles.BubbleController;
import com.android.systemui.doze.DozeHost;
import com.android.systemui.doze.DozeLog;
@@ -171,6 +175,8 @@ public class StatusBarTest extends SysuiTestCase {
private AmbientDisplayConfiguration mAmbientDisplayConfiguration;
@Mock
private StatusBarWindowView mStatusBarWindowView;
@Mock
private BroadcastDispatcher mBroadcastDispatcher;
private TestableStatusBar mStatusBar;
private FakeMetricsLogger mMetricsLogger;
@@ -199,6 +205,7 @@ public class StatusBarTest extends SysuiTestCase {
mDependency.injectTestDependency(NotificationFilter.class, mNotificationFilter);
mDependency.injectTestDependency(NotificationAlertingManager.class,
mNotificationAlertingManager);
mDependency.injectTestDependency(BroadcastDispatcher.class, mBroadcastDispatcher);
IPowerManager powerManagerService = mock(IPowerManager.class);
mPowerManager = new PowerManager(mContext, powerManagerService,
@@ -263,7 +270,8 @@ public class StatusBarTest extends SysuiTestCase {
mDozeScrimController, mock(NotificationShelf.class),
mLockscreenUserManager, mCommandQueue, mNotificationPresenter,
mock(BubbleController.class), mock(NavigationBarController.class),
mock(AutoHideController.class), mKeyguardUpdateMonitor, mStatusBarWindowView);
mock(AutoHideController.class), mKeyguardUpdateMonitor, mStatusBarWindowView,
mBroadcastDispatcher);
mStatusBar.mContext = mContext;
mStatusBar.mComponents = mContext.getComponents();
SystemUIFactory.getInstance().getRootComponent()
@@ -774,6 +782,16 @@ public class StatusBarTest extends SysuiTestCase {
verify(mNotificationPanelView, never()).expand(anyBoolean());
}
@Test
public void testRegisterBroadcastsonDispatcher() {
mStatusBar.registerBroadcastReceiver();
verify(mBroadcastDispatcher).registerReceiver(
any(BroadcastReceiver.class),
any(IntentFilter.class),
eq(null),
any(UserHandle.class));
}
static class TestableStatusBar extends StatusBar {
public TestableStatusBar(StatusBarKeyguardViewManager man,
KeyguardIndicationController key,
@@ -801,7 +819,8 @@ public class StatusBarTest extends SysuiTestCase {
NavigationBarController navBarController,
AutoHideController autoHideController,
KeyguardUpdateMonitor keyguardUpdateMonitor,
StatusBarWindowView statusBarWindow) {
StatusBarWindowView statusBarWindow,
BroadcastDispatcher broadcastDispatcher) {
mStatusBarKeyguardViewManager = man;
mKeyguardIndicationController = key;
mStackScroller = stack;
@@ -835,6 +854,7 @@ public class StatusBarTest extends SysuiTestCase {
mKeyguardUpdateMonitor = keyguardUpdateMonitor;
mStatusBarWindow = statusBarWindow;
mDozeServiceHost.mWakeLockScreenPerformsAuth = false;
mBroadcastDispatcher = broadcastDispatcher;
}
private WakefulnessLifecycle createAwakeWakefulnessLifecycle() {

View File

@@ -18,11 +18,9 @@ import static junit.framework.Assert.assertTrue;
import static org.mockito.Matchers.any;
import static org.mockito.Matchers.eq;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.verify;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.testing.AndroidTestingRunner;
@@ -31,11 +29,14 @@ import android.testing.TestableLooper.RunWithLooper;
import androidx.test.filters.SmallTest;
import com.android.systemui.SysuiTestCase;
import com.android.systemui.broadcast.BroadcastDispatcher;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.ArgumentCaptor;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
@RunWith(AndroidTestingRunner.class)
@RunWithLooper
@@ -43,13 +44,16 @@ import org.mockito.ArgumentCaptor;
public class SystemUIDialogTest extends SysuiTestCase {
private SystemUIDialog mDialog;
Context mContextSpy;
@Mock
private BroadcastDispatcher mBroadcastDispatcher;
@Before
public void setup() {
mContextSpy = spy(mContext);
mDialog = new SystemUIDialog(mContextSpy);
MockitoAnnotations.initMocks(this);
mDependency.injectTestDependency(BroadcastDispatcher.class, mBroadcastDispatcher);
mDialog = new SystemUIDialog(mContext);
}
@Test
@@ -60,12 +64,12 @@ public class SystemUIDialogTest extends SysuiTestCase {
ArgumentCaptor.forClass(IntentFilter.class);
mDialog.show();
verify(mContextSpy).registerReceiverAsUser(broadcastReceiverCaptor.capture(), any(),
intentFilterCaptor.capture(), any(), any());
verify(mBroadcastDispatcher).registerReceiver(broadcastReceiverCaptor.capture(),
intentFilterCaptor.capture(), eq(null), any());
assertTrue(intentFilterCaptor.getValue().hasAction(Intent.ACTION_CLOSE_SYSTEM_DIALOGS));
mDialog.dismiss();
verify(mContextSpy).unregisterReceiver(eq(broadcastReceiverCaptor.getValue()));
verify(mBroadcastDispatcher).unregisterReceiver(eq(broadcastReceiverCaptor.getValue()));
}
}

View File

@@ -16,40 +16,63 @@
package com.android.systemui.volume;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.IntentFilter;
import android.media.AudioManager;
import android.media.session.MediaSession;
import android.os.Handler;
import android.testing.AndroidTestingRunner;
import androidx.test.filters.SmallTest;
import com.android.systemui.SysuiTestCase;
import com.android.systemui.broadcast.BroadcastDispatcher;
import com.android.systemui.keyguard.WakefulnessLifecycle;
import com.android.systemui.statusbar.phone.StatusBar;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
@RunWith(AndroidTestingRunner.class)
@SmallTest
public class VolumeDialogControllerImplTest extends SysuiTestCase {
TestableVolumeDialogControllerImpl mVolumeController;
VolumeDialogControllerImpl.C mCallback;
StatusBar mStatusBar;
@Mock
private BroadcastDispatcher mBroadcastDispatcher;
@Before
public void setup() throws Exception {
MockitoAnnotations.initMocks(this);
mCallback = mock(VolumeDialogControllerImpl.C.class);
mStatusBar = mock(StatusBar.class);
mVolumeController = new TestableVolumeDialogControllerImpl(mContext, mCallback, mStatusBar);
mVolumeController = new TestableVolumeDialogControllerImpl(mContext, mCallback, mStatusBar,
mBroadcastDispatcher);
mVolumeController.setEnableDialogs(true, true);
}
@Test
public void testRegisteredWithDispatcher() {
verify(mBroadcastDispatcher).registerReceiver(
any(BroadcastReceiver.class),
any(IntentFilter.class),
any(Handler.class)); // VolumeDialogControllerImpl does not call with user
}
@Test
public void testVolumeChangeW_deviceNotInteractiveAOD() {
when(mStatusBar.isDeviceInteractive()).thenReturn(false);
@@ -81,7 +104,7 @@ public class VolumeDialogControllerImplTest extends SysuiTestCase {
public void testVolumeChangeW_nullStatusBar() {
VolumeDialogControllerImpl.C callback = mock(VolumeDialogControllerImpl.C.class);
TestableVolumeDialogControllerImpl nullStatusBarTestableDialog = new
TestableVolumeDialogControllerImpl(mContext, callback, null);
TestableVolumeDialogControllerImpl(mContext, callback, null, mBroadcastDispatcher);
nullStatusBarTestableDialog.setEnableDialogs(true, true);
nullStatusBarTestableDialog.onVolumeChangedW(0, AudioManager.FLAG_SHOW_UI);
verify(callback, times(1)).onShowRequested(Events.SHOW_REASON_VOLUME_CHANGED);
@@ -100,8 +123,9 @@ public class VolumeDialogControllerImplTest extends SysuiTestCase {
}
static class TestableVolumeDialogControllerImpl extends VolumeDialogControllerImpl {
public TestableVolumeDialogControllerImpl(Context context, C callback, StatusBar s) {
super(context);
TestableVolumeDialogControllerImpl(Context context, C callback, StatusBar s,
BroadcastDispatcher broadcastDispatcher) {
super(context, broadcastDispatcher);
mCallbacks = callback;
mStatusBar = s;
}