• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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