/* * Copyright 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at: * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #pragma once #include #include #include #include #include #include "le_audio_types.h" #include "types/raw_address.h" namespace bluetooth::le_audio { namespace metrics { using ClockTimePoint = std::chrono::time_point; } enum ConnectionStatus : int32_t { UNKNOWN = 0, SUCCESS = 1, FAILED = 2, }; /* android.bluetooth.leaudio.ContextType */ enum class LeAudioMetricsContextType : int32_t { INVALID = 0, UNSPECIFIED = 1, COMMUNICATION = 2, MEDIA = 3, INSTRUCTIONAL = 4, ATTENTION_SEEKING = 5, IMMEDIATE_ALERT = 6, MAN_MACHINE = 7, EMERGENCY_ALERT = 8, RINGTONE = 9, TV = 10, LIVE = 11, GAME = 12, RFU = 13, }; class GroupMetrics { public: GroupMetrics() {} virtual ~GroupMetrics() {} virtual void AddStateChangedEvent(const RawAddress& address, bluetooth::le_audio::ConnectionState state, ConnectionStatus status) = 0; virtual void AddStreamStartedEvent( bluetooth::le_audio::types::LeAudioContextType context_type) = 0; virtual void AddStreamEndedEvent() = 0; virtual void SetGroupSize(int32_t group_size) = 0; virtual bool IsClosed() = 0; virtual void WriteStats() = 0; virtual void Flush() = 0; }; class MetricsCollector { public: static MetricsCollector* Get(); /** * Update the size of given group which will be used in the * LogMetricBluetoothLeAudioConnectionStateChanged() * * @param group_id ID of target group * @param group_size Size of target group */ void OnGroupSizeUpdate(int32_t group_id, int32_t group_size); /** * When there is a change in Bluetooth LE Audio connection state * * @param group_id Group ID of the associated device. * @param address Address of the associated device. * @param state New LE Audio connetion state. * @param status status or reason of the state transition. Ignored at * CONNECTING states. */ void OnConnectionStateChanged(int32_t group_id, const RawAddress& address, bluetooth::le_audio::ConnectionState state, ConnectionStatus status); /** * When there is a change in LE Audio stream started * * @param group_id Group ID of the associated stream. */ void OnStreamStarted( int32_t group_id, bluetooth::le_audio::types::LeAudioContextType context_type); /** * When there is a change in LE Audio stream started * * @param group_id Group ID of the associated stream. */ void OnStreamEnded(int32_t group_id); /** * When there is a change in Bluetooth LE Audio broadcast state * * @param started if broadcast streaming is started. */ void OnBroadcastStateChanged(bool started); /** * Flush all log to statsd * * @param group_id Group ID of the associated stream. */ void Flush(); protected: MetricsCollector() {} private: static MetricsCollector* instance; std::unordered_map> opened_groups_; std::unordered_map group_size_table_; metrics::ClockTimePoint broadcast_beginning_timepoint_; }; } // namespace bluetooth::le_audio