jre 11 support
This commit is contained in:
parent
b86a762717
commit
1c26d0b340
|
@ -51,7 +51,7 @@ android {
|
||||||
variant.mergeAssetsProvider.get().doLast {
|
variant.mergeAssetsProvider.get().doLast {
|
||||||
def arch = System.getProperty("arch", "all")
|
def arch = System.getProperty("arch", "all")
|
||||||
def assetsDir = mergeAssetsProvider.get().outputDir.get()
|
def assetsDir = mergeAssetsProvider.get().outputDir.get()
|
||||||
def java = ['jre8', 'jre17', 'jre21']
|
def java = ['jre8', 'jre11', 'jre17', 'jre21']
|
||||||
println(arch)
|
println(arch)
|
||||||
java.forEach { String str ->
|
java.forEach { String str ->
|
||||||
def runtimeDir = new File([assetsDir, "app_runtime/java/" + str].join(File.separator))
|
def runtimeDir = new File([assetsDir, "app_runtime/java/" + str].join(File.separator))
|
||||||
|
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
@ -0,0 +1 @@
|
||||||
|
1
|
|
@ -32,6 +32,7 @@ public class RuntimeFragment extends FCLFragment implements View.OnClickListener
|
||||||
boolean cacio = false;
|
boolean cacio = false;
|
||||||
boolean cacio17 = false;
|
boolean cacio17 = false;
|
||||||
boolean java8 = false;
|
boolean java8 = false;
|
||||||
|
boolean java11 = false;
|
||||||
boolean java17 = false;
|
boolean java17 = false;
|
||||||
boolean java21 = false;
|
boolean java21 = false;
|
||||||
|
|
||||||
|
@ -39,6 +40,7 @@ public class RuntimeFragment extends FCLFragment implements View.OnClickListener
|
||||||
private FCLProgressBar cacioProgress;
|
private FCLProgressBar cacioProgress;
|
||||||
private FCLProgressBar cacio17Progress;
|
private FCLProgressBar cacio17Progress;
|
||||||
private FCLProgressBar java8Progress;
|
private FCLProgressBar java8Progress;
|
||||||
|
private FCLProgressBar java11Progress;
|
||||||
private FCLProgressBar java17Progress;
|
private FCLProgressBar java17Progress;
|
||||||
private FCLProgressBar java21Progress;
|
private FCLProgressBar java21Progress;
|
||||||
|
|
||||||
|
@ -46,6 +48,7 @@ public class RuntimeFragment extends FCLFragment implements View.OnClickListener
|
||||||
private FCLImageView cacioState;
|
private FCLImageView cacioState;
|
||||||
private FCLImageView cacio17State;
|
private FCLImageView cacio17State;
|
||||||
private FCLImageView java8State;
|
private FCLImageView java8State;
|
||||||
|
private FCLImageView java11State;
|
||||||
private FCLImageView java17State;
|
private FCLImageView java17State;
|
||||||
private FCLImageView java21State;
|
private FCLImageView java21State;
|
||||||
|
|
||||||
|
@ -60,6 +63,7 @@ public class RuntimeFragment extends FCLFragment implements View.OnClickListener
|
||||||
cacioProgress = findViewById(view, R.id.cacio_progress);
|
cacioProgress = findViewById(view, R.id.cacio_progress);
|
||||||
cacio17Progress = findViewById(view, R.id.cacio17_progress);
|
cacio17Progress = findViewById(view, R.id.cacio17_progress);
|
||||||
java8Progress = findViewById(view, R.id.java8_progress);
|
java8Progress = findViewById(view, R.id.java8_progress);
|
||||||
|
java11Progress = findViewById(view, R.id.java11_progress);
|
||||||
java17Progress = findViewById(view, R.id.java17_progress);
|
java17Progress = findViewById(view, R.id.java17_progress);
|
||||||
java21Progress = findViewById(view, R.id.java21_progress);
|
java21Progress = findViewById(view, R.id.java21_progress);
|
||||||
|
|
||||||
|
@ -67,6 +71,7 @@ public class RuntimeFragment extends FCLFragment implements View.OnClickListener
|
||||||
cacioState = findViewById(view, R.id.cacio_state);
|
cacioState = findViewById(view, R.id.cacio_state);
|
||||||
cacio17State = findViewById(view, R.id.cacio17_state);
|
cacio17State = findViewById(view, R.id.cacio17_state);
|
||||||
java8State = findViewById(view, R.id.java8_state);
|
java8State = findViewById(view, R.id.java8_state);
|
||||||
|
java11State = findViewById(view, R.id.java11_state);
|
||||||
java17State = findViewById(view, R.id.java17_state);
|
java17State = findViewById(view, R.id.java17_state);
|
||||||
java21State = findViewById(view, R.id.java21_state);
|
java21State = findViewById(view, R.id.java21_state);
|
||||||
|
|
||||||
|
@ -88,6 +93,7 @@ public class RuntimeFragment extends FCLFragment implements View.OnClickListener
|
||||||
cacio = RuntimeUtils.isLatest(FCLPath.CACIOCAVALLO_8_DIR, "/assets/app_runtime/caciocavallo");
|
cacio = RuntimeUtils.isLatest(FCLPath.CACIOCAVALLO_8_DIR, "/assets/app_runtime/caciocavallo");
|
||||||
cacio17 = RuntimeUtils.isLatest(FCLPath.CACIOCAVALLO_17_DIR, "/assets/app_runtime/caciocavallo17");
|
cacio17 = RuntimeUtils.isLatest(FCLPath.CACIOCAVALLO_17_DIR, "/assets/app_runtime/caciocavallo17");
|
||||||
java8 = RuntimeUtils.isLatest(FCLPath.JAVA_8_PATH, "/assets/app_runtime/java/jre8");
|
java8 = RuntimeUtils.isLatest(FCLPath.JAVA_8_PATH, "/assets/app_runtime/java/jre8");
|
||||||
|
java11 = RuntimeUtils.isLatest(FCLPath.JAVA_11_PATH, "/assets/app_runtime/java/jre11");
|
||||||
java17 = RuntimeUtils.isLatest(FCLPath.JAVA_17_PATH, "/assets/app_runtime/java/jre17");
|
java17 = RuntimeUtils.isLatest(FCLPath.JAVA_17_PATH, "/assets/app_runtime/java/jre17");
|
||||||
java21 = RuntimeUtils.isLatest(FCLPath.JAVA_21_PATH, "/assets/app_runtime/java/jre21");
|
java21 = RuntimeUtils.isLatest(FCLPath.JAVA_21_PATH, "/assets/app_runtime/java/jre21");
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
|
@ -107,13 +113,14 @@ public class RuntimeFragment extends FCLFragment implements View.OnClickListener
|
||||||
cacioState.setBackgroundDrawable(cacio ? stateDone : stateUpdate);
|
cacioState.setBackgroundDrawable(cacio ? stateDone : stateUpdate);
|
||||||
cacio17State.setBackgroundDrawable(cacio17 ? stateDone : stateUpdate);
|
cacio17State.setBackgroundDrawable(cacio17 ? stateDone : stateUpdate);
|
||||||
java8State.setBackgroundDrawable(java8 ? stateDone : stateUpdate);
|
java8State.setBackgroundDrawable(java8 ? stateDone : stateUpdate);
|
||||||
|
java11State.setBackgroundDrawable(java11 ? stateDone : stateUpdate);
|
||||||
java17State.setBackgroundDrawable(java17 ? stateDone : stateUpdate);
|
java17State.setBackgroundDrawable(java17 ? stateDone : stateUpdate);
|
||||||
java21State.setBackgroundDrawable(java21 ? stateDone : stateUpdate);
|
java21State.setBackgroundDrawable(java21 ? stateDone : stateUpdate);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private boolean isLatest() {
|
private boolean isLatest() {
|
||||||
return lwjgl && cacio && cacio17 && java8 && java17 && java21;
|
return lwjgl && cacio && cacio17 && java8 && java11 && java17 && java21;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void check() {
|
private void check() {
|
||||||
|
@ -211,6 +218,31 @@ public class RuntimeFragment extends FCLFragment implements View.OnClickListener
|
||||||
}
|
}
|
||||||
}).start();
|
}).start();
|
||||||
}
|
}
|
||||||
|
if (!java11) {
|
||||||
|
java11State.setVisibility(View.GONE);
|
||||||
|
java11Progress.setVisibility(View.VISIBLE);
|
||||||
|
new Thread(() -> {
|
||||||
|
try {
|
||||||
|
RuntimeUtils.installJava(getContext(), FCLPath.JAVA_11_PATH, "app_runtime/java/jre11");
|
||||||
|
if (!LocaleUtils.getSystemLocale().getDisplayName().equals(Locale.CHINA.getDisplayName())) {
|
||||||
|
FileUtils.writeText(new File(FCLPath.JAVA_11_PATH + "/resolv.conf"), "nameserver 1.1.1.1\n" + "nameserver 1.0.0.1");
|
||||||
|
} else {
|
||||||
|
FileUtils.writeText(new File(FCLPath.JAVA_11_PATH + "/resolv.conf"), "nameserver 8.8.8.8\n" + "nameserver 8.8.4.4");
|
||||||
|
}
|
||||||
|
java11 = true;
|
||||||
|
} catch (IOException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
if (getActivity() != null) {
|
||||||
|
getActivity().runOnUiThread(() -> {
|
||||||
|
java11State.setVisibility(View.VISIBLE);
|
||||||
|
java11Progress.setVisibility(View.GONE);
|
||||||
|
refreshDrawables();
|
||||||
|
check();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}).start();
|
||||||
|
}
|
||||||
if (!java17) {
|
if (!java17) {
|
||||||
java17State.setVisibility(View.GONE);
|
java17State.setVisibility(View.GONE);
|
||||||
java17Progress.setVisibility(View.VISIBLE);
|
java17Progress.setVisibility(View.VISIBLE);
|
||||||
|
|
|
@ -13,6 +13,7 @@ import com.tungsten.fcl.control.MenuType;
|
||||||
import com.tungsten.fcl.util.RequestCodes;
|
import com.tungsten.fcl.util.RequestCodes;
|
||||||
import com.tungsten.fclauncher.FCLConfig;
|
import com.tungsten.fclauncher.FCLConfig;
|
||||||
import com.tungsten.fclauncher.bridge.FCLBridge;
|
import com.tungsten.fclauncher.bridge.FCLBridge;
|
||||||
|
import com.tungsten.fclcore.game.JavaVersion;
|
||||||
import com.tungsten.fclcore.util.io.IOUtils;
|
import com.tungsten.fclcore.util.io.IOUtils;
|
||||||
import com.tungsten.fcllibrary.browser.FileBrowser;
|
import com.tungsten.fcllibrary.browser.FileBrowser;
|
||||||
import com.tungsten.fcllibrary.browser.options.LibMode;
|
import com.tungsten.fcllibrary.browser.options.LibMode;
|
||||||
|
@ -74,12 +75,13 @@ public class JarExecutorHelper {
|
||||||
}
|
}
|
||||||
|
|
||||||
private static int getNearestJavaVersion(int majorVersion) {
|
private static int getNearestJavaVersion(int majorVersion) {
|
||||||
if (majorVersion == -1)
|
if (majorVersion >= JavaVersion.JAVA_VERSION_17)
|
||||||
return 8;
|
return JavaVersion.JAVA_VERSION_21;
|
||||||
int diffFactorFirst = Math.abs(8 - majorVersion);
|
if (majorVersion >= JavaVersion.JAVA_VERSION_11)
|
||||||
int diffFactorSecond = Math.abs(17 - majorVersion);
|
return JavaVersion.JAVA_VERSION_17;
|
||||||
int diffFactorThird = Math.abs(21 - majorVersion);
|
if (majorVersion >= JavaVersion.JAVA_VERSION_8)
|
||||||
return diffFactorFirst < diffFactorSecond ? 8 : diffFactorSecond < diffFactorThird ? 17 : 21;
|
return JavaVersion.JAVA_VERSION_11;
|
||||||
|
return JavaVersion.JAVA_VERSION_8;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static int getJavaVersion(File file) {
|
private static int getJavaVersion(File file) {
|
||||||
|
|
|
@ -35,7 +35,7 @@ public class JarExecutorLauncher extends Launcher {
|
||||||
private CommandBuilder generateCommandLine(String args) {
|
private CommandBuilder generateCommandLine(String args) {
|
||||||
CommandBuilder res = new CommandBuilder();
|
CommandBuilder res = new CommandBuilder();
|
||||||
|
|
||||||
getCacioJavaArgs(res, javaVersion == 8);
|
getCacioJavaArgs(res, javaVersion == 8, javaVersion == 11);
|
||||||
|
|
||||||
res.addDefault("-Xms", MemoryUtils.findBestRAMAllocation(context) + "m");
|
res.addDefault("-Xms", MemoryUtils.findBestRAMAllocation(context) + "m");
|
||||||
res.addDefault("-Xmx", MemoryUtils.findBestRAMAllocation(context) + "m");
|
res.addDefault("-Xmx", MemoryUtils.findBestRAMAllocation(context) + "m");
|
||||||
|
@ -55,7 +55,7 @@ public class JarExecutorLauncher extends Launcher {
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void getCacioJavaArgs(CommandBuilder res, boolean isJava8) {
|
public static void getCacioJavaArgs(CommandBuilder res, boolean isJava8, boolean isJava11) {
|
||||||
res.addDefault("-Djava.awt.headless=", "false");
|
res.addDefault("-Djava.awt.headless=", "false");
|
||||||
res.addDefault("-Dcacio.managed.screensize=", FCLBridge.DEFAULT_WIDTH + "x" + FCLBridge.DEFAULT_HEIGHT);
|
res.addDefault("-Dcacio.managed.screensize=", FCLBridge.DEFAULT_WIDTH + "x" + FCLBridge.DEFAULT_HEIGHT);
|
||||||
res.addDefault("-Dcacio.font.fontmanager=", "sun.awt.X11FontManager");
|
res.addDefault("-Dcacio.font.fontmanager=", "sun.awt.X11FontManager");
|
||||||
|
@ -64,7 +64,7 @@ public class JarExecutorLauncher extends Launcher {
|
||||||
if (isJava8) {
|
if (isJava8) {
|
||||||
res.addDefault("-Dawt.toolkit=", "net.java.openjdk.cacio.ctc.CTCToolkit");
|
res.addDefault("-Dawt.toolkit=", "net.java.openjdk.cacio.ctc.CTCToolkit");
|
||||||
res.addDefault("-Djava.awt.graphicsenv=", "net.java.openjdk.cacio.ctc.CTCGraphicsEnvironment");
|
res.addDefault("-Djava.awt.graphicsenv=", "net.java.openjdk.cacio.ctc.CTCGraphicsEnvironment");
|
||||||
} else {
|
} else if (!isJava11) {
|
||||||
res.addDefault("-Dawt.toolkit=", "com.github.caciocavallosilano.cacio.ctc.CTCToolkit");
|
res.addDefault("-Dawt.toolkit=", "com.github.caciocavallosilano.cacio.ctc.CTCToolkit");
|
||||||
res.addDefault("-Djava.awt.graphicsenv=", "com.github.caciocavallosilano.cacio.ctc.CTCGraphicsEnvironment");
|
res.addDefault("-Djava.awt.graphicsenv=", "com.github.caciocavallosilano.cacio.ctc.CTCGraphicsEnvironment");
|
||||||
res.addDefault("-Djava.system.class.loader=", "com.github.caciocavallosilano.cacio.ctc.CTCPreloadClassLoader");
|
res.addDefault("-Djava.system.class.loader=", "com.github.caciocavallosilano.cacio.ctc.CTCPreloadClassLoader");
|
||||||
|
@ -119,7 +119,7 @@ public class JarExecutorLauncher extends Launcher {
|
||||||
FCLConfig config = new FCLConfig(
|
FCLConfig config = new FCLConfig(
|
||||||
context,
|
context,
|
||||||
FCLPath.LOG_DIR,
|
FCLPath.LOG_DIR,
|
||||||
javaVersion == 8 ? FCLPath.JAVA_8_PATH : javaVersion == 17 ? FCLPath.JAVA_17_PATH : FCLPath.JAVA_21_PATH,
|
javaVersion == 8 ? FCLPath.JAVA_8_PATH : javaVersion == 11 ? FCLPath.JAVA_11_PATH : javaVersion == 17 ? FCLPath.JAVA_17_PATH : FCLPath.JAVA_21_PATH,
|
||||||
Profiles.getSelectedProfile().getGameDir().getAbsolutePath(),
|
Profiles.getSelectedProfile().getGameDir().getAbsolutePath(),
|
||||||
FCLConfig.Renderer.RENDERER_GL4ES,
|
FCLConfig.Renderer.RENDERER_GL4ES,
|
||||||
finalArgs
|
finalArgs
|
||||||
|
|
|
@ -277,7 +277,7 @@ public final class LauncherHelper {
|
||||||
.thenComposeAsync(Schedulers.androidUIThread(), javaVersions -> {
|
.thenComposeAsync(Schedulers.androidUIThread(), javaVersions -> {
|
||||||
JavaVersion javaVersion = (JavaVersion) javaVersions.get(0);
|
JavaVersion javaVersion = (JavaVersion) javaVersions.get(0);
|
||||||
JavaVersion suggestedJavaVersion = (JavaVersion) javaVersions.get(1);
|
JavaVersion suggestedJavaVersion = (JavaVersion) javaVersions.get(1);
|
||||||
if (setting.getJava() == 0 || javaVersion.getVersion() == suggestedJavaVersion.getVersion()) {
|
if (setting.getJava().equals(JavaVersion.JAVA_AUTO.getVersionName()) || javaVersion.getVersion() == suggestedJavaVersion.getVersion()) {
|
||||||
return Task.completed(suggestedJavaVersion);
|
return Task.completed(suggestedJavaVersion);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -287,10 +287,10 @@ public final class LauncherHelper {
|
||||||
builder.setCancelable(false);
|
builder.setCancelable(false);
|
||||||
builder.setMessage(context.getString(R.string.launch_error_java));
|
builder.setMessage(context.getString(R.string.launch_error_java));
|
||||||
builder.setPositiveButton(context.getString(R.string.launch_error_java_auto), () -> {
|
builder.setPositiveButton(context.getString(R.string.launch_error_java_auto), () -> {
|
||||||
setting.setJava(0);
|
setting.setJava(JavaVersion.JAVA_AUTO.getVersionName());
|
||||||
future.complete(suggestedJavaVersion);
|
future.complete(suggestedJavaVersion);
|
||||||
});
|
});
|
||||||
builder.setPositiveButton(context.getString(R.string.launch_error_java_continue), continueAction::run);
|
builder.setNegativeButton(context.getString(R.string.launch_error_java_continue), continueAction::run);
|
||||||
builder.create().show();
|
builder.create().show();
|
||||||
return Task.fromCompletableFuture(future);
|
return Task.fromCompletableFuture(future);
|
||||||
}).withStage("launch.state.java");
|
}).withStage("launch.state.java");
|
||||||
|
|
|
@ -79,20 +79,17 @@ public final class VersionSetting implements Cloneable {
|
||||||
|
|
||||||
// java
|
// java
|
||||||
|
|
||||||
private final ObjectProperty<Integer> javaProperty = new SimpleObjectProperty<>(this, "java", 0);
|
private final StringProperty javaProperty = new SimpleStringProperty(this, "java", JavaVersion.JAVA_AUTO.getVersionName());
|
||||||
|
|
||||||
public ObjectProperty<Integer> javaProperty() {
|
public StringProperty javaProperty() {
|
||||||
return javaProperty;
|
return javaProperty;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
public String getJava() {
|
||||||
* Java version or "Custom" if user customizes java directory, "Default" if the jvm that this app relies on.
|
|
||||||
*/
|
|
||||||
public int getJava() {
|
|
||||||
return javaProperty.get();
|
return javaProperty.get();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setJava(int java) {
|
public void setJava(String java) {
|
||||||
javaProperty.set(java);
|
javaProperty.set(java);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -331,14 +328,18 @@ public final class VersionSetting implements Cloneable {
|
||||||
|
|
||||||
public Task<JavaVersion> getJavaVersion(Version version) {
|
public Task<JavaVersion> getJavaVersion(Version version) {
|
||||||
return Task.runAsync(Schedulers.androidUIThread(), () -> {
|
return Task.runAsync(Schedulers.androidUIThread(), () -> {
|
||||||
if (getJava() != 0 && getJava() != 1 && getJava() != 2) {
|
if (!getJava().equals(JavaVersion.JAVA_AUTO.getVersionName()) &&
|
||||||
setJava(0);
|
!getJava().equals(JavaVersion.JAVA_8.getVersionName()) &&
|
||||||
|
!getJava().equals(JavaVersion.JAVA_11.getVersionName()) &&
|
||||||
|
!getJava().equals(JavaVersion.JAVA_17.getVersionName()) &&
|
||||||
|
!getJava().equals(JavaVersion.JAVA_21.getVersionName())) {
|
||||||
|
setJava(JavaVersion.JAVA_AUTO.getVersionName());
|
||||||
}
|
}
|
||||||
}).thenSupplyAsync(() -> {
|
}).thenSupplyAsync(() -> {
|
||||||
if (getJava() == 0) {
|
if (getJava().equals(JavaVersion.JAVA_AUTO.getVersionName())) {
|
||||||
return JavaVersion.getSuitableJavaVersion(version);
|
return JavaVersion.getSuitableJavaVersion(version);
|
||||||
} else {
|
} else {
|
||||||
return JavaVersion.getJavaFromId(getJava());
|
return JavaVersion.getJavaFromVersionName(getJava());
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
@ -440,7 +441,7 @@ public final class VersionSetting implements Cloneable {
|
||||||
vs.setAutoMemory(Optional.ofNullable(obj.get("autoMemory")).map(JsonElement::getAsBoolean).orElse(true));
|
vs.setAutoMemory(Optional.ofNullable(obj.get("autoMemory")).map(JsonElement::getAsBoolean).orElse(true));
|
||||||
vs.setPermSize(Optional.ofNullable(obj.get("permSize")).map(JsonElement::getAsString).orElse(""));
|
vs.setPermSize(Optional.ofNullable(obj.get("permSize")).map(JsonElement::getAsString).orElse(""));
|
||||||
vs.setServerIp(Optional.ofNullable(obj.get("serverIp")).map(JsonElement::getAsString).orElse(""));
|
vs.setServerIp(Optional.ofNullable(obj.get("serverIp")).map(JsonElement::getAsString).orElse(""));
|
||||||
vs.setJava(Optional.ofNullable(obj.get("java")).map(JsonElement::getAsInt).orElse(0));
|
vs.setJava(Optional.ofNullable(obj.get("java")).map(JsonElement::getAsString).orElse(JavaVersion.JAVA_AUTO.getVersionName()));
|
||||||
vs.setScaleFactor(Optional.ofNullable(obj.get("scaleFactor")).map(JsonElement::getAsDouble).orElse(1d));
|
vs.setScaleFactor(Optional.ofNullable(obj.get("scaleFactor")).map(JsonElement::getAsDouble).orElse(1d));
|
||||||
vs.setNotCheckGame(Optional.ofNullable(obj.get("notCheckGame")).map(JsonElement::getAsBoolean).orElse(false));
|
vs.setNotCheckGame(Optional.ofNullable(obj.get("notCheckGame")).map(JsonElement::getAsBoolean).orElse(false));
|
||||||
vs.setNotCheckJVM(Optional.ofNullable(obj.get("notCheckJVM")).map(JsonElement::getAsBoolean).orElse(false));
|
vs.setNotCheckJVM(Optional.ofNullable(obj.get("notCheckJVM")).map(JsonElement::getAsBoolean).orElse(false));
|
||||||
|
|
|
@ -78,7 +78,7 @@ public class VersionSettingPage extends FCLCommonPage implements ManageUI.Versio
|
||||||
private FCLSwitch noGameCheckSwitch;
|
private FCLSwitch noGameCheckSwitch;
|
||||||
private FCLSwitch noJVMCheckSwitch;
|
private FCLSwitch noJVMCheckSwitch;
|
||||||
|
|
||||||
private FCLSpinner<Integer> javaSpinner;
|
private FCLSpinner<String> javaSpinner;
|
||||||
private FCLSpinner<FCLConfig.Renderer> rendererSpinner;
|
private FCLSpinner<FCLConfig.Renderer> rendererSpinner;
|
||||||
|
|
||||||
private FCLImageButton editIconButton;
|
private FCLImageButton editIconButton;
|
||||||
|
@ -133,11 +133,12 @@ public class VersionSettingPage extends FCLCommonPage implements ManageUI.Versio
|
||||||
scaleFactorText.stringProperty().bind(Bindings.createStringBinding(() -> (int) (lastVersionSetting.getScaleFactor() * 100) + " %", scaleFactorSeekbar.percentProgressProperty()));
|
scaleFactorText.stringProperty().bind(Bindings.createStringBinding(() -> (int) (lastVersionSetting.getScaleFactor() * 100) + " %", scaleFactorSeekbar.percentProgressProperty()));
|
||||||
|
|
||||||
// add spinner data
|
// add spinner data
|
||||||
ArrayList<Integer> javaVersionDataList = new ArrayList<>();
|
ArrayList<String> javaVersionDataList = new ArrayList<>();
|
||||||
javaVersionDataList.add(JavaVersion.JAVA_AUTO.getId());
|
javaVersionDataList.add(JavaVersion.JAVA_AUTO.getVersionName());
|
||||||
javaVersionDataList.add(JavaVersion.JAVA_8.getId());
|
javaVersionDataList.add(JavaVersion.JAVA_8.getVersionName());
|
||||||
javaVersionDataList.add(JavaVersion.JAVA_17.getId());
|
javaVersionDataList.add(JavaVersion.JAVA_11.getVersionName());
|
||||||
javaVersionDataList.add(JavaVersion.JAVA_21.getId());
|
javaVersionDataList.add(JavaVersion.JAVA_17.getVersionName());
|
||||||
|
javaVersionDataList.add(JavaVersion.JAVA_21.getVersionName());
|
||||||
javaSpinner.setDataList(javaVersionDataList);
|
javaSpinner.setDataList(javaVersionDataList);
|
||||||
|
|
||||||
ArrayList<FCLConfig.Renderer> rendererDataList = new ArrayList<>();
|
ArrayList<FCLConfig.Renderer> rendererDataList = new ArrayList<>();
|
||||||
|
@ -152,6 +153,7 @@ public class VersionSettingPage extends FCLCommonPage implements ManageUI.Versio
|
||||||
ArrayList<String> javaVersionList = new ArrayList<>();
|
ArrayList<String> javaVersionList = new ArrayList<>();
|
||||||
javaVersionList.add(getContext().getString(R.string.settings_game_java_version_auto));
|
javaVersionList.add(getContext().getString(R.string.settings_game_java_version_auto));
|
||||||
javaVersionList.add("JRE 8");
|
javaVersionList.add("JRE 8");
|
||||||
|
javaVersionList.add("JRE 11");
|
||||||
javaVersionList.add("JRE 17");
|
javaVersionList.add("JRE 17");
|
||||||
javaVersionList.add("JRE 21");
|
javaVersionList.add("JRE 21");
|
||||||
ArrayAdapter<String> javaAdapter = new ArrayAdapter<>(getContext(), R.layout.item_spinner_auto_tint, javaVersionList);
|
ArrayAdapter<String> javaAdapter = new ArrayAdapter<>(getContext(), R.layout.item_spinner_auto_tint, javaVersionList);
|
||||||
|
|
|
@ -179,6 +179,47 @@
|
||||||
|
|
||||||
</androidx.appcompat.widget.LinearLayoutCompat>
|
</androidx.appcompat.widget.LinearLayoutCompat>
|
||||||
|
|
||||||
|
<View
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="1dp"
|
||||||
|
android:background="@android:color/darker_gray"/>
|
||||||
|
|
||||||
|
<androidx.appcompat.widget.LinearLayoutCompat
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:padding="10dp"
|
||||||
|
android:orientation="horizontal">
|
||||||
|
|
||||||
|
<com.tungsten.fcllibrary.component.view.FCLTextView
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:text="@string/splash_runtime_java11"
|
||||||
|
android:layout_gravity="center"/>
|
||||||
|
|
||||||
|
<View
|
||||||
|
android:layout_width="0dp"
|
||||||
|
android:layout_height="0dp"
|
||||||
|
android:layout_weight="1"/>
|
||||||
|
|
||||||
|
<com.tungsten.fcllibrary.component.view.FCLProgressBar
|
||||||
|
android:visibility="gone"
|
||||||
|
android:layout_width="24dp"
|
||||||
|
android:layout_height="24dp"
|
||||||
|
android:id="@+id/java11_progress"
|
||||||
|
android:layout_gravity="center"
|
||||||
|
android:layout_marginStart="10dp"/>
|
||||||
|
|
||||||
|
<com.tungsten.fcllibrary.component.view.FCLImageView
|
||||||
|
app:auto_src_tint="false"
|
||||||
|
android:tint="@android:color/darker_gray"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:id="@+id/java11_state"
|
||||||
|
android:layout_gravity="center"
|
||||||
|
android:layout_marginStart="10dp"/>
|
||||||
|
|
||||||
|
</androidx.appcompat.widget.LinearLayoutCompat>
|
||||||
|
|
||||||
<View
|
<View
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="1dp"
|
android:layout_height="1dp"
|
||||||
|
|
|
@ -411,7 +411,7 @@
|
||||||
<string name="jar_executor_crash_reason">尚不支持 Jar Executor 崩溃原因分析。</string>
|
<string name="jar_executor_crash_reason">尚不支持 Jar Executor 崩溃原因分析。</string>
|
||||||
|
|
||||||
<string name="launch">启动游戏</string>
|
<string name="launch">启动游戏</string>
|
||||||
<string name="launch_error_java">错误的 Java 版本</string>
|
<string name="launch_error_java">你正在使用不推荐的 Java 版本,确定要继续吗?</string>
|
||||||
<string name="launch_error_java_auto">自动选择</string>
|
<string name="launch_error_java_auto">自动选择</string>
|
||||||
<string name="launch_error_java_continue">继续</string>
|
<string name="launch_error_java_continue">继续</string>
|
||||||
<string name="launch_failed">无法启动</string>
|
<string name="launch_failed">无法启动</string>
|
||||||
|
|
|
@ -12,6 +12,7 @@
|
||||||
<string name="splash_runtime_cacio" translatable="false">Caciocavallo</string>
|
<string name="splash_runtime_cacio" translatable="false">Caciocavallo</string>
|
||||||
<string name="splash_runtime_cacio17" translatable="false">Caciocavallo 17</string>
|
<string name="splash_runtime_cacio17" translatable="false">Caciocavallo 17</string>
|
||||||
<string name="splash_runtime_java8" translatable="false">JRE 8</string>
|
<string name="splash_runtime_java8" translatable="false">JRE 8</string>
|
||||||
|
<string name="splash_runtime_java11" translatable="false">JRE 11</string>
|
||||||
<string name="splash_runtime_java17" translatable="false">JRE 17</string>
|
<string name="splash_runtime_java17" translatable="false">JRE 17</string>
|
||||||
<string name="splash_runtime_java21" translatable="false">JRE 21</string>
|
<string name="splash_runtime_java21" translatable="false">JRE 21</string>
|
||||||
<string name="splash_runtime_install">Install / Update</string>
|
<string name="splash_runtime_install">Install / Update</string>
|
||||||
|
@ -438,7 +439,7 @@
|
||||||
<string name="jar_executor_crash_reason">Jar Executor crash reason analyse is not supported now.</string>
|
<string name="jar_executor_crash_reason">Jar Executor crash reason analyse is not supported now.</string>
|
||||||
|
|
||||||
<string name="launch">Launch</string>
|
<string name="launch">Launch</string>
|
||||||
<string name="launch_error_java">Wrong Java Version</string>
|
<string name="launch_error_java">You are using a deprecated Java version, are you sure you want to continue?</string>
|
||||||
<string name="launch_error_java_auto">Auto select</string>
|
<string name="launch_error_java_auto">Auto select</string>
|
||||||
<string name="launch_error_java_continue">Continue</string>
|
<string name="launch_error_java_continue">Continue</string>
|
||||||
<string name="launch_failed">Unable to launch</string>
|
<string name="launch_failed">Unable to launch</string>
|
||||||
|
|
|
@ -205,6 +205,8 @@ public class ForgeNewInstallTask extends Task<Version> {
|
||||||
if (java == 8) {
|
if (java == 8) {
|
||||||
runJVMProcess(processor, command, 17);
|
runJVMProcess(processor, command, 17);
|
||||||
} else if (java == 17) {
|
} else if (java == 17) {
|
||||||
|
runJVMProcess(processor, command, 11);
|
||||||
|
} else if (java == 11) {
|
||||||
runJVMProcess(processor, command, 21);
|
runJVMProcess(processor, command, 21);
|
||||||
} else {
|
} else {
|
||||||
throw new IOException("Game processor exited abnormally with code " + exitCode);
|
throw new IOException("Game processor exited abnormally with code " + exitCode);
|
||||||
|
|
|
@ -206,6 +206,8 @@ public class NeoForgeOldInstallTask extends Task<Version> {
|
||||||
if (java == 8) {
|
if (java == 8) {
|
||||||
runJVMProcess(processor, command, 17);
|
runJVMProcess(processor, command, 17);
|
||||||
} else if (java == 17) {
|
} else if (java == 17) {
|
||||||
|
runJVMProcess(processor, command, 11);
|
||||||
|
} else if (java == 11) {
|
||||||
runJVMProcess(processor, command, 21);
|
runJVMProcess(processor, command, 21);
|
||||||
} else {
|
} else {
|
||||||
throw new IOException("Game processor exited abnormally with code " + exitCode);
|
throw new IOException("Game processor exited abnormally with code " + exitCode);
|
||||||
|
|
|
@ -249,6 +249,8 @@ public final class OptiFineInstallTask extends Task<Version> {
|
||||||
if (java == 8) {
|
if (java == 8) {
|
||||||
runJVMProcess(command, 17);
|
runJVMProcess(command, 17);
|
||||||
} else if (java == 17) {
|
} else if (java == 17) {
|
||||||
|
runJVMProcess(command, 11);
|
||||||
|
} else if (java == 11) {
|
||||||
runJVMProcess(command, 21);
|
runJVMProcess(command, 21);
|
||||||
} else {
|
} else {
|
||||||
throw new IOException("OptiFine patcher failed, command: " + new CommandBuilder().addAll(Arrays.asList(command)));
|
throw new IOException("OptiFine patcher failed, command: " + new CommandBuilder().addAll(Arrays.asList(command)));
|
||||||
|
|
|
@ -5,28 +5,34 @@ import com.tungsten.fclauncher.utils.FCLPath;
|
||||||
public class JavaVersion {
|
public class JavaVersion {
|
||||||
|
|
||||||
public static final int JAVA_VERSION_8 = 8;
|
public static final int JAVA_VERSION_8 = 8;
|
||||||
|
public static final int JAVA_VERSION_11 = 11;
|
||||||
public static final int JAVA_VERSION_17 = 17;
|
public static final int JAVA_VERSION_17 = 17;
|
||||||
public static final int JAVA_VERSION_21 = 21;
|
public static final int JAVA_VERSION_21 = 21;
|
||||||
|
|
||||||
private final int id;
|
|
||||||
private final boolean auto;
|
private final boolean auto;
|
||||||
private final int version;
|
private final int version;
|
||||||
private final String versionName;
|
private final String versionName;
|
||||||
|
|
||||||
public static final JavaVersion JAVA_AUTO = new JavaVersion(0, true, JAVA_VERSION_8, "Auto");
|
public static final JavaVersion JAVA_AUTO = new JavaVersion(true, JAVA_VERSION_8, "Auto");
|
||||||
public static final JavaVersion JAVA_8 = new JavaVersion(1, false, JAVA_VERSION_8, "1.8");
|
public static final JavaVersion JAVA_8 = new JavaVersion(false, JAVA_VERSION_8, "1.8");
|
||||||
public static final JavaVersion JAVA_17 = new JavaVersion(2, false, JAVA_VERSION_17, "17");
|
public static final JavaVersion JAVA_11 = new JavaVersion(false, JAVA_VERSION_11, "11");
|
||||||
public static final JavaVersion JAVA_21 = new JavaVersion(3, false, JAVA_VERSION_21, "21");
|
public static final JavaVersion JAVA_17 = new JavaVersion(false, JAVA_VERSION_17, "17");
|
||||||
|
public static final JavaVersion JAVA_21 = new JavaVersion(false, JAVA_VERSION_21, "21");
|
||||||
|
|
||||||
public JavaVersion(int id, boolean auto, int version, String versionName) {
|
public JavaVersion(boolean auto, int version, String versionName) {
|
||||||
this.id = id;
|
|
||||||
this.auto = auto;
|
this.auto = auto;
|
||||||
this.version = version;
|
this.version = version;
|
||||||
this.versionName = versionName;
|
this.versionName = versionName;
|
||||||
}
|
}
|
||||||
|
|
||||||
public int getId() {
|
public static JavaVersion[] getAllJavaVersion() {
|
||||||
return id;
|
return new JavaVersion[] {
|
||||||
|
JAVA_AUTO,
|
||||||
|
JAVA_8,
|
||||||
|
JAVA_11,
|
||||||
|
JAVA_17,
|
||||||
|
JAVA_21
|
||||||
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean isAuto() {
|
public boolean isAuto() {
|
||||||
|
@ -45,26 +51,28 @@ public class JavaVersion {
|
||||||
JavaVersion javaVersion = auto ? getSuitableJavaVersion(version) : this;
|
JavaVersion javaVersion = auto ? getSuitableJavaVersion(version) : this;
|
||||||
if (javaVersion.getVersion() == JAVA_VERSION_8) {
|
if (javaVersion.getVersion() == JAVA_VERSION_8) {
|
||||||
return FCLPath.JAVA_8_PATH;
|
return FCLPath.JAVA_8_PATH;
|
||||||
|
} else if (javaVersion.getVersion() == JAVA_VERSION_11) {
|
||||||
|
return FCLPath.JAVA_11_PATH;
|
||||||
} else if (javaVersion.getVersion() == JAVA_VERSION_17) {
|
} else if (javaVersion.getVersion() == JAVA_VERSION_17) {
|
||||||
return FCLPath.JAVA_17_PATH;
|
return FCLPath.JAVA_17_PATH;
|
||||||
}
|
}
|
||||||
return FCLPath.JAVA_21_PATH;
|
return FCLPath.JAVA_21_PATH;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static JavaVersion getJavaFromId(int id) {
|
public static JavaVersion getJavaFromVersionName(String versionName) {
|
||||||
if (id == 0) {
|
for (JavaVersion javaVersion : getAllJavaVersion()) {
|
||||||
return JAVA_AUTO;
|
if (javaVersion.getVersionName().equals(versionName)) {
|
||||||
} else if (id == 1) {
|
return javaVersion;
|
||||||
return JAVA_8;
|
}
|
||||||
} else if (id == 2) {
|
|
||||||
return JAVA_17;
|
|
||||||
}
|
}
|
||||||
return JAVA_21;
|
return JAVA_AUTO;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static JavaVersion getSuitableJavaVersion(Version version) {
|
public static JavaVersion getSuitableJavaVersion(Version version) {
|
||||||
if (version.getJavaVersion() == null || version.getJavaVersion().getMajorVersion() == 8) {
|
if (version.getJavaVersion() == null || version.getJavaVersion().getMajorVersion() == 8) {
|
||||||
return JAVA_8;
|
return JAVA_8;
|
||||||
|
} else if (version.getJavaVersion().getMajorVersion() == 11) {
|
||||||
|
return JAVA_11;
|
||||||
} else if (version.getJavaVersion().getMajorVersion() == 21) {
|
} else if (version.getJavaVersion().getMajorVersion() == 21) {
|
||||||
return JAVA_21;
|
return JAVA_21;
|
||||||
}
|
}
|
||||||
|
@ -74,6 +82,8 @@ public class JavaVersion {
|
||||||
public static boolean checkJavaVersion(Version version, JavaVersion javaVersion) {
|
public static boolean checkJavaVersion(Version version, JavaVersion javaVersion) {
|
||||||
if (version.getJavaVersion() == null || version.getJavaVersion().getMajorVersion() == 8) {
|
if (version.getJavaVersion() == null || version.getJavaVersion().getMajorVersion() == 8) {
|
||||||
return javaVersion.getVersion() == JAVA_VERSION_8;
|
return javaVersion.getVersion() == JAVA_VERSION_8;
|
||||||
|
} else if (version.getJavaVersion().getMajorVersion() == 11) {
|
||||||
|
return javaVersion.getVersion() == JAVA_VERSION_11;
|
||||||
} else if (version.getJavaVersion().getMajorVersion() == 21) {
|
} else if (version.getJavaVersion().getMajorVersion() == 21) {
|
||||||
return javaVersion.getVersion() == JAVA_VERSION_21;
|
return javaVersion.getVersion() == JAVA_VERSION_21;
|
||||||
}
|
}
|
||||||
|
|
|
@ -135,8 +135,8 @@ public class DefaultLauncher extends Launcher {
|
||||||
// res.addDefault("-Dorg.lwjgl.util.DebugFunctions=", "true");
|
// res.addDefault("-Dorg.lwjgl.util.DebugFunctions=", "true");
|
||||||
|
|
||||||
// FCL specific args
|
// FCL specific args
|
||||||
JavaVersion javaVersion = options.getJava().getId() == 0 ? JavaVersion.getSuitableJavaVersion(version) : options.getJava();
|
JavaVersion javaVersion = options.getJava().isAuto() ? JavaVersion.getSuitableJavaVersion(version) : options.getJava();
|
||||||
if (javaVersion.getVersion() == JavaVersion.JAVA_VERSION_17 || javaVersion.getVersion() == JavaVersion.JAVA_VERSION_21) {
|
if (javaVersion.getVersion() == JavaVersion.JAVA_VERSION_11 || javaVersion.getVersion() == JavaVersion.JAVA_VERSION_17 || javaVersion.getVersion() == JavaVersion.JAVA_VERSION_21) {
|
||||||
res.addDefault("-Dext.net.resolvPath=", javaVersion.getJavaPath(version) + "/resolv.conf");
|
res.addDefault("-Dext.net.resolvPath=", javaVersion.getJavaPath(version) + "/resolv.conf");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -221,12 +221,13 @@ public class DefaultLauncher extends Launcher {
|
||||||
|
|
||||||
public static void getCacioJavaArgs(CommandBuilder res, Version version, LaunchOptions options) {
|
public static void getCacioJavaArgs(CommandBuilder res, Version version, LaunchOptions options) {
|
||||||
JavaVersion javaVersion;
|
JavaVersion javaVersion;
|
||||||
if (options.getJava().getId() == 0) {
|
if (options.getJava().isAuto()) {
|
||||||
javaVersion = JavaVersion.getSuitableJavaVersion(version);
|
javaVersion = JavaVersion.getSuitableJavaVersion(version);
|
||||||
} else {
|
} else {
|
||||||
javaVersion = options.getJava();
|
javaVersion = options.getJava();
|
||||||
}
|
}
|
||||||
boolean isJava8 = javaVersion.getVersion() == JavaVersion.JAVA_VERSION_8;
|
boolean isJava8 = javaVersion.getVersion() == JavaVersion.JAVA_VERSION_8;
|
||||||
|
boolean isJava11 = javaVersion.getVersion() == JavaVersion.JAVA_VERSION_11;
|
||||||
|
|
||||||
res.addDefault("-Djava.awt.headless=", "false");
|
res.addDefault("-Djava.awt.headless=", "false");
|
||||||
res.addDefault("-Dcacio.managed.screensize=", options.getWidth() + "x" + options.getHeight());
|
res.addDefault("-Dcacio.managed.screensize=", options.getWidth() + "x" + options.getHeight());
|
||||||
|
@ -236,7 +237,7 @@ public class DefaultLauncher extends Launcher {
|
||||||
if (isJava8) {
|
if (isJava8) {
|
||||||
res.addDefault("-Dawt.toolkit=", "net.java.openjdk.cacio.ctc.CTCToolkit");
|
res.addDefault("-Dawt.toolkit=", "net.java.openjdk.cacio.ctc.CTCToolkit");
|
||||||
res.addDefault("-Djava.awt.graphicsenv=", "net.java.openjdk.cacio.ctc.CTCGraphicsEnvironment");
|
res.addDefault("-Djava.awt.graphicsenv=", "net.java.openjdk.cacio.ctc.CTCGraphicsEnvironment");
|
||||||
} else {
|
} else if (!isJava11) {
|
||||||
res.addDefault("-Dawt.toolkit=", "com.github.caciocavallosilano.cacio.ctc.CTCToolkit");
|
res.addDefault("-Dawt.toolkit=", "com.github.caciocavallosilano.cacio.ctc.CTCToolkit");
|
||||||
res.addDefault("-Djava.awt.graphicsenv=", "com.github.caciocavallosilano.cacio.ctc.CTCGraphicsEnvironment");
|
res.addDefault("-Djava.awt.graphicsenv=", "com.github.caciocavallosilano.cacio.ctc.CTCGraphicsEnvironment");
|
||||||
res.addDefault("-Djava.system.class.loader=", "com.github.caciocavallosilano.cacio.ctc.CTCPreloadClassLoader");
|
res.addDefault("-Djava.system.class.loader=", "com.github.caciocavallosilano.cacio.ctc.CTCPreloadClassLoader");
|
||||||
|
|
|
@ -16,6 +16,7 @@ public class FCLPath {
|
||||||
|
|
||||||
public static String RUNTIME_DIR;
|
public static String RUNTIME_DIR;
|
||||||
public static String JAVA_8_PATH;
|
public static String JAVA_8_PATH;
|
||||||
|
public static String JAVA_11_PATH;
|
||||||
public static String JAVA_17_PATH;
|
public static String JAVA_17_PATH;
|
||||||
public static String JAVA_21_PATH;
|
public static String JAVA_21_PATH;
|
||||||
public static String LWJGL_DIR;
|
public static String LWJGL_DIR;
|
||||||
|
@ -45,6 +46,7 @@ public class FCLPath {
|
||||||
|
|
||||||
RUNTIME_DIR = context.getDir("runtime", 0).getAbsolutePath();
|
RUNTIME_DIR = context.getDir("runtime", 0).getAbsolutePath();
|
||||||
JAVA_8_PATH = RUNTIME_DIR + "/java/jre8";
|
JAVA_8_PATH = RUNTIME_DIR + "/java/jre8";
|
||||||
|
JAVA_11_PATH = RUNTIME_DIR + "/java/jre11";
|
||||||
JAVA_17_PATH = RUNTIME_DIR + "/java/jre17";
|
JAVA_17_PATH = RUNTIME_DIR + "/java/jre17";
|
||||||
JAVA_21_PATH = RUNTIME_DIR + "/java/jre21";
|
JAVA_21_PATH = RUNTIME_DIR + "/java/jre21";
|
||||||
LWJGL_DIR = RUNTIME_DIR + "/lwjgl";
|
LWJGL_DIR = RUNTIME_DIR + "/lwjgl";
|
||||||
|
@ -67,6 +69,7 @@ public class FCLPath {
|
||||||
init(CACHE_DIR);
|
init(CACHE_DIR);
|
||||||
init(RUNTIME_DIR);
|
init(RUNTIME_DIR);
|
||||||
init(JAVA_8_PATH);
|
init(JAVA_8_PATH);
|
||||||
|
init(JAVA_11_PATH);
|
||||||
init(JAVA_17_PATH);
|
init(JAVA_17_PATH);
|
||||||
init(JAVA_21_PATH);
|
init(JAVA_21_PATH);
|
||||||
init(LWJGL_DIR);
|
init(LWJGL_DIR);
|
||||||
|
|
Loading…
Reference in New Issue