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