// 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.
#ifndef ASH_AMBIENT_UI_GLANCEABLE_INFO_VIEW_H_
#define ASH_AMBIENT_UI_GLANCEABLE_INFO_VIEW_H_
#include "ash/ambient/model/ambient_weather_model.h"
#include "ash/ambient/model/ambient_weather_model_observer.h"
#include "ash/ash_export.h"
#include "base/memory/raw_ptr.h"
#include "base/scoped_observation.h"
#include "third_party/skia/include/core/SkColor.h"
#include "ui/color/color_id.h"
#include "ui/views/view.h"
namespace views {
class ImageView;
class Label;
} // namespace views
namespace ash {
class AmbientViewDelegate;
class TimeView;
// Container for displaying a glanceable clock and weather info.
class ASH_EXPORT GlanceableInfoView : public views::View,
public AmbientWeatherModelObserver {
METADATA_HEADER(GlanceableInfoView, views::View)
public:
class Delegate {
public:
virtual ~Delegate() = default;
// Returns the color for time and temperature text in |GlanceableInfoView|.
virtual SkColor GetTimeTemperatureFontColor() = 0;
};
GlanceableInfoView(
AmbientViewDelegate* delegate,
GlanceableInfoView::Delegate* glanceable_info_view_delegate,
int time_font_size_dip,
bool add_text_shadow);
GlanceableInfoView(const GlanceableInfoView&) = delete;
GlanceableInfoView& operator=(const GlanceableInfoView&) = delete;
~GlanceableInfoView() override;
// views::View:
void OnThemeChanged() override;
// AmbientWeatherModelObserver:
void OnWeatherInfoUpdated() override;
void ShowWeather();
int GetTimeFontDescent();
bool IsWeatherConditionIconSetForTesting() const;
bool IsTemperatureSetForTesting() const;
private:
void InitLayout();
std::u16string GetTemperatureText() const;
// View for the time info. Owned by the view hierarchy.
raw_ptr<TimeView> time_view_ = nullptr;
// Views for weather icon and temperature.
raw_ptr<views::ImageView> weather_condition_icon_ = nullptr;
raw_ptr<views::Label> temperature_ = nullptr;
// Owned by |AmbientController|.
const raw_ptr<AmbientViewDelegate> delegate_ = nullptr;
// Unowned. Must out live |GlancealeInfoView|.
raw_ptr<GlanceableInfoView::Delegate> const glanceable_info_view_delegate_ =
nullptr;
const int time_font_size_dip_;
const bool add_text_shadow_;
base::ScopedObservation<AmbientWeatherModel, AmbientWeatherModelObserver>
scoped_weather_model_observer_{this};
};
} // namespace ash
#endif // ASH_AMBIENT_UI_GLANCEABLE_INFO_VIEW_H_