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());
}
}