various changes

Signed-off-by: androidacy-user <opensource@androidacy.com>
pull/277/head
androidacy-user 1 year ago
parent 8404ebf6ec
commit e551ddc0c3

@ -12,7 +12,6 @@ apply plugin: "realm-android"
android {
namespace "com.fox2code.mmm"
compileSdk 33
buildToolsVersion '33.0.0'
signingConfigs {
release {
// Everything comes from local.properties
@ -81,6 +80,7 @@ android {
}
}
//noinspection GrDeprecatedAPIUsage
flavorDimensions "type"
productFlavors {
"default" {
@ -175,6 +175,7 @@ android {
properties.setProperty('client_id', '"dQ1p7X8bF14PVJ7wAU6ORVjPB2IeTinsuAZ8Uos6tQiyUdUyIjSyZSmN54QBbaTy"')
}
buildConfigField("String", "ANDROIDACY_CLIENT_ID", properties.getProperty('client_id'))
versionNameSuffix '-froid'
}
}
@ -237,12 +238,12 @@ sentry {
// Does auto instrumentation for specified features through bytecode manipulation.
// Default is enabled.
tracingInstrumentation {
enabled = true
enabled = hasSentryConfig
}
// Enable auto-installation of Sentry components (sentry-android SDK and okhttp, timber and fragment integrations).
autoInstallation {
sentryVersion = '6.11.0'
sentryVersion = '6.12.1'
}
// temp fix for gradle bug
@ -284,7 +285,7 @@ dependencies {
implementation 'com.github.topjohnwu.libsu:io:5.0.1'
implementation 'com.github.Fox2Code:RosettaX:1.0.9'
implementation 'com.github.Fox2Code:AndroidANSI:1.0.1'
implementation 'io.sentry:sentry-android:6.11.0'
implementation 'io.sentry:sentry-android:6.12.1'
// Markdown
implementation "io.noties.markwon:core:4.6.2"
@ -296,6 +297,8 @@ dependencies {
// Icons
// implementation "com.mikepenz:iconics-core:3.2.5"
//implementation "androidx.appcompat:appcompat:${versions.appCompat}"
implementation 'androidx.core:core-ktx:1.9.0'
}
if (hasSentryConfig) {
@ -303,7 +306,7 @@ if (hasSentryConfig) {
try (FileInputStream fis = new FileInputStream(sentryConfigFile)) {
properties.load(fis)
}
tasks.withType(Exec) {
tasks.withType(Exec).configureEach {
environment "SENTRY_PROJECT", properties.getProperty("defaults.project")
environment "SENTRY_ORG", properties.getProperty("defaults.org")
environment "SENTRY_URL", properties.getProperty("defaults.url")
@ -314,8 +317,8 @@ if (hasSentryConfig) {
android {
ndkVersion '25.1.8937393'
dependenciesInfo {
includeInApk false
includeInBundle false
includeInApk true
includeInBundle true
}
buildFeatures {
viewBinding true
@ -324,6 +327,8 @@ android {
kotlinOptions {
jvmTarget=JavaVersion.VERSION_11
}
//noinspection GrDeprecatedAPIUsage
buildToolsVersion '33.0.1'
}

@ -38,12 +38,15 @@
tools:ignore="ManifestResource"
tools:replace="android:supportsRtl"
tools:targetApi="s">
<activity
android:name=".CrashHandler"
android:exported="false" />
<activity
android:name=".SetupActivity"
android:exported="false"
android:label="@string/title_activity_setup"
android:hardwareAccelerated="true"
android:theme="@style/Theme.MagiskModuleManager.NoActionBar"/>
android:label="@string/title_activity_setup"
android:theme="@style/Theme.MagiskModuleManager.NoActionBar" />
<receiver
android:name=".background.BackgroundBootListener"
@ -56,8 +59,8 @@
<activity
android:name=".settings.SettingsActivity"
android:exported="true"
android:label="@string/title_activity_settings"
android:hardwareAccelerated="true"
android:label="@string/title_activity_settings"
android:parentActivityName=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.APPLICATION_PREFERENCES" />
@ -65,8 +68,8 @@
</activity>
<activity
android:name=".MainActivity"
android:hardwareAccelerated="true"
android:exported="true"
android:hardwareAccelerated="true"
android:label="@string/app_name_short"
android:launchMode="singleTask">
<intent-filter>
@ -77,8 +80,8 @@
</activity>
<activity
android:name=".installer.InstallerActivity"
android:hardwareAccelerated="true"
android:exported="false"
android:hardwareAccelerated="true"
android:launchMode="singleTop"
android:parentActivityName=".MainActivity"
android:screenOrientation="portrait"
@ -92,8 +95,8 @@
</activity> <!-- We can handle zip files -->
<activity
android:name=".utils.ZipFileOpener"
android:hardwareAccelerated="true"
android:exported="true"
android:hardwareAccelerated="true"
android:theme="@style/Theme.MagiskModuleManager">
<intent-filter>
<action android:name="android.intent.action.VIEW" />
@ -108,14 +111,14 @@
<activity
android:name=".markdown.MarkdownActivity"
android:exported="false"
android:parentActivityName=".MainActivity"
android:hardwareAccelerated="true"
android:parentActivityName=".MainActivity"
android:theme="@style/Theme.MagiskModuleManager" />
<activity
android:name=".androidacy.AndroidacyActivity"
android:exported="false"
android:parentActivityName=".MainActivity"
android:hardwareAccelerated="true"
android:parentActivityName=".MainActivity"
android:theme="@style/Theme.MagiskModuleManager">
<!--

@ -0,0 +1,14 @@
package com.fox2code.mmm;
import android.os.Bundle;
import com.fox2code.foxcompat.app.FoxActivity;
public class CrashHandler extends FoxActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_crash_handler);
}
}

@ -6,16 +6,23 @@ import android.annotation.SuppressLint;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.res.Resources;
import android.os.Build;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.WindowManager;
import androidx.annotation.NonNull;
import androidx.annotation.RequiresApi;
import androidx.appcompat.app.ActionBar;
import androidx.fragment.app.FragmentActivity;
import com.fox2code.foxcompat.app.FoxActivity;
import com.fox2code.mmm.androidacy.AndroidacyRepoData;
import com.fox2code.mmm.databinding.ActivitySetupBinding;
import com.fox2code.mmm.repo.RepoManager;
import com.fox2code.mmm.utils.realm.ModuleListCache;
import com.fox2code.mmm.utils.realm.ReposList;
import com.fox2code.rosettax.LanguageActivity;
import com.fox2code.rosettax.LanguageSwitcher;
import com.google.android.material.button.MaterialButton;
@ -27,6 +34,7 @@ import java.util.Objects;
import io.realm.Realm;
import io.realm.RealmConfiguration;
import io.realm.RealmResults;
public class SetupActivity extends FoxActivity implements LanguageActivity {
@ -46,7 +54,9 @@ public class SetupActivity extends FoxActivity implements LanguageActivity {
actionBar.show();
}
this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION, 0);
createRealmDatabase();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
createRealmDatabase();
}
// Set theme
SharedPreferences prefs = MainApplication.getSharedPreferences();
switch (prefs.getString("theme", "system")) {
@ -67,7 +77,7 @@ public class SetupActivity extends FoxActivity implements LanguageActivity {
break;
}
com.fox2code.mmm.databinding.ActivitySetupBinding binding = ActivitySetupBinding.inflate(getLayoutInflater());
ActivitySetupBinding binding = ActivitySetupBinding.inflate(getLayoutInflater());
setContentView(binding.getRoot());
// Show setup box. Put the setup_box in the main activity layout
View view = binding.setupBox;
@ -167,10 +177,38 @@ public class SetupActivity extends FoxActivity implements LanguageActivity {
editor.putBoolean("pref_background_update_check", ((MaterialSwitch) Objects.requireNonNull(view.findViewById(R.id.setup_background_update_check))).isChecked());
// Set the crash reporting pref
editor.putBoolean("pref_crash_reporting", ((MaterialSwitch) Objects.requireNonNull(view.findViewById(R.id.setup_crash_reporting))).isChecked());
// Set the repos
// first pref_magisk_alt_repo_enabled then pref_androidacy_repo_enabled
editor.putBoolean("pref_magisk_alt_repo_enabled", ((MaterialSwitch) Objects.requireNonNull(view.findViewById(R.id.setup_magisk_alt_repo))).isChecked());
editor.putBoolean("pref_androidacy_repo_enabled", ((MaterialSwitch) Objects.requireNonNull(view.findViewById(R.id.setup_androidacy_repo))).isChecked());
// Set the repos in the ReposList realm db
RealmConfiguration realmConfig = new RealmConfiguration.Builder().name("ReposList.realm").schemaVersion(1).allowQueriesOnUiThread(true).allowWritesOnUiThread(true).build();
boolean androidacyRepo = ((MaterialSwitch) Objects.requireNonNull(view.findViewById(R.id.setup_androidacy_repo))).isChecked();
boolean magiskAltRepo = ((MaterialSwitch) Objects.requireNonNull(view.findViewById(R.id.setup_magisk_alt_repo))).isChecked();
Realm.getInstanceAsync(realmConfig, new Realm.Callback() {
@Override
public void onSuccess(@NonNull Realm realm) {
realm.executeTransaction(realm1 -> {
ReposList androidacyRepoDB = realm1.where(ReposList.class).equalTo("id", "androidacy_repo").findFirst();
if (androidacyRepoDB != null) {
androidacyRepoDB.setEnabled(androidacyRepo);
// set remaining fields from the existing db entry
androidacyRepoDB.setName(androidacyRepoDB.getName());
androidacyRepoDB.setUrl(androidacyRepoDB.getUrl());
androidacyRepoDB.setLastUpdate(androidacyRepoDB.getLastUpdate());
androidacyRepoDB.setDonate(androidacyRepoDB.getDonate());
androidacyRepoDB.setSupport(androidacyRepoDB.getSupport());
}
ReposList magiskAltRepoDB = realm1.where(ReposList.class).equalTo("id", "magisk_alt_repo").findFirst();
if (magiskAltRepoDB != null) {
magiskAltRepoDB.setEnabled(magiskAltRepo);
// set remaining fields from the existing db entry
magiskAltRepoDB.setName(magiskAltRepoDB.getName());
magiskAltRepoDB.setUrl(magiskAltRepoDB.getUrl());
magiskAltRepoDB.setLastUpdate(magiskAltRepoDB.getLastUpdate());
magiskAltRepoDB.setDonate(magiskAltRepoDB.getDonate());
magiskAltRepoDB.setSupport(magiskAltRepoDB.getSupport());
}
});
realm.close();
}
});
// Commit the changes
editor.commit();
// Sleep for 1 second to allow the user to see the changes
@ -184,8 +222,6 @@ public class SetupActivity extends FoxActivity implements LanguageActivity {
if (BuildConfig.DEBUG) {
Log.d("SetupWizard", "Background update check: " + prefs.getBoolean("pref_background_update_check", false));
Log.i("SetupWizard", "Crash reporting: " + prefs.getBoolean("pref_crash_reporting", false));
Log.i("SetupWizard", "Magisk Alt Repo: " + prefs.getBoolean("pref_magisk_alt_repo_enabled", false));
Log.i("SetupWizard", "Androidacy Repo: " + prefs.getBoolean("pref_androidacy_repo_enabled", false));
}
// Restart the activity
MainActivity.doSetupRestarting = true;
@ -244,28 +280,79 @@ public class SetupActivity extends FoxActivity implements LanguageActivity {
}
// creates the realm database
@RequiresApi(api = Build.VERSION_CODES.N)
private void createRealmDatabase() {
if (BuildConfig.DEBUG) {
Log.d("Realm", "Creating Realm databases");
}
// create the realm database for ModuleListCache
RealmConfiguration config = new RealmConfiguration.Builder().name("ModuleListCache.realm").schemaVersion(1).allowWritesOnUiThread(true).allowQueriesOnUiThread(true).build();
Realm.setDefaultConfiguration(config);
RealmConfiguration config = new RealmConfiguration.Builder().name("ModuleListCache.realm").schemaVersion(1).build();
// do a dummy write to create the database
Realm realm = Realm.getDefaultInstance();
realm.executeTransaction(r -> {
Realm.getInstanceAsync(config, new Realm.Callback() {
@Override
public void onSuccess(@NonNull Realm realm) {
realm.executeTransactionAsync(realm1 -> {
// do nothing
});
}
});
realm.close();
// create the realm database for ReposList
// next, create the realm database for ReposList
config = new RealmConfiguration.Builder().name("ReposList.realm").schemaVersion(1).allowWritesOnUiThread(true).allowQueriesOnUiThread(true).build();
Realm.setDefaultConfiguration(config);
// do a dummy write to create the database
realm = Realm.getDefaultInstance();
realm.executeTransaction(r -> {
RealmConfiguration config2 = new RealmConfiguration.Builder().name("ReposList.realm").schemaVersion(1).build();
// get the instance
Realm.getInstanceAsync(config2, new Realm.Callback() {
@Override
public void onSuccess(@NonNull Realm realm1) {
// drop the database if it exists
realm1.executeTransactionAsync(realm2 -> realm2.delete(ReposList.class));
// create androidacy_repo and magisk_alt_repo if they don't exist under ReposList
// each has id, name, donate, website, support, enabled, and lastUpdate and name
// create androidacy_repo
realm1.beginTransaction();
if (realm1.where(ReposList.class).equalTo("id", "androidacy_repo").findFirst() == null) {
ReposList androidacy_repo = realm1.createObject(ReposList.class, "androidacy_repo");
String name = getString(R.string.androidacy_repo_name);
String website = AndroidacyRepoData.getInstance().website;
String donate = AndroidacyRepoData.getInstance().donate;
String support = AndroidacyRepoData.getInstance().support;
androidacy_repo.setName(name);
androidacy_repo.setDonate(donate);
androidacy_repo.setWebsite(website);
androidacy_repo.setSupport(support);
androidacy_repo.setEnabled(true);
androidacy_repo.setLastUpdate(0);
}
// create magisk_alt_repo
if (realm1.where(ReposList.class).equalTo("id", "magisk_alt_repo").findFirst() == null) {
ReposList magisk_alt_repo = realm1.createObject(ReposList.class, "magisk_alt_repo");
magisk_alt_repo.setName("Magisk Alt Repo");
magisk_alt_repo.setDonate(null);
magisk_alt_repo.setWebsite(RepoManager.MAGISK_ALT_REPO_HOMEPAGE);
magisk_alt_repo.setSupport(null);
magisk_alt_repo.setEnabled(true);
magisk_alt_repo.setLastUpdate(0);
}
realm1.commitTransaction();
realm1.close();
if (BuildConfig.DEBUG) {
Log.d("Realm", "Realm databases created");
// log each database
Realm realm2 = Realm.getInstance(config);
RealmResults<ModuleListCache> moduleListCaches = realm2.where(ModuleListCache.class).findAll();
Log.d("Realm", "ModuleListCache.realm");
for (ModuleListCache moduleListCache : moduleListCaches) {
Log.d("Realm", moduleListCache.toString());
}
realm2.close();
Realm realm3 = Realm.getInstance(config2);
RealmResults<ReposList> reposLists = realm3.where(ReposList.class).findAll();
Log.d("Realm", "ReposList.realm");
for (ReposList reposList : reposLists) {
Log.d("Realm", reposList.toString());
}
realm3.close();
}
}
});
realm.close();
if (BuildConfig.DEBUG) {
Log.d("Realm", "Realm databases created");
}
}
}

@ -103,32 +103,50 @@ public class RepoData extends XRepo {
this.moduleHashMap = new HashMap<>();
this.defaultName = url; // Set url as default name
this.forceHide = AppUpdateManager.shouldForceHide(this.id);
// this.enable is set from the database
RealmConfiguration realmConfiguration = new RealmConfiguration.Builder()
.name("ReposList.realm")
.schemaVersion(1)
.allowQueriesOnUiThread(true)
.allowWritesOnUiThread(true)
.build();
Realm realm = Realm.getInstance(realmConfiguration);
ReposList reposList = realm.where(ReposList.class).equalTo("id", this.id).findFirst();
if (BuildConfig.DEBUG) {
Log.d("RepoData", "RepoData: " + this.id + ". record in database: " + (reposList != null ? reposList.toString() : null));
}
this.enabled = (!this.forceHide && reposList != null && reposList.isEnabled());
this.enabled = (!this.forceHide) && MainApplication.getSharedPreferences().getBoolean("pref_" + this.getPreferenceId() + "_enabled", true);
this.defaultWebsite = "https://" + Uri.parse(url).getHost() + "/";
// open realm database
// load metadata from realm database
if (this.enabled) {
RealmConfiguration realmConfiguration = new RealmConfiguration.Builder().name("ModuleListCache.realm").allowQueriesOnUiThread(true).allowWritesOnUiThread(true).directory(cacheRoot).build();
// load metadata from realm database
Realm.getInstance(realmConfiguration);
this.metaDataCache = ModuleListCache.getRepoModulesAsJson(this.id);
// load repo metadata from ReposList unless it's a built-in repo
if (RepoManager.isBuiltInRepo(this.id)) {
this.name = this.defaultName;
this.website = this.defaultWebsite;
this.support = this.defaultSupport;
this.donate = this.defaultDonate;
this.submitModule = this.defaultSubmitModule;
} else {
// get everything from ReposList realm database
try {
RealmConfiguration realmConfiguration2 = new RealmConfiguration.Builder().name("ReposList.realm").allowQueriesOnUiThread(true).allowWritesOnUiThread(true).directory(cacheRoot).build();
// load metadata from realm database
Realm.getInstance(realmConfiguration2);
this.name = ReposList.getRepo(this.id).getName();
this.website = ReposList.getRepo(this.id).getWebsite();
this.support = ReposList.getRepo(this.id).getSupport();
this.donate = ReposList.getRepo(this.id).getDonate();
this.submitModule = ReposList.getRepo(this.id).getSubmitModule();
this.metaDataCache = ModuleListCache.getRepoModulesAsJson(this.id);
// load repo metadata from ReposList unless it's a built-in repo
if (RepoManager.isBuiltInRepo(this.id)) {
this.name = this.defaultName;
this.website = this.defaultWebsite;
this.support = this.defaultSupport;
this.donate = this.defaultDonate;
this.submitModule = this.defaultSubmitModule;
} else {
// get everything from ReposList realm database
RealmConfiguration realmConfiguration3 = new RealmConfiguration.Builder().name("ReposList.realm").allowQueriesOnUiThread(true).allowWritesOnUiThread(true).directory(cacheRoot).build();
// load metadata from realm database
Realm.getInstance(realmConfiguration3);
this.name = ReposList.getRepo(this.id).getName();
this.website = ReposList.getRepo(this.id).getWebsite();
this.support = ReposList.getRepo(this.id).getSupport();
this.donate = ReposList.getRepo(this.id).getDonate();
this.submitModule = ReposList.getRepo(this.id).getSubmitModule();
}
} catch (Exception e) {
e.printStackTrace();
Log.w("RepoData", "Failed to load repo metadata from realm database. If this is a first time install, this is normal.");
}
}
}

@ -241,7 +241,8 @@ public final class RepoManager extends SyncManager {
if (BuildConfig.DEBUG) {
Log.d(TAG, "Checking internet connection...");
}
HttpURLConnection urlConnection = (HttpURLConnection) new URL("https://networkcheck.kde.org").openConnection();
// this url is actually hosted by Cloudflare and is not dependent on Androidacy servers being up
HttpURLConnection urlConnection = (HttpURLConnection) new URL("https://production-api.androidacy.com/cdn-cgi/trace").openConnection();
if (BuildConfig.DEBUG) {
Log.d(TAG, "Opened connection to " + urlConnection.getURL());
}

@ -2,6 +2,7 @@ package com.fox2code.mmm.utils.realm;
import io.realm.Realm;
import io.realm.RealmObject;
import io.realm.annotations.PrimaryKey;
import io.realm.annotations.Required;
@SuppressWarnings("unused")
@ -10,6 +11,7 @@ public class ReposList extends RealmObject {
// there's also an optional donate and support field
@Required
@PrimaryKey
private String id;
@Required
private String url;

@ -0,0 +1,108 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" tools:context=".CrashHandler">
<ScrollView android:layout_width="match_parent" android:layout_height="match_parent">
<LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical">
<!-- layout with crash_text header and crash_details body -->
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<!-- crash_text header -->
<TextView
android:id="@+id/crash_text"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="10dp"
android:gravity="center"
android:text="@string/crash_text"
android:textSize="20sp"
android:textStyle="bold" />
<TextView
android:id="@+id/crash_details"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="10dp"
android:fontFamily="monospace"
android:gravity="center"
android:text="@string/crash_details"
android:textSize="16sp" />
</LinearLayout>
<!-- feedback form -->
<com.google.android.material.card.MaterialCardView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<!-- feedback form header -->
<TextView
android:id="@+id/feedback_text"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="10dp"
android:gravity="center"
android:text="@string/sentry_dialogue_message"
android:textSize="20sp"
android:textStyle="bold" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<!-- feedback form name -->
<EditText
android:id="@+id/feedback_name"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="10dp"
android:hint="@string/name"
android:inputType="text" />
<!-- feedback form email -->
<EditText
android:id="@+id/feedback_email"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="10dp"
android:hint="@string/email"
android:inputType="textEmailAddress" />
<!-- feedback form message -->
<EditText
android:id="@+id/feedback_message"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="10dp"
android:hint="@string/feedback_message"
android:inputType="textMultiLine" />
<!-- feedback form submit button -->
<Button
android:id="@+id/feedback_submit"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="10dp"
android:text="@string/feedback_submit" />
</LinearLayout>
</com.google.android.material.card.MaterialCardView>
<!-- restart button -->
<com.google.android.material.button.MaterialButton
android:id="@+id/restart_button"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="10dp"
android:text="@string/restart" />
</LinearLayout>
</ScrollView>
</LinearLayout>

@ -298,4 +298,6 @@
<string name="error_saving_logs">Could not save logs</string>
<string name="share_logs">Share FoxMMM logs</string>
<string name="not_official_build">This app is an unofficial FoxMMM build.</string>
<string name="crash_text">Oops! We ran into a problem.</string>
<string name="crash_details">Exception: %s</string><string name="feedback_message">Give us more details about what you were doing when this happened.</string><string name="feedback_submit">Submit feedback</string>
</resources>

@ -16,15 +16,15 @@ buildscript {
project.ext.kotlin_version = "1.8.0"
dependencies {
classpath 'com.android.tools.build:gradle:7.4.0'
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
classpath "com.mikepenz.aboutlibraries.plugin:aboutlibraries-plugin:${latestAboutLibsRelease}"
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
classpath "io.realm:realm-gradle-plugin:10.11.1"
}
}
task clean(type: Delete) {
tasks.register('clean') {
delete rootProject.buildDir
}

@ -16,7 +16,7 @@ org.gradle.jvmargs=-Xmx2048m -Dfile.encoding=UTF-8 -XX:+UseParallelGC -XX:Reserv
# https://developer.android.com/topic/libraries/support-library/androidx-rn
android.useAndroidX=true
# Automatically convert third-party libraries to use AndroidX
# android.enableJetifier=true
android.enableJetifier=true
# Fox builds props mods
org.gradle.parallel=true

Loading…
Cancel
Save