allow per-command analytics suppression (#3919)

* allow per-command analytics suppression

* rev the usage package dep
This commit is contained in:
Devon Carew 2016-05-15 20:06:27 -07:00
parent 4db64ace96
commit 483922d15c
5 changed files with 32 additions and 10 deletions

View file

@ -9,11 +9,9 @@ import '../runner/flutter_command.dart';
class ConfigCommand extends FlutterCommand { class ConfigCommand extends FlutterCommand {
ConfigCommand() { ConfigCommand() {
String usageStatus = flutterUsage.enabled ? 'enabled' : 'disabled';
argParser.addFlag('analytics', argParser.addFlag('analytics',
negatable: true, negatable: true,
help: 'Enable or disable reporting anonymously tool usage statistics and crash reports.\n(currently $usageStatus)'); help: 'Enable or disable reporting anonymously tool usage statistics and crash reports.');
} }
@override @override
@ -28,6 +26,9 @@ class ConfigCommand extends FlutterCommand {
@override @override
final List<String> aliases = <String>['configure']; final List<String> aliases = <String>['configure'];
@override
String get usageFooter => 'Analytics reporting is currently ${flutterUsage.enabled ? 'enabled' : 'disabled'}.';
@override @override
bool get requiresProjectRoot => false; bool get requiresProjectRoot => false;

View file

@ -44,6 +44,10 @@ class FlutterCommandRunner extends CommandRunner {
negatable: true, negatable: true,
hide: !verboseHelp, hide: !verboseHelp,
help: 'Whether to use terminal colors.'); help: 'Whether to use terminal colors.');
argParser.addFlag('suppress-analytics',
negatable: false,
hide: !verboseHelp,
help: 'Suppress analytics reporting when this command runs.');
String packagesHelp; String packagesHelp;
if (FileSystemEntity.isFileSync('.packages')) if (FileSystemEntity.isFileSync('.packages'))
@ -128,10 +132,13 @@ class FlutterCommandRunner extends CommandRunner {
if (globalResults.wasParsed('color')) if (globalResults.wasParsed('color'))
logger.supportsColor = globalResults['color']; logger.supportsColor = globalResults['color'];
// we must set Cache.flutterRoot early because other features use it // We must set Cache.flutterRoot early because other features use it (e.g.
// (e.g. enginePath's initialiser uses it) // enginePath's initialiser uses it).
Cache.flutterRoot = path.normalize(path.absolute(globalResults['flutter-root'])); Cache.flutterRoot = path.normalize(path.absolute(globalResults['flutter-root']));
if (globalResults['suppress-analytics'])
flutterUsage.suppressAnalytics = true;
_checkFlutterCopy(); _checkFlutterCopy();
PackageMap.instance = new PackageMap(path.normalize(path.absolute( PackageMap.instance = new PackageMap(path.normalize(path.absolute(

View file

@ -44,35 +44,43 @@ class Usage {
Analytics _analytics; Analytics _analytics;
bool _printedUsage = false; bool _printedUsage = false;
bool _suppressAnalytics = false;
bool get isFirstRun => _analytics.firstRun; bool get isFirstRun => _analytics.firstRun;
bool get enabled => _analytics.enabled; 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. /// Enable or disable reporting analytics.
set enabled(bool value) { set enabled(bool value) {
_analytics.enabled = value; _analytics.enabled = value;
} }
void sendCommand(String command) { void sendCommand(String command) {
if (!isFirstRun) if (!suppressAnalytics)
_analytics.sendScreenView(command); _analytics.sendScreenView(command);
} }
void sendEvent(String category, String parameter) { void sendEvent(String category, String parameter) {
if (!isFirstRun) if (!suppressAnalytics)
_analytics.sendEvent(category, parameter); _analytics.sendEvent(category, parameter);
} }
UsageTimer startTimer(String event) { UsageTimer startTimer(String event) {
if (isFirstRun) if (suppressAnalytics)
return new _MockUsageTimer(); return new _MockUsageTimer();
else else
return new UsageTimer._(event, _analytics.startTimer(event, category: 'flutter')); return new UsageTimer._(event, _analytics.startTimer(event, category: 'flutter'));
} }
void sendException(dynamic exception, StackTrace trace) { void sendException(dynamic exception, StackTrace trace) {
if (!isFirstRun) if (!suppressAnalytics)
_analytics.sendException('${exception.runtimeType}; ${sanitizeStacktrace(trace)}'); _analytics.sendException('${exception.runtimeType}; ${sanitizeStacktrace(trace)}');
} }

View file

@ -21,7 +21,7 @@ dependencies:
path: ^1.3.0 path: ^1.3.0
pub_semver: ^1.0.0 pub_semver: ^1.0.0
stack_trace: ^1.4.0 stack_trace: ^1.4.0
usage: ^2.2.0+1 usage: ^2.2.1
web_socket_channel: ^1.0.0 web_socket_channel: ^1.0.0
xml: ^2.4.1 xml: ^2.4.1
yaml: ^2.1.3 yaml: ^2.1.3

View file

@ -120,6 +120,12 @@ class MockUsage implements Usage {
@override @override
bool get isFirstRun => false; bool get isFirstRun => false;
@override
bool get suppressAnalytics => false;
@override
set suppressAnalytics(bool value) { }
@override @override
bool get enabled => true; bool get enabled => true;