blob: b1bb25a6789a7c3696cd26ef073e5758772a7eda [file] [log] [blame]
// Copyright 2014 The Flutter Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
import 'package:unified_analytics/unified_analytics.dart';
/// Manages analytics reporting for widget preview events sent from the Flutter Tool.
///
/// The generated widget preview scaffold project will also report analytics via DTD.
class WidgetPreviewAnalytics {
WidgetPreviewAnalytics({required this.analytics});
final Analytics analytics;
final _launchTimer = Stopwatch();
final _reloadTimer = Stopwatch();
var _launchIncludedProjectGeneration = false;
/// The analytics workflow for tracking widget previewer timings.
static const kWorkflow = 'widget-preview';
/// The analytics event tracking widget previewer launch times.
static const kLaunchTime = 'launch-time';
/// The analytics event tracking widget preview reload times.
static const kPreviewReloadTime = 'preview-reload-time';
/// Provided as the label to [kLaunchTime] events if the widget preview scaffold project was
/// generated as part of the widget previewer starting up.
static const kScaffoldGeneratedLabel = 'scaffold-generated';
/// Starts the stopwatch tracking the widget previewer launch time.
void initializeLaunchStopwatch() {
assert(!_launchTimer.isRunning);
_launchTimer.start();
}
/// Report that the current invocation of the `widget-preview start` command resulted in the
/// widget preview scaffold project being regenerated.
void generatedProject() => _launchIncludedProjectGeneration = true;
/// Send an analytics event reporting how long it took for the widget previewer to start.
void reportLaunchTiming() {
assert(_launchTimer.isRunning);
_launchTimer.stop();
analytics.send(
Event.timing(
workflow: kWorkflow,
variableName: kLaunchTime,
elapsedMilliseconds: _launchTimer.elapsedMilliseconds,
label: _launchIncludedProjectGeneration ? kScaffoldGeneratedLabel : null,
),
);
}
/// Starts the stopwatch tracking the reload times for updated previews.
///
/// This should be invoked when a file system event is detected in the preview detector.
void startPreviewReloadStopwatch() {
assert(!_reloadTimer.isRunning);
_reloadTimer.start();
}
/// Send an analytics event reporting how long it took for a widget preview to be reloaded.
void reportPreviewReloadTiming() {
// TODO(bkonyi): only report when files are actually reloaded?
assert(_reloadTimer.isRunning);
_reloadTimer.stop();
analytics.send(
Event.timing(
workflow: kWorkflow,
variableName: kPreviewReloadTime,
elapsedMilliseconds: _reloadTimer.elapsedMilliseconds,
),
);
_reloadTimer.reset();
}
/// Stops the stopwatch tracking reload times for updated previews and resets the clock.
///
/// This should be invoked after a preview reload attempt has been completed, even if a reload
/// wasn't triggered due to no previews being changed.
void resetPreviewReloadStopwatch() {
_reloadTimer
..stop()
..reset();
}
}