android_studio_validator.dart 3.16 KB
Newer Older
Ian Hickson's avatar
Ian Hickson committed
1
// Copyright 2014 The Flutter Authors. All rights reserved.
2 3 4 5 6
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

import 'dart:async';

7
import '../base/user_messages.dart';
8
import '../base/version.dart';
9
import '../doctor.dart';
10
import '../globals.dart' as globals;
11
import '../intellij/intellij.dart';
12 13 14
import 'android_studio.dart';

class AndroidStudioValidator extends DoctorValidator {
15
  AndroidStudioValidator(this._studio) : super('Android Studio');
16

17 18
  final AndroidStudio _studio;

19
  static List<DoctorValidator> get allValidators {
20
    final List<AndroidStudio> studios = AndroidStudio.allInstalled();
21 22 23 24
    return <DoctorValidator>[
      if (studios.isEmpty)
        NoAndroidStudioValidator()
      else
25 26 27
        ...studios.map<DoctorValidator>(
          (AndroidStudio studio) => AndroidStudioValidator(studio)
        ),
28
    ];
29 30 31 32
  }

  @override
  Future<ValidationResult> validate() async {
33
    final List<ValidationMessage> messages = <ValidationMessage>[];
34
    ValidationType type = ValidationType.missing;
35

36
    final String studioVersionText = _studio.version == Version.unknown
37 38 39 40 41
      ? null
      : userMessages.androidStudioVersion(_studio.version.toString());
    messages.add(ValidationMessage(
      userMessages.androidStudioLocation(_studio.directory),
    ));
42

43
    final IntelliJPlugins plugins = IntelliJPlugins(_studio.pluginsPath);
44 45 46 47 48 49
    plugins.validatePackage(
      messages,
      <String>['flutter-intellij', 'flutter-intellij.jar'],
      'Flutter',
      minVersion: IntelliJPlugins.kMinFlutterPluginVersion,
    );
50 51
    plugins.validatePackage(messages, <String>['Dart'], 'Dart');

52
    if (_studio.isValid) {
53 54 55 56 57 58
      type = _hasIssues(messages)
        ? ValidationType.partial
        : ValidationType.installed;
      messages.addAll(_studio.validationMessages.map<ValidationMessage>(
        (String m) => ValidationMessage(m),
      ));
59 60
    } else {
      type = ValidationType.partial;
61 62 63
      messages.addAll(_studio.validationMessages.map<ValidationMessage>(
        (String m) => ValidationMessage.error(m),
      ));
64
      messages.add(ValidationMessage(userMessages.androidStudioNeedsUpdate));
65
      if (_studio.configured != null) {
66
        messages.add(ValidationMessage(userMessages.androidStudioResetDir));
67 68 69
      }
    }

70
    return ValidationResult(type, messages, statusInfo: studioVersionText);
71
  }
72 73 74 75

  bool _hasIssues(List<ValidationMessage> messages) {
    return messages.any((ValidationMessage message) => message.isError);
  }
76 77 78 79 80 81 82
}

class NoAndroidStudioValidator extends DoctorValidator {
  NoAndroidStudioValidator() : super('Android Studio');

  @override
  Future<ValidationResult> validate() async {
83
    final List<ValidationMessage> messages = <ValidationMessage>[];
84

85 86 87
    final String cfgAndroidStudio = globals.config.getValue(
      'android-studio-dir',
    ) as String;
88
    if (cfgAndroidStudio != null) {
89 90 91
      messages.add(ValidationMessage.error(
        userMessages.androidStudioMissing(cfgAndroidStudio),
      ));
92
    }
93
    messages.add(ValidationMessage(userMessages.androidStudioInstallation));
94

95 96 97 98 99
    return ValidationResult(
      ValidationType.notAvailable,
      messages,
      statusInfo: 'not installed',
    );
100 101
  }
}