Fix possible race in blocking dialog
- also add dump to show the status of the dialog
Bug: 156817002
Bug: 156653601
Test: check cluster with user switching
Change-Id: I95a00d773c1bd292f6cbfa40379e28e539fd312c
(cherry picked from commit c4c9d80d306568a52923f31717bc08fef3297b4d)
diff --git a/service/src/com/android/car/am/FixedActivityService.java b/service/src/com/android/car/am/FixedActivityService.java
index f381702..cd16463 100644
--- a/service/src/com/android/car/am/FixedActivityService.java
+++ b/service/src/com/android/car/am/FixedActivityService.java
@@ -138,7 +138,7 @@
}
if (CarUserManager.USER_LIFECYCLE_EVENT_TYPE_SWITCHING == event.getEventType()) {
synchronized (FixedActivityService.this.mLock) {
- FixedActivityService.this.mRunningActivities.clear();
+ clearRunningActivitiesLocked();
}
}
};
@@ -290,6 +290,25 @@
synchronized (mLock) {
writer.println("mRunningActivities:" + mRunningActivities
+ " ,mEventMonitoringActive:" + mEventMonitoringActive);
+ writer.println("mBlockingPresentations:");
+ for (int i = 0; i < mBlockingPresentations.size(); i++) {
+ Presentation p = mBlockingPresentations.valueAt(i);
+ if (p == null) {
+ continue;
+ }
+ writer.println("display:" + mBlockingPresentations.keyAt(i)
+ + " showing:" + p.isShowing());
+ }
+ }
+ }
+
+ private void clearRunningActivitiesLocked() {
+ int currentUser = ActivityManager.getCurrentUser();
+ for (int i = mRunningActivities.size() - 1; i >= 0; i--) {
+ RunningActivityInfo info = mRunningActivities.valueAt(i);
+ if (info == null || info.userId != currentUser) {
+ mRunningActivities.removeAt(i);
+ }
}
}
@@ -411,10 +430,15 @@
Presentation p = new Presentation(mContext, display,
android.R.style.Theme_Black_NoTitleBar_Fullscreen);
p.setContentView(R.layout.activity_continuous_blank);
- p.show();
synchronized (mLock) {
+ RunningActivityInfo info = mRunningActivities.get(displayIdForActivity);
+ if (info != null && info.userId == ActivityManager.getCurrentUser()) {
+ Log.i(TAG_AM, "Do not show Presentation, new req already made");
+ return;
+ }
mBlockingPresentations.append(displayIdForActivity, p);
}
+ p.show();
});
}
mRunningActivities.removeAt(i);