• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright 2024 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.inputmethod;
18 
19 import static com.google.common.truth.Truth.assertThat;
20 
21 import static org.mockito.ArgumentMatchers.any;
22 import static org.mockito.ArgumentMatchers.anyString;
23 import static org.mockito.Mockito.verify;
24 import static org.mockito.Mockito.when;
25 
26 import android.content.Context;
27 import android.hardware.input.InputSettings;
28 import android.platform.test.annotations.DisableFlags;
29 import android.platform.test.annotations.EnableFlags;
30 import android.platform.test.flag.junit.SetFlagsRule;
31 
32 import androidx.fragment.app.Fragment;
33 import androidx.fragment.app.FragmentManager;
34 import androidx.fragment.app.FragmentTransaction;
35 import androidx.preference.Preference;
36 
37 import com.android.settings.core.BasePreferenceController;
38 import com.android.settings.keyboard.Flags;
39 import com.android.settings.testutils.shadow.ShadowAlertDialogCompat;
40 
41 import org.junit.Before;
42 import org.junit.Rule;
43 import org.junit.Test;
44 import org.junit.runner.RunWith;
45 import org.mockito.Mock;
46 import org.mockito.junit.MockitoJUnit;
47 import org.mockito.junit.MockitoRule;
48 import org.robolectric.RobolectricTestRunner;
49 import org.robolectric.RuntimeEnvironment;
50 import org.robolectric.annotation.Config;
51 import org.robolectric.annotation.Implementation;
52 import org.robolectric.annotation.Implements;
53 
54 @RunWith(RobolectricTestRunner.class)
55 @Config(shadows = {
56         KeyboardAccessibilityBounceKeysControllerTest
57                 .ShadowKeyboardAccessibilityBounceKeysDialogFragment.class,
58         com.android.settings.testutils.shadow.ShadowFragment.class,
59         ShadowAlertDialogCompat.class,
60 })
61 public class KeyboardAccessibilityBounceKeysControllerTest {
62     @Rule
63     public final SetFlagsRule mSetFlagsRule = new SetFlagsRule();
64     @Rule
65     public MockitoRule mMockitoRule = MockitoJUnit.rule();
66     private static final String PREFERENCE_KEY = "keyboard_a11y_page_bounce_keys";
67     @Mock
68     private Preference mPreference;
69     @Mock
70     private Fragment mFragment;
71     @Mock
72     private FragmentManager mFragmentManager;
73     @Mock
74     private FragmentTransaction mFragmentTransaction;
75     @Mock
76     private KeyboardAccessibilityBounceKeysDialogFragment
77             mKeyboardAccessibilityBounceKeysDialogFragment;
78     private Context mContext;
79     private KeyboardAccessibilityBounceKeysController mKeyboardAccessibilityBounceKeysController;
80 
81     @Before
setUp()82     public void setUp() {
83         mContext = RuntimeEnvironment.application;
84         mContext.setTheme(androidx.appcompat.R.style.Theme_AppCompat);
85         mKeyboardAccessibilityBounceKeysController = new KeyboardAccessibilityBounceKeysController(
86                 mContext,
87                 PREFERENCE_KEY);
88         when(mPreference.getKey()).thenReturn(PREFERENCE_KEY);
89         when(mFragment.getParentFragmentManager()).thenReturn(mFragmentManager);
90         when(mFragmentManager.beginTransaction()).thenReturn(mFragmentTransaction);
91         mKeyboardAccessibilityBounceKeysController.setFragment(mFragment);
92         ShadowKeyboardAccessibilityBounceKeysDialogFragment.setInstance(
93                 mKeyboardAccessibilityBounceKeysDialogFragment);
94     }
95 
96     @Test
97     @EnableFlags(Flags.FLAG_KEYBOARD_AND_TOUCHPAD_A11Y_NEW_PAGE_ENABLED)
getAvailabilityStatus_flagIsEnabled_isAvailable()98     public void getAvailabilityStatus_flagIsEnabled_isAvailable() {
99         assertThat(mKeyboardAccessibilityBounceKeysController.getAvailabilityStatus())
100                 .isEqualTo(BasePreferenceController.AVAILABLE);
101     }
102 
103     @Test
104     @DisableFlags(Flags.FLAG_KEYBOARD_AND_TOUCHPAD_A11Y_NEW_PAGE_ENABLED)
getAvailabilityStatus_flagIsDisabled_notSupport()105     public void getAvailabilityStatus_flagIsDisabled_notSupport() {
106         assertThat(mKeyboardAccessibilityBounceKeysController.getAvailabilityStatus())
107                 .isEqualTo(BasePreferenceController.UNSUPPORTED_ON_DEVICE);
108     }
109 
110     @Test
setChecked_true_updateBounceKeyValue()111     public void setChecked_true_updateBounceKeyValue() {
112         mKeyboardAccessibilityBounceKeysController.setChecked(true);
113         boolean isEnabled = InputSettings.isAccessibilityBounceKeysEnabled(mContext);
114 
115         assertThat(isEnabled).isTrue();
116     }
117 
118     @Test
setChecked_false_updateBounceKeyValue()119     public void setChecked_false_updateBounceKeyValue() {
120         mKeyboardAccessibilityBounceKeysController.setChecked(false);
121         boolean isEnabled = InputSettings.isAccessibilityBounceKeysEnabled(mContext);
122 
123         assertThat(isEnabled).isFalse();
124     }
125 
126     @Test
handlePreferenceTreeClick_dialogShows()127     public void handlePreferenceTreeClick_dialogShows() {
128         mKeyboardAccessibilityBounceKeysController.handlePreferenceTreeClick(mPreference);
129 
130         verify(mKeyboardAccessibilityBounceKeysDialogFragment).show(any(FragmentManager.class),
131                 anyString());
132     }
133 
134     /**
135      * Note: Actually, shadow of KeyboardAccessibilitySlowKeysDialogFragment will not be used.
136      * Instance that returned with {@link #getInstance} should be set with {@link #setInstance}
137      */
138     @Implements(KeyboardAccessibilityBounceKeysDialogFragment.class)
139     public static class ShadowKeyboardAccessibilityBounceKeysDialogFragment {
140         static KeyboardAccessibilityBounceKeysDialogFragment sInstance = null;
141 
142         @Implementation
getInstance()143         protected static KeyboardAccessibilityBounceKeysDialogFragment getInstance() {
144             return sInstance;
145         }
146 
setInstance(KeyboardAccessibilityBounceKeysDialogFragment instance)147         public static void setInstance(KeyboardAccessibilityBounceKeysDialogFragment instance) {
148             sInstance = instance;
149         }
150     }
151 }
152