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