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" />
+