From 81a030fdfa997e5909437779b6669dac815b7586 Mon Sep 17 00:00:00 2001 From: Fan Zhang Date: Wed, 11 Jan 2017 10:46:45 -0800 Subject: [PATCH] Fix NPE when adding account but prefManager doesn't exist Change-Id: Ie7371ba461995bae96ed1d99e224ab7e0d7acc99 Fix: 34219500 Test: make -j40 RunSettingsRoboTests --- .../accounts/AccountPreferenceController.java | 7 ++++++ .../AccountPreferenceControllerTest.java | 24 +++++++++++++++---- 2 files changed, 26 insertions(+), 5 deletions(-) diff --git a/src/com/android/settings/accounts/AccountPreferenceController.java b/src/com/android/settings/accounts/AccountPreferenceController.java index 0ddd366ba4e..02610b752bf 100644 --- a/src/com/android/settings/accounts/AccountPreferenceController.java +++ b/src/com/android/settings/accounts/AccountPreferenceController.java @@ -286,6 +286,9 @@ public class AccountPreferenceController extends PreferenceController } private void updateProfileUi(final UserInfo userInfo) { + if (mParent.getPreferenceManager() == null) { + return; + } final Context context = mContext; final ProfileData profileData = new ProfileData(); profileData.userInfo = userInfo; @@ -402,6 +405,10 @@ public class AccountPreferenceController extends PreferenceController } private void updateAccountTypes(ProfileData profileData) { + if (mParent.getPreferenceManager() == null) { + // This could happen if activity is finishing + return; + } profileData.preferenceGroup.removeAll(); if (profileData.userInfo.isEnabled()) { final ArrayList preferences = getAccountTypePreferences( diff --git a/tests/robotests/src/com/android/settings/accounts/AccountPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/accounts/AccountPreferenceControllerTest.java index 398e9c5722c..78d669888fa 100644 --- a/tests/robotests/src/com/android/settings/accounts/AccountPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/accounts/AccountPreferenceControllerTest.java @@ -20,13 +20,12 @@ import android.accounts.AccountManager; import android.accounts.AuthenticatorDescription; import android.content.Context; import android.content.pm.UserInfo; -import android.os.UserManager; import android.os.UserHandle; +import android.os.UserManager; +import android.support.v14.preference.PreferenceFragment; import android.support.v7.preference.Preference; import android.support.v7.preference.PreferenceGroup; import android.support.v7.preference.PreferenceScreen; -import android.support.v14.preference.PreferenceFragment; -import android.util.SparseArray; import com.android.settings.AccessiblePreferenceCategory; import com.android.settings.R; @@ -37,8 +36,6 @@ import com.android.settings.testutils.FakeFeatureFactory; import com.android.settings.testutils.shadow.ShadowAccountManager; import com.android.settings.testutils.shadow.ShadowContentResolver; -import java.util.ArrayList; -import java.util.List; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; @@ -47,6 +44,9 @@ import org.mockito.MockitoAnnotations; import org.robolectric.annotation.Config; import org.robolectric.shadows.ShadowApplication; +import java.util.ArrayList; +import java.util.List; + import static com.google.common.truth.Truth.assertThat; import static org.mockito.Answers.RETURNS_DEEP_STUBS; import static org.mockito.Matchers.any; @@ -207,6 +207,20 @@ public class AccountPreferenceControllerTest { // Should not crash } + @Test + @Config(shadows = {ShadowAccountManager.class, ShadowContentResolver.class}) + public void onResume_noPreferenceManager_shouldNotCrash() { + when(mFragment.getPreferenceManager()).thenReturn(null); + final List infos = new ArrayList<>(); + infos.add(new UserInfo(1, "user 1", 0)); + when(mUserManager.isManagedProfile()).thenReturn(false); + when(mUserManager.isLinkedUser()).thenReturn(false); + when(mUserManager.getProfiles(anyInt())).thenReturn(infos); + mController.onResume(); + + // Should not crash + } + @Test public void updateRawDataToIndex_ManagedProfile_shouldNotUpdate() { final List data = new ArrayList<>();