Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 1b1e16bb authored by TreeHugger Robot's avatar TreeHugger Robot Committed by Android (Google) Code Review
Browse files

Merge "Show/hide preference instead of removing it in display."

parents 570d4db0 7293cf44
Loading
Loading
Loading
Loading
+4 −30
Original line number Diff line number Diff line
@@ -20,14 +20,16 @@ public abstract class AbstractPreferenceController {
     * Displays preference in this controller.
     */
    public void displayPreference(PreferenceScreen screen) {
        final String prefKey = getPreferenceKey();
        if (isAvailable()) {
            setVisible(screen, prefKey, true /* visible */);
            if (this instanceof Preference.OnPreferenceChangeListener) {
                final Preference preference = screen.findPreference(getPreferenceKey());
                final Preference preference = screen.findPreference(prefKey);
                preference.setOnPreferenceChangeListener(
                        (Preference.OnPreferenceChangeListener) this);
            }
        } else {
            removePreference(screen, getPreferenceKey());
            setVisible(screen, prefKey, false /* visible */);
        }
    }

@@ -58,13 +60,6 @@ public abstract class AbstractPreferenceController {
     */
    public abstract String getPreferenceKey();

    /**
     * Removes preference from screen.
     */
    protected final void removePreference(PreferenceScreen screen, String key) {
        findAndRemovePreference(screen, key);
    }

    /**
     * Show/hide a preference.
     */
@@ -74,25 +69,4 @@ public abstract class AbstractPreferenceController {
            pref.setVisible(isVisible);
        }
    }

    // finds the preference recursively and removes it from its parent
    private boolean findAndRemovePreference(PreferenceGroup prefGroup, String key) {
        final int preferenceCount = prefGroup.getPreferenceCount();
        for (int i = 0; i < preferenceCount; i++) {
            final Preference preference = prefGroup.getPreference(i);
            final String curKey = preference.getKey();

            if (curKey != null && curKey.equals(key)) {
                return prefGroup.removePreference(preference);
            }

            if (preference instanceof PreferenceGroup) {
                if (findAndRemovePreference((PreferenceGroup) preference, key)) {
                    return true;
                }
            }
        }
        return false;
    }

}
+4 −2
Original line number Diff line number Diff line
@@ -18,18 +18,20 @@ package com.android.settingslib.deviceinfo;

import android.content.Context;
import android.os.Build;
import android.support.annotation.VisibleForTesting;
import android.support.v7.preference.Preference;
import android.support.v7.preference.PreferenceScreen;
import android.text.TextUtils;

import com.android.internal.annotations.VisibleForTesting;
import com.android.settingslib.core.AbstractPreferenceController;

/**
 * Preference controller for displaying device serial number. Wraps {@link Build#getSerial()}.
 */
public class AbstractSerialNumberPreferenceController extends AbstractPreferenceController {
    private static final String KEY_SERIAL_NUMBER = "serial_number";

    @VisibleForTesting
    static final String KEY_SERIAL_NUMBER = "serial_number";

    private final String mSerialNumber;

+8 −91
Original line number Diff line number Diff line
@@ -16,17 +16,10 @@
package com.android.settingslib.core;

import static com.google.common.truth.Truth.assertThat;
import static org.mockito.Matchers.any;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;

import android.content.Context;
import android.support.v7.preference.Preference;
import android.support.v7.preference.PreferenceGroup;
import android.support.v7.preference.PreferenceManager;
import android.support.v7.preference.PreferenceScreen;

import com.android.settingslib.TestConfig;
@@ -39,134 +32,58 @@ import org.mockito.MockitoAnnotations;
import org.robolectric.RobolectricTestRunner;
import org.robolectric.RuntimeEnvironment;
import org.robolectric.annotation.Config;
import org.robolectric.shadows.ShadowApplication;

@RunWith(RobolectricTestRunner.class)
@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
public class AbstractPreferenceControllerTest {

    @Mock
    private Context mContext;
    @Mock
    private PreferenceScreen mScreen;

    private Context mContext;
    private Preference mPreference;
    private TestPrefController mTestPrefController;

    @Before
    public void setUp() {
        MockitoAnnotations.initMocks(this);
        mPreference = new Preference(RuntimeEnvironment.application);
        mContext = RuntimeEnvironment.application;
        mPreference = new Preference(mContext);
        mPreference.setKey(TestPrefController.KEY_PREF);
        when(mScreen.findPreference(TestPrefController.KEY_PREF)).thenReturn(mPreference);
        mTestPrefController = new TestPrefController(mContext);
    }

    @Test
    public void removeExistingPref_shouldBeRemoved() {
        when(mScreen.getPreferenceCount()).thenReturn(1);
        when(mScreen.getPreference(0)).thenReturn(mPreference);

        mTestPrefController.removePreference(mScreen, TestPrefController.KEY_PREF);

        verify(mScreen).removePreference(mPreference);
    }

    @Test
    public void removeNonExistingPref_shouldNotRemoveAnything() {
        mTestPrefController.removePreference(mScreen, TestPrefController.KEY_PREF);

        verify(mScreen, never()).removePreference(any(Preference.class));
    }

    @Test
    public void displayPref_ifAvailable() {
        mTestPrefController.isAvailable = true;

        mTestPrefController.displayPreference(mScreen);

        verify(mScreen, never()).removePreference(any(Preference.class));
        assertThat(mPreference.isVisible()).isTrue();
    }

    @Test
    public void setVisible_prefIsVisible_shouldSetToVisible() {
        when(mScreen.findPreference(TestPrefController.KEY_PREF)).thenReturn(mPreference);

        mTestPrefController.setVisible(mScreen, TestPrefController.KEY_PREF, true /* visible */);

        assertThat(mPreference.isVisible()).isTrue();
    }

    @Test
    public void setVisible_prefNotVisible_shouldSetToInvisible() {
        when(mScreen.findPreference(TestPrefController.KEY_PREF)).thenReturn(mPreference);

        mTestPrefController.setVisible(mScreen, TestPrefController.KEY_PREF, false /* visible */);

        assertThat(mPreference.isVisible()).isFalse();
    }

    @Test
    public void doNotDisplayPref_ifNotAvailable() {
        when(mScreen.getPreferenceCount()).thenReturn(1);
        when(mScreen.getPreference(0)).thenReturn(mPreference);
        mTestPrefController.isAvailable = false;

        mTestPrefController.displayPreference(mScreen);

        verify(mScreen).removePreference(any(Preference.class));
    }

    @Test
    public void removePreference_shouldRemoveRecursively() {
        final Context context = ShadowApplication.getInstance().getApplicationContext();
        final PreferenceManager preferenceManager = mock(PreferenceManager.class);
        // Top level
        PreferenceScreen prefRoot = spy(new PreferenceScreen(context, null));
        when(prefRoot.getPreferenceManager()).thenReturn(preferenceManager);
        Preference pref1 = mock(Preference.class);
        when(pref1.getKey()).thenReturn("key1");
        PreferenceGroup prefGroup2 = spy(new PreferenceScreen(context, null));
        when(prefGroup2.getPreferenceManager()).thenReturn(preferenceManager);
        when(prefGroup2.getKey()).thenReturn("group2");
        Preference pref3 = mock(Preference.class);
        when(pref3.getKey()).thenReturn("key3");
        PreferenceGroup prefGroup4 = spy(new PreferenceScreen(context, null));
        when(prefGroup4.getPreferenceManager()).thenReturn(preferenceManager);
        when(prefGroup4.getKey()).thenReturn("group4");
        prefRoot.addPreference(pref1);
        prefRoot.addPreference(prefGroup2);
        prefRoot.addPreference(pref3);
        prefRoot.addPreference(prefGroup4);

        // 2nd level
        Preference pref21 = mock(Preference.class);
        when(pref21.getKey()).thenReturn("key21");
        Preference pref22 = mock(Preference.class);
        when(pref22.getKey()).thenReturn("key22");
        prefGroup2.addPreference(pref21);
        prefGroup2.addPreference(pref22);
        PreferenceGroup prefGroup41 = spy(new PreferenceScreen(context, null));
        when(prefGroup41.getKey()).thenReturn("group41");
        when(prefGroup41.getPreferenceManager()).thenReturn(preferenceManager);
        Preference pref42 = mock(Preference.class);
        when(pref42.getKey()).thenReturn("key42");
        prefGroup4.addPreference(prefGroup41);
        prefGroup4.addPreference(pref42);

        // 3rd level
        Preference pref411 = mock(Preference.class);
        when(pref411.getKey()).thenReturn("key411");
        Preference pref412 = mock(Preference.class);
        when(pref412.getKey()).thenReturn("key412");
        prefGroup41.addPreference(pref411);
        prefGroup41.addPreference(pref412);

        mTestPrefController.removePreference(prefRoot, "key1");
        verify(prefRoot).removePreference(pref1);

        mTestPrefController.removePreference(prefRoot, "key411");
        verify(prefGroup41).removePreference(pref411);

        mTestPrefController.removePreference(prefRoot, "group41");
        verify(prefGroup4).removePreference(prefGroup41);
        assertThat(mPreference.isVisible()).isFalse();
    }

    private class TestPrefController extends AbstractPreferenceController {
+4 −11
Original line number Diff line number Diff line
@@ -17,14 +17,9 @@
package com.android.settingslib.development;

import static com.google.common.truth.Truth.assertThat;

import static org.mockito.Answers.RETURNS_DEEP_STUBS;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;

import android.content.Context;
@@ -67,21 +62,19 @@ public class EnableAdbPreferenceControllerTest {
        shadowContext.setSystemService(Context.USER_SERVICE, mUserManager);
        mContext = spy(shadowContext.getApplicationContext());
        when(mContext.getPackageManager()).thenReturn(mPackageManager);
        mPreference = new SwitchPreference(mContext);
        when(mScreen.findPreference(anyString())).thenReturn(mPreference);
        mController = new ConcreteEnableAdbPreferenceController(mContext);
        mPreference = new SwitchPreference(mContext);
        mPreference.setKey(mController.getPreferenceKey());
        when(mScreen.findPreference(mPreference.getKey())).thenReturn(mPreference);
    }

    @Test
    public void displayPreference_isNotAdmin_shouldRemovePreference() {
        when(mUserManager.isAdminUser()).thenReturn(false);
        when(mScreen.getPreferenceCount()).thenReturn(1);
        when(mScreen.getPreference(0)).thenReturn(mPreference);

        mController.displayPreference(mScreen);

        verify(mScreen).removePreference(any(Preference.class));
        assertThat(mPreference.isVisible()).isFalse();
    }

    @Test
@@ -90,7 +83,7 @@ public class EnableAdbPreferenceControllerTest {

        mController.displayPreference(mScreen);

        verify(mScreen, never()).removePreference(any(Preference.class));
        assertThat(mPreference.isVisible()).isTrue();
    }


+18 −26
Original line number Diff line number Diff line
@@ -17,13 +17,6 @@
package com.android.settingslib.deviceinfo;

import static com.google.common.truth.Truth.assertThat;

import static org.mockito.Answers.RETURNS_DEEP_STUBS;
import static org.mockito.Matchers.any;
import static org.mockito.Matchers.anyString;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;

import android.content.Context;
@@ -38,68 +31,67 @@ import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.robolectric.RuntimeEnvironment;
import org.robolectric.annotation.Config;

@RunWith(SettingsLibRobolectricTestRunner.class)
@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
public class SerialNumberPreferenceControllerTest {

    @Mock(answer = RETURNS_DEEP_STUBS)
    private Context mContext;
    @Mock(answer = RETURNS_DEEP_STUBS)
    @Mock
    private PreferenceScreen mScreen;

    private Context mContext;
    private Preference mPreference;
    private AbstractSerialNumberPreferenceController mController;

    @Before
    public void setUp() {
        MockitoAnnotations.initMocks(this);
        mContext = RuntimeEnvironment.application;
        mPreference = new Preference(mContext);
        mPreference.setKey(AbstractSerialNumberPreferenceController.KEY_SERIAL_NUMBER);
        when(mScreen.findPreference(mPreference.getKey())).thenReturn(mPreference);
    }

    @Test
    public void testIsAvaiable_noSerial_shouldReturnFalse() {
        mController = new ConcreteSerialNumberPreferenceController(mContext, null);
        mController = new TestPreferenceController(mContext, null);

        assertThat(mController.isAvailable()).isFalse();
    }

    @Test
    public void testIsAvaiable_hasSerial_shouldReturnTrue() {
        mController = new ConcreteSerialNumberPreferenceController(mContext, "123");
    public void testIsAvailable_hasSerial_shouldReturnTrue() {
        mController = new TestPreferenceController(mContext, "123");

        assertThat(mController.isAvailable()).isTrue();
    }

    @Test
    public void testDisplay_noSerial_shouldHidePreference() {
        final Preference preference = mock(Preference.class);
        when(mScreen.getPreferenceCount()).thenReturn(1);
        when(mScreen.getPreference(0)).thenReturn(preference);
        mController = new ConcreteSerialNumberPreferenceController(mContext, null);
        when(preference.getKey()).thenReturn(mController.getPreferenceKey());
        mController = new TestPreferenceController(mContext, null);

        mController.displayPreference(mScreen);

        verify(mScreen).removePreference(any(Preference.class));
        assertThat(mPreference.isVisible()).isFalse();
    }

    @Test
    public void testDisplay_hasSerial_shouldSetSummary() {
        final String serial = "123";
        final Preference preference = mock(Preference.class);
        when(mScreen.findPreference(anyString())).thenReturn(preference);

        mController = new ConcreteSerialNumberPreferenceController(mContext, serial);
        mController = new TestPreferenceController(mContext, serial);
        mController.displayPreference(mScreen);

        verify(mScreen, never()).removePreference(any(Preference.class));
        verify(preference).setSummary(serial);
        assertThat(mPreference.isVisible()).isTrue();
        assertThat(mPreference.getSummary()).isEqualTo(serial);
    }

    private static class ConcreteSerialNumberPreferenceController
    private static class TestPreferenceController
            extends AbstractSerialNumberPreferenceController {

        ConcreteSerialNumberPreferenceController(Context context, String serialNumber) {
        TestPreferenceController(Context context, String serialNumber) {
            super(context, serialNumber);
        }
    }