# Lint as: python2, python3 # Copyright 2021 The Chromium OS Authors. All rights reserved. # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. import abc import logging import six @six.add_metaclass(abc.ABCMeta) class _BaseMenuNavigator: """Abstract base class for menu navigator.""" def __init__(self, test): self.test = test self.faft_config = self.test.faft_config self.servo = self.test.servo @abc.abstractmethod def up(self): """Navigate up in the menu.""" raise NotImplementedError @abc.abstractmethod def down(self): """Navigate down in the menu.""" raise NotImplementedError @abc.abstractmethod def select(self, msg=None): """Select a menu item.""" raise NotImplementedError def move_to(self, from_idx, to_idx): """Move from 'from_idx' to 'to_idx' by menu up/down.""" if from_idx > to_idx: for _ in range(from_idx, to_idx, -1): self.up() self.test.wait_for('keypress_delay') elif from_idx < to_idx: for _ in range(from_idx, to_idx, 1): self.down() self.test.wait_for('keypress_delay') class _KeyboardMenuNavigator(_BaseMenuNavigator): """Navigate with arrow and function keys.""" def up(self): """Navigate up in the menu.""" self.servo.arrow_up() def down(self): """Navigate down in the menu.""" self.servo.arrow_down() def select(self, msg=None): """Select a menu item.""" if msg: logging.info(msg) self.servo.enter_key() class _DetachableMenuNavigator(_BaseMenuNavigator): """Navigate with physical buttons for tablet or detachable devices.""" def up(self): """Navigate up in the menu.""" self.servo.set_nocheck('volume_up_hold', 100) def down(self): """Navigate down in the menu.""" self.servo.set_nocheck('volume_down_hold', 100) def select(self, msg=None): """Select a menu item.""" if msg: logging.info(msg) self.servo.power_short_press() def create_menu_navigator(faft_framework): """Create a proper navigator based on whether or not it is detachable""" if faft_framework.faft_config.is_detachable: return _DetachableMenuNavigator(faft_framework) else: return _KeyboardMenuNavigator(faft_framework)