Merge "Make sure the PAC script content is sent again" into sc-dev
diff --git a/Android.bp b/Android.bp
index 6c5acd2..2321cc5 100644
--- a/Android.bp
+++ b/Android.bp
@@ -322,7 +322,6 @@
     libs: [
         "app-compat-annotations",
         "ext",
-        "framework-connectivity-annotations",
         "framework-updatable-stubs-module_libs_api",
         "unsupportedappusage",
     ],
diff --git a/core/java/android/net/NetworkPolicyManager.java b/core/java/android/net/NetworkPolicyManager.java
index d8050ed..7ebb646 100644
--- a/core/java/android/net/NetworkPolicyManager.java
+++ b/core/java/android/net/NetworkPolicyManager.java
@@ -34,8 +34,6 @@
 import android.content.pm.PackageManager;
 import android.content.pm.PackageManager.NameNotFoundException;
 import android.content.pm.Signature;
-import android.net.ConnectivityAnnotations.MultipathPreference;
-import android.net.ConnectivityAnnotations.RestrictBackgroundStatus;
 import android.net.wifi.WifiConfiguration;
 import android.net.wifi.WifiInfo;
 import android.os.Build;
@@ -465,7 +463,6 @@
      */
     @SystemApi(client = SystemApi.Client.MODULE_LIBRARIES)
     @RequiresPermission(NetworkStack.PERMISSION_MAINLINE_NETWORK_STACK)
-    @RestrictBackgroundStatus
     public int getRestrictBackgroundStatus(int uid) {
         try {
             return mService.getRestrictBackgroundStatus(uid);
@@ -591,7 +588,6 @@
      */
     @SystemApi(client = SystemApi.Client.MODULE_LIBRARIES)
     @RequiresPermission(NetworkStack.PERMISSION_MAINLINE_NETWORK_STACK)
-    @MultipathPreference
     public int getMultipathPreference(@NonNull Network network) {
         try {
             return mService.getMultipathPreference(network);
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/StartingSurfaceDrawer.java b/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/StartingSurfaceDrawer.java
index 1a03ebd..bdc8ff1 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/StartingSurfaceDrawer.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/StartingSurfaceDrawer.java
@@ -347,8 +347,13 @@
     void makeTaskSnapshotWindow(StartingWindowInfo startingWindowInfo, IBinder appToken,
             TaskSnapshot snapshot) {
         final int taskId = startingWindowInfo.taskInfo.taskId;
+        // Remove any existing starting window for this task before adding.
+        removeWindowNoAnimate(taskId);
         final TaskSnapshotWindow surface = TaskSnapshotWindow.create(startingWindowInfo, appToken,
                 snapshot, mSplashScreenExecutor, () -> removeWindowNoAnimate(taskId));
+        if (surface == null) {
+            return;
+        }
         final StartingWindowRecord tView = new StartingWindowRecord(appToken,
                 null/* decorView */, surface);
         mStartingWindowRecords.put(taskId, tView);
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/TaskSnapshotWindow.java b/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/TaskSnapshotWindow.java
index 8147b47..acf7f33 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/TaskSnapshotWindow.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/TaskSnapshotWindow.java
@@ -45,6 +45,7 @@
 import static com.android.internal.policy.DecorView.getNavigationBarRect;
 
 import android.annotation.BinderThread;
+import android.annotation.NonNull;
 import android.annotation.Nullable;
 import android.app.ActivityManager;
 import android.app.ActivityManager.TaskDescription;
@@ -141,7 +142,8 @@
     private final float[] mTmpFloat9 = new float[9];
 
     static TaskSnapshotWindow create(StartingWindowInfo info, IBinder appToken,
-            TaskSnapshot snapshot, ShellExecutor mainExecutor, Runnable clearWindowHandler) {
+            TaskSnapshot snapshot, ShellExecutor splashScreenExecutor,
+            @NonNull Runnable clearWindowHandler) {
         final ActivityManager.RunningTaskInfo runningTaskInfo = info.taskInfo;
         final int taskId = runningTaskInfo.taskId;
         if (DEBUG) {
@@ -208,39 +210,38 @@
         final TaskSnapshotWindow snapshotSurface = new TaskSnapshotWindow(
                 surfaceControl, snapshot, layoutParams.getTitle(), taskDescription, appearance,
                 windowFlags, windowPrivateFlags, taskBounds, orientation,
-                topWindowInsetsState, clearWindowHandler, mainExecutor);
+                topWindowInsetsState, clearWindowHandler, splashScreenExecutor);
         final Window window = snapshotSurface.mWindow;
 
         final InsetsState mTmpInsetsState = new InsetsState();
         final InputChannel tmpInputChannel = new InputChannel();
-        mainExecutor.execute(() -> {
-            try {
-                Trace.traceBegin(TRACE_TAG_WINDOW_MANAGER, "TaskSnapshot#addToDisplay");
-                final int res = session.addToDisplay(window, layoutParams, View.GONE, displayId,
-                        mTmpInsetsState, tmpInputChannel, mTmpInsetsState, mTempControls);
-                Trace.traceEnd(TRACE_TAG_WINDOW_MANAGER);
-                if (res < 0) {
-                    Slog.w(TAG, "Failed to add snapshot starting window res=" + res);
-                    return;
-                }
-            } catch (RemoteException e) {
-                snapshotSurface.clearWindowSynced();
-            }
-            window.setOuter(snapshotSurface);
-            try {
-                Trace.traceBegin(TRACE_TAG_WINDOW_MANAGER, "TaskSnapshot#relayout");
-                session.relayout(window, layoutParams, -1, -1, View.VISIBLE, 0, -1,
-                        tmpFrames, tmpMergedConfiguration, surfaceControl, mTmpInsetsState,
-                        mTempControls, TMP_SURFACE_SIZE);
-                Trace.traceEnd(TRACE_TAG_WINDOW_MANAGER);
-            } catch (RemoteException e) {
-                snapshotSurface.clearWindowSynced();
-            }
 
-            final Rect systemBarInsets = getSystemBarInsets(tmpFrames.frame, topWindowInsetsState);
-            snapshotSurface.setFrames(tmpFrames.frame, systemBarInsets);
-            snapshotSurface.drawSnapshot();
-        });
+        try {
+            Trace.traceBegin(TRACE_TAG_WINDOW_MANAGER, "TaskSnapshot#addToDisplay");
+            final int res = session.addToDisplay(window, layoutParams, View.GONE, displayId,
+                    mTmpInsetsState, tmpInputChannel, mTmpInsetsState, mTempControls);
+            Trace.traceEnd(TRACE_TAG_WINDOW_MANAGER);
+            if (res < 0) {
+                Slog.w(TAG, "Failed to add snapshot starting window res=" + res);
+                return null;
+            }
+        } catch (RemoteException e) {
+            snapshotSurface.clearWindowSynced();
+        }
+        window.setOuter(snapshotSurface);
+        try {
+            Trace.traceBegin(TRACE_TAG_WINDOW_MANAGER, "TaskSnapshot#relayout");
+            session.relayout(window, layoutParams, -1, -1, View.VISIBLE, 0, -1,
+                    tmpFrames, tmpMergedConfiguration, surfaceControl, mTmpInsetsState,
+                    mTempControls, TMP_SURFACE_SIZE);
+            Trace.traceEnd(TRACE_TAG_WINDOW_MANAGER);
+        } catch (RemoteException e) {
+            snapshotSurface.clearWindowSynced();
+        }
+
+        final Rect systemBarInsets = getSystemBarInsets(tmpFrames.frame, topWindowInsetsState);
+        snapshotSurface.setFrames(tmpFrames.frame, systemBarInsets);
+        snapshotSurface.drawSnapshot();
         return snapshotSurface;
     }
 
@@ -469,9 +470,7 @@
      * Clear window from drawer, must be post on main executor.
      */
     private void clearWindowSynced() {
-        if (mClearWindowHandler != null) {
-            mClearWindowHandler.run();
-        }
+        mSplashScreenExecutor.executeDelayed(mClearWindowHandler, 0);
     }
 
     private void reportDrawn() {
diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java
index 1b48273..dddf3df 100644
--- a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java
+++ b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java
@@ -2086,12 +2086,19 @@
 
         // The following policies weren't available to PO, but will be available after migration.
         parentAdmin.disableCamera = doAdmin.disableCamera;
-        parentAdmin.requireAutoTime = doAdmin.requireAutoTime;
         parentAdmin.disableScreenCapture = doAdmin.disableScreenCapture;
         parentAdmin.accountTypesWithManagementDisabled.addAll(
                 doAdmin.accountTypesWithManagementDisabled);
 
         moveDoUserRestrictionsToCopeParent(doAdmin, parentAdmin);
+
+        // From Android 11, {@link setAutoTimeRequired} is no longer used. The user restriction
+        // {@link UserManager#DISALLOW_CONFIG_DATE_TIME} should be used to enforce auto time
+        // settings instead.
+        if (doAdmin.requireAutoTime) {
+            parentAdmin.ensureUserRestrictions().putBoolean(
+                    UserManager.DISALLOW_CONFIG_DATE_TIME, true);
+        }
     }
 
     private void moveDoUserRestrictionsToCopeParent(ActiveAdmin doAdmin, ActiveAdmin parentAdmin) {
@@ -2361,6 +2368,41 @@
         saveSettingsLocked(user.getIdentifier());
     }
 
+    /**
+     * Fix left-over restrictions and auto-time policy during COMP -> COPE migration.
+     *
+     * When a COMP device with requireAutoTime policy set was migrated to an
+     * organization-owned profile, a DISALLOW_CONFIG_DATE_TIME restriction is set
+     * on user 0 from the DO user, which becomes unremovable by the organization-owned
+     * profile owner. Fix this by force removing that restriction. Also revert the
+     * parentAdmin.requireAutoTime bit (since the COPE PO cannot unset this bit)
+     * and replace it with DISALLOW_CONFIG_DATE_TIME on the correct
+     * admin, in line with the deprecation recommendation of setAutoTimeRequired().
+     */
+    private void fixupAutoTimeRestrictionDuringOrganizationOwnedDeviceMigration() {
+        for (UserInfo ui : mUserManager.getUsers()) {
+            final int userId = ui.id;
+            if (isProfileOwnerOfOrganizationOwnedDevice(userId)) {
+                final ActiveAdmin parent = getProfileOwnerAdminLocked(userId).parentAdmin;
+                if (parent != null && parent.requireAutoTime) {
+                    // Remove deprecated requireAutoTime
+                    parent.requireAutoTime = false;
+                    saveSettingsLocked(userId);
+
+                    // Remove user restrictions set by the device owner before the upgrade to
+                    // Android 11.
+                    mUserManagerInternal.setDevicePolicyUserRestrictions(UserHandle.USER_SYSTEM,
+                            new Bundle(), new RestrictionsSet(), /* isDeviceOwner */ false);
+
+                    // Apply user restriction to parent active admin instead
+                    parent.ensureUserRestrictions().putBoolean(
+                            UserManager.DISALLOW_CONFIG_DATE_TIME, true);
+                    pushUserRestrictions(userId);
+                }
+            }
+        }
+    }
+
     private ComponentName findAdminComponentWithPackageLocked(String packageName, int userId) {
         final DevicePolicyData policy = getUserData(userId);
         final int n = policy.mAdminList.size();
@@ -3020,6 +3062,7 @@
     private void onLockSettingsReady() {
         synchronized (getLockObject()) {
             migrateUserRestrictionsIfNecessaryLocked();
+            fixupAutoTimeRestrictionDuringOrganizationOwnedDeviceMigration();
             performPolicyVersionUpgrade();
         }
         getUserData(UserHandle.USER_SYSTEM);
@@ -8576,6 +8619,7 @@
             admin.defaultEnabledRestrictionsAlreadySet.clear();
             admin.forceEphemeralUsers = false;
             admin.isNetworkLoggingEnabled = false;
+            admin.requireAutoTime = false;
             mUserManagerInternal.setForceEphemeralUsers(admin.forceEphemeralUsers);
         }
         final DevicePolicyData policyData = getUserData(userId);