diff options
| author | 2020-10-02 23:02:55 +0000 | |
|---|---|---|
| committer | 2020-10-02 23:02:55 +0000 | |
| commit | 2ed2c83c83286ee033b78b6fa11394ea405e57ed (patch) | |
| tree | f8ddc19c3cfd8a94eb02162b92350a91fde0690b /services | |
| parent | 8b40176ea5c0230cdbec729fadc7364f0f0ff4de (diff) | |
| parent | 467128aef528e1314f144d4e1d3be58202723f30 (diff) | |
Snap for 6880396 from 467128aef528e1314f144d4e1d3be58202723f30 to rvc-qpr1-release
Change-Id: Iaac5d68b2bbb5c46d7654447349c95f040007c6c
Diffstat (limited to 'services')
6 files changed, 129 insertions, 11 deletions
diff --git a/services/core/java/com/android/server/net/NetworkPolicyManagerService.java b/services/core/java/com/android/server/net/NetworkPolicyManagerService.java index b3eb53116d49..ffa518e266d9 100644 --- a/services/core/java/com/android/server/net/NetworkPolicyManagerService.java +++ b/services/core/java/com/android/server/net/NetworkPolicyManagerService.java @@ -586,7 +586,7 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub { private final NetworkPolicyLogger mLogger = new NetworkPolicyLogger(); - /** List of apps indexed by appId and whether they have the internet permission */ + /** List of apps indexed by uid and whether they have the internet permission */ @GuardedBy("mUidRulesFirstLock") private final SparseBooleanArray mInternetPermissionMap = new SparseBooleanArray(); @@ -972,7 +972,7 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub { if (LOGV) Slog.v(TAG, "ACTION_PACKAGE_ADDED for uid=" + uid); // Clear the cache for the app synchronized (mUidRulesFirstLock) { - mInternetPermissionMap.delete(UserHandle.getAppId(uid)); + mInternetPermissionMap.delete(uid); updateRestrictionRulesForUidUL(uid); } } @@ -4194,16 +4194,14 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub { @GuardedBy("mUidRulesFirstLock") private boolean hasInternetPermissionUL(int uid) { try { - final int appId = UserHandle.getAppId(uid); - final boolean hasPermission; - if (mInternetPermissionMap.indexOfKey(appId) < 0) { - hasPermission = - mIPm.checkUidPermission(Manifest.permission.INTERNET, uid) - == PackageManager.PERMISSION_GRANTED; - mInternetPermissionMap.put(appId, hasPermission); - } else { - hasPermission = mInternetPermissionMap.get(appId); + if (mInternetPermissionMap.get(uid)) { + return true; } + // If the cache shows that uid doesn't have internet permission, + // then always re-check with PackageManager just to be safe. + final boolean hasPermission = mIPm.checkUidPermission(Manifest.permission.INTERNET, + uid) == PackageManager.PERMISSION_GRANTED; + mInternetPermissionMap.put(uid, hasPermission); return hasPermission; } catch (RemoteException e) { } diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index d42c7eae18ce..c20a912152cd 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -3655,6 +3655,8 @@ public class PackageManagerService extends IPackageManager.Stub PackageParser.readConfigUseRoundIcon(mContext.getResources()); mServiceStartWithDelay = SystemClock.uptimeMillis() + (60 * 1000L); + + Slog.i(TAG, "Fix for b/169414761 is applied"); } /** diff --git a/services/core/java/com/android/server/wm/DisplayContent.java b/services/core/java/com/android/server/wm/DisplayContent.java index 553aad1a43cd..946d797b8348 100644 --- a/services/core/java/com/android/server/wm/DisplayContent.java +++ b/services/core/java/com/android/server/wm/DisplayContent.java @@ -1496,6 +1496,15 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo // intermediate orientation change, it is more stable to freeze the display. return false; } + if (r.isState(RESUMED) && !r.getRootTask().mInResumeTopActivity) { + // If the activity is executing or has done the lifecycle callback, use normal + // rotation animation so the display info can be updated immediately (see + // updateDisplayAndOrientation). This prevents a compatibility issue such as + // calling setRequestedOrientation in Activity#onCreate and then get display info. + // If fixed rotation is applied, the display rotation will still be the old one, + // unless the client side gets the rotation again after the adjustments arrive. + return false; + } } else if (r != topRunningActivity()) { // If the transition has not started yet, the activity must be the top. return false; diff --git a/services/core/java/com/android/server/wm/DisplayPolicy.java b/services/core/java/com/android/server/wm/DisplayPolicy.java index c691a0e220ed..515d1f58d3ef 100644 --- a/services/core/java/com/android/server/wm/DisplayPolicy.java +++ b/services/core/java/com/android/server/wm/DisplayPolicy.java @@ -2659,6 +2659,14 @@ public class DisplayPolicy { } win.computeFrame(displayFrames); + + // When system bars are added to the Android device through {@link #layoutStatusBar} and + // {@link #layoutNavigationBar}, the displayFrames are adjusted to take the system bars into + // account. The call below adjusts the display frames for system bars which use flexible + // insets mapping instead of {@link #layoutStatusbar} and {@link #layoutNavigationBar}. Note + // that this call is a no-op if not using flexible insets mapping. + adjustDisplayFramesForFlexibleInsets(win, displayFrames); + // Dock windows carve out the bottom of the screen, so normal windows // can't appear underneath them. if (type == TYPE_INPUT_METHOD && win.isVisibleLw() @@ -2671,6 +2679,40 @@ public class DisplayPolicy { } } + private void adjustDisplayFramesForFlexibleInsets(WindowState win, + DisplayFrames displayFrames) { + if (win == mStatusBarAlt) { + adjustDisplayFramesForWindow(win, mStatusBarAltPosition, displayFrames); + } else if (win == mNavigationBarAlt) { + adjustDisplayFramesForWindow(win, mNavigationBarAltPosition, displayFrames); + } else if (win == mClimateBarAlt) { + adjustDisplayFramesForWindow(win, mClimateBarAltPosition, displayFrames); + } else if (win == mExtraNavBarAlt) { + adjustDisplayFramesForWindow(win, mExtraNavBarAltPosition, displayFrames); + } + } + + private static void adjustDisplayFramesForWindow(WindowState win, + @WindowManagerPolicy.AltBarPosition int position, DisplayFrames displayFrames) { + final Rect frame = win.getFrameLw(); + + // Note: This doesn't take into account display cutouts. + switch (position) { + case ALT_BAR_TOP: + displayFrames.mStable.top = frame.bottom; + break; + case ALT_BAR_BOTTOM: + displayFrames.mStable.bottom = displayFrames.mStableFullscreen.bottom = frame.top; + break; + case ALT_BAR_LEFT: + displayFrames.mStable.left = displayFrames.mStableFullscreen.left = frame.right; + break; + case ALT_BAR_RIGHT: + displayFrames.mStable.right = displayFrames.mStableFullscreen.right = frame.left; + break; + } + } + private void layoutWallpaper(DisplayFrames displayFrames, Rect pf, Rect df, Rect cf) { // The wallpaper has Real Ultimate Power df.set(displayFrames.mUnrestricted); diff --git a/services/tests/wmtests/src/com/android/server/wm/DisplayContentTests.java b/services/tests/wmtests/src/com/android/server/wm/DisplayContentTests.java index c7a8bd857674..1948003a7499 100644 --- a/services/tests/wmtests/src/com/android/server/wm/DisplayContentTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/DisplayContentTests.java @@ -1276,6 +1276,27 @@ public class DisplayContentTests extends WindowTestsBase { } @Test + public void testNoFixedRotationOnResumedScheduledApp() { + final ActivityRecord app = new ActivityTestsBase.StackBuilder(mWm.mRoot) + .setDisplay(mDisplayContent).build().getTopMostActivity(); + app.setVisible(false); + app.setState(ActivityStack.ActivityState.RESUMED, "test"); + mDisplayContent.prepareAppTransition(WindowManager.TRANSIT_ACTIVITY_OPEN, + false /* alwaysKeepCurrent */); + mDisplayContent.mOpeningApps.add(app); + final int newOrientation = getRotatedOrientation(mDisplayContent); + app.setRequestedOrientation(newOrientation); + + // The condition should reject using fixed rotation because the resumed client in real case + // might get display info immediately. And the fixed rotation adjustments haven't arrived + // client side so the info may be inconsistent with the requested orientation. + verify(mDisplayContent).handleTopActivityLaunchingInDifferentOrientation(eq(app), + eq(true) /* checkOpening */); + assertFalse(app.isFixedRotationTransforming()); + assertFalse(mDisplayContent.hasTopFixedRotationLaunchingApp()); + } + + @Test public void testRecentsNotRotatingWithFixedRotation() { final DisplayRotation displayRotation = mDisplayContent.getDisplayRotation(); doCallRealMethod().when(displayRotation).updateRotationUnchecked(anyBoolean()); diff --git a/services/tests/wmtests/src/com/android/server/wm/DisplayPolicyLayoutTests.java b/services/tests/wmtests/src/com/android/server/wm/DisplayPolicyLayoutTests.java index cb9b49abfe2b..58d4104bf2b0 100644 --- a/services/tests/wmtests/src/com/android/server/wm/DisplayPolicyLayoutTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/DisplayPolicyLayoutTests.java @@ -45,6 +45,7 @@ import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION; import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY; import static android.view.WindowManager.LayoutParams.TYPE_NAVIGATION_BAR_PANEL; import static android.view.WindowManager.LayoutParams.TYPE_STATUS_BAR; +import static android.view.WindowManager.LayoutParams.TYPE_STATUS_BAR_ADDITIONAL; import static android.view.WindowManager.LayoutParams.TYPE_STATUS_BAR_SUB_PANEL; import static android.view.WindowManagerPolicyConstants.ALT_BAR_BOTTOM; import static android.view.WindowManagerPolicyConstants.ALT_BAR_LEFT; @@ -753,6 +754,51 @@ public class DisplayPolicyLayoutTests extends DisplayPolicyTestsBase { } @Test + public void layoutWindowLw_withFlexibleSystemBars_adjustStableFrame() { + mDisplayPolicy.removeWindowLw(mStatusBarWindow); + mDisplayPolicy.removeWindowLw(mNavBarWindow); + + WindowState statusWin = spy(createWindow(null, TYPE_STATUS_BAR_ADDITIONAL, + "StatusBarAdditional")); + doNothing().when(statusWin).computeFrameLw(); + statusWin.mAttrs.providesInsetsTypes = new int[]{ITYPE_STATUS_BAR}; + statusWin.mAttrs.gravity = Gravity.TOP; + statusWin.mAttrs.height = STATUS_BAR_HEIGHT; + statusWin.mAttrs.width = MATCH_PARENT; + statusWin.getFrameLw().set(0, 0, DISPLAY_WIDTH, STATUS_BAR_HEIGHT); + addWindow(statusWin); + + WindowState navWin = spy(createWindow(null, TYPE_NAVIGATION_BAR_PANEL, + "NavigationBarPanel")); + doNothing().when(navWin).computeFrameLw(); + navWin.mAttrs.providesInsetsTypes = new int[]{ITYPE_NAVIGATION_BAR}; + navWin.mAttrs.gravity = Gravity.BOTTOM; + navWin.mAttrs.height = NAV_BAR_HEIGHT; + navWin.mAttrs.width = MATCH_PARENT; + navWin.getFrameLw().set(0, DISPLAY_HEIGHT - NAV_BAR_HEIGHT, DISPLAY_WIDTH, DISPLAY_HEIGHT); + addWindow(navWin); + + WindowState climateWin = spy(createWindow(null, TYPE_NAVIGATION_BAR_PANEL, + "ClimatePanel")); + doNothing().when(climateWin).computeFrameLw(); + climateWin.mAttrs.providesInsetsTypes = new int[]{ITYPE_CLIMATE_BAR}; + climateWin.mAttrs.gravity = Gravity.LEFT; + climateWin.mAttrs.height = MATCH_PARENT; + climateWin.mAttrs.width = 20; + climateWin.getFrameLw().set(0, 0, 20, DISPLAY_HEIGHT); + addWindow(climateWin); + + mDisplayPolicy.beginLayoutLw(mFrames, 0 /* UI mode */); + mDisplayPolicy.layoutWindowLw(statusWin, null, mFrames); + mDisplayPolicy.layoutWindowLw(navWin, null, mFrames); + mDisplayPolicy.layoutWindowLw(climateWin, null, mFrames); + + assertThat(mFrames.mStable, + is(new Rect(20, STATUS_BAR_HEIGHT, DISPLAY_WIDTH, + DISPLAY_HEIGHT - NAV_BAR_HEIGHT))); + } + + @Test public void layoutHint_appWindow() { mWindow.mAttrs.flags = FLAG_LAYOUT_IN_SCREEN | FLAG_LAYOUT_INSET_DECOR | FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS; |