// 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 ASH_METRICS_STYLUS_METRICS_RECORDER_H_
#define ASH_METRICS_STYLUS_METRICS_RECORDER_H_
#include <optional>
#include "ash/ash_export.h"
#include "ash/system/power/peripheral_battery_listener.h"
#include "chromeos/ash/components/feature_usage/feature_usage_metrics.h"
namespace ash {
// Combine delegate callbacks and FeatureUsageMetrics state for each metric.
class StylusSessionMetricsDelegate final
: public feature_usage::FeatureUsageMetrics::Delegate {
public:
explicit StylusSessionMetricsDelegate(const std::string& feature_name);
StylusSessionMetricsDelegate(const StylusSessionMetricsDelegate&) = delete;
StylusSessionMetricsDelegate& operator=(const StylusSessionMetricsDelegate&) =
delete;
~StylusSessionMetricsDelegate() final;
// feature_usage::FeatureUsageMetrics::Delegate:
bool IsEligible() const final;
bool IsEnabled() const final;
void SetState(bool now_capable, bool in_session);
private:
bool capable_ = false;
bool active_ = false;
feature_usage::FeatureUsageMetrics metrics_;
};
// A metrics recorder that records stylus related metrics.
class ASH_EXPORT StylusMetricsRecorder
: public PeripheralBatteryListener::Observer {
public:
StylusMetricsRecorder();
StylusMetricsRecorder(const StylusMetricsRecorder&) = delete;
StylusMetricsRecorder& operator=(const StylusMetricsRecorder&) = delete;
~StylusMetricsRecorder() override;
// ash::PeripheralBatteryListener::Observer:
void OnAddingBattery(
const PeripheralBatteryListener::BatteryInfo& battery) override;
void OnRemovingBattery(
const PeripheralBatteryListener::BatteryInfo& battery) override;
void OnUpdatedBatteryLevel(
const PeripheralBatteryListener::BatteryInfo& battery) override;
private:
void UpdateStylusState();
std::optional<bool> stylus_on_charge_ = std::nullopt;
// Indicate whether a stylus garage is known to be present on this device:
// garage refers to a charger that holds the stylus within the body of the
// device, and can detect whether the stylus is currently 'garaged'.
bool stylus_garage_present_ = false;
// Indicate whether a stylus dock is known to be present on this device:
// dock refers to a charger that holds the stylus to the body of the device,
// and can detect whether stylus is currently 'docked'.
bool stylus_dock_present_ = false;
StylusSessionMetricsDelegate
stylus_detached_from_garage_session_metrics_delegate_{
"StylusDetachedFromGarageSession"};
StylusSessionMetricsDelegate
stylus_detached_from_dock_session_metrics_delegate_{
"StylusDetachedFromDockSession"};
StylusSessionMetricsDelegate
stylus_detached_from_garage_or_dock_session_metrics_delegate_{
"StylusDetachedFromGarageOrDockSession"};
};
} // namespace ash
#endif // ASH_METRICS_STYLUS_METRICS_RECORDER_H_