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

5 6
// @dart = 2.8

7 8 9 10 11
import 'package:meta/meta.dart';

import '../base/config.dart';
import '../base/file_system.dart';
import '../base/platform.dart';
12
import '../base/user_messages.dart';
13
import '../base/version.dart';
14
import '../doctor.dart';
15
import '../intellij/intellij.dart';
16 17 18
import 'android_studio.dart';

class AndroidStudioValidator extends DoctorValidator {
19 20 21
  AndroidStudioValidator(this._studio, { @required FileSystem fileSystem })
    : _fileSystem = fileSystem,
      super('Android Studio');
22

23
  final AndroidStudio _studio;
24
  final FileSystem _fileSystem;
25

26
  static List<DoctorValidator> allValidators(Config config, Platform platform, FileSystem fileSystem, UserMessages userMessages) {
27
    final List<AndroidStudio> studios = AndroidStudio.allInstalled();
28 29
    return <DoctorValidator>[
      if (studios.isEmpty)
30
        NoAndroidStudioValidator(config: config, platform: platform, userMessages: userMessages)
31
      else
32
        ...studios.map<DoctorValidator>(
33
          (AndroidStudio studio) => AndroidStudioValidator(studio, fileSystem: fileSystem)
34
        ),
35
    ];
36 37 38 39
  }

  @override
  Future<ValidationResult> validate() async {
40
    final List<ValidationMessage> messages = <ValidationMessage>[];
41
    ValidationType type = ValidationType.missing;
42

43
    final String studioVersionText = _studio.version == Version.unknown
44 45 46 47 48
      ? null
      : userMessages.androidStudioVersion(_studio.version.toString());
    messages.add(ValidationMessage(
      userMessages.androidStudioLocation(_studio.directory),
    ));
49

50
    final IntelliJPlugins plugins = IntelliJPlugins(_studio.pluginsPath, fileSystem: _fileSystem);
51 52 53 54
    plugins.validatePackage(
      messages,
      <String>['flutter-intellij', 'flutter-intellij.jar'],
      'Flutter',
55
      IntelliJPlugins.kIntellijFlutterPluginUrl,
56 57
      minVersion: IntelliJPlugins.kMinFlutterPluginVersion,
    );
58 59 60 61 62 63
    plugins.validatePackage(
      messages,
      <String>['Dart'],
      'Dart',
      IntelliJPlugins.kIntellijDartPluginUrl,
    );
64

65
    if (_studio.isValid) {
66 67 68 69 70 71
      type = _hasIssues(messages)
        ? ValidationType.partial
        : ValidationType.installed;
      messages.addAll(_studio.validationMessages.map<ValidationMessage>(
        (String m) => ValidationMessage(m),
      ));
72 73
    } else {
      type = ValidationType.partial;
74 75 76
      messages.addAll(_studio.validationMessages.map<ValidationMessage>(
        (String m) => ValidationMessage.error(m),
      ));
77
      messages.add(ValidationMessage(userMessages.androidStudioNeedsUpdate));
78
      if (_studio.configured != null) {
79
        messages.add(ValidationMessage(userMessages.androidStudioResetDir));
80 81 82
      }
    }

83
    return ValidationResult(type, messages, statusInfo: studioVersionText);
84
  }
85 86 87 88

  bool _hasIssues(List<ValidationMessage> messages) {
    return messages.any((ValidationMessage message) => message.isError);
  }
89 90 91
}

class NoAndroidStudioValidator extends DoctorValidator {
92 93 94 95 96 97 98 99 100 101 102 103
  NoAndroidStudioValidator({
    @required Config config,
    @required Platform platform,
    @required UserMessages userMessages,
  }) : _config = config,
       _platform = platform,
       _userMessages = userMessages,
       super('Android Studio');

  final Config _config;
  final Platform _platform;
  final UserMessages _userMessages;
104 105 106

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

109
    final String cfgAndroidStudio = _config.getValue(
110 111
      'android-studio-dir',
    ) as String;
112
    if (cfgAndroidStudio != null) {
113
      messages.add(ValidationMessage.error(
114
        _userMessages.androidStudioMissing(cfgAndroidStudio),
115
      ));
116
    }
117
    messages.add(ValidationMessage(_userMessages.androidStudioInstallation(_platform)));
118

119 120 121 122 123
    return ValidationResult(
      ValidationType.notAvailable,
      messages,
      statusInfo: 'not installed',
    );
124 125
  }
}