// Copyright 2020 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "ash/system/phonehub/onboarding_view.h"
#include <algorithm>
#include <memory>
#include <string>
#include <vector>
#include "ash/public/cpp/resources/grit/ash_public_unscaled_resources.h"
#include "ash/public/cpp/system_tray_client.h"
#include "ash/root_window_controller.h"
#include "ash/shell.h"
#include "ash/strings/grit/ash_strings.h"
#include "ash/style/ash_color_provider.h"
#include "ash/style/pill_button.h"
#include "ash/system/model/system_tray_model.h"
#include "ash/system/phonehub/phone_hub_content_view.h"
#include "ash/system/phonehub/phone_hub_interstitial_view.h"
#include "ash/system/phonehub/phone_hub_metrics.h"
#include "ash/system/phonehub/phone_hub_tray.h"
#include "ash/system/phonehub/phone_hub_view_ids.h"
#include "ash/system/status_area_widget.h"
#include "ash/system/tray/tray_bubble_view.h"
#include "base/functional/bind.h"
#include "base/memory/raw_ptr.h"
#include "base/strings/strcat.h"
#include "chromeos/ash/components/phonehub/onboarding_ui_tracker.h"
#include "ui/base/l10n/l10n_util.h"
#include "ui/base/metadata/metadata_impl_macros.h"
#include "ui/base/resource/resource_bundle.h"
#include "ui/chromeos/devicetype_utils.h"
#include "ui/views/layout/fill_layout.h"
namespace ash {
using phone_hub_metrics::InterstitialScreenEvent;
using phone_hub_metrics::Screen;
// OnboardingMainView ---------------------------------------------------------
// Main onboarding screen with Phone Hub feature description and two buttons
// (Get Started and Dismiss), where user can either choose to grant permission
// to enable this feature or dismiss the screen.
class OnboardingMainView : public PhoneHubInterstitialView {
METADATA_HEADER(OnboardingMainView, PhoneHubInterstitialView)
public:
OnboardingMainView(phonehub::OnboardingUiTracker* onboarding_ui_tracker,
OnboardingView* parent_view,
OnboardingView::OnboardingFlow onboarding_flow)
: PhoneHubInterstitialView(/*show_progress=*/false),
onboarding_ui_tracker_(onboarding_ui_tracker),
parent_view_(parent_view),
onboarding_flow_(onboarding_flow) {
SetID(PhoneHubViewID::kOnboardingMainView);
InitLayout();
}
// PhoneHubInterstitialView:
Screen GetScreenForMetrics() const override {
switch (onboarding_flow_) {
case OnboardingView::kExistingMultideviceUser:
return Screen::kOnboardingExistingMultideviceUser;
case OnboardingView::kNewMultideviceUser:
return Screen::kOnboardingNewMultideviceUser;
}
}
private:
void InitLayout() {
SetImage(ui::ResourceBundle::GetSharedInstance().GetThemedLottieImageNamed(
IDR_PHONE_HUB_ONBOARDING_IMAGE));
SetTitle(
l10n_util::GetStringUTF16(IDS_ASH_PHONE_HUB_ONBOARDING_DIALOG_TITLE));
SetDescription(l10n_util::GetStringUTF16(
IDS_ASH_PHONE_HUB_ONBOARDING_DIALOG_DESCRIPTION));
auto get_started = std::make_unique<PillButton>(
base::BindRepeating(&OnboardingMainView::GetStartedButtonPressed,
base::Unretained(this)),
l10n_util::GetStringUTF16(
IDS_ASH_PHONE_HUB_ONBOARDING_DIALOG_GET_STARTED_BUTTON),
PillButton::Type::kPrimaryWithoutIcon,
/*icon=*/nullptr);
get_started->SetID(PhoneHubViewID::kOnboardingGetStartedButton);
AddButton(std::move(get_started));
}
void GetStartedButtonPressed() {
LogInterstitialScreenEvent(InterstitialScreenEvent::kConfirm);
onboarding_ui_tracker_->HandleGetStarted(
parent_view_->IsOnboardingViewStartedFromNudge());
}
raw_ptr<phonehub::OnboardingUiTracker> onboarding_ui_tracker_ = nullptr;
raw_ptr<OnboardingView> parent_view_ = nullptr;
const OnboardingView::OnboardingFlow onboarding_flow_;
};
BEGIN_METADATA(OnboardingMainView)
END_METADATA
// OnboardingView -------------------------------------------------------------
OnboardingView::OnboardingView(
phonehub::OnboardingUiTracker* onboarding_ui_tracker,
Delegate* delegate,
OnboardingFlow onboarding_flow)
: onboarding_ui_tracker_(onboarding_ui_tracker), delegate_(delegate) {
SetID(PhoneHubViewID::kOnboardingView);
SetLayoutManager(std::make_unique<views::FillLayout>());
main_view_ = AddChildView(std::make_unique<OnboardingMainView>(
onboarding_ui_tracker_, this, onboarding_flow));
LogInterstitialScreenEvent(InterstitialScreenEvent::kShown);
}
OnboardingView::~OnboardingView() = default;
void OnboardingView::OnBubbleClose() {
main_view_->OnBubbleClose();
}
Screen OnboardingView::GetScreenForMetrics() const {
return main_view_->GetScreenForMetrics();
}
bool OnboardingView::IsOnboardingViewStartedFromNudge() {
if (!delegate_) {
return false;
}
return delegate_->IsPhoneHubIconClickedWhenNudgeVisible();
}
BEGIN_METADATA(OnboardingView)
END_METADATA
} // namespace ash