| // 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'); |
| } |