xref: /aosp_15_r20/external/autotest/client/cros/input_playback/keyboard.py (revision 9c5db1993ded3edbeafc8092d69fe5de2ee02df7)
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