Initialize user lifecycle state in initClusterHome()
There were cases that the current user was unlocked even before the
ClusterHomeApplication was created thus the listener did not receive the
user_unlocked lifecycle event to start the UI_TYPE_START activity.
Now initClusterHome() calls UserManager#isUserUnlocked() to initialize
mUserLifeCycleEvent field with the correct state.
Bug: 312519113
Test: Manually using the emulator
Change-Id: I8c01cd56ae8d20567102fc4f91d653f1bd4f2ef8
diff --git a/ClusterHomeSample/src/com/android/car/cluster/home/ClusterHomeApplication.java b/ClusterHomeSample/src/com/android/car/cluster/home/ClusterHomeApplication.java
index 30e368f..280e589 100644
--- a/ClusterHomeSample/src/com/android/car/cluster/home/ClusterHomeApplication.java
+++ b/ClusterHomeSample/src/com/android/car/cluster/home/ClusterHomeApplication.java
@@ -58,6 +58,7 @@
import android.os.Bundle;
import android.os.RemoteException;
import android.os.UserHandle;
+import android.os.UserManager;
import android.util.ArraySet;
import android.util.Log;
import android.view.Display;
@@ -79,10 +80,11 @@
private static final byte UI_AVAILABLE = 1;
private PackageManager mPackageManager;
+ private UserManager mUserManager;
private IActivityTaskManager mAtm;
private InputManager mInputManager;
private ClusterHomeManager mHomeManager;
- private CarUserManager mUserManager;
+ private CarUserManager mCarUserManager;
private CarInputManager mCarInputManager;
private CarAppFocusManager mAppFocusManager;
private ClusterState mClusterState;
@@ -160,6 +162,7 @@
ComponentName.unflattenFromString(getString(R.string.config_clusterPhoneActivity)));
mDefaultClusterActivitySize = mClusterActivities.size();
mPackageManager = getApplicationContext().getPackageManager();
+ mUserManager = getApplicationContext().getSystemService(UserManager.class);
mAtm = ActivityTaskManager.getService();
try {
mAtm.registerTaskStackListener(mTaskStackListener);
@@ -173,7 +176,7 @@
(car, ready) -> {
if (!ready) return;
mHomeManager = (ClusterHomeManager) car.getCarManager(Car.CLUSTER_HOME_SERVICE);
- mUserManager = (CarUserManager) car.getCarManager(Car.CAR_USER_SERVICE);
+ mCarUserManager = (CarUserManager) car.getCarManager(Car.CAR_USER_SERVICE);
mCarInputManager = (CarInputManager) car.getCarManager(Car.CAR_INPUT_SERVICE);
mAppFocusManager = (CarAppFocusManager) car.getCarManager(
Car.APP_FOCUS_SERVICE);
@@ -195,6 +198,7 @@
if (mIsLightMode) {
return;
}
+
mHomeManager.registerClusterStateListener(getMainExecutor(), mClusterHomeCallback);
mClusterState = mHomeManager.getClusterState();
if (!mClusterState.on) {
@@ -202,14 +206,16 @@
}
mUiAvailability = buildUiAvailability(ActivityManager.getCurrentUser());
mHomeManager.reportState(mClusterState.uiType, UI_TYPE_CLUSTER_NONE, mUiAvailability);
- mHomeManager.registerClusterStateListener(getMainExecutor(), mClusterHomeCallback);
// 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);
+ mCarUserManager.addListener(getMainExecutor(), filter, mUserLifecycleListener);
+ if (mUserManager.isUserUnlocked(UserHandle.of(ActivityManager.getCurrentUser()))) {
+ mUserLifeCycleEvent = USER_LIFECYCLE_EVENT_TYPE_UNLOCKED;
+ }
mAppFocusManager.addFocusListener(mAppFocusChangedListener,
CarAppFocusManager.APP_FOCUS_TYPE_NAVIGATION);
@@ -232,7 +238,7 @@
public void onTerminate() {
if (!mIsLightMode) {
mCarInputManager.releaseInputEventCapture(DISPLAY_TYPE_INSTRUMENT_CLUSTER);
- mUserManager.removeListener(mUserLifecycleListener);
+ mCarUserManager.removeListener(mUserLifecycleListener);
mHomeManager.unregisterClusterStateListener(mClusterHomeCallback);
try {
mAtm.unregisterTaskStackListener(mTaskStackListener);