Migrate Maps to CarAM.setPersistentActivity.

Bug: 200044674
Test: Check if Maps is showing in the background TDA in gcar_ui_portrait
Change-Id: I7116db7db29e576d00e28707c886fd9f33c5f8a1
Merged-In: I7116db7db29e576d00e28707c886fd9f33c5f8a1
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index bf5af2d..fcf469c 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -20,6 +20,8 @@
 
     <!-- System permission to access the CarProjectionManager for projection status-->
     <uses-permission android:name="android.car.permission.ACCESS_CAR_PROJECTION_STATUS"/>
+    <!-- Permission to assign Activity to TDA -->
+    <uses-permission android:name="android.car.permission.CONTROL_CAR_APP_LAUNCH"/>
     <!-- System permission to host maps activity -->
     <uses-permission android:name="android.permission.ACTIVITY_EMBEDDING"/>
     <!-- Needed to change component enabled state when user opens disabled apps. -->
diff --git a/res/values/config.xml b/res/values/config.xml
index 4f7b808..4907c3e 100644
--- a/res/values/config.xml
+++ b/res/values/config.xml
@@ -57,4 +57,8 @@
     -->
     <string-array name="config_ignoreOpeningForegroundDA" translatable="false">
     </string-array>
+
+    <!-- The ComponentName of Assistant VoicePlate Activity, the Activity will be placed in
+        VoicePlate TDA. -->
+    <string name="config_assistantVoicePlateActivity" translatable="false"></string>
 </resources>
diff --git a/res/values/overlayable.xml b/res/values/overlayable.xml
index 4e9bf2a..71eaa58 100644
--- a/res/values/overlayable.xml
+++ b/res/values/overlayable.xml
@@ -164,6 +164,7 @@
       <item type="string" name="app_launcher_title_all_apps"/>
       <item type="string" name="app_launcher_title_media_only"/>
       <item type="string" name="app_title"/>
+      <item type="string" name="config_assistantVoicePlateActivity"/>
       <item type="string" name="driving_toast_text"/>
       <item type="string" name="fake_weather_footer_text"/>
       <item type="string" name="fake_weather_main_text"/>
diff --git a/src/com/android/car/carlauncher/CarLauncherUtils.java b/src/com/android/car/carlauncher/CarLauncherUtils.java
index 56c830d..b23c2fd 100644
--- a/src/com/android/car/carlauncher/CarLauncherUtils.java
+++ b/src/com/android/car/carlauncher/CarLauncherUtils.java
@@ -41,6 +41,7 @@
         defaultIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
         PackageManager pm = context.getPackageManager();
         ComponentName defaultActivity = defaultIntent.resolveActivity(pm);
+        defaultIntent.setComponent(defaultActivity);
 
         for (String intentUri : context.getResources().getStringArray(
                 R.array.config_homeCardPreferredMapActivities)) {
diff --git a/src/com/android/car/carlauncher/displayarea/CarDisplayAreaOrganizer.java b/src/com/android/car/carlauncher/displayarea/CarDisplayAreaOrganizer.java
index 5d48b98..c3f73f9 100644
--- a/src/com/android/car/carlauncher/displayarea/CarDisplayAreaOrganizer.java
+++ b/src/com/android/car/carlauncher/displayarea/CarDisplayAreaOrganizer.java
@@ -18,11 +18,14 @@
 
 import static android.view.Display.DEFAULT_DISPLAY;
 
+import static com.android.car.carlauncher.CarLauncher.TAG;
 import static com.android.car.carlauncher.displayarea.CarDisplayAreaController.BACKGROUND_LAYER_INDEX;
 import static com.android.car.carlauncher.displayarea.CarDisplayAreaController.FOREGROUND_LAYER_INDEX;
 
 import android.app.ActivityOptions;
 import android.car.Car;
+import android.car.app.CarActivityManager;
+import android.content.ComponentName;
 import android.content.Context;
 import android.content.Intent;
 import android.content.res.Resources;
@@ -31,6 +34,7 @@
 import android.os.Handler;
 import android.util.ArrayMap;
 import android.util.DisplayMetrics;
+import android.util.Log;
 import android.view.Display;
 import android.view.SurfaceControl;
 import android.window.DisplayAreaAppearedInfo;
@@ -43,11 +47,14 @@
 import androidx.annotation.VisibleForTesting;
 
 import com.android.car.carlauncher.AppGridActivity;
+import com.android.car.carlauncher.R;
 import com.android.wm.shell.common.SyncTransactionQueue;
 
 import java.util.List;
 import java.util.concurrent.Executor;
 
+import javax.annotation.Nullable;
+
 /**
  * Organizer for controlling the policies defined in
  * {@link com.android.server.wm.CarDisplayAreaPolicyProvider}
@@ -73,6 +80,10 @@
 
     public static final int FEATURE_TITLE_BAR = FEATURE_VENDOR_FIRST + 5;
 
+    private static final int FEATURE_VOICE_PLATE = FEATURE_VENDOR_FIRST + 7;
+    @Nullable
+    private final ComponentName mAssistantVoicePlateActivityName;
+
     private static CarDisplayAreaOrganizer sCarDisplayAreaOrganizer;
 
     private final Context mContext;
@@ -163,12 +174,47 @@
         super(executor);
         mContext = context;
         mMapsIntent = mapsIntent;
-        mMapsIntent.putExtra(Car.CAR_EXTRA_LAUNCH_PERSISTENT, Car.LAUNCH_PERSISTENT_ADD);
         mAudioControlIntent = audioControlIntent;
         mTransactionQueue = tx;
+        // TODO(b/201712747): Gets the Assistant Activity by resolving the indirect Intent.
+        mAssistantVoicePlateActivityName = ComponentName.unflattenFromString(
+                context.getResources().getString(R.string.config_assistantVoicePlateActivity));
 
         mAnimationController = new CarLauncherDisplayAreaAnimationController(mContext);
         mHandlerForAnimation = mContext.getMainThreadHandler();
+
+        Car.createCar(context, /* handler= */ null, Car.CAR_WAIT_TIMEOUT_WAIT_FOREVER,
+                mCarServiceLifecycleListener);
+    }
+
+    private final Car.CarServiceLifecycleListener mCarServiceLifecycleListener =
+            new Car.CarServiceLifecycleListener() {
+                @Override
+                public void onLifecycleChanged(@NonNull Car car, boolean ready) {
+                    if (ready) {
+                        CarActivityManager carAm = (CarActivityManager) car.getCarManager(
+                                Car.CAR_ACTIVITY_SERVICE);
+                        setPersistentActivity(carAm, mMapsIntent.getComponent(),
+                                BACKGROUND_TASK_CONTAINER, "Background");
+                        // The following code will be enabled after FEATURE_VOICE_PLATE is landed.
+                        //setPersistentActivity(carAm, mAssistantVoicePlateActivityName,
+                        //        FEATURE_VOICE_PLATE, "VoicePlate");
+                    }
+                }
+            };
+
+    private static void setPersistentActivity(CarActivityManager am,
+            @Nullable ComponentName activity, int featureId, String featureName) {
+        if (activity == null) {
+            Log.e(TAG, "Empty activity for " + featureName + " (" + featureId + ")");
+            return;
+        }
+        int ret = am.setPersistentActivity(activity, DEFAULT_DISPLAY, featureId);
+        if (ret != CarActivityManager.RESULT_SUCCESS) {
+            Log.e(TAG, "Failed to set PersistentActivity: activity=" + activity
+                    + ", ret=" + ret);
+            return;
+        }
     }
 
     int getDpiDensity() {
@@ -335,10 +381,6 @@
         mDisplayAreaTokenMap.put(displayAreaInfo.token, leash);
     }
 
-    WindowContainerToken getBackgroundDisplayToken() {
-        return mBackgroundDisplayToken;
-    }
-
     /**
      * Launches the map in the background DA.
      */
@@ -346,7 +388,6 @@
         ActivityOptions options = ActivityOptions
                 .makeCustomAnimation(mContext,
                         /* enterResId= */ 0, /* exitResId= */ 0);
-        options.setLaunchTaskDisplayArea(mBackgroundDisplayToken);
         mContext.startActivity(mMapsIntent, options.toBundle());
     }
 
diff --git a/src/com/android/car/carlauncher/displayarea/CarFullscreenTaskListener.java b/src/com/android/car/carlauncher/displayarea/CarFullscreenTaskListener.java
index 4f3b7aa..fc87ffb 100644
--- a/src/com/android/car/carlauncher/displayarea/CarFullscreenTaskListener.java
+++ b/src/com/android/car/carlauncher/displayarea/CarFullscreenTaskListener.java
@@ -62,8 +62,6 @@
             if (mCarDisplayAreaController.getOrganizer() != null) {
                 ActivityOptions options = ActivityOptions
                         .makeCustomAnimation(mContext, /* enterResId= */ 0, /* exitResId= */ 0);
-                options.setLaunchTaskDisplayArea(
-                        mCarDisplayAreaController.getOrganizer().getBackgroundDisplayToken());
                 mContext.startActivity(taskInfo.baseIntent, options.toBundle());
             }
         }