Fix a NPE and add logging to catch offender in the future

Change-Id: Ic177ad71231e2210b17601e6718123b47634f26f
Fixes: 121116425
Test: robotests
This commit is contained in:
Fan Zhang
2018-12-19 10:03:56 -08:00
parent 7b2b4c838b
commit b2944525c7
2 changed files with 28 additions and 8 deletions

View File

@@ -1,6 +1,8 @@
package com.android.settingslib.core;
import android.content.Context;
import android.text.TextUtils;
import android.util.Log;
import androidx.preference.Preference;
import androidx.preference.PreferenceGroup;
@@ -11,6 +13,8 @@ import androidx.preference.PreferenceScreen;
*/
public abstract class AbstractPreferenceController {
private static final String TAG = "AbstractPrefController";
protected final Context mContext;
public AbstractPreferenceController(Context context) {
@@ -22,6 +26,10 @@ public abstract class AbstractPreferenceController {
*/
public void displayPreference(PreferenceScreen screen) {
final String prefKey = getPreferenceKey();
if (TextUtils.isEmpty(prefKey)) {
Log.w(TAG, "Skipping displayPreference because key is empty:" + getClass().getName());
return;
}
if (isAvailable()) {
setVisible(screen, prefKey, true /* visible */);
if (this instanceof Preference.OnPreferenceChangeListener) {

View File

@@ -35,6 +35,8 @@ import org.robolectric.RuntimeEnvironment;
@RunWith(RobolectricTestRunner.class)
public class AbstractPreferenceControllerTest {
private static final String KEY_PREF = "test_pref";
@Mock
private PreferenceScreen mScreen;
@@ -47,9 +49,9 @@ public class AbstractPreferenceControllerTest {
MockitoAnnotations.initMocks(this);
mContext = RuntimeEnvironment.application;
mPreference = new Preference(mContext);
mPreference.setKey(TestPrefController.KEY_PREF);
when(mScreen.findPreference(TestPrefController.KEY_PREF)).thenReturn(mPreference);
mTestPrefController = new TestPrefController(mContext);
mPreference.setKey(KEY_PREF);
when(mScreen.findPreference(KEY_PREF)).thenReturn(mPreference);
mTestPrefController = new TestPrefController(mContext, KEY_PREF);
}
@Test
@@ -61,16 +63,25 @@ public class AbstractPreferenceControllerTest {
assertThat(mPreference.isVisible()).isTrue();
}
@Test
public void displayPref_noKey_shouldDoNothing() {
mTestPrefController.isAvailable = true;
mTestPrefController.displayPreference(mScreen);
assertThat(mPreference.isVisible()).isTrue();
}
@Test
public void setVisible_prefIsVisible_shouldSetToVisible() {
mTestPrefController.setVisible(mScreen, TestPrefController.KEY_PREF, true /* visible */);
mTestPrefController.setVisible(mScreen, KEY_PREF, true /* visible */);
assertThat(mPreference.isVisible()).isTrue();
}
@Test
public void setVisible_prefNotVisible_shouldSetToInvisible() {
mTestPrefController.setVisible(mScreen, TestPrefController.KEY_PREF, false /* visible */);
mTestPrefController.setVisible(mScreen, KEY_PREF, false /* visible */);
assertThat(mPreference.isVisible()).isFalse();
}
@@ -92,13 +103,14 @@ public class AbstractPreferenceControllerTest {
}
private static class TestPrefController extends AbstractPreferenceController {
private static final String KEY_PREF = "test_pref";
private static final CharSequence TEST_SUMMARY = "Test";
public boolean isAvailable;
private final String mPrefKey;
public TestPrefController(Context context) {
TestPrefController(Context context, String key) {
super(context);
mPrefKey = key;
}
@Override
@@ -113,7 +125,7 @@ public class AbstractPreferenceControllerTest {
@Override
public String getPreferenceKey() {
return KEY_PREF;
return mPrefKey;
}
@Override