blob: 5a8da162a7a7215170e056e7978f2930126183ce [file] [log] [blame]
// Copyright 2017 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 '../base/file_system.dart';
import '../base/io.dart';
import '../base/platform.dart';
import '../base/process_manager.dart';
import '../base/version.dart';
import '../doctor.dart';
import '../globals.dart';
import 'android_studio.dart';
class AndroidStudioValidator extends DoctorValidator {
final AndroidStudio _studio;
AndroidStudioValidator(this._studio) : super('Android Studio');
static List<DoctorValidator> get allValidators {
final List<DoctorValidator> validators = <DoctorValidator>[];
final List<AndroidStudio> studios = AndroidStudio.allInstalled();
if (studios.isEmpty) {
validators.add(new NoAndroidStudioValidator());
} else {
validators.addAll(studios
.map((AndroidStudio studio) => new AndroidStudioValidator(studio)));
}
final String cfgGradleDir = config.getValue('gradle-dir');
if (cfgGradleDir != null) {
validators.add(new ConfiguredGradleValidator(cfgGradleDir));
}
return validators;
}
@override
Future<ValidationResult> validate() async {
final List<ValidationMessage> messages = <ValidationMessage>[];
ValidationType type = ValidationType.missing;
final String studioVersionText = _studio.version == Version.unknown
? null
: 'version ${_studio.version}';
messages
.add(new ValidationMessage('Android Studio at ${_studio.directory}'));
if (_studio.isValid) {
type = ValidationType.installed;
messages.addAll(_studio.validationMessages
.map((String m) => new ValidationMessage(m)));
} else {
type = ValidationType.partial;
messages.addAll(_studio.validationMessages
.map((String m) => new ValidationMessage.error(m)));
messages.add(new ValidationMessage(
'Try updating or re-installing Android Studio.'));
if (_studio.configured != null) {
messages.add(new ValidationMessage(
'Consider removing your android-studio-dir setting by running:\nflutter config --android-studio-dir='));
}
}
return new ValidationResult(type, messages, statusInfo: studioVersionText);
}
}
class NoAndroidStudioValidator extends DoctorValidator {
NoAndroidStudioValidator() : super('Android Studio');
@override
Future<ValidationResult> validate() async {
final List<ValidationMessage> messages = <ValidationMessage>[];
final String cfgAndroidStudio = config.getValue('android-studio-dir');
if (cfgAndroidStudio != null) {
messages.add(
new ValidationMessage.error('android-studio-dir = $cfgAndroidStudio\n'
'but Android Studio not found at this location.'));
}
messages.add(new ValidationMessage(
'Android Studio not found. Download from https://developer.android.com/studio/index.html\n'
'(or visit https://flutter.io/setup/#android-setup for detailed instructions).'));
return new ValidationResult(ValidationType.missing, messages,
statusInfo: 'not installed');
}
}
class ConfiguredGradleValidator extends DoctorValidator {
final String cfgGradleDir;
ConfiguredGradleValidator(this.cfgGradleDir) : super('Gradle');
@override
Future<ValidationResult> validate() async {
ValidationType type = ValidationType.missing;
final List<ValidationMessage> messages = <ValidationMessage>[];
messages.add(new ValidationMessage('gradle-dir = $cfgGradleDir'));
String gradleExecutable = cfgGradleDir;
if (!fs.isFileSync(cfgGradleDir)) {
gradleExecutable = fs.path.join(
cfgGradleDir, 'bin', platform.isWindows ? 'gradle.bat' : 'gradle');
}
String versionString;
if (processManager.canRun(gradleExecutable)) {
type = ValidationType.partial;
final ProcessResult result =
processManager.runSync(<String>[gradleExecutable, '--version']);
if (result.exitCode == 0) {
versionString = result.stdout
.toString()
.split('\n')
.firstWhere((String s) => s.startsWith('Gradle '))
.substring('Gradle '.length);
final Version version = new Version.parse(versionString) ?? Version.unknown;
if (version >= minGradleVersion) {
type = ValidationType.installed;
} else {
messages.add(new ValidationMessage.error(
'Gradle version $minGradleVersion required. Found version $versionString.'));
}
} else {
messages
.add(new ValidationMessage('Unable to determine Gradle version.'));
}
} else {
messages
.add(new ValidationMessage('Gradle not found at $gradleExecutable'));
}
messages.add(new ValidationMessage(
'Flutter supports building with Gradle from Android Studio.\n'
'Consider removing your gradle-dir setting by running:\nflutter config --gradle-dir='));
return new ValidationResult(type, messages, statusInfo: versionString);
}
}