From 49f4f03dc8ed3925e80d379634e43eb24eea25b9 Mon Sep 17 00:00:00 2001 From: Sunny Goyal Date: Mon, 1 Aug 2016 15:45:49 -0700 Subject: Handling IllegalStateException which can be thrown by the system when the user is locked Bug: 30411561 Change-Id: I0d7fc0aaecba01b1aaac95b98654f6e3ee090ce8 --- src/com/android/launcher3/LauncherModel.java | 33 ++++++++++++++++------ .../launcher3/shortcuts/DeepShortcutManager.java | 10 +++---- 2 files changed, 29 insertions(+), 14 deletions(-) diff --git a/src/com/android/launcher3/LauncherModel.java b/src/com/android/launcher3/LauncherModel.java index 89a68369b..9fddd3d8d 100644 --- a/src/com/android/launcher3/LauncherModel.java +++ b/src/com/android/launcher3/LauncherModel.java @@ -1729,17 +1729,24 @@ public class LauncherModel extends BroadcastReceiver quietMode.put(serialNo, mUserManager.isQuietModeEnabled(user)); boolean userUnlocked = mUserManager.isUserUnlocked(user); - unlockedUsers.put(serialNo, userUnlocked); // We can only query for shortcuts when the user is unlocked. if (userUnlocked) { - List pinnedShortcuts = mDeepShortcutManager - .queryForPinnedShortcuts(null, user); - for (ShortcutInfoCompat shortcut : pinnedShortcuts) { - shortcutKeyToPinnedShortcuts.put(ShortcutKey.fromInfo(shortcut), - shortcut); + List pinnedShortcuts = + mDeepShortcutManager.queryForPinnedShortcuts(null, user); + if (mDeepShortcutManager.wasLastCallSuccess()) { + for (ShortcutInfoCompat shortcut : pinnedShortcuts) { + shortcutKeyToPinnedShortcuts.put(ShortcutKey.fromInfo(shortcut), + shortcut); + } + } else { + // Shortcut manager can fail due to some race condition when the + // lock state changes too frequently. For the purpose of the loading + // shortcuts, consider the user is still locked. + userUnlocked = false; } } + unlockedUsers.put(serialNo, userUnlocked); } ShortcutInfo info; @@ -3383,9 +3390,17 @@ public class LauncherModel extends BroadcastReceiver HashMap pinnedShortcuts = new HashMap<>(); if (isUserUnlocked) { - for (ShortcutInfoCompat shortcut : - mDeepShortcutManager.queryForPinnedShortcuts(null, mUser)) { - pinnedShortcuts.put(ShortcutKey.fromInfo(shortcut), shortcut); + List shortcuts = + mDeepShortcutManager.queryForPinnedShortcuts(null, mUser); + if (mDeepShortcutManager.wasLastCallSuccess()) { + for (ShortcutInfoCompat shortcut : shortcuts) { + pinnedShortcuts.put(ShortcutKey.fromInfo(shortcut), shortcut); + } + } else { + // Shortcut manager can fail due to some race condition when the lock state + // changes too frequently. For the purpose of the update, + // consider it as still locked. + isUserUnlocked = false; } } diff --git a/src/com/android/launcher3/shortcuts/DeepShortcutManager.java b/src/com/android/launcher3/shortcuts/DeepShortcutManager.java index 36bb2b5df..05ab84361 100644 --- a/src/com/android/launcher3/shortcuts/DeepShortcutManager.java +++ b/src/com/android/launcher3/shortcuts/DeepShortcutManager.java @@ -105,7 +105,7 @@ public class DeepShortcutManager { try { mLauncherApps.pinShortcuts(packageName, pinnedIds, user.getUser()); mWasLastCallSuccess = true; - } catch (SecurityException e) { + } catch (SecurityException|IllegalStateException e) { Log.w(TAG, "Failed to unpin shortcut", e); mWasLastCallSuccess = false; } @@ -127,7 +127,7 @@ public class DeepShortcutManager { try { mLauncherApps.pinShortcuts(packageName, pinnedIds, user.getUser()); mWasLastCallSuccess = true; - } catch (SecurityException e) { + } catch (SecurityException|IllegalStateException e) { Log.w(TAG, "Failed to pin shortcut", e); mWasLastCallSuccess = false; } @@ -142,7 +142,7 @@ public class DeepShortcutManager { mLauncherApps.startShortcut(packageName, id, sourceBounds, startActivityOptions, user.getUser()); mWasLastCallSuccess = true; - } catch (SecurityException e) { + } catch (SecurityException|IllegalStateException e) { Log.e(TAG, "Failed to start shortcut", e); mWasLastCallSuccess = false; } @@ -157,7 +157,7 @@ public class DeepShortcutManager { shortcutInfo.getShortcutInfo(), density); mWasLastCallSuccess = true; return icon; - } catch (SecurityException e) { + } catch (SecurityException|IllegalStateException e) { Log.e(TAG, "Failed to get shortcut icon", e); mWasLastCallSuccess = false; } @@ -208,7 +208,7 @@ public class DeepShortcutManager { try { shortcutInfos = mLauncherApps.getShortcuts(q, user.getUser()); mWasLastCallSuccess = true; - } catch (SecurityException e) { + } catch (SecurityException|IllegalStateException e) { Log.e(TAG, "Failed to query for shortcuts", e); mWasLastCallSuccess = false; } -- cgit v1.2.3