Skip to content

Commit 2003438

Browse files
Merge branch 'v3_openjdk' into fix/incorrect-accountjson-encoding-crash
Signed-off-by: Eva Isabella Luna <me@crystall1ne.dev>
2 parents 791afe1 + fde5187 commit 2003438

13 files changed

Lines changed: 470 additions & 16 deletions

File tree

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44

55
[![Android CI](https://github.com/AngelAuraMC/Amethyst-Android/workflows/Android%20CI/badge.svg)](https://github.com/AngelAuraMC/Amethyst-Android/actions)
66
[![GitHub commit activity](https://img.shields.io/github/commit-activity/m/AngelAuraMC/Amethyst-Android)](https://github.com/AngelAuraMC/Amethyst-Android/actions)
7-
[![Crowdin](https://badges.crowdin.net/amethyst/localized.svg)](https://crowdin.com/project/amethyst)
7+
[![Crowdin](https://badges.crowdin.net/pojavlauncher/localized.svg)](https://crowdin.com/project/pojavlauncher)
88
[![Discord](https://img.shields.io/discord/724163890803638273.svg?label=&logo=discord&logoColor=ffffff&color=7389D8&labelColor=6A7EC2)](https://discord.gg/5ptqkyZxEy)
99

1010
*From [Boardwalk](https://github.com/zhuowei/Boardwalk)'s ashes and [PojavLauncher](https://github.com/PojavLauncherTeam/PojavLauncher)'s ruined reputation, here comes Amethyst!*
Binary file not shown.
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
53f2f037cef9b7447a6abbdf82150ca8a2f2a587
1+
2016eba00f043842122d7aecb9410cf9371a7693

app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/fragments/ModVersionListFragment.java

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@
1717
import net.kdt.pojavlaunch.R;
1818
import net.kdt.pojavlaunch.Tools;
1919
import net.kdt.pojavlaunch.extra.ExtraCore;
20-
import net.kdt.pojavlaunch.mirrors.DownloadMirror;
2120
import net.kdt.pojavlaunch.modloaders.ModloaderDownloadListener;
2221
import net.kdt.pojavlaunch.modloaders.ModloaderListenerProxy;
2322
import net.kdt.pojavlaunch.progresskeeper.ProgressKeeper;
@@ -106,7 +105,7 @@ public boolean onChildClick(ExpandableListView expandableListView, View view, in
106105
Object forgeVersion = expandableListView.getExpandableListAdapter().getChild(i, i1);
107106
ModloaderListenerProxy taskProxy = new ModloaderListenerProxy();
108107
Runnable downloadTask = createDownloadTask(forgeVersion, taskProxy);
109-
setTaskProxy(taskProxy);
108+
setTaskProxyValue(taskProxy);
110109
taskProxy.attachListener(this);
111110
mExpandableListView.setEnabled(false);
112111
new Thread(downloadTask).start();
@@ -118,7 +117,7 @@ public void onDownloadFinished(File downloadedFile) {
118117
Tools.runOnUiThread(()->{
119118
Context context = requireContext();
120119
getTaskProxy().detachListener();
121-
setTaskProxy(null);
120+
deleteTaskProxy();
122121
mExpandableListView.setEnabled(true);
123122
// Read the comment in FabricInstallFragment.onDownloadFinished() to see how this works
124123
getParentFragmentManager().popBackStackImmediate();
@@ -131,7 +130,7 @@ public void onDataNotAvailable() {
131130
Tools.runOnUiThread(()->{
132131
Context context = requireContext();
133132
getTaskProxy().detachListener();
134-
setTaskProxy(null);
133+
deleteTaskProxy();
135134
mExpandableListView.setEnabled(true);
136135
Tools.dialog(context,
137136
context.getString(R.string.global_error),
@@ -144,15 +143,18 @@ public void onDownloadError(Exception e) {
144143
Tools.runOnUiThread(()->{
145144
Context context = requireContext();
146145
getTaskProxy().detachListener();
147-
setTaskProxy(null);
146+
deleteTaskProxy();
148147
mExpandableListView.setEnabled(true);
149148
Tools.showError(context, e);
150149
});
151150
}
152151

153-
private void setTaskProxy(ModloaderListenerProxy proxy) {
152+
private void setTaskProxyValue(ModloaderListenerProxy proxy) {
154153
ExtraCore.setValue(mExtraTag, proxy);
155154
}
155+
private void deleteTaskProxy(){
156+
ExtraCore.removeValue(mExtraTag);
157+
}
156158

157159
private ModloaderListenerProxy getTaskProxy() {
158160
return (ModloaderListenerProxy) ExtraCore.getValue(mExtraTag);
Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
package net.kdt.pojavlaunch.fragments;
2+
3+
import android.content.Context;
4+
import android.content.Intent;
5+
import android.view.LayoutInflater;
6+
import android.widget.ExpandableListAdapter;
7+
8+
import androidx.annotation.NonNull;
9+
10+
import net.kdt.pojavlaunch.JavaGUILauncherActivity;
11+
import net.kdt.pojavlaunch.R;
12+
import net.kdt.pojavlaunch.Tools;
13+
import net.kdt.pojavlaunch.modloaders.ForgeDownloadTask;
14+
import net.kdt.pojavlaunch.modloaders.ForgeUtils;
15+
import net.kdt.pojavlaunch.modloaders.ModloaderListenerProxy;
16+
import net.kdt.pojavlaunch.modloaders.NeoForgeDownloadTask;
17+
import net.kdt.pojavlaunch.modloaders.NeoForgeVersionListAdapter;
18+
import net.kdt.pojavlaunch.utils.DownloadUtils;
19+
20+
import java.io.File;
21+
import java.io.IOException;
22+
import java.util.Collections;
23+
import java.util.List;
24+
25+
public class NeoForgeInstallFragment extends ModVersionListFragment<List<String>> {
26+
public static final String TAG = "NeoForgeInstallFragment";
27+
public NeoForgeInstallFragment() {
28+
super(TAG);
29+
}
30+
31+
private static final String NEOFORGE_METADATA_URL = "https://meta.prismlauncher.org/v1/net.neoforged/index.json";
32+
33+
34+
@Override
35+
public void onAttach(@NonNull Context context) {
36+
super.onAttach(context);
37+
}
38+
39+
@Override
40+
public int getTitleText() {
41+
return R.string.neoforge_dl_select_version;
42+
}
43+
44+
@Override
45+
public int getNoDataMsg() {
46+
return R.string.neoforge_dl_no_installer;
47+
}
48+
49+
@Override
50+
public List<String> loadVersionList() {
51+
String test = null;
52+
try {
53+
test = DownloadUtils.downloadStringCached(NEOFORGE_METADATA_URL, "neoforge_versions", input -> input);
54+
} catch (Exception e) {
55+
Tools.showErrorRemote(e);
56+
}
57+
return Collections.singletonList(test);
58+
// Moved the parsing logic to the adapter because there is no way to get this info easily, we use prism's index
59+
// since neoforge doesn't actually give this information easily anywhere.
60+
// To clarify, neoforge does not provide maven APIs to get supported Minecraft versions for each loader version
61+
62+
}
63+
64+
@Override
65+
public ExpandableListAdapter createAdapter(List<String> versionList, LayoutInflater layoutInflater) {
66+
return new NeoForgeVersionListAdapter(versionList, layoutInflater);
67+
}
68+
69+
@Override
70+
public Runnable createDownloadTask(Object selectedVersion, ModloaderListenerProxy listenerProxy) {
71+
return new NeoForgeDownloadTask(listenerProxy, (String) selectedVersion);
72+
}
73+
74+
@Override
75+
public void onDownloadFinished(Context context, File downloadedFile) {
76+
Intent modInstallerStartIntent = new Intent(context, JavaGUILauncherActivity.class);
77+
modInstallerStartIntent.putExtra("javaArgs", "-jar "+downloadedFile.getAbsolutePath()+" --install-client");
78+
context.startActivity(modInstallerStartIntent);
79+
}
80+
}

app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/fragments/ProfileTypeSelectFragment.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,8 @@ public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceStat
3636
tryInstall(FabricInstallFragment.class, FabricInstallFragment.TAG));
3737
view.findViewById(R.id.modded_profile_forge).setOnClickListener((v)->
3838
tryInstall(ForgeInstallFragment.class, ForgeInstallFragment.TAG));
39+
view.findViewById(R.id.modded_profile_neoforge).setOnClickListener((v)->
40+
tryInstall(NeoForgeInstallFragment.class, NeoForgeInstallFragment.TAG));
3941
view.findViewById(R.id.modded_profile_modpack).setOnClickListener((v)->
4042
tryInstall(SearchModFragment.class, SearchModFragment.TAG));
4143
view.findViewById(R.id.modded_profile_quilt).setOnClickListener((v)->
Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
package net.kdt.pojavlaunch.modloaders;
2+
3+
import com.kdt.mcgui.ProgressLayout;
4+
5+
import net.kdt.pojavlaunch.R;
6+
import net.kdt.pojavlaunch.Tools;
7+
import net.kdt.pojavlaunch.progresskeeper.ProgressKeeper;
8+
import net.kdt.pojavlaunch.utils.DownloadUtils;
9+
10+
import java.io.File;
11+
import java.io.FileNotFoundException;
12+
import java.io.IOException;
13+
import java.util.List;
14+
15+
public class NeoForgeDownloadTask implements Runnable, Tools.DownloaderFeedback {
16+
private String mDownloadUrl;
17+
private String mFullVersion;
18+
private String mLoaderVersion;
19+
private String mGameVersion;
20+
private final ModloaderDownloadListener mListener;
21+
public NeoForgeDownloadTask(ModloaderDownloadListener listener, String forgeVersion) {
22+
this.mListener = listener;
23+
this.mDownloadUrl = "https://maven.neoforged.net/releases/net/neoforged/neoforge/"+ forgeVersion +"/neoforge-"+forgeVersion+"-installer.jar";
24+
this.mFullVersion = forgeVersion;
25+
}
26+
27+
public NeoForgeDownloadTask(ModloaderDownloadListener listener, String gameVersion, String loaderVersion) {
28+
this.mListener = listener;
29+
this.mLoaderVersion = loaderVersion;
30+
this.mGameVersion = gameVersion;
31+
}
32+
@Override
33+
public void run() {
34+
if(determineDownloadUrl()) {
35+
downloadForge();
36+
}
37+
ProgressLayout.clearProgress(ProgressLayout.INSTALL_MODPACK);
38+
}
39+
40+
@Override
41+
public void updateProgress(int curr, int max) {
42+
int progress100 = (int)(((float)curr / (float)max)*100f);
43+
ProgressKeeper.submitProgress(ProgressLayout.INSTALL_MODPACK, progress100, R.string.forge_dl_progress, mFullVersion);
44+
}
45+
46+
private void downloadForge() {
47+
ProgressKeeper.submitProgress(ProgressLayout.INSTALL_MODPACK, 0, R.string.forge_dl_progress, mFullVersion);
48+
try {
49+
File destinationFile = new File(Tools.DIR_CACHE, "neoforge-installer.jar");
50+
byte[] buffer = new byte[8192];
51+
DownloadUtils.downloadFileMonitored(mDownloadUrl, destinationFile, buffer, this);
52+
mListener.onDownloadFinished(destinationFile);
53+
}catch (FileNotFoundException e) {
54+
mListener.onDataNotAvailable();
55+
} catch (IOException e) {
56+
mListener.onDownloadError(e);
57+
}
58+
}
59+
60+
public boolean determineDownloadUrl() {
61+
if(mDownloadUrl != null && mFullVersion != null) return true;
62+
ProgressKeeper.submitProgress(ProgressLayout.INSTALL_MODPACK, 0, R.string.forge_dl_searching);
63+
try {
64+
if(!findVersion()) {
65+
mListener.onDataNotAvailable();
66+
return false;
67+
}
68+
}catch (IOException e) {
69+
mListener.onDownloadError(e);
70+
return false;
71+
}
72+
return true;
73+
}
74+
75+
public boolean findVersion() throws IOException {
76+
List<String> forgeVersions = ForgeUtils.downloadForgeVersions();
77+
if(forgeVersions == null) return false;
78+
String versionStart = mGameVersion+"-"+mLoaderVersion;
79+
for(String versionName : forgeVersions) {
80+
if(!versionName.startsWith(versionStart)) continue;
81+
mFullVersion = versionName;
82+
mDownloadUrl = ForgeUtils.getInstallerUrl(mFullVersion);
83+
return true;
84+
}
85+
return false;
86+
}
87+
88+
}
Lines changed: 119 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,119 @@
1+
package net.kdt.pojavlaunch.modloaders;
2+
3+
import android.view.LayoutInflater;
4+
import android.view.View;
5+
import android.view.ViewGroup;
6+
import android.widget.BaseExpandableListAdapter;
7+
import android.widget.ExpandableListAdapter;
8+
import android.widget.TextView;
9+
10+
import com.google.gson.JsonArray;
11+
import com.google.gson.JsonElement;
12+
import com.google.gson.JsonObject;
13+
import com.google.gson.JsonParser;
14+
15+
import java.util.ArrayList;
16+
import java.util.Collections;
17+
import java.util.LinkedHashMap;
18+
import java.util.LinkedHashSet;
19+
import java.util.List;
20+
21+
public class NeoForgeVersionListAdapter extends BaseExpandableListAdapter implements ExpandableListAdapter {
22+
private final LayoutInflater mLayoutInflater;
23+
private final LinkedHashMap<String, LinkedHashSet<String>> minecraftToLoaderVersionsHashmap;
24+
private LinkedHashSet<String> generatedHashSet = null;
25+
26+
27+
public NeoForgeVersionListAdapter(List<String> forgeVersions, LayoutInflater layoutInflater) {
28+
this.mLayoutInflater = layoutInflater;
29+
minecraftToLoaderVersionsHashmap = new LinkedHashMap<>();
30+
JsonArray versionsJsonArray = JsonParser.parseString(forgeVersions.get(0)).getAsJsonObject().getAsJsonArray("versions");
31+
32+
ArrayList<JsonElement> sortedVersionsList = new ArrayList<>();
33+
for (JsonElement elem : versionsJsonArray) {
34+
sortedVersionsList.add(elem);
35+
}
36+
Collections.sort(sortedVersionsList, (o1, o2) -> {
37+
String versionString1 = ((JsonObject) o1).get("requires").getAsJsonArray().get(0).getAsJsonObject().get("equals").getAsString();
38+
String versionString2 = ((JsonObject) o2).get("requires").getAsJsonArray().get(0).getAsJsonObject().get("equals").getAsString();
39+
return versionString2.compareTo(versionString1); // Sorts by Minecraft version
40+
});
41+
42+
for (JsonElement sortedVersionPick : sortedVersionsList) {
43+
String loaderVersion = ((JsonObject) sortedVersionPick).get("version").getAsString();
44+
String minecraftVersion = ((JsonObject) sortedVersionPick).get("requires").getAsJsonArray().get(0).getAsJsonObject().get("equals").getAsString();
45+
if (minecraftToLoaderVersionsHashmap.containsKey(minecraftVersion)) {
46+
minecraftToLoaderVersionsHashmap.get(minecraftVersion).add(loaderVersion);
47+
} else {
48+
generatedHashSet = new LinkedHashSet<>();
49+
generatedHashSet.add(loaderVersion);
50+
minecraftToLoaderVersionsHashmap.put(minecraftVersion, generatedHashSet);
51+
}
52+
}
53+
}
54+
@Override
55+
public int getGroupCount() {
56+
return minecraftToLoaderVersionsHashmap.size();
57+
}
58+
59+
@Override
60+
public int getChildrenCount(int i) {
61+
return new ArrayList<>(minecraftToLoaderVersionsHashmap.values()).get(i).size();
62+
}
63+
64+
@Override
65+
public Object getGroup(int i) {
66+
return getGameVersion(i);
67+
}
68+
69+
@Override
70+
public Object getChild(int i, int i1) {
71+
return getForgeVersion(i, i1);
72+
}
73+
74+
@Override
75+
public long getGroupId(int i) {
76+
return i;
77+
}
78+
79+
@Override
80+
public long getChildId(int i, int i1) {
81+
return i1;
82+
}
83+
84+
@Override
85+
public boolean hasStableIds() {
86+
return true;
87+
}
88+
89+
@Override
90+
public View getGroupView(int i, boolean b, View convertView, ViewGroup viewGroup) {
91+
if(convertView == null)
92+
convertView = mLayoutInflater.inflate(android.R.layout.simple_expandable_list_item_1, viewGroup, false);
93+
94+
((TextView) convertView).setText(getGameVersion(i));
95+
96+
return convertView;
97+
}
98+
99+
@Override
100+
public View getChildView(int i, int i1, boolean b, View convertView, ViewGroup viewGroup) {
101+
if(convertView == null)
102+
convertView = mLayoutInflater.inflate(android.R.layout.simple_expandable_list_item_1, viewGroup, false);
103+
((TextView) convertView).setText(getForgeVersion(i, i1));
104+
return convertView;
105+
}
106+
107+
private String getGameVersion(int i) {
108+
return minecraftToLoaderVersionsHashmap.keySet().toArray()[i].toString();
109+
}
110+
111+
private String getForgeVersion(int i, int i1){
112+
return new ArrayList<>(minecraftToLoaderVersionsHashmap.values()).get(i).toArray()[i1].toString();
113+
}
114+
115+
@Override
116+
public boolean isChildSelectable(int i, int i1) {
117+
return true;
118+
}
119+
}

app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/tasks/AsyncVersionList.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ public class AsyncVersionList {
2626

2727
public void getVersionList(@Nullable VersionDoneListener listener, boolean secondPass){
2828
sExecutorService.execute(() -> {
29-
File versionFile = new File(Tools.DIR_DATA + "/version_list.json");
29+
File versionFile = new File(Tools.DIR_CACHE + "/version_list.json");
3030
JMinecraftVersionList versionList = null;
3131
try{
3232
if(!versionFile.exists() || (System.currentTimeMillis() > versionFile.lastModified() + 86400000 )){
@@ -68,7 +68,7 @@ private JMinecraftVersionList downloadVersionList(String mirror){
6868

6969
// Then save the version list
7070
//TODO make it not save at times ?
71-
FileOutputStream fos = new FileOutputStream(Tools.DIR_DATA + "/version_list.json");
71+
FileOutputStream fos = new FileOutputStream(Tools.DIR_CACHE + "/version_list.json");
7272
fos.write(jsonString.getBytes());
7373
fos.close();
7474

0 commit comments

Comments
 (0)