chromium/chromeos/ash/components/phonehub/recent_apps_interaction_handler.h

// Copyright 2021 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef CHROMEOS_ASH_COMPONENTS_PHONEHUB_RECENT_APPS_INTERACTION_HANDLER_H_
#define CHROMEOS_ASH_COMPONENTS_PHONEHUB_RECENT_APPS_INTERACTION_HANDLER_H_

#include <stdint.h>

#include "ash/webui/eche_app_ui/eche_connection_status_handler.h"
#include "base/gtest_prod_util.h"
#include "base/observer_list.h"
#include "base/observer_list_types.h"
#include "chromeos/ash/components/phonehub/notification.h"
#include "chromeos/ash/components/phonehub/proto/phonehub_api.pb.h"
#include "chromeos/ash/components/phonehub/recent_app_click_observer.h"

namespace ash::phonehub {

// The handler that exposes APIs to interact with Phone Hub Recent Apps.
// TODO(paulzchen): Implement Eche's RecentAppClickObserver and add/remove
// observer via this handler.
class RecentAppsInteractionHandler {
 public:
  class Observer : public base::CheckedObserver {
   public:
    ~Observer() override = default;
    // Notifies observers that recent apps view needs be refreshed, the access
    // state of recent apps feature is updated or current recent apps list has
    // changed.
    virtual void OnRecentAppsUiStateUpdated() = 0;
  };

  enum class RecentAppsUiState {
    // Feature is either not supported, or supported but disabled by user.
    HIDDEN,
    // Feature is supported and enabled but no recent app has been added yet.
    PLACEHOLDER_VIEW,
    // A bootstrap connection with the phone is being attempted.
    LOADING,
    // The bootstrap connection has failed.
    CONNECTION_FAILED,
    // We have recent app that can be displayed.
    ITEMS_VISIBLE,
  };

  // Records each users' quiet mode to decide showing recent apps or not.
  struct UserState {
    int64_t user_id;
    // The state when user turn on/off work apps/notification.
    bool is_enabled;
  };

  RecentAppsInteractionHandler(const RecentAppsInteractionHandler&) = delete;
  RecentAppsInteractionHandler& operator=(const RecentAppsInteractionHandler&) =
      delete;
  virtual ~RecentAppsInteractionHandler();

  void AddObserver(Observer* observer);
  void RemoveObserver(Observer* observer);
  RecentAppsUiState ui_state() { return ui_state_; }
  std::vector<UserState> user_states() { return user_states_; }
  void set_user_states(const std::vector<UserState>& user_states) {
    user_states_ = user_states;
  }

  virtual void AddRecentAppClickObserver(RecentAppClickObserver* observer);
  virtual void RemoveRecentAppClickObserver(RecentAppClickObserver* observer);

  virtual void SetConnectionStatusHandler(
      eche_app::EcheConnectionStatusHandler*
          eche_connection_status_handler) = 0;

  virtual void NotifyRecentAppClicked(
      const Notification::AppMetadata& app_metadata,
      eche_app::mojom::AppStreamLaunchEntryPoint entrypoint) = 0;
  virtual void NotifyRecentAppAddedOrUpdated(
      const Notification::AppMetadata& app_metadata,
      base::Time last_accessed_timestamp) = 0;
  virtual std::vector<Notification::AppMetadata>
  FetchRecentAppMetadataList() = 0;
  virtual void SetStreamableApps(
      const std::vector<Notification::AppMetadata>& streamable_apps) = 0;
  virtual void RemoveStreamableApp(const proto::App streamable_app) = 0;

  void set_ui_state_for_testing(RecentAppsUiState ui_state) {
    ui_state_ = ui_state;
  }

 protected:
  RecentAppsInteractionHandler();

  RecentAppsUiState ui_state_ = RecentAppsUiState::HIDDEN;
  void NotifyRecentAppsViewUiStateUpdated();

 private:
  base::ObserverList<RecentAppClickObserver> recent_app_click_observer_list_;
  base::ObserverList<Observer> observer_list_;
  std::vector<UserState> user_states_;
};

}  // namespace ash::phonehub

#endif  // CHROMEOS_ASH_COMPONENTS_PHONEHUB_RECENT_APPS_INTERACTION_HANDLER_H_