#ifndef ASH_SYSTEM_PHONEHUB_PHONE_HUB_UI_CONTROLLER_H_
#define ASH_SYSTEM_PHONEHUB_PHONE_HUB_UI_CONTROLLER_H_
#include "ash/ash_export.h"
#include "ash/public/cpp/session/session_observer.h"
#include "ash/system/phonehub/onboarding_view.h"
#include "ash/system/phonehub/phone_hub_content_view.h"
#include "ash/system/phonehub/phone_status_view.h"
#include "base/memory/raw_ptr.h"
#include "base/observer_list.h"
#include "base/observer_list_types.h"
#include "base/timer/timer.h"
#include "chromeos/ash/components/phonehub/app_stream_launcher_data_model.h"
#include "chromeos/ash/components/phonehub/feature_status_provider.h"
#include "chromeos/ash/components/phonehub/onboarding_ui_tracker.h"
#include "chromeos/ash/components/phonehub/phone_model.h"
namespace views {
class View;
}
namespace ash {
namespace phonehub {
class PhoneHubManager;
}
class ASH_EXPORT PhoneHubUiController
: public phonehub::FeatureStatusProvider::Observer,
public phonehub::OnboardingUiTracker::Observer,
public phonehub::PhoneModel::Observer,
public phonehub::AppStreamLauncherDataModel::Observer,
public SessionObserver {
public:
class Observer : public base::CheckedObserver {
public:
~Observer() override = default;
virtual void OnPhoneHubUiStateChanged() = 0;
};
enum class UiState {
kHidden = 0,
kOnboardingWithoutPhone,
kOnboardingWithPhone,
kBluetoothDisabled,
kPhoneConnecting,
kPhoneDisconnected,
kPhoneConnected,
kTetherConnectionPending,
kMiniLauncher,
kMaxValue = kMiniLauncher
};
PhoneHubUiController();
PhoneHubUiController(const PhoneHubUiController&) = delete;
~PhoneHubUiController() override;
PhoneHubUiController& operator=(const PhoneHubUiController&) = delete;
void SetPhoneHubManager(phonehub::PhoneHubManager* phone_hub_manager);
std::unique_ptr<PhoneHubContentView> CreateContentView(
OnboardingView::Delegate* delegate);
std::unique_ptr<views::View> CreateStatusHeaderView(
PhoneStatusView::Delegate* delegate);
void HandleBubbleOpened();
void AddObserver(Observer* observer);
void RemoveObserver(Observer* observer);
UiState ui_state() const { return ui_state_; }
private:
void OnFeatureStatusChanged() override;
void OnShouldShowOnboardingUiChanged() override;
void OnShouldShowMiniLauncherChanged() override;
void OnModelChanged() override;
void OnActiveUserSessionChanged(const AccountId& account_id) override;
void UpdateUiState(PhoneHubUiController::UiState new_state);
UiState GetUiStateFromPhoneHubManager();
UiState GetUiStateFromPhoneHubManagerInternal();
void CleanUpPhoneHubManager();
void OnConnectingViewTimerEnd();
void RecordStatusOnBubbleOpened();
void OnGetHostLastSeenTimestamp(UiState ui_state_when_opened,
std::optional<base::Time> timestamp);
raw_ptr<phonehub::PhoneHubManager> phone_hub_manager_ = nullptr;
UiState ui_state_ = UiState::kHidden;
bool has_requested_tether_scan_during_session_ = false;
base::ObserverList<Observer> observer_list_;
base::OneShotTimer connecting_view_grace_period_timer_;
base::WeakPtrFactory<PhoneHubUiController> weak_ptr_factory_{this};
};
}
#endif