/* * Copyright (C) 2016 The Android Open Source Project * * 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.talkback; import android.content.Context; import android.content.SharedPreferences; import android.view.KeyEvent; import com.android.talkback.KeyComboManager; import com.android.talkback.keyboard.DefaultKeyComboModel; import com.android.talkback.keyboard.KeyComboModel; import com.android.talkback.keyboard.KeyComboPersister; import com.android.utils.SharedPreferencesUtils; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; import org.junit.After; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.robolectric.RobolectricGradleTestRunner; import org.robolectric.RuntimeEnvironment; import org.robolectric.annotation.Config; import java.lang.Long; import java.util.Map; @Config(constants = BuildConfig.class, sdk = 21) @RunWith(RobolectricGradleTestRunner.class) public class DefaultKeyComboModelTest { private static final String PREF_KEY_PREFIX = "default_key_combo_model|"; private DefaultKeyComboModel mDefaultKeyComboModel; private Context mContext; private SharedPreferences mPref; @Before public void setUp() { mContext = RuntimeEnvironment.application.getApplicationContext(); mDefaultKeyComboModel = new DefaultKeyComboModel(mContext); mPref = SharedPreferencesUtils.getSharedPreferences(mContext); } @After public void tearDown() { mPref.edit().clear().commit(); } @Test public void persistDefaultKeyComboCodeAtInitialization() { String keyNavigateNext = mContext.getString(R.string.keycombo_shortcut_navigate_next); KeyComboPersister keyComboPersister = new KeyComboPersister(mContext, DefaultKeyComboModel.PREF_KEY_PREFIX); // Confirm that default key combo code for navigating to next item is persisted. assertTrue(keyComboPersister.contains(keyNavigateNext)); assertEquals(mDefaultKeyComboModel.getDefaultKeyComboCode(keyNavigateNext), keyComboPersister.getKeyComboCode(keyNavigateNext).longValue()); } @Test public void persistCustomKeyComboCode() { String keyNavigateNext = mContext.getString(R.string.keycombo_shortcut_navigate_next); long customKeyComboCode = KeyComboManager.getKeyComboCode(KeyComboModel.NO_MODIFIER, KeyEvent.KEYCODE_X); assertFalse(customKeyComboCode == mDefaultKeyComboModel.getDefaultKeyComboCode(keyNavigateNext)); KeyComboPersister keyComboPersister = new KeyComboPersister(mContext, DefaultKeyComboModel.PREF_KEY_PREFIX); // Change key combo code for navigating to next item to custom one. keyComboPersister.saveKeyCombo(keyNavigateNext, customKeyComboCode); // Create another DefaultKeyComboModel to confirm that the custom one is persisted. We // cannot simply read the value from mDefaultKeyComboModel here since it's instantiated // before the key combo code is changed in the above. DefaultKeyComboModel defaultKeyComboModel = new DefaultKeyComboModel(mContext); assertEquals(customKeyComboCode, defaultKeyComboModel.getKeyComboCodeForKey(keyNavigateNext)); } @Test public void changeKeyComboCode() { String keyNavigateNext = mContext.getString(R.string.keycombo_shortcut_navigate_next); // Check default key combo code. long defaultKeyComboCode = mDefaultKeyComboModel.getDefaultKeyComboCode(keyNavigateNext); assertEquals(defaultKeyComboCode, mDefaultKeyComboModel.getKeyComboCodeForKey(keyNavigateNext)); // Change key combo code. long newKeyComboCode = KeyComboManager.getKeyComboCode( KeyComboModel.NO_MODIFIER, KeyEvent.KEYCODE_X); mDefaultKeyComboModel.saveKeyComboCode(keyNavigateNext, newKeyComboCode); Map<String, Long> keyComboCodeMap = mDefaultKeyComboModel.getKeyComboCodeMap(); assertEquals(newKeyComboCode, keyComboCodeMap.get(keyNavigateNext).longValue()); assertEquals(newKeyComboCode, mDefaultKeyComboModel.getKeyComboCodeForKey(keyNavigateNext)); assertEquals(newKeyComboCode, mPref.getLong(PREF_KEY_PREFIX + keyNavigateNext, -1)); // Create new DefaultKeyComboModel model and confirm it's loaded. DefaultKeyComboModel newDefaultKeyComboModel = new DefaultKeyComboModel(mContext); assertEquals(newKeyComboCode, newDefaultKeyComboModel.getKeyComboCodeForKey(keyNavigateNext)); } @Test public void clearKeyComboCode() { String keyNavigateNext = mContext.getString(R.string.keycombo_shortcut_navigate_next); // Check default key combo code. long defaultKeyComboCode = mDefaultKeyComboModel.getDefaultKeyComboCode(keyNavigateNext); assertEquals(defaultKeyComboCode, mDefaultKeyComboModel.getKeyComboCodeForKey(keyNavigateNext)); // Clear key combo code. mDefaultKeyComboModel.clearKeyComboCode(keyNavigateNext); Map<String, Long> keyComboCodeMap = mDefaultKeyComboModel.getKeyComboCodeMap(); assertEquals(KeyComboModel.KEY_COMBO_CODE_UNASSIGNED, keyComboCodeMap.get(keyNavigateNext).longValue()); assertEquals(KeyComboModel.KEY_COMBO_CODE_UNASSIGNED, mDefaultKeyComboModel.getKeyComboCodeForKey(keyNavigateNext)); assertEquals(KeyComboModel.KEY_COMBO_CODE_UNASSIGNED, mPref.getLong(PREF_KEY_PREFIX + keyNavigateNext, -1)); // Create new DefaultKeyComboModel and confirm it's loaded. DefaultKeyComboModel newDefaultKeyComboModel = new DefaultKeyComboModel(mContext); assertEquals(KeyComboModel.KEY_COMBO_CODE_UNASSIGNED, newDefaultKeyComboModel.getKeyComboCodeForKey(keyNavigateNext)); } @Test public void isEligibleKeyComboCode() { assertEquals(KeyEvent.META_ALT_ON, mDefaultKeyComboModel.getTriggerModifier()); assertTrue(mDefaultKeyComboModel.isEligibleKeyComboCode( KeyComboModel.KEY_COMBO_CODE_UNASSIGNED)); assertTrue(mDefaultKeyComboModel.isEligibleKeyComboCode( KeyComboManager.getKeyComboCode(KeyComboModel.NO_MODIFIER, KeyEvent.KEYCODE_X))); assertTrue(mDefaultKeyComboModel.isEligibleKeyComboCode( KeyComboManager.getKeyComboCode(KeyEvent.META_CTRL_ON, KeyEvent.KEYCODE_X))); assertFalse(mDefaultKeyComboModel.isEligibleKeyComboCode( KeyComboManager.getKeyComboCode(KeyEvent.META_ALT_ON, KeyEvent.KEYCODE_X))); assertFalse(mDefaultKeyComboModel.isEligibleKeyComboCode( KeyComboManager.getKeyComboCode(KeyEvent.META_CTRL_ON | KeyEvent.META_SHIFT_ON, KeyEvent.KEYCODE_SHIFT_LEFT))); assertFalse(mDefaultKeyComboModel.isEligibleKeyComboCode( KeyComboManager.getKeyComboCode(KeyEvent.META_ALT_ON | KeyEvent.META_CTRL_ON, KeyEvent.KEYCODE_CTRL_LEFT))); assertFalse(mDefaultKeyComboModel.isEligibleKeyComboCode( KeyComboManager.getKeyComboCode(KeyEvent.META_CTRL_ON | KeyEvent.META_SHIFT_ON, KeyEvent.KEYCODE_UNKNOWN))); } }