Ignore public volume state change event of removed user in Automotive

Volume state change event may come from removed user, in this case,
mountedUserId will equal to UserHandle.USER_NULL (-10000) which will do
nothing when call cancelAsUser(), but cauase crash when call
notifyAsUser(). Here we return directly for USER_NULL, and leave all
notifications belong to removed user to NotificationmanagerService, the
latter will remove all notifications of the removed user when handles
user stopped broadcast.

Bug: 156667908
Test: manual - remove user while usb plugged in
Change-Id: I23670e070a17b6da8bdd9eb336aa053e3b799b16
This commit is contained in:
Agatha Man
2020-05-28 09:30:47 -07:00
parent 9511c45efc
commit 74d8c09b8a

View File

@@ -294,6 +294,16 @@ public class StorageNotification extends SystemUI {
private void onPublicVolumeStateChangedInternal(VolumeInfo vol) {
Log.d(TAG, "Notifying about public volume: " + vol.toString());
// Volume state change event may come from removed user, in this case, mountedUserId will
// equals to UserHandle.USER_NULL (-10000) which will do nothing when call cancelAsUser(),
// but cause crash when call notifyAsUser(). Here we return directly for USER_NULL, and
// leave all notifications belong to removed user to NotificationManagerService, the latter
// will remove all notifications of the removed user when handles user stopped broadcast.
if (isAutomotive() && vol.getMountUserId() == UserHandle.USER_NULL) {
Log.d(TAG, "Ignore public volume state change event of removed user");
return;
}
final Notification notif;
switch (vol.getState()) {
case VolumeInfo.STATE_UNMOUNTED: