Merge "Clarify documentation for sensor placement" into qt-dev
diff --git a/packages/SystemUI/src/com/android/systemui/ScreenDecorations.java b/packages/SystemUI/src/com/android/systemui/ScreenDecorations.java
index 5e19219..b7bb4d9 100644
--- a/packages/SystemUI/src/com/android/systemui/ScreenDecorations.java
+++ b/packages/SystemUI/src/com/android/systemui/ScreenDecorations.java
@@ -77,8 +77,10 @@
import com.android.systemui.fragments.FragmentHostManager.FragmentListener;
import com.android.systemui.plugins.qs.QS;
import com.android.systemui.qs.SecureSetting;
+import com.android.systemui.shared.system.QuickStepContract;
import com.android.systemui.statusbar.phone.CollapsedStatusBarFragment;
import com.android.systemui.statusbar.phone.NavigationBarTransitions;
+import com.android.systemui.statusbar.phone.NavigationModeController;
import com.android.systemui.statusbar.phone.StatusBar;
import com.android.systemui.tuner.TunablePadding;
import com.android.systemui.tuner.TunerService;
@@ -125,6 +127,7 @@
private Handler mHandler;
private boolean mAssistHintBlocked = false;
private boolean mIsReceivingNavBarColor = false;
+ private boolean mInGesturalMode;
/**
* Converts a set of {@link Rect}s into a {@link Region}
@@ -149,6 +152,28 @@
mHandler.post(this::startOnScreenDecorationsThread);
setupStatusBarPaddingIfNeeded();
putComponent(ScreenDecorations.class, this);
+ mInGesturalMode = QuickStepContract.isGesturalMode(
+ Dependency.get(NavigationModeController.class)
+ .addListener(this::handleNavigationModeChange));
+ }
+
+ @VisibleForTesting
+ void handleNavigationModeChange(int navigationMode) {
+ if (!mHandler.getLooper().isCurrentThread()) {
+ mHandler.post(() -> handleNavigationModeChange(navigationMode));
+ return;
+ }
+ boolean inGesturalMode = QuickStepContract.isGesturalMode(navigationMode);
+ if (mInGesturalMode != inGesturalMode) {
+ mInGesturalMode = inGesturalMode;
+
+ if (mInGesturalMode && mOverlay == null) {
+ setupDecorations();
+ if (mOverlay != null) {
+ updateLayoutParams();
+ }
+ }
+ }
}
private void fade(View view, boolean fadeIn, boolean isLeft) {
@@ -232,6 +257,7 @@
break;
}
}
+ updateWindowVisibilities();
}
/**
@@ -256,11 +282,15 @@
return thread.getThreadHandler();
}
+ private boolean shouldHostHandles() {
+ return mInGesturalMode;
+ }
+
private void startOnScreenDecorationsThread() {
mRotation = RotationUtils.getExactRotation(mContext);
mWindowManager = mContext.getSystemService(WindowManager.class);
updateRoundedCornerRadii();
- if (hasRoundedCorners() || shouldDrawCutout()) {
+ if (hasRoundedCorners() || shouldDrawCutout() || shouldHostHandles()) {
setupDecorations();
}
@@ -565,7 +595,10 @@
boolean visibleForCutout = shouldDrawCutout()
&& overlay.findViewById(R.id.display_cutout).getVisibility() == View.VISIBLE;
boolean visibleForRoundedCorners = hasRoundedCorners();
- overlay.setVisibility(visibleForCutout || visibleForRoundedCorners
+ boolean visibleForHandles = overlay.findViewById(R.id.assist_hint_left).getVisibility()
+ == View.VISIBLE || overlay.findViewById(R.id.assist_hint_right).getVisibility()
+ == View.VISIBLE;
+ overlay.setVisibility(visibleForCutout || visibleForRoundedCorners || visibleForHandles
? View.VISIBLE : View.GONE);
}
@@ -688,10 +721,6 @@
setSize(mOverlay.findViewById(R.id.right), sizeTop);
setSize(mBottomOverlay.findViewById(R.id.left), sizeBottom);
setSize(mBottomOverlay.findViewById(R.id.right), sizeBottom);
- setSize(mOverlay.findViewById(R.id.assist_hint_left), sizeTop * 2);
- setSize(mOverlay.findViewById(R.id.assist_hint_right), sizeTop * 2);
- setSize(mBottomOverlay.findViewById(R.id.assist_hint_left), sizeBottom * 2);
- setSize(mBottomOverlay.findViewById(R.id.assist_hint_right), sizeBottom * 2);
}
});
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationInfo.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationInfo.java
index 0f6740d..7c6c556 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationInfo.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationInfo.java
@@ -569,16 +569,21 @@
switch (behavior) {
case BEHAVIOR_ALERTING:
- alert.setSelected(true);
- silence.setSelected(false);
mPriorityDescriptionView.setVisibility(VISIBLE);
mSilentDescriptionView.setVisibility(GONE);
+ post(() -> {
+ alert.setSelected(true);
+ silence.setSelected(false);
+ });
break;
case BEHAVIOR_SILENT:
- alert.setSelected(false);
- silence.setSelected(true);
+
mSilentDescriptionView.setVisibility(VISIBLE);
mPriorityDescriptionView.setVisibility(GONE);
+ post(() -> {
+ alert.setSelected(false);
+ silence.setSelected(true);
+ });
break;
default:
throw new IllegalArgumentException("Unrecognized alerting behavior: " + behavior);
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 e79aa45..5fff054 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java
@@ -1520,6 +1520,8 @@
@Override // UnlockMethodCache.OnUnlockMethodChangedListener
public void onUnlockMethodStateChanged() {
+ // Unlock method state changed. Notify KeguardMonitor
+ updateKeyguardState();
logStateToEventlog();
}
@@ -3416,9 +3418,7 @@
checkBarModes();
updateScrimController();
mPresenter.updateMediaMetaData(false, mState != StatusBarState.KEYGUARD);
- mKeyguardMonitor.notifyKeyguardState(mStatusBarKeyguardViewManager.isShowing(),
- mUnlockMethodCache.isMethodSecure(),
- mStatusBarKeyguardViewManager.isOccluded());
+ updateKeyguardState();
Trace.endSection();
}
@@ -3457,6 +3457,12 @@
mStatusBarStateController.setIsDozing(dozing);
}
+ private void updateKeyguardState() {
+ mKeyguardMonitor.notifyKeyguardState(mStatusBarKeyguardViewManager.isShowing(),
+ mUnlockMethodCache.isMethodSecure(),
+ mStatusBarKeyguardViewManager.isOccluded());
+ }
+
public void onActivationReset() {
mKeyguardIndicationController.hideTransientIndication();
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/ScreenDecorationsTest.java b/packages/SystemUI/tests/src/com/android/systemui/ScreenDecorationsTest.java
index 64ab060..3b5e12c 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/ScreenDecorationsTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/ScreenDecorationsTest.java
@@ -45,6 +45,7 @@
import android.view.Display;
import android.view.View;
import android.view.WindowManager;
+import android.view.WindowManagerPolicyConstants;
import androidx.test.filters.SmallTest;
@@ -52,6 +53,7 @@
import com.android.systemui.ScreenDecorations.TunablePaddingTagListener;
import com.android.systemui.fragments.FragmentHostManager;
import com.android.systemui.fragments.FragmentService;
+import com.android.systemui.statusbar.phone.NavigationModeController;
import com.android.systemui.statusbar.phone.StatusBar;
import com.android.systemui.statusbar.phone.StatusBarWindowView;
import com.android.systemui.tuner.TunablePadding;
@@ -78,6 +80,7 @@
private TunerService mTunerService;
private StatusBarWindowView mView;
private TunablePaddingService mTunablePaddingService;
+ private NavigationModeController mNavigationModeController;
@Before
public void setup() {
@@ -87,6 +90,8 @@
mTunablePaddingService = mDependency.injectMockDependency(TunablePaddingService.class);
mTunerService = mDependency.injectMockDependency(TunerService.class);
mFragmentService = mDependency.injectMockDependency(FragmentService.class);
+ mNavigationModeController = mDependency.injectMockDependency(
+ NavigationModeController.class);
mStatusBar = mock(StatusBar.class);
mWindowManager = mock(WindowManager.class);
@@ -208,6 +213,54 @@
}
@Test
+ public void testAssistHandles() {
+ mContext.getOrCreateTestableResources().addOverride(
+ com.android.internal.R.bool.config_fillMainBuiltInDisplayCutout, false);
+ mContext.getOrCreateTestableResources().addOverride(
+ com.android.internal.R.dimen.rounded_corner_radius, 0);
+ mContext.getOrCreateTestableResources().addOverride(
+ com.android.internal.R.dimen.rounded_corner_radius_top, 0);
+ mContext.getOrCreateTestableResources().addOverride(
+ com.android.internal.R.dimen.rounded_corner_radius_bottom, 0);
+ mContext.getOrCreateTestableResources()
+ .addOverride(dimen.rounded_corner_content_padding, 0);
+ when(mNavigationModeController.addListener(any())).thenReturn(
+ WindowManagerPolicyConstants.NAV_BAR_MODE_GESTURAL);
+
+ mScreenDecorations.start();
+
+ // Add 2 windows for rounded corners (top and bottom).
+ verify(mWindowManager, times(2)).addView(any(), any());
+ }
+
+ @Test
+ public void testDelayedAssistHandles() {
+ mContext.getOrCreateTestableResources().addOverride(
+ com.android.internal.R.bool.config_fillMainBuiltInDisplayCutout, false);
+ mContext.getOrCreateTestableResources().addOverride(
+ com.android.internal.R.dimen.rounded_corner_radius, 0);
+ mContext.getOrCreateTestableResources().addOverride(
+ com.android.internal.R.dimen.rounded_corner_radius_top, 0);
+ mContext.getOrCreateTestableResources().addOverride(
+ com.android.internal.R.dimen.rounded_corner_radius_bottom, 0);
+ mContext.getOrCreateTestableResources()
+ .addOverride(dimen.rounded_corner_content_padding, 0);
+ when(mNavigationModeController.addListener(any())).thenReturn(
+ WindowManagerPolicyConstants.NAV_BAR_MODE_3BUTTON);
+
+ mScreenDecorations.start();
+
+ // No handles and no corners
+ verify(mWindowManager, never()).addView(any(), any());
+
+ mScreenDecorations.handleNavigationModeChange(
+ WindowManagerPolicyConstants.NAV_BAR_MODE_GESTURAL);
+
+ // Add 2 windows for rounded corners (top and bottom).
+ verify(mWindowManager, times(2)).addView(any(), any());
+ }
+
+ @Test
public void hasRoundedCornerOverlayFlagSet() {
assertThat(mScreenDecorations.getWindowLayoutParams().privateFlags
& PRIVATE_FLAG_IS_ROUNDED_CORNERS_OVERLAY,
diff --git a/services/core/java/com/android/server/ConnectivityService.java b/services/core/java/com/android/server/ConnectivityService.java
index 7a2aa7e..a6ff37e 100644
--- a/services/core/java/com/android/server/ConnectivityService.java
+++ b/services/core/java/com/android/server/ConnectivityService.java
@@ -3633,20 +3633,37 @@
mNotifier.showNotification(nai.network.netId, type, nai, null, pendingIntent, true);
}
+ private boolean shouldPromptUnvalidated(NetworkAgentInfo nai) {
+ // Don't prompt if the network is validated, and don't prompt on captive portals
+ // because we're already prompting the user to sign in.
+ if (nai.everValidated || nai.everCaptivePortalDetected) {
+ return false;
+ }
+
+ // If a network has partial connectivity, always prompt unless the user has already accepted
+ // partial connectivity and selected don't ask again. This ensures that if the device
+ // automatically connects to a network that has partial Internet access, the user will
+ // always be able to use it, either because they've already chosen "don't ask again" or
+ // because we have prompt them.
+ if (nai.partialConnectivity && !nai.networkMisc.acceptPartialConnectivity) {
+ return true;
+ }
+
+ // If a network has no Internet access, only prompt if the network was explicitly selected
+ // and if the user has not already told us to use the network regardless of whether it
+ // validated or not.
+ if (nai.networkMisc.explicitlySelected && !nai.networkMisc.acceptUnvalidated) {
+ return true;
+ }
+
+ return false;
+ }
+
private void handlePromptUnvalidated(Network network) {
if (VDBG || DDBG) log("handlePromptUnvalidated " + network);
NetworkAgentInfo nai = getNetworkAgentInfoForNetwork(network);
- // Only prompt if the network is unvalidated or network has partial internet connectivity
- // and was explicitly selected by the user, and if we haven't already been told to switch
- // to it regardless of whether it validated or not. Also don't prompt on captive portals
- // because we're already prompting the user to sign in.
- if (nai == null || nai.everValidated || nai.everCaptivePortalDetected
- || !nai.networkMisc.explicitlySelected || nai.networkMisc.acceptUnvalidated
- // TODO: Once the value of acceptPartialConnectivity is moved to IpMemoryStore,
- // we should reevaluate how to handle acceptPartialConnectivity when network just
- // connected.
- || nai.networkMisc.acceptPartialConnectivity) {
+ if (nai == null || !shouldPromptUnvalidated(nai)) {
return;
}