diff --git a/app/src/main/java/com/fox2code/mmm/MainApplication.java b/app/src/main/java/com/fox2code/mmm/MainApplication.java index 8ae52fc..7fe29bf 100644 --- a/app/src/main/java/com/fox2code/mmm/MainApplication.java +++ b/app/src/main/java/com/fox2code/mmm/MainApplication.java @@ -158,6 +158,11 @@ public class MainApplication extends FoxApplication return getSharedPreferences().getBoolean("pref_background_update_check", true); } + public static boolean isAndroidacyTestMode() { + return isDeveloper() && + getSharedPreferences().getBoolean("pref_androidacy_test_mode", false); + } + public static boolean isFirstBoot() { return firstBoot; } diff --git a/app/src/main/java/com/fox2code/mmm/androidacy/AndroidacyActivity.java b/app/src/main/java/com/fox2code/mmm/androidacy/AndroidacyActivity.java index c38598d..035d8c7 100644 --- a/app/src/main/java/com/fox2code/mmm/androidacy/AndroidacyActivity.java +++ b/app/src/main/java/com/fox2code/mmm/androidacy/AndroidacyActivity.java @@ -76,7 +76,7 @@ public class AndroidacyActivity extends FoxActivity { this.forceBackPressed(); return; } - if (!url.endsWith(AndroidacyUtil.REFERRER)) { + if (!url.contains(AndroidacyUtil.REFERRER)) { if (url.lastIndexOf('/') < url.lastIndexOf('?')) { url = url + '&' + AndroidacyUtil.REFERRER; } else { diff --git a/app/src/main/java/com/fox2code/mmm/androidacy/AndroidacyRepoData.java b/app/src/main/java/com/fox2code/mmm/androidacy/AndroidacyRepoData.java index 736edef..0a015ae 100644 --- a/app/src/main/java/com/fox2code/mmm/androidacy/AndroidacyRepoData.java +++ b/app/src/main/java/com/fox2code/mmm/androidacy/AndroidacyRepoData.java @@ -4,6 +4,8 @@ import android.content.SharedPreferences; import android.util.Log; import android.webkit.CookieManager; +import androidx.annotation.NonNull; + import com.fox2code.mmm.R; import com.fox2code.mmm.manager.ModuleInfo; import com.fox2code.mmm.repo.RepoData; @@ -40,11 +42,14 @@ public class AndroidacyRepoData extends RepoData { // Avoid spamming requests to Androidacy private long androidacyBlockade = 0; private String token = null; + private final boolean testMode; + private final String host; - public AndroidacyRepoData(String url, File cacheRoot, - SharedPreferences cachedPreferences) { - super(url, cacheRoot, cachedPreferences); - if (this.metaDataCache.exists()) { + public AndroidacyRepoData(File cacheRoot, SharedPreferences cachedPreferences, + boolean testMode) { + super(testMode ? RepoManager.ANDROIDACY_TEST_MAGISK_REPO_ENDPOINT : + RepoManager.ANDROIDACY_MAGISK_REPO_ENDPOINT, cacheRoot, cachedPreferences); + if (this.metaDataCache.exists() && !testMode) { this.androidacyBlockade = this.metaDataCache.lastModified() + 30_000L; if (this.androidacyBlockade - 60_000L > System.currentTimeMillis()) { this.androidacyBlockade = 0; // Don't allow time travel. Well why not??? @@ -55,6 +60,8 @@ public class AndroidacyRepoData extends RepoData { this.defaultSupport = "https://t.me/androidacy_discussions"; this.defaultDonate = "https://patreon.com/androidacy"; this.defaultSubmitModule = "https://www.androidacy.com/module-repository-applications/"; + this.host = testMode ? "staging-api.androidacy.com" : "api.androidacy.com"; + this.testMode = testMode; } private static String getCookies() { @@ -89,7 +96,7 @@ public class AndroidacyRepoData extends RepoData { } if (token != null) { try { - Http.doHttpGet("https://api.androidacy.com/auth/me?token=" + token, true); + Http.doHttpGet("https://" + this.host + "/auth/me?token=" + token, true); } catch (Exception e) { if ("Received error code: 419".equals(e.getMessage()) || "Received error code: 429".equals(e.getMessage())) { @@ -113,7 +120,7 @@ public class AndroidacyRepoData extends RepoData { try { Log.i(TAG, "Refreshing token..."); token = new String(Http.doHttpPost( - "https://api.androidacy.com/auth/register", + "https://" + this.host + "/auth/register", "",true), StandardCharsets.UTF_8); if (Http.hasWebView()) { CookieManager.getInstance().setCookie("https://.androidacy.com/", @@ -184,11 +191,11 @@ public class AndroidacyRepoData extends RepoData { jsonObject.optString("notesUrl", "")); if (repoModule.zipUrl == null) { repoModule.zipUrl = // Fallback url in case the API doesn't have zipUrl - "https://api.androidacy.com/magisk/info/?module=" + moduleId; + "https://" + this.host + "/magisk/info/?module=" + moduleId; } if (repoModule.notesUrl == null) { repoModule.notesUrl = // Fallback url in case the API doesn't have notesUrl - "https://api.androidacy.com/magisk/readme/?module=" + moduleId; + "https://" + this.host + "/magisk/readme/?module=" + moduleId; } repoModule.zipUrl = this.injectToken(repoModule.zipUrl); repoModule.notesUrl = this.injectToken(repoModule.notesUrl); @@ -286,4 +293,10 @@ public class AndroidacyRepoData extends RepoData { } return url; } + + @NonNull + @Override + public String getName() { + return this.testMode ? super.getName() + " (Test Mode)" : super.getName(); + } } diff --git a/app/src/main/java/com/fox2code/mmm/repo/RepoManager.java b/app/src/main/java/com/fox2code/mmm/repo/RepoManager.java index 34cc3a9..8edee2a 100644 --- a/app/src/main/java/com/fox2code/mmm/repo/RepoManager.java +++ b/app/src/main/java/com/fox2code/mmm/repo/RepoManager.java @@ -4,6 +4,7 @@ import android.content.Context; import android.content.SharedPreferences; import android.util.Log; +import com.fox2code.mmm.MainActivity; import com.fox2code.mmm.MainApplication; import com.fox2code.mmm.XHooks; import com.fox2code.mmm.androidacy.AndroidacyRepoData; @@ -37,6 +38,8 @@ public final class RepoManager { public static final String ANDROIDACY_MAGISK_REPO_ENDPOINT = "https://api.androidacy.com/magisk/repo"; + public static final String ANDROIDACY_TEST_MAGISK_REPO_ENDPOINT = + "https://staging-api.androidacy.com/magisk/repo"; public static final String ANDROIDACY_MAGISK_REPO_HOMEPAGE = "https://www.androidacy.com/modules-repo"; @@ -125,11 +128,18 @@ public final class RepoManager { } public RepoData addOrGet(String url, String fallBackName) { + if (MAGISK_ALT_REPO_JSDELIVR.equals(url)) + url = MAGISK_ALT_REPO; + if (DG_MAGISK_REPO.equals(url)) + url = DG_MAGISK_REPO_GITHUB; RepoData repoData; synchronized (this.repoUpdateLock) { repoData = this.repoData.get(url); if (repoData == null) { - if (ANDROIDACY_MAGISK_REPO_ENDPOINT.equals(url)) { + if (ANDROIDACY_TEST_MAGISK_REPO_ENDPOINT.equals(url) || + ANDROIDACY_MAGISK_REPO_ENDPOINT.equals(url)) { + if (this.androidacyRepoData != null) + return this.androidacyRepoData; return this.addAndroidacyRepoData(); } else { return this.addRepoData(url, fallBackName); @@ -276,6 +286,7 @@ public final class RepoManager { case MAGISK_ALT_REPO_JSDELIVR: return "magisk_alt_repo"; case ANDROIDACY_MAGISK_REPO_ENDPOINT: + case ANDROIDACY_TEST_MAGISK_REPO_ENDPOINT: return "androidacy_repo"; case DG_MAGISK_REPO: case DG_MAGISK_REPO_GITHUB: @@ -291,6 +302,7 @@ public final class RepoManager { case RepoManager.MAGISK_ALT_REPO: case RepoManager.MAGISK_ALT_REPO_JSDELIVR: case RepoManager.ANDROIDACY_MAGISK_REPO_ENDPOINT: + case RepoManager.ANDROIDACY_TEST_MAGISK_REPO_ENDPOINT: case RepoManager.DG_MAGISK_REPO: case RepoManager.DG_MAGISK_REPO_GITHUB: return true; @@ -299,10 +311,6 @@ public final class RepoManager { } private RepoData addRepoData(String url, String fallBackName) { - if (MAGISK_ALT_REPO_JSDELIVR.equals(url)) - url = MAGISK_ALT_REPO; - if (DG_MAGISK_REPO.equals(url)) - url = DG_MAGISK_REPO_GITHUB; String id = internalIdOfUrl(url); File cacheRoot = new File(this.mainApplication.getCacheDir(), id); SharedPreferences sharedPreferences = this.mainApplication @@ -335,9 +343,10 @@ public final class RepoManager { File cacheRoot = new File(this.mainApplication.getCacheDir(), "androidacy_repo"); SharedPreferences sharedPreferences = this.mainApplication .getSharedPreferences("mmm_androidacy_repo", Context.MODE_PRIVATE); - AndroidacyRepoData repoData = new AndroidacyRepoData( - ANDROIDACY_MAGISK_REPO_ENDPOINT, cacheRoot, sharedPreferences); + AndroidacyRepoData repoData = new AndroidacyRepoData(cacheRoot, + sharedPreferences, MainApplication.isAndroidacyTestMode()); this.repoData.put(ANDROIDACY_MAGISK_REPO_ENDPOINT, repoData); + this.repoData.put(ANDROIDACY_TEST_MAGISK_REPO_ENDPOINT, repoData); return repoData; } diff --git a/app/src/main/java/com/fox2code/mmm/settings/SettingsActivity.java b/app/src/main/java/com/fox2code/mmm/settings/SettingsActivity.java index 0563d75..82f1708 100644 --- a/app/src/main/java/com/fox2code/mmm/settings/SettingsActivity.java +++ b/app/src/main/java/com/fox2code/mmm/settings/SettingsActivity.java @@ -325,6 +325,10 @@ public class SettingsActivity extends FoxActivity implements LanguageActivity { setRepoData(RepoManager.ANDROIDACY_MAGISK_REPO_ENDPOINT); setRepoData(RepoManager.DG_MAGISK_REPO_GITHUB); updateCustomRepoList(true); + if (!MainApplication.isDeveloper()) { + Objects.requireNonNull((Preference) findPreference( + "pref_androidacy_test_mode")).setVisible(false); + } } @SuppressLint("RestrictedApi") diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 7948e57..2dbccca 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -133,6 +133,8 @@ Backup modules Restore modules This operation require an internet connection + Androidacy test mode + Use staging Androidacy Endpoint instead of release endpoint. (Require app process restart) Found %i module updates diff --git a/app/src/main/res/xml/repo_preferences.xml b/app/src/main/res/xml/repo_preferences.xml index 42312dc..a0b7c46 100644 --- a/app/src/main/res/xml/repo_preferences.xml +++ b/app/src/main/res/xml/repo_preferences.xml @@ -59,6 +59,13 @@ app:icon="@drawable/ic_baseline_upload_file_24" app:title="@string/submit_modules" app:singleLineTitle="false" /> +