// Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file // for details. 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:io'; import 'package:path/path.dart' as path; import 'package:usage/src/usage_impl.dart'; import 'package:usage/src/usage_impl_io.dart'; import 'package:usage/src/usage_impl_io.dart' as usage_io show getDartVersion; import 'package:usage/usage.dart'; import 'package:usage/usage_io.dart'; export 'package:usage/usage.dart' show Analytics; // TODO(devoncarew): Hard-coded to off for now. Remove when we're ready to ship. final bool _HARD_CODE_OFF = true; // TODO(devoncarew): Don't show the UI until we're ready to ship. final bool SHOW_ANALYTICS_UI = false; final String _dartDirectoryName = '.dart'; final String _settingsFileName = 'analytics.json'; /// Dart SDK tools with analytics should display this notice. /// /// In addition, they should support displaying the analytics' status, and have /// a flag to toggle analytics. This may look something like: /// /// `Analytics are currently enabled (and can be disabled with --no-analytics).` final String analyticsNotice = "Dart SDK tools anonymously report feature usage statistics and basic crash\n" "reports to help improve Dart tools over time. See Google's privacy policy:\n" "https://www.google.com/intl/en/policies/privacy/."; /// Return a customized message for command-line tools to display about the /// state of analytics, and how users can enabled or disable analytics. /// /// An example return value might be `'Analytics are currently enabled (and can /// be disabled with --no-analytics).'` String createAnalyticsStatusMessage(bool enabled, {String command: 'analytics'}) { String currentState = enabled ? 'enabled' : 'disabled'; String toggleState = enabled ? 'disabled' : 'enabled'; String commandToggle = enabled ? 'no-$command' : command; return 'Analytics are currently $currentState ' '(and can be $toggleState with --$commandToggle).'; } /// Create an [Analytics] instance with the given trackingID and /// applicationName. /// /// This analytics instance will share a common enablement state with the rest /// of the Dart SDK tools. Analytics createAnalyticsInstance(String trackingId, String applicationName, {bool disableForSession: false}) { Directory dir = getDartStorageDirectory(); if (!dir.existsSync()) { dir.createSync(); } if (_HARD_CODE_OFF) { disableForSession = true; } File file = new File(path.join(dir.path, _settingsFileName)); return new _TelemetryAnalytics( trackingId, applicationName, getDartVersion(), file, disableForSession); } /// The directory used to store the analytics settings file. /// /// Typically, the directory is `~/.dart/` (and the settings file is /// `analytics.json`). Directory getDartStorageDirectory() => new Directory(path.join(userHomeDir(), _dartDirectoryName)); /// Return the version of the Dart SDK. String getDartVersion() => usage_io.getDartVersion(); class _TelemetryAnalytics extends AnalyticsImpl { final bool disableForSession; _TelemetryAnalytics( String trackingId, String applicationName, String applicationVersion, File file, this.disableForSession, ) : super( trackingId, new IOPersistentProperties.fromFile(file), new IOPostHandler(), applicationName: applicationName, applicationVersion: applicationVersion, ) { final String locale = getPlatformLocale(); if (locale != null) { setSessionValue('ul', locale); } } @override bool get enabled { if (disableForSession || isRunningOnBot()) { return false; } return super.enabled; } } bool isRunningOnBot() { // - https://docs.travis-ci.com/user/environment-variables/ // - https://www.appveyor.com/docs/environment-variables/ // - CHROME_HEADLESS and BUILDBOT_BUILDERNAME are properties on Chrome infra // bots. return Platform.environment['TRAVIS'] == 'true' || Platform.environment['BOT'] == 'true' || Platform.environment['CONTINUOUS_INTEGRATION'] == 'true' || Platform.environment['CHROME_HEADLESS'] == '1' || Platform.environment.containsKey('BUILDBOT_BUILDERNAME') || Platform.environment.containsKey('APPVEYOR') || Platform.environment.containsKey('CI'); }