android_studio_validator.dart 4.65 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 7
import '../base/config.dart';
import '../base/file_system.dart';
import '../base/platform.dart';
8
import '../base/user_messages.dart';
9
import '../doctor_validator.dart';
10
import '../intellij/intellij.dart';
11 12
import 'android_studio.dart';

13 14 15 16 17
const String _androidStudioTitle = 'Android Studio';
const String _androidStudioId = 'AndroidStudio';
const String _androidStudioPreviewTitle = 'Android Studio Preview';
const String _androidStudioPreviewId = 'AndroidStudioPreview';

18
class AndroidStudioValidator extends DoctorValidator {
19 20 21 22 23 24
  AndroidStudioValidator(this._studio, {
    required FileSystem fileSystem,
    required UserMessages userMessages,
  })
    : _userMessages = userMessages,
      _fileSystem = fileSystem,
25
      super('Android Studio');
26

27
  final AndroidStudio _studio;
28
  final FileSystem _fileSystem;
29
  final UserMessages _userMessages;
30

31 32 33 34 35
  static const Map<String, String> idToTitle = <String, String>{
    _androidStudioId: _androidStudioTitle,
    _androidStudioPreviewId: _androidStudioPreviewTitle,
  };

36
  static List<DoctorValidator> allValidators(Config config, Platform platform, FileSystem fileSystem, UserMessages userMessages) {
37
    final List<AndroidStudio> studios = AndroidStudio.allInstalled();
38 39
    return <DoctorValidator>[
      if (studios.isEmpty)
40
        NoAndroidStudioValidator(config: config, platform: platform, userMessages: userMessages)
41
      else
42
        ...studios.map<DoctorValidator>(
43
          (AndroidStudio studio) => AndroidStudioValidator(studio, fileSystem: fileSystem, userMessages: userMessages)
44
        ),
45
    ];
46 47 48 49
  }

  @override
  Future<ValidationResult> validate() async {
50
    final List<ValidationMessage> messages = <ValidationMessage>[];
51
    ValidationType type = ValidationType.missing;
52

53 54 55
    final String studioVersionText = _studio.version == null
      ? _userMessages.androidStudioVersion('unknown')
      : _userMessages.androidStudioVersion(_studio.version.toString());
56
    messages.add(ValidationMessage(
57
      _userMessages.androidStudioLocation(_studio.directory),
58
    ));
59

60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75
    if (_studio.pluginsPath != null) {
      final IntelliJPlugins plugins = IntelliJPlugins(_studio.pluginsPath!, fileSystem: _fileSystem);
      plugins.validatePackage(
        messages,
        <String>['flutter-intellij', 'flutter-intellij.jar'],
        'Flutter',
        IntelliJPlugins.kIntellijFlutterPluginUrl,
        minVersion: IntelliJPlugins.kMinFlutterPluginVersion,
      );
      plugins.validatePackage(
        messages,
        <String>['Dart'],
        'Dart',
        IntelliJPlugins.kIntellijDartPluginUrl,
      );
    }
76

77 78 79 80
    if (_studio.version == null) {
      messages.add(const ValidationMessage.error('Unable to determine Android Studio version.'));
    }

81
    if (_studio.isValid) {
82 83
      type = _hasIssues(messages)
        ? ValidationType.partial
84
        : ValidationType.success;
85 86 87
      messages.addAll(_studio.validationMessages.map<ValidationMessage>(
        (String m) => ValidationMessage(m),
      ));
88 89
    } else {
      type = ValidationType.partial;
90 91 92
      messages.addAll(_studio.validationMessages.map<ValidationMessage>(
        (String m) => ValidationMessage.error(m),
      ));
93
      messages.add(ValidationMessage(_userMessages.androidStudioNeedsUpdate));
94
      if (_studio.configuredPath != null) {
95
        messages.add(ValidationMessage(_userMessages.androidStudioResetDir));
96 97 98
      }
    }

99
    return ValidationResult(type, messages, statusInfo: studioVersionText);
100
  }
101 102 103 104

  bool _hasIssues(List<ValidationMessage> messages) {
    return messages.any((ValidationMessage message) => message.isError);
  }
105 106 107
}

class NoAndroidStudioValidator extends DoctorValidator {
108
  NoAndroidStudioValidator({
109 110 111
    required Config config,
    required Platform platform,
    required UserMessages userMessages,
112 113 114 115 116 117 118 119
  }) : _config = config,
       _platform = platform,
       _userMessages = userMessages,
       super('Android Studio');

  final Config _config;
  final Platform _platform;
  final UserMessages _userMessages;
120 121 122

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

125
    final String? cfgAndroidStudio = _config.getValue(
126
      'android-studio-dir',
127
    ) as String?;
128
    if (cfgAndroidStudio != null) {
129
      messages.add(ValidationMessage.error(
130
        _userMessages.androidStudioMissing(cfgAndroidStudio),
131
      ));
132
    }
133
    messages.add(ValidationMessage(_userMessages.androidStudioInstallation(_platform)));
134

135 136 137 138 139
    return ValidationResult(
      ValidationType.notAvailable,
      messages,
      statusInfo: 'not installed',
    );
140 141
  }
}