Snap for 11520864 from eeb610f928e0676a906ac562e28f25649dd48634 to 24Q2-release

Change-Id: I4bdfed1c2ad1f9307789240794408657f4431817
diff --git a/DeviceLockController/tests/robolectric/src/com/android/devicelockcontroller/provision/worker/ReportDeviceProvisionStateWorkerTest.java b/DeviceLockController/tests/robolectric/src/com/android/devicelockcontroller/provision/worker/ReportDeviceProvisionStateWorkerTest.java
index aa1b854..24031b6 100644
--- a/DeviceLockController/tests/robolectric/src/com/android/devicelockcontroller/provision/worker/ReportDeviceProvisionStateWorkerTest.java
+++ b/DeviceLockController/tests/robolectric/src/com/android/devicelockcontroller/provision/worker/ReportDeviceProvisionStateWorkerTest.java
@@ -61,6 +61,7 @@
 import com.google.common.util.concurrent.MoreExecutors;
 
 import org.junit.Before;
+import org.junit.Ignore;
 import org.junit.Rule;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -173,6 +174,8 @@
     }
 
     @Test
+    @Ignore
+    //TODO(b/327652632): Re-enable after fixing
     public void doWork_dismissibleUiState_schedulesAlarmAndSendsNotification() throws Exception {
         when(mResponse.isSuccessful()).thenReturn(true);
         when(mResponse.getNextClientProvisionState()).thenReturn(PROVISION_STATE_DISMISSIBLE_UI);
@@ -199,6 +202,8 @@
     }
 
     @Test
+    @Ignore
+    //TODO(b/327652632): Re-enable after fixing
     public void doWork_persistentUiState_schedulesAlarmAndSendsOngoingNotification()
             throws Exception {
         when(mResponse.isSuccessful()).thenReturn(true);
diff --git a/service/java/com/android/server/devicelock/DeviceLockService.java b/service/java/com/android/server/devicelock/DeviceLockService.java
index 2de5408..81c3edb 100644
--- a/service/java/com/android/server/devicelock/DeviceLockService.java
+++ b/service/java/com/android/server/devicelock/DeviceLockService.java
@@ -16,18 +16,11 @@
 
 package com.android.server.devicelock;
 
-import static android.provider.Settings.Secure.USER_SETUP_COMPLETE;
-
 import android.annotation.NonNull;
-import android.annotation.Nullable;
-import android.content.ContentResolver;
 import android.content.Context;
-import android.database.ContentObserver;
-import android.net.Uri;
 import android.os.Process;
 import android.os.UserHandle;
 import android.os.UserManager;
-import android.provider.Settings;
 import android.util.Slog;
 
 import com.android.server.SystemService;
@@ -96,30 +89,12 @@
     public void onUserUnlocked(@NonNull TargetUser user) {
         Slog.d(TAG, "onUserUnlocked: " + user);
         final UserHandle userHandle = user.getUserHandle();
-        mImpl.onUserUnlocked(userHandle);
-        // TODO(b/312521897): Add unit tests for this flow
-        registerUserSetupCompleteListener(userHandle);
+        final Context userContext = getUserContext(getContext(), userHandle);
+        mImpl.onUserUnlocked(userContext, userHandle);
     }
 
     @Override
     public void onUserStopping(@NonNull TargetUser user) {
         Slog.d(TAG, "onUserStopping: " + user);
     }
-
-    private void registerUserSetupCompleteListener(UserHandle userHandle) {
-        final ContentResolver contentResolver = getUserContext(getContext(), userHandle)
-                .getContentResolver();
-        Uri setupCompleteUri = Settings.Secure.getUriFor(USER_SETUP_COMPLETE);
-        contentResolver.registerContentObserver(setupCompleteUri,
-                false /* notifyForDescendants */, new ContentObserver(null /* handler */) {
-                    @Override
-                    public void onChange(boolean selfChange, @Nullable Uri uri) {
-                        if (setupCompleteUri.equals(uri)
-                                && Settings.Secure.getInt(
-                                        contentResolver, USER_SETUP_COMPLETE, 0) != 0) {
-                            mImpl.onUserSetupCompleted(userHandle);
-                        }
-                    }
-                });
-    }
 }
diff --git a/service/java/com/android/server/devicelock/DeviceLockServiceImpl.java b/service/java/com/android/server/devicelock/DeviceLockServiceImpl.java
index b68505a..643e1fb 100644
--- a/service/java/com/android/server/devicelock/DeviceLockServiceImpl.java
+++ b/service/java/com/android/server/devicelock/DeviceLockServiceImpl.java
@@ -25,6 +25,7 @@
 import static android.content.pm.PackageManager.PERMISSION_GRANTED;
 import static android.devicelock.DeviceId.DEVICE_ID_TYPE_IMEI;
 import static android.devicelock.DeviceId.DEVICE_ID_TYPE_MEID;
+import static android.provider.Settings.Secure.USER_SETUP_COMPLETE;
 
 import android.Manifest;
 import android.Manifest.permission;
@@ -34,6 +35,7 @@
 import android.app.role.RoleManager;
 import android.content.BroadcastReceiver;
 import android.content.ComponentName;
+import android.content.ContentResolver;
 import android.content.Context;
 import android.content.Intent;
 import android.content.IntentFilter;
@@ -41,6 +43,7 @@
 import android.content.pm.PackageManager;
 import android.content.pm.PackageManager.NameNotFoundException;
 import android.content.pm.ServiceInfo;
+import android.database.ContentObserver;
 import android.devicelock.DeviceId.DeviceIdType;
 import android.devicelock.DeviceLockManager;
 import android.devicelock.IDeviceLockService;
@@ -50,6 +53,7 @@
 import android.devicelock.ILockUnlockDeviceCallback;
 import android.devicelock.ParcelableException;
 import android.net.NetworkPolicyManager;
+import android.net.Uri;
 import android.os.Binder;
 import android.os.Bundle;
 import android.os.IBinder;
@@ -58,6 +62,7 @@
 import android.os.RemoteCallback;
 import android.os.RemoteException;
 import android.os.UserHandle;
+import android.provider.Settings;
 import android.telephony.TelephonyManager;
 import android.text.TextUtils;
 import android.util.ArrayMap;
@@ -69,6 +74,8 @@
 import java.lang.reflect.InvocationTargetException;
 import java.util.ArrayList;
 import java.util.List;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
 
 /**
  * Implementation of {@link android.devicelock.IDeviceLockService} binder service.
@@ -87,6 +94,7 @@
     private static final int MAX_ADD_ROLE_HOLDER_TRIES = 4;
 
     private final Context mContext;
+    private final ExecutorService mExecutorService = Executors.newCachedThreadPool();
 
     private final RoleManager mRoleManager;
     private final TelephonyManager mTelephonyManager;
@@ -303,20 +311,40 @@
         });
     }
 
-    void onUserUnlocked(@NonNull UserHandle userHandle) {
-        getDeviceLockControllerConnector(userHandle).onUserUnlocked(new OutcomeReceiver<>() {
-            @Override
-            public void onResult(Void ignored) {
-                Slog.i(TAG, "User unlocked reported for: " + userHandle);
-            }
+    void onUserUnlocked(@NonNull Context userContext, @NonNull UserHandle userHandle) {
+        mExecutorService.execute(() -> {
+            getDeviceLockControllerConnector(userHandle).onUserUnlocked(new OutcomeReceiver<>() {
+                @Override
+                public void onResult(Void ignored) {
+                    Slog.i(TAG, "User unlocked reported for: " + userHandle);
+                }
 
-            @Override
-            public void onError(Exception ex) {
-                Slog.e(TAG, "Exception reporting user unlocked for: " + userHandle, ex);
-            }
+                @Override
+                public void onError(Exception ex) {
+                    Slog.e(TAG, "Exception reporting user unlocked for: " + userHandle, ex);
+                }
+            });
+            // TODO(b/312521897): Add unit tests for this flow
+            registerUserSetupCompleteListener(userContext, userHandle);
         });
     }
 
+    private void registerUserSetupCompleteListener(Context userContext, UserHandle userHandle) {
+        final ContentResolver contentResolver = userContext.getContentResolver();
+        Uri setupCompleteUri = Settings.Secure.getUriFor(USER_SETUP_COMPLETE);
+        contentResolver.registerContentObserver(setupCompleteUri,
+                false /* notifyForDescendants */, new ContentObserver(null /* handler */) {
+                    @Override
+                    public void onChange(boolean selfChange, @Nullable Uri uri) {
+                        if (setupCompleteUri.equals(uri)
+                                && Settings.Secure.getInt(
+                                contentResolver, USER_SETUP_COMPLETE, 0) != 0) {
+                            onUserSetupCompleted(userHandle);
+                        }
+                    }
+                });
+    }
+
     void onUserSetupCompleted(UserHandle userHandle) {
         getDeviceLockControllerConnector(userHandle).onUserSetupCompleted(new OutcomeReceiver<>() {
             @Override