Merge tm-dev-plus-aosp-without-vendor@8763363

Bug: 236760014
Merged-In: I7bcc252f8edda63d8e132835580daf244eef0014
Change-Id: I574ed072e87dfb8da7dab290210b06a64df22dcb
diff --git a/ClusterHomeSample/src/com/android/car/cluster/home/ClusterHomeApplication.java b/ClusterHomeSample/src/com/android/car/cluster/home/ClusterHomeApplication.java
index 86b8d30..c85fa41 100644
--- a/ClusterHomeSample/src/com/android/car/cluster/home/ClusterHomeApplication.java
+++ b/ClusterHomeSample/src/com/android/car/cluster/home/ClusterHomeApplication.java
@@ -43,6 +43,7 @@
 import android.car.input.CarInputManager.CarInputCaptureCallback;
 import android.car.user.CarUserManager;
 import android.car.user.CarUserManager.UserLifecycleListener;
+import android.car.user.UserLifecycleEventFilter;
 import android.content.ComponentName;
 import android.content.Intent;
 import android.graphics.Rect;
@@ -62,6 +63,7 @@
     private static final int UI_TYPE_MAPS = UI_TYPE_HOME + 1;
     private static final int UI_TYPE_MUSIC = UI_TYPE_HOME + 2;
     private static final int UI_TYPE_PHONE = UI_TYPE_HOME + 3;
+    private static final int UI_TYPE_START = UI_TYPE_MAPS;
 
     private static final byte HOME_AVAILABILITY = 1;
     private static final byte MAPS_AVAILABILITY = 1;
@@ -114,16 +116,26 @@
     }
 
     private void initClusterHome() {
-        mHomeManager.registerClusterStateListener(getMainExecutor(), mClusterHomeListener);
+        if (mHomeManager == null) {
+            Log.e(TAG, "ClusterHome is null (ClusterHomeService may not be enabled), "
+                    + "Stopping ClusterHomeSample.");
+            return;
+        }
+        mHomeManager.registerClusterStateListener(getMainExecutor(),mClusterHomeCalback);
         mClusterState = mHomeManager.getClusterState();
         if (!mClusterState.on) {
             mHomeManager.requestDisplay(UI_TYPE_HOME);
         }
         mUiAvailability = buildUiAvailability();
         mHomeManager.reportState(mClusterState.uiType, UI_TYPE_CLUSTER_NONE, mUiAvailability);
-        mHomeManager.registerClusterStateListener(getMainExecutor(), mClusterHomeListener);
+        mHomeManager.registerClusterStateListener(getMainExecutor(), mClusterHomeCalback);
 
-        mUserManager.addListener(getMainExecutor(), mUserLifecycleListener);
+        // Using the filter, only listens to the current user starting or unlocked events.
+        UserLifecycleEventFilter filter = new UserLifecycleEventFilter.Builder()
+                .addUser(UserHandle.CURRENT)
+                .addEventType(USER_LIFECYCLE_EVENT_TYPE_STARTING)
+                .addEventType(USER_LIFECYCLE_EVENT_TYPE_UNLOCKED).build();
+        mUserManager.addListener(getMainExecutor(), filter, mUserLifecycleListener);
 
         int r = mCarInputManager.requestInputEventCapture(
                 DISPLAY_TYPE_INSTRUMENT_CLUSTER,
@@ -143,7 +155,7 @@
     public void onTerminate() {
         mCarInputManager.releaseInputEventCapture(DISPLAY_TYPE_INSTRUMENT_CLUSTER);
         mUserManager.removeListener(mUserLifecycleListener);
-        mHomeManager.unregisterClusterStateListener(mClusterHomeListener);
+        mHomeManager.unregisterClusterStateListener(mClusterHomeCalback);
         try {
             mAtm.unregisterTaskStackListener(mTaskStackListener);
         } catch (RemoteException e) {
@@ -153,7 +165,8 @@
     }
 
     private void startClusterActivity(int uiType) {
-        if (mUserLifeCycleEvent != USER_LIFECYCLE_EVENT_TYPE_UNLOCKED) {
+        // Because ClusterHomeActivity runs as a user 0, so it can run in the locked state.
+        if (uiType != UI_TYPE_HOME && mUserLifeCycleEvent != USER_LIFECYCLE_EVENT_TYPE_UNLOCKED) {
             Log.i(TAG, "Ignore to start Activity(" + uiType + ") during user-switching");
             return;
         }
@@ -189,7 +202,7 @@
         };
     }
 
-    private final ClusterStateListener mClusterHomeListener = new ClusterStateListener() {
+    private final ClusterStateListener mClusterHomeCalback = new ClusterStateListener() {
         @Override
         public void onClusterStateChanged(
                 ClusterState state, @ClusterHomeManager.Config int changes) {
@@ -214,7 +227,7 @@
     };
 
     private void handleTaskStackChanged() {
-        if (mClusterState.displayId == Display.INVALID_DISPLAY) {
+        if (mClusterState == null || mClusterState.displayId == Display.INVALID_DISPLAY) {
             return;
         }
         TaskInfo taskInfo;
@@ -252,12 +265,13 @@
 
     private final UserLifecycleListener mUserLifecycleListener = (event) -> {
         if (DBG) Log.d(TAG, "UserLifecycleListener.onEvent: event=" + event);
-        if (event.getUserId() != ActivityManager.getCurrentUser()) {
-            return;
-        }
+
         mUserLifeCycleEvent = event.getEventType();
         if (mUserLifeCycleEvent == USER_LIFECYCLE_EVENT_TYPE_STARTING) {
             startClusterActivity(UI_TYPE_HOME);
+        } else if (UI_TYPE_HOME != UI_TYPE_START
+                && mUserLifeCycleEvent == USER_LIFECYCLE_EVENT_TYPE_UNLOCKED) {
+            startClusterActivity(UI_TYPE_START);
         }
     };
 
diff --git a/DirectRenderingCluster/Android.bp b/DirectRenderingCluster/Android.bp
index 5ca597a..3830547 100644
--- a/DirectRenderingCluster/Android.bp
+++ b/DirectRenderingCluster/Android.bp
@@ -43,7 +43,6 @@
         "car-media-common",
         "car-telephony-common",
         "car-apps-common",
-        "com.android.car.internal.common",
     ],
 
     libs: ["android.car"],
diff --git a/DirectRenderingCluster/AndroidManifest.xml b/DirectRenderingCluster/AndroidManifest.xml
index 98c8c69..6f1ce2b 100644
--- a/DirectRenderingCluster/AndroidManifest.xml
+++ b/DirectRenderingCluster/AndroidManifest.xml
@@ -30,7 +30,7 @@
     <uses-permission android:name="android.permission.CONTROL_INCALL_EXPERIENCE"/>
     <uses-permission android:name="android.permission.WRITE_SECURE_SETTINGS"
         tools:ignore="ProtectedPermissions"/>
-    <uses-permission android:name="android.permission.MANAGE_ACTIVITY_STACKS"/>
+    <uses-permission android:name="android.permission.MANAGE_ACTIVITY_TASKS"/>
     <uses-permission android:name="android.permission.INJECT_EVENTS"/>
     <uses-permission android:name="android.permission.INTERNET" />
     <uses-permission android:name="android.permission.INTERNAL_SYSTEM_WINDOW"/>
diff --git a/DirectRenderingCluster/src/android/car/cluster/MusicFragment.java b/DirectRenderingCluster/src/android/car/cluster/MusicFragment.java
index 540db4d..873fef3 100644
--- a/DirectRenderingCluster/src/android/car/cluster/MusicFragment.java
+++ b/DirectRenderingCluster/src/android/car/cluster/MusicFragment.java
@@ -94,6 +94,7 @@
             trackLength,
             seekBar,
             albumIcon,
+            null,
             new Size(artSize, artSize)
         );