14136d902bf983b3efba04d1ffde8559f2dc63c6bFan Zhang/*
24136d902bf983b3efba04d1ffde8559f2dc63c6bFan Zhang * Copyright (C) 2016 The Android Open Source Project
34136d902bf983b3efba04d1ffde8559f2dc63c6bFan Zhang *
44136d902bf983b3efba04d1ffde8559f2dc63c6bFan Zhang * Licensed under the Apache License, Version 2.0 (the "License");
54136d902bf983b3efba04d1ffde8559f2dc63c6bFan Zhang * you may not use this file except in compliance with the License.
64136d902bf983b3efba04d1ffde8559f2dc63c6bFan Zhang * You may obtain a copy of the License at
74136d902bf983b3efba04d1ffde8559f2dc63c6bFan Zhang *
84136d902bf983b3efba04d1ffde8559f2dc63c6bFan Zhang *      http://www.apache.org/licenses/LICENSE-2.0
94136d902bf983b3efba04d1ffde8559f2dc63c6bFan Zhang *
104136d902bf983b3efba04d1ffde8559f2dc63c6bFan Zhang * Unless required by applicable law or agreed to in writing, software
114136d902bf983b3efba04d1ffde8559f2dc63c6bFan Zhang * distributed under the License is distributed on an "AS IS" BASIS,
124136d902bf983b3efba04d1ffde8559f2dc63c6bFan Zhang * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
134136d902bf983b3efba04d1ffde8559f2dc63c6bFan Zhang * See the License for the specific language governing permissions and
144136d902bf983b3efba04d1ffde8559f2dc63c6bFan Zhang * limitations under the License.
154136d902bf983b3efba04d1ffde8559f2dc63c6bFan Zhang */
164136d902bf983b3efba04d1ffde8559f2dc63c6bFan Zhang
174136d902bf983b3efba04d1ffde8559f2dc63c6bFan Zhangpackage com.android.settings.applications;
184136d902bf983b3efba04d1ffde8559f2dc63c6bFan Zhang
192ea67003364d8f4a79d6afd624d56709839151eeFan Zhangimport static com.google.common.truth.Truth.assertThat;
202ea67003364d8f4a79d6afd624d56709839151eeFan Zhangimport static org.mockito.Matchers.anyInt;
212ea67003364d8f4a79d6afd624d56709839151eeFan Zhangimport static org.mockito.Matchers.anyString;
222ea67003364d8f4a79d6afd624d56709839151eeFan Zhangimport static org.mockito.Matchers.eq;
232ea67003364d8f4a79d6afd624d56709839151eeFan Zhangimport static org.mockito.Mockito.RETURNS_DEEP_STUBS;
242ea67003364d8f4a79d6afd624d56709839151eeFan Zhangimport static org.mockito.Mockito.mock;
252ea67003364d8f4a79d6afd624d56709839151eeFan Zhangimport static org.mockito.Mockito.never;
262ea67003364d8f4a79d6afd624d56709839151eeFan Zhangimport static org.mockito.Mockito.spy;
272ea67003364d8f4a79d6afd624d56709839151eeFan Zhangimport static org.mockito.Mockito.verify;
282ea67003364d8f4a79d6afd624d56709839151eeFan Zhangimport static org.mockito.Mockito.when;
292ea67003364d8f4a79d6afd624d56709839151eeFan Zhang
304136d902bf983b3efba04d1ffde8559f2dc63c6bFan Zhangimport android.content.Context;
31c62808a5a30e51c19a0aa4cf47d5b82cd3647a98Fan Zhangimport android.content.pm.PackageManager;
32c62808a5a30e51c19a0aa4cf47d5b82cd3647a98Fan Zhangimport android.os.UserManager;
33c62808a5a30e51c19a0aa4cf47d5b82cd3647a98Fan Zhangimport android.telephony.TelephonyManager;
344136d902bf983b3efba04d1ffde8559f2dc63c6bFan Zhang
354136d902bf983b3efba04d1ffde8559f2dc63c6bFan Zhangimport com.android.settings.R;
36d007ff9395e93c9630388262e29e0f1d7a7ab735Doris Lingimport com.android.settings.applications.defaultapps.DefaultBrowserPreferenceController;
37d007ff9395e93c9630388262e29e0f1d7a7ab735Doris Lingimport com.android.settings.applications.defaultapps.DefaultPhonePreferenceController;
38d007ff9395e93c9630388262e29e0f1d7a7ab735Doris Lingimport com.android.settings.applications.defaultapps.DefaultSmsPreferenceController;
39d007ff9395e93c9630388262e29e0f1d7a7ab735Doris Lingimport com.android.settings.dashboard.SummaryLoader;
402ea67003364d8f4a79d6afd624d56709839151eeFan Zhangimport com.android.settings.testutils.SettingsRobolectricTestRunner;
414d9a1ae9a25d03d1d2d0f31871b43b0e54630d92Matthew Fritzeimport com.android.settings.testutils.XmlTestUtils;
42c62808a5a30e51c19a0aa4cf47d5b82cd3647a98Fan Zhang
434136d902bf983b3efba04d1ffde8559f2dc63c6bFan Zhangimport org.junit.Before;
444136d902bf983b3efba04d1ffde8559f2dc63c6bFan Zhangimport org.junit.Test;
454136d902bf983b3efba04d1ffde8559f2dc63c6bFan Zhangimport org.junit.runner.RunWith;
464136d902bf983b3efba04d1ffde8559f2dc63c6bFan Zhangimport org.mockito.MockitoAnnotations;
47d007ff9395e93c9630388262e29e0f1d7a7ab735Doris Lingimport org.robolectric.RuntimeEnvironment;
48d007ff9395e93c9630388262e29e0f1d7a7ab735Doris Lingimport org.robolectric.util.ReflectionHelpers;
494136d902bf983b3efba04d1ffde8559f2dc63c6bFan Zhang
504d9a1ae9a25d03d1d2d0f31871b43b0e54630d92Matthew Fritzeimport java.util.List;
514d9a1ae9a25d03d1d2d0f31871b43b0e54630d92Matthew Fritze
52c9536b8e4124e616f4cf9b2396b000a5355bf333Fan Zhang@RunWith(SettingsRobolectricTestRunner.class)
532ea67003364d8f4a79d6afd624d56709839151eeFan Zhangpublic class DefaultAppSettingsTest {
544136d902bf983b3efba04d1ffde8559f2dc63c6bFan Zhang
554136d902bf983b3efba04d1ffde8559f2dc63c6bFan Zhang    private Context mContext;
564136d902bf983b3efba04d1ffde8559f2dc63c6bFan Zhang
572ea67003364d8f4a79d6afd624d56709839151eeFan Zhang    private DefaultAppSettings mFragment;
584136d902bf983b3efba04d1ffde8559f2dc63c6bFan Zhang
594136d902bf983b3efba04d1ffde8559f2dc63c6bFan Zhang    @Before
604136d902bf983b3efba04d1ffde8559f2dc63c6bFan Zhang    public void setUp() {
614136d902bf983b3efba04d1ffde8559f2dc63c6bFan Zhang        MockitoAnnotations.initMocks(this);
62d007ff9395e93c9630388262e29e0f1d7a7ab735Doris Ling        mContext = RuntimeEnvironment.application;
632ea67003364d8f4a79d6afd624d56709839151eeFan Zhang        mFragment = new DefaultAppSettings();
64d007ff9395e93c9630388262e29e0f1d7a7ab735Doris Ling        mFragment.onAttach(mContext);
654136d902bf983b3efba04d1ffde8559f2dc63c6bFan Zhang    }
664136d902bf983b3efba04d1ffde8559f2dc63c6bFan Zhang
674136d902bf983b3efba04d1ffde8559f2dc63c6bFan Zhang    @Test
6835692cf439fe1067ea742174033f5748a08a5d66Fan Zhang    public void getPreferenceScreenResId_shouldUseAppDefaultSettingPrefLayout() {
6922a39c2b93bc66db71238274a7683d329232d124James Lemieux        assertThat(mFragment.getPreferenceScreenResId()).isEqualTo(R.xml.app_default_settings);
704136d902bf983b3efba04d1ffde8559f2dc63c6bFan Zhang    }
714136d902bf983b3efba04d1ffde8559f2dc63c6bFan Zhang
72d007ff9395e93c9630388262e29e0f1d7a7ab735Doris Ling    @Test
73d007ff9395e93c9630388262e29e0f1d7a7ab735Doris Ling    public void setListening_shouldUpdateSummary() {
74d007ff9395e93c9630388262e29e0f1d7a7ab735Doris Ling        final SummaryLoader summaryLoader = mock(SummaryLoader.class);
752ea67003364d8f4a79d6afd624d56709839151eeFan Zhang        final DefaultAppSettings.SummaryProvider summaryProvider =
762ea67003364d8f4a79d6afd624d56709839151eeFan Zhang                new DefaultAppSettings.SummaryProvider(mContext, summaryLoader);
77d007ff9395e93c9630388262e29e0f1d7a7ab735Doris Ling        final DefaultSmsPreferenceController defaultSms =
78c62808a5a30e51c19a0aa4cf47d5b82cd3647a98Fan Zhang                mock(DefaultSmsPreferenceController.class);
79d007ff9395e93c9630388262e29e0f1d7a7ab735Doris Ling        final DefaultBrowserPreferenceController defaultBrowser =
80c62808a5a30e51c19a0aa4cf47d5b82cd3647a98Fan Zhang                mock(DefaultBrowserPreferenceController.class);
81d007ff9395e93c9630388262e29e0f1d7a7ab735Doris Ling        final DefaultPhonePreferenceController defaultPhone =
82c62808a5a30e51c19a0aa4cf47d5b82cd3647a98Fan Zhang                mock(DefaultPhonePreferenceController.class);
83d007ff9395e93c9630388262e29e0f1d7a7ab735Doris Ling        ReflectionHelpers.setField(summaryProvider, "mDefaultSmsPreferenceController", defaultSms);
84d007ff9395e93c9630388262e29e0f1d7a7ab735Doris Ling        ReflectionHelpers.setField(
85c62808a5a30e51c19a0aa4cf47d5b82cd3647a98Fan Zhang                summaryProvider, "mDefaultBrowserPreferenceController", defaultBrowser);
86d007ff9395e93c9630388262e29e0f1d7a7ab735Doris Ling        ReflectionHelpers.setField(
87c62808a5a30e51c19a0aa4cf47d5b82cd3647a98Fan Zhang                summaryProvider, "mDefaultPhonePreferenceController", defaultPhone);
88d007ff9395e93c9630388262e29e0f1d7a7ab735Doris Ling
89d007ff9395e93c9630388262e29e0f1d7a7ab735Doris Ling        // all available
90d007ff9395e93c9630388262e29e0f1d7a7ab735Doris Ling        when(defaultSms.getDefaultAppLabel()).thenReturn("Sms1");
91d007ff9395e93c9630388262e29e0f1d7a7ab735Doris Ling        when(defaultBrowser.getDefaultAppLabel()).thenReturn("Browser1");
92d007ff9395e93c9630388262e29e0f1d7a7ab735Doris Ling        when(defaultPhone.getDefaultAppLabel()).thenReturn("Phone1");
93d007ff9395e93c9630388262e29e0f1d7a7ab735Doris Ling        summaryProvider.setListening(true);
9411e91230367bd5dabcbf62b76d4596643c830144Fan Zhang        verify(summaryLoader).setSummary(summaryProvider, "Browser1, Phone1, Sms1");
95d007ff9395e93c9630388262e29e0f1d7a7ab735Doris Ling
96d007ff9395e93c9630388262e29e0f1d7a7ab735Doris Ling        // 2 available
97d007ff9395e93c9630388262e29e0f1d7a7ab735Doris Ling        when(defaultSms.getDefaultAppLabel()).thenReturn(null);
98d007ff9395e93c9630388262e29e0f1d7a7ab735Doris Ling        when(defaultBrowser.getDefaultAppLabel()).thenReturn("Browser1");
99d007ff9395e93c9630388262e29e0f1d7a7ab735Doris Ling        when(defaultPhone.getDefaultAppLabel()).thenReturn("Phone1");
100d007ff9395e93c9630388262e29e0f1d7a7ab735Doris Ling        summaryProvider.setListening(true);
101d007ff9395e93c9630388262e29e0f1d7a7ab735Doris Ling        verify(summaryLoader).setSummary(summaryProvider, "Browser1, Phone1");
102d007ff9395e93c9630388262e29e0f1d7a7ab735Doris Ling
103d007ff9395e93c9630388262e29e0f1d7a7ab735Doris Ling        when(defaultSms.getDefaultAppLabel()).thenReturn("Sms1");
104d007ff9395e93c9630388262e29e0f1d7a7ab735Doris Ling        when(defaultBrowser.getDefaultAppLabel()).thenReturn(null);
105d007ff9395e93c9630388262e29e0f1d7a7ab735Doris Ling        when(defaultPhone.getDefaultAppLabel()).thenReturn("Phone1");
106d007ff9395e93c9630388262e29e0f1d7a7ab735Doris Ling        summaryProvider.setListening(true);
10711e91230367bd5dabcbf62b76d4596643c830144Fan Zhang        verify(summaryLoader).setSummary(summaryProvider, "Phone1, Sms1");
108d007ff9395e93c9630388262e29e0f1d7a7ab735Doris Ling
109d007ff9395e93c9630388262e29e0f1d7a7ab735Doris Ling        when(defaultSms.getDefaultAppLabel()).thenReturn("Sms1");
110d007ff9395e93c9630388262e29e0f1d7a7ab735Doris Ling        when(defaultBrowser.getDefaultAppLabel()).thenReturn("Browser1");
111d007ff9395e93c9630388262e29e0f1d7a7ab735Doris Ling        when(defaultPhone.getDefaultAppLabel()).thenReturn(null);
112d007ff9395e93c9630388262e29e0f1d7a7ab735Doris Ling        summaryProvider.setListening(true);
11311e91230367bd5dabcbf62b76d4596643c830144Fan Zhang        verify(summaryLoader).setSummary(summaryProvider, "Phone1, Sms1");
114d007ff9395e93c9630388262e29e0f1d7a7ab735Doris Ling
115d007ff9395e93c9630388262e29e0f1d7a7ab735Doris Ling        // 1 available
116d007ff9395e93c9630388262e29e0f1d7a7ab735Doris Ling        when(defaultSms.getDefaultAppLabel()).thenReturn(null);
117d007ff9395e93c9630388262e29e0f1d7a7ab735Doris Ling        when(defaultBrowser.getDefaultAppLabel()).thenReturn("Browser1");
118d007ff9395e93c9630388262e29e0f1d7a7ab735Doris Ling        when(defaultPhone.getDefaultAppLabel()).thenReturn(null);
119d007ff9395e93c9630388262e29e0f1d7a7ab735Doris Ling        summaryProvider.setListening(true);
120d007ff9395e93c9630388262e29e0f1d7a7ab735Doris Ling        verify(summaryLoader).setSummary(summaryProvider, "Browser1");
121d007ff9395e93c9630388262e29e0f1d7a7ab735Doris Ling
122d007ff9395e93c9630388262e29e0f1d7a7ab735Doris Ling        when(defaultSms.getDefaultAppLabel()).thenReturn("Sms1");
123d007ff9395e93c9630388262e29e0f1d7a7ab735Doris Ling        when(defaultBrowser.getDefaultAppLabel()).thenReturn(null);
124d007ff9395e93c9630388262e29e0f1d7a7ab735Doris Ling        when(defaultPhone.getDefaultAppLabel()).thenReturn(null);
125d007ff9395e93c9630388262e29e0f1d7a7ab735Doris Ling        summaryProvider.setListening(true);
126d007ff9395e93c9630388262e29e0f1d7a7ab735Doris Ling        verify(summaryLoader).setSummary(summaryProvider, "Sms1");
127d007ff9395e93c9630388262e29e0f1d7a7ab735Doris Ling
128d007ff9395e93c9630388262e29e0f1d7a7ab735Doris Ling        when(defaultSms.getDefaultAppLabel()).thenReturn(null);
129d007ff9395e93c9630388262e29e0f1d7a7ab735Doris Ling        when(defaultBrowser.getDefaultAppLabel()).thenReturn(null);
130d007ff9395e93c9630388262e29e0f1d7a7ab735Doris Ling        when(defaultPhone.getDefaultAppLabel()).thenReturn("Phone1");
131d007ff9395e93c9630388262e29e0f1d7a7ab735Doris Ling        summaryProvider.setListening(true);
132d007ff9395e93c9630388262e29e0f1d7a7ab735Doris Ling        verify(summaryLoader).setSummary(summaryProvider, "Phone1");
133d007ff9395e93c9630388262e29e0f1d7a7ab735Doris Ling
134d007ff9395e93c9630388262e29e0f1d7a7ab735Doris Ling        // None available
135d007ff9395e93c9630388262e29e0f1d7a7ab735Doris Ling        when(defaultSms.getDefaultAppLabel()).thenReturn(null);
136d007ff9395e93c9630388262e29e0f1d7a7ab735Doris Ling        when(defaultBrowser.getDefaultAppLabel()).thenReturn(null);
137d007ff9395e93c9630388262e29e0f1d7a7ab735Doris Ling        when(defaultPhone.getDefaultAppLabel()).thenReturn(null);
138d007ff9395e93c9630388262e29e0f1d7a7ab735Doris Ling        summaryProvider.setListening(true);
139d007ff9395e93c9630388262e29e0f1d7a7ab735Doris Ling        verify(summaryLoader, never()).setSummary(summaryProvider, eq(anyString()));
140d007ff9395e93c9630388262e29e0f1d7a7ab735Doris Ling
141d007ff9395e93c9630388262e29e0f1d7a7ab735Doris Ling    }
142d007ff9395e93c9630388262e29e0f1d7a7ab735Doris Ling
1434d9a1ae9a25d03d1d2d0f31871b43b0e54630d92Matthew Fritze    @Test
1444d9a1ae9a25d03d1d2d0f31871b43b0e54630d92Matthew Fritze    public void testNonIndexableKeys_existInXmlLayout() {
1454d9a1ae9a25d03d1d2d0f31871b43b0e54630d92Matthew Fritze        final Context context = spy(RuntimeEnvironment.application);
146b60d2cbb5bb5319b52f30aed6ca071f1faa57b44Ben Lin        when(context.getApplicationContext()).thenReturn(context);
147c62808a5a30e51c19a0aa4cf47d5b82cd3647a98Fan Zhang        final UserManager userManager = mock(UserManager.class, RETURNS_DEEP_STUBS);
148c62808a5a30e51c19a0aa4cf47d5b82cd3647a98Fan Zhang
149b60d2cbb5bb5319b52f30aed6ca071f1faa57b44Ben Lin        when(context.getSystemService(Context.USER_SERVICE))
150c62808a5a30e51c19a0aa4cf47d5b82cd3647a98Fan Zhang                .thenReturn(userManager);
151c62808a5a30e51c19a0aa4cf47d5b82cd3647a98Fan Zhang        when(userManager.getUserInfo(anyInt()).isRestricted()).thenReturn(true);
152c62808a5a30e51c19a0aa4cf47d5b82cd3647a98Fan Zhang
153b60d2cbb5bb5319b52f30aed6ca071f1faa57b44Ben Lin        when(context.getSystemService(Context.TELEPHONY_SERVICE))
154c62808a5a30e51c19a0aa4cf47d5b82cd3647a98Fan Zhang                .thenReturn(mock(TelephonyManager.class));
155b60d2cbb5bb5319b52f30aed6ca071f1faa57b44Ben Lin        when(context.getPackageManager())
156c62808a5a30e51c19a0aa4cf47d5b82cd3647a98Fan Zhang                .thenReturn(mock(PackageManager.class));
1572ea67003364d8f4a79d6afd624d56709839151eeFan Zhang        final List<String> niks = DefaultAppSettings.SEARCH_INDEX_DATA_PROVIDER
158b60d2cbb5bb5319b52f30aed6ca071f1faa57b44Ben Lin                .getNonIndexableKeys(context);
159c62808a5a30e51c19a0aa4cf47d5b82cd3647a98Fan Zhang
1602ea67003364d8f4a79d6afd624d56709839151eeFan Zhang        final int xmlId = (new DefaultAppSettings()).getPreferenceScreenResId();
1614d9a1ae9a25d03d1d2d0f31871b43b0e54630d92Matthew Fritze
1624d9a1ae9a25d03d1d2d0f31871b43b0e54630d92Matthew Fritze        final List<String> keys = XmlTestUtils.getKeysFromPreferenceXml(context, xmlId);
1634d9a1ae9a25d03d1d2d0f31871b43b0e54630d92Matthew Fritze
1644d9a1ae9a25d03d1d2d0f31871b43b0e54630d92Matthew Fritze        assertThat(keys).containsAllIn(niks);
1654d9a1ae9a25d03d1d2d0f31871b43b0e54630d92Matthew Fritze    }
1664136d902bf983b3efba04d1ffde8559f2dc63c6bFan Zhang}
167