/*
* 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.Intent;
import android.content.SharedPreferences;
import android.preference.DialogPreference;
import android.preference.PreferenceFragment;
import android.preference.PreferenceManager;
import android.view.KeyEvent;
import android.view.View;
import com.android.talkback.keyboard.DefaultKeyComboModel;
import com.android.talkback.keyboard.KeyComboModel;
import com.android.talkback.keyboard.KeyComboModelApp;
import com.google.android.marvin.talkback.TalkBackService;
import com.googlecode.eyesfree.testing.TalkBackInstrumentationTestCase;
/**
* TalkBackKeyboardShortcutPreferencesActivity test.
*/
public class TalkBackKeyboardShortcutPreferencesActivityTest
extends TalkBackInstrumentationTestCase {
private TalkBackKeyboardShortcutPreferencesActivity mPreferencesActivity;
@Override
protected void tearDown() throws Exception {
if (mPreferencesActivity != null) {
mPreferencesActivity.finish();
mPreferencesActivity = null;
}
SharedPreferences pref = PreferenceManager.getDefaultSharedPreferences(getActivity());
pref.edit().clear().commit();
super.tearDown();
}
public void testResetKeymapWithClassicKeymap() {
assertKeymapIsClassicKeymap();
long customKeyComboCode = KeyComboManager.getKeyComboCode(
KeyEvent.META_ALT_ON | KeyEvent.META_SHIFT_ON, KeyEvent.KEYCODE_X);
long defaultKeyComboCode = KeyComboManager.getKeyComboCode(
KeyEvent.META_ALT_ON | KeyEvent.META_SHIFT_ON, KeyEvent.KEYCODE_DPAD_RIGHT);
assertResetKeymap(customKeyComboCode, customKeyComboCode, defaultKeyComboCode,
defaultKeyComboCode);
}
public void testResetKeymapWithDefaultKeymap() {
setKeymapToDefaultKeymap();
assertResetKeymap(
KeyComboManager.getKeyComboCode(KeyEvent.META_ALT_ON, KeyEvent.KEYCODE_X),
KeyComboManager.getKeyComboCode(KeyComboModel.NO_MODIFIER, KeyEvent.KEYCODE_X),
KeyComboManager.getKeyComboCode(KeyEvent.META_ALT_ON, KeyEvent.KEYCODE_DPAD_RIGHT),
KeyComboManager.getKeyComboCode(KeyComboModel.NO_MODIFIER,
KeyEvent.KEYCODE_DPAD_RIGHT));
}
// TODO: add test cases to reset keymap while TalkBack is off.
public void testUnassignedKeyComboWithClassicKeymap() {
assertKeymapIsClassicKeymap();
assertSummaryOfUnassignedKeyCombo();
}
public void testUnassignedKeyComboWithDefaultKeymap() {
setKeymapToDefaultKeymap();
assertSummaryOfUnassignedKeyCombo();
}
private void assertKeymapIsClassicKeymap() {
TalkBackService talkBackService = TalkBackService.getInstance();
assertNotNull(talkBackService);
KeyComboManager keyComboManager = talkBackService.getKeyComboManager();
assertEquals(KeyComboModelApp.class, keyComboManager.getKeyComboModel().getClass());
}
private void setKeymapToDefaultKeymap() {
TalkBackService talkbackService = TalkBackService.getInstance();
assertNotNull(talkbackService);
KeyComboManager keyComboManager = talkbackService.getKeyComboManager();
DefaultKeyComboModel keyComboModel = new DefaultKeyComboModel(getActivity());
keyComboManager.setKeyComboModel(keyComboModel);
}
private void startTalkBackKeyboardShortcutPreferencesActivity() {
Intent intent = new Intent(getActivity(),
TalkBackKeyboardShortcutPreferencesActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
mPreferencesActivity = (TalkBackKeyboardShortcutPreferencesActivity) getInstrumentation()
.startActivitySync(intent);
}
private void assertResetKeymap(long customKeyComboCodeWithTriggerModifier,
long customKeyComboCodeWithoutTriggerModifier,
long defaultKeyComboCodeWithTriggerModifier,
long defaultKeyComboCodeWithoutTriggerModifier) {
TalkBackService talkBackService = TalkBackService.getInstance();
assertNotNull(talkBackService);
KeyComboManager keyComboManager = talkBackService.getKeyComboManager();
KeyComboModel keyComboModel = keyComboManager.getKeyComboModel();
// Change key combo code to custom one.
keyComboModel.saveKeyComboCode(
getActivity().getString(R.string.keycombo_shortcut_navigate_next),
customKeyComboCodeWithoutTriggerModifier);
// Start keyboard shortcut preference activity.
startTalkBackKeyboardShortcutPreferencesActivity();
// Confirm UI before reset.
String expectedBeforeReset = keyComboManager.getKeyComboStringRepresentation(
customKeyComboCodeWithTriggerModifier);
assertEquals(expectedBeforeReset, getDialogPreferenceSummary(
getActivity().getString(R.string.keycombo_shortcut_navigate_next)));
// Click reset keymap.
ClickResetKeymapRunnable clickResetKeymapRunnable = new ClickResetKeymapRunnable();
getInstrumentation().runOnMainSync(clickResetKeymapRunnable);
getInstrumentation().waitForIdleSync();
// Select reset in confirm dialog.
startRecordingUtterances();
int keyCodeToSelectReset =
getLayoutDirection(mPreferencesActivity.findViewById(android.R.id.content)) ==
View.LAYOUT_DIRECTION_RTL ?
KeyEvent.KEYCODE_DPAD_LEFT : KeyEvent.KEYCODE_DPAD_RIGHT;
sendKeyEventDownAndUp(KeyComboModel.NO_MODIFIER, keyCodeToSelectReset, keyComboManager);
sendKeyEventDownAndUp(KeyComboModel.NO_MODIFIER, KeyEvent.KEYCODE_ENTER, keyComboManager);
// Confirm that feedback is announced for resetting the keymap.
stopRecordingAndAssertUtterance(
getActivity().getString(R.string.keycombo_menu_announce_reset_keymap));
// Confirm that key combo is reset to default in the UI.
String expectedAfterReset = keyComboManager.getKeyComboStringRepresentation(
defaultKeyComboCodeWithTriggerModifier);
assertEquals(expectedAfterReset, getDialogPreferenceSummary(
getActivity().getString(R.string.keycombo_shortcut_navigate_next)));
// Confirm that key combo code is reset to default in the model.
assertEquals(defaultKeyComboCodeWithoutTriggerModifier,
keyComboModel.getKeyComboCodeForKey(
getActivity().getString(R.string.keycombo_shortcut_navigate_next)));
}
private void assertSummaryOfUnassignedKeyCombo() {
TalkBackService talkBackService = TalkBackService.getInstance();
assertNotNull(talkBackService);
KeyComboModel keyComboModel = talkBackService.getKeyComboManager().getKeyComboModel();
// Set key combo code for navigating to next item as unassigned.
keyComboModel.saveKeyComboCode(
getActivity().getString(R.string.keycombo_shortcut_navigate_next),
KeyComboModel.KEY_COMBO_CODE_UNASSIGNED);
startTalkBackKeyboardShortcutPreferencesActivity();
// Confirm that the summary is set to unassigned.
assertEquals(getActivity().getString(R.string.keycombo_unassigned),
getDialogPreferenceSummary(
getActivity().getString(R.string.keycombo_shortcut_navigate_next)));
}
/**
* Gets summary of specified key's dialog preference.
*/
private String getDialogPreferenceSummary(String key) {
GetDialogPreferenceSummaryRunnable runnable = new GetDialogPreferenceSummaryRunnable(key);
getInstrumentation().runOnMainSync(runnable);
getInstrumentation().waitForIdleSync();
return runnable.mSummary;
}
private class GetDialogPreferenceSummaryRunnable implements Runnable {
private final String mKey;
public String mSummary;
public GetDialogPreferenceSummaryRunnable(String key) {
mKey = key;
}
@Override
public void run() {
PreferenceFragment preferenceFragment = (PreferenceFragment) mPreferencesActivity
.getFragmentManager().findFragmentById(android.R.id.content);
DialogPreference dialogPreference = (DialogPreference) preferenceFragment
.findPreference(mKey);
mSummary = dialogPreference.getSummary().toString();
}
}
private class ClickResetKeymapRunnable implements Runnable {
@Override
public void run() {
TalkBackKeyboardShortcutPreferencesActivity.TalkBackKeyboardShortcutPreferenceFragment
preferenceFragment =
(TalkBackKeyboardShortcutPreferencesActivity.
TalkBackKeyboardShortcutPreferenceFragment) mPreferencesActivity
.getFragmentManager().findFragmentById(android.R.id.content);
preferenceFragment.performClickOnResetKeymapForTesting();
}
}
}