Merge "Fix a CalledFromWrongThreadException" into tm-dev

This commit is contained in:
William Leshner
2022-03-18 20:46:45 +00:00
committed by Android (Google) Code Review
3 changed files with 67 additions and 23 deletions

View File

@@ -88,10 +88,6 @@ public class DreamOverlayStatusBarView extends ConstraintLayout {
fetchStatusIconForResId(R.id.dream_overlay_priority_mode)); fetchStatusIconForResId(R.id.dream_overlay_priority_mode));
} }
void showIcon(@StatusIconType int iconType, boolean show) {
showIcon(iconType, show, null);
}
void showIcon(@StatusIconType int iconType, boolean show, @Nullable String contentDescription) { void showIcon(@StatusIconType int iconType, boolean show, @Nullable String contentDescription) {
View icon = mStatusIcons.get(iconType); View icon = mStatusIcons.get(iconType);
if (icon == null) { if (icon == null) {

View File

@@ -16,6 +16,7 @@
package com.android.systemui.dreams; package com.android.systemui.dreams;
import android.annotation.Nullable;
import android.app.AlarmManager; import android.app.AlarmManager;
import android.content.res.Resources; import android.content.res.Resources;
import android.hardware.SensorPrivacyManager; import android.hardware.SensorPrivacyManager;
@@ -45,6 +46,7 @@ import com.android.systemui.util.time.DateFormatUtil;
import java.util.Locale; import java.util.Locale;
import java.util.Map; import java.util.Map;
import java.util.concurrent.Executor;
import javax.inject.Inject; import javax.inject.Inject;
@@ -62,6 +64,9 @@ public class DreamOverlayStatusBarViewController extends ViewController<DreamOve
private final IndividualSensorPrivacyController mSensorPrivacyController; private final IndividualSensorPrivacyController mSensorPrivacyController;
private final NotificationListener mNotificationListener; private final NotificationListener mNotificationListener;
private final ZenModeController mZenModeController; private final ZenModeController mZenModeController;
private final Executor mMainExecutor;
private boolean mIsAttached;
private final NetworkRequest mNetworkRequest = new NetworkRequest.Builder() private final NetworkRequest mNetworkRequest = new NetworkRequest.Builder()
.clearCapabilities() .clearCapabilities()
@@ -131,6 +136,7 @@ public class DreamOverlayStatusBarViewController extends ViewController<DreamOve
public DreamOverlayStatusBarViewController( public DreamOverlayStatusBarViewController(
DreamOverlayStatusBarView view, DreamOverlayStatusBarView view,
@Main Resources resources, @Main Resources resources,
@Main Executor mainExecutor,
ConnectivityManager connectivityManager, ConnectivityManager connectivityManager,
TouchInsetManager.TouchInsetSession touchInsetSession, TouchInsetManager.TouchInsetSession touchInsetSession,
AlarmManager alarmManager, AlarmManager alarmManager,
@@ -141,6 +147,7 @@ public class DreamOverlayStatusBarViewController extends ViewController<DreamOve
ZenModeController zenModeController) { ZenModeController zenModeController) {
super(view); super(view);
mResources = resources; mResources = resources;
mMainExecutor = mainExecutor;
mConnectivityManager = connectivityManager; mConnectivityManager = connectivityManager;
mTouchInsetSession = touchInsetSession; mTouchInsetSession = touchInsetSession;
mAlarmManager = alarmManager; mAlarmManager = alarmManager;
@@ -157,6 +164,8 @@ public class DreamOverlayStatusBarViewController extends ViewController<DreamOve
@Override @Override
protected void onViewAttached() { protected void onViewAttached() {
mIsAttached = true;
updateNotificationsStatusIcon(); updateNotificationsStatusIcon();
mConnectivityManager.registerNetworkCallback(mNetworkRequest, mNetworkCallback); mConnectivityManager.registerNetworkCallback(mNetworkRequest, mNetworkCallback);
@@ -181,6 +190,8 @@ public class DreamOverlayStatusBarViewController extends ViewController<DreamOve
mNextAlarmController.removeCallback(mNextAlarmCallback); mNextAlarmController.removeCallback(mNextAlarmCallback);
mConnectivityManager.unregisterNetworkCallback(mNetworkCallback); mConnectivityManager.unregisterNetworkCallback(mNetworkCallback);
mTouchInsetSession.clear(); mTouchInsetSession.clear();
mIsAttached = false;
} }
private void updateWifiUnavailableStatusIcon() { private void updateWifiUnavailableStatusIcon() {
@@ -189,14 +200,14 @@ public class DreamOverlayStatusBarViewController extends ViewController<DreamOve
mConnectivityManager.getActiveNetwork()); mConnectivityManager.getActiveNetwork());
final boolean available = capabilities != null final boolean available = capabilities != null
&& capabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI); && capabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI);
mView.showIcon(DreamOverlayStatusBarView.STATUS_ICON_WIFI_UNAVAILABLE, !available); showIcon(DreamOverlayStatusBarView.STATUS_ICON_WIFI_UNAVAILABLE, !available);
} }
private void updateAlarmStatusIcon() { private void updateAlarmStatusIcon() {
final AlarmManager.AlarmClockInfo alarm = final AlarmManager.AlarmClockInfo alarm =
mAlarmManager.getNextAlarmClock(UserHandle.USER_CURRENT); mAlarmManager.getNextAlarmClock(UserHandle.USER_CURRENT);
final boolean hasAlarm = alarm != null && alarm.getTriggerTime() > 0; final boolean hasAlarm = alarm != null && alarm.getTriggerTime() > 0;
mView.showIcon( showIcon(
DreamOverlayStatusBarView.STATUS_ICON_ALARM_SET, DreamOverlayStatusBarView.STATUS_ICON_ALARM_SET,
hasAlarm, hasAlarm,
hasAlarm ? buildAlarmContentDescription(alarm) : null); hasAlarm ? buildAlarmContentDescription(alarm) : null);
@@ -215,7 +226,7 @@ public class DreamOverlayStatusBarViewController extends ViewController<DreamOve
.isSensorBlocked(SensorPrivacyManager.Sensors.MICROPHONE); .isSensorBlocked(SensorPrivacyManager.Sensors.MICROPHONE);
final boolean cameraBlocked = mSensorPrivacyController final boolean cameraBlocked = mSensorPrivacyController
.isSensorBlocked(SensorPrivacyManager.Sensors.CAMERA); .isSensorBlocked(SensorPrivacyManager.Sensors.CAMERA);
mView.showIcon( showIcon(
DreamOverlayStatusBarView.STATUS_ICON_MIC_CAMERA_DISABLED, DreamOverlayStatusBarView.STATUS_ICON_MIC_CAMERA_DISABLED,
micBlocked && cameraBlocked); micBlocked && cameraBlocked);
} }
@@ -230,7 +241,7 @@ public class DreamOverlayStatusBarViewController extends ViewController<DreamOve
final StatusBarNotification[] notifications = final StatusBarNotification[] notifications =
mNotificationListener.getActiveNotifications(); mNotificationListener.getActiveNotifications();
final int notificationCount = notifications != null ? notifications.length : 0; final int notificationCount = notifications != null ? notifications.length : 0;
mView.showIcon( showIcon(
DreamOverlayStatusBarView.STATUS_ICON_NOTIFICATIONS, DreamOverlayStatusBarView.STATUS_ICON_NOTIFICATIONS,
notificationCount > 0, notificationCount > 0,
notificationCount > 0 notificationCount > 0
@@ -246,8 +257,23 @@ public class DreamOverlayStatusBarViewController extends ViewController<DreamOve
} }
private void updatePriorityModeStatusIcon() { private void updatePriorityModeStatusIcon() {
mView.showIcon( showIcon(
DreamOverlayStatusBarView.STATUS_ICON_PRIORITY_MODE_ON, DreamOverlayStatusBarView.STATUS_ICON_PRIORITY_MODE_ON,
mZenModeController.getZen() != Settings.Global.ZEN_MODE_OFF); mZenModeController.getZen() != Settings.Global.ZEN_MODE_OFF);
} }
private void showIcon(@DreamOverlayStatusBarView.StatusIconType int iconType, boolean show) {
showIcon(iconType, show, null);
}
private void showIcon(
@DreamOverlayStatusBarView.StatusIconType int iconType,
boolean show,
@Nullable String contentDescription) {
mMainExecutor.execute(() -> {
if (mIsAttached) {
mView.showIcon(iconType, show, contentDescription);
}
});
}
} }

View File

@@ -53,6 +53,8 @@ import org.mockito.ArgumentCaptor;
import org.mockito.Mock; import org.mockito.Mock;
import org.mockito.MockitoAnnotations; import org.mockito.MockitoAnnotations;
import java.util.concurrent.Executor;
@SmallTest @SmallTest
@RunWith(AndroidTestingRunner.class) @RunWith(AndroidTestingRunner.class)
public class DreamOverlayStatusBarViewControllerTest extends SysuiTestCase { public class DreamOverlayStatusBarViewControllerTest extends SysuiTestCase {
@@ -90,6 +92,8 @@ public class DreamOverlayStatusBarViewControllerTest extends SysuiTestCase {
@Mock @Mock
ZenModeController mZenModeController; ZenModeController mZenModeController;
private final Executor mMainExecutor = Runnable::run;
DreamOverlayStatusBarViewController mController; DreamOverlayStatusBarViewController mController;
@Before @Before
@@ -102,6 +106,7 @@ public class DreamOverlayStatusBarViewControllerTest extends SysuiTestCase {
mController = new DreamOverlayStatusBarViewController( mController = new DreamOverlayStatusBarViewController(
mView, mView,
mResources, mResources,
mMainExecutor,
mConnectivityManager, mConnectivityManager,
mTouchSession, mTouchSession,
mAlarmManager, mAlarmManager,
@@ -134,7 +139,8 @@ public class DreamOverlayStatusBarViewControllerTest extends SysuiTestCase {
.thenReturn(false); .thenReturn(false);
when(mConnectivityManager.getNetworkCapabilities(any())).thenReturn(mNetworkCapabilities); when(mConnectivityManager.getNetworkCapabilities(any())).thenReturn(mNetworkCapabilities);
mController.onViewAttached(); mController.onViewAttached();
verify(mView).showIcon(DreamOverlayStatusBarView.STATUS_ICON_WIFI_UNAVAILABLE, true); verify(mView).showIcon(
DreamOverlayStatusBarView.STATUS_ICON_WIFI_UNAVAILABLE, true, null);
} }
@Test @Test
@@ -143,13 +149,16 @@ public class DreamOverlayStatusBarViewControllerTest extends SysuiTestCase {
.thenReturn(true); .thenReturn(true);
when(mConnectivityManager.getNetworkCapabilities(any())).thenReturn(mNetworkCapabilities); when(mConnectivityManager.getNetworkCapabilities(any())).thenReturn(mNetworkCapabilities);
mController.onViewAttached(); mController.onViewAttached();
verify(mView).showIcon(DreamOverlayStatusBarView.STATUS_ICON_WIFI_UNAVAILABLE, false); verify(mView).showIcon(
DreamOverlayStatusBarView.STATUS_ICON_WIFI_UNAVAILABLE, false, null);
} }
@Test @Test
public void testOnViewAttachedShowsWifiIconWhenNetworkCapabilitiesUnavailable() { public void testOnViewAttachedShowsWifiIconWhenNetworkCapabilitiesUnavailable() {
when(mConnectivityManager.getNetworkCapabilities(any())).thenReturn(null); when(mConnectivityManager.getNetworkCapabilities(any())).thenReturn(null);
mController.onViewAttached(); mController.onViewAttached();
verify(mView).showIcon(
DreamOverlayStatusBarView.STATUS_ICON_WIFI_UNAVAILABLE, true, null);
} }
@Test @Test
@@ -176,7 +185,8 @@ public class DreamOverlayStatusBarViewControllerTest extends SysuiTestCase {
when(mSensorPrivacyController.isSensorBlocked(SensorPrivacyManager.Sensors.CAMERA)) when(mSensorPrivacyController.isSensorBlocked(SensorPrivacyManager.Sensors.CAMERA))
.thenReturn(true); .thenReturn(true);
mController.onViewAttached(); mController.onViewAttached();
verify(mView).showIcon(DreamOverlayStatusBarView.STATUS_ICON_MIC_CAMERA_DISABLED, true); verify(mView).showIcon(
DreamOverlayStatusBarView.STATUS_ICON_MIC_CAMERA_DISABLED, true, null);
} }
@Test @Test
@@ -186,7 +196,8 @@ public class DreamOverlayStatusBarViewControllerTest extends SysuiTestCase {
when(mSensorPrivacyController.isSensorBlocked(SensorPrivacyManager.Sensors.CAMERA)) when(mSensorPrivacyController.isSensorBlocked(SensorPrivacyManager.Sensors.CAMERA))
.thenReturn(false); .thenReturn(false);
mController.onViewAttached(); mController.onViewAttached();
verify(mView).showIcon(DreamOverlayStatusBarView.STATUS_ICON_MIC_CAMERA_DISABLED, false); verify(mView).showIcon(
DreamOverlayStatusBarView.STATUS_ICON_MIC_CAMERA_DISABLED, false, null);
} }
@Test @Test
@@ -211,7 +222,8 @@ public class DreamOverlayStatusBarViewControllerTest extends SysuiTestCase {
when(mZenModeController.getZen()).thenReturn( when(mZenModeController.getZen()).thenReturn(
Settings.Global.ZEN_MODE_IMPORTANT_INTERRUPTIONS); Settings.Global.ZEN_MODE_IMPORTANT_INTERRUPTIONS);
mController.onViewAttached(); mController.onViewAttached();
verify(mView).showIcon(DreamOverlayStatusBarView.STATUS_ICON_PRIORITY_MODE_ON, true); verify(mView).showIcon(
DreamOverlayStatusBarView.STATUS_ICON_PRIORITY_MODE_ON, true, null);
} }
@Test @Test
@@ -219,7 +231,8 @@ public class DreamOverlayStatusBarViewControllerTest extends SysuiTestCase {
when(mZenModeController.getZen()).thenReturn( when(mZenModeController.getZen()).thenReturn(
Settings.Global.ZEN_MODE_OFF); Settings.Global.ZEN_MODE_OFF);
mController.onViewAttached(); mController.onViewAttached();
verify(mView).showIcon(DreamOverlayStatusBarView.STATUS_ICON_PRIORITY_MODE_ON, false); verify(mView).showIcon(
DreamOverlayStatusBarView.STATUS_ICON_PRIORITY_MODE_ON, false, null);
} }
@Test @Test
@@ -250,7 +263,9 @@ public class DreamOverlayStatusBarViewControllerTest extends SysuiTestCase {
ArgumentCaptor.forClass(ConnectivityManager.NetworkCallback.class); ArgumentCaptor.forClass(ConnectivityManager.NetworkCallback.class);
verify(mConnectivityManager).registerNetworkCallback(any(), callbackCapture.capture()); verify(mConnectivityManager).registerNetworkCallback(any(), callbackCapture.capture());
callbackCapture.getValue().onAvailable(mNetwork); callbackCapture.getValue().onAvailable(mNetwork);
verify(mView).showIcon(DreamOverlayStatusBarView.STATUS_ICON_WIFI_UNAVAILABLE, false);
verify(mView).showIcon(
DreamOverlayStatusBarView.STATUS_ICON_WIFI_UNAVAILABLE, false, null);
} }
@Test @Test
@@ -266,7 +281,9 @@ public class DreamOverlayStatusBarViewControllerTest extends SysuiTestCase {
ArgumentCaptor.forClass(ConnectivityManager.NetworkCallback.class); ArgumentCaptor.forClass(ConnectivityManager.NetworkCallback.class);
verify(mConnectivityManager).registerNetworkCallback(any(), callbackCapture.capture()); verify(mConnectivityManager).registerNetworkCallback(any(), callbackCapture.capture());
callbackCapture.getValue().onLost(mNetwork); callbackCapture.getValue().onLost(mNetwork);
verify(mView).showIcon(DreamOverlayStatusBarView.STATUS_ICON_WIFI_UNAVAILABLE, true);
verify(mView).showIcon(
DreamOverlayStatusBarView.STATUS_ICON_WIFI_UNAVAILABLE, true, null);
} }
@Test @Test
@@ -283,7 +300,9 @@ public class DreamOverlayStatusBarViewControllerTest extends SysuiTestCase {
when(mNetworkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI)) when(mNetworkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI))
.thenReturn(true); .thenReturn(true);
callbackCapture.getValue().onCapabilitiesChanged(mNetwork, mNetworkCapabilities); callbackCapture.getValue().onCapabilitiesChanged(mNetwork, mNetworkCapabilities);
verify(mView).showIcon(DreamOverlayStatusBarView.STATUS_ICON_WIFI_UNAVAILABLE, false);
verify(mView).showIcon(
DreamOverlayStatusBarView.STATUS_ICON_WIFI_UNAVAILABLE, false, null);
} }
@Test @Test
@@ -333,7 +352,8 @@ public class DreamOverlayStatusBarViewControllerTest extends SysuiTestCase {
callbackCapture.getValue().onSensorBlockedChanged( callbackCapture.getValue().onSensorBlockedChanged(
SensorPrivacyManager.Sensors.MICROPHONE, true); SensorPrivacyManager.Sensors.MICROPHONE, true);
verify(mView).showIcon(DreamOverlayStatusBarView.STATUS_ICON_MIC_CAMERA_DISABLED, true); verify(mView).showIcon(
DreamOverlayStatusBarView.STATUS_ICON_MIC_CAMERA_DISABLED, true, null);
} }
@Test @Test
@@ -350,7 +370,8 @@ public class DreamOverlayStatusBarViewControllerTest extends SysuiTestCase {
callbackCapture.getValue().onSensorBlockedChanged( callbackCapture.getValue().onSensorBlockedChanged(
SensorPrivacyManager.Sensors.MICROPHONE, false); SensorPrivacyManager.Sensors.MICROPHONE, false);
verify(mView).showIcon(DreamOverlayStatusBarView.STATUS_ICON_MIC_CAMERA_DISABLED, false); verify(mView).showIcon(
DreamOverlayStatusBarView.STATUS_ICON_MIC_CAMERA_DISABLED, false, null);
} }
@Test @Test
@@ -364,7 +385,8 @@ public class DreamOverlayStatusBarViewControllerTest extends SysuiTestCase {
verify(mZenModeController).addCallback(callbackCapture.capture()); verify(mZenModeController).addCallback(callbackCapture.capture());
callbackCapture.getValue().onZenChanged(Settings.Global.ZEN_MODE_NO_INTERRUPTIONS); callbackCapture.getValue().onZenChanged(Settings.Global.ZEN_MODE_NO_INTERRUPTIONS);
verify(mView).showIcon(DreamOverlayStatusBarView.STATUS_ICON_PRIORITY_MODE_ON, true); verify(mView).showIcon(
DreamOverlayStatusBarView.STATUS_ICON_PRIORITY_MODE_ON, true, null);
} }
@Test @Test
@@ -373,12 +395,12 @@ public class DreamOverlayStatusBarViewControllerTest extends SysuiTestCase {
.thenReturn(Settings.Global.ZEN_MODE_OFF); .thenReturn(Settings.Global.ZEN_MODE_OFF);
mController.onViewAttached(); mController.onViewAttached();
final ArgumentCaptor<ZenModeController.Callback> callbackCapture = final ArgumentCaptor<ZenModeController.Callback> callbackCapture =
ArgumentCaptor.forClass(ZenModeController.Callback.class); ArgumentCaptor.forClass(ZenModeController.Callback.class);
verify(mZenModeController).addCallback(callbackCapture.capture()); verify(mZenModeController).addCallback(callbackCapture.capture());
callbackCapture.getValue().onZenChanged(Settings.Global.ZEN_MODE_OFF); callbackCapture.getValue().onZenChanged(Settings.Global.ZEN_MODE_OFF);
verify(mView).showIcon(DreamOverlayStatusBarView.STATUS_ICON_PRIORITY_MODE_ON, false); verify(mView).showIcon(
DreamOverlayStatusBarView.STATUS_ICON_PRIORITY_MODE_ON, false, null);
} }
} }