1f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling/* 2f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling * Copyright (C) 2017 The Android Open Source Project 3f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling * 4f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling * Licensed under the Apache License, Version 2.0 (the "License"); 5f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling * you may not use this file except in compliance with the License. 6f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling * You may obtain a copy of the License at 7f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling * 8f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling * http://www.apache.org/licenses/LICENSE-2.0 9f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling * 10f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling * Unless required by applicable law or agreed to in writing, software 11f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling * distributed under the License is distributed on an "AS IS" BASIS, 12f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling * See the License for the specific language governing permissions and 14f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling * limitations under the License. 15f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling */ 16f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling 17ac5fe7c617c66850fff75a9fce9979c6e5674b0fAurimas Liutikaspackage androidx.preference; 18f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling 19fa39e2bca1b284ad7c931d9194287770b7b507faAurimas Liutikasimport static org.junit.Assert.assertEquals; 20f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Lingimport static org.mockito.Mockito.any; 21f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Lingimport static org.mockito.Mockito.anyLong; 22f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Lingimport static org.mockito.Mockito.doAnswer; 23f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Lingimport static org.mockito.Mockito.never; 24f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Lingimport static org.mockito.Mockito.reset; 25f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Lingimport static org.mockito.Mockito.spy; 26f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Lingimport static org.mockito.Mockito.verify; 27f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling 28f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Lingimport android.content.Context; 29f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Lingimport android.os.Handler; 30f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Lingimport android.os.Message; 31f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Lingimport android.os.Parcelable; 32f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Lingimport android.support.test.InstrumentationRegistry; 33f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Lingimport android.support.test.annotation.UiThreadTest; 34f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Lingimport android.support.test.filters.SmallTest; 35f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Lingimport android.support.test.runner.AndroidJUnit4; 36f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling 37f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Lingimport org.junit.Before; 38f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Lingimport org.junit.Test; 39f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Lingimport org.junit.runner.RunWith; 40f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Lingimport org.mockito.MockitoAnnotations; 41f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Lingimport org.mockito.invocation.InvocationOnMock; 42f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Lingimport org.mockito.stubbing.Answer; 43f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling 44f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Lingimport java.util.ArrayList; 45f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Lingimport java.util.List; 46f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling 47226a42d7fbfb54e2173e6e04f997d32848c4da62Louis Pullen-Freilich/** 48226a42d7fbfb54e2173e6e04f997d32848c4da62Louis Pullen-Freilich * Test for InitialExpandedChildrenCount in {@link androidx.preference.PreferenceGroup}. 49226a42d7fbfb54e2173e6e04f997d32848c4da62Louis Pullen-Freilich */ 50f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling@RunWith(AndroidJUnit4.class) 51f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling@SmallTest 52f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Lingpublic class PreferenceGroupInitialExpandedChildrenCountTest { 53f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling 54f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling private static final int INITIAL_EXPANDED_COUNT = 5; 55f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling private static final int TOTAL_PREFERENCE = 10; 56f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling private static final String PREFERENCE_TITLE_PREFIX = "Preference_"; 57226a42d7fbfb54e2173e6e04f997d32848c4da62Louis Pullen-Freilich private static final String PREFERENCE_KEY = "testing"; 58f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling 59f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling private Context mContext; 60f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling private PreferenceManager mPreferenceManager; 61f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling private PreferenceScreen mScreen; 62f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling private Handler mHandler; 63f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling private List<Preference> mPreferenceList; 64f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling 65f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling @Before 66f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling @UiThreadTest 67226a42d7fbfb54e2173e6e04f997d32848c4da62Louis Pullen-Freilich public void setup() { 68f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling MockitoAnnotations.initMocks(this); 69f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling mContext = InstrumentationRegistry.getTargetContext(); 70f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling mPreferenceManager = new PreferenceManager(mContext); 71f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling mScreen = mPreferenceManager.createPreferenceScreen(mContext); 72226a42d7fbfb54e2173e6e04f997d32848c4da62Louis Pullen-Freilich mScreen.setKey(PREFERENCE_KEY); 73f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling 74f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling // Add 10 preferences to the screen and to the cache 75f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling mPreferenceList = new ArrayList<>(); 76f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling createTestPreferences(mScreen, mPreferenceList, TOTAL_PREFERENCE); 77f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling 78f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling // Execute the handler task immediately 79f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling mHandler = spy(new Handler()); 80f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling doAnswer(new Answer<Void>() { 81f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling @Override 82226a42d7fbfb54e2173e6e04f997d32848c4da62Louis Pullen-Freilich public Void answer(InvocationOnMock invocation) { 83f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling Object[] args = invocation.getArguments(); 84f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling Message message = (Message) args[0]; 85f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling mHandler.dispatchMessage(message); 86f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling return null; 87f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling } 88f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling }).when(mHandler).sendMessageDelayed(any(Message.class), anyLong()); 89f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling } 90f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling 91f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling /** 92f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling * Verifies that PreferenceGroupAdapter is showing the preferences on the screen correctly with 93f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling * and without the collapsed child count set. 94f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling */ 95f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling @Test 96f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling @UiThreadTest 97f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling public void createPreferenceGroupAdapter_displayTopLevelPreferences() { 98f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling // No limit, should display all 10 preferences 99f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling PreferenceGroupAdapter preferenceGroupAdapter = new PreferenceGroupAdapter(mScreen); 100f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling assertPreferencesAreExpanded(preferenceGroupAdapter); 101f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling 102f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling // Limit > child count, should display all 10 preferences 103f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling mScreen.setInitialExpandedChildrenCount(TOTAL_PREFERENCE + 4); 104f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling preferenceGroupAdapter = new PreferenceGroupAdapter(mScreen); 105f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling assertPreferencesAreExpanded(preferenceGroupAdapter); 106f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling 107f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling // Limit = child count, should display all 10 preferences 108f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling mScreen.setInitialExpandedChildrenCount(TOTAL_PREFERENCE); 109f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling preferenceGroupAdapter = new PreferenceGroupAdapter(mScreen); 110f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling assertPreferencesAreExpanded(preferenceGroupAdapter); 111f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling 112f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling // Limit < child count, should display up to the limit + expand button 113f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling mScreen.setInitialExpandedChildrenCount(INITIAL_EXPANDED_COUNT); 114f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling preferenceGroupAdapter = new PreferenceGroupAdapter(mScreen); 115f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling assertPreferencesAreCollapsed(preferenceGroupAdapter); 116f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling for (int i = 0; i < INITIAL_EXPANDED_COUNT; i++) { 117f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling assertEquals(mPreferenceList.get(i), preferenceGroupAdapter.getItem(i)); 118f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling } 119f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling assertEquals(CollapsiblePreferenceGroupController.ExpandButton.class, 120f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling preferenceGroupAdapter.getItem(INITIAL_EXPANDED_COUNT).getClass()); 121f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling } 122f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling 123f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling /** 124f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling * Verifies that PreferenceGroupAdapter is showing nested preferences on the screen correctly 125f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling * with and without the collapsed child count set. 126f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling */ 127f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling @Test 128f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling @UiThreadTest 129f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling public void createPreferenceGroupAdapter_displayNestedPreferences() { 130f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling final PreferenceScreen screen = mPreferenceManager.createPreferenceScreen(mContext); 131226a42d7fbfb54e2173e6e04f997d32848c4da62Louis Pullen-Freilich screen.setKey(PREFERENCE_KEY); 132f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling final List<Preference> preferenceList = new ArrayList<>(); 133f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling 134f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling // Add 2 preferences and 2 categories to screen 135f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling createTestPreferences(screen, preferenceList, 2); 136f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling createTestPreferencesCategory(screen, preferenceList, 4); 137f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling createTestPreferencesCategory(screen, preferenceList, 4); 138f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling 139f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling // No limit, should display all 10 preferences + 2 categories 140f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling PreferenceGroupAdapter preferenceGroupAdapter = new PreferenceGroupAdapter(screen); 141f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling assertEquals(TOTAL_PREFERENCE + 2, preferenceGroupAdapter.getItemCount()); 142f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling 143f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling // Limit > child count, should display all 10 preferences + 2 categories 144f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling screen.setInitialExpandedChildrenCount(TOTAL_PREFERENCE + 4); 145f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling preferenceGroupAdapter = new PreferenceGroupAdapter(screen); 146f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling assertEquals(TOTAL_PREFERENCE + 2, preferenceGroupAdapter.getItemCount()); 147f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling 148f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling // Limit = child count, should display all 10 preferences + 2 categories 149f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling screen.setInitialExpandedChildrenCount(TOTAL_PREFERENCE); 150f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling preferenceGroupAdapter = new PreferenceGroupAdapter(screen); 151f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling assertEquals(TOTAL_PREFERENCE + 2, preferenceGroupAdapter.getItemCount()); 152f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling 153f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling // Limit < child count, should display 2 preferences and the first 3 preference in the 154f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling // category + expand button 155f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling screen.setInitialExpandedChildrenCount(INITIAL_EXPANDED_COUNT); 156f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling preferenceGroupAdapter = new PreferenceGroupAdapter(screen); 157f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling assertEquals(INITIAL_EXPANDED_COUNT + 2, preferenceGroupAdapter.getItemCount()); 158f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling for (int i = 0; i <= INITIAL_EXPANDED_COUNT; i++) { 159f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling assertEquals(preferenceList.get(i), preferenceGroupAdapter.getItem(i)); 160f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling } 161f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling assertEquals(CollapsiblePreferenceGroupController.ExpandButton.class, 162f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling preferenceGroupAdapter.getItem(INITIAL_EXPANDED_COUNT + 1).getClass()); 163f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling } 164f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling 165f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling /** 166f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling * Verifies that correct summary is set for the expand button. 167f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling */ 168f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling @Test 169f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling @UiThreadTest 170f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling public void createPreferenceGroupAdapter_setExpandButtonSummary() { 171f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling mScreen.setInitialExpandedChildrenCount(INITIAL_EXPANDED_COUNT); 172f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling PreferenceGroupAdapter preferenceGroupAdapter = new PreferenceGroupAdapter(mScreen); 173f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling // Preference 5 to Preference 9 are collapsed 174f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling CharSequence summary = mPreferenceList.get(INITIAL_EXPANDED_COUNT).getTitle(); 175f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling for (int i = INITIAL_EXPANDED_COUNT + 1; i < TOTAL_PREFERENCE; i++) { 176f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling summary = mContext.getString(R.string.summary_collapsed_preference_list, 177f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling summary, mPreferenceList.get(i).getTitle()); 178f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling } 179f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling final Preference expandButton = preferenceGroupAdapter.getItem(INITIAL_EXPANDED_COUNT); 180f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling assertEquals(summary, expandButton.getSummary()); 181f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling } 182f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling 183f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling /** 1844af60aaa5e9f5375373e40669bd4d20ac9ebf80fDoris Ling * Verifies that summary for the expand button only lists visible preferences. 1854af60aaa5e9f5375373e40669bd4d20ac9ebf80fDoris Ling */ 1864af60aaa5e9f5375373e40669bd4d20ac9ebf80fDoris Ling @Test 1874af60aaa5e9f5375373e40669bd4d20ac9ebf80fDoris Ling @UiThreadTest 1884af60aaa5e9f5375373e40669bd4d20ac9ebf80fDoris Ling public void createPreferenceGroupAdapter_expandButtonSummaryShouldListVisiblePreferencesOnly() { 1894af60aaa5e9f5375373e40669bd4d20ac9ebf80fDoris Ling mScreen.setInitialExpandedChildrenCount(INITIAL_EXPANDED_COUNT); 1904af60aaa5e9f5375373e40669bd4d20ac9ebf80fDoris Ling mPreferenceList.get(INITIAL_EXPANDED_COUNT + 1).setVisible(false); 1914af60aaa5e9f5375373e40669bd4d20ac9ebf80fDoris Ling mPreferenceList.get(INITIAL_EXPANDED_COUNT + 4).setVisible(false); 1924af60aaa5e9f5375373e40669bd4d20ac9ebf80fDoris Ling PreferenceGroupAdapter preferenceGroupAdapter = new PreferenceGroupAdapter(mScreen); 1934af60aaa5e9f5375373e40669bd4d20ac9ebf80fDoris Ling // Preference 5 to Preference 9 are collapsed, only preferences 5, 7, 8 are visible 1944af60aaa5e9f5375373e40669bd4d20ac9ebf80fDoris Ling CharSequence summary = mPreferenceList.get(INITIAL_EXPANDED_COUNT).getTitle(); 1954af60aaa5e9f5375373e40669bd4d20ac9ebf80fDoris Ling summary = mContext.getString(R.string.summary_collapsed_preference_list, 1964af60aaa5e9f5375373e40669bd4d20ac9ebf80fDoris Ling summary, mPreferenceList.get(INITIAL_EXPANDED_COUNT + 2).getTitle()); 1974af60aaa5e9f5375373e40669bd4d20ac9ebf80fDoris Ling summary = mContext.getString(R.string.summary_collapsed_preference_list, 1984af60aaa5e9f5375373e40669bd4d20ac9ebf80fDoris Ling summary, mPreferenceList.get(INITIAL_EXPANDED_COUNT + 3).getTitle()); 1994af60aaa5e9f5375373e40669bd4d20ac9ebf80fDoris Ling final Preference expandButton = preferenceGroupAdapter.getItem(INITIAL_EXPANDED_COUNT); 2004af60aaa5e9f5375373e40669bd4d20ac9ebf80fDoris Ling assertEquals(summary, expandButton.getSummary()); 2014af60aaa5e9f5375373e40669bd4d20ac9ebf80fDoris Ling } 2024af60aaa5e9f5375373e40669bd4d20ac9ebf80fDoris Ling 2034af60aaa5e9f5375373e40669bd4d20ac9ebf80fDoris Ling /** 204f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling * Verifies that clicking the expand button will show all preferences. 205f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling */ 206f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling @Test 207f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling @UiThreadTest 208f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling public void clickExpandButton_shouldShowAllPreferences() { 209f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling mScreen.setInitialExpandedChildrenCount(INITIAL_EXPANDED_COUNT); 210f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling 211f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling // First showing 5 preference with expand button 212f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling PreferenceGroupAdapter preferenceGroupAdapter = 213f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling PreferenceGroupAdapter.createInstanceWithCustomHandler(mScreen, mHandler); 214f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling assertPreferencesAreCollapsed(preferenceGroupAdapter); 215f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling 216f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling // Click the expand button, should review all preferences 217f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling final Preference expandButton = preferenceGroupAdapter.getItem(INITIAL_EXPANDED_COUNT); 218f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling expandButton.performClick(); 219f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling assertPreferencesAreExpanded(preferenceGroupAdapter); 220f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling } 221f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling 222f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling /** 223f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling * Verifies that when preference visibility changes, it will sync the preferences only if some 224f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling * preferences are collapsed. 225f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling */ 226f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling @Test 227f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling @UiThreadTest 228f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling public void onPreferenceVisibilityChange_shouldSyncPreferencesIfCollapsed() { 229f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling // No limit set, should not sync preference 230f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling PreferenceGroupAdapter preferenceGroupAdapter = 231f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling PreferenceGroupAdapter.createInstanceWithCustomHandler(mScreen, mHandler); 232f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling preferenceGroupAdapter.onPreferenceVisibilityChange(mPreferenceList.get(3)); 233f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling verify(mHandler, never()).sendMessageDelayed(any(Message.class), anyLong()); 234f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling 235f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling // Has limit set, should sync preference 236f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling mScreen.setInitialExpandedChildrenCount(INITIAL_EXPANDED_COUNT); 237f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling preferenceGroupAdapter = 238f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling PreferenceGroupAdapter.createInstanceWithCustomHandler(mScreen, mHandler); 239f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling preferenceGroupAdapter.onPreferenceVisibilityChange(mPreferenceList.get(3)); 240f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling verify(mHandler).sendMessageDelayed(any(Message.class), anyLong()); 241f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling 242f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling // Preferences expanded already, should not sync preference 243f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling final Preference expandButton = preferenceGroupAdapter.getItem(INITIAL_EXPANDED_COUNT); 244f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling expandButton.performClick(); 245f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling reset(mHandler); 246f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling preferenceGroupAdapter.onPreferenceVisibilityChange(mPreferenceList.get(3)); 247f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling verify(mHandler, never()).sendMessageDelayed(any(Message.class), anyLong()); 248f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling } 249f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling 250f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling /** 251f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling * Verifies that the correct maximum number of preferences to show is being saved in the 252f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling * instance state. 253f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling */ 254f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling @Test 255f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling @UiThreadTest 256f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling public void saveInstanceState_shouldSaveMaxNumberOfChildrenToShow() { 257f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling // No limit set, should save max value 258f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling Parcelable state = mScreen.onSaveInstanceState(); 259226a42d7fbfb54e2173e6e04f997d32848c4da62Louis Pullen-Freilich assertEquals(PreferenceGroup.SavedState.class, state.getClass()); 260f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling assertEquals(Integer.MAX_VALUE, 261226a42d7fbfb54e2173e6e04f997d32848c4da62Louis Pullen-Freilich ((PreferenceGroup.SavedState) state).mInitialExpandedChildrenCount); 262f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling 263f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling // Has limit set, should save limit 264f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling mScreen.setInitialExpandedChildrenCount(INITIAL_EXPANDED_COUNT); 265f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling state = mScreen.onSaveInstanceState(); 266226a42d7fbfb54e2173e6e04f997d32848c4da62Louis Pullen-Freilich assertEquals(PreferenceGroup.SavedState.class, state.getClass()); 267f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling assertEquals(INITIAL_EXPANDED_COUNT, 268226a42d7fbfb54e2173e6e04f997d32848c4da62Louis Pullen-Freilich ((PreferenceGroup.SavedState) state).mInitialExpandedChildrenCount); 269f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling } 270f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling 271f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling /** 272f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling * Verifies that if we restore to the same number of preferences to show, it will not update 273f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling * anything. 274f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling */ 275f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling @Test 276f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling @UiThreadTest 277f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling public void restoreInstanceState_noChange_shouldDoNothing() { 278226a42d7fbfb54e2173e6e04f997d32848c4da62Louis Pullen-Freilich PreferenceGroup.SavedState state; 279f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling 280f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling // Initialized as expanded, restore as expanded, should remain expanded 281226a42d7fbfb54e2173e6e04f997d32848c4da62Louis Pullen-Freilich state = new PreferenceGroup.SavedState( 282226a42d7fbfb54e2173e6e04f997d32848c4da62Louis Pullen-Freilich Preference.BaseSavedState.EMPTY_STATE, Integer.MAX_VALUE); 283226a42d7fbfb54e2173e6e04f997d32848c4da62Louis Pullen-Freilich PreferenceGroupAdapter preferenceGroupAdapter = 284f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling PreferenceGroupAdapter.createInstanceWithCustomHandler(mScreen, mHandler); 285f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling mScreen.onRestoreInstanceState(state); 286f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling assertPreferencesAreExpanded(preferenceGroupAdapter); 287f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling verify(mHandler, never()).sendMessageDelayed(any(Message.class), anyLong()); 288f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling 289f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling // Initialized as collapsed, restore as collapsed, should remain collapsed 290f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling mScreen.setInitialExpandedChildrenCount(INITIAL_EXPANDED_COUNT); 291226a42d7fbfb54e2173e6e04f997d32848c4da62Louis Pullen-Freilich state = new PreferenceGroup.SavedState( 292226a42d7fbfb54e2173e6e04f997d32848c4da62Louis Pullen-Freilich Preference.BaseSavedState.EMPTY_STATE, INITIAL_EXPANDED_COUNT); 293f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling preferenceGroupAdapter = 294f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling PreferenceGroupAdapter.createInstanceWithCustomHandler(mScreen, mHandler); 295f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling mScreen.onRestoreInstanceState(state); 296f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling assertPreferencesAreCollapsed(preferenceGroupAdapter); 297f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling verify(mHandler, never()).sendMessageDelayed(any(Message.class), anyLong()); 298f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling } 299f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling 300f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling /** 301f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling * Verifies that if the children is collapsed previously, they should be collapsed after the 302f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling * state is being restored. 303f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling */ 304f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling @Test 305f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling @UiThreadTest 306f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling public void restoreHierarchyState_previouslyCollapsed_shouldRestoreToCollapsedState() { 307226a42d7fbfb54e2173e6e04f997d32848c4da62Louis Pullen-Freilich PreferenceGroup.SavedState state = 308226a42d7fbfb54e2173e6e04f997d32848c4da62Louis Pullen-Freilich new PreferenceGroup.SavedState( 309226a42d7fbfb54e2173e6e04f997d32848c4da62Louis Pullen-Freilich Preference.BaseSavedState.EMPTY_STATE, Integer.MAX_VALUE); 310f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling // Initialized as expanded, restore as collapsed, should collapse 311226a42d7fbfb54e2173e6e04f997d32848c4da62Louis Pullen-Freilich state.mInitialExpandedChildrenCount = INITIAL_EXPANDED_COUNT; 312f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling mScreen.setInitialExpandedChildrenCount(Integer.MAX_VALUE); 313f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling PreferenceGroupAdapter preferenceGroupAdapter = 314f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling PreferenceGroupAdapter.createInstanceWithCustomHandler(mScreen, mHandler); 315f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling mScreen.onRestoreInstanceState(state); 316f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling verify(mHandler).sendMessageDelayed(any(Message.class), anyLong()); 317f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling assertPreferencesAreCollapsed(preferenceGroupAdapter); 318f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling } 319f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling 320f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling /** 321f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling * Verifies that if the children is expanded previously, they should be expanded after the 322f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling * state is being restored. 323f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling */ 324f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling @Test 325f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling @UiThreadTest 326f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling public void restoreHierarchyState_previouslyExpanded_shouldRestoreToExpandedState() { 327226a42d7fbfb54e2173e6e04f997d32848c4da62Louis Pullen-Freilich PreferenceGroup.SavedState state = 328226a42d7fbfb54e2173e6e04f997d32848c4da62Louis Pullen-Freilich new PreferenceGroup.SavedState( 329226a42d7fbfb54e2173e6e04f997d32848c4da62Louis Pullen-Freilich Preference.BaseSavedState.EMPTY_STATE, Integer.MAX_VALUE); 330f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling // Initialized as collapsed, restore as expanded, should expand 331226a42d7fbfb54e2173e6e04f997d32848c4da62Louis Pullen-Freilich state.mInitialExpandedChildrenCount = Integer.MAX_VALUE; 332f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling mScreen.setInitialExpandedChildrenCount(INITIAL_EXPANDED_COUNT); 333f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling PreferenceGroupAdapter preferenceGroupAdapter = 334f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling PreferenceGroupAdapter.createInstanceWithCustomHandler(mScreen, mHandler); 335f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling mScreen.onRestoreInstanceState(state); 336f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling verify(mHandler).sendMessageDelayed(any(Message.class), anyLong()); 337f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling assertPreferencesAreExpanded(preferenceGroupAdapter); 338f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling } 339f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling 340f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling // assert that the preferences are all expanded 341f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling private void assertPreferencesAreExpanded(PreferenceGroupAdapter adapter) { 342f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling assertEquals(TOTAL_PREFERENCE, adapter.getItemCount()); 343f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling } 344f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling 345f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling // assert that the preferences exceeding the limit are collapsed 346f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling private void assertPreferencesAreCollapsed(PreferenceGroupAdapter adapter) { 347f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling // list shows preferences up to the limit and the expand button 348f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling assertEquals(INITIAL_EXPANDED_COUNT + 1, adapter.getItemCount()); 349f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling } 350f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling 351f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling // create the number of preference in the corresponding preference group and add it to the cache 352f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling private void createTestPreferences(PreferenceGroup preferenceGroup, 353f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling List<Preference> preferenceList, int numPreference) { 354f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling for (int i = 0; i < numPreference; i++) { 355f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling final Preference preference = new Preference(mContext); 356f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling preference.setTitle(PREFERENCE_TITLE_PREFIX + i); 357f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling preferenceGroup.addPreference(preference); 358f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling preferenceList.add(preference); 359f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling } 360f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling } 361f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling 362f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling // add a preference category and add the number of preference to it and the cache 363f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling private void createTestPreferencesCategory(PreferenceGroup preferenceGroup, 364f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling List<Preference> preferenceList, int numPreference) { 365f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling PreferenceCategory category = new PreferenceCategory(mContext); 366f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling preferenceGroup.addPreference(category); 367f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling preferenceList.add(category); 368f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling createTestPreferences(category, preferenceList, numPreference); 369f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling } 370f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling 371f42206d6b02fd928b1975f9a6f0b380abcc864d0Doris Ling} 372