| // Copyright 2019 The Fuchsia Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef SRC_SYS_ACTIVITY_ACTIVITY_STATE_MACHINE_H_ |
| #define SRC_SYS_ACTIVITY_ACTIVITY_STATE_MACHINE_H_ |
| |
| #include <fuchsia/ui/activity/cpp/fidl.h> |
| #include <lib/zx/time.h> |
| #include <zircon/types.h> |
| |
| #include <map> |
| #include <optional> |
| |
| #include "src/lib/fxl/macros.h" |
| |
| namespace activity { |
| |
| inline std::ostream& operator<<(std::ostream& os, fuchsia::ui::activity::State s) { |
| switch (s) { |
| case fuchsia::ui::activity::State::UNKNOWN: |
| return os << "UNKNOWN"; |
| case fuchsia::ui::activity::State::IDLE: |
| return os << "IDLE"; |
| case fuchsia::ui::activity::State::ACTIVE: |
| return os << "ACTIVE"; |
| default: |
| os.setstate(std::ios_base::failbit); |
| return os; |
| } |
| } |
| |
| // Input events. |
| enum Event { USER_INPUT, TIMEOUT }; |
| |
| inline std::ostream& operator<<(std::ostream& os, Event s) { |
| switch (s) { |
| case Event::USER_INPUT: |
| return os << "USER_INPUT"; |
| case Event::TIMEOUT: |
| return os << "TIMEOUT"; |
| default: |
| os.setstate(std::ios_base::failbit); |
| return os; |
| } |
| } |
| |
| // ActivityStateMachine is a state machine which take system and user activity as input and |
| // determine the current activity state of the system as output. |
| class ActivityStateMachine { |
| public: |
| ActivityStateMachine() = default; |
| ~ActivityStateMachine() = default; |
| |
| // Provide input to the state machine. |
| void ReceiveEvent(Event event); |
| |
| // Poll the current state of the state machine. |
| fuchsia::ui::activity::State state() const { return state_; } |
| |
| // Returns the time in a state after which, if is no input is received, an |
| // Event::TIMEOUT should be delivered to the state machine. |
| // If the return is absent then the state should never receive Event::TIMEOUT. |
| static std::optional<zx::duration> TimeoutFor(fuchsia::ui::activity::State state); |
| |
| // Translations from FIDL activities to internal Events. |
| |
| // Translate |activity| to an appropriate Event. |
| constexpr static Event EventForDiscreteActivity( |
| const fuchsia::ui::activity::DiscreteActivity& activity) { |
| return Event::USER_INPUT; |
| } |
| // Returns an Event which should be delivered as an ongoing activity starts. |
| constexpr static Event EventForOngoingActivityStart() { return Event::USER_INPUT; } |
| // Returns an Event which should be delivered as an ongoing activity ends. |
| constexpr static Event EventForOngoingActivityEnd() { return Event::USER_INPUT; } |
| |
| using StateTable = |
| std::map<std::pair<fuchsia::ui::activity::State, Event>, fuchsia::ui::activity::State>; |
| |
| private: |
| fuchsia::ui::activity::State state_ = fuchsia::ui::activity::State::IDLE; |
| |
| const static StateTable kStateTable; |
| const static zx::duration kIdleDuration; |
| |
| FXL_DISALLOW_COPY_AND_ASSIGN(ActivityStateMachine); |
| }; |
| |
| } // namespace activity |
| |
| #endif // SRC_SYS_ACTIVITY_ACTIVITY_STATE_MACHINE_H_ |