1 /* 2 * Copyright (C) 2018 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.tv.settings.inputmethod; 18 19 import static org.mockito.Mockito.atLeastOnce; 20 import static org.mockito.Mockito.doReturn; 21 import static org.mockito.Mockito.never; 22 import static org.mockito.Mockito.verify; 23 import static org.robolectric.shadow.api.Shadow.extract; 24 25 import android.os.UserManager; 26 import android.provider.Settings; 27 import android.support.v7.preference.ListPreference; 28 import android.support.v7.preference.Preference; 29 import android.support.v7.preference.PreferenceCategory; 30 import android.support.v7.preference.PreferenceScreen; 31 32 import com.android.tv.settings.R; 33 import com.android.tv.settings.TvSettingsRobolectricTestRunner; 34 import com.android.tv.settings.testutils.ShadowInputMethodManager; 35 import com.android.tv.settings.testutils.ShadowUserManager; 36 import com.android.tv.settings.testutils.TvShadowActivityThread; 37 import com.android.tv.settings.testutils.Utils; 38 39 import org.junit.Before; 40 import org.junit.Test; 41 import org.junit.runner.RunWith; 42 import org.mockito.Mock; 43 import org.mockito.MockitoAnnotations; 44 import org.mockito.Spy; 45 import org.robolectric.RuntimeEnvironment; 46 import org.robolectric.annotation.Config; 47 import org.robolectric.shadows.ShadowSettings; 48 49 @RunWith(TvSettingsRobolectricTestRunner.class) 50 @Config(shadows = { 51 ShadowUserManager.class, 52 TvShadowActivityThread.class, 53 ShadowInputMethodManager.class}) 54 public class KeyboardFragmentTest { 55 @Spy 56 private KeyboardFragment mKeyboardFragment; 57 58 private ShadowUserManager mUserManager; 59 60 @Mock 61 private PreferenceScreen mPreferenceScreen; 62 63 @Mock 64 private PreferenceCategory mAutofillCategory; 65 66 @Mock 67 private Preference mCurrentAutofill; 68 69 @Mock 70 private PreferenceCategory mKeyboardCategory; 71 72 @Mock 73 private ListPreference mCurrentKeyboard; 74 75 @Before 76 public void setUp() { 77 MockitoAnnotations.initMocks(this); 78 mUserManager = extract(RuntimeEnvironment.application.getSystemService(UserManager.class)); 79 mUserManager.setIsAdminUser(true); 80 doReturn(RuntimeEnvironment.application).when(mKeyboardFragment).getContext(); 81 mKeyboardFragment.onAttach(RuntimeEnvironment.application); 82 doReturn(RuntimeEnvironment.application).when(mKeyboardFragment).getPreferenceContext(); 83 84 doReturn(mPreferenceScreen).when(mKeyboardFragment).getPreferenceScreen(); 85 86 doReturn(mKeyboardCategory).when(mKeyboardFragment).findPreference( 87 KeyboardFragment.KEY_KEYBOARD_CATEGORY); 88 89 doReturn(mCurrentKeyboard).when(mKeyboardFragment).findPreference( 90 KeyboardFragment.KEY_CURRENT_KEYBOARD); 91 doReturn(1).when(mKeyboardCategory).getPreferenceCount(); 92 doReturn(mCurrentKeyboard).when(mKeyboardCategory).getPreference(0); 93 94 doReturn(mAutofillCategory).when(mKeyboardFragment).findPreference( 95 KeyboardFragment.KEY_AUTOFILL_CATEGORY); 96 97 doReturn(mCurrentAutofill).when(mKeyboardFragment).findPreference( 98 KeyboardFragment.KEY_CURRENT_AUTOFILL); 99 doReturn(1).when(mAutofillCategory).getPreferenceCount(); 100 doReturn(mCurrentAutofill).when(mAutofillCategory).getPreference(0); 101 } 102 103 @Test 104 public void testUpdateAutofillSettings_noCandiate() { 105 106 mKeyboardFragment.updateUi(); 107 108 verify(mPreferenceScreen, atLeastOnce()).setTitle(R.string.system_keyboard); 109 verify(mPreferenceScreen, never()).setTitle(R.string.system_keyboard_autofill); 110 111 verify(mKeyboardCategory, atLeastOnce()).setVisible(false); 112 verify(mKeyboardCategory, never()).setVisible(true); 113 114 verify(mAutofillCategory, atLeastOnce()).setVisible(false); 115 verify(mAutofillCategory, never()).setVisible(true); 116 } 117 118 @Test 119 public void testUpdateAutofillSettings_selected() { 120 121 Utils.addAutofill("com.test.AutofillPackage", "com.test.AutofillPackage.MyService"); 122 123 ShadowSettings.ShadowGlobal.putString(mKeyboardFragment.getContext().getContentResolver(), 124 Settings.Secure.AUTOFILL_SERVICE, 125 "com.test.AutofillPackage/com.test.AutofillPackage.MyService"); 126 127 mKeyboardFragment.updateUi(); 128 129 verify(mPreferenceScreen, atLeastOnce()).setTitle(R.string.system_keyboard_autofill); 130 verify(mPreferenceScreen, never()).setTitle(R.string.system_keyboard); 131 132 verify(mKeyboardCategory, atLeastOnce()).setVisible(true); 133 verify(mKeyboardCategory, never()).setVisible(false); 134 135 verify(mAutofillCategory, atLeastOnce()).setVisible(true); 136 verify(mAutofillCategory, never()).setVisible(false); 137 138 verify(mCurrentAutofill, atLeastOnce()).setSummary( 139 "com.test.AutofillPackage.MyService"); 140 } 141 142 @Test 143 public void testUpdateAutofillSettings_selectedNone() { 144 145 Utils.addAutofill("com.test.AutofillPackage", "com.test.AutofillPackage.MyService"); 146 147 ShadowSettings.ShadowGlobal.putString(mKeyboardFragment.getContext().getContentResolver(), 148 Settings.Secure.AUTOFILL_SERVICE, null); 149 150 mKeyboardFragment.updateUi(); 151 152 verify(mPreferenceScreen, atLeastOnce()).setTitle(R.string.system_keyboard_autofill); 153 verify(mPreferenceScreen, never()).setTitle(R.string.system_keyboard); 154 155 verify(mKeyboardCategory, atLeastOnce()).setVisible(true); 156 verify(mKeyboardCategory, never()).setVisible(false); 157 158 verify(mAutofillCategory, atLeastOnce()).setVisible(true); 159 verify(mAutofillCategory, never()).setVisible(false); 160 161 verify(mCurrentAutofill, atLeastOnce()).setSummary( 162 mKeyboardFragment.getContext().getString(R.string.autofill_none)); 163 } 164 165 } 166