forked from flutter/flutter
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathusage.dart
More file actions
142 lines (109 loc) · 4.74 KB
/
usage.dart
File metadata and controls
142 lines (109 loc) · 4.74 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
// Copyright 2016 The Chromium 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 'dart:async';
import 'package:usage/usage_io.dart';
import 'base/context.dart';
import 'base/utils.dart';
import 'globals.dart';
import 'version.dart';
// TODO(devoncarew): We'll want to find a way to send (sanitized) command parameters.
const String _kFlutterUA = 'UA-67589403-6';
Usage get flutterUsage => Usage.instance;
class Usage {
/// Create a new Usage instance; [versionOverride] is used for testing.
Usage({ String settingsName: 'flutter', String versionOverride }) {
String version = versionOverride ?? FlutterVersion.getVersionString(whitelistBranchName: true);
_analytics = new AnalyticsIO(_kFlutterUA, settingsName, version);
bool runningOnCI = false;
// Many CI systems don't do a full git checkout.
if (version.endsWith('/unknown'))
runningOnCI = true;
// Check for common CI systems.
if (isRunningOnBot)
runningOnCI = true;
// If we think we're running on a CI system, default to not sending analytics.
_analytics.analyticsOpt = runningOnCI ? AnalyticsOpt.optIn : AnalyticsOpt.optOut;
}
/// Returns [Usage] active in the current app context.
static Usage get instance => context[Usage];
Analytics _analytics;
bool _printedUsage = false;
bool _suppressAnalytics = false;
bool get isFirstRun => _analytics.firstRun;
bool get enabled => _analytics.enabled;
bool get suppressAnalytics => _suppressAnalytics || _analytics.firstRun;
/// Suppress analytics for this session.
set suppressAnalytics(bool value) {
_suppressAnalytics = value;
}
/// Enable or disable reporting analytics.
set enabled(bool value) {
_analytics.enabled = value;
}
void sendCommand(String command) {
if (!suppressAnalytics)
_analytics.sendScreenView(command);
}
void sendEvent(String category, String parameter) {
if (!suppressAnalytics)
_analytics.sendEvent(category, parameter);
}
void sendTiming(String category, String variableName, Duration duration) {
_analytics.sendTiming(variableName, duration.inMilliseconds, category: category);
}
UsageTimer startTimer(String event) {
if (suppressAnalytics)
return new _MockUsageTimer();
else
return new UsageTimer._(event, _analytics.startTimer(event, category: 'flutter'));
}
void sendException(dynamic exception, StackTrace trace) {
if (!suppressAnalytics)
_analytics.sendException('${exception.runtimeType}\n${sanitizeStacktrace(trace)}');
}
/// Fires whenever analytics data is sent over the network; public for testing.
Stream<Map<String, dynamic>> get onSend => _analytics.onSend;
/// Returns when the last analytics event has been sent, or after a fixed
/// (short) delay, whichever is less.
Future<Null> ensureAnalyticsSent() async {
// TODO(devoncarew): This may delay tool exit and could cause some analytics
// events to not be reported. Perhaps we could send the analytics pings
// out-of-process from flutter_tools?
await _analytics.waitForLastPing(timeout: const Duration(milliseconds: 250));
}
void printUsage() {
if (_printedUsage)
return;
_printedUsage = true;
printStatus('');
printStatus('''
╔════════════════════════════════════════════════════════════════════════════╗
║ Welcome to Flutter! - https://flutter.io ║
║ ║
║ The Flutter tool anonymously reports feature usage statistics and basic ║
║ crash reports to Google in order to help Google contribute improvements to ║
║ Flutter over time. See Google's privacy policy: ║
║ https://www.google.com/intl/en/policies/privacy/ ║
║ ║
║ Use "flutter config --no-analytics" to disable analytics reporting. ║
╚════════════════════════════════════════════════════════════════════════════╝
''', emphasis: true);
}
}
class UsageTimer {
UsageTimer._(this.event, this._timer);
final String event;
final AnalyticsTimer _timer;
void finish() {
_timer.finish();
}
}
class _MockUsageTimer implements UsageTimer {
@override
String event;
@override
AnalyticsTimer _timer;
@override
void finish() { }
}