1 /*
2  * Copyright (C) 2017 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package com.android.settings;
18 
19 import android.app.Activity;
20 import android.content.Context;
21 import android.content.IContentProvider;
22 import android.content.pm.PackageManager;
23 import android.hardware.fingerprint.FingerprintManager;
24 import android.os.UserManager;
25 import android.support.v7.preference.Preference;
26 import android.support.v7.preference.PreferenceGroup;
27 import android.support.v7.preference.PreferenceScreen;
28 
29 import com.android.internal.widget.LockPatternUtils;
30 import com.android.settings.dashboard.SummaryLoader;
31 import com.android.settings.notification.LockScreenNotificationPreferenceController;
32 import com.android.settings.testutils.FakeFeatureFactory;
33 import com.android.settings.testutils.XmlTestUtils;
34 import com.android.settings.testutils.shadow.ShadowLockPatternUtils;
35 import com.android.settingslib.drawer.DashboardCategory;
36 import org.junit.Before;
37 import org.junit.Test;
38 import org.junit.runner.RunWith;
39 import org.mockito.Answers;
40 import org.mockito.Mock;
41 import org.mockito.MockitoAnnotations;
42 import org.robolectric.RuntimeEnvironment;
43 import org.robolectric.annotation.Config;
44 import org.robolectric.annotation.Implementation;
45 import org.robolectric.annotation.Implements;
46 import org.robolectric.shadows.ShadowApplication;
47 import org.robolectric.util.ReflectionHelpers;
48 
49 import java.util.List;
50 import java.util.Map;
51 
52 import static com.google.common.truth.Truth.assertThat;
53 import static org.mockito.Matchers.anyInt;
54 import static org.mockito.Mockito.doReturn;
55 import static org.mockito.Mockito.mock;
56 import static org.mockito.Mockito.spy;
57 import static org.mockito.Mockito.verify;
58 import static org.mockito.Mockito.verifyNoMoreInteractions;
59 import static org.mockito.Mockito.when;
60 
61 @RunWith(SettingsRobolectricTestRunner.class)
62 @Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
63 public class SecuritySettingsTest {
64 
65     private static final String MOCK_SUMMARY = "summary";
66 
67     @Mock(answer = Answers.RETURNS_DEEP_STUBS)
68     private Context mContext;
69     @Mock
70     private DashboardCategory mDashboardCategory;
71     @Mock
72     private SummaryLoader mSummaryLoader;
73 
74     private SecuritySettings.SummaryProvider mSummaryProvider;
75 
76     @Implements(com.android.settingslib.drawer.TileUtils.class)
77     public static class ShadowTileUtils {
78         @Implementation
getTextFromUri(Context context, String uriString, Map<String, IContentProvider> providerMap, String key)79         public static String getTextFromUri(Context context, String uriString,
80                 Map<String, IContentProvider> providerMap, String key) {
81             return MOCK_SUMMARY;
82         }
83     }
84 
85     @Before
setUp()86     public void setUp() {
87         MockitoAnnotations.initMocks(this);
88         FakeFeatureFactory.setupForTest(mContext);
89         mSummaryProvider = new SecuritySettings.SummaryProvider(mContext, mSummaryLoader);
90     }
91 
92     @Test
testSummaryProvider_notListening()93     public void testSummaryProvider_notListening() {
94         mSummaryProvider.setListening(false);
95 
96         verifyNoMoreInteractions(mSummaryLoader);
97     }
98 
99     @Test
testSummaryProvider_hasFingerPrint_hasStaticSummary()100     public void testSummaryProvider_hasFingerPrint_hasStaticSummary() {
101         final FingerprintManager fpm = mock(FingerprintManager.class);
102         when(mContext.getPackageManager().hasSystemFeature(PackageManager.FEATURE_FINGERPRINT))
103                 .thenReturn(true);
104 
105         // Cast to Object to workaround a robolectric casting bug
106         when((Object) mContext.getSystemService(FingerprintManager.class)).thenReturn(fpm);
107         when(fpm.isHardwareDetected()).thenReturn(true);
108 
109         mSummaryProvider.setListening(true);
110 
111         verify(mContext).getString(R.string.security_dashboard_summary);
112     }
113 
114     @Test
testSummaryProvider_noFpFeature_shouldSetSummaryWithNoFingerprint()115     public void testSummaryProvider_noFpFeature_shouldSetSummaryWithNoFingerprint() {
116         final FingerprintManager fpm = mock(FingerprintManager.class);
117         when(mContext.getPackageManager().hasSystemFeature(PackageManager.FEATURE_FINGERPRINT))
118             .thenReturn(false);
119 
120         mSummaryProvider.setListening(true);
121 
122         verify(mContext).getString(R.string.security_dashboard_summary_no_fingerprint);
123     }
124 
125     @Test
testSummaryProvider_noFpHardware_shouldSetSummaryWithNoFingerprint()126     public void testSummaryProvider_noFpHardware_shouldSetSummaryWithNoFingerprint() {
127         final FingerprintManager fpm = mock(FingerprintManager.class);
128         when(mContext.getPackageManager().hasSystemFeature(PackageManager.FEATURE_FINGERPRINT))
129             .thenReturn(true);
130 
131         // Cast to Object to workaround a robolectric casting bug
132         when((Object) mContext.getSystemService(FingerprintManager.class)).thenReturn(fpm);
133         when(fpm.isHardwareDetected()).thenReturn(false);
134 
135         mSummaryProvider.setListening(true);
136 
137         verify(mContext).getString(R.string.security_dashboard_summary_no_fingerprint);
138     }
139 
140     @Test
testInitTrustAgentPreference_secure_shouldSetSummaryToNumberOfTrustAgent()141     public void testInitTrustAgentPreference_secure_shouldSetSummaryToNumberOfTrustAgent() {
142         final Preference preference = mock(Preference.class);
143         final PreferenceScreen screen = mock(PreferenceScreen.class);
144         when(screen.findPreference(SecuritySettings.KEY_MANAGE_TRUST_AGENTS))
145                 .thenReturn(preference);
146         final LockPatternUtils utils = mock(LockPatternUtils.class);
147         when(utils.isSecure(anyInt())).thenReturn(true);
148         final Context context = ShadowApplication.getInstance().getApplicationContext();
149         final Activity activity = mock(Activity.class);
150         when(activity.getResources()).thenReturn(context.getResources());
151         final SecuritySettings securitySettings = spy(new SecuritySettings());
152         when(securitySettings.getActivity()).thenReturn(activity);
153 
154         ReflectionHelpers.setField(securitySettings, "mLockPatternUtils", utils);
155 
156         securitySettings.initTrustAgentPreference(screen, 0);
157         verify(preference).setSummary(R.string.manage_trust_agents_summary);
158 
159         securitySettings.initTrustAgentPreference(screen, 2);
160         verify(preference).setSummary(context.getResources().getQuantityString(
161             R.plurals.manage_trust_agents_summary_on, 2, 2));
162     }
163 
164     @Test
testSetLockscreenPreferencesSummary_shouldSetSummaryFromLockScreenNotification()165     public void testSetLockscreenPreferencesSummary_shouldSetSummaryFromLockScreenNotification() {
166         final Preference preference = mock(Preference.class);
167         final PreferenceGroup group = mock(PreferenceGroup.class);
168         when(group.findPreference(SecuritySettings.KEY_LOCKSCREEN_PREFERENCES))
169             .thenReturn(preference);
170         final LockScreenNotificationPreferenceController controller =
171             mock(LockScreenNotificationPreferenceController.class);
172 
173         final SecuritySettings securitySettings = new SecuritySettings();
174         ReflectionHelpers.setField(securitySettings,
175             "mLockScreenNotificationPreferenceController", controller);
176 
177         when(controller.getSummaryResource()).thenReturn(1234);
178         securitySettings.setLockscreenPreferencesSummary(group);
179         verify(preference).setSummary(1234);
180     }
181 
182     @Test
183     @Config (shadows = {
184             ShadowLockPatternUtils.class,
185     })
testNonIndexableKeys_existInXmlLayout()186     public void testNonIndexableKeys_existInXmlLayout() {
187         final Context context = spy(RuntimeEnvironment.application);
188         UserManager manager = mock(UserManager.class);
189         when(manager.isAdminUser()).thenReturn(false);
190         doReturn(manager).when(context).getSystemService(Context.USER_SERVICE);
191         final List<String> niks = SecuritySettings.SEARCH_INDEX_DATA_PROVIDER
192                 .getNonIndexableKeys(context);
193 
194         final List<String> keys = XmlTestUtils.getKeysFromPreferenceXml(context,
195                 R.xml.security_settings_misc);
196         keys.addAll(XmlTestUtils.getKeysFromPreferenceXml(context,
197                 R.xml.location_settings));
198         keys.addAll(XmlTestUtils.getKeysFromPreferenceXml(context,
199                 R.xml.encryption_and_credential));
200 
201         assertThat(keys).containsAllIn(niks);
202     }
203 }
204