From 2f6ca69668fd1f6b3c1e18173897bb47d4876b9b Mon Sep 17 00:00:00 2001 From: hussainmohd-a Date: Fri, 17 May 2024 19:10:50 +0530 Subject: [PATCH 1/7] update versioncode and name for v055j --- app/src/main/AndroidManifest.xml | 4 ++-- gradle.properties | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 6f5209cd..a53a5bc0 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -2,8 +2,8 @@ + android:versionCode="41" + android:versionName="v055j"> diff --git a/gradle.properties b/gradle.properties index 3b311b1f..c409572e 100644 --- a/gradle.properties +++ b/gradle.properties @@ -24,5 +24,5 @@ android.nonTransitiveRClass=true # Enable configuration cache org.gradle.unsafe.configuration-cache=true android.nonFinalResIds=true -# Version code for this module (40 for v055i) -VERSION_CODE=40 +# Version code for this module (41 for v055j) +VERSION_CODE=41 From d86fa46d29542ea9e65863b95496ca5771b56149 Mon Sep 17 00:00:00 2001 From: hussainmohd-a Date: Fri, 17 May 2024 19:38:41 +0530 Subject: [PATCH 2/7] log: default logger level id change --- .../main/java/com/celzero/bravedns/service/PersistentState.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/com/celzero/bravedns/service/PersistentState.kt b/app/src/main/java/com/celzero/bravedns/service/PersistentState.kt index faa09403..e895b3cf 100644 --- a/app/src/main/java/com/celzero/bravedns/service/PersistentState.kt +++ b/app/src/main/java/com/celzero/bravedns/service/PersistentState.kt @@ -262,8 +262,8 @@ class PersistentState(context: Context) : SimpleKrate(context), KoinComponent { // biometric last auth time var biometricAuthTime by longPref("biometric_auth_time").withDefault(INIT_TIME_MS) - // go logger level, default 2 -> info - var goLoggerLevel by longPref("go_logger_level").withDefault(2) + // go logger level, default 3 -> info + var goLoggerLevel by longPref("go_logger_level").withDefault(3) // previous data usage check timestamp var prevDataUsageCheck by longPref("prev_data_usage_check").withDefault(INIT_TIME_MS) From 4419af795014df332947aa92582a4c6aef95ee5c Mon Sep 17 00:00:00 2001 From: hussainmohd-a Date: Fri, 17 May 2024 21:46:32 +0530 Subject: [PATCH 3/7] ui: click listener for layout header of exclude proxy app settings --- .../bravedns/ui/activity/ProxySettingsActivity.kt | 15 +++++++++++++++ .../celzero/bravedns/service/PersistentState.kt | 2 +- 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/app/src/full/java/com/celzero/bravedns/ui/activity/ProxySettingsActivity.kt b/app/src/full/java/com/celzero/bravedns/ui/activity/ProxySettingsActivity.kt index 95c016e8..1c4bc47b 100644 --- a/app/src/full/java/com/celzero/bravedns/ui/activity/ProxySettingsActivity.kt +++ b/app/src/full/java/com/celzero/bravedns/ui/activity/ProxySettingsActivity.kt @@ -655,7 +655,9 @@ class ProxySettingsActivity : AppCompatActivity(R.layout.fragment_proxy_configur val errorTxt: TextView = dialogBinding.dialogProxyErrorText val userNameEditText: EditText = dialogBinding.dialogProxyEditUsername val passwordEditText: EditText = dialogBinding.dialogProxyEditPassword + val udpBlockLayout: LinearLayout = dialogBinding.dialogProxyUdpHeader val udpBlockCheckBox: CheckBox = dialogBinding.dialogProxyUdpCheck + val excludeAppLayout: LinearLayout = dialogBinding.dialogProxyExcludeAppsHeader val excludeAppCheckBox: CheckBox = dialogBinding.dialogProxyExcludeAppsCheck headerDesc.visibility = View.GONE @@ -706,6 +708,14 @@ class ProxySettingsActivity : AppCompatActivity(R.layout.fragment_proxy_configur UIUtils.openVpnProfile(this) } + excludeAppLayout.setOnClickListener { + excludeAppCheckBox.isChecked = !excludeAppCheckBox.isChecked + } + + udpBlockLayout.setOnClickListener { + udpBlockCheckBox.isChecked = !udpBlockCheckBox.isChecked + } + applyURLBtn.setOnClickListener { var port: Int? = 0 var isValid: Boolean @@ -849,6 +859,7 @@ class ProxySettingsActivity : AppCompatActivity(R.layout.fragment_proxy_configur val userNameLl: LinearLayout = dialogBinding.dialogProxyUsernameHeader val passwordLl: LinearLayout = dialogBinding.dialogProxyPasswordHeader val udpBlockLl: LinearLayout = dialogBinding.dialogProxyUdpHeader + val excludeAppLayout: LinearLayout = dialogBinding.dialogProxyExcludeAppsHeader val excludeAppCheckBox: CheckBox = dialogBinding.dialogProxyExcludeAppsCheck // do not show the UDP block option for HTTP proxy @@ -869,6 +880,10 @@ class ProxySettingsActivity : AppCompatActivity(R.layout.fragment_proxy_configur } lockdownDesc.visibility = if (VpnController.isVpnLockdown()) View.VISIBLE else View.GONE + excludeAppLayout.setOnClickListener { + excludeAppCheckBox.isChecked = !excludeAppCheckBox.isChecked + } + val proxySpinnerAdapter = ArrayAdapter(this, android.R.layout.simple_spinner_dropdown_item, appNames) appNameSpinner.adapter = proxySpinnerAdapter diff --git a/app/src/main/java/com/celzero/bravedns/service/PersistentState.kt b/app/src/main/java/com/celzero/bravedns/service/PersistentState.kt index e895b3cf..dde05b9e 100644 --- a/app/src/main/java/com/celzero/bravedns/service/PersistentState.kt +++ b/app/src/main/java/com/celzero/bravedns/service/PersistentState.kt @@ -279,7 +279,7 @@ class PersistentState(context: Context) : SimpleKrate(context), KoinComponent { var proxyDns by booleanPref("proxy_dns").withDefault(true) // exclude apps which are configured in proxy (socks5, http, dns proxy) - var excludeAppsInProxy by booleanPref("exclude_apps_in_proxy").withDefault(false) + var excludeAppsInProxy by booleanPref("exclude_apps_in_proxy").withDefault(true) var orbotConnectionStatus: MutableLiveData = MutableLiveData() var median: MutableLiveData = MutableLiveData() From 5b7c15412a7d279d25bee381091a6902ef228932 Mon Sep 17 00:00:00 2001 From: hussainmohd-a Date: Sat, 18 May 2024 19:01:01 +0530 Subject: [PATCH 4/7] ui: minor ui improvements in app-wise logs screens --- .../bravedns/ui/activity/AppInfoActivity.kt | 7 ++- .../ui/activity/AppWiseDomainLogsActivity.kt | 17 +++++-- .../bottomsheet/AppDomainRulesBottomSheet.kt | 47 ++++++++++++++++++- .../full/res/layout/activity_app_details.xml | 2 + .../layout/bottom_sheet_app_connections.xml | 39 +++++++++++++++ .../layout/list_item_app_domain_details.xml | 2 +- .../res/layout/list_item_app_ip_details.xml | 2 +- .../layout/activity_app_wise_domain_logs.xml | 44 +++++------------ 8 files changed, 118 insertions(+), 42 deletions(-) diff --git a/app/src/full/java/com/celzero/bravedns/ui/activity/AppInfoActivity.kt b/app/src/full/java/com/celzero/bravedns/ui/activity/AppInfoActivity.kt index 3e4b7786..5ae1f3e5 100644 --- a/app/src/full/java/com/celzero/bravedns/ui/activity/AppInfoActivity.kt +++ b/app/src/full/java/com/celzero/bravedns/ui/activity/AppInfoActivity.kt @@ -366,7 +366,9 @@ class AppInfoActivity : AppCompatActivity(R.layout.activity_app_details) { if (it.append.endOfPaginationReached) { if (adapter.itemCount < 1) { b.aadMostContactedDomainRl.visibility = View.GONE - b.aadMostContactedIpsRv.visibility = View.GONE + } else { + b.aadMostContactedDomainRl.visibility = View.VISIBLE + } } } @@ -386,7 +388,8 @@ class AppInfoActivity : AppCompatActivity(R.layout.activity_app_details) { if (it.append.endOfPaginationReached) { if (adapter.itemCount < 1) { b.aadMostContactedIpsRl.visibility = View.GONE - b.aadMostContactedDomainRv.visibility = View.GONE + } else { + b.aadMostContactedIpsRl.visibility = View.VISIBLE } } } diff --git a/app/src/full/java/com/celzero/bravedns/ui/activity/AppWiseDomainLogsActivity.kt b/app/src/full/java/com/celzero/bravedns/ui/activity/AppWiseDomainLogsActivity.kt index 7a1536e7..c63382b9 100644 --- a/app/src/full/java/com/celzero/bravedns/ui/activity/AppWiseDomainLogsActivity.kt +++ b/app/src/full/java/com/celzero/bravedns/ui/activity/AppWiseDomainLogsActivity.kt @@ -50,6 +50,7 @@ import kotlinx.coroutines.withContext import org.koin.android.ext.android.inject import org.koin.androidx.viewmodel.ext.android.viewModel + class AppWiseDomainLogsActivity : AppCompatActivity(R.layout.activity_app_wise_domain_logs), SearchView.OnQueryTextListener { private val b by viewBinding(ActivityAppWiseDomainLogsBinding::bind) @@ -63,7 +64,7 @@ class AppWiseDomainLogsActivity : private fun Context.isDarkThemeOn(): Boolean { return resources.configuration.uiMode and Configuration.UI_MODE_NIGHT_MASK == - Configuration.UI_MODE_NIGHT_YES + Configuration.UI_MODE_NIGHT_YES } override fun onCreate(savedInstanceState: Bundle?) { @@ -132,15 +133,23 @@ class AppWiseDomainLogsActivity : uiCtx { this.appInfo = appInfo - b.awlAppDetailName.text = appName(packages.count()) + val appName = appName(packages.count()) + updateAppNameInSearchHint(appName) displayIcon( Utilities.getIcon(this, appInfo.packageName, appInfo.appName), - b.awlAppDetailIcon + b.awlAppDetailIcon1 ) } } } + private fun updateAppNameInSearchHint(appName: String) { + val appNameTruncated = appName.substring(0, appName.length.coerceAtMost(10)) + val hint = getString(R.string.two_argument_colon, appNameTruncated, getString(R.string.search_custom_domains)) + b.awlSearch.queryHint = hint + return + } + private fun highlightToggleBtn() { val timeCategory = "0" // default is 1 hours, "0" tag is 1 hours @@ -204,7 +213,6 @@ class AppWiseDomainLogsActivity : private fun hideRulesUi() { b.awlCardViewTop.visibility = android.view.View.GONE - b.awlAppDetailRl.visibility = android.view.View.GONE b.awlRecyclerConnection.visibility = android.view.View.GONE } @@ -214,7 +222,6 @@ class AppWiseDomainLogsActivity : private fun showRulesUi() { b.awlCardViewTop.visibility = android.view.View.VISIBLE - b.awlAppDetailRl.visibility = android.view.View.VISIBLE b.awlRecyclerConnection.visibility = android.view.View.VISIBLE } diff --git a/app/src/full/java/com/celzero/bravedns/ui/bottomsheet/AppDomainRulesBottomSheet.kt b/app/src/full/java/com/celzero/bravedns/ui/bottomsheet/AppDomainRulesBottomSheet.kt index a4fddd08..b5c6ff64 100644 --- a/app/src/full/java/com/celzero/bravedns/ui/bottomsheet/AppDomainRulesBottomSheet.kt +++ b/app/src/full/java/com/celzero/bravedns/ui/bottomsheet/AppDomainRulesBottomSheet.kt @@ -29,10 +29,12 @@ import com.celzero.bravedns.R import com.celzero.bravedns.adapter.AppWiseDomainsAdapter import com.celzero.bravedns.databinding.BottomSheetAppConnectionsBinding import com.celzero.bravedns.service.DomainRulesManager +import com.celzero.bravedns.service.FirewallManager import com.celzero.bravedns.service.PersistentState import com.celzero.bravedns.util.Constants.Companion.INVALID_UID import com.celzero.bravedns.util.Themes.Companion.getBottomsheetCurrentTheme import com.celzero.bravedns.util.UIUtils.updateHtmlEncodedText +import com.celzero.bravedns.util.Utilities import com.google.android.material.bottomsheet.BottomSheetDialogFragment import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch @@ -110,9 +112,10 @@ class AppDomainRulesBottomSheet : BottomSheetDialogFragment() { this.dismiss() return } + + updateAppDetails() // making use of the same layout used for ip rules, so changing the text and // removing the recycler related changes - b.bsacIpAddressTv.text = domain b.bsacIpRuleTxt.text = updateHtmlEncodedText(getString(R.string.bsct_block_domain)) @@ -120,6 +123,48 @@ class AppDomainRulesBottomSheet : BottomSheetDialogFragment() { b.bsacDomainLl.visibility = View.GONE } + private fun updateAppDetails() { + if (uid == -1) return + + io { + val appNames = FirewallManager.getAppNamesByUid(uid) + if (appNames.isEmpty()) { + uiCtx { handleNonApp() } + return@io + } + val pkgName = FirewallManager.getPackageNameByAppName(appNames[0]) + + val appCount = appNames.count() + uiCtx { + if (appCount >= 1) { + b.bsacAppName.text = + if (appCount >= 2) { + getString( + R.string.ctbs_app_other_apps, + appNames[0], + appCount.minus(1).toString() + ) + } else { + appNames[0] + } + if (pkgName == null) return@uiCtx + b.bsacAppIcon.setImageDrawable( + Utilities.getIcon(requireContext(), pkgName) + ) + } else { + // apps which are not available in cache are treated as non app. + // TODO: check packageManager#getApplicationInfo() for appInfo + handleNonApp() + } + } + } + } + + private fun handleNonApp() { + b.bsacAppName.visibility = View.GONE + b.bsacAppIcon.visibility = View.GONE + } + private fun setRulesUi() { io { // no need to send port number for the app info screen diff --git a/app/src/full/res/layout/activity_app_details.xml b/app/src/full/res/layout/activity_app_details.xml index 19580b77..03d0dc65 100644 --- a/app/src/full/res/layout/activity_app_details.xml +++ b/app/src/full/res/layout/activity_app_details.xml @@ -426,6 +426,7 @@ android:id="@+id/aad_most_contacted_domain_rl" android:layout_width="match_parent" android:layout_height="wrap_content" + android:visibility="gone" android:layout_marginTop="10dp"> + + + + + + + diff --git a/app/src/full/res/layout/list_item_app_domain_details.xml b/app/src/full/res/layout/list_item_app_domain_details.xml index 3521135b..061ec920 100644 --- a/app/src/full/res/layout/list_item_app_domain_details.xml +++ b/app/src/full/res/layout/list_item_app_domain_details.xml @@ -95,7 +95,7 @@ android:padding="5dp" android:singleLine="true" android:textAppearance="@android:style/TextAppearance.Material.Subhead" - android:textSize="@dimen/default_font_text_view" + android:textSize="@dimen/extra_large_font_text_view" android:textStyle="bold" /> - - - - - - - - + + From 9e082c10d427c827c050b02ec9ddb75c8186f045 Mon Sep 17 00:00:00 2001 From: hussainmohd-a Date: Sat, 18 May 2024 20:20:38 +0530 Subject: [PATCH 5/7] ktfmt: MiscSettingsActivity --- .../ui/activity/MiscSettingsActivity.kt | 40 ++++++++++++------- 1 file changed, 25 insertions(+), 15 deletions(-) diff --git a/app/src/full/java/com/celzero/bravedns/ui/activity/MiscSettingsActivity.kt b/app/src/full/java/com/celzero/bravedns/ui/activity/MiscSettingsActivity.kt index 76ac4e16..42fe9e4e 100644 --- a/app/src/full/java/com/celzero/bravedns/ui/activity/MiscSettingsActivity.kt +++ b/app/src/full/java/com/celzero/bravedns/ui/activity/MiscSettingsActivity.kt @@ -125,7 +125,7 @@ class MiscSettingsActivity : AppCompatActivity(R.layout.activity_misc_settings) if ( BiometricManager.from(this) .canAuthenticate(BiometricManager.Authenticators.BIOMETRIC_WEAK) == - BiometricManager.BIOMETRIC_SUCCESS + BiometricManager.BIOMETRIC_SUCCESS ) { b.settingsBiometricSwitch.isChecked = persistentState.biometricAuth } else { @@ -149,6 +149,7 @@ class MiscSettingsActivity : AppCompatActivity(R.layout.activity_misc_settings) getString(R.string.settings_notification_desc1) ) } + NotificationActionType.DNS_FIREWALL -> { b.genSettingsNotificationDesc.text = getString( @@ -156,6 +157,7 @@ class MiscSettingsActivity : AppCompatActivity(R.layout.activity_misc_settings) getString(R.string.settings_notification_desc2) ) } + NotificationActionType.NONE -> { b.genSettingsNotificationDesc.text = getString( @@ -172,9 +174,11 @@ class MiscSettingsActivity : AppCompatActivity(R.layout.activity_misc_settings) PcapMode.NONE -> { b.settingsActivityPcapDesc.text = getString(R.string.settings_pcap_dialog_option_1) } + PcapMode.LOGCAT -> { b.settingsActivityPcapDesc.text = getString(R.string.settings_pcap_dialog_option_2) } + PcapMode.EXTERNAL_FILE -> { b.settingsActivityPcapDesc.text = getString(R.string.settings_pcap_dialog_option_3) } @@ -191,6 +195,7 @@ class MiscSettingsActivity : AppCompatActivity(R.layout.activity_misc_settings) getString(R.string.settings_theme_dialog_themes_1) ) } + Themes.LIGHT.id -> { b.genSettingsThemeDesc.text = getString( @@ -198,6 +203,7 @@ class MiscSettingsActivity : AppCompatActivity(R.layout.activity_misc_settings) getString(R.string.settings_theme_dialog_themes_2) ) } + Themes.DARK.id -> { b.genSettingsThemeDesc.text = getString( @@ -205,6 +211,7 @@ class MiscSettingsActivity : AppCompatActivity(R.layout.activity_misc_settings) getString(R.string.settings_theme_dialog_themes_3) ) } + else -> { b.genSettingsThemeDesc.text = getString( @@ -221,9 +228,8 @@ class MiscSettingsActivity : AppCompatActivity(R.layout.activity_misc_settings) !b.settingsActivityEnableLogsSwitch.isChecked } - b.settingsActivityEnableLogsSwitch.setOnCheckedChangeListener { - _: CompoundButton, - b: Boolean -> + b.settingsActivityEnableLogsSwitch.setOnCheckedChangeListener { _: CompoundButton, + b: Boolean -> persistentState.logsEnabled = b } @@ -242,9 +248,8 @@ class MiscSettingsActivity : AppCompatActivity(R.layout.activity_misc_settings) !b.settingsActivityCheckUpdateSwitch.isChecked } - b.settingsActivityCheckUpdateSwitch.setOnCheckedChangeListener { - _: CompoundButton, - b: Boolean -> + b.settingsActivityCheckUpdateSwitch.setOnCheckedChangeListener { _: CompoundButton, + b: Boolean -> persistentState.checkForAppUpdate = b } @@ -272,9 +277,8 @@ class MiscSettingsActivity : AppCompatActivity(R.layout.activity_misc_settings) !b.settingsActivityAppNotificationPersistentSwitch.isChecked } - b.settingsActivityAppNotificationPersistentSwitch.setOnCheckedChangeListener { - _: CompoundButton, - b: Boolean -> + b.settingsActivityAppNotificationPersistentSwitch.setOnCheckedChangeListener { _: CompoundButton, + b: Boolean -> persistentState.persistentNotification = b } @@ -324,9 +328,8 @@ class MiscSettingsActivity : AppCompatActivity(R.layout.activity_misc_settings) val locale = languages.getOrDefault(item, "en-US") AppCompatDelegate.setApplicationLocales(LocaleListCompat.forLanguageTags(locale)) } - alertBuilder.setNeutralButton(getString(R.string.settings_locale_dialog_neutral)) { - dialog, - _ -> + alertBuilder.setNeutralButton(getString(R.string.settings_locale_dialog_neutral)) { dialog, + _ -> dialog.dismiss() openActionViewIntent(getString(R.string.about_translate_link).toUri()) } @@ -386,7 +389,7 @@ class MiscSettingsActivity : AppCompatActivity(R.layout.activity_misc_settings) private fun Context.isDarkThemeOn(): Boolean { return resources.configuration.uiMode and Configuration.UI_MODE_NIGHT_MASK == - Configuration.UI_MODE_NIGHT_YES + Configuration.UI_MODE_NIGHT_YES } private fun showThemeDialog() { @@ -415,12 +418,15 @@ class MiscSettingsActivity : AppCompatActivity(R.layout.activity_misc_settings) setThemeRecreate(R.style.AppThemeWhite) } } + Themes.LIGHT.id -> { setThemeRecreate(R.style.AppThemeWhite) } + Themes.DARK.id -> { setThemeRecreate(R.style.AppTheme) } + Themes.TRUE_BLACK.id -> { setThemeRecreate(R.style.AppThemeTrueBlack) } @@ -483,11 +489,13 @@ class MiscSettingsActivity : AppCompatActivity(R.layout.activity_misc_settings) getString(R.string.settings_pcap_dialog_option_1) appConfig.setPcap(PcapMode.NONE.id) } + PcapMode.LOGCAT -> { b.settingsActivityPcapDesc.text = getString(R.string.settings_pcap_dialog_option_2) appConfig.setPcap(PcapMode.LOGCAT.id, PcapMode.ENABLE_PCAP_LOGCAT) } + PcapMode.EXTERNAL_FILE -> { b.settingsActivityPcapDesc.text = getString(R.string.settings_pcap_dialog_option_3) @@ -524,6 +532,7 @@ class MiscSettingsActivity : AppCompatActivity(R.layout.activity_misc_settings) persistentState.notificationActionType = NotificationActionType.PAUSE_STOP.action } + NotificationActionType.DNS_FIREWALL -> { b.genSettingsNotificationDesc.text = getString( @@ -533,6 +542,7 @@ class MiscSettingsActivity : AppCompatActivity(R.layout.activity_misc_settings) persistentState.notificationActionType = NotificationActionType.DNS_FIREWALL.action } + NotificationActionType.NONE -> { b.genSettingsNotificationDesc.text = getString( @@ -782,7 +792,7 @@ class MiscSettingsActivity : AppCompatActivity(R.layout.activity_misc_settings) @RequiresApi(Build.VERSION_CODES.TIRAMISU) private fun isNotificationPermissionGranted(): Boolean { return ContextCompat.checkSelfPermission(this, Manifest.permission.POST_NOTIFICATIONS) == - PackageManager.PERMISSION_GRANTED + PackageManager.PERMISSION_GRANTED } private fun enableAfterDelay(ms: Long, vararg views: View) { From 2e5f3577651d17b5bf7a8624109160346b8c8854 Mon Sep 17 00:00:00 2001 From: hussainmohd-a Date: Sat, 18 May 2024 20:20:54 +0530 Subject: [PATCH 6/7] rmv crashlytics from website builds --- app/build.gradle | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 18526459..145c2712 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -173,6 +173,7 @@ configurations { } dependencies { + implementation 'com.google.firebase:firebase-crashlytics-ktx:19.0.0' androidTestImplementation 'androidx.test:rules:1.5.0' def room_version = "2.6.1" def paging_version = "3.2.1" @@ -288,13 +289,8 @@ dependencies { // barcode scanner for wireguard fullImplementation 'com.journeyapps:zxing-android-embedded:4.3.0' - playImplementation platform('com.google.firebase:firebase-bom:33.0.0') - playImplementation 'com.google.firebase:firebase-crashlytics-ktx' - playImplementation 'com.google.firebase:firebase-crashlytics-ndk' - - websiteImplementation platform('com.google.firebase:firebase-bom:33.0.0') - websiteImplementation 'com.google.firebase:firebase-crashlytics-ktx' - websiteImplementation 'com.google.firebase:firebase-crashlytics-ndk' + playImplementation 'com.google.firebase:firebase-crashlytics:19.0.0' + playImplementation 'com.google.firebase:firebase-crashlytics-ndk:19.0.0' } // github.com/michel-kraemer/gradle-download-task/issues/131#issuecomment-464476903 From 839e1e1a209241bed591f4126f99395a6a9bde48 Mon Sep 17 00:00:00 2001 From: hussainmohd-a Date: Sat, 18 May 2024 21:36:48 +0530 Subject: [PATCH 7/7] whats new string for v055j --- app/src/main/res/values/strings.xml | 18 ++++++------------ 1 file changed, 6 insertions(+), 12 deletions(-) diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 6f40f459..cc064be8 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -399,18 +399,12 @@ Choose mode - JA Donenfeld 4.0

- 1. Show upload, download stats for WireGuard.
- 2. Auto recover dropped WireGuard connections.
- 3. Implement Android\'s seamless handover on network changes.
- 4. New UI for per-app Network and DNS logs.
- 5. Support for multiple DNSCrypt relays.
- 6. Improvement: Show WireGuard Peer handshake time periods.
- 7. Bug fix: Prevent multi package apps auto-deleting from WireGuard configs.
- 8. Bug fix: Inaccessible On-device blocklists Configure UI.
- 9. Bug fix: Close packet capture file when appropriate.
- 10. Bug fix: Fix crash when stopping WireGuard.
- 11. Other bug fixed and improvements.

+ Inside Job

+ 1. New: IP and DNS logs for each app with a new organized view.
+ 2. New: Setting to optionally exclude proxy forwarder apps.
+ 3. Fix DNSCrypt crashing with DNS Booster enabled.
+ 4. Fix IPv6 to IPv4 translation in certain cases.
+ 3. Other bug fixes and improvements.

Help translate this app]]>