Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Create NeoForge Profiles Update #5203

Open
wants to merge 5 commits into
base: v3_openjdk
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
package net.kdt.pojavlaunch.fragments;

import android.content.Context;
import android.content.Intent;
import android.view.LayoutInflater;
import android.widget.ExpandableListAdapter;
import androidx.annotation.NonNull;
import net.kdt.pojavlaunch.JavaGUILauncherActivity;
import net.kdt.pojavlaunch.R;
import net.kdt.pojavlaunch.modloaders.*;

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

public class NeoForgeInstallFragment extends ModVersionListFragment<List<String>> {
public static final String TAG = "NeoForgeInstallFragment";
private static ModloaderListenerProxy sTaskProxy;

@Override
public void onAttach(@NonNull Context context) {
super.onAttach(context);
}

@Override
public int getTitleText() {
return R.string.neoforge_dl_select_version;
}

@Override
public int getNoDataMsg() {
return R.string.neoforge_dl_no_installer;
}

@Override
public ModloaderListenerProxy getTaskProxy() {
return sTaskProxy;
}
@Override
public void setTaskProxy(ModloaderListenerProxy proxy) {
sTaskProxy = proxy;
}

@Override
public List<String> loadVersionList() throws IOException {
List<String> versions = new ArrayList<>();
versions.addAll(NeoForgeUtils.downloadNeoForgedForgeVersions());
versions.addAll(NeoForgeUtils.downloadNeoForgeVersions());
return versions;
}

@Override
public ExpandableListAdapter createAdapter(List<String> versionList, LayoutInflater layoutInflater) {
return new NeoForgeVersionListAdapter(versionList, layoutInflater);
}

@Override
public Runnable createDownloadTask(Object selectedVersion, ModloaderListenerProxy listenerProxy) {
return new NeoForgeDownloadTask(listenerProxy, (String) selectedVersion);
}

@Override
public void onDownloadFinished(Context context, File downloadedFile) {
Intent modInstallerStartIntent = new Intent(context, JavaGUILauncherActivity.class);
NeoForgeUtils.addAutoInstallArgs(modInstallerStartIntent, downloadedFile);
context.startActivity(modInstallerStartIntent);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,8 @@ public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceStat
Tools.swapFragment(requireActivity(), FabricInstallFragment.class, FabricInstallFragment.TAG, null));
view.findViewById(R.id.modded_profile_forge).setOnClickListener((v)->
Tools.swapFragment(requireActivity(), ForgeInstallFragment.class, ForgeInstallFragment.TAG, null));
view.findViewById(R.id.modded_profile_neoforge).setOnClickListener((v)->
Tools.swapFragment(requireActivity(), NeoForgeInstallFragment.class, NeoForgeInstallFragment.TAG, null));
view.findViewById(R.id.modded_profile_modpack).setOnClickListener((v)->
Tools.swapFragment(requireActivity(), SearchModFragment.class, SearchModFragment.TAG, null));
view.findViewById(R.id.modded_profile_quilt).setOnClickListener((v)->
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,115 @@
package net.kdt.pojavlaunch.modloaders;

import com.kdt.mcgui.ProgressLayout;
import net.kdt.pojavlaunch.R;
import net.kdt.pojavlaunch.Tools;
import net.kdt.pojavlaunch.progresskeeper.ProgressKeeper;
import net.kdt.pojavlaunch.utils.DownloadUtils;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.List;

public class NeoForgeDownloadTask implements Runnable, Tools.DownloaderFeedback {
private String mDownloadUrl;
private String mFullVersion;
private String mLoaderVersion;
private String mGameVersion;
private final ModloaderDownloadListener mListener;
public NeoForgeDownloadTask(ModloaderDownloadListener listener, String neoforgeVersion) {
this.mListener = listener;
if (neoforgeVersion.contains("1.20.1")) {
this.mDownloadUrl = NeoForgeUtils.getNeoForgedForgeInstallerUrl(neoforgeVersion);
} else{
this.mDownloadUrl = NeoForgeUtils.getNeoForgeInstallerUrl(neoforgeVersion);
}
this.mFullVersion = neoforgeVersion;
}

public NeoForgeDownloadTask(ModloaderDownloadListener listener, String gameVersion, String loaderVersion) {
this.mListener = listener;
this.mLoaderVersion = loaderVersion;
this.mGameVersion = gameVersion;
}

@Override
public void run() {
if (this.mFullVersion != null) {
try {
if (this.mFullVersion.contains("1.20.1") ? determineNeoForgedForgeDownloadUrl() : determineNeoForgeDownloadUrl()) {
downloadNeoForge();
}
} catch (IOException e) {
throw new RuntimeException(e);
}
} else {
try {
if (this.mGameVersion.equals("1.20.1") ? determineNeoForgedForgeDownloadUrl() : determineNeoForgeDownloadUrl()) {
downloadNeoForge();
}
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}

@Override
public void updateProgress(int curr, int max) {
int progress100 = (int)(((float)curr / (float)max)*100f);
ProgressKeeper.submitProgress(ProgressLayout.INSTALL_MODPACK, progress100, R.string.forge_dl_progress, mFullVersion);
}

private void downloadNeoForge() {
ProgressKeeper.submitProgress(ProgressLayout.INSTALL_MODPACK, 0, R.string.forge_dl_progress, mFullVersion);
try {
File destinationFile = new File(Tools.DIR_CACHE, "neoforge-installer.jar");
byte[] buffer = new byte[8192];
DownloadUtils.downloadFileMonitored(mDownloadUrl, destinationFile, buffer, this);
mListener.onDownloadFinished(destinationFile);
}catch (FileNotFoundException e) {
mListener.onDataNotAvailable();
} catch (IOException e) {
mListener.onDownloadError(e);
}
}

private boolean determineDownloadUrl(boolean findVersion){
if(mDownloadUrl != null && mFullVersion != null) return true;
ProgressKeeper.submitProgress(ProgressLayout.INSTALL_MODPACK, 0, R.string.neoforge_dl_searching);
if(!findVersion) {
mListener.onDataNotAvailable();
return false;
}
return true;
}

public boolean determineNeoForgeDownloadUrl() throws IOException {
return determineDownloadUrl(findNeoForgeVersion());
}

public boolean determineNeoForgedForgeDownloadUrl() throws IOException {
return determineDownloadUrl(findNeoForgedForgeVersion());
}

private boolean findVersion(List<String> neoForgeUtils, String installerUrl) {
if(neoForgeUtils == null) return false;
String versionStart = mGameVersion+"-"+mLoaderVersion;
for(String versionName : neoForgeUtils) {
if(!versionName.startsWith(versionStart)) continue;
mFullVersion = versionName;
mDownloadUrl = installerUrl;
return true;
}
return false;
}

public boolean findNeoForgeVersion() throws IOException {
return findVersion(NeoForgeUtils.downloadNeoForgeVersions(), NeoForgeUtils.getNeoForgeInstallerUrl(mFullVersion));
}

public boolean findNeoForgedForgeVersion() throws IOException {
return findVersion(NeoForgeUtils.downloadNeoForgedForgeVersions(), NeoForgeUtils.getNeoForgedForgeInstallerUrl(mFullVersion));
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
package net.kdt.pojavlaunch.modloaders;

import android.content.Intent;
import net.kdt.pojavlaunch.utils.DownloadUtils;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;

import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import java.io.File;
import java.io.IOException;
import java.io.StringReader;
import java.util.List;

public class NeoForgeUtils {
private static final String NEOFORGE_METADATA_URL = "https://maven.neoforged.net/releases/net/neoforged/neoforge/maven-metadata.xml";
private static final String NEOFORGE_INSTALLER_URL = "https://maven.neoforged.net/releases/net/neoforged/neoforge/%1$s/neoforge-%1$s-installer.jar";
private static final String NEOFORGED_FORGE_METADATA_URL = "https://maven.neoforged.net/releases/net/neoforged/forge/maven-metadata.xml";
private static final String NEOFORGED_FORGE_INSTALLER_URL = "https://maven.neoforged.net/releases/net/neoforged/forge/%1$s/forge-%1$s-installer.jar";

private static List<String> downloadVersions(String metaDataUrl, String name) throws IOException {
SAXParser saxParser;
try {
SAXParserFactory parserFactory = SAXParserFactory.newInstance();
saxParser = parserFactory.newSAXParser();
}catch (SAXException | ParserConfigurationException e) {
e.printStackTrace();
// if we cant make a parser we might as well not even try to parse anything
return null;
}
try {
//of_test();
return DownloadUtils.downloadStringCached(metaDataUrl, name, input -> {
try {
ForgeVersionListHandler handler = new ForgeVersionListHandler();
saxParser.parse(new InputSource(new StringReader(input)), handler);
return handler.getVersions();
// IOException is present here StringReader throws it only if the parser called close()
// sooner than needed, which is a parser issue and not an I/O one
}catch (SAXException | IOException e) {
throw new DownloadUtils.ParseException(e);
}
});
}catch (DownloadUtils.ParseException e) {
e.printStackTrace();
return null;
}
}

public static List<String> downloadNeoForgeVersions() throws IOException {
return downloadVersions(NEOFORGE_METADATA_URL, "neoforge_versions");
}

public static List<String> downloadNeoForgedForgeVersions() throws IOException {
return downloadVersions(NEOFORGED_FORGE_METADATA_URL, "neoforged_forge_versions");
}

public static String getNeoForgeInstallerUrl(String version) {
return String.format(NEOFORGE_INSTALLER_URL, version);
}

public static String getNeoForgedForgeInstallerUrl(String version) {
return String.format(NEOFORGED_FORGE_INSTALLER_URL, version);
}

public static void addAutoInstallArgs(Intent intent, File modInstallerJar) {
intent.putExtra("javaArgs", "-jar "+modInstallerJar.getAbsolutePath());
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,125 @@
package net.kdt.pojavlaunch.modloaders;

import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseExpandableListAdapter;
import android.widget.ExpandableListAdapter;
import android.widget.TextView;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class NeoForgeVersionListAdapter extends BaseExpandableListAdapter implements ExpandableListAdapter {
private final List<String> mGameVersions;
private final List<List<String>> mNeoForgeVersions;
private final LayoutInflater mLayoutInflater;

public NeoForgeVersionListAdapter(List<String> neoforgeVersions, LayoutInflater layoutInflater) {
this.mLayoutInflater = layoutInflater;
//As the version list of NeoForge is in reverse order, it needs to be flipped before use.
Collections.reverse(neoforgeVersions);
mGameVersions = new ArrayList<>();
mNeoForgeVersions = new ArrayList<>();
for(String version : neoforgeVersions) {
String gameVersion = null;
int dashIndex;
if (!version.contains("1.20.1") && !version.contains("47.1.82")) {
//For example, in the string "20.2.3-beta", only the substring "20.2" is needed.
dashIndex = version.indexOf(".", 3);
gameVersion = "1." + version.substring(0, dashIndex); // "1." + "20.2"
} else if (version.contains("1.20.1")) {
dashIndex = version.indexOf("-");
gameVersion = version.substring(0, dashIndex); // "1.20.1"
} else if (version.equals("47.1.82")) {
gameVersion = "1.20.1";
List<String> versionList;
int gameVersionIndex = mGameVersions.indexOf(gameVersion);
if(gameVersionIndex != -1) versionList = mNeoForgeVersions.get(gameVersionIndex);
else {
versionList = new ArrayList<>();
mGameVersions.add("47.1.82");
mNeoForgeVersions.add(versionList);
}
versionList.add(version);
continue;
}
List<String> versionList;
int gameVersionIndex = mGameVersions.indexOf(gameVersion);
if(gameVersionIndex != -1) versionList = mNeoForgeVersions.get(gameVersionIndex);
else {
versionList = new ArrayList<>();
mGameVersions.add(gameVersion);
mNeoForgeVersions.add(versionList);
}
versionList.add(version);
}
}

@Override
public int getGroupCount() {
return mGameVersions.size();
}

@Override
public int getChildrenCount(int i) {
return mNeoForgeVersions.get(i).size();
}

@Override
public Object getGroup(int i) {
return getGameVersion(i);
}

@Override
public Object getChild(int i, int i1) {
return getForgeVersion(i, i1);
}

@Override
public long getGroupId(int i) {
return i;
}

@Override
public long getChildId(int i, int i1) {
return i1;
}

@Override
public boolean hasStableIds() {
return true;
}

@Override
public View getGroupView(int i, boolean b, View convertView, ViewGroup viewGroup) {
if(convertView == null)
convertView = mLayoutInflater.inflate(android.R.layout.simple_expandable_list_item_1, viewGroup, false);

((TextView) convertView).setText(getGameVersion(i));

return convertView;
}

@Override
public View getChildView(int i, int i1, boolean b, View convertView, ViewGroup viewGroup) {
if(convertView == null)
convertView = mLayoutInflater.inflate(android.R.layout.simple_expandable_list_item_1, viewGroup, false);
((TextView) convertView).setText(getForgeVersion(i, i1));
return convertView;
}

private String getGameVersion(int i) {
return mGameVersions.get(i);
}

private String getForgeVersion(int i, int i1){
return mNeoForgeVersions.get(i).get(i1);
}

@Override
public boolean isChildSelectable(int i, int i1) {
return true;
}
}
Loading