xref: /aosp_15_r20/external/autotest/client/cros/multimedia/input_facade.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 Li"""An interface to access the local input facade."""
6*9c5db199SXin Li
7*9c5db199SXin Li
8*9c5db199SXin Liimport json
9*9c5db199SXin Liimport logging
10*9c5db199SXin Liimport threading
11*9c5db199SXin Li
12*9c5db199SXin Lifrom autotest_lib.client.bin.input import input_event_recorder
13*9c5db199SXin Lifrom autotest_lib.client.cros.input_playback import input_playback
14*9c5db199SXin Lifrom autotest_lib.client.common_lib import error
15*9c5db199SXin Lifrom autotest_lib.client.cros.graphics import graphics_utils
16*9c5db199SXin Li
17*9c5db199SXin Li
18*9c5db199SXin Liclass InputFacadeLocalError(Exception):
19*9c5db199SXin Li    """Error in InputFacadeLocal."""
20*9c5db199SXin Li    pass
21*9c5db199SXin Li
22*9c5db199SXin Li
23*9c5db199SXin Liclass InputFacadeLocal(object):
24*9c5db199SXin Li    """Facade to access the record input events."""
25*9c5db199SXin Li
26*9c5db199SXin Li    def __init__(self):
27*9c5db199SXin Li        """Initializes the input facade."""
28*9c5db199SXin Li        self.recorders_lock = threading.Lock()
29*9c5db199SXin Li        self.recorders = dict()
30*9c5db199SXin Li
31*9c5db199SXin Li    def initialize_input_playback(self, input_type='keyboard', property_file=None):
32*9c5db199SXin Li        """Initialize for input events simulation.
33*9c5db199SXin Li
34*9c5db199SXin Li        @param input_type: the name of the input device.
35*9c5db199SXin Li        @param property_file: Property file of device to be emulated.
36*9c5db199SXin Li        """
37*9c5db199SXin Li        self._player = input_playback.InputPlayback()
38*9c5db199SXin Li        self._player.emulate(input_type=input_type, property_file=property_file)
39*9c5db199SXin Li        self._player.find_connected_inputs()
40*9c5db199SXin Li
41*9c5db199SXin Li    def initialize_input_recorder(self, device_name, uniq):
42*9c5db199SXin Li        """Initialize an input event recorder object.
43*9c5db199SXin Li
44*9c5db199SXin Li        @param device_name: the name of the input device to record.
45*9c5db199SXin Li        @param uniq: Unique address of input device (None if not used)
46*9c5db199SXin Li
47*9c5db199SXin Li        """
48*9c5db199SXin Li        with self.recorders_lock:
49*9c5db199SXin Li            self.recorders[device_name] = \
50*9c5db199SXin Li                input_event_recorder.InputEventRecorder(device_name, uniq)
51*9c5db199SXin Li            logging.info('input event device: %s [uniq=%s] (%s)',
52*9c5db199SXin Li                         self.recorders[device_name].device_name,
53*9c5db199SXin Li                         self.recorders[device_name].uniq,
54*9c5db199SXin Li                         self.recorders[device_name].device_node)
55*9c5db199SXin Li
56*9c5db199SXin Li
57*9c5db199SXin Li    def clear_input_events(self, device_name):
58*9c5db199SXin Li        """Clear the event list.
59*9c5db199SXin Li
60*9c5db199SXin Li        @param device_name: the name of the input device to record.
61*9c5db199SXin Li
62*9c5db199SXin Li        """
63*9c5db199SXin Li        with self.recorders_lock:
64*9c5db199SXin Li            if self.recorders[device_name] is None:
65*9c5db199SXin Li                raise error.TestError(
66*9c5db199SXin Li                    'input facade: input device name not given')
67*9c5db199SXin Li            self.recorders[device_name].clear_events()
68*9c5db199SXin Li
69*9c5db199SXin Li
70*9c5db199SXin Li    def start_input_recorder(self, device_name):
71*9c5db199SXin Li        """Start the recording thread.
72*9c5db199SXin Li
73*9c5db199SXin Li        @param device_name: the name of the input device to record.
74*9c5db199SXin Li
75*9c5db199SXin Li        """
76*9c5db199SXin Li        with self.recorders_lock:
77*9c5db199SXin Li            if self.recorders[device_name] is None:
78*9c5db199SXin Li                raise error.TestError(
79*9c5db199SXin Li                    'input facade: input device name not given')
80*9c5db199SXin Li            self.recorders[device_name].start()
81*9c5db199SXin Li
82*9c5db199SXin Li
83*9c5db199SXin Li    def stop_input_recorder(self, device_name):
84*9c5db199SXin Li        """Stop the recording thread.
85*9c5db199SXin Li
86*9c5db199SXin Li        @param device_name: the name of the input device to record.
87*9c5db199SXin Li
88*9c5db199SXin Li        """
89*9c5db199SXin Li        with self.recorders_lock:
90*9c5db199SXin Li            if self.recorders[device_name] is None:
91*9c5db199SXin Li                raise error.TestError(
92*9c5db199SXin Li                    'input facade: input device name not given')
93*9c5db199SXin Li            self.recorders[device_name].stop()
94*9c5db199SXin Li
95*9c5db199SXin Li
96*9c5db199SXin Li    def get_input_events(self, device_name):
97*9c5db199SXin Li        """Get the bluetooth device input events.
98*9c5db199SXin Li
99*9c5db199SXin Li        @param device_name: the name of the input device to record.
100*9c5db199SXin Li
101*9c5db199SXin Li        @returns: the recorded input events.
102*9c5db199SXin Li
103*9c5db199SXin Li        """
104*9c5db199SXin Li        with self.recorders_lock:
105*9c5db199SXin Li            if self.recorders[device_name] is None:
106*9c5db199SXin Li                raise error.TestError(
107*9c5db199SXin Li                    'input facade: input device name not given')
108*9c5db199SXin Li            events = self.recorders[device_name].get_events()
109*9c5db199SXin Li        return json.dumps(events)
110*9c5db199SXin Li
111*9c5db199SXin Li
112*9c5db199SXin Li    def press_keys(self, key_list):
113*9c5db199SXin Li        """ Simulating key press
114*9c5db199SXin Li
115*9c5db199SXin Li        @param key_list: A list of key strings, e.g. ['LEFTCTRL', 'F4']
116*9c5db199SXin Li        """
117*9c5db199SXin Li        graphics_utils.press_keys(key_list)
118*9c5db199SXin Li
119*9c5db199SXin Li
120*9c5db199SXin Li    def blocking_playback_of_default_file(self, input_type, filename):
121*9c5db199SXin Li        """Simulate events
122*9c5db199SXin Li
123*9c5db199SXin Li        @param input_type: input device name
124*9c5db199SXin Li        @param filename: input events
125*9c5db199SXin Li        """
126*9c5db199SXin Li        self._player.blocking_playback_of_default_file(input_type=input_type,
127*9c5db199SXin Li                                                       filename=filename)
128