diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/LauncherActivity.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/LauncherActivity.java index 44a873b47..9b8834d17 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/LauncherActivity.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/LauncherActivity.java @@ -43,11 +43,13 @@ import net.kdt.pojavlaunch.services.ProgressServiceKeeper; import net.kdt.pojavlaunch.tasks.AsyncMinecraftDownloader; import net.kdt.pojavlaunch.tasks.AsyncVersionList; import net.kdt.pojavlaunch.tasks.MinecraftDownloader; +import net.kdt.pojavlaunch.utils.DateUtils; import net.kdt.pojavlaunch.utils.NotificationUtils; import net.kdt.pojavlaunch.value.launcherprofiles.LauncherProfiles; import net.kdt.pojavlaunch.value.launcherprofiles.MinecraftProfile; import java.lang.ref.WeakReference; +import java.text.ParseException; public class LauncherActivity extends BaseActivity { public static final String SETTING_FRAGMENT_TAG = "SETTINGS_FRAGMENT"; @@ -125,6 +127,23 @@ public class LauncherActivity extends BaseActivity { } String normalizedVersionId = AsyncMinecraftDownloader.normalizeVersionId(prof.lastVersionId); JMinecraftVersionList.Version mcVersion = AsyncMinecraftDownloader.getListedVersion(normalizedVersionId); + + // Do not load when is a modded version or older than minecraft 1.3 on demo account + if (mAccountSpinner.getSelectedAccount().isDemo()) { + boolean isOlderThan13 = true; + + if (mcVersion != null) { + try { + isOlderThan13 = DateUtils.dateBefore(DateUtils.parseReleaseDate(mcVersion.releaseTime), 2012, 6, 22); + } catch (ParseException ignored) {} + } + + if (isOlderThan13) { + Toast.makeText(this, R.string.toast_not_available_demo, Toast.LENGTH_LONG).show(); + return false; + } + } + new MinecraftDownloader().start( this, mcVersion, diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/Tools.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/Tools.java index ed09c8532..5c7f54b46 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/Tools.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/Tools.java @@ -118,6 +118,7 @@ public final class Tools { public static String DIR_ACCOUNT_NEW; public static String DIR_GAME_HOME = Environment.getExternalStorageDirectory().getAbsolutePath() + "/games/PojavLauncher"; public static String DIR_GAME_NEW; + public static String GAME_PROFILES_FILE; // New since 3.0.0 public static String DIRNAME_HOME_JRE = "lib"; @@ -200,6 +201,8 @@ public final class Tools { OBSOLETE_RESOURCES_PATH = DIR_GAME_NEW + "/resources"; CTRLMAP_PATH = DIR_GAME_HOME + "/controlmap"; CTRLDEF_FILE = DIR_GAME_HOME + "/controlmap/default.json"; + GAME_PROFILES_FILE = Tools.DIR_GAME_NEW + "/launcher_profiles.json"; + switchDemo(isDemoProfile(ctx)); } /** @@ -461,7 +464,7 @@ public final class Tools { } public static String[] getMinecraftClientArgs(MinecraftAccount profile, JMinecraftVersionList.Version versionInfo, File gameDir) { - String username = profile.username; + String username = profile.username.replace("Demo.", ""); String versionName = versionInfo.id; if (versionInfo.inheritsFrom != null) { versionName = versionInfo.inheritsFrom; @@ -506,13 +509,13 @@ public final class Tools { } } - return JSONUtils.insertJSONValueList( - splitAndFilterEmpty( - versionInfo.minecraftArguments == null ? - fromStringArray(minecraftArgs.toArray(new String[0])): - versionInfo.minecraftArguments - ), varArgMap - ); + String mcArguments = versionInfo.minecraftArguments == null ? + fromStringArray(minecraftArgs.toArray(new String[0])): + versionInfo.minecraftArguments; + + if(profile.isDemo()) mcArguments += " --demo"; + + return JSONUtils.insertJSONValueList(splitAndFilterEmpty(mcArguments), varArgMap); } public static String fromStringArray(String[] strArr) { @@ -1413,4 +1416,26 @@ public final class Tools { } }).show(); } + + public static void switchDemo(boolean isDemo){ + if(isDemo) { + DIR_GAME_NEW = DIR_DATA + "/demo/.minecraft"; + } else { + DIR_GAME_NEW = DIR_GAME_HOME + "/.minecraft"; + } + DIR_HOME_VERSION = DIR_GAME_NEW + "/versions"; + DIR_HOME_LIBRARY = DIR_GAME_NEW + "/libraries"; + ASSETS_PATH = DIR_GAME_NEW + "/assets"; + OBSOLETE_RESOURCES_PATH = DIR_GAME_NEW + "/resources"; + } + + public static boolean isDemoProfile(Context ctx){ + MinecraftAccount currentProfile = PojavProfile.getCurrentProfileContent(ctx, null); + return currentProfile != null && currentProfile.isDemo(); + } + + public static boolean isLocalProfile(Context ctx){ + MinecraftAccount currentProfile = PojavProfile.getCurrentProfileContent(ctx, null); + return currentProfile == null || currentProfile.isLocal(); + } } diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/authenticator/microsoft/MicrosoftBackgroundLogin.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/authenticator/microsoft/MicrosoftBackgroundLogin.java index 297b4da75..351c6e268 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/authenticator/microsoft/MicrosoftBackgroundLogin.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/authenticator/microsoft/MicrosoftBackgroundLogin.java @@ -87,17 +87,15 @@ public class MicrosoftBackgroundLogin { MinecraftAccount acc = MinecraftAccount.load(mcName); if(acc == null) acc = new MinecraftAccount(); - if (doesOwnGame) { - acc.xuid = xsts[0]; - acc.clientToken = "0"; /* FIXME */ - acc.accessToken = mcToken; - acc.username = mcName; - acc.profileId = mcUuid; - acc.isMicrosoft = true; - acc.msaRefreshToken = msRefreshToken; - acc.expiresAt = expiresAt; - acc.updateSkinFace(); - } + acc.xuid = xsts[0]; + acc.clientToken = "0"; /* FIXME */ + acc.accessToken = mcToken; + acc.username = mcName; + acc.profileId = mcUuid; + acc.isMicrosoft = true; + acc.msaRefreshToken = msRefreshToken; + acc.expiresAt = expiresAt; + acc.updateSkinFace(); acc.save(); if(doneListener != null) { @@ -298,7 +296,9 @@ public class MicrosoftBackgroundLogin { }else{ Log.i("MicrosoftLogin","It seems that this Microsoft Account does not own the game."); doesOwnGame = false; - throw new PresentedException(new RuntimeException(conn.getResponseMessage()), R.string.minecraft_not_owned); + mcName = "Demo.Player"; + mcUuid = "00000000-0000-0000-0000-000000000000"; + //throw new PresentedException(new RuntimeException(conn.getResponseMessage()), R.string.minecraft_not_owned); //throwResponseError(conn); } } diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/fragments/MainMenuFragment.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/fragments/MainMenuFragment.java index c760ecfa8..9bf421727 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/fragments/MainMenuFragment.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/fragments/MainMenuFragment.java @@ -89,6 +89,12 @@ public class MainMenuFragment extends Fragment { } private void runInstallerWithConfirmation(boolean isCustomArgs) { + // avoid using custom installers to install a version + if(Tools.isLocalProfile(requireContext()) || Tools.isDemoProfile(requireContext())){ + Toast.makeText(requireContext(), R.string.toast_not_available_demo, Toast.LENGTH_LONG).show(); + return; + } + if (ProgressKeeper.getTaskCount() == 0) Tools.installMod(requireActivity(), isCustomArgs); else diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/fragments/OptiFineInstallFragment.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/fragments/OptiFineInstallFragment.java index 8b5a32b15..a48bc94c8 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/fragments/OptiFineInstallFragment.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/fragments/OptiFineInstallFragment.java @@ -41,7 +41,7 @@ public class OptiFineInstallFragment extends ModVersionListFragment Tools.swapFragment(requireActivity(), OptiFineInstallFragment.class, - OptiFineInstallFragment.TAG, null)); + view.findViewById(R.id.optifine_profile).setOnClickListener(v -> + tryInstall(OptiFineInstallFragment.class, OptiFineInstallFragment.TAG)); view.findViewById(R.id.modded_profile_fabric).setOnClickListener((v)-> - Tools.swapFragment(requireActivity(), FabricInstallFragment.class, FabricInstallFragment.TAG, null)); + tryInstall(FabricInstallFragment.class, FabricInstallFragment.TAG)); view.findViewById(R.id.modded_profile_forge).setOnClickListener((v)-> - Tools.swapFragment(requireActivity(), ForgeInstallFragment.class, ForgeInstallFragment.TAG, null)); + tryInstall(ForgeInstallFragment.class, ForgeInstallFragment.TAG)); view.findViewById(R.id.modded_profile_modpack).setOnClickListener((v)-> - Tools.swapFragment(requireActivity(), SearchModFragment.class, SearchModFragment.TAG, null)); + tryInstall(SearchModFragment.class, SearchModFragment.TAG)); view.findViewById(R.id.modded_profile_quilt).setOnClickListener((v)-> - Tools.swapFragment(requireActivity(), QuiltInstallFragment.class, QuiltInstallFragment.TAG, null)); + tryInstall(QuiltInstallFragment.class, QuiltInstallFragment.TAG)); view.findViewById(R.id.modded_profile_bta).setOnClickListener((v)-> - Tools.swapFragment(requireActivity(), BTAInstallFragment.class, BTAInstallFragment.TAG, null)); + tryInstall(BTAInstallFragment.class, BTAInstallFragment.TAG)); + } + + private void tryInstall(Class fragmentClass, String tag){ + if(Tools.isLocalProfile(requireContext()) || Tools.isDemoProfile(requireContext())){ + Toast.makeText(requireContext(), R.string.toast_not_available_demo, Toast.LENGTH_LONG).show(); + } else { + Tools.swapFragment(requireActivity(), fragmentClass, tag, null); + } } } diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/modloaders/OptiFineDownloadTask.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/modloaders/OptiFineDownloadTask.java index 91e396ac3..8cba39414 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/modloaders/OptiFineDownloadTask.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/modloaders/OptiFineDownloadTask.java @@ -1,5 +1,7 @@ package net.kdt.pojavlaunch.modloaders; +import android.app.Activity; + import com.kdt.mcgui.ProgressLayout; import net.kdt.pojavlaunch.JMinecraftVersionList; @@ -22,11 +24,13 @@ public class OptiFineDownloadTask implements Runnable, Tools.DownloaderFeedback, private final ModloaderDownloadListener mListener; private final Object mMinecraftDownloadLock = new Object(); private Throwable mDownloaderThrowable; + private final Activity activity; - public OptiFineDownloadTask(OptiFineUtils.OptiFineVersion mOptiFineVersion, ModloaderDownloadListener mListener) { + public OptiFineDownloadTask(OptiFineUtils.OptiFineVersion mOptiFineVersion, ModloaderDownloadListener mListener, Activity activity) { this.mOptiFineVersion = mOptiFineVersion; this.mDestinationFile = new File(Tools.DIR_CACHE, "optifine-installer.jar"); this.mListener = mListener; + this.activity = activity; } @Override @@ -89,7 +93,7 @@ public class OptiFineDownloadTask implements Runnable, Tools.DownloaderFeedback, if(minecraftJsonVersion == null) return false; try { synchronized (mMinecraftDownloadLock) { - new MinecraftDownloader().start(null, minecraftJsonVersion, minecraftVersion, this); + new MinecraftDownloader().start(activity, minecraftJsonVersion, minecraftVersion, this); mMinecraftDownloadLock.wait(); } }catch (InterruptedException e) { diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/tasks/MinecraftDownloader.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/tasks/MinecraftDownloader.java index 1c7bc7fbe..6b49703af 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/tasks/MinecraftDownloader.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/tasks/MinecraftDownloader.java @@ -54,6 +54,8 @@ public class MinecraftDownloader { private static final ThreadLocal sThreadLocalDownloadBuffer = new ThreadLocal<>(); + private boolean isLocalProfile = false; + /** * Start the game version download process on the global executor service. * @param activity Activity, used for automatic installation of JRE 17 if needed @@ -64,6 +66,14 @@ public class MinecraftDownloader { public void start(@Nullable Activity activity, @Nullable JMinecraftVersionList.Version version, @NonNull String realVersion, // this was there for a reason @NonNull AsyncMinecraftDownloader.DoneListener listener) { + if(activity != null){ + isLocalProfile = Tools.isLocalProfile(activity); + Tools.switchDemo(Tools.isDemoProfile(activity)); + } else { + isLocalProfile = true; + Tools.switchDemo(true); + } + sExecutorService.execute(() -> { try { downloadGame(activity, version, realVersion); @@ -506,6 +516,10 @@ public class MinecraftDownloader { } private void downloadFile() throws Exception { + if(isLocalProfile){ + throw new RuntimeException("Download failed. Please make sure you are logged in with a Microsoft Account."); + } + try { DownloadUtils.ensureSha1(mTargetPath, mTargetSha1, () -> { DownloadMirror.downloadFileMirrored(mDownloadClass, mTargetUrl, mTargetPath, diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/value/MinecraftAccount.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/value/MinecraftAccount.java index 68c871c95..4c524da5d 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/value/MinecraftAccount.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/value/MinecraftAccount.java @@ -45,7 +45,11 @@ public class MinecraftAccount { } public boolean isLocal(){ - return accessToken.equals("0"); + return accessToken.equals("0") && !username.startsWith("Demo."); + } + + public boolean isDemo(){ + return username.startsWith("Demo."); } public void updateSkinFace() { diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/value/launcherprofiles/LauncherProfiles.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/value/launcherprofiles/LauncherProfiles.java index e13c9d83d..1b477d53e 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/value/launcherprofiles/LauncherProfiles.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/value/launcherprofiles/LauncherProfiles.java @@ -16,7 +16,7 @@ import java.util.UUID; public class LauncherProfiles { public static MinecraftLauncherProfiles mainProfileJson; - private static final File launcherProfilesFile = new File(Tools.DIR_GAME_NEW, "launcher_profiles.json"); + private static final File launcherProfilesFile = new File(Tools.GAME_PROFILES_FILE); /** Reload the profile from the file, creating a default one if necessary */ public static void load(){ diff --git a/app_pojavlauncher/src/main/res/values/strings.xml b/app_pojavlauncher/src/main/res/values/strings.xml index c76622da5..95c5d4462 100644 --- a/app_pojavlauncher/src/main/res/values/strings.xml +++ b/app_pojavlauncher/src/main/res/values/strings.xml @@ -252,7 +252,7 @@ Add account Tasks are in progress, please wait No saved accounts - Failed to download Minecraft! This could be due to bad network connection, incorrectly placed files, etc.. + Failed to download Minecraft! This could be due to bad network connection, incorrectly placed files, trying to download Minecraft from a Local account, etc.. Unknown Xbox Live API error %d You don\'t seem to have an Xbox Live account. Please log in once on https://minecraft.net/ and try again. An adult needs to verify your account. @@ -430,4 +430,5 @@ Untested BTA versions Nightly BTA versions Extracting native libraries (%d/%d) + This is not available in demo mode