diff --git a/app_pojavlauncher/src/main/java/com/kdt/mcgui/mcAccountSpinner.java b/app_pojavlauncher/src/main/java/com/kdt/mcgui/mcAccountSpinner.java index 3f6839779..9bd6a10fc 100644 --- a/app_pojavlauncher/src/main/java/com/kdt/mcgui/mcAccountSpinner.java +++ b/app_pojavlauncher/src/main/java/com/kdt/mcgui/mcAccountSpinner.java @@ -2,7 +2,6 @@ package com.kdt.mcgui; import android.animation.ObjectAnimator; import android.annotation.SuppressLint; -import android.app.AlertDialog; import android.content.Context; import android.graphics.Bitmap; import android.graphics.Canvas; @@ -30,11 +29,11 @@ import net.kdt.pojavlaunch.Tools; import net.kdt.pojavlaunch.authenticator.listener.DoneListener; import net.kdt.pojavlaunch.authenticator.listener.ErrorListener; import net.kdt.pojavlaunch.authenticator.listener.ProgressListener; +import net.kdt.pojavlaunch.authenticator.microsoft.PresentedException; import net.kdt.pojavlaunch.authenticator.microsoft.MicrosoftBackgroundLogin; import net.kdt.pojavlaunch.extra.ExtraConstants; import net.kdt.pojavlaunch.extra.ExtraCore; import net.kdt.pojavlaunch.extra.ExtraListener; -import net.kdt.pojavlaunch.services.ProgressService; import net.kdt.pojavlaunch.value.MinecraftAccount; import java.io.File; @@ -93,7 +92,12 @@ public class mcAccountSpinner extends AppCompatSpinner implements AdapterView.On private final ErrorListener mErrorListener = errorMessage -> { mLoginBarPaint.setColor(Color.RED); - Tools.showError(getContext(), errorMessage); + if(errorMessage instanceof PresentedException) { + PresentedException exception = (PresentedException) errorMessage; + Tools.showError(getContext(), exception.toString(getContext()), exception.getCause()); + }else { + Tools.showError(getContext(), errorMessage); + } invalidate(); }; 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 ee1a9a33d..358ffc720 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/Tools.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/Tools.java @@ -567,21 +567,24 @@ public final class Tools { } public static void showError(final Context ctx, final Throwable e, final boolean exitIfOk) { - showError(ctx, R.string.global_error, 0 ,e, exitIfOk, false); + showError(ctx, R.string.global_error, null ,e, exitIfOk, false); } public static void showError(final Context ctx, final int rolledMessage, final Throwable e) { + showError(ctx, R.string.global_error, ctx.getString(rolledMessage), e, false, false); + } + public static void showError(final Context ctx, final String rolledMessage, final Throwable e) { showError(ctx, R.string.global_error, rolledMessage, e, false, false); } public static void showError(final Context ctx, final int titleId, final Throwable e, final boolean exitIfOk) { - showError(ctx, titleId, 0, e, exitIfOk, false); + showError(ctx, titleId, null, e, exitIfOk, false); } - private static void showError(final Context ctx, final int titleId, final int rolledMessage, final Throwable e, final boolean exitIfOk, final boolean showMore) { + private static void showError(final Context ctx, final int titleId, final String rolledMessage, final Throwable e, final boolean exitIfOk, final boolean showMore) { e.printStackTrace(); Runnable runnable = () -> { - final String errMsg = showMore ? printToString(e) : rolledMessage != 0 ? ctx.getString(rolledMessage) : e.getMessage(); + final String errMsg = showMore ? printToString(e) : rolledMessage != null ? rolledMessage : e.getMessage(); AlertDialog.Builder builder = new AlertDialog.Builder((Context) ctx) .setTitle(titleId) .setMessage(errMsg) 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 b6b670745..3722a46a1 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 @@ -3,12 +3,14 @@ package net.kdt.pojavlaunch.authenticator.microsoft; import static net.kdt.pojavlaunch.PojavApplication.sExecutorService; import android.os.Looper; +import android.util.ArrayMap; import android.util.Log; import androidx.annotation.Nullable; import com.kdt.mcgui.ProgressLayout; +import net.kdt.pojavlaunch.R; import net.kdt.pojavlaunch.Tools; import net.kdt.pojavlaunch.value.MinecraftAccount; import net.kdt.pojavlaunch.authenticator.listener.*; @@ -39,6 +41,15 @@ public class MicrosoftBackgroundLogin { private final boolean mIsRefresh; private final String mAuthCode; private final android.os.Handler mHandler = new android.os.Handler(Looper.getMainLooper()); + private static final Map XSTS_ERRORS; + static { + XSTS_ERRORS = new ArrayMap<>(); + XSTS_ERRORS.put(2148916233L, R.string.xerr_no_account); + XSTS_ERRORS.put(2148916235L, R.string.xerr_not_available); + XSTS_ERRORS.put(2148916236L ,R.string.xerr_adult_verification); + XSTS_ERRORS.put(2148916237L ,R.string.xerr_adult_verification); + XSTS_ERRORS.put(2148916238L ,R.string.xerr_child); + } /* Fields used to fill the account */ public boolean isRefresh; @@ -181,7 +192,7 @@ public class MicrosoftBackgroundLogin { } /** @return [uhs, token]*/ - private String[] acquireXsts(String xblToken) throws IOException, JSONException { + private String[] acquireXsts(String xblToken) throws IOException, JSONException, PresentedException { URL url = new URL(xstsAuthUrl); JSONObject data = new JSONObject(); @@ -211,6 +222,15 @@ public class MicrosoftBackgroundLogin { Log.i("MicrosoftLogin","Xbl Xsts = " + token + "; Uhs = " + uhs); return new String[]{uhs, token}; //acquireMinecraftToken(uhs,jo.getString("Token")); + }else if(conn.getResponseCode() == 401) { + String responseContents = Tools.read(conn.getErrorStream()); + JSONObject jo = new JSONObject(responseContents); + long xerr = jo.optLong("XErr", -1); + Integer locale_id = XSTS_ERRORS.get(xerr); + if(locale_id != null) { + throw new PresentedException(new RuntimeException(responseContents), locale_id); + } + throw new PresentedException(new RuntimeException(responseContents), R.string.xerr_unknown, xerr); }else{ throwResponseError(conn); } @@ -248,7 +268,7 @@ public class MicrosoftBackgroundLogin { return null; } - private void checkMcProfile(String mcAccessToken) throws IOException, JSONException { + private void checkMcProfile(String mcAccessToken) throws IOException, JSONException, PresentedException { URL url = new URL(mcProfileUrl); HttpURLConnection conn = (HttpURLConnection)url.openConnection(); @@ -274,8 +294,8 @@ public class MicrosoftBackgroundLogin { }else{ Log.i("MicrosoftLogin","It seems that this Microsoft Account does not own the game."); doesOwnGame = false; - - throwResponseError(conn); + 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/authenticator/microsoft/PresentedException.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/authenticator/microsoft/PresentedException.java new file mode 100644 index 000000000..90beb1408 --- /dev/null +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/authenticator/microsoft/PresentedException.java @@ -0,0 +1,23 @@ +package net.kdt.pojavlaunch.authenticator.microsoft; + +import android.content.Context; + +public class PresentedException extends Exception { + final int localizationStringId; + final Object[] extraArgs; + + public PresentedException(int localizationStringId, Object... extraArgs) { + this.localizationStringId = localizationStringId; + this.extraArgs = extraArgs; + } + + public PresentedException(Throwable throwable, int localizationStringId, Object... extraArgs) { + super(throwable); + this.localizationStringId = localizationStringId; + this.extraArgs = extraArgs; + } + + public String toString(Context context) { + return context.getString(localizationStringId, extraArgs); + } +} diff --git a/app_pojavlauncher/src/main/res/values/strings.xml b/app_pojavlauncher/src/main/res/values/strings.xml index ac55e0802..def7dcf87 100644 --- a/app_pojavlauncher/src/main/res/values/strings.xml +++ b/app_pojavlauncher/src/main/res/values/strings.xml @@ -325,4 +325,10 @@ No saved accounts Downloading version list… Failed to download Minecraft! This could be due to bad network connection, incorrectly placed files, 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. + Your account is a child account, and needs to be added into a Family in order to log in. + It seems like this account does not have a Minecraft profile. If you have Xbox Game Pass, please log in on https://minecraft.net/ and set it up. + Xbox Live is not available in your country