diff --git a/androidApp/build.gradle.kts b/androidApp/build.gradle.kts index cccbb10..a97cdb3 100644 --- a/androidApp/build.gradle.kts +++ b/androidApp/build.gradle.kts @@ -1,6 +1,7 @@ import java.io.ByteArrayOutputStream val ignoreGitVersion: String by project +val acraVersion = "5.9.7" plugins { id("com.android.application") @@ -187,6 +188,9 @@ dependencies { testImplementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.0") implementation("org.jetbrains.kotlinx:kotlinx-datetime:0.4.0") + implementation("ch.acra:acra-http:$acraVersion") + implementation("ch.acra:acra-toast:$acraVersion") + // Matomo implementation("com.github.matomo-org:matomo-sdk-android:4.1.4") } diff --git a/androidApp/src/main/java/bou/amine/apps/readerforselfossv2/android/HomeActivity.kt b/androidApp/src/main/java/bou/amine/apps/readerforselfossv2/android/HomeActivity.kt index 814b335..c1f513d 100644 --- a/androidApp/src/main/java/bou/amine/apps/readerforselfossv2/android/HomeActivity.kt +++ b/androidApp/src/main/java/bou/amine/apps/readerforselfossv2/android/HomeActivity.kt @@ -59,11 +59,15 @@ import com.mikepenz.materialdrawer.util.updateBadge import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch +import org.acra.ACRA +import org.acra.ktx.sendSilentlyWithAcra +import org.acra.ktx.sendWithAcra import org.kodein.di.DIAware import org.kodein.di.android.closestDI import org.kodein.di.instance import org.matomo.sdk.Tracker import org.matomo.sdk.extra.TrackHelper +import java.security.MessageDigest import java.util.concurrent.TimeUnit @@ -306,6 +310,8 @@ class HomeActivity : AppCompatActivity(), SearchView.OnQueryTextListener, DIAwar handleBottomBarActions() + handleGDPRDialog(appSettingsService.settings.getBoolean("GDPR_shown", false)) + handleRecurringTask() CoroutineScope(Dispatchers.Main).launch { @@ -315,6 +321,26 @@ class HomeActivity : AppCompatActivity(), SearchView.OnQueryTextListener, DIAwar getElementsAccordingToTab() } + + private fun handleGDPRDialog(GDPRShown: Boolean) { + val messageDigest: MessageDigest = MessageDigest.getInstance("SHA-256") + messageDigest.update(appSettingsService.getBaseUrl().toByteArray()) + ACRA.errorReporter.putCustomData("unique_id", String(messageDigest.digest())) + if (!GDPRShown) { + val alertDialog = AlertDialog.Builder(this).create() + alertDialog.setTitle(getString(R.string.gdpr_dialog_title)) + alertDialog.setMessage(getString(R.string.gdpr_dialog_message)) + alertDialog.setButton( + AlertDialog.BUTTON_NEUTRAL, + "OK" + ) { dialog, _ -> + appSettingsService.settings.putBoolean("GDPR_shown", true) + dialog.dismiss() + } + alertDialog.show() + } + } + private fun initDrawer() { DrawerImageLoader.init(object : AbstractDrawerImageLoader() { override fun set(imageView: ImageView, uri: Uri, placeholder: Drawable, tag: String?) { @@ -487,6 +513,7 @@ class HomeActivity : AppCompatActivity(), SearchView.OnQueryTextListener, DIAwar val gdColor = try { Color.parseColor(it.color) } catch (e: IllegalArgumentException) { + e.sendSilentlyWithAcra() resources.getColor(R.color.colorPrimary) } gd.setColor(gdColor) diff --git a/androidApp/src/main/java/bou/amine/apps/readerforselfossv2/android/MyApp.kt b/androidApp/src/main/java/bou/amine/apps/readerforselfossv2/android/MyApp.kt index 4a4f150..1a5c52e 100644 --- a/androidApp/src/main/java/bou/amine/apps/readerforselfossv2/android/MyApp.kt +++ b/androidApp/src/main/java/bou/amine/apps/readerforselfossv2/android/MyApp.kt @@ -29,6 +29,13 @@ import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.launch +import org.acra.ACRA +import org.acra.ReportField +import org.acra.config.httpSender +import org.acra.config.toast +import org.acra.data.StringFormat +import org.acra.ktx.initAcra +import org.acra.sender.HttpSender import org.kodein.di.* import org.matomo.sdk.Matomo import org.matomo.sdk.Tracker @@ -59,28 +66,57 @@ class MyApp : MultiDexApplication(), DIAware { super.onCreate() Napier.base(DebugAntilog()) - initDrawerImageLoader() + if (!ACRA.isACRASenderServiceProcess()) { + initDrawerImageLoader() - tryToHandleBug() + tryToHandleBug() - handleNotificationChannels() + handleNotificationChannels() - ProcessLifecycleOwner.get().lifecycle.addObserver(AppLifeCycleObserver(connectivityStatus, repository)) + ProcessLifecycleOwner.get().lifecycle.addObserver(AppLifeCycleObserver(connectivityStatus, repository)) - CoroutineScope(Dispatchers.Main).launch { - viewModel.networkAvailableProvider.collect { networkAvailable -> - val toastMessage = if (networkAvailable) { - repository.handleDBActions() - R.string.network_connectivity_retrieved - } else { - R.string.network_connectivity_lost + CoroutineScope(Dispatchers.Main).launch { + viewModel.networkAvailableProvider.collect { networkAvailable -> + val toastMessage = if (networkAvailable) { + repository.handleDBActions() + R.string.network_connectivity_retrieved + } else { + R.string.network_connectivity_lost + } + + Toast.makeText( + applicationContext, + toastMessage, + Toast.LENGTH_SHORT + ).show() } + } + } + } - Toast.makeText( - applicationContext, - toastMessage, - Toast.LENGTH_SHORT - ).show() + override fun attachBaseContext(base: Context?) { + super.attachBaseContext(base) + + initAcra { + reportFormat = StringFormat.JSON + reportContent = listOf( + ReportField.REPORT_ID, ReportField.INSTALLATION_ID, + ReportField.APP_VERSION_CODE, ReportField.APP_VERSION_NAME, + ReportField.BUILD, ReportField.ANDROID_VERSION, ReportField.BRAND, ReportField.PHONE_MODEL, + ReportField.AVAILABLE_MEM_SIZE, ReportField.TOTAL_MEM_SIZE, + ReportField.STACK_TRACE, ReportField.APPLICATION_LOG, ReportField.LOGCAT, + ReportField.INITIAL_CONFIGURATION, ReportField.CRASH_CONFIGURATION, ReportField.IS_SILENT, + ReportField.USER_APP_START_DATE, ReportField.USER_COMMENT, ReportField.USER_CRASH_DATE, ReportField.USER_EMAIL, ReportField.CUSTOM_DATA) + toast { + //required + text = getString(R.string.crash_toast_text) + length = Toast.LENGTH_SHORT + } + httpSender { + uri = "https://bugs.amine-louveau.fr/report" /*best guess, you may need to adjust this*/ + basicAuthLogin = "LMTlLZuazADohTCm" + basicAuthPassword = "he6ghHp83F0PYPfh" + httpMethod = HttpSender.Method.POST } } } diff --git a/androidApp/src/main/java/bou/amine/apps/readerforselfossv2/android/fragments/ArticleFragment.kt b/androidApp/src/main/java/bou/amine/apps/readerforselfossv2/android/fragments/ArticleFragment.kt index b90f18a..555c384 100644 --- a/androidApp/src/main/java/bou/amine/apps/readerforselfossv2/android/fragments/ArticleFragment.kt +++ b/androidApp/src/main/java/bou/amine/apps/readerforselfossv2/android/fragments/ArticleFragment.kt @@ -44,6 +44,8 @@ import com.google.android.material.floatingactionbutton.FloatingActionButton import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch +import org.acra.ktx.sendSilentlyWithAcra +import org.acra.ktx.sendWithAcra import org.kodein.di.DI import org.kodein.di.DIAware import org.kodein.di.android.x.closestDI @@ -112,6 +114,7 @@ class ArticleFragment : Fragment(), DIAware { typeface = try { ResourcesCompat.getFont(requireContext(), resId)!! } catch (e: java.lang.Exception) { + e.sendSilentlyWithAcra() // Just to be sure null } @@ -217,6 +220,7 @@ class ArticleFragment : Fragment(), DIAware { ) } catch (e: InflateException) { + e.sendSilentlyWithAcra() AlertDialog.Builder(requireContext()) .setMessage(requireContext().getString(R.string.webview_dialog_issue_message)) .setTitle(requireContext().getString(R.string.webview_dialog_issue_title)) @@ -264,15 +268,18 @@ class ArticleFragment : Fragment(), DIAware { URL(response.data!!.url) url = response.data!!.url } catch (e: MalformedURLException) { - // Mercury returned a relative url. We do nothing. + // Mercury returned a relative url + e.sendSilentlyWithAcra() } } catch (e: Exception) { + e.sendSilentlyWithAcra() } try { contentText = response.data!!.content.orEmpty() htmlToWebview() } catch (e: Exception) { + e.sendSilentlyWithAcra() } try { @@ -288,13 +295,13 @@ class ArticleFragment : Fragment(), DIAware { .apply(RequestOptions.fitCenterTransform()) .into(binding.imageView) } catch (e: Exception) { + e.sendSilentlyWithAcra() } } else { binding.imageView.visibility = View.GONE } } catch (e: Exception) { - if (context != null) { - } + e.sendSilentlyWithAcra() } try { @@ -302,20 +309,17 @@ class ArticleFragment : Fragment(), DIAware { binding.progressBar.visibility = View.GONE } catch (e: Exception) { - if (context != null) { - } + e.sendSilentlyWithAcra() } } else { try { openInBrowserAfterFailing() } catch (e: Exception) { - if (context != null) { - } + e.sendSilentlyWithAcra() } } } catch (e: Exception) { - if (context != null) { - } + e.sendSilentlyWithAcra() } } else { openInBrowserAfterFailing() @@ -359,19 +363,25 @@ class ArticleFragment : Fragment(), DIAware { try { val image = Glide.with(view).asBitmap().apply(glideOptions).load(url).submit().get() return WebResourceResponse("image/jpg", "UTF-8", getBitmapInputStream(image, Bitmap.CompressFormat.JPEG)) - }catch ( e : ExecutionException) {} + } catch ( e : ExecutionException) { + e.sendSilentlyWithAcra() + } } else if (url.lowercase(Locale.US).contains(".png")) { try { val image = Glide.with(view).asBitmap().apply(glideOptions).load(url).submit().get() return WebResourceResponse("image/jpg", "UTF-8", getBitmapInputStream(image, Bitmap.CompressFormat.PNG)) - }catch ( e : ExecutionException) {} + } catch ( e : ExecutionException) { + e.sendSilentlyWithAcra() + } } else if (url.lowercase(Locale.US).contains(".webp")) { try { val image = Glide.with(view).asBitmap().apply(glideOptions).load(url).submit().get() return WebResourceResponse("image/jpg", "UTF-8", getBitmapInputStream(image, Bitmap.CompressFormat.WEBP)) - }catch ( e : ExecutionException) {} + } catch ( e : ExecutionException) { + e.sendSilentlyWithAcra() + } } return super.shouldInterceptRequest(view, url) @@ -395,6 +405,7 @@ class ArticleFragment : Fragment(), DIAware { val itemUrl = URL(url) baseUrl = itemUrl.protocol + "://" + itemUrl.host } catch (e: MalformedURLException) { + e.sendSilentlyWithAcra() } val fontName = when (font) { diff --git a/androidApp/src/main/java/bou/amine/apps/readerforselfossv2/android/model/AndroidIModelUtils.kt b/androidApp/src/main/java/bou/amine/apps/readerforselfossv2/android/model/AndroidIModelUtils.kt index 4822eca..618dda2 100644 --- a/androidApp/src/main/java/bou/amine/apps/readerforselfossv2/android/model/AndroidIModelUtils.kt +++ b/androidApp/src/main/java/bou/amine/apps/readerforselfossv2/android/model/AndroidIModelUtils.kt @@ -7,6 +7,7 @@ import bou.amine.apps.readerforselfossv2.utils.getImages import com.bumptech.glide.Glide import com.bumptech.glide.load.engine.DiskCacheStrategy import com.bumptech.glide.request.RequestOptions +import org.acra.ktx.sendSilentlyWithAcra fun SelfossModel.Item.preloadImages(context: Context) : Boolean { val imageUrls = this.getImages() @@ -23,6 +24,7 @@ fun SelfossModel.Item.preloadImages(context: Context) : Boolean { } } } catch (e : Error) { + e.sendSilentlyWithAcra() return false } @@ -35,7 +37,7 @@ fun String.toTextDrawableString(): String { try { textDrawable.append(s[0]) } catch (e: StringIndexOutOfBoundsException) { - // We do nothing + e.sendSilentlyWithAcra() } } return textDrawable.toString() diff --git a/androidApp/src/main/java/bou/amine/apps/readerforselfossv2/android/settings/SettingsActivity.kt b/androidApp/src/main/java/bou/amine/apps/readerforselfossv2/android/settings/SettingsActivity.kt index 8f3f14b..e3bbe13 100644 --- a/androidApp/src/main/java/bou/amine/apps/readerforselfossv2/android/settings/SettingsActivity.kt +++ b/androidApp/src/main/java/bou/amine/apps/readerforselfossv2/android/settings/SettingsActivity.kt @@ -17,6 +17,8 @@ import androidx.preference.PreferenceFragmentCompat import bou.amine.apps.readerforselfossv2.android.R import bou.amine.apps.readerforselfossv2.android.databinding.ActivitySettingsBinding import bou.amine.apps.readerforselfossv2.service.AppSettingsService +import org.acra.ktx.sendSilentlyWithAcra +import org.acra.ktx.sendWithAcra import org.kodein.di.DIAware import org.kodein.di.android.closestDI import org.kodein.di.instance @@ -101,6 +103,11 @@ class SettingsActivity : AppCompatActivity(), class MainPreferenceFragment : PreferenceFragmentCompat() { override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) { setPreferencesFromResource(R.xml.pref_main, rootKey) + + preferenceManager.findPreference("currentMode")?.onPreferenceChangeListener = Preference.OnPreferenceChangeListener { _, newValue -> + AppCompatDelegate.setDefaultNightMode(newValue.toString().toInt()) // ListPreference Only takes string-arrays ¯\_(ツ)_/¯ + true + } } } @@ -117,6 +124,7 @@ class SettingsActivity : AppCompatActivity(), val input: Int = (dest.toString() + source.toString()).toInt() if (input in 1..200) return@InputFilter null } catch (nfe: NumberFormatException) { + nfe.sendSilentlyWithAcra() Toast.makeText(activity, R.string.items_number_should_be_number, Toast.LENGTH_LONG).show() } "" @@ -140,6 +148,7 @@ class SettingsActivity : AppCompatActivity(), try { editText.textSize = editable.toString().toInt().toFloat() } catch (e: NumberFormatException) { + e.sendSilentlyWithAcra() } } } } @@ -149,6 +158,7 @@ class SettingsActivity : AppCompatActivity(), val input = (dest.toString() + source.toString()).toInt() if (input > 0) return@InputFilter null } catch (nfe: NumberFormatException) { + nfe.sendSilentlyWithAcra() } "" } diff --git a/androidApp/src/main/res/drawable/ic_baseline_bug_report_24.xml b/androidApp/src/main/res/drawable/ic_baseline_bug_report_24.xml new file mode 100644 index 0000000..031730c --- /dev/null +++ b/androidApp/src/main/res/drawable/ic_baseline_bug_report_24.xml @@ -0,0 +1,5 @@ + + + diff --git a/androidApp/src/main/res/drawable/ic_baseline_insights_24.xml b/androidApp/src/main/res/drawable/ic_baseline_insights_24.xml new file mode 100644 index 0000000..99440b9 --- /dev/null +++ b/androidApp/src/main/res/drawable/ic_baseline_insights_24.xml @@ -0,0 +1,7 @@ + + + + + diff --git a/androidApp/src/main/res/values-ca-rES/strings.xml b/androidApp/src/main/res/values-ca-rES/strings.xml index 350228f..dc17955 100644 --- a/androidApp/src/main/res/values-ca-rES/strings.xml +++ b/androidApp/src/main/res/values-ca-rES/strings.xml @@ -134,4 +134,8 @@ Light mode Error loading sources… Enable analytics + The app does not share any personal data about you. + + A crash occured. Sending the details to the developper. + "Disable automatic bug reporting. " diff --git a/androidApp/src/main/res/values-de-rDE/strings.xml b/androidApp/src/main/res/values-de-rDE/strings.xml index b4c18d4..c9d6640 100644 --- a/androidApp/src/main/res/values-de-rDE/strings.xml +++ b/androidApp/src/main/res/values-de-rDE/strings.xml @@ -134,4 +134,8 @@ Light mode Error loading sources… Enable analytics + The app does not share any personal data about you. + + A crash occured. Sending the details to the developper. + "Disable automatic bug reporting. " diff --git a/androidApp/src/main/res/values-es-rES/strings.xml b/androidApp/src/main/res/values-es-rES/strings.xml index cead2ba..fd68002 100644 --- a/androidApp/src/main/res/values-es-rES/strings.xml +++ b/androidApp/src/main/res/values-es-rES/strings.xml @@ -134,4 +134,8 @@ Light mode Error loading sources… Enable analytics + The app does not share any personal data about you. + + A crash occured. Sending the details to the developper. + "Disable automatic bug reporting. " diff --git a/androidApp/src/main/res/values-fa-rIR/strings.xml b/androidApp/src/main/res/values-fa-rIR/strings.xml index 1b7bd0b..568519a 100644 --- a/androidApp/src/main/res/values-fa-rIR/strings.xml +++ b/androidApp/src/main/res/values-fa-rIR/strings.xml @@ -134,4 +134,8 @@ Light mode Error loading sources… Enable analytics + The app does not share any personal data about you. + + A crash occured. Sending the details to the developper. + "Disable automatic bug reporting. " diff --git a/androidApp/src/main/res/values-fr-rFR/strings.xml b/androidApp/src/main/res/values-fr-rFR/strings.xml index cabbdea..777ba1d 100644 --- a/androidApp/src/main/res/values-fr-rFR/strings.xml +++ b/androidApp/src/main/res/values-fr-rFR/strings.xml @@ -134,4 +134,8 @@ Thème clair Error loading sources… Enable analytics + The app does not share any personal data about you. + + A crash occured. Sending the details to the developper. + "Disable automatic bug reporting. " diff --git a/androidApp/src/main/res/values-gl-rES/strings.xml b/androidApp/src/main/res/values-gl-rES/strings.xml index f4de4ce..300cb75 100644 --- a/androidApp/src/main/res/values-gl-rES/strings.xml +++ b/androidApp/src/main/res/values-gl-rES/strings.xml @@ -134,4 +134,8 @@ Light mode Error loading sources… Enable analytics + The app does not share any personal data about you. + + A crash occured. Sending the details to the developper. + "Disable automatic bug reporting. " diff --git a/androidApp/src/main/res/values-in-rID/strings.xml b/androidApp/src/main/res/values-in-rID/strings.xml index 2037014..5496c77 100644 --- a/androidApp/src/main/res/values-in-rID/strings.xml +++ b/androidApp/src/main/res/values-in-rID/strings.xml @@ -134,4 +134,8 @@ Light mode Error loading sources… Enable analytics + The app does not share any personal data about you. + + A crash occured. Sending the details to the developper. + "Disable automatic bug reporting. " diff --git a/androidApp/src/main/res/values-it-rIT/strings.xml b/androidApp/src/main/res/values-it-rIT/strings.xml index 7fcd6cf..dca5595 100644 --- a/androidApp/src/main/res/values-it-rIT/strings.xml +++ b/androidApp/src/main/res/values-it-rIT/strings.xml @@ -134,4 +134,8 @@ Light mode Error loading sources… Enable analytics + The app does not share any personal data about you. + + A crash occured. Sending the details to the developper. + "Disable automatic bug reporting. " diff --git a/androidApp/src/main/res/values-ko-rKR/strings.xml b/androidApp/src/main/res/values-ko-rKR/strings.xml index d31e480..88f5aa8 100644 --- a/androidApp/src/main/res/values-ko-rKR/strings.xml +++ b/androidApp/src/main/res/values-ko-rKR/strings.xml @@ -134,4 +134,8 @@ Light mode Error loading sources… Enable analytics + The app does not share any personal data about you. + + A crash occured. Sending the details to the developper. + "Disable automatic bug reporting. " diff --git a/androidApp/src/main/res/values-night/strings.xml b/androidApp/src/main/res/values-night/strings.xml index 0f00e58..a0a75f3 100644 --- a/androidApp/src/main/res/values-night/strings.xml +++ b/androidApp/src/main/res/values-night/strings.xml @@ -1,4 +1,8 @@ Enable analytics + The app does not share any personal data about you. + + A crash occured. Sending the details to the developper. + "Disable automatic bug reporting. " \ No newline at end of file diff --git a/androidApp/src/main/res/values-nl-rNL/strings.xml b/androidApp/src/main/res/values-nl-rNL/strings.xml index 350037a..04e928d 100644 --- a/androidApp/src/main/res/values-nl-rNL/strings.xml +++ b/androidApp/src/main/res/values-nl-rNL/strings.xml @@ -134,4 +134,8 @@ Light mode Error loading sources… Enable analytics + The app does not share any personal data about you. + + A crash occured. Sending the details to the developper. + "Disable automatic bug reporting. " diff --git a/androidApp/src/main/res/values-pt-rBR/strings.xml b/androidApp/src/main/res/values-pt-rBR/strings.xml index 142f733..df02f11 100644 --- a/androidApp/src/main/res/values-pt-rBR/strings.xml +++ b/androidApp/src/main/res/values-pt-rBR/strings.xml @@ -134,4 +134,8 @@ Light mode Error loading sources… Enable analytics + The app does not share any personal data about you. + + A crash occured. Sending the details to the developper. + "Disable automatic bug reporting. " diff --git a/androidApp/src/main/res/values-pt-rPT/strings.xml b/androidApp/src/main/res/values-pt-rPT/strings.xml index 5554e77..f566de5 100644 --- a/androidApp/src/main/res/values-pt-rPT/strings.xml +++ b/androidApp/src/main/res/values-pt-rPT/strings.xml @@ -134,4 +134,8 @@ Light mode Error loading sources… Enable analytics + The app does not share any personal data about you. + + A crash occured. Sending the details to the developper. + "Disable automatic bug reporting. " diff --git a/androidApp/src/main/res/values-si-rLK/strings.xml b/androidApp/src/main/res/values-si-rLK/strings.xml index 699bed0..48bc1a1 100644 --- a/androidApp/src/main/res/values-si-rLK/strings.xml +++ b/androidApp/src/main/res/values-si-rLK/strings.xml @@ -134,4 +134,8 @@ Light mode Error loading sources… Enable analytics + The app does not share any personal data about you. + + A crash occured. Sending the details to the developper. + "Disable automatic bug reporting. " diff --git a/androidApp/src/main/res/values-tr-rTR/strings.xml b/androidApp/src/main/res/values-tr-rTR/strings.xml index b7e5deb..3ed200d 100644 --- a/androidApp/src/main/res/values-tr-rTR/strings.xml +++ b/androidApp/src/main/res/values-tr-rTR/strings.xml @@ -134,4 +134,8 @@ Light mode Error loading sources… Enable analytics + The app does not share any personal data about you. + + A crash occured. Sending the details to the developper. + "Disable automatic bug reporting. " diff --git a/androidApp/src/main/res/values-zh-rCN/strings.xml b/androidApp/src/main/res/values-zh-rCN/strings.xml index 62845fb..6ddf691 100644 --- a/androidApp/src/main/res/values-zh-rCN/strings.xml +++ b/androidApp/src/main/res/values-zh-rCN/strings.xml @@ -134,4 +134,8 @@ 浅色模式 Error loading sources… Enable analytics + The app does not share any personal data about you. + + A crash occured. Sending the details to the developper. + "Disable automatic bug reporting. " diff --git a/androidApp/src/main/res/values-zh-rTW/strings.xml b/androidApp/src/main/res/values-zh-rTW/strings.xml index 322e112..ef9357b 100644 --- a/androidApp/src/main/res/values-zh-rTW/strings.xml +++ b/androidApp/src/main/res/values-zh-rTW/strings.xml @@ -134,4 +134,8 @@ Light mode Error loading sources… Enable analytics + The app does not share any personal data about you. + + A crash occured. Sending the details to the developper. + "Disable automatic bug reporting. " diff --git a/androidApp/src/main/res/values/strings.xml b/androidApp/src/main/res/values/strings.xml index e0f0311..fcb6613 100644 --- a/androidApp/src/main/res/values/strings.xml +++ b/androidApp/src/main/res/values/strings.xml @@ -137,4 +137,8 @@ Follow the system setting Light mode Enable analytics + The app does not share any personal data about you. + + A crash occured. Sending the details to the developper. + "Disable automatic bug reporting. " diff --git a/androidApp/src/main/res/xml/pref_experimental.xml b/androidApp/src/main/res/xml/pref_experimental.xml index 990de19..7fd7caa 100644 --- a/androidApp/src/main/res/xml/pref_experimental.xml +++ b/androidApp/src/main/res/xml/pref_experimental.xml @@ -1,12 +1,6 @@ - - - + + + + + + \ No newline at end of file