diff options
| author | 2017-08-15 16:43:24 +0000 | |
|---|---|---|
| committer | 2017-08-15 16:43:24 +0000 | |
| commit | 8170ea1b3cfa57732cf85aaf38f24c245b0f6728 (patch) | |
| tree | a8a830ba8223a8f9a2fbf6839d035302ef7030da | |
| parent | 73e3d9f58c9edd2db254f072bd82bcecb2c13275 (diff) | |
| parent | 9c4faa85f1bc4ffc2aa949da7b5d8439f4c638a2 (diff) | |
Merge "Fix race condition crash" into oc-mr1-dev
3 files changed, 49 insertions, 17 deletions
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java index 59e7005e7daf..65bfb4983c0e 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java @@ -429,7 +429,7 @@ public class StatusBar extends SystemUI implements DemoMode, private int mStatusBarWindowState = WINDOW_STATE_SHOWING; protected StatusBarWindowManager mStatusBarWindowManager; protected UnlockMethodCache mUnlockMethodCache; - private DozeServiceHost mDozeServiceHost; + private DozeServiceHost mDozeServiceHost = new DozeServiceHost(); private boolean mWakeUpComingFromTouch; private PointF mWakeUpTouchLocation; @@ -733,7 +733,8 @@ public class StatusBar extends SystemUI implements DemoMode, private KeyguardUserSwitcher mKeyguardUserSwitcher; private UserSwitcherController mUserSwitcherController; private NetworkController mNetworkController; - private KeyguardMonitorImpl mKeyguardMonitor; + private KeyguardMonitorImpl mKeyguardMonitor + = (KeyguardMonitorImpl) Dependency.get(KeyguardMonitor.class); private BatteryController mBatteryController; protected boolean mPanelExpanded; private IOverlayManager mOverlayManager; @@ -741,7 +742,7 @@ public class StatusBar extends SystemUI implements DemoMode, private boolean mIsKeyguard; private LogMaker mStatusBarStateLog; private LockscreenGestureLogger mLockscreenGestureLogger = new LockscreenGestureLogger(); - private NotificationIconAreaController mNotificationIconAreaController; + protected NotificationIconAreaController mNotificationIconAreaController; private boolean mReinflateNotificationsOnUserSwitched; private HashMap<String, Entry> mPendingNotifications = new HashMap<>(); private boolean mClearAllEnabled; @@ -788,14 +789,12 @@ public class StatusBar extends SystemUI implements DemoMode, public void start() { mNetworkController = Dependency.get(NetworkController.class); mUserSwitcherController = Dependency.get(UserSwitcherController.class); - mKeyguardMonitor = (KeyguardMonitorImpl) Dependency.get(KeyguardMonitor.class); mScreenLifecycle = Dependency.get(ScreenLifecycle.class); mScreenLifecycle.addObserver(mScreenObserver); mWakefulnessLifecycle = Dependency.get(WakefulnessLifecycle.class); mWakefulnessLifecycle.addObserver(mWakefulnessObserver); mBatteryController = Dependency.get(BatteryController.class); mAssistManager = Dependency.get(AssistManager.class); - mDeviceProvisionedController = Dependency.get(DeviceProvisionedController.class); mSystemServicesProxy = SystemServicesProxy.getInstance(mContext); mOverlayManager = IOverlayManager.Stub.asInterface( ServiceManager.getService(Context.OVERLAY_SERVICE)); @@ -981,7 +980,6 @@ public class StatusBar extends SystemUI implements DemoMode, startKeyguard(); KeyguardUpdateMonitor.getInstance(mContext).registerCallback(mUpdateCallback); - mDozeServiceHost = new DozeServiceHost(); putComponent(DozeHost.class, mDozeServiceHost); notifyUserAboutHiddenNotifications(); @@ -1328,7 +1326,7 @@ public class StatusBar extends SystemUI implements DemoMode, // Clock and bottom icons mNotificationPanel.onOverlayChanged(); // The status bar on the keyguard is a special layout. - mKeyguardStatusBar.onOverlayChanged(); + if (mKeyguardStatusBar != null) mKeyguardStatusBar.onOverlayChanged(); // Recreate Indication controller because internal references changed mKeyguardIndicationController = SystemUIFactory.getInstance().createKeyguardIndicationController(mContext, @@ -1373,7 +1371,7 @@ public class StatusBar extends SystemUI implements DemoMode, } private void inflateSignalClusters() { - reinflateSignalCluster(mKeyguardStatusBar); + if (mKeyguardStatusBar != null) reinflateSignalCluster(mKeyguardStatusBar); } public static SignalClusterView reinflateSignalCluster(View view) { @@ -4565,7 +4563,7 @@ public class StatusBar extends SystemUI implements DemoMode, if (mKeyguardUserSwitcher != null) { mKeyguardUserSwitcher.setKeyguard(true, fromShadeLocked); } - mStatusBarView.removePendingHideExpandedRunnables(); + if (mStatusBarView != null) mStatusBarView.removePendingHideExpandedRunnables(); if (mAmbientIndicationContainer != null) { mAmbientIndicationContainer.setVisibility(View.VISIBLE); } @@ -4603,7 +4601,7 @@ public class StatusBar extends SystemUI implements DemoMode, /** * Switches theme from light to dark and vice-versa. */ - private void updateTheme() { + protected void updateTheme() { final boolean inflated = mStackScroller != null; // The system wallpaper defines if QS should be light or dark. @@ -5673,7 +5671,8 @@ public class StatusBar extends SystemUI implements DemoMode, protected KeyguardManager mKeyguardManager; private LockPatternUtils mLockPatternUtils; - private DeviceProvisionedController mDeviceProvisionedController; + private DeviceProvisionedController mDeviceProvisionedController + = Dependency.get(DeviceProvisionedController.class); protected SystemServicesProxy mSystemServicesProxy; // UI-specific methods diff --git a/packages/SystemUI/tests/AndroidManifest.xml b/packages/SystemUI/tests/AndroidManifest.xml index adb3baf40bb3..67fae5bb0dfb 100644 --- a/packages/SystemUI/tests/AndroidManifest.xml +++ b/packages/SystemUI/tests/AndroidManifest.xml @@ -42,6 +42,7 @@ <uses-permission android:name="android.permission.TRUST_LISTENER" /> <uses-permission android:name="android.permission.USE_FINGERPRINT" /> <uses-permission android:name="android.permission.DEVICE_POWER" /> + <uses-permission android:name="android.permission.READ_CONTACTS" /> <application> <uses-library android:name="android.test.runner" /> diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarTest.java index a706368a0880..ac367d20b5c8 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarTest.java @@ -26,21 +26,19 @@ import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyBoolean; import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.ArgumentMatchers.anyString; -import static org.mockito.Matchers.any; -import static org.mockito.Matchers.anyBoolean; -import static org.mockito.Matchers.anyInt; -import static org.mockito.Matchers.anyString; import static org.mockito.Mockito.doAnswer; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.never; import static org.mockito.Mockito.times; -import static org.mockito.Mockito.when; import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; import android.app.Notification; import android.app.trust.TrustManager; +import android.content.Context; import android.hardware.fingerprint.FingerprintManager; import android.metrics.LogMaker; +import android.os.Binder; import android.os.Handler; import android.os.HandlerThread; import android.os.IPowerManager; @@ -51,20 +49,25 @@ import android.os.UserHandle; import android.service.notification.StatusBarNotification; import android.support.test.filters.SmallTest; import android.support.test.metricshelper.MetricsAsserts; -import android.support.test.runner.AndroidJUnit4; import android.testing.AndroidTestingRunner; +import android.testing.LayoutInflaterBuilder; import android.testing.TestableLooper; import android.testing.TestableLooper.MessageHandler; import android.testing.TestableLooper.RunWithLooper; import android.util.DisplayMetrics; +import android.view.View; import android.view.ViewGroup.LayoutParams; +import android.widget.FrameLayout; import com.android.internal.logging.MetricsLogger; import com.android.internal.logging.nano.MetricsProto.MetricsEvent; import com.android.internal.logging.testing.FakeMetricsLogger; import com.android.internal.statusbar.IStatusBarService; import com.android.keyguard.KeyguardHostView.OnDismissAction; +import com.android.keyguard.KeyguardStatusView; +import com.android.systemui.R; import com.android.systemui.SysuiTestCase; +import com.android.systemui.assist.AssistManager; import com.android.systemui.keyguard.WakefulnessLifecycle; import com.android.systemui.recents.misc.SystemServicesProxy; import com.android.systemui.statusbar.ActivatableNotificationView; @@ -73,7 +76,11 @@ import com.android.systemui.statusbar.KeyguardIndicationController; import com.android.systemui.statusbar.NotificationData; import com.android.systemui.statusbar.NotificationData.Entry; import com.android.systemui.statusbar.StatusBarState; +import com.android.systemui.statusbar.policy.DateView; +import com.android.systemui.statusbar.policy.DeviceProvisionedController; import com.android.systemui.statusbar.policy.HeadsUpManager; +import com.android.systemui.statusbar.policy.KeyguardMonitor; +import com.android.systemui.statusbar.policy.KeyguardMonitorImpl; import com.android.systemui.statusbar.stack.NotificationStackScrollLayout; import org.junit.Before; @@ -106,12 +113,20 @@ public class StatusBarTest extends SysuiTestCase { @Before public void setup() throws Exception { + mContext.setTheme(R.style.Theme_SystemUI_Light); + mDependency.injectMockDependency(AssistManager.class); + mDependency.injectMockDependency(DeviceProvisionedController.class); + mDependency.injectTestDependency(KeyguardMonitor.class, mock(KeyguardMonitorImpl.class)); + CommandQueue commandQueue = mock(CommandQueue.class); + when(commandQueue.asBinder()).thenReturn(new Binder()); + mContext.putComponent(CommandQueue.class, commandQueue); mContext.addMockSystemService(TrustManager.class, mock(TrustManager.class)); mContext.addMockSystemService(FingerprintManager.class, mock(FingerprintManager.class)); mStatusBarKeyguardViewManager = mock(StatusBarKeyguardViewManager.class); mUnlockMethodCache = mock(UnlockMethodCache.class); mKeyguardIndicationController = mock(KeyguardIndicationController.class); mStackScroller = mock(NotificationStackScrollLayout.class); + when(mStackScroller.generateLayoutParams(any())).thenReturn(new LayoutParams(0, 0)); mMetricsLogger = new FakeMetricsLogger(); mHeadsUpManager = mock(HeadsUpManager.class); mNotificationData = mock(NotificationData.class); @@ -133,6 +148,7 @@ public class StatusBarTest extends SysuiTestCase { mNotificationData, mPowerManager, mSystemServicesProxy, mNotificationPanelView, mBarService); mStatusBar.mContext = mContext; + mStatusBar.mComponents = mContext.getComponents(); doAnswer(invocation -> { OnDismissAction onDismissAction = (OnDismissAction) invocation.getArguments()[0]; onDismissAction.onDismiss(); @@ -484,6 +500,16 @@ public class StatusBarTest extends SysuiTestCase { mStatusBar.dump(null, new PrintWriter(new ByteArrayOutputStream()), null); } + @Test + @RunWithLooper(setAsMainLooper = true) + public void testUpdateKeyguardState_DoesNotCrash() { + mStatusBar.mStatusBarWindow = mock(StatusBarWindowView.class); + mStatusBar.mState = StatusBarState.KEYGUARD; + mStatusBar.mDozeScrimController = mock(DozeScrimController.class); + mStatusBar.mNotificationIconAreaController = mock(NotificationIconAreaController.class); + mStatusBar.updateKeyguardState(false, false); + } + static class TestableStatusBar extends StatusBar { public TestableStatusBar(StatusBarKeyguardViewManager man, UnlockMethodCache unlock, KeyguardIndicationController key, @@ -502,6 +528,7 @@ public class StatusBarTest extends SysuiTestCase { mNotificationPanel = panelView; mBarService = barService; mWakefulnessLifecycle = createAwakeWakefulnessLifecycle(); + mScrimController = mock(ScrimController.class); } private WakefulnessLifecycle createAwakeWakefulnessLifecycle() { @@ -511,6 +538,11 @@ public class StatusBarTest extends SysuiTestCase { return wakefulnessLifecycle; } + @Override + protected void updateTheme() { + // Do nothing for now, until we have more mocking and StatusBar is smaller. + } + public void setBarStateForTest(int state) { mState = state; } |