blob: e852d3aec17f88ee01d729c256841836b5eb4e4b [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';
import '../base/config.dart';
import '../base/io.dart';
import '../features.dart';
import '../globals.dart' as globals;
import '../version.dart';
/// This function is called from within the context runner to perform
/// checks that are necessary for determining if a no-op version of
/// [Analytics] gets returned.
///
/// When [enableAsserts] is set to `true`, various assert statements
/// will be enabled to ensure usage of this class is within GA4 limitations.
///
/// For testing purposes, pass in a [FakeAnalytics] instance initialized with
/// an in-memory [FileSystem] to prevent writing to disk.
Analytics getAnalytics({
required bool runningOnBot,
required FlutterVersion flutterVersion,
required Map<String, String> environment,
required String? clientIde,
required Config config,
bool enableAsserts = false,
FakeAnalytics? analyticsOverride,
}) {
final String version = flutterVersion.getVersionString(redactUnknownBranches: true);
final bool suppressEnvFlag = environment['FLUTTER_SUPPRESS_ANALYTICS']?.toLowerCase() == 'true';
if (// Ignore local user branches.
version.startsWith('[user-branch]') ||
// Many CI systems don't do a full git checkout.
version.endsWith('/unknown') ||
// Ignore bots.
runningOnBot ||
// Ignore when suppressed by FLUTTER_SUPPRESS_ANALYTICS.
suppressEnvFlag) {
return const NoOpAnalytics();
}
// Providing an override of the [Analytics] instance is preferred when
// running tests for this function to prevent writing to the filesystem
if (analyticsOverride != null) {
return analyticsOverride;
}
return Analytics(
tool: DashTool.flutterTool,
flutterChannel: flutterVersion.channel,
flutterVersion: flutterVersion.frameworkVersion,
dartVersion: flutterVersion.dartSdkVersion,
enableAsserts: enableAsserts,
clientIde: clientIde,
enabledFeatures: getEnabledFeatures(config),
);
}
/// Uses the [Config] object to get enabled features.
String? getEnabledFeatures(Config config) {
// Create string with all enabled features to send as user property
final Iterable<Feature> enabledFeatures = allFeatures.where((Feature feature) {
final String? configSetting = feature.configSetting;
return configSetting != null && config.getValue(configSetting) == true;
});
return enabledFeatures.isNotEmpty
? enabledFeatures
.map((Feature feature) => feature.configSetting)
.join(',')
: null;
}
/// Function to safely grab the max rss from [ProcessInfo].
int? getMaxRss(ProcessInfo processInfo) {
try {
return globals.processInfo.maxRss;
} on Exception catch (error) {
globals.printTrace('Querying maxRss failed with error: $error');
}
return null;
}