1*9c5db199SXin Li# Copyright 2017 The Chromium OS Authors. All rights reserved. 2*9c5db199SXin Li# Use of this source code is governed by a BSD-style license that can be 3*9c5db199SXin Li# found in the LICENSE file. 4*9c5db199SXin Li 5*9c5db199SXin Liimport os 6*9c5db199SXin Li 7*9c5db199SXin Lifrom autotest_lib.client.common_lib import error 8*9c5db199SXin Lifrom autotest_lib.client.cros.input_playback import input_playback 9*9c5db199SXin Li 10*9c5db199SXin Li_KEYBOARD = 'keyboard' 11*9c5db199SXin Li_KEY_FILENAME = 'keyboard_%s' 12*9c5db199SXin Li 13*9c5db199SXin Liclass Keyboard(object): 14*9c5db199SXin Li """An emulated keyboard device used for UI automation.""" 15*9c5db199SXin Li 16*9c5db199SXin Li def __init__(self): 17*9c5db199SXin Li """Prepare an emulated keyboard device.""" 18*9c5db199SXin Li self.dirname = os.path.dirname(__file__) 19*9c5db199SXin Li # Create an emulated keyboard device. 20*9c5db199SXin Li self.keyboard = input_playback.InputPlayback() 21*9c5db199SXin Li self.keyboard.emulate(input_type=_KEYBOARD) 22*9c5db199SXin Li self.keyboard.find_connected_inputs() 23*9c5db199SXin Li 24*9c5db199SXin Li def press_key(self, key): 25*9c5db199SXin Li """Replay the recorded key events if exists. 26*9c5db199SXin Li 27*9c5db199SXin Li @param key: the target key name, e.g. f1, f2, tab or combination of keys 28*9c5db199SXin Li 'alt+shift+i', 'ctrl+f5', etc. 29*9c5db199SXin Li 30*9c5db199SXin Li """ 31*9c5db199SXin Li event_file = os.path.join(self.dirname, _KEY_FILENAME % key) 32*9c5db199SXin Li if not os.path.exists(event_file): 33*9c5db199SXin Li raise error.TestError('No such key file keyboard_%s in %s' 34*9c5db199SXin Li % (key, self.dirname)) 35*9c5db199SXin Li self.keyboard.blocking_playback(filepath=event_file, 36*9c5db199SXin Li input_type=_KEYBOARD) 37*9c5db199SXin Li 38*9c5db199SXin Li def playback(self, event_file): 39*9c5db199SXin Li """Replay the specified key events file. 40*9c5db199SXin Li 41*9c5db199SXin Li @param event_file: the filename of the key events 42*9c5db199SXin Li 43*9c5db199SXin Li """ 44*9c5db199SXin Li self.keyboard.blocking_playback(filepath=event_file, 45*9c5db199SXin Li input_type=_KEYBOARD) 46*9c5db199SXin Li 47*9c5db199SXin Li def close(self): 48*9c5db199SXin Li """Clean up the files/handles created in the class.""" 49*9c5db199SXin Li if self.keyboard: 50*9c5db199SXin Li self.keyboard.close() 51*9c5db199SXin Li self.keyboard = None 52*9c5db199SXin Li 53*9c5db199SXin Li def __enter__(self): 54*9c5db199SXin Li """Allow usage in 'with' statements.""" 55*9c5db199SXin Li return self 56*9c5db199SXin Li 57*9c5db199SXin Li def __exit__(self, exc_type, exc_val, exc_tb): 58*9c5db199SXin Li """Release resources on completion of a 'with' statement.""" 59*9c5db199SXin Li self.close() 60