diff options
31 files changed, 330 insertions, 175 deletions
diff --git a/core/api/current.txt b/core/api/current.txt index e35888f03e02..77d927b52b97 100644 --- a/core/api/current.txt +++ b/core/api/current.txt @@ -24036,7 +24036,7 @@ package android.location { method public void setBearingAccuracyDegrees(float); method public void setElapsedRealtimeNanos(long); method public void setElapsedRealtimeUncertaintyNanos(double); - method @Deprecated public void setExtras(android.os.Bundle); + method @Deprecated public void setExtras(@Nullable android.os.Bundle); method public void setLatitude(double); method public void setLongitude(double); method public void setProvider(String); diff --git a/core/java/android/app/TaskInfo.java b/core/java/android/app/TaskInfo.java index 8367bde61403..fe382a33a8c5 100644 --- a/core/java/android/app/TaskInfo.java +++ b/core/java/android/app/TaskInfo.java @@ -195,6 +195,14 @@ public class TaskInfo { public Rect letterboxActivityBounds; /** + * Activity insets if this task or its top activity is presented in letterbox mode and + * {@code null} otherwise. + * @hide + */ + @Nullable + public Rect letterboxActivityInsets; + + /** * Relative position of the task's top left corner in the parent container. * @hide */ @@ -328,7 +336,8 @@ public class TaskInfo { && Objects.equals( getConfiguration().windowConfiguration.getMaxBounds(), that.getConfiguration().windowConfiguration.getMaxBounds()) - && Objects.equals(parentBounds, that.parentBounds); + && Objects.equals(parentBounds, that.parentBounds) + && Objects.equals(letterboxActivityInsets, that.letterboxActivityInsets); } /** @@ -365,6 +374,7 @@ public class TaskInfo { parentBounds = source.readTypedObject(Rect.CREATOR); isFocused = source.readBoolean(); isVisible = source.readBoolean(); + letterboxActivityInsets = source.readTypedObject(Rect.CREATOR); } /** @@ -402,6 +412,7 @@ public class TaskInfo { dest.writeTypedObject(parentBounds, flags); dest.writeBoolean(isFocused); dest.writeBoolean(isVisible); + dest.writeTypedObject(letterboxActivityInsets, flags); } @Override @@ -428,6 +439,7 @@ public class TaskInfo { + " parentBounds=" + parentBounds + " isFocused=" + isFocused + " isVisible=" + isVisible + + " letterboxActivityInsets=" + letterboxActivityInsets + "}"; } } diff --git a/core/java/android/hardware/input/InputManager.java b/core/java/android/hardware/input/InputManager.java index f1d60f6cec83..40c7e9a892ff 100644 --- a/core/java/android/hardware/input/InputManager.java +++ b/core/java/android/hardware/input/InputManager.java @@ -208,6 +208,14 @@ public final class InputManager { public static final long BLOCK_UNTRUSTED_TOUCHES = 158002302L; /** + * Check whether apps are using FLAG_SLIPPERY for their windows. We expect that this flag is + * only used by the system components. If so, we can lock it down. + * @hide + */ + @ChangeId + public static final long BLOCK_FLAG_SLIPPERY = android.os.IInputConstants.BLOCK_FLAG_SLIPPERY; + + /** * Input Event Injection Synchronization Mode: None. * Never blocks. Injection is asynchronous and is assumed always to be successful. * @hide diff --git a/core/java/android/net/NetworkCapabilities.java b/core/java/android/net/NetworkCapabilities.java index 8dad11ffa731..1a37fb9fb690 100644 --- a/core/java/android/net/NetworkCapabilities.java +++ b/core/java/android/net/NetworkCapabilities.java @@ -975,6 +975,10 @@ public final class NetworkCapabilities implements Parcelable { return mOwnerUid; } + private boolean equalsOwnerUid(@NonNull final NetworkCapabilities nc) { + return mOwnerUid == nc.mOwnerUid; + } + /** * UIDs of packages that are administrators of this network, or empty if none. * @@ -1684,6 +1688,7 @@ public final class NetworkCapabilities implements Parcelable { && equalsTransportInfo(that) && equalsUids(that) && equalsSSID(that) + && equalsOwnerUid(that) && equalsPrivateDnsBroken(that) && equalsRequestor(that) && equalsAdministratorUids(that); @@ -1697,17 +1702,18 @@ public final class NetworkCapabilities implements Parcelable { + ((int) (mUnwantedNetworkCapabilities >> 32) * 7) + ((int) (mTransportTypes & 0xFFFFFFFF) * 11) + ((int) (mTransportTypes >> 32) * 13) - + (mLinkUpBandwidthKbps * 17) - + (mLinkDownBandwidthKbps * 19) + + mLinkUpBandwidthKbps * 17 + + mLinkDownBandwidthKbps * 19 + Objects.hashCode(mNetworkSpecifier) * 23 - + (mSignalStrength * 29) - + Objects.hashCode(mUids) * 31 - + Objects.hashCode(mSSID) * 37 - + Objects.hashCode(mTransportInfo) * 41 - + Objects.hashCode(mPrivateDnsBroken) * 43 - + Objects.hashCode(mRequestorUid) * 47 - + Objects.hashCode(mRequestorPackageName) * 53 - + Arrays.hashCode(mAdministratorUids) * 59; + + mSignalStrength * 29 + + mOwnerUid * 31 + + Objects.hashCode(mUids) * 37 + + Objects.hashCode(mSSID) * 41 + + Objects.hashCode(mTransportInfo) * 43 + + Objects.hashCode(mPrivateDnsBroken) * 47 + + Objects.hashCode(mRequestorUid) * 53 + + Objects.hashCode(mRequestorPackageName) * 59 + + Arrays.hashCode(mAdministratorUids) * 61; } @Override diff --git a/core/java/android/telephony/TelephonyRegistryManager.java b/core/java/android/telephony/TelephonyRegistryManager.java index cc3284a1f885..a9548b0a42b4 100644 --- a/core/java/android/telephony/TelephonyRegistryManager.java +++ b/core/java/android/telephony/TelephonyRegistryManager.java @@ -786,6 +786,21 @@ public class TelephonyRegistryManager { } } + /** + * Notify that the data enabled has changed. + * + * @param enabled True if data is enabled, otherwise disabled. + * @param reason Reason for data enabled/disabled. See {@code REASON_*} in + * {@link TelephonyManager}. + */ + public void notifyDataEnabled(boolean enabled, @TelephonyManager.DataEnabledReason int reason) { + try { + sRegistry.notifyDataEnabled(enabled, reason); + } catch (RemoteException ex) { + // system server crash + } + } + public @NonNull Set<Integer> getEventsFromListener(@NonNull PhoneStateListener listener) { Set<Integer> eventList = new ArraySet<>(); diff --git a/core/java/com/android/internal/app/ResolverActivity.java b/core/java/com/android/internal/app/ResolverActivity.java index 2dbcbb5cf3c4..1a640d3acf66 100644 --- a/core/java/com/android/internal/app/ResolverActivity.java +++ b/core/java/com/android/internal/app/ResolverActivity.java @@ -1085,7 +1085,7 @@ public class ResolverActivity extends Activity implements } } - protected boolean onTargetSelected(TargetInfo target, boolean alwaysCheck) { + protected boolean onTargetSelected(TargetInfo target, boolean always) { final ResolveInfo ri = target.getResolveInfo(); final Intent intent = target != null ? target.getResolvedIntent() : null; @@ -1207,7 +1207,7 @@ public class ResolverActivity extends Activity implements if (otherProfileMatch > bestMatch) bestMatch = otherProfileMatch; } - if (alwaysCheck) { + if (always) { final int userId = getUserId(); final PackageManager pm = getPackageManager(); diff --git a/core/java/com/android/internal/os/BatteryStatsImpl.java b/core/java/com/android/internal/os/BatteryStatsImpl.java index 3f3b2029497b..4476e7e8e99d 100644 --- a/core/java/com/android/internal/os/BatteryStatsImpl.java +++ b/core/java/com/android/internal/os/BatteryStatsImpl.java @@ -13862,10 +13862,6 @@ public class BatteryStatsImpl extends BatteryStats { return u; } - public void onCleanupUserLocked(int userId) { - onCleanupUserLocked(userId, mClocks.elapsedRealtime()); - } - public void onCleanupUserLocked(int userId, long elapsedRealtimeMs) { final int firstUidForUser = UserHandle.getUid(userId, 0); final int lastUidForUser = UserHandle.getUid(userId, UserHandle.PER_USER_RANGE - 1); diff --git a/core/java/com/android/internal/telephony/ITelephonyRegistry.aidl b/core/java/com/android/internal/telephony/ITelephonyRegistry.aidl index c2cbc04fcee5..303365b4ab3b 100644 --- a/core/java/com/android/internal/telephony/ITelephonyRegistry.aidl +++ b/core/java/com/android/internal/telephony/ITelephonyRegistry.aidl @@ -94,4 +94,5 @@ interface ITelephonyRegistry { void notifyBarringInfoChanged(int slotIndex, int subId, in BarringInfo barringInfo); void notifyPhysicalChannelConfigForSubscriber(in int subId, in List<PhysicalChannelConfig> configs); + void notifyDataEnabled(boolean enabled, int reason); } diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/letterbox/LetterboxTaskListener.java b/libs/WindowManager/Shell/src/com/android/wm/shell/letterbox/LetterboxTaskListener.java index 6e87f131ed95..490ef3296be6 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/letterbox/LetterboxTaskListener.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/letterbox/LetterboxTaskListener.java @@ -164,8 +164,6 @@ public class LetterboxTaskListener implements ShellTaskOrganizer.TaskListener { switch (gravity) { case Gravity.TOP: positionInParent.y += taskBoundsWithInsets.top - activityBoundsWithInsets.top; - // Showing status bar decor view. - crop.top -= activityBoundsWithInsets.top - activityBounds.top; break; case Gravity.CENTER: positionInParent.y += @@ -187,8 +185,6 @@ public class LetterboxTaskListener implements ShellTaskOrganizer.TaskListener { final int gravity = mLetterboxConfigController.getLandscapeGravity(); // Align activity to the top. positionInParent.y += taskBoundsWithInsets.top - activityBoundsWithInsets.top; - // Showing status bar decor view. - crop.top -= activityBoundsWithInsets.top - activityBounds.top; switch (gravity) { case Gravity.LEFT: positionInParent.x += taskBoundsWithInsets.left - activityBoundsWithInsets.left; @@ -209,6 +205,53 @@ public class LetterboxTaskListener implements ShellTaskOrganizer.TaskListener { + " for task: #" + taskInfo.taskId); } } + + // New bounds of the activity after it's repositioned with required gravity. + Rect newActivityBounds = new Rect(activityBounds); + // Task's surfce will be repositioned to positionInParent together with the activity + // inside it so the new activity bounds are the original activity bounds offset by + // the task's offset. + newActivityBounds.offset( + positionInParent.x - taskBounds.left, positionInParent.y - taskBounds.top); + Rect newActivityBoundsWithInsets = new Rect(newActivityBounds); + newActivityBoundsWithInsets.intersect(displayBoundsWithInsets); + // Activity handles insets on its own (e.g. under status bar or navigation bar). + // crop that is calculated above crops all insets from an activity and below insets that + // can be shown are added back to the crop bounds (e.g. if activity is still shown at the + // top of the display then the top inset won't be cropped). + // After task's surface is repositioned, intersection between an activity and insets can + // change but if it doesn't, the activity should be shown under insets to maximize visible + // area. + // Also, an activity can use area under insets and insets shouldn't be cropped in this case + // regardless of a position on the screen. + final Rect activityInsetsFromCore = taskInfo.letterboxActivityInsets; + if (newActivityBounds.top - newActivityBoundsWithInsets.top + == activityBounds.top - activityBoundsWithInsets.top + // Check whether an activity is shown under inset. If it is, then the inset from + // WM Core and the inset computed here will be different because local insets + // doesn't take into account visibility of insets requested by the activity. + || activityBoundsWithInsets.top - activityBounds.top + != activityInsetsFromCore.top) { + crop.top -= activityBoundsWithInsets.top - activityBounds.top; + } + if (newActivityBounds.bottom - newActivityBoundsWithInsets.bottom + == activityBounds.bottom - activityBoundsWithInsets.bottom + || activityBounds.bottom - activityBoundsWithInsets.bottom + != activityInsetsFromCore.bottom) { + crop.bottom += activityBounds.bottom - activityBoundsWithInsets.bottom; + } + if (newActivityBounds.left - newActivityBoundsWithInsets.left + == activityBounds.left - activityBoundsWithInsets.left + || activityBoundsWithInsets.left - activityBounds.left + != activityInsetsFromCore.left) { + crop.left -= activityBoundsWithInsets.left - activityBounds.left; + } + if (newActivityBounds.right - newActivityBoundsWithInsets.right + == activityBounds.right - activityBoundsWithInsets.right + || activityBounds.right - activityBoundsWithInsets.right + != activityInsetsFromCore.right) { + crop.right += activityBounds.right - activityBoundsWithInsets.right; + } } private Insets getInsets() { diff --git a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/CommonAssertions.kt b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/CommonAssertions.kt index 3ed53fb221a7..1638d72f9914 100644 --- a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/CommonAssertions.kt +++ b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/CommonAssertions.kt @@ -25,7 +25,7 @@ fun LayersAssertion.appPairsDividerIsVisible( enabled: Boolean = bugId == 0 ) { end("appPairsDividerIsVisible", bugId, enabled) { - this.showsLayer(FlickerTestBase.APP_PAIRS_DIVIDER) + this.showsLayer(FlickerTestBase.SPLIT_DIVIDER) } } @@ -35,7 +35,7 @@ fun LayersAssertion.appPairsDividerIsInvisible( enabled: Boolean = bugId == 0 ) { end("appPairsDividerIsInVisible", bugId, enabled) { - this.hasNotLayer(FlickerTestBase.APP_PAIRS_DIVIDER) + this.hasNotLayer(FlickerTestBase.SPLIT_DIVIDER) } } diff --git a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/FlickerTestBase.kt b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/FlickerTestBase.kt index 54b8fdc83a1f..7809be04de96 100644 --- a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/FlickerTestBase.kt +++ b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/FlickerTestBase.kt @@ -130,7 +130,7 @@ abstract class FlickerTestBase { const val NAVIGATION_BAR_WINDOW_TITLE = "NavigationBar" const val STATUS_BAR_WINDOW_TITLE = "StatusBar" const val DOCKED_STACK_DIVIDER = "DockedStackDivider" - const val APP_PAIRS_DIVIDER = "AppPairDivider" + const val SPLIT_DIVIDER = "SplitDivider" const val IMAGE_WALLPAPER = "ImageWallpaper" } } diff --git a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/apppairs/AppPairsTest.kt b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/apppairs/AppPairsTest.kt index 7ac91b065fca..0f8d30a94ec6 100644 --- a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/apppairs/AppPairsTest.kt +++ b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/apppairs/AppPairsTest.kt @@ -108,7 +108,7 @@ class AppPairsTest( end("appsEndingBounds", enabled = false) { val entry = this.trace.entries.firstOrNull() ?: throw IllegalStateException("Trace is empty") - val dividerRegion = entry.getVisibleBounds(APP_PAIRS_DIVIDER) + val dividerRegion = entry.getVisibleBounds(SPLIT_DIVIDER) this.hasVisibleRegion(primaryApp.defaultWindowName, appPairsHelper.getPrimaryBounds(dividerRegion)) .and() @@ -152,7 +152,7 @@ class AppPairsTest( start("appsStartingBounds", enabled = false) { val entry = this.trace.entries.firstOrNull() ?: throw IllegalStateException("Trace is empty") - val dividerRegion = entry.getVisibleBounds(APP_PAIRS_DIVIDER) + val dividerRegion = entry.getVisibleBounds(SPLIT_DIVIDER) this.hasVisibleRegion(primaryApp.defaultWindowName, appPairsHelper.getPrimaryBounds(dividerRegion)) .and() diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/letterbox/LetterboxTaskListenerTest.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/letterbox/LetterboxTaskListenerTest.java index fc0e20b553d3..5cbc7d927d61 100644 --- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/letterbox/LetterboxTaskListenerTest.java +++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/letterbox/LetterboxTaskListenerTest.java @@ -99,7 +99,8 @@ public final class LetterboxTaskListenerTest extends ShellTestCase { /* maxBounds= */ new Rect(0, 0, 200, 100), // equal to parent bounds /* parentBounds */ new Rect(0, 0, 200, 100), /* activityBounds */ new Rect(75, 0, 125, 75), - /* taskBounds */ new Rect(50, 0, 125, 100)), + /* taskBounds */ new Rect(50, 0, 125, 100), + /* activityInsets */ new Rect(0, 0, 0, 0)), mLeash); // Task doesn't need to repositioned @@ -114,7 +115,8 @@ public final class LetterboxTaskListenerTest extends ShellTestCase { /* parentBounds */ new Rect(0, 0, 200, 100), // Activity is offset by 25 to the left /* activityBounds */ new Rect(50, 0, 100, 75), - /* taskBounds */ new Rect(50, 0, 125, 100))); + /* taskBounds */ new Rect(50, 0, 125, 100), + /* activityInsets */ new Rect(0, 0, 0, 0))); // Task needs to be repositioned by 25 to the left verifySetPosition(75, 0); @@ -135,7 +137,8 @@ public final class LetterboxTaskListenerTest extends ShellTestCase { /* maxBounds= */ new Rect(0, 0, 200, 100), // equal to parent bounds /* parentBounds */ new Rect(0, 0, 200, 100), /* activityBounds */ new Rect(150, 0, 200, 75), - /* taskBounds */ new Rect(125, 0, 200, 100)), + /* taskBounds */ new Rect(125, 0, 200, 100), + /* activityInsets */ new Rect(0, 10, 10, 0)), mLeash); verifySetPosition(-15, 0); @@ -156,7 +159,8 @@ public final class LetterboxTaskListenerTest extends ShellTestCase { /* maxBounds= */ new Rect(0, 0, 200, 100), // equal to parent bounds /* parentBounds */ new Rect(0, 0, 200, 100), /* activityBounds */ new Rect(150, 0, 200, 75), - /* taskBounds */ new Rect(125, 0, 200, 100)), + /* taskBounds */ new Rect(125, 0, 200, 100), + /* activityInsets */ new Rect(0, 10, 10, 0)), mLeash); verifySetPosition(55, 0); @@ -177,7 +181,8 @@ public final class LetterboxTaskListenerTest extends ShellTestCase { /* maxBounds= */ new Rect(0, 0, 200, 100), // equal to parent bounds /* parentBounds */ new Rect(0, 0, 200, 100), /* activityBounds */ new Rect(50, 0, 100, 75), - /* taskBounds */ new Rect(25, 0, 100, 100)), + /* taskBounds */ new Rect(25, 0, 100, 100), + /* activityInsets */ new Rect(0, 10, 10, 0)), mLeash); verifySetPosition(115, 0); @@ -198,7 +203,8 @@ public final class LetterboxTaskListenerTest extends ShellTestCase { /* maxBounds= */ new Rect(0, 0, 100, 150), // equal to parent bounds /* parentBounds */ new Rect(0, 0, 100, 150), /* activityBounds */ new Rect(0, 75, 50, 125), - /* taskBounds */ new Rect(0, 50, 100, 125)), + /* taskBounds */ new Rect(0, 50, 100, 125), + /* activityInsets */ new Rect(10, 0, 0, 0)), mLeash); verifySetPosition(20, -15); @@ -219,7 +225,8 @@ public final class LetterboxTaskListenerTest extends ShellTestCase { /* maxBounds= */ new Rect(0, 0, 100, 150), // equal to parent bounds /* parentBounds */ new Rect(0, 0, 100, 150), /* activityBounds */ new Rect(0, 75, 50, 125), - /* taskBounds */ new Rect(0, 50, 100, 125)), + /* taskBounds */ new Rect(0, 50, 100, 125), + /* activityInsets */ new Rect(10, 0, 0, 0)), mLeash); verifySetPosition(20, 20); @@ -228,6 +235,29 @@ public final class LetterboxTaskListenerTest extends ShellTestCase { } @Test + public void testOnTaskInfoAppeared_portraitWithCenterGravity_visibleLeftInset() { + mLetterboxConfigController.setPortraitGravity(Gravity.CENTER); + setWindowBoundsAndInsets( + /* windowBounds= */ new Rect(0, 0, 100, 150), // equal to parent bounds + Insets.of(/* left= */ 10, /* top= */ 10, /* right= */ 10, /* bottom= */ 20)); + + mLetterboxTaskListener.onTaskAppeared( + createTaskInfo( + /* taskId */ 1, + /* maxBounds= */ new Rect(0, 0, 100, 150), // equal to parent bounds + /* parentBounds */ new Rect(0, 0, 100, 150), + /* activityBounds */ new Rect(0, 75, 50, 125), + /* taskBounds */ new Rect(0, 50, 100, 125), + // Activity is drawn under the left inset. + /* activityInsets */ new Rect(0, 0, 0, 0)), + mLeash); + + verifySetPosition(20, 20); + // Should return activity coordinates offset by task coordinates + verifySetWindowCrop(new Rect(0, 25, 50, 75)); + } + + @Test public void testOnTaskInfoAppeared_portraitWithBottomGravity() { mLetterboxConfigController.setPortraitGravity(Gravity.BOTTOM); setWindowBoundsAndInsets( @@ -240,7 +270,8 @@ public final class LetterboxTaskListenerTest extends ShellTestCase { /* maxBounds= */ new Rect(0, 0, 100, 150), // equal to parent bounds /* parentBounds */ new Rect(0, 0, 100, 150), /* activityBounds */ new Rect(0, 75, 50, 125), - /* taskBounds */ new Rect(0, 50, 100, 125)), + /* taskBounds */ new Rect(0, 50, 100, 125), + /* activityInsets */ new Rect(10, 0, 0, 0)), mLeash); verifySetPosition(20, 55); @@ -261,14 +292,14 @@ public final class LetterboxTaskListenerTest extends ShellTestCase { /* maxBounds= */ new Rect(0, 0, 200, 125), // equal to parent bounds /* parentBounds */ new Rect(0, 0, 200, 125), /* activityBounds */ new Rect(15, 0, 175, 120), - /* taskBounds */ new Rect(0, 0, 100, 125)), // equal to parent bounds + /* taskBounds */ new Rect(0, 0, 200, 125), + /* activityInsets */ new Rect(10, 25, 10, 10)), // equal to parent bounds mLeash); // Activity fully covers parent bounds with insets so doesn't need to be moved. verifySetPosition(0, 0); - // Should return activity coordinates offset by task coordinates minus all insets - // except top one (keep status bar decor visible). - verifySetWindowCrop(new Rect(25, 0, 165, 110)); + // Should return activity coordinates offset by task coordinates + verifySetWindowCrop(new Rect(15, 0, 175, 120)); } @Test @@ -284,7 +315,8 @@ public final class LetterboxTaskListenerTest extends ShellTestCase { /* maxBounds= */ new Rect(0, 0, 100, 150), /* parentBounds */ new Rect(0, 75, 100, 225), /* activityBounds */ new Rect(25, 75, 75, 125), - /* taskBounds */ new Rect(0, 75, 100, 125)), + /* taskBounds */ new Rect(0, 75, 100, 125), + /* activityInsets */ new Rect(10, 0, 0, 0)), mLeash); verifySetPosition(0, 0); @@ -295,7 +327,8 @@ public final class LetterboxTaskListenerTest extends ShellTestCase { public void testOnTaskAppeared_calledSecondTimeWithSameTaskId_throwsException() { setWindowBoundsAndInsets(new Rect(), Insets.NONE); RunningTaskInfo taskInfo = - createTaskInfo(/* taskId */ 1, new Rect(), new Rect(), new Rect(), new Rect()); + createTaskInfo(/* taskId */ 1, new Rect(), new Rect(), new Rect(), new Rect(), + new Rect()); mLetterboxTaskListener.onTaskAppeared(taskInfo, mLeash); mLetterboxTaskListener.onTaskAppeared(taskInfo, mLeash); } @@ -319,13 +352,15 @@ public final class LetterboxTaskListenerTest extends ShellTestCase { final Rect maxBounds, final Rect parentBounds, final Rect activityBounds, - final Rect taskBounds) { + final Rect taskBounds, + final Rect activityInsets) { RunningTaskInfo taskInfo = new RunningTaskInfo(); taskInfo.taskId = taskId; taskInfo.configuration.windowConfiguration.setMaxBounds(maxBounds); taskInfo.parentBounds = parentBounds; taskInfo.configuration.windowConfiguration.setBounds(taskBounds); taskInfo.letterboxActivityBounds = Rect.copyOrNull(activityBounds); + taskInfo.letterboxActivityInsets = Rect.copyOrNull(activityInsets); return taskInfo; } diff --git a/location/java/android/location/Location.java b/location/java/android/location/Location.java index b4392b1d29b4..47ecbd80a07f 100644 --- a/location/java/android/location/Location.java +++ b/location/java/android/location/Location.java @@ -19,6 +19,7 @@ package android.location; import static java.util.concurrent.TimeUnit.NANOSECONDS; import android.annotation.NonNull; +import android.annotation.Nullable; import android.annotation.SystemApi; import android.compat.annotation.UnsupportedAppUsage; import android.os.Build; @@ -1066,7 +1067,7 @@ public class Location implements Parcelable { * @deprecated Do not use. */ @Deprecated - public void setExtras(Bundle extras) { + public void setExtras(@Nullable Bundle extras) { mExtras = (extras == null) ? null : new Bundle(extras); } diff --git a/services/core/java/com/android/server/ConnectivityService.java b/services/core/java/com/android/server/ConnectivityService.java index 0d0f0dd60d0e..854f9258e2b1 100644 --- a/services/core/java/com/android/server/ConnectivityService.java +++ b/services/core/java/com/android/server/ConnectivityService.java @@ -1287,7 +1287,7 @@ public class ConnectivityService extends IConnectivityManager.Stub if (network == null) { return null; } - return getNetworkAgentInfoForNetId(network.netId); + return getNetworkAgentInfoForNetId(network.getNetId()); } private NetworkAgentInfo getNetworkAgentInfoForNetId(int netId) { @@ -1378,7 +1378,7 @@ public class ConnectivityService extends IConnectivityManager.Stub } final String action = blocked ? "BLOCKED" : "UNBLOCKED"; mNetworkInfoBlockingLogs.log(String.format( - "%s %d(%d) on netId %d", action, nri.mUid, nri.request.requestId, net.netId)); + "%s %d(%d) on netId %d", action, nri.mUid, nri.request.requestId, net.getNetId())); } /** @@ -1890,7 +1890,7 @@ public class ConnectivityService extends IConnectivityManager.Stub int netId; synchronized (nai) { lp = nai.linkProperties; - netId = nai.network.netId; + netId = nai.network.getNetId(); } boolean ok = addLegacyRouteToHost(lp, addr, netId, uid); if (DBG) log("requestRouteToHostAddress ok=" + ok); @@ -2553,7 +2553,7 @@ public class ConnectivityService extends IConnectivityManager.Stub if (defaultNai == null) { pw.println("none"); } else { - pw.println(defaultNai.network.netId); + pw.println(defaultNai.network.getNetId()); } pw.println(); @@ -2690,7 +2690,7 @@ public class ConnectivityService extends IConnectivityManager.Stub private NetworkAgentInfo[] networksSortedById() { NetworkAgentInfo[] networks = new NetworkAgentInfo[0]; networks = mNetworkAgentInfos.values().toArray(networks); - Arrays.sort(networks, Comparator.comparingInt(nai -> nai.network.netId)); + Arrays.sort(networks, Comparator.comparingInt(nai -> nai.network.getNetId())); return networks; } @@ -2831,7 +2831,7 @@ public class ConnectivityService extends IConnectivityManager.Stub log(nai.toShortString() + " changed underlying networks to " + Arrays.toString(nai.declaredUnderlyingNetworks)); } - updateCapabilities(nai.getCurrentScore(), nai, nai.networkCapabilities); + updateCapabilitiesForNetwork(nai); notifyIfacesChangedForNetworkStats(); } } @@ -2855,8 +2855,7 @@ public class ConnectivityService extends IConnectivityManager.Stub if (probePrivateDnsCompleted) { if (nai.networkCapabilities.isPrivateDnsBroken() != privateDnsBroken) { nai.networkCapabilities.setPrivateDnsBroken(privateDnsBroken); - final int oldScore = nai.getCurrentScore(); - updateCapabilities(oldScore, nai, nai.networkCapabilities); + updateCapabilitiesForNetwork(nai); } // Only show the notification when the private DNS is broken and the // PRIVATE_DNS_BROKEN notification hasn't shown since last valid. @@ -2871,8 +2870,7 @@ public class ConnectivityService extends IConnectivityManager.Stub // done yet. In either case, the networkCapabilities should be updated to // reflect the new status. nai.networkCapabilities.setPrivateDnsBroken(false); - final int oldScore = nai.getCurrentScore(); - updateCapabilities(oldScore, nai, nai.networkCapabilities); + updateCapabilitiesForNetwork(nai); nai.networkAgentConfig.hasShownBroken = false; } break; @@ -2893,7 +2891,6 @@ public class ConnectivityService extends IConnectivityManager.Stub final NetworkAgentInfo nai = getNetworkAgentInfoForNetId(netId); // If captive portal status has changed, update capabilities or disconnect. if (nai != null && (visible != nai.lastCaptivePortalDetected)) { - final int oldScore = nai.getCurrentScore(); nai.lastCaptivePortalDetected = visible; nai.everCaptivePortalDetected |= visible; if (nai.lastCaptivePortalDetected && @@ -2904,7 +2901,7 @@ public class ConnectivityService extends IConnectivityManager.Stub teardownUnneededNetwork(nai); break; } - updateCapabilities(oldScore, nai, nai.networkCapabilities); + updateCapabilitiesForNetwork(nai); } if (!visible) { // Only clear SIGN_IN and NETWORK_SWITCH notifications here, or else other @@ -2974,13 +2971,13 @@ public class ConnectivityService extends IConnectivityManager.Stub handleFreshlyValidatedNetwork(nai); // Clear NO_INTERNET, PRIVATE_DNS_BROKEN, PARTIAL_CONNECTIVITY and // LOST_INTERNET notifications if network becomes valid. - mNotifier.clearNotification(nai.network.netId, + mNotifier.clearNotification(nai.network.getNetId(), NotificationType.NO_INTERNET); - mNotifier.clearNotification(nai.network.netId, + mNotifier.clearNotification(nai.network.getNetId(), NotificationType.LOST_INTERNET); - mNotifier.clearNotification(nai.network.netId, + mNotifier.clearNotification(nai.network.getNetId(), NotificationType.PARTIAL_CONNECTIVITY); - mNotifier.clearNotification(nai.network.netId, + mNotifier.clearNotification(nai.network.getNetId(), NotificationType.PRIVATE_DNS_BROKEN); // If network becomes valid, the hasShownBroken should be reset for // that network so that the notification will be fired when the private @@ -2988,7 +2985,7 @@ public class ConnectivityService extends IConnectivityManager.Stub nai.networkAgentConfig.hasShownBroken = false; } } else if (partialConnectivityChanged) { - updateCapabilities(nai.getCurrentScore(), nai, nai.networkCapabilities); + updateCapabilitiesForNetwork(nai); } updateInetCondition(nai); // Let the NetworkAgent know the state of its network @@ -3051,7 +3048,7 @@ public class ConnectivityService extends IConnectivityManager.Stub private final AutodestructReference<NetworkAgentInfo> mNai; private NetworkMonitorCallbacks(NetworkAgentInfo nai) { - mNetId = nai.network.netId; + mNetId = nai.network.getNetId(); mNai = new AutodestructReference<>(nai); } @@ -3201,7 +3198,7 @@ public class ConnectivityService extends IConnectivityManager.Stub // in order to restart a validation pass from within netd. final PrivateDnsConfig cfg = mDnsManager.getPrivateDnsConfig(); if (cfg.useTls && TextUtils.isEmpty(cfg.hostname)) { - updateDnses(nai.linkProperties, null, nai.network.netId); + updateDnses(nai.linkProperties, null, nai.network.getNetId()); } } @@ -3234,7 +3231,7 @@ public class ConnectivityService extends IConnectivityManager.Stub private void updatePrivateDns(NetworkAgentInfo nai, PrivateDnsConfig newCfg) { mDnsManager.updatePrivateDns(nai.network, newCfg); - updateDnses(nai.linkProperties, null, nai.network.netId); + updateDnses(nai.linkProperties, null, nai.network.getNetId()); } private void handlePrivateDnsValidationUpdate(PrivateDnsValidationUpdate update) { @@ -3330,9 +3327,9 @@ public class ConnectivityService extends IConnectivityManager.Stub if (nai != null) { final boolean wasDefault = isDefaultNetwork(nai); synchronized (mNetworkForNetId) { - mNetworkForNetId.remove(nai.network.netId); + mNetworkForNetId.remove(nai.network.getNetId()); } - mNetIdManager.releaseNetId(nai.network.netId); + mNetIdManager.releaseNetId(nai.network.getNetId()); // Just in case. mLegacyTypeTracker.remove(nai, wasDefault); } @@ -3362,7 +3359,7 @@ public class ConnectivityService extends IConnectivityManager.Stub log(nai.toShortString() + " disconnected, was satisfying " + nai.numNetworkRequests()); } // Clear all notifications of this network. - mNotifier.clearNotification(nai.network.netId); + mNotifier.clearNotification(nai.network.getNetId()); // A network agent has disconnected. // TODO - if we move the logic to the network agent (have them disconnect // because they lost all their requests or because their score isn't good) @@ -3399,14 +3396,15 @@ public class ConnectivityService extends IConnectivityManager.Stub synchronized (mNetworkForNetId) { // Remove the NetworkAgent, but don't mark the netId as // available until we've told netd to delete it below. - mNetworkForNetId.remove(nai.network.netId); + mNetworkForNetId.remove(nai.network.getNetId()); } // Remove all previously satisfied requests. for (int i = 0; i < nai.numNetworkRequests(); i++) { NetworkRequest request = nai.requestAt(i); final NetworkRequestInfo nri = mNetworkRequests.get(request); final NetworkAgentInfo currentNetwork = nri.mSatisfier; - if (currentNetwork != null && currentNetwork.network.netId == nai.network.netId) { + if (currentNetwork != null + && currentNetwork.network.getNetId() == nai.network.getNetId()) { nri.mSatisfier = null; sendUpdatedScoreToFactories(request, null); } @@ -3436,26 +3434,26 @@ public class ConnectivityService extends IConnectivityManager.Stub destroyNativeNetwork(nai); mDnsManager.removeNetwork(nai.network); } - mNetIdManager.releaseNetId(nai.network.netId); + mNetIdManager.releaseNetId(nai.network.getNetId()); } private boolean createNativeNetwork(@NonNull NetworkAgentInfo networkAgent) { try { // This should never fail. Specifying an already in use NetID will cause failure. if (networkAgent.isVPN()) { - mNetd.networkCreateVpn(networkAgent.network.netId, + mNetd.networkCreateVpn(networkAgent.network.getNetId(), (networkAgent.networkAgentConfig == null || !networkAgent.networkAgentConfig.allowBypass)); } else { - mNetd.networkCreatePhysical(networkAgent.network.netId, + mNetd.networkCreatePhysical(networkAgent.network.getNetId(), getNetworkPermission(networkAgent.networkCapabilities)); } - mDnsResolver.createNetworkCache(networkAgent.network.netId); - mDnsManager.updateTransportsForNetwork(networkAgent.network.netId, + mDnsResolver.createNetworkCache(networkAgent.network.getNetId()); + mDnsManager.updateTransportsForNetwork(networkAgent.network.getNetId(), networkAgent.networkCapabilities.getTransportTypes()); return true; } catch (RemoteException | ServiceSpecificException e) { - loge("Error creating network " + networkAgent.network.netId + ": " + loge("Error creating network " + networkAgent.network.getNetId() + ": " + e.getMessage()); return false; } @@ -3463,8 +3461,8 @@ public class ConnectivityService extends IConnectivityManager.Stub private void destroyNativeNetwork(@NonNull NetworkAgentInfo networkAgent) { try { - mNetd.networkDestroy(networkAgent.network.netId); - mDnsResolver.destroyNetworkCache(networkAgent.network.netId); + mNetd.networkDestroy(networkAgent.network.getNetId()); + mDnsResolver.destroyNetworkCache(networkAgent.network.getNetId()); } catch (RemoteException | ServiceSpecificException e) { loge("Exception destroying network: " + e); } @@ -3656,7 +3654,7 @@ public class ConnectivityService extends IConnectivityManager.Stub nri.mSatisfier = null; if (!wasBackgroundNetwork && nai.isBackgroundNetwork()) { // Went from foreground to background. - updateCapabilities(nai.getCurrentScore(), nai, nai.networkCapabilities); + updateCapabilitiesForNetwork(nai); } } @@ -4026,7 +4024,7 @@ public class ConnectivityService extends IConnectivityManager.Stub Intent intent = new Intent(action); if (type != NotificationType.PRIVATE_DNS_BROKEN) { - intent.setData(Uri.fromParts("netId", Integer.toString(nai.network.netId), null)); + intent.setData(Uri.fromParts("netId", Integer.toString(nai.network.getNetId()), null)); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); // Some OEMs have their own Settings package. Thus, need to get the current using // Settings package name instead of just use default name "com.android.settings". @@ -4041,7 +4039,8 @@ public class ConnectivityService extends IConnectivityManager.Stub intent, PendingIntent.FLAG_CANCEL_CURRENT | PendingIntent.FLAG_IMMUTABLE); - mNotifier.showNotification(nai.network.netId, type, nai, null, pendingIntent, highPriority); + mNotifier.showNotification( + nai.network.getNetId(), type, nai, null, pendingIntent, highPriority); } private boolean shouldPromptUnvalidated(NetworkAgentInfo nai) { @@ -4407,7 +4406,7 @@ public class ConnectivityService extends IConnectivityManager.Stub return; } if (DBG) { - int netid = nai.network.netId; + int netid = nai.network.getNetId(); log("reportNetworkConnectivity(" + netid + ", " + hasConnectivity + ") by " + uid); } // Validating a network that has not yet connected could result in a call to @@ -4442,7 +4441,7 @@ public class ConnectivityService extends IConnectivityManager.Stub return null; } return getLinkPropertiesProxyInfo(activeNetwork); - } else if (mDeps.queryUserAccess(Binder.getCallingUid(), network.netId)) { + } else if (mDeps.queryUserAccess(Binder.getCallingUid(), network.getNetId())) { // Don't call getLinkProperties() as it requires ACCESS_NETWORK_STATE permission, which // caller may not have. return getLinkPropertiesProxyInfo(network); @@ -4820,7 +4819,7 @@ public class ConnectivityService extends IConnectivityManager.Stub ensureRunningOnConnectivityServiceThread(); for (NetworkAgentInfo nai : mNetworkAgentInfos.values()) { if (nai.supportsUnderlyingNetworks()) { - updateCapabilities(nai.getCurrentScore(), nai, nai.networkCapabilities); + updateCapabilitiesForNetwork(nai); } } } @@ -5653,7 +5652,7 @@ public class ConnectivityService extends IConnectivityManager.Stub return false; } synchronized (mNetworkForNetId) { - nai = mNetworkForNetId.get(network.netId); + nai = mNetworkForNetId.get(network.getNetId()); } if (nai != null) { nai.asyncChannel.sendMessage(android.net.NetworkAgent.CMD_REQUEST_BANDWIDTH_UPDATE); @@ -6033,7 +6032,7 @@ public class ConnectivityService extends IConnectivityManager.Stub if (VDBG) log("Got NetworkAgent Messenger"); mNetworkAgentInfos.put(nai.messenger, nai); synchronized (mNetworkForNetId) { - mNetworkForNetId.put(nai.network.netId, nai); + mNetworkForNetId.put(nai.network.getNetId(), nai); } try { @@ -6061,7 +6060,7 @@ public class ConnectivityService extends IConnectivityManager.Stub private void updateLinkProperties(NetworkAgentInfo networkAgent, LinkProperties newLp, @NonNull LinkProperties oldLp) { - int netId = networkAgent.network.netId; + int netId = networkAgent.network.getNetId(); // The NetworkAgent does not know whether clatd is running on its network or not, or whether // a NAT64 prefix was discovered by the DNS resolver. Before we do anything else, make sure @@ -6342,7 +6341,7 @@ public class ConnectivityService extends IConnectivityManager.Stub final int newPermission = getNetworkPermission(newNc); if (oldPermission != newPermission && nai.created && !nai.isVPN()) { try { - mNetd.networkSetPermissionForNetwork(nai.network.netId, newPermission); + mNetd.networkSetPermissionForNetwork(nai.network.getNetId(), newPermission); } catch (RemoteException | ServiceSpecificException e) { loge("Exception in networkSetPermissionForNetwork: " + e); } @@ -6358,6 +6357,11 @@ public class ConnectivityService extends IConnectivityManager.Stub */ private void processCapabilitiesFromAgent(NetworkAgentInfo nai, NetworkCapabilities nc) { nai.declaredMetered = !nc.hasCapability(NET_CAPABILITY_NOT_METERED); + if (nai.networkCapabilities.getOwnerUid() != nc.getOwnerUid()) { + Log.e(TAG, nai.toShortString() + ": ignoring attempt to change owner from " + + nai.networkCapabilities.getOwnerUid() + " to " + nc.getOwnerUid()); + nc.setOwnerUid(nai.networkCapabilities.getOwnerUid()); + } } /** Modifies |caps| based on the capabilities of the specified underlying networks. */ @@ -6567,10 +6571,16 @@ public class ConnectivityService extends IConnectivityManager.Stub } if (!newNc.equalsTransportTypes(prevNc)) { - mDnsManager.updateTransportsForNetwork(nai.network.netId, newNc.getTransportTypes()); + mDnsManager.updateTransportsForNetwork( + nai.network.getNetId(), newNc.getTransportTypes()); } } + /** Convenience method to update the capabilities for a given network. */ + private void updateCapabilitiesForNetwork(NetworkAgentInfo nai) { + updateCapabilities(nai.getCurrentScore(), nai, nai.networkCapabilities); + } + /** * Returns whether VPN isolation (ingress interface filtering) should be applied on the given * network. @@ -6621,12 +6631,12 @@ public class ConnectivityService extends IConnectivityManager.Stub if (!newRanges.isEmpty()) { final UidRange[] addedRangesArray = new UidRange[newRanges.size()]; newRanges.toArray(addedRangesArray); - mNMS.addVpnUidRanges(nai.network.netId, addedRangesArray); + mNMS.addVpnUidRanges(nai.network.getNetId(), addedRangesArray); } if (!prevRanges.isEmpty()) { final UidRange[] removedRangesArray = new UidRange[prevRanges.size()]; prevRanges.toArray(removedRangesArray); - mNMS.removeVpnUidRanges(nai.network.netId, removedRangesArray); + mNMS.removeVpnUidRanges(nai.network.getNetId(), removedRangesArray); } final boolean wasFiltering = requiresVpnIsolation(nai, prevNc, nai.linkProperties); final boolean shouldFilter = requiresVpnIsolation(nai, newNc, nai.linkProperties); @@ -6657,7 +6667,7 @@ public class ConnectivityService extends IConnectivityManager.Stub public void handleUpdateLinkProperties(NetworkAgentInfo nai, LinkProperties newLp) { ensureRunningOnConnectivityServiceThread(); - if (getNetworkAgentInfoForNetId(nai.network.netId) != nai) { + if (getNetworkAgentInfoForNetId(nai.network.getNetId()) != nai) { // Ignore updates for disconnected networks return; } @@ -6856,8 +6866,7 @@ public class ConnectivityService extends IConnectivityManager.Stub teardownUnneededNetwork(oldNetwork); } else { // Put the network in the background. - updateCapabilities(oldNetwork.getCurrentScore(), oldNetwork, - oldNetwork.networkCapabilities); + updateCapabilitiesForNetwork(oldNetwork); } } @@ -6868,7 +6877,7 @@ public class ConnectivityService extends IConnectivityManager.Stub try { if (null != newNetwork) { - mNetd.networkSetDefault(newNetwork.network.netId); + mNetd.networkSetDefault(newNetwork.network.getNetId()); } else { mNetd.networkClearDefault(); } @@ -6931,8 +6940,8 @@ public class ConnectivityService extends IConnectivityManager.Stub public String toString() { return mRequest.mRequests.get(0).requestId + " : " - + (null != mOldNetwork ? mOldNetwork.network.netId : "null") - + " → " + (null != mNewNetwork ? mNewNetwork.network.netId : "null"); + + (null != mOldNetwork ? mOldNetwork.network.getNetId() : "null") + + " → " + (null != mNewNetwork ? mNewNetwork.network.getNetId() : "null"); } } @@ -7796,7 +7805,7 @@ public class ConnectivityService extends IConnectivityManager.Stub private void logNetworkEvent(NetworkAgentInfo nai, int evtype) { int[] transports = nai.networkCapabilities.getTransportTypes(); - mMetricsLog.log(nai.network.netId, transports, new NetworkEvent(evtype)); + mMetricsLog.log(nai.network.getNetId(), transports, new NetworkEvent(evtype)); } private static boolean toBool(int encodedBoolean) { @@ -8418,6 +8427,6 @@ public class ConnectivityService extends IConnectivityManager.Stub KEY_TCP_METRICS_COLLECTION_PERIOD_MILLIS); } - notifyDataStallSuspected(p, network.netId); + notifyDataStallSuspected(p, network.getNetId()); } } diff --git a/services/core/java/com/android/server/OWNERS b/services/core/java/com/android/server/OWNERS index fcf07f87aae8..733590c4f6c6 100644 --- a/services/core/java/com/android/server/OWNERS +++ b/services/core/java/com/android/server/OWNERS @@ -26,3 +26,4 @@ per-file NetIdManager.java = file:/services/core/java/com/android/server/net/OWN per-file PackageWatchdog.java = file:/services/core/java/com/android/server/rollback/OWNERS per-file TelephonyRegistry.java = file:/telephony/OWNERS per-file UiModeManagerService.java = file:/packages/SystemUI/OWNERS +per-file VcnManagementService.java = file:/services/core/java/com/android/server/vcn/OWNERS diff --git a/services/core/java/com/android/server/SystemServiceManager.java b/services/core/java/com/android/server/SystemServiceManager.java index 9d60b8438153..cb6e73af56ac 100644 --- a/services/core/java/com/android/server/SystemServiceManager.java +++ b/services/core/java/com/android/server/SystemServiceManager.java @@ -60,12 +60,12 @@ public final class SystemServiceManager implements Dumpable { // Constants used on onUser(...) // NOTE: do not change their values, as they're used on Trace calls and changes might break // performance tests that rely on them. - private static final String USER_STARTING = "Start"; - private static final String USER_UNLOCKING = "Unlocking"; - private static final String USER_UNLOCKED = "Unlocked"; - private static final String USER_SWITCHING = "Switch"; - private static final String USER_STOPPING = "Stop"; - private static final String USER_STOPPED = "Cleanup"; + private static final String USER_STARTING = "Start"; // Logged as onStartUser + private static final String USER_UNLOCKING = "Unlocking"; // Logged as onUnlockingUser + private static final String USER_UNLOCKED = "Unlocked"; // Logged as onUnlockedUser + private static final String USER_SWITCHING = "Switch"; // Logged as onSwitchUser + private static final String USER_STOPPING = "Stop"; // Logged as onStopUser + private static final String USER_STOPPED = "Cleanup"; // Logged as onCleanupUser private static File sSystemDir; private final Context mContext; diff --git a/services/core/java/com/android/server/TelephonyRegistry.java b/services/core/java/com/android/server/TelephonyRegistry.java index 52eb77d7d47d..ae5c131e38ab 100644 --- a/services/core/java/com/android/server/TelephonyRegistry.java +++ b/services/core/java/com/android/server/TelephonyRegistry.java @@ -2361,6 +2361,40 @@ public class TelephonyRegistry extends ITelephonyRegistry.Stub { } } + /** + * Notify that the data enabled has changed. + * + * @param enabled True if data is enabled, otherwise disabled. + * @param reason Reason for data enabled/disabled. See {@code DATA_*} in + * {@link TelephonyManager}. + */ + public void notifyDataEnabled(boolean enabled, + @TelephonyManager.DataEnabledReason int reason) { + if (!checkNotifyPermission("notifyDataEnabled()")) { + return; + } + + if (VDBG) { + log("notifyDataEnabled: enabled=" + enabled + " reason=" + reason); + } + + mIsDataEnabled = enabled; + mDataEnabledReason = reason; + synchronized (mRecords) { + for (Record r : mRecords) { + if (r.matchPhoneStateListenerEvent( + PhoneStateListener.EVENT_DATA_ENABLED_CHANGED)) { + try { + r.callback.onDataEnabledChanged(enabled, reason); + } catch (RemoteException ex) { + mRemoveList.add(r.binder); + } + } + } + handleRemoveListLocked(); + } + } + @Override public void dump(FileDescriptor fd, PrintWriter writer, String[] args) { final IndentingPrintWriter pw = new IndentingPrintWriter(writer, " "); @@ -2413,6 +2447,8 @@ public class TelephonyRegistry extends ITelephonyRegistry.Stub { pw.println("mDefaultPhoneId=" + mDefaultPhoneId); pw.println("mDefaultSubId=" + mDefaultSubId); pw.println("mPhysicalChannelConfigs=" + mPhysicalChannelConfigs); + pw.println("mIsDataEnabled=" + mIsDataEnabled); + pw.println("mDataEnabledReason=" + mDataEnabledReason); pw.decreaseIndent(); diff --git a/services/core/java/com/android/server/TestNetworkService.java b/services/core/java/com/android/server/TestNetworkService.java index a45466d98563..75ebe70591df 100644 --- a/services/core/java/com/android/server/TestNetworkService.java +++ b/services/core/java/com/android/server/TestNetworkService.java @@ -220,7 +220,7 @@ class TestNetworkService extends ITestNetworkManager.Stub { // Has to be in TestNetworkAgent to ensure all teardown codepaths properly clean up // resources, even for binder death or unwanted calls. synchronized (mTestNetworkTracker) { - mTestNetworkTracker.remove(getNetwork().netId); + mTestNetworkTracker.remove(getNetwork().getNetId()); } } } @@ -339,7 +339,7 @@ class TestNetworkService extends ITestNetworkManager.Stub { administratorUids, binder); - mTestNetworkTracker.put(agent.getNetwork().netId, agent); + mTestNetworkTracker.put(agent.getNetwork().getNetId(), agent); } } catch (SocketException e) { throw new UncheckedIOException(e); diff --git a/services/core/java/com/android/server/connectivity/DefaultNetworkMetrics.java b/services/core/java/com/android/server/connectivity/DefaultNetworkMetrics.java index 4fb6607a6b08..995bb2422de2 100644 --- a/services/core/java/com/android/server/connectivity/DefaultNetworkMetrics.java +++ b/services/core/java/com/android/server/connectivity/DefaultNetworkMetrics.java @@ -166,7 +166,7 @@ public class DefaultNetworkMetrics { private static void fillLinkInfo(DefaultNetworkEvent ev, NetworkAgentInfo nai) { LinkProperties lp = nai.linkProperties; - ev.netId = nai.network().netId; + ev.netId = nai.network().getNetId(); ev.transports |= BitUtils.packBits(nai.networkCapabilities.getTransportTypes()); ev.ipv4 |= lp.hasIpv4Address() && lp.hasIpv4DefaultRoute(); ev.ipv6 |= lp.hasGlobalIpv6Address() && lp.hasIpv6DefaultRoute(); diff --git a/services/core/java/com/android/server/connectivity/DnsManager.java b/services/core/java/com/android/server/connectivity/DnsManager.java index 712ef7630933..c70bb080b0b1 100644 --- a/services/core/java/com/android/server/connectivity/DnsManager.java +++ b/services/core/java/com/android/server/connectivity/DnsManager.java @@ -59,7 +59,6 @@ import java.util.Set; import java.util.concurrent.ConcurrentHashMap; import java.util.stream.Collectors; - /** * Encapsulate the management of DNS settings for networks. * @@ -266,23 +265,23 @@ public class DnsManager { } public void removeNetwork(Network network) { - mPrivateDnsMap.remove(network.netId); - mPrivateDnsValidationMap.remove(network.netId); - mTransportsMap.remove(network.netId); - mLinkPropertiesMap.remove(network.netId); + mPrivateDnsMap.remove(network.getNetId()); + mPrivateDnsValidationMap.remove(network.getNetId()); + mTransportsMap.remove(network.getNetId()); + mLinkPropertiesMap.remove(network.getNetId()); } // This is exclusively called by ConnectivityService#dumpNetworkDiagnostics() which // is not on the ConnectivityService handler thread. public PrivateDnsConfig getPrivateDnsConfig(@NonNull Network network) { - return mPrivateDnsMap.getOrDefault(network.netId, PRIVATE_DNS_OFF); + return mPrivateDnsMap.getOrDefault(network.getNetId(), PRIVATE_DNS_OFF); } public PrivateDnsConfig updatePrivateDns(Network network, PrivateDnsConfig cfg) { Log.w(TAG, "updatePrivateDns(" + network + ", " + cfg + ")"); return (cfg != null) - ? mPrivateDnsMap.put(network.netId, cfg) - : mPrivateDnsMap.remove(network.netId); + ? mPrivateDnsMap.put(network.getNetId(), cfg) + : mPrivateDnsMap.remove(network.getNetId()); } public void updatePrivateDnsStatus(int netId, LinkProperties lp) { @@ -309,8 +308,7 @@ public class DnsManager { } public void updatePrivateDnsValidation(PrivateDnsValidationUpdate update) { - final PrivateDnsValidationStatuses statuses = - mPrivateDnsValidationMap.get(update.netId); + final PrivateDnsValidationStatuses statuses = mPrivateDnsValidationMap.get(update.netId); if (statuses == null) return; statuses.updateStatus(update); } diff --git a/services/core/java/com/android/server/connectivity/LingerMonitor.java b/services/core/java/com/android/server/connectivity/LingerMonitor.java index f99f4c65594b..adec7ad5c89d 100644 --- a/services/core/java/com/android/server/connectivity/LingerMonitor.java +++ b/services/core/java/com/android/server/connectivity/LingerMonitor.java @@ -114,7 +114,7 @@ public class LingerMonitor { private int getNotificationSource(NetworkAgentInfo toNai) { for (int i = 0; i < mNotifications.size(); i++) { - if (mNotifications.valueAt(i) == toNai.network.netId) { + if (mNotifications.valueAt(i) == toNai.network.getNetId()) { return mNotifications.keyAt(i); } } @@ -122,7 +122,7 @@ public class LingerMonitor { } private boolean everNotified(NetworkAgentInfo nai) { - return mEverNotified.get(nai.network.netId, false); + return mEverNotified.get(nai.network.getNetId(), false); } @VisibleForTesting @@ -153,7 +153,7 @@ public class LingerMonitor { } private void showNotification(NetworkAgentInfo fromNai, NetworkAgentInfo toNai) { - mNotifier.showNotification(fromNai.network.netId, NotificationType.NETWORK_SWITCH, + mNotifier.showNotification(fromNai.network.getNetId(), NotificationType.NETWORK_SWITCH, fromNai, toNai, createNotificationIntent(), true); } @@ -208,8 +208,8 @@ public class LingerMonitor { + " type=" + sNotifyTypeNames.get(notifyType, "unknown(" + notifyType + ")")); } - mNotifications.put(fromNai.network.netId, toNai.network.netId); - mEverNotified.put(fromNai.network.netId, true); + mNotifications.put(fromNai.network.getNetId(), toNai.network.getNetId()); + mEverNotified.put(fromNai.network.getNetId(), true); } /** @@ -295,8 +295,8 @@ public class LingerMonitor { } public void noteDisconnect(NetworkAgentInfo nai) { - mNotifications.delete(nai.network.netId); - mEverNotified.delete(nai.network.netId); + mNotifications.delete(nai.network.getNetId()); + mEverNotified.delete(nai.network.getNetId()); maybeStopNotifying(nai); // No need to cancel notifications on nai: NetworkMonitor does that on disconnect. } diff --git a/services/core/java/com/android/server/connectivity/Nat464Xlat.java b/services/core/java/com/android/server/connectivity/Nat464Xlat.java index d9c2e80aadcd..c1b1b6a2f26c 100644 --- a/services/core/java/com/android/server/connectivity/Nat464Xlat.java +++ b/services/core/java/com/android/server/connectivity/Nat464Xlat.java @@ -528,6 +528,6 @@ public class Nat464Xlat extends BaseNetworkObserver { @VisibleForTesting protected int getNetId() { - return mNetwork.network.netId; + return mNetwork.network.getNetId(); } } diff --git a/services/core/java/com/android/server/connectivity/NetworkAgentInfo.java b/services/core/java/com/android/server/connectivity/NetworkAgentInfo.java index 3270dd55218c..ccd1f3bb16f6 100644 --- a/services/core/java/com/android/server/connectivity/NetworkAgentInfo.java +++ b/services/core/java/com/android/server/connectivity/NetworkAgentInfo.java @@ -610,7 +610,7 @@ public class NetworkAgentInfo implements Comparable<NetworkAgentInfo> { if (newExpiry > 0) { mLingerMessage = new WakeupMessage( mContext, mHandler, - "NETWORK_LINGER_COMPLETE." + network.netId /* cmdName */, + "NETWORK_LINGER_COMPLETE." + network.getNetId() /* cmdName */, EVENT_NETWORK_LINGER_COMPLETE /* cmd */, 0 /* arg1 (unused) */, 0 /* arg2 (unused) */, this /* obj (NetworkAgentInfo) */); @@ -701,7 +701,7 @@ public class NetworkAgentInfo implements Comparable<NetworkAgentInfo> { * This represents the network with something like "[100 WIFI|VPN]" or "[108 MOBILE]". */ public String toShortString() { - return "[" + network.netId + " " + return "[" + network.getNetId() + " " + transportNamesOf(networkCapabilities.getTransportTypes()) + "]"; } diff --git a/services/core/java/com/android/server/connectivity/Vpn.java b/services/core/java/com/android/server/connectivity/Vpn.java index 3445275b76dd..5cb0994c5cb2 100644 --- a/services/core/java/com/android/server/connectivity/Vpn.java +++ b/services/core/java/com/android/server/connectivity/Vpn.java @@ -1062,7 +1062,7 @@ public class Vpn { if (null == agent) return NETID_UNSET; final Network network = agent.getNetwork(); if (null == network) return NETID_UNSET; - return network.netId; + return network.getNetId(); } private LinkProperties makeLinkProperties() { @@ -1778,7 +1778,7 @@ public class Vpn { if (networks[i] == null) { mConfig.underlyingNetworks[i] = null; } else { - mConfig.underlyingNetworks[i] = new Network(networks[i].netId); + mConfig.underlyingNetworks[i] = new Network(networks[i].getNetId()); } } } diff --git a/services/core/java/com/android/server/wallpaper/IWallpaperManagerService.java b/services/core/java/com/android/server/wallpaper/IWallpaperManagerService.java index 60b08dd3093c..a4ddf1170fe6 100644 --- a/services/core/java/com/android/server/wallpaper/IWallpaperManagerService.java +++ b/services/core/java/com/android/server/wallpaper/IWallpaperManagerService.java @@ -29,7 +29,7 @@ interface IWallpaperManagerService extends IWallpaperManager, IBinder { void onBootPhase(int phase); /** - * @see com.android.server.SystemService#onUnlockUser(int) + * @see com.android.server.SystemService#onUserUnlocking */ void onUnlockUser(final int userId); }
\ No newline at end of file diff --git a/services/core/java/com/android/server/wm/ActivityRecord.java b/services/core/java/com/android/server/wm/ActivityRecord.java index 743796b0aad0..113f4d856bdd 100644 --- a/services/core/java/com/android/server/wm/ActivityRecord.java +++ b/services/core/java/com/android/server/wm/ActivityRecord.java @@ -1366,7 +1366,19 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A } else if (mLetterbox != null) { mLetterbox.hide(); } - task.maybeUpdateLetterboxBounds(this, getLetterboxParams(w)); + maybeUpdateLetterboxInTaskOrganizer(w); + } + + private void maybeUpdateLetterboxInTaskOrganizer(WindowState w) { + boolean isLetterboxed = w.isLetterboxedAppWindow() && fillsParent(); + if (!isLetterboxed) { + task.maybeUpdateLetterboxInTaskOrganizer( + this, /* activityBounds= */ null, /* activityInsets= */ null); + return; + } + final Rect insets = w.getInsetsStateWithVisibilityOverride().calculateInsets( + getBounds(), Type.systemBars(), false /* ignoreVisibility */); + task.maybeUpdateLetterboxInTaskOrganizer(this, getBounds(), insets); } void updateLetterboxSurface(WindowState winHint) { @@ -1380,12 +1392,6 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A } } - @Nullable - private Rect getLetterboxParams(WindowState w) { - boolean isLetterboxed = w.isLetterboxedAppWindow() && fillsParent(); - return isLetterboxed ? getBounds() : null; - } - Rect getLetterboxInsets() { if (mLetterbox != null) { return mLetterbox.getInsets(); diff --git a/services/core/java/com/android/server/wm/Task.java b/services/core/java/com/android/server/wm/Task.java index 00f545cfad88..8564cbc02df8 100644 --- a/services/core/java/com/android/server/wm/Task.java +++ b/services/core/java/com/android/server/wm/Task.java @@ -519,6 +519,11 @@ class Task extends WindowContainer<WindowContainer> { @Nullable private Rect mLetterboxActivityBounds; + // Activity insets if this task or its top activity is presented in letterbox mode and + // {@code null} otherwise. + @Nullable + private Rect mLetterboxActivityInsets; + // Whether the task is currently being drag-resized private boolean mDragResizing; private int mDragResizeMode; @@ -4083,6 +4088,7 @@ class Task extends WindowContainer<WindowContainer> { // bounds, e.g. fullscreen bounds instead of letterboxed bounds. To work around this, // assigning bounds from ActivityRecord#layoutLetterbox when they are ready. info.letterboxActivityBounds = Rect.copyOrNull(mLetterboxActivityBounds); + info.letterboxActivityInsets = Rect.copyOrNull(mLetterboxActivityInsets); info.positionInParent = getRelativePosition(); info.parentBounds = getParentBounds(); @@ -4110,15 +4116,17 @@ class Task extends WindowContainer<WindowContainer> { ? null : new PictureInPictureParams(rootActivity.pictureInPictureArgs); } - void maybeUpdateLetterboxBounds( - ActivityRecord activityRecord, @Nullable Rect letterboxActivityBounds) { + void maybeUpdateLetterboxInTaskOrganizer( + ActivityRecord activityRecord, + @Nullable Rect activityBounds, + @Nullable Rect activityInsets) { if (isOrganized() && mReuseActivitiesReport.top == activityRecord // Want to force update only if letterbox bounds have changed. - && !Objects.equals( - mLetterboxActivityBounds, - letterboxActivityBounds)) { - mLetterboxActivityBounds = Rect.copyOrNull(letterboxActivityBounds); + && (!Objects.equals(mLetterboxActivityBounds, activityBounds) + || !Objects.equals(mLetterboxActivityInsets, activityInsets))) { + mLetterboxActivityBounds = Rect.copyOrNull(activityBounds); + mLetterboxActivityInsets = Rect.copyOrNull(activityInsets); // Forcing update to reduce visual jank during the transition. dispatchTaskInfoChangedIfNeeded(true /* force */); } diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/BaseIDevicePolicyManager.java b/services/devicepolicy/java/com/android/server/devicepolicy/BaseIDevicePolicyManager.java index 22976c30a749..f2e5878e5705 100644 --- a/services/devicepolicy/java/com/android/server/devicepolicy/BaseIDevicePolicyManager.java +++ b/services/devicepolicy/java/com/android/server/devicepolicy/BaseIDevicePolicyManager.java @@ -46,19 +46,19 @@ abstract class BaseIDevicePolicyManager extends IDevicePolicyManager.Stub { /** * To be called by {@link DevicePolicyManagerService#Lifecycle} when a new user starts. * - * @see {@link SystemService#onStartUser} + * @see {@link SystemService#onUserStarting} */ abstract void handleStartUser(int userId); /** * To be called by {@link DevicePolicyManagerService#Lifecycle} when a user is being unlocked. * - * @see {@link SystemService#onUnlockUser} + * @see {@link SystemService#onUserUnlocking} */ abstract void handleUnlockUser(int userId); /** * To be called by {@link DevicePolicyManagerService#Lifecycle} when a user is being stopped. * - * @see {@link SystemService#onStopUser} + * @see {@link SystemService#onUserStopping} */ abstract void handleStopUser(int userId); diff --git a/startop/iorap/src/com/google/android/startop/iorap/SystemServiceUserEvent.java b/startop/iorap/src/com/google/android/startop/iorap/SystemServiceUserEvent.java index b77c03c1584a..2e7bafe7bdbf 100644 --- a/startop/iorap/src/com/google/android/startop/iorap/SystemServiceUserEvent.java +++ b/startop/iorap/src/com/google/android/startop/iorap/SystemServiceUserEvent.java @@ -36,15 +36,15 @@ import java.lang.annotation.RetentionPolicy; */ public class SystemServiceUserEvent implements Parcelable { - /** @see com.android.server.SystemService#onStartUser */ + /** @see com.android.server.SystemService#onUserStarting */ public static final int TYPE_START_USER = 0; - /** @see com.android.server.SystemService#onUnlockUser */ + /** @see com.android.server.SystemService#onUserUnlocking */ public static final int TYPE_UNLOCK_USER = 1; - /** @see com.android.server.SystemService#onSwitchUser*/ + /** @see com.android.server.SystemService#onUserSwitching*/ public static final int TYPE_SWITCH_USER = 2; - /** @see com.android.server.SystemService#onStopUser */ + /** @see com.android.server.SystemService#onUserStopping */ public static final int TYPE_STOP_USER = 3; - /** @see com.android.server.SystemService#onCleanupUser */ + /** @see com.android.server.SystemService#onUserStopped */ public static final int TYPE_CLEANUP_USER = 4; private static final int TYPE_MAX = TYPE_CLEANUP_USER; diff --git a/tests/net/java/com/android/server/ConnectivityServiceTest.java b/tests/net/java/com/android/server/ConnectivityServiceTest.java index b6f91c457d9e..aec2f48cccea 100644 --- a/tests/net/java/com/android/server/ConnectivityServiceTest.java +++ b/tests/net/java/com/android/server/ConnectivityServiceTest.java @@ -1957,7 +1957,7 @@ public class ConnectivityServiceTest { } @Test - public void testOwnerUidChangeBug() throws Exception { + public void testOwnerUidCannotChange() throws Exception { // Owner UIDs are not visible without location permission. setupLocationPermissions(Build.VERSION_CODES.Q, true, AppOpsManager.OPSTR_FINE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION); @@ -1972,39 +1972,19 @@ public class ConnectivityServiceTest { waitForIdle(); // Send ConnectivityService an update to the mWiFiNetworkAgent's capabilities that changes - // its owner UID. + // the owner UID and an unrelated capability. NetworkCapabilities agentCapabilities = mWiFiNetworkAgent.getNetworkCapabilities(); assertEquals(originalOwnerUid, agentCapabilities.getOwnerUid()); agentCapabilities.setOwnerUid(42); - mWiFiNetworkAgent.setNetworkCapabilities(agentCapabilities, true); - waitForIdle(); - - // Check that the owner UID is not updated. - NetworkCapabilities nc = mCm.getNetworkCapabilities(mWiFiNetworkAgent.getNetwork()); - assertEquals(originalOwnerUid, nc.getOwnerUid()); - - // Make an unrelated change to the capabilities. assertFalse(agentCapabilities.hasCapability(NET_CAPABILITY_NOT_CONGESTED)); agentCapabilities.addCapability(NET_CAPABILITY_NOT_CONGESTED); mWiFiNetworkAgent.setNetworkCapabilities(agentCapabilities, true); waitForIdle(); - // Check that both the capability change and the owner UID have been modified. - // The owner UID is -1 because it is visible only to the UID that owns the network. - nc = mCm.getNetworkCapabilities(mWiFiNetworkAgent.getNetwork()); - assertEquals(-1, nc.getOwnerUid()); - assertTrue(nc.hasCapability(NET_CAPABILITY_NOT_CONGESTED)); - - // Set the owner back to originalOwnerUid, update the capabilities, and check that it is - // visible again. - // TODO: should this even be possible? - agentCapabilities.setOwnerUid(originalOwnerUid); - agentCapabilities.removeCapability(NET_CAPABILITY_NOT_CONGESTED); - mWiFiNetworkAgent.setNetworkCapabilities(agentCapabilities, true); - waitForIdle(); - - nc = mCm.getNetworkCapabilities(mWiFiNetworkAgent.getNetwork()); + // Check that the capability change has been applied but the owner UID is not modified. + NetworkCapabilities nc = mCm.getNetworkCapabilities(mWiFiNetworkAgent.getNetwork()); assertEquals(originalOwnerUid, nc.getOwnerUid()); + assertTrue(nc.hasCapability(NET_CAPABILITY_NOT_CONGESTED)); } @Test |