1// Copyright 2017 The Chromium Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style license that can be 3// found in the LICENSE file. 4 5import 'dart:async'; 6 7import '../base/user_messages.dart'; 8import '../base/version.dart'; 9import '../doctor.dart'; 10import '../globals.dart'; 11import '../intellij/intellij.dart'; 12import 'android_studio.dart'; 13 14class AndroidStudioValidator extends DoctorValidator { 15 AndroidStudioValidator(this._studio) : super('Android Studio'); 16 17 final AndroidStudio _studio; 18 19 static List<DoctorValidator> get allValidators { 20 final List<AndroidStudio> studios = AndroidStudio.allInstalled(); 21 return <DoctorValidator>[ 22 if (studios.isEmpty) 23 NoAndroidStudioValidator() 24 else 25 ...studios.map<DoctorValidator>((AndroidStudio studio) => AndroidStudioValidator(studio)) 26 ]; 27 } 28 29 @override 30 Future<ValidationResult> validate() async { 31 final List<ValidationMessage> messages = <ValidationMessage>[]; 32 ValidationType type = ValidationType.missing; 33 34 final String studioVersionText = _studio.version == Version.unknown 35 ? null 36 : userMessages.androidStudioVersion(_studio.version.toString()); 37 messages 38 .add(ValidationMessage(userMessages.androidStudioLocation(_studio.directory))); 39 40 final IntelliJPlugins plugins = IntelliJPlugins(_studio.pluginsPath); 41 plugins.validatePackage(messages, <String>['flutter-intellij', 'flutter-intellij.jar'], 42 'Flutter', minVersion: IntelliJPlugins.kMinFlutterPluginVersion); 43 plugins.validatePackage(messages, <String>['Dart'], 'Dart'); 44 45 if (_studio.isValid) { 46 type = _hasIssues(messages) ? ValidationType.partial : ValidationType.installed; 47 messages.addAll(_studio.validationMessages 48 .map<ValidationMessage>((String m) => ValidationMessage(m))); 49 } else { 50 type = ValidationType.partial; 51 messages.addAll(_studio.validationMessages 52 .map<ValidationMessage>((String m) => ValidationMessage.error(m))); 53 messages.add(ValidationMessage(userMessages.androidStudioNeedsUpdate)); 54 if (_studio.configured != null) { 55 messages.add(ValidationMessage(userMessages.androidStudioResetDir)); 56 } 57 } 58 59 return ValidationResult(type, messages, statusInfo: studioVersionText); 60 } 61 62 bool _hasIssues(List<ValidationMessage> messages) { 63 return messages.any((ValidationMessage message) => message.isError); 64 } 65} 66 67class NoAndroidStudioValidator extends DoctorValidator { 68 NoAndroidStudioValidator() : super('Android Studio'); 69 70 @override 71 Future<ValidationResult> validate() async { 72 final List<ValidationMessage> messages = <ValidationMessage>[]; 73 74 final String cfgAndroidStudio = config.getValue('android-studio-dir'); 75 if (cfgAndroidStudio != null) { 76 messages.add(ValidationMessage.error(userMessages.androidStudioMissing(cfgAndroidStudio))); 77 } 78 messages.add(ValidationMessage(userMessages.androidStudioInstallation)); 79 80 return ValidationResult(ValidationType.notAvailable, messages, 81 statusInfo: 'not installed'); 82 } 83} 84