Skip to content

Commit

Permalink
Revert "Revert "Fix unable to find bundled Java version (flutter#119244
Browse files Browse the repository at this point in the history
…)" (flutter#119981)" (flutter#120107)

This reverts commit f7c2bd0.
  • Loading branch information
christopherfujino committed Feb 7, 2023
1 parent 5be7f66 commit aed9b4a
Show file tree
Hide file tree
Showing 3 changed files with 182 additions and 6 deletions.
3 changes: 2 additions & 1 deletion AUTHORS
Original file line number Diff line number Diff line change
Expand Up @@ -100,4 +100,5 @@ Jingyi Chen <jingyichen@link.cuhk.edu.cn>
Junhua Lin <1075209054@qq.com>
Tomasz Gucio <tgucio@gmail.com>
Jason C.H <ctrysbita@outlook.com>
Hubert Jóźwiak <hjozwiakdx@gmail.com>
Hubert Jóźwiak <hjozwiakdx@gmail.com>
Eli Albert <crasowas@gmail.com>
21 changes: 16 additions & 5 deletions packages/flutter_tools/lib/src/android/android_studio.dart
Original file line number Diff line number Diff line change
Expand Up @@ -441,11 +441,22 @@ class AndroidStudio implements Comparable<AndroidStudio> {
return;
}

final String javaPath = globals.platform.isMacOS ?
version != null && version.major < 2020 ?
globals.fs.path.join(directory, 'jre', 'jdk', 'Contents', 'Home') :
globals.fs.path.join(directory, 'jre', 'Contents', 'Home') :
globals.fs.path.join(directory, 'jre');
final String javaPath;
if (globals.platform.isMacOS) {
if (version != null && version.major < 2020) {
javaPath = globals.fs.path.join(directory, 'jre', 'jdk', 'Contents', 'Home');
} else if (version != null && version.major == 2022) {
javaPath = globals.fs.path.join(directory, 'jbr', 'Contents', 'Home');
} else {
javaPath = globals.fs.path.join(directory, 'jre', 'Contents', 'Home');
}
} else {
if (version != null && version.major == 2022) {
javaPath = globals.fs.path.join(directory, 'jbr');
} else {
javaPath = globals.fs.path.join(directory, 'jre');
}
}
final String javaExecutable = globals.fs.path.join(javaPath, 'bin', 'java');
if (!globals.processManager.canRun(javaExecutable)) {
_validationMessages.add('Unable to find bundled Java version.');
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,19 @@ const Map<String, Object> macStudioInfoPlist2020_3 = <String, Object>{
},
};

const Map<String, Object> macStudioInfoPlist2022_1 = <String, Object>{
'CFBundleGetInfoString': 'Android Studio 2022.1, build AI-221.6008.13.2211.9477386. Copyright JetBrains s.r.o., (c) 2000-2023',
'CFBundleShortVersionString': '2022.1',
'CFBundleVersion': 'AI-221.6008.13.2211.9477386',
'JVMOptions': <String, Object>{
'Properties': <String, Object>{
'idea.vendor.name' : 'Google',
'idea.paths.selector': 'AndroidStudio2022.1',
'idea.platform.prefix': 'AndroidStudio',
},
},
};

const Map<String, Object> macStudioInfoPlistEAP = <String, Object>{
'CFBundleGetInfoString': 'Android Studio EAP AI-212.5712.43.2112.8233820, build AI-212.5712.43.2112.8233820. Copyright JetBrains s.r.o., (c) 2000-2022',
'CFBundleShortVersionString': 'EAP AI-212.5712.43.2112.8233820',
Expand Down Expand Up @@ -486,6 +499,84 @@ void main() {
Platform: () => platform,
PlistParser: () => plistUtils,
});

testUsingContext('Can find Android Studio 2020.3 bundled Java version on Mac', () {
final String studioInApplicationPlistFolder = globals.fs.path.join(
'/',
'Application',
'Android Studio.app',
'Contents',
);
globals.fs.directory(studioInApplicationPlistFolder).createSync(recursive: true);

final String plistFilePath = globals.fs.path.join(studioInApplicationPlistFolder, 'Info.plist');
plistUtils.fileContents[plistFilePath] = macStudioInfoPlist2020_3;
processManager.addCommand(FakeCommand(
command: <String>[
globals.fs.path.join(studioInApplicationPlistFolder, 'jre', 'Contents', 'Home', 'bin', 'java'),
'-version',
],
stderr: '123',
)
);
final AndroidStudio studio = AndroidStudio.fromMacOSBundle(
globals.fs.directory(studioInApplicationPlistFolder).parent.path,
)!;

expect(studio.javaPath, equals(globals.fs.path.join(
studioInApplicationPlistFolder,
'jre',
'Contents',
'Home',
)));
}, overrides: <Type, Generator>{
FileSystem: () => fileSystem,
FileSystemUtils: () => fsUtils,
ProcessManager: () => processManager,
// Custom home paths are not supported on macOS nor Windows yet,
// so we force the platform to fake Linux here.
Platform: () => platform,
PlistParser: () => plistUtils,
});

testUsingContext('Can find Android Studio 2022.1 bundled Java version on Mac', () {
final String studioInApplicationPlistFolder = globals.fs.path.join(
'/',
'Application',
'Android Studio.app',
'Contents',
);
globals.fs.directory(studioInApplicationPlistFolder).createSync(recursive: true);

final String plistFilePath = globals.fs.path.join(studioInApplicationPlistFolder, 'Info.plist');
plistUtils.fileContents[plistFilePath] = macStudioInfoPlist2022_1;
processManager.addCommand(FakeCommand(
command: <String>[
globals.fs.path.join(studioInApplicationPlistFolder, 'jbr', 'Contents', 'Home', 'bin', 'java'),
'-version',
],
stderr: '123',
)
);
final AndroidStudio studio = AndroidStudio.fromMacOSBundle(
globals.fs.directory(studioInApplicationPlistFolder).parent.path,
)!;

expect(studio.javaPath, equals(globals.fs.path.join(
studioInApplicationPlistFolder,
'jbr',
'Contents',
'Home',
)));
}, overrides: <Type, Generator>{
FileSystem: () => fileSystem,
FileSystemUtils: () => fsUtils,
ProcessManager: () => processManager,
// Custom home paths are not supported on macOS nor Windows yet,
// so we force the platform to fake Linux here.
Platform: () => platform,
PlistParser: () => plistUtils,
});
});

late FileSystem windowsFileSystem;
Expand Down Expand Up @@ -596,6 +687,38 @@ void main() {
ProcessManager: () => FakeProcessManager.any(),
});

testUsingContext('Can find Android Studio 2020.3 bundled Java version on Windows', () {
windowsFileSystem.file(r'C:\Users\Dash\AppData\Local\Google\AndroidStudio2020.3\.home')
..createSync(recursive: true)
..writeAsStringSync(r'C:\Program Files\AndroidStudio');
windowsFileSystem.directory(r'C:\Program Files\AndroidStudio')
.createSync(recursive: true);

final AndroidStudio studio = AndroidStudio.allInstalled().single;

expect(studio.javaPath, equals(r'C:\Program Files\AndroidStudio\jre'));
}, overrides: <Type, Generator>{
Platform: () => windowsPlatform,
FileSystem: () => windowsFileSystem,
ProcessManager: () => FakeProcessManager.any(),
});

testUsingContext('Can find Android Studio 2022.1 bundled Java version on Windows', () {
windowsFileSystem.file(r'C:\Users\Dash\AppData\Local\Google\AndroidStudio2022.1\.home')
..createSync(recursive: true)
..writeAsStringSync(r'C:\Program Files\AndroidStudio');
windowsFileSystem.directory(r'C:\Program Files\AndroidStudio')
.createSync(recursive: true);

final AndroidStudio studio = AndroidStudio.allInstalled().single;

expect(studio.javaPath, equals(r'C:\Program Files\AndroidStudio\jbr'));
}, overrides: <Type, Generator>{
Platform: () => windowsPlatform,
FileSystem: () => windowsFileSystem,
ProcessManager: () => FakeProcessManager.any(),
});

group('Installation detection on Linux', () {
late FileSystemUtils fsUtils;

Expand Down Expand Up @@ -686,6 +809,47 @@ void main() {
Platform: () => linuxPlatform,
ProcessManager: () => FakeProcessManager.any(),
});

testUsingContext('Can find Android Studio 2020.3 bundled Java version on Linux', () {
const String studioHomeFilePath = '$homeLinux/.cache/Google/AndroidStudio2020.3/.home';
const String studioInstallPath = '$homeLinux/AndroidStudio';

globals.fs.file(studioHomeFilePath)
..createSync(recursive: true)
..writeAsStringSync(studioInstallPath);

globals.fs.directory(studioInstallPath).createSync();

final AndroidStudio studio = AndroidStudio.allInstalled().single;

expect(studio.javaPath, equals('$studioInstallPath/jre'));
}, overrides: <Type, Generator>{
FileSystem: () => fileSystem,
FileSystemUtils: () => fsUtils,
Platform: () => linuxPlatform,
ProcessManager: () => FakeProcessManager.any(),
});

testUsingContext('Can find Android Studio 2022.1 bundled Java version on Linux', () {
const String studioHomeFilePath =
'$homeLinux/.cache/Google/AndroidStudio2022.1/.home';
const String studioInstallPath = '$homeLinux/AndroidStudio';

globals.fs.file(studioHomeFilePath)
..createSync(recursive: true)
..writeAsStringSync(studioInstallPath);

globals.fs.directory(studioInstallPath).createSync();

final AndroidStudio studio = AndroidStudio.allInstalled().single;

expect(studio.javaPath, equals('$studioInstallPath/jbr'));
}, overrides: <Type, Generator>{
FileSystem: () => fileSystem,
FileSystemUtils: () => fsUtils,
Platform: () => linuxPlatform,
ProcessManager: () => FakeProcessManager.any(),
});
});
}

Expand Down

0 comments on commit aed9b4a

Please sign in to comment.