Signed-off-by: androidacy-user <opensource@androidacy.com>
pull/27/head
androidacy-user 3 years ago
parent 35b00cfb61
commit ff1cb4fbb6

@ -154,6 +154,14 @@ configurations {
} }
dependencies { dependencies {
// Big scary fingerprinting library
// Actually, just used to generate device ID for androidacy (they use it for fraud detection)
implementation "com.fingerprint.android:pro:2.2.1"
implementation "com.github.fingerprintjs:fingerprint-android:2.0.0"
// If you use Java for you project, add also this line
implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
// UI // UI
implementation 'androidx.appcompat:appcompat:1.5.1' implementation 'androidx.appcompat:appcompat:1.5.1'
implementation 'androidx.emoji2:emoji2:1.2.0' implementation 'androidx.emoji2:emoji2:1.2.0'

@ -241,9 +241,12 @@ public class MainApplication extends FoxApplication
private class Prism4jSwitchTheme implements Prism4jTheme { private class Prism4jSwitchTheme implements Prism4jTheme {
private final Prism4jTheme light = new Prism4jThemeDefault(Color.TRANSPARENT); private final Prism4jTheme light = new Prism4jThemeDefault(Color.TRANSPARENT);
private final Prism4jTheme dark = new Prism4jThemeDarkula(Color.TRANSPARENT); private final Prism4jTheme dark = new Prism4jThemeDarkula(Color.TRANSPARENT);
// Black theme
private final Prism4jTheme black = new Prism4jThemeDefault(Color.BLACK);
private Prism4jTheme getTheme() { private Prism4jTheme getTheme() {
return isLightTheme() ? this.light : this.dark; // isLightTheme() means light, isDarkTheme() means dark, and isBlackTheme() means black
return isLightTheme() ? light : isDarkTheme() ? dark : black;
} }
@Override @Override
@ -333,6 +336,11 @@ public class MainApplication extends FoxApplication
} }
} }
@SuppressLint("NonConstantResourceId")
public boolean isDarkTheme() {
return !this.isLightTheme();
}
@Override @Override
public void onCreate() { public void onCreate() {
if (INSTANCE == null) INSTANCE = this; if (INSTANCE == null) INSTANCE = this;

@ -1,12 +1,18 @@
package com.fox2code.mmm.androidacy; package com.fox2code.mmm.androidacy;
import android.annotation.SuppressLint; import android.content.Context;
import android.content.SharedPreferences; import android.content.SharedPreferences;
import android.os.Looper;
import android.util.Log; import android.util.Log;
import android.widget.Toast; import android.widget.Toast;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import com.fingerprintjs.android.fingerprint.Fingerprinter;
import com.fingerprintjs.android.fingerprint.FingerprinterFactory;
import com.fingerprintjs.android.fpjs_pro.Configuration;
import com.fingerprintjs.android.fpjs_pro.FingerprintJS;
import com.fingerprintjs.android.fpjs_pro.FingerprintJSFactory;
import com.fox2code.mmm.BuildConfig; import com.fox2code.mmm.BuildConfig;
import com.fox2code.mmm.MainApplication; import com.fox2code.mmm.MainApplication;
import com.fox2code.mmm.R; import com.fox2code.mmm.R;
@ -17,6 +23,7 @@ import com.fox2code.mmm.repo.RepoModule;
import com.fox2code.mmm.utils.Http; import com.fox2code.mmm.utils.Http;
import com.fox2code.mmm.utils.HttpException; import com.fox2code.mmm.utils.HttpException;
import com.fox2code.mmm.utils.PropUtils; import com.fox2code.mmm.utils.PropUtils;
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
import org.json.JSONArray; import org.json.JSONArray;
import org.json.JSONException; import org.json.JSONException;
@ -84,44 +91,31 @@ public final class AndroidacyRepoData extends RepoData {
if (deviceIdPref != null) { if (deviceIdPref != null) {
return deviceIdPref; return deviceIdPref;
} else { } else {
// Collect device information Context context = MainApplication.getINSTANCE().getApplicationContext();
String device = android.os.Build.DEVICE; FingerprintJSFactory factory = new FingerprintJSFactory(context);
String model = android.os.Build.MODEL; Configuration.Region region = Configuration.Region.US;
String product = android.os.Build.PRODUCT; Configuration configuration = new Configuration(
String manufacturer = android.os.Build.MANUFACTURER; "NiZiHi266YaTLreOIOzc",
String brand = android.os.Build.BRAND; region,
String androidVersion = android.os.Build.VERSION.RELEASE; region.getEndpointUrl(),
String androidSdk = String.valueOf(android.os.Build.VERSION.SDK_INT); true
@SuppressLint("HardwareIds") String androidId = android.provider.Settings.Secure.getString(MainApplication.getINSTANCE().getContentResolver(), android.provider.Settings.Secure.ANDROID_ID); );
// Generate a unique ID for this device. For privacy reasons, we don't want to send this
// info directly to the server, so we hash it. FingerprintJS fpjsClient = factory.createInstance(
String deviceId = androidId + device + model + product + manufacturer + brand + androidVersion + androidSdk; configuration
// Now, we need to hash the device ID. We use SHA-256, which is a secure hash function. );
// This means that it's impossible to reverse the hash and get the original device ID.
// We use the SHA-256 hash because it's the same hash function used by the API to hash fpjsClient.getVisitorId(visitorIdResponse -> {
// the device ID. // Use the ID
try { String visitorId = visitorIdResponse.getVisitorId();
java.security.MessageDigest digest = java.security.MessageDigest.getInstance("SHA-256"); // Save the ID in the shared preferences
byte[] hash = digest.digest(deviceId.getBytes(java.nio.charset.StandardCharsets.UTF_8));
// Convert the hash to a normal string
StringBuilder hexString = new StringBuilder();
for (byte b : hash) {
String hex = Integer.toHexString(0xff & b);
if (hex.length() == 1) {
hexString.append('0');
}
hexString.append(hex);
}
// Save the device ID to the shared preferences
SharedPreferences.Editor editor = sharedPreferences.edit(); SharedPreferences.Editor editor = sharedPreferences.edit();
editor.putString("device_id", hexString.toString()); editor.putString("device_id", visitorId);
editor.apply(); editor.apply();
return hexString.toString(); return null;
} catch (java.security.NoSuchAlgorithmException e) { });
// This should never happen, but if it does, we'll just return the device ID without // return the id
// hashing it. return sharedPreferences.getString("device_id", null);
return deviceId;
}
} }
} }
@ -147,6 +141,21 @@ public final class AndroidacyRepoData extends RepoData {
@Override @Override
protected boolean prepare() { protected boolean prepare() {
if (Http.needCaptchaAndroidacy()) return false; if (Http.needCaptchaAndroidacy()) return false;
// Check if we have a device ID yet
SharedPreferences sharedPreferences = MainApplication.getINSTANCE().getSharedPreferences("androidacy", 0);
String deviceIdPref = sharedPreferences.getString("device_id", null);
if (deviceIdPref == null) {
// Generate a device ID
generateDeviceId();
// Loop until we have a device ID
while (sharedPreferences.getString("device_id", null) == null) {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
// Implementation details discussed on telegram // Implementation details discussed on telegram
// First, ping the server to check if it's alive // First, ping the server to check if it's alive
try { try {
@ -154,10 +163,15 @@ public final class AndroidacyRepoData extends RepoData {
} catch (Exception e) { } catch (Exception e) {
Log.e(TAG, "Failed to ping server", e); Log.e(TAG, "Failed to ping server", e);
// Inform user // Inform user
/*if (!HttpException.shouldTimeout(e)) { Looper.prepare();
UiThreadHandler.run(() -> Toast.makeText(MainApplication.getINSTANCE(), MaterialAlertDialogBuilder builder = new MaterialAlertDialogBuilder(MainApplication.getINSTANCE().getBaseContext());
R.string.androidacy_server_down, Toast.LENGTH_SHORT).show()); builder.setTitle("Androidacy Server Down");
}*/ builder.setMessage("The Androidacy server is down. Unfortunately, this means that you" +
" will not be able to download or view modules from the Androidacy repository" +
". Please try again later.");
builder.setPositiveButton("OK", (dialog, which) -> dialog.dismiss());
builder.show();
Looper.loop();
return false; return false;
} }
String deviceId = generateDeviceId(); String deviceId = generateDeviceId();
@ -383,10 +397,6 @@ public final class AndroidacyRepoData extends RepoData {
return this.testMode ? super.getName() + " (Test Mode)" : super.getName(); return this.testMode ? super.getName() + " (Test Mode)" : super.getName();
} }
String getToken() {
return this.token;
}
public void setToken(String token) { public void setToken(String token) {
if (Http.hasWebView()) { if (Http.hasWebView()) {
this.token = token; this.token = token;

@ -542,17 +542,22 @@ public class SettingsActivity extends FoxActivity implements LanguageActivity {
return true; return true;
}); });
} }
String[] originalApiKeyRef = new String[]{ String[] originalApiKeyRef = new String[]{MainApplication.getINSTANCE().getSharedPreferences("androidacy", 0).getString("pref_androidacy_api_token", null)};
MainApplication.getSharedPreferences().getString("pref_androidacy_api_token", "")}; // Get the dummy pref_androidacy_repo_api_token EditTextPreference
// Create the pref_androidacy_repo_api_key text input with validation EditTextPreference prefAndroidacyRepoApiKey = Objects.requireNonNull(findPreference("pref_androidacy_api_token"));
EditTextPreference prefAndroidacyRepoApiKey = findPreference("pref_androidacy_api_token"); prefAndroidacyRepoApiKey.setDependency("pref_androidacy_repo_enabled");
assert prefAndroidacyRepoApiKey != null; prefAndroidacyRepoApiKey.setTitle(R.string.api_key);
prefAndroidacyRepoApiKey.setSummary(R.string.api_key_summary);
prefAndroidacyRepoApiKey.setDialogTitle(R.string.api_key);
prefAndroidacyRepoApiKey.setDefaultValue(originalApiKeyRef[0]);
// Set the value to the current value
prefAndroidacyRepoApiKey.setText(originalApiKeyRef[0]);
prefAndroidacyRepoApiKey.setOnBindEditTextListener(editText -> { prefAndroidacyRepoApiKey.setOnBindEditTextListener(editText -> {
editText.setSingleLine(); editText.setSingleLine();
// Make the single line wrap // Make the single line wrap
editText.setHorizontallyScrolling(false); editText.setHorizontallyScrolling(false);
// Set the height to the height of 2 lines // Set the height to the maximum required to fit the text
editText.setHeight(editText.getLineHeight() * 3); editText.setMaxLines(Integer.MAX_VALUE);
// Make ok button say "Save" // Make ok button say "Save"
editText.setImeOptions(EditorInfo.IME_ACTION_DONE); editText.setImeOptions(EditorInfo.IME_ACTION_DONE);
}); });
@ -573,8 +578,7 @@ public class SettingsActivity extends FoxActivity implements LanguageActivity {
new Thread(() -> { new Thread(() -> {
// If key is empty, just remove it and change the text of the snack bar // If key is empty, just remove it and change the text of the snack bar
if (apiKey.isEmpty()) { if (apiKey.isEmpty()) {
MainApplication.getSharedPreferences().edit().remove( MainApplication.getINSTANCE().getSharedPreferences("androidacy", 0).edit().remove("pref_androidacy_api_token").apply();
"pref_androidacy_api_token").apply();
new Handler(Looper.getMainLooper()).post(() -> { new Handler(Looper.getMainLooper()).post(() -> {
Snackbar.make(requireView(), R.string.api_key_removed, Snackbar.LENGTH_SHORT).show(); Snackbar.make(requireView(), R.string.api_key_removed, Snackbar.LENGTH_SHORT).show();
// Show dialog to restart app with ok button // Show dialog to restart app with ok button
@ -610,8 +614,7 @@ public class SettingsActivity extends FoxActivity implements LanguageActivity {
new Handler(Looper.getMainLooper()).post(() -> { new Handler(Looper.getMainLooper()).post(() -> {
Snackbar.make(requireView(), R.string.api_key_invalid, Snackbar.LENGTH_SHORT).show(); Snackbar.make(requireView(), R.string.api_key_invalid, Snackbar.LENGTH_SHORT).show();
// Save the original key // Save the original key
MainApplication.getSharedPreferences().edit().putString( MainApplication.getINSTANCE().getSharedPreferences("androidacy", 0).edit().putString("pref_androidacy_api_token", originalApiKeyRef[0]).apply();
"pref_androidacy_api_token", originalApiKeyRef[0]).apply();
// Re-show the dialog with an error // Re-show the dialog with an error
prefAndroidacyRepoApiKey.performClick(); prefAndroidacyRepoApiKey.performClick();
// Show error // Show error
@ -631,8 +634,7 @@ public class SettingsActivity extends FoxActivity implements LanguageActivity {
if (valid) { if (valid) {
originalApiKeyRef[0] = apiKey; originalApiKeyRef[0] = apiKey;
RepoManager.getINSTANCE().getAndroidacyRepoData().setToken(apiKey); RepoManager.getINSTANCE().getAndroidacyRepoData().setToken(apiKey);
MainApplication.getSharedPreferences().edit().putString( MainApplication.getINSTANCE().getSharedPreferences("androidacy", 0).edit().putString("pref_androidacy_api_token", apiKey).apply();
"pref_androidacy_api_token", apiKey).apply();
// Snackbar with success and restart button // Snackbar with success and restart button
new Handler(Looper.getMainLooper()).post(() -> { new Handler(Looper.getMainLooper()).post(() -> {
Snackbar.make(requireView(), R.string.api_key_valid, Snackbar.LENGTH_SHORT).show(); Snackbar.make(requireView(), R.string.api_key_valid, Snackbar.LENGTH_SHORT).show();
@ -667,7 +669,7 @@ public class SettingsActivity extends FoxActivity implements LanguageActivity {
new Handler(Looper.getMainLooper()).post(() -> { new Handler(Looper.getMainLooper()).post(() -> {
Snackbar.make(requireView(), R.string.api_key_invalid, Snackbar.LENGTH_SHORT).show(); Snackbar.make(requireView(), R.string.api_key_invalid, Snackbar.LENGTH_SHORT).show();
// Save the original key // Save the original key
MainApplication.getSharedPreferences().edit().putString( MainApplication.getINSTANCE().getSharedPreferences("androidacy", 0).edit().putString(
"pref_androidacy_api_token", originalApiKeyRef[0]).apply(); "pref_androidacy_api_token", originalApiKeyRef[0]).apply();
// Re-show the dialog with an error // Re-show the dialog with an error
prefAndroidacyRepoApiKey.performClick(); prefAndroidacyRepoApiKey.performClick();
@ -680,6 +682,8 @@ public class SettingsActivity extends FoxActivity implements LanguageActivity {
}).start(); }).start();
return true; return true;
}); });
// make sure the preference is visible if repo is enabled
prefAndroidacyRepoApiKey.setVisible(RepoManager.getINSTANCE().getAndroidacyRepoData().isEnabled());
} }
@SuppressLint("RestrictedApi") @SuppressLint("RestrictedApi")

@ -1,310 +1,303 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:app="http://schemas.android.com/apk/res-auto" <PreferenceScreen xmlns:app="http://schemas.android.com/apk/res-auto">
xmlns:android="http://schemas.android.com/apk/res/android">
<PreferenceCategory <PreferenceCategory
app:key="pref_magisk_alt_repo" app:key="pref_magisk_alt_repo"
app:title="@string/loading"> app:title="@string/loading">
<SwitchPreferenceCompat <SwitchPreferenceCompat
app:key="pref_magisk_alt_repo_enabled"
app:icon="@drawable/ic_baseline_extension_24" app:icon="@drawable/ic_baseline_extension_24"
app:switchTextOn="@string/repo_enabled" app:key="pref_magisk_alt_repo_enabled"
app:singleLineTitle="false"
app:switchTextOff="@string/repo_disabled" app:switchTextOff="@string/repo_disabled"
app:singleLineTitle="false" /> app:switchTextOn="@string/repo_enabled" />
<com.fox2code.mmm.settings.LongClickablePreference <com.fox2code.mmm.settings.LongClickablePreference
app:key="pref_magisk_alt_repo_website"
app:icon="@drawable/ic_baseline_language_24" app:icon="@drawable/ic_baseline_language_24"
app:title="@string/website" app:key="pref_magisk_alt_repo_website"
app:singleLineTitle="false" /> app:singleLineTitle="false"
app:title="@string/website" />
<com.fox2code.mmm.settings.LongClickablePreference <com.fox2code.mmm.settings.LongClickablePreference
app:key="pref_magisk_alt_repo_support"
app:icon="@drawable/ic_baseline_support_24" app:icon="@drawable/ic_baseline_support_24"
app:title="@string/support" app:key="pref_magisk_alt_repo_support"
app:singleLineTitle="false" /> app:singleLineTitle="false"
app:title="@string/support" />
<com.fox2code.mmm.settings.LongClickablePreference <com.fox2code.mmm.settings.LongClickablePreference
app:key="pref_magisk_alt_repo_donate"
app:icon="@drawable/ic_baseline_monetization_on_24" app:icon="@drawable/ic_baseline_monetization_on_24"
app:title="@string/donate" app:key="pref_magisk_alt_repo_donate"
app:singleLineTitle="false" /> app:singleLineTitle="false"
app:title="@string/donate" />
<com.fox2code.mmm.settings.LongClickablePreference <com.fox2code.mmm.settings.LongClickablePreference
app:key="pref_magisk_alt_repo_submit"
app:icon="@drawable/ic_baseline_upload_file_24" app:icon="@drawable/ic_baseline_upload_file_24"
app:title="@string/submit_modules" app:key="pref_magisk_alt_repo_submit"
app:singleLineTitle="false" /> app:singleLineTitle="false"
app:title="@string/submit_modules" />
</PreferenceCategory> </PreferenceCategory>
<PreferenceCategory <PreferenceCategory
app:key="pref_androidacy_repo" app:key="pref_androidacy_repo"
app:title="@string/loading"> app:title="@string/loading">
<SwitchPreferenceCompat <SwitchPreferenceCompat
app:key="pref_androidacy_repo_enabled"
app:icon="@drawable/ic_baseline_extension_24" app:icon="@drawable/ic_baseline_extension_24"
app:switchTextOn="@string/repo_enabled" app:key="pref_androidacy_repo_enabled"
app:singleLineTitle="false"
app:switchTextOff="@string/repo_disabled" app:switchTextOff="@string/repo_disabled"
app:singleLineTitle="false" /> app:switchTextOn="@string/repo_enabled" />
<!-- Allow user to set custom API key for Androidacy repo --> <!-- Initially hidden edittextpreference for pref_androidacy_api_token -->
<EditTextPreference <EditTextPreference
app:key="pref_androidacy_api_token"
app:icon="@drawable/ic_baseline_vpn_key_24" app:icon="@drawable/ic_baseline_vpn_key_24"
app:title="@string/api_key" app:key="pref_androidacy_api_token"
app:summary="@string/api_key_summary" app:singleLineTitle="false"
app:singleLineTitle="true" app:isPreferenceVisible="false"
app:dialogTitle="@string/api_key" app:title="@string/api_key" />
app:dialogIcon="@drawable/ic_baseline_vpn_key_24"
app:dependency="pref_androidacy_repo_enabled"
android:inputType="text"
android:selectAllOnFocus="true"
android:imeOptions="actionDone" />
<SwitchPreferenceCompat <SwitchPreferenceCompat
app:defaultValue="false" app:defaultValue="false"
app:key="pref_androidacy_test_mode" app:dependency="pref_androidacy_repo_enabled"
app:icon="@drawable/ic_baseline_bug_report_24" app:icon="@drawable/ic_baseline_bug_report_24"
app:title="@string/androidacy_test_mode_pref" app:key="pref_androidacy_test_mode"
app:singleLineTitle="false"
app:summary="@string/androidacy_test_mode_desc" app:summary="@string/androidacy_test_mode_desc"
app:dependency="pref_androidacy_repo_enabled" app:title="@string/androidacy_test_mode_pref" />
app:singleLineTitle="false" />
<com.fox2code.mmm.settings.LongClickablePreference <com.fox2code.mmm.settings.LongClickablePreference
app:key="pref_androidacy_repo_website"
app:icon="@drawable/ic_baseline_language_24" app:icon="@drawable/ic_baseline_language_24"
app:title="@string/website" app:key="pref_androidacy_repo_website"
app:singleLineTitle="false" /> app:singleLineTitle="false"
app:title="@string/website" />
<com.fox2code.mmm.settings.LongClickablePreference <com.fox2code.mmm.settings.LongClickablePreference
app:key="pref_androidacy_repo_support"
app:icon="@drawable/ic_baseline_telegram_24" app:icon="@drawable/ic_baseline_telegram_24"
app:title="@string/support" app:key="pref_androidacy_repo_support"
app:singleLineTitle="false" /> app:singleLineTitle="false"
app:title="@string/support" />
<com.fox2code.mmm.settings.LongClickablePreference <com.fox2code.mmm.settings.LongClickablePreference
app:key="pref_androidacy_repo_donate"
app:icon="@drawable/ic_patreon" app:icon="@drawable/ic_patreon"
app:title="@string/donate" app:key="pref_androidacy_repo_donate"
app:singleLineTitle="false" /> app:singleLineTitle="false"
app:title="@string/donate" />
<com.fox2code.mmm.settings.LongClickablePreference <com.fox2code.mmm.settings.LongClickablePreference
app:key="pref_androidacy_repo_submit"
app:icon="@drawable/ic_baseline_upload_file_24" app:icon="@drawable/ic_baseline_upload_file_24"
app:title="@string/submit_modules" app:key="pref_androidacy_repo_submit"
app:singleLineTitle="false" /> app:singleLineTitle="false"
app:title="@string/submit_modules" />
<!-- <Preference <!-- <Preference
app:key="pref_show_captcha_webview" app:key="pref_show_captcha_webview"
app:icon="@drawable/ic_baseline_vpn_key_24" app:icon="@drawable/ic_baseline_vpn_key_24"
app:title="@string/show_captcha" app:title="@string/show_captcha"
app:singleLineTitle="false" /> --> app:singleLineTitle="false" /> -->
<Preference <Preference
app:key="pref_androidacy_ads_disclaimer"
app:icon="@drawable/ic_baseline_info_24"
app:enabled="false" app:enabled="false"
app:summary="@string/androidacy_repo_info" app:icon="@drawable/ic_baseline_info_24"
app:singleLineTitle="false" /> app:key="pref_androidacy_ads_disclaimer"
app:singleLineTitle="false"
app:summary="@string/androidacy_repo_info" />
</PreferenceCategory> </PreferenceCategory>
<PreferenceCategory <PreferenceCategory
app:key="pref_dg_magisk_repo" app:key="pref_dg_magisk_repo"
app:title="@string/loading"> app:title="@string/loading">
<SwitchPreferenceCompat <SwitchPreferenceCompat
app:key="pref_dg_magisk_repo_enabled"
app:icon="@drawable/ic_baseline_extension_24" app:icon="@drawable/ic_baseline_extension_24"
app:switchTextOn="@string/repo_enabled" app:key="pref_dg_magisk_repo_enabled"
app:singleLineTitle="false"
app:switchTextOff="@string/repo_disabled" app:switchTextOff="@string/repo_disabled"
app:singleLineTitle="false" /> app:switchTextOn="@string/repo_enabled" />
<com.fox2code.mmm.settings.LongClickablePreference <com.fox2code.mmm.settings.LongClickablePreference
app:key="pref_dg_magisk_repo_website"
app:icon="@drawable/ic_baseline_language_24" app:icon="@drawable/ic_baseline_language_24"
app:title="@string/website" app:key="pref_dg_magisk_repo_website"
app:singleLineTitle="false" /> app:singleLineTitle="false"
app:title="@string/website" />
<com.fox2code.mmm.settings.LongClickablePreference <com.fox2code.mmm.settings.LongClickablePreference
app:key="pref_dg_magisk_repo_support"
app:icon="@drawable/ic_baseline_support_24" app:icon="@drawable/ic_baseline_support_24"
app:title="@string/support" app:key="pref_dg_magisk_repo_support"
app:singleLineTitle="false" /> app:singleLineTitle="false"
app:title="@string/support" />
<com.fox2code.mmm.settings.LongClickablePreference <com.fox2code.mmm.settings.LongClickablePreference
app:key="pref_dg_magisk_repo_donate"
app:icon="@drawable/ic_baseline_monetization_on_24" app:icon="@drawable/ic_baseline_monetization_on_24"
app:title="@string/donate" app:key="pref_dg_magisk_repo_donate"
app:singleLineTitle="false" /> app:singleLineTitle="false"
app:title="@string/donate" />
<com.fox2code.mmm.settings.LongClickablePreference <com.fox2code.mmm.settings.LongClickablePreference
app:key="pref_dg_magisk_repo_submit"
app:icon="@drawable/ic_baseline_upload_file_24" app:icon="@drawable/ic_baseline_upload_file_24"
app:title="@string/submit_modules" app:key="pref_dg_magisk_repo_submit"
app:singleLineTitle="false" /> app:singleLineTitle="false"
app:title="@string/submit_modules" />
</PreferenceCategory> </PreferenceCategory>
<PreferenceCategory <PreferenceCategory
app:key="pref_custom_repo_0" app:key="pref_custom_repo_0"
app:title="@string/loading"> app:title="@string/loading">
<SwitchPreferenceCompat <SwitchPreferenceCompat
app:key="pref_custom_repo_0_enabled"
app:icon="@drawable/ic_baseline_extension_24" app:icon="@drawable/ic_baseline_extension_24"
app:switchTextOn="@string/repo_enabled" app:key="pref_custom_repo_0_enabled"
app:singleLineTitle="false"
app:switchTextOff="@string/repo_disabled" app:switchTextOff="@string/repo_disabled"
app:singleLineTitle="false" /> app:switchTextOn="@string/repo_enabled" />
<com.fox2code.mmm.settings.LongClickablePreference <com.fox2code.mmm.settings.LongClickablePreference
app:key="pref_custom_repo_0_website"
app:icon="@drawable/ic_baseline_language_24" app:icon="@drawable/ic_baseline_language_24"
app:title="@string/website" app:key="pref_custom_repo_0_website"
app:singleLineTitle="false" /> app:singleLineTitle="false"
app:title="@string/website" />
<com.fox2code.mmm.settings.LongClickablePreference <com.fox2code.mmm.settings.LongClickablePreference
app:key="pref_custom_repo_0_support"
app:icon="@drawable/ic_baseline_support_24" app:icon="@drawable/ic_baseline_support_24"
app:title="@string/support" app:key="pref_custom_repo_0_support"
app:singleLineTitle="false" /> app:singleLineTitle="false"
app:title="@string/support" />
<com.fox2code.mmm.settings.LongClickablePreference <com.fox2code.mmm.settings.LongClickablePreference
app:key="pref_custom_repo_0_donate"
app:icon="@drawable/ic_baseline_monetization_on_24" app:icon="@drawable/ic_baseline_monetization_on_24"
app:title="@string/donate" app:key="pref_custom_repo_0_donate"
app:singleLineTitle="false" /> app:singleLineTitle="false"
app:title="@string/donate" />
<com.fox2code.mmm.settings.LongClickablePreference <com.fox2code.mmm.settings.LongClickablePreference
app:key="pref_custom_repo_0_submit"
app:icon="@drawable/ic_baseline_upload_file_24" app:icon="@drawable/ic_baseline_upload_file_24"
app:title="@string/submit_modules" app:key="pref_custom_repo_0_submit"
app:singleLineTitle="false" /> app:singleLineTitle="false"
app:title="@string/submit_modules" />
<com.fox2code.mmm.settings.LongClickablePreference <com.fox2code.mmm.settings.LongClickablePreference
app:key="pref_custom_repo_0_delete"
app:icon="@drawable/ic_baseline_delete_forever_24" app:icon="@drawable/ic_baseline_delete_forever_24"
app:title="@string/remove_repo" app:key="pref_custom_repo_0_delete"
app:singleLineTitle="false" /> app:singleLineTitle="false"
app:title="@string/remove_repo" />
</PreferenceCategory> </PreferenceCategory>
<PreferenceCategory <PreferenceCategory
app:key="pref_custom_repo_1" app:key="pref_custom_repo_1"
app:title="@string/loading"> app:title="@string/loading">
<SwitchPreferenceCompat <SwitchPreferenceCompat
app:key="pref_custom_repo_1_enabled"
app:icon="@drawable/ic_baseline_extension_24" app:icon="@drawable/ic_baseline_extension_24"
app:switchTextOn="@string/repo_enabled" app:key="pref_custom_repo_1_enabled"
app:singleLineTitle="false"
app:switchTextOff="@string/repo_disabled" app:switchTextOff="@string/repo_disabled"
app:singleLineTitle="false" /> app:switchTextOn="@string/repo_enabled" />
<com.fox2code.mmm.settings.LongClickablePreference <com.fox2code.mmm.settings.LongClickablePreference
app:key="pref_custom_repo_1_website"
app:icon="@drawable/ic_baseline_language_24" app:icon="@drawable/ic_baseline_language_24"
app:title="@string/website" app:key="pref_custom_repo_1_website"
app:singleLineTitle="false" /> app:singleLineTitle="false"
app:title="@string/website" />
<com.fox2code.mmm.settings.LongClickablePreference <com.fox2code.mmm.settings.LongClickablePreference
app:key="pref_custom_repo_1_support"
app:icon="@drawable/ic_baseline_support_24" app:icon="@drawable/ic_baseline_support_24"
app:title="@string/support" app:key="pref_custom_repo_1_support"
app:singleLineTitle="false" /> app:singleLineTitle="false"
app:title="@string/support" />
<com.fox2code.mmm.settings.LongClickablePreference <com.fox2code.mmm.settings.LongClickablePreference
app:key="pref_custom_repo_1_donate"
app:icon="@drawable/ic_baseline_monetization_on_24" app:icon="@drawable/ic_baseline_monetization_on_24"
app:title="@string/donate" app:key="pref_custom_repo_1_donate"
app:singleLineTitle="false" /> app:singleLineTitle="false"
app:title="@string/donate" />
<com.fox2code.mmm.settings.LongClickablePreference <com.fox2code.mmm.settings.LongClickablePreference
app:key="pref_custom_repo_1_submit"
app:icon="@drawable/ic_baseline_upload_file_24" app:icon="@drawable/ic_baseline_upload_file_24"
app:title="@string/submit_modules" app:key="pref_custom_repo_1_submit"
app:singleLineTitle="false" /> app:singleLineTitle="false"
app:title="@string/submit_modules" />
<com.fox2code.mmm.settings.LongClickablePreference <com.fox2code.mmm.settings.LongClickablePreference
app:key="pref_custom_repo_1_delete"
app:icon="@drawable/ic_baseline_delete_forever_24" app:icon="@drawable/ic_baseline_delete_forever_24"
app:title="@string/remove_repo" app:key="pref_custom_repo_1_delete"
app:singleLineTitle="false" /> app:singleLineTitle="false"
app:title="@string/remove_repo" />
</PreferenceCategory> </PreferenceCategory>
<PreferenceCategory <PreferenceCategory
app:key="pref_custom_repo_2" app:key="pref_custom_repo_2"
app:title="@string/loading"> app:title="@string/loading">
<SwitchPreferenceCompat <SwitchPreferenceCompat
app:key="pref_custom_repo_2_enabled"
app:icon="@drawable/ic_baseline_extension_24" app:icon="@drawable/ic_baseline_extension_24"
app:switchTextOn="@string/repo_enabled" app:key="pref_custom_repo_2_enabled"
app:singleLineTitle="false"
app:switchTextOff="@string/repo_disabled" app:switchTextOff="@string/repo_disabled"
app:singleLineTitle="false" /> app:switchTextOn="@string/repo_enabled" />
<com.fox2code.mmm.settings.LongClickablePreference <com.fox2code.mmm.settings.LongClickablePreference
app:key="pref_custom_repo_2_website"
app:icon="@drawable/ic_baseline_language_24" app:icon="@drawable/ic_baseline_language_24"
app:title="@string/website" app:key="pref_custom_repo_2_website"
app:singleLineTitle="false" /> app:singleLineTitle="false"
app:title="@string/website" />
<com.fox2code.mmm.settings.LongClickablePreference <com.fox2code.mmm.settings.LongClickablePreference
app:key="pref_custom_repo_2_support"
app:icon="@drawable/ic_baseline_support_24" app:icon="@drawable/ic_baseline_support_24"
app:title="@string/support" app:key="pref_custom_repo_2_support"
app:singleLineTitle="false" /> app:singleLineTitle="false"
app:title="@string/support" />
<com.fox2code.mmm.settings.LongClickablePreference <com.fox2code.mmm.settings.LongClickablePreference
app:key="pref_custom_repo_2_donate"
app:icon="@drawable/ic_baseline_monetization_on_24" app:icon="@drawable/ic_baseline_monetization_on_24"
app:title="@string/donate" app:key="pref_custom_repo_2_donate"
app:singleLineTitle="false" /> app:singleLineTitle="false"
app:title="@string/donate" />
<com.fox2code.mmm.settings.LongClickablePreference <com.fox2code.mmm.settings.LongClickablePreference
app:key="pref_custom_repo_2_submit"
app:icon="@drawable/ic_baseline_upload_file_24" app:icon="@drawable/ic_baseline_upload_file_24"
app:title="@string/submit_modules" app:key="pref_custom_repo_2_submit"
app:singleLineTitle="false" /> app:singleLineTitle="false"
app:title="@string/submit_modules" />
<com.fox2code.mmm.settings.LongClickablePreference <com.fox2code.mmm.settings.LongClickablePreference
app:key="pref_custom_repo_2_delete"
app:icon="@drawable/ic_baseline_delete_forever_24" app:icon="@drawable/ic_baseline_delete_forever_24"
app:title="@string/remove_repo" app:key="pref_custom_repo_2_delete"
app:singleLineTitle="false" /> app:singleLineTitle="false"
app:title="@string/remove_repo" />
</PreferenceCategory> </PreferenceCategory>
<PreferenceCategory <PreferenceCategory
app:key="pref_custom_repo_3" app:key="pref_custom_repo_3"
app:title="@string/loading"> app:title="@string/loading">
<SwitchPreferenceCompat <SwitchPreferenceCompat
app:key="pref_custom_repo_3_enabled"
app:icon="@drawable/ic_baseline_extension_24" app:icon="@drawable/ic_baseline_extension_24"
app:switchTextOn="@string/repo_enabled" app:key="pref_custom_repo_3_enabled"
app:singleLineTitle="false"
app:switchTextOff="@string/repo_disabled" app:switchTextOff="@string/repo_disabled"
app:singleLineTitle="false" /> app:switchTextOn="@string/repo_enabled" />
<com.fox2code.mmm.settings.LongClickablePreference <com.fox2code.mmm.settings.LongClickablePreference
app:key="pref_custom_repo_3_website"
app:icon="@drawable/ic_baseline_language_24" app:icon="@drawable/ic_baseline_language_24"
app:title="@string/website" app:key="pref_custom_repo_3_website"
app:singleLineTitle="false" /> app:singleLineTitle="false"
app:title="@string/website" />
<com.fox2code.mmm.settings.LongClickablePreference <com.fox2code.mmm.settings.LongClickablePreference
app:key="pref_custom_repo_3_support"
app:icon="@drawable/ic_baseline_support_24" app:icon="@drawable/ic_baseline_support_24"
app:title="@string/support" app:key="pref_custom_repo_3_support"
app:singleLineTitle="false" /> app:singleLineTitle="false"
app:title="@string/support" />
<com.fox2code.mmm.settings.LongClickablePreference <com.fox2code.mmm.settings.LongClickablePreference
app:key="pref_custom_repo_3_donate"
app:icon="@drawable/ic_baseline_monetization_on_24" app:icon="@drawable/ic_baseline_monetization_on_24"
app:title="@string/donate" app:key="pref_custom_repo_3_donate"
app:singleLineTitle="false" /> app:singleLineTitle="false"
app:title="@string/donate" />
<com.fox2code.mmm.settings.LongClickablePreference <com.fox2code.mmm.settings.LongClickablePreference
app:key="pref_custom_repo_3_submit"
app:icon="@drawable/ic_baseline_upload_file_24" app:icon="@drawable/ic_baseline_upload_file_24"
app:title="@string/submit_modules" app:key="pref_custom_repo_3_submit"
app:singleLineTitle="false" /> app:singleLineTitle="false"
app:title="@string/submit_modules" />
<com.fox2code.mmm.settings.LongClickablePreference <com.fox2code.mmm.settings.LongClickablePreference
app:key="pref_custom_repo_3_delete"
app:icon="@drawable/ic_baseline_delete_forever_24" app:icon="@drawable/ic_baseline_delete_forever_24"
app:title="@string/remove_repo" app:key="pref_custom_repo_3_delete"
app:singleLineTitle="false" /> app:singleLineTitle="false"
app:title="@string/remove_repo" />
</PreferenceCategory> </PreferenceCategory>
<PreferenceCategory <PreferenceCategory
app:key="pref_custom_repo_4" app:key="pref_custom_repo_4"
app:title="@string/loading"> app:title="@string/loading">
<SwitchPreferenceCompat <SwitchPreferenceCompat
app:key="pref_custom_repo_4_enabled"
app:icon="@drawable/ic_baseline_extension_24" app:icon="@drawable/ic_baseline_extension_24"
app:switchTextOn="@string/repo_enabled" app:key="pref_custom_repo_4_enabled"
app:singleLineTitle="false"
app:switchTextOff="@string/repo_disabled" app:switchTextOff="@string/repo_disabled"
app:singleLineTitle="false" /> app:switchTextOn="@string/repo_enabled" />
<com.fox2code.mmm.settings.LongClickablePreference <com.fox2code.mmm.settings.LongClickablePreference
app:key="pref_custom_repo_4_website"
app:icon="@drawable/ic_baseline_language_24" app:icon="@drawable/ic_baseline_language_24"
app:title="@string/website" app:key="pref_custom_repo_4_website"
app:singleLineTitle="false" /> app:singleLineTitle="false"
app:title="@string/website" />
<com.fox2code.mmm.settings.LongClickablePreference <com.fox2code.mmm.settings.LongClickablePreference
app:key="pref_custom_repo_4_support"
app:icon="@drawable/ic_baseline_support_24" app:icon="@drawable/ic_baseline_support_24"
app:title="@string/support" app:key="pref_custom_repo_4_support"
app:singleLineTitle="false" /> app:singleLineTitle="false"
app:title="@string/support" />
<com.fox2code.mmm.settings.LongClickablePreference <com.fox2code.mmm.settings.LongClickablePreference
app:key="pref_custom_repo_4_donate"
app:icon="@drawable/ic_baseline_monetization_on_24" app:icon="@drawable/ic_baseline_monetization_on_24"
app:title="@string/donate" app:key="pref_custom_repo_4_donate"
app:singleLineTitle="false" /> app:singleLineTitle="false"
app:title="@string/donate" />
<com.fox2code.mmm.settings.LongClickablePreference <com.fox2code.mmm.settings.LongClickablePreference
app:key="pref_custom_repo_4_submit"
app:icon="@drawable/ic_baseline_upload_file_24" app:icon="@drawable/ic_baseline_upload_file_24"
app:title="@string/submit_modules" app:key="pref_custom_repo_4_submit"
app:singleLineTitle="false" /> app:singleLineTitle="false"
app:title="@string/submit_modules" />
<com.fox2code.mmm.settings.LongClickablePreference <com.fox2code.mmm.settings.LongClickablePreference
app:key="pref_custom_repo_4_delete"
app:icon="@drawable/ic_baseline_delete_forever_24" app:icon="@drawable/ic_baseline_delete_forever_24"
app:title="@string/remove_repo" app:key="pref_custom_repo_4_delete"
app:singleLineTitle="false" /> app:singleLineTitle="false"
app:title="@string/remove_repo" />
</PreferenceCategory> </PreferenceCategory>
<PreferenceCategory <PreferenceCategory
app:key="pref_custom_add_repo" app:key="pref_custom_add_repo"
app:title="@string/add_repo"> app:title="@string/add_repo">
<Preference <Preference
app:key="pref_custom_add_repo_button"
app:icon="@drawable/ic_baseline_add_box_24" app:icon="@drawable/ic_baseline_add_box_24"
app:title="@string/add_repo" app:key="pref_custom_add_repo_button"
app:singleLineTitle="false" /> app:singleLineTitle="false"
app:title="@string/add_repo" />
</PreferenceCategory> </PreferenceCategory>
</PreferenceScreen> </PreferenceScreen>

@ -4,6 +4,8 @@ buildscript {
google() google()
mavenCentral() mavenCentral()
gradlePluginPortal() gradlePluginPortal()
maven { url 'https://maven.fpregistry.io/releases' }
maven { url 'https://jitpack.io' }
} }
project.ext.latestAboutLibsRelease = "10.5.0" project.ext.latestAboutLibsRelease = "10.5.0"
project.ext.sentryConfigFile = new File(rootDir, "sentry.properties").getAbsoluteFile() project.ext.sentryConfigFile = new File(rootDir, "sentry.properties").getAbsoluteFile()
@ -12,6 +14,7 @@ buildscript {
logLevel: "debug", logLevel: "debug",
flavorAware: true flavorAware: true
] ]
project.ext.kotlin_version = "1.7.20"
dependencies { dependencies {
classpath 'com.android.tools.build:gradle:7.3.1' classpath 'com.android.tools.build:gradle:7.3.1'
classpath "com.mikepenz.aboutlibraries.plugin:aboutlibraries-plugin:${latestAboutLibsRelease}" classpath "com.mikepenz.aboutlibraries.plugin:aboutlibraries-plugin:${latestAboutLibsRelease}"

@ -6,6 +6,7 @@ dependencyResolutionManagement {
maven { maven {
url 'https://jitpack.io' url 'https://jitpack.io'
} }
maven { url 'https://maven.fpregistry.io/releases' }
} }
} }
rootProject.name = "MagiskModuleManager" rootProject.name = "MagiskModuleManager"

Loading…
Cancel
Save