/* * Copyright (C) 2015 Google Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of * the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations under * the License. */ package com.android.switchaccess.test; import android.content.Context; import android.content.SharedPreferences; import android.preference.ListPreference; import android.preference.Preference; import android.preference.PreferenceActivity; import android.preference.PreferenceManager; import android.view.KeyEvent; import com.android.switchaccess.KeyComboPreference; import com.android.switchaccess.SwitchAccessPreferenceActivity; import com.android.talkback.BuildConfig; import com.android.talkback.R; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.robolectric.Robolectric; import org.robolectric.RobolectricGradleTestRunner; import org.robolectric.RobolectricTestRunner; import org.robolectric.RuntimeEnvironment; import org.robolectric.annotation.Config; import org.robolectric.shadows.ShadowPreferenceManager; import org.robolectric.util.ActivityController; import java.util.Arrays; import java.util.HashSet; import java.util.Map; import java.util.Set; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; @SuppressWarnings("deprecation") @Config( constants = BuildConfig.class, sdk = 21) @RunWith(RobolectricGradleTestRunner.class) public class PreferenceActivityTest { private final Context mContext = RuntimeEnvironment.application.getApplicationContext(); private final SharedPreferences mSharedPreferences = ShadowPreferenceManager.getDefaultSharedPreferences(mContext); private final String mAutoScanKey = mContext.getString(R.string.pref_key_auto_scan_time_delay); @Before public void setUp() { /* Set up preference and key event */ mSharedPreferences.edit().clear().commit(); } @Test public void testOnCreate_autoScanDelayIsDefault() { setAutoScanEnabled(true); SwitchAccessPreferenceActivity activity = getPrefActivity(); final Preference autoScanDelayPref = activity.findPreference(mAutoScanKey); assertEquals("1 Second", autoScanDelayPref.getSummary()); } @Test public void testOnCreateWithInvalidAutoScanDelay_shouldUseDefault() { setAutoScanEnabled(true); mSharedPreferences.edit().putString(mAutoScanKey, ".").commit(); SwitchAccessPreferenceActivity activity = getPrefActivity(); final Preference autoScanDelayPref = activity.findPreference(mAutoScanKey); assertEquals("1 Second", autoScanDelayPref.getSummary()); } @Test public void testOnCreateWithAutoScanDelayHalfSecond_properlyInitialized() { setAutoScanEnabled(true); mSharedPreferences.edit().putString(mAutoScanKey, "0.5").commit(); SwitchAccessPreferenceActivity activity = getPrefActivity(); final Preference autoScanDelayPref = activity.findPreference(mAutoScanKey); assertEquals("0.50 Seconds", autoScanDelayPref.getSummary()); } @Test public void testAutoScanDelayChangeTwoSeconds_stringUpdates() { setAutoScanEnabled(true); SwitchAccessPreferenceActivity activity = getPrefActivity(); final Preference autoScanDelayPref = activity.findPreference(mAutoScanKey); autoScanDelayPref.getOnPreferenceChangeListener() .onPreferenceChange(autoScanDelayPref, "2.0"); assertEquals("2.00 Seconds", autoScanDelayPref.getSummary()); } @Test public void testAutoScanDelayChangeOneSecond_stringUpdates() { setAutoScanEnabled(true); SwitchAccessPreferenceActivity activity = getPrefActivity(); final Preference autoScanDelayPref = activity.findPreference(mAutoScanKey); autoScanDelayPref.getOnPreferenceChangeListener() .onPreferenceChange(autoScanDelayPref, "2.0"); autoScanDelayPref.getOnPreferenceChangeListener() .onPreferenceChange(autoScanDelayPref, "1.0"); assertEquals("1 Second", autoScanDelayPref.getSummary()); } @Test public void testAutoScanDelayChangeInvalid_doesNotUpdate() { setAutoScanEnabled(true); SwitchAccessPreferenceActivity activity = getPrefActivity(); final Preference autoScanDelayPref = activity.findPreference(mAutoScanKey); assertFalse(autoScanDelayPref.getOnPreferenceChangeListener() .onPreferenceChange(autoScanDelayPref, ".")); assertEquals("1 Second", autoScanDelayPref.getSummary()); } @Test public void isAutoscanEnabledWithDisabled_shouldReturnFalse() { setAutoScanEnabled(false); assertFalse(SwitchAccessPreferenceActivity.isAutoScanEnabled(mContext)); } @Test public void isAutoscanEnabledWithEnabled_shouldReturnTrue() { setAutoScanEnabled(true); assertTrue(SwitchAccessPreferenceActivity.isAutoScanEnabled(mContext)); } @Test public void isOptionScanningEnabledWithDisabled_shouldReturnFalse() { setStringPreference(R.string.pref_scanning_methods_key, mContext.getString(R.string.views_linear_ime_row_col_key)); assertFalse(SwitchAccessPreferenceActivity.isOptionScanningEnabled(mContext)); } @Test public void isOptionScanningEnabledWithEnabled_shouldReturnTrue() { setStringPreference(R.string.pref_scanning_methods_key, mContext.getString(R.string.option_scanning_key)); assertTrue(SwitchAccessPreferenceActivity.isOptionScanningEnabled(mContext)); } @Test public void whenOptionScanningDisabledAndNoKeysConfigured_showNoOptionScanSettings() { setStringPreference(R.string.pref_scanning_methods_key, mContext.getString(R.string.views_linear_ime_row_col_key)); SwitchAccessPreferenceActivity activity = getPrefActivity(); assertFalse(preferencePresent(activity, R.string.pref_key_mapped_to_switch_3_key)); assertFalse(preferencePresent(activity, R.string.pref_key_mapped_to_switch_4_key)); assertFalse(preferencePresent(activity, R.string.pref_key_mapped_to_switch_5_key)); assertFalse(preferencePresent(activity, R.string.pref_highlight_1_key)); assertFalse(preferencePresent(activity, R.string.pref_highlight_2_key)); assertFalse(preferencePresent(activity, R.string.pref_highlight_3_key)); assertFalse(preferencePresent(activity, R.string.pref_highlight_4_key)); } @Test public void whenOptionScanningEnabled_showOptionScanHighlighting() { setStringPreference(R.string.pref_scanning_methods_key, mContext.getString(R.string.option_scanning_key)); SwitchAccessPreferenceActivity activity = getPrefActivity(); assertTrue(preferencePresent(activity, R.string.pref_highlight_1_key)); assertTrue(preferencePresent(activity, R.string.pref_highlight_2_key)); assertTrue(preferencePresent(activity, R.string.pref_highlight_3_key)); assertTrue(preferencePresent(activity, R.string.pref_highlight_4_key)); } @Test public void whenOptionScanningEnabledAndNoKeysConfigured_showTwoOptionScanKeyPrefs() { setStringPreference(R.string.pref_scanning_methods_key, mContext.getString(R.string.option_scanning_key)); SwitchAccessPreferenceActivity activity = getPrefActivity(); assertTrue(preferencePresent(activity, R.string.pref_key_mapped_to_click_key)); assertTrue(preferencePresent(activity, R.string.pref_key_mapped_to_next_key)); assertFalse(preferencePresent(activity, R.string.pref_key_mapped_to_switch_3_key)); assertFalse(preferencePresent(activity, R.string.pref_key_mapped_to_switch_4_key)); assertFalse(preferencePresent(activity, R.string.pref_key_mapped_to_switch_5_key)); } @Test public void whenOptionScanningEnabledAndTwoKeysConfigured_showThreeOptionScanKeyPrefs() { setStringPreference(R.string.pref_scanning_methods_key, mContext.getString(R.string.option_scanning_key)); SwitchAccessPreferenceActivity activity = getPrefActivity(); KeyEvent keyEvent = new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_A); long keyCode = KeyComboPreference.keyEventToExtendedKeyCode(keyEvent); Set<String> stringSet = new HashSet<>(Arrays.asList((new Long(keyCode)).toString())); mSharedPreferences.edit() .putStringSet(mContext.getString(R.string.pref_key_mapped_to_click_key), stringSet) .putStringSet(mContext.getString(R.string.pref_key_mapped_to_next_key), stringSet) .apply(); notifyPreferenceChanged(activity, R.string.pref_key_mapped_to_next_key); assertTrue(preferencePresent(activity, R.string.pref_key_mapped_to_click_key)); assertTrue(preferencePresent(activity, R.string.pref_key_mapped_to_next_key)); assertTrue(preferencePresent(activity, R.string.pref_key_mapped_to_switch_3_key)); assertFalse(preferencePresent(activity, R.string.pref_key_mapped_to_switch_4_key)); assertFalse(preferencePresent(activity, R.string.pref_key_mapped_to_switch_5_key)); } @Test public void whenOptionScanningEnabled_autoScanPrefShouldDisappear() { setStringPreference(R.string.pref_scanning_methods_key, mContext.getString(R.string.option_scanning_key)); SwitchAccessPreferenceActivity activity = getPrefActivity(); assertFalse(preferencePresent(activity, R.string.pref_key_auto_scan_enabled)); } @Test public void whenOptionScanningEnabled_shouldShowOnlyOptionHighlightPref() { setStringPreference(R.string.pref_scanning_methods_key, mContext.getString(R.string.option_scanning_key)); SwitchAccessPreferenceActivity activity = getPrefActivity(); assertTrue(preferencePresent(activity, R.string.pref_highlights_key)); assertFalse(preferencePresent(activity, R.string.pref_standard_highlight_key)); } @Test public void whenOptionScanningDisabled_shouldShowOnlyStandardHighlightPref() { setStringPreference(R.string.pref_scanning_methods_key, mContext.getString(R.string.views_linear_ime_row_col_key)); SwitchAccessPreferenceActivity activity = getPrefActivity(); assertTrue(preferencePresent(activity, R.string.pref_standard_highlight_key)); assertFalse(preferencePresent(activity, R.string.pref_highlights_key)); } @Test public void whenOptionScanningAndAutoScanEnabled_optionScanningShouldBeDisabled() { setStringPreference(R.string.pref_scanning_methods_key, mContext.getString(R.string.option_scanning_key)); setAutoScanEnabled(true); getPrefActivity(); assertFalse(SwitchAccessPreferenceActivity.isOptionScanningEnabled(mContext)); } @Test public void whenOptionScanningDisabled_stringsDontMentionOptionScanning() { setStringPreference(R.string.pref_scanning_methods_key, mContext.getString(R.string.views_linear_ime_row_col_key)); SwitchAccessPreferenceActivity activity = getPrefActivity(); Preference nextKeyAssignmentPref = activity.findPreference(mContext.getString(R.string.pref_key_mapped_to_next_key)); Preference clickKeyAssignmentPref = activity.findPreference(mContext.getString(R.string.pref_key_mapped_to_click_key)); Preference highlightColor0Pref = activity.findPreference(mContext.getString(R.string.pref_highlight_0_key)); assertEquals(mContext.getString(R.string.action_name_next), nextKeyAssignmentPref.getTitle()); assertEquals(mContext.getString(R.string.action_name_click), clickKeyAssignmentPref.getTitle()); } @Test public void whenOptionScanningEnabled_stringsMentionOptionScanning() { setStringPreference(R.string.pref_scanning_methods_key, mContext.getString(R.string.option_scanning_key)); SwitchAccessPreferenceActivity activity = getPrefActivity(); Preference clickKeyAssignmentPref = activity.findPreference(mContext.getString(R.string.pref_key_mapped_to_click_key)); Preference nextKeyAssignmentPref = activity.findPreference(mContext.getString(R.string.pref_key_mapped_to_next_key)); Preference highlightColor0Pref = activity.findPreference(mContext.getString(R.string.pref_highlight_0_key)); assertEquals(String.format(mContext.getString(R.string.option_scan_switch_format), 1), clickKeyAssignmentPref.getTitle()); assertEquals(String.format(mContext.getString(R.string.option_scan_switch_format), 2), nextKeyAssignmentPref.getTitle()); assertEquals(String.format(mContext.getString(R.string.option_scan_switch_format), 1), highlightColor0Pref.getTitle()); } @Test public void optionScanningDisabledButKeysMappedToOption3_showPreference() { setStringPreference(R.string.pref_scanning_methods_key, mContext.getString(R.string.views_linear_ime_row_col_key)); KeyEvent keyEvent = new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_A); long keyCode = KeyComboPreference.keyEventToExtendedKeyCode(keyEvent); Set<String> stringSet = new HashSet<>(Arrays.asList((new Long(keyCode)).toString())); mSharedPreferences.edit().putStringSet( mContext.getString(R.string.pref_key_mapped_to_switch_3_key), stringSet).apply(); SwitchAccessPreferenceActivity activity = getPrefActivity(); assertTrue(preferencePresent(activity, R.string.pref_key_mapped_to_switch_3_key)); } @Test public void whenOptionScanningStateChanges_preferencesUpdate() { setStringPreference(R.string.pref_scanning_methods_key, mContext.getString(R.string.option_scanning_key)); SwitchAccessPreferenceActivity activity = getPrefActivity(); setStringPreference(R.string.pref_scanning_methods_key, mContext.getString(R.string.views_linear_ime_row_col_key)); notifyPreferenceChanged(activity, R.string.pref_scanning_methods_key); Preference nextKeyAssignmentPref = activity.findPreference(mContext.getString(R.string.pref_key_mapped_to_next_key)); assertEquals(mContext.getString(R.string.action_name_next), nextKeyAssignmentPref.getTitle()); } @Test public void whenAutoScanDisabled_delayPrefNotShown() { setAutoScanEnabled(false); SwitchAccessPreferenceActivity activity = getPrefActivity(); assertFalse(preferencePresent(activity, R.string.pref_key_auto_scan_time_delay)); } @Test public void whenAutoScanEnabled_delayPrefShown() { setAutoScanEnabled(true); SwitchAccessPreferenceActivity activity = getPrefActivity(); assertTrue(preferencePresent(activity, R.string.pref_key_auto_scan_time_delay)); } @Test public void whenAutoScanDisabledAndNoKeyMapped_keyPrefsNotShown() { setAutoScanEnabled(false); SwitchAccessPreferenceActivity activity = getPrefActivity(); assertFalse(preferencePresent(activity, R.string.pref_key_mapped_to_auto_scan_key)); assertFalse(preferencePresent(activity, R.string.pref_key_mapped_to_reverse_auto_scan_key)); } @Test public void whenAutoScanEnabled_optionScanningNotAvailable() { setAutoScanEnabled(true); SwitchAccessPreferenceActivity activity = getPrefActivity(); ListPreference scanMethodsPref = (ListPreference) activity.findPreference(mContext.getString(R.string.pref_scanning_methods_key)); assertEquals(-1, scanMethodsPref.findIndexOfValue(mContext.getString(R.string.option_scanning_key))); } @Test public void whenAutoScanDisabledButKeyMapped_keyPrefShown() { setAutoScanEnabled(false); KeyEvent keyEvent = new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_A); long keyCode = KeyComboPreference.keyEventToExtendedKeyCode(keyEvent); Set<String> stringSet = new HashSet<>(Arrays.asList((new Long(keyCode)).toString())); mSharedPreferences.edit().putStringSet(mContext .getString(R.string.pref_key_mapped_to_auto_scan_key), stringSet).apply(); mSharedPreferences.edit().putStringSet(mContext .getString(R.string.pref_key_mapped_to_reverse_auto_scan_key), stringSet).apply(); SwitchAccessPreferenceActivity activity = getPrefActivity(); assertTrue(preferencePresent(activity, R.string.pref_key_mapped_to_auto_scan_key)); assertTrue(preferencePresent(activity, R.string.pref_key_mapped_to_reverse_auto_scan_key)); } @Test public void whenAutoScanBecomesEnabled_prefsUpdate() { setAutoScanEnabled(false); SwitchAccessPreferenceActivity activity = getPrefActivity(); setAutoScanEnabled(true); notifyPreferenceChanged(activity, R.string.pref_key_auto_scan_enabled); assertTrue(preferencePresent(activity, R.string.pref_key_mapped_to_auto_scan_key)); assertTrue(preferencePresent(activity, R.string.pref_key_mapped_to_reverse_auto_scan_key)); } @Test public void testHighlightStylesForOptionScanning_defaultsAreDifferent() { int[] prefIds = {R.string.pref_highlight_0_color_key, R.string.pref_highlight_1_color_key, R.string.pref_highlight_2_color_key, R.string.pref_highlight_3_color_key, R.string.pref_highlight_4_color_key}; setStringPreference(R.string.pref_scanning_methods_key, mContext.getString(R.string.option_scanning_key)); SwitchAccessPreferenceActivity activity = getPrefActivity(); Set<String> defaultColors = new HashSet<>(); for (int id : prefIds) { ListPreference highlightPref = (ListPreference) activity.findPreference(mContext.getString(id)); String defaultColor = highlightPref.getValue(); assertFalse(defaultColors.contains(defaultColor)); defaultColors.add(defaultColor); } } @Test public void testIsGlobalMenuAutoSelectOn_returnsCorrectValue() { SwitchAccessPreferenceActivity.setGlobalMenuAutoselectOn(mContext, true); assertTrue(SwitchAccessPreferenceActivity.isGlobalMenuAutoselectOn(mContext)); SwitchAccessPreferenceActivity.setGlobalMenuAutoselectOn(mContext, false); assertFalse(SwitchAccessPreferenceActivity.isGlobalMenuAutoselectOn(mContext)); } private void setStringPreference(int prefStringId, String value) { PreferenceManager.getDefaultSharedPreferences(mContext).edit() .putString(mContext.getString(prefStringId), value).commit(); } private boolean preferencePresent(SwitchAccessPreferenceActivity activity, int prefKeyId) { return activity.findPreference(mContext.getString(prefKeyId)) != null; } private void setAutoScanEnabled(boolean enabled) { PreferenceManager.getDefaultSharedPreferences(mContext) .edit() .putBoolean(mContext.getString(R.string.pref_key_auto_scan_enabled), enabled) .apply(); } private SwitchAccessPreferenceActivity getPrefActivity() { return Robolectric .buildActivity(SwitchAccessPreferenceActivity.class).create().start().get(); } private void notifyPreferenceChanged(PreferenceActivity activity, int prefKeyId) { Preference pref = activity.findPreference(mContext.getString(prefKeyId)); Preference.OnPreferenceChangeListener listener = pref.getOnPreferenceChangeListener(); Map<String, ?> prefMap = mSharedPreferences.getAll(); if (listener != null) { listener.onPreferenceChange(pref, prefMap.get(pref.getKey())); } } }