From 5184c9b02e6960f76bb4c3cb370df8f45ee82dc7 Mon Sep 17 00:00:00 2001 From: Raff Tsai Date: Thu, 26 Sep 2019 11:41:46 +0800 Subject: [PATCH] Fix Settings crash - When user leaves WiFi control page, ApplicationState session is onpause(), and removes all handler callback. But if a callback is fired, remove callback can not remove it. Therefore Wifi callback is received in Special app access page which is loading DataUsageState. It caused object cast error because wifi callback want to cast DataUsageState data to WifiSettingsState. - The solution is do not rebuildList in paused state. Fixes: 141321483 Test: manual, robolectric Change-Id: I6690277932ccfcd332fc1432feafbc907fc79524 --- .../applications/ApplicationsState.java | 8 ++++++-- .../applications/ApplicationsStateRoboTest.java | 15 ++++++++++++++- 2 files changed, 20 insertions(+), 3 deletions(-) diff --git a/packages/SettingsLib/src/com/android/settingslib/applications/ApplicationsState.java b/packages/SettingsLib/src/com/android/settingslib/applications/ApplicationsState.java index 6a906719d3fa2..19c666459723d 100644 --- a/packages/SettingsLib/src/com/android/settingslib/applications/ApplicationsState.java +++ b/packages/SettingsLib/src/com/android/settingslib/applications/ApplicationsState.java @@ -865,6 +865,10 @@ public class ApplicationsState { void handleRebuildList() { AppFilter filter; Comparator comparator; + + if (!mResumed) { + return; + } synchronized (mRebuildSync) { if (!mRebuildRequested) { return; @@ -1069,8 +1073,8 @@ public class ApplicationsState { } } if (rebuildingSessions != null) { - for (int i = 0; i < rebuildingSessions.size(); i++) { - rebuildingSessions.get(i).handleRebuildList(); + for (Session session : rebuildingSessions) { + session.handleRebuildList(); } } diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/applications/ApplicationsStateRoboTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/applications/ApplicationsStateRoboTest.java index f8697a19c7abe..95a4f69b287ca 100644 --- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/applications/ApplicationsStateRoboTest.java +++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/applications/ApplicationsStateRoboTest.java @@ -269,7 +269,7 @@ public class ApplicationsStateRoboTest { } @Test - public void testDefaultSessionLoadsAll() { + public void testDefaultSession_isResumed_LoadsAll() { mSession.onResume(); addApp(HOME_PACKAGE_NAME, 1); @@ -295,6 +295,19 @@ public class ApplicationsStateRoboTest { assertThat(launchableEntry.launcherEntryEnabled).isTrue(); } + @Test + public void testDefaultSession_isPaused_NotLoadsAll() { + mSession.onResume(); + + addApp(HOME_PACKAGE_NAME, 1); + addApp(LAUNCHABLE_PACKAGE_NAME, 2); + mSession.mResumed = false; + mSession.rebuild(ApplicationsState.FILTER_EVERYTHING, ApplicationsState.SIZE_COMPARATOR); + processAllMessages(); + + verify(mCallbacks, never()).onRebuildComplete(mAppEntriesCaptor.capture()); + } + @Test public void testCustomSessionLoadsIconsOnly() { mSession.setSessionFlags(ApplicationsState.FLAG_SESSION_REQUEST_ICONS);