Display memory usage information in About > Version. https://redmine.stoutner.com... master
authorSoren Stoutner <soren@stoutner.com>
Wed, 16 Sep 2020 21:41:26 +0000 (14:41 -0700)
committerSoren Stoutner <soren@stoutner.com>
Wed, 16 Sep 2020 21:41:26 +0000 (14:41 -0700)
20 files changed:
.idea/dictionaries/soren.xml
app/build.gradle
app/src/main/assets/fr/about_changelog_dark.html
app/src/main/assets/fr/about_changelog_light.html
app/src/main/assets/fr/about_contributors_dark.html
app/src/main/assets/fr/about_contributors_light.html
app/src/main/java/com/stoutner/privacybrowser/activities/AboutActivity.java
app/src/main/java/com/stoutner/privacybrowser/activities/GuideActivity.java
app/src/main/java/com/stoutner/privacybrowser/activities/MainWebViewActivity.java
app/src/main/java/com/stoutner/privacybrowser/fragments/AboutTabFragment.java
app/src/main/java/com/stoutner/privacybrowser/helpers/ImportExportDatabaseHelper.java
app/src/main/res/layout/about_tab_version.xml
app/src/main/res/values-de/strings.xml
app/src/main/res/values-es/strings.xml
app/src/main/res/values-fr/strings.xml
app/src/main/res/values-it/strings.xml
app/src/main/res/values-ru/strings.xml
app/src/main/res/values/strings.xml
fastlane/metadata/android/fr-FR/changelogs/50.txt
fastlane/metadata/android/fr-FR/changelogs/51.txt

index db5337400691a98dd42c401651120ea8f93d39ee..60111a3fbe00dcbe41f688c17eb24f7f710fe049 100644 (file)
       <w>macos</w>
       <w>mailto</w>
       <w>materialdesignicons</w>
+      <w>mebibytes</w>
       <w>mimetype</w>
       <w>mitm</w>
       <w>mojeek</w>
index 8e47ef3b4f07957540e3e0030956de6a75027440..ae709794eeb5b80bf0ce6324e294197f1913f070 100644 (file)
@@ -96,5 +96,5 @@ dependencies {
     implementation 'com.google.android.material:material:1.2.1'
 
     // Only compile Firebase ads for the free flavor.
-    freeImplementation 'com.google.firebase:firebase-ads:19.3.0'
+    freeImplementation 'com.google.firebase:firebase-ads:19.4.0'
 }
\ No newline at end of file
index d775e6740656ff7affdf1e4c0baa22b0b93512a5..32c9f3fe3218a9583d222bb8ace46a9d7574bde0 100644 (file)
         <h3><a href="https://www.stoutner.com/privacy-browser-3-5-1/">3.5.1</a> (version du code 51)</h3>
         <p><a href="https://git.stoutner.com/?p=PrivacyBrowser.git;a=commitdiff;h=1907b1ff1fd02d6f8809aeb6710af42e033c064f">28 Août 2020</a> - API minimale : 19, API optimale : 29</p>
         <ul>
-            <li>Fix a bug that caused new intents (links from other apps) to <a href="https://redmine.stoutner.com/issues/599">not load</a> if Privacy Browser had been killed by the OS in the background.</li>
-            <li>Fix a bug that caused the app to <a href="https://redmine.stoutner.com/issues/605">initialize incorrectly</a> if the app theme was set to the opposite of the OS theme.</li>
+            <li>Correction d'un bug qui empêchait de nouveaux intents (liens en provenance d'autres applications) de <a href="https://redmine.stoutner.com/issues/599">se charger</a>
+                si Privacy Browser avait été tué par le système d'exploitation en arrière-plan.</li>
+            <li>Correction d'un bug qui entraînait une <a href="https://redmine.stoutner.com/issues/605">initialisation incorrecte de l'application</a>
+                si le thème de l'application était défini à l'opposé du thème du système d'exploitation.</li>
         </ul>
 
         <h3><a href="https://www.stoutner.com/privacy-browser-3-5/">3.5</a> (version du code 50)</h3>
         <p><a href="https://git.stoutner.com/?p=PrivacyBrowser.git;a=commitdiff;h=379ae3eabfd9ee949151b7b218b875ffcc627c5a">18 Août 2020</a> - API minimale : 19, API optimale : 29</p>
         <ul>
-            <li>Implement Android’s <a href="https://redmine.stoutner.com/issues/572">relatively</a> <a href="https://redmine.stoutner.com/issues/523">new</a>
-                <a href="https://redmine.stoutner.com/issues/522">Day/Night</a> <a href="https://redmine.stoutner.com/issues/506">theme</a>.</li>
-            <li>Switch to using WebView relatively new built-in <a href="https://redmine.stoutner.com/issues/366">dark theme</a>.</li>
-            <li><a href="https://redmine.stoutner.com/issues/461">Save and restore the state</a> if Privacy Browser is restarted in the background by the OS.</li>
-            <li>Use the Content-Disposition header to get <a href="https://redmine.stoutner.com/issues/547">file names for downloads</a>.</li>
-            <li>Fix <a href="https://redmine.stoutner.com/issues/556">uploading files</a> to some sites.</li>
-            <li>Add <a href="https://redmine.stoutner.com/issues/576">Mojeek</a> and remove <a href="https://redmine.stoutner.com/issues/569">Qwant</a> and
-                <a href="https://redmine.stoutner.com/issues/571">Searx</a> from the list of search engines.</li>
-            <li>Fix a bug that sometimes caused swipe-to-refresh to operate <a href="https://redmine.stoutner.com/issues/514">even when disabled</a>.</li>
-            <li>Reorder the <a href="https://redmine.stoutner.com/issues/544">context menus</a>.</li>
-            <li>Apply <a href="https://redmine.stoutner.com/issues/584">custom headers</a> to links loaded from the WebView.</li>
+            <li>Implémentaton <a href="https://redmine.stoutner.com/issues/572">relativement</a> <a href="https://redmine.stoutner.com/issues/523">récente</a>
+                <a href="https://redmine.stoutner.com/issues/522">du thème</a> <a href="https://redmine.stoutner.com/issues/506">Jour / Nuit</a> d'Android.</li>
+            <li>Ajout d'un bouton permettant d'utiliser le nouveau <a href="https://redmine.stoutner.com/issues/366">thème sombre</a> intégré de WebView.</li>
+            <li><a href="https://redmine.stoutner.com/issues/461">Enregistrement et restauration de l'état</a> de Privacy Browser si celui-ci est redémarré en arrière-plan par le système d'exploitation.</li>
+            <li>Utilisation de l'en-tête Content-Disposition pour obtenir les <a href="https://redmine.stoutner.com/issues/547">noms des fichiers à télécharger</a>.</li>
+            <li>Correction de <a href="https://redmine.stoutner.com/issues/556">l'importation de fichiers</a> sur certains sites.</li>
+            <li>Ajout de <a href="https://redmine.stoutner.com/issues/576">Mojeek</a> et suppression de <a href="https://redmine.stoutner.com/issues/569">Qwant</a> et
+                <a href="https://redmine.stoutner.com/issues/571">Searx</a> dans la liste des moteurs de recherche.</li>
+            <li>Correction d'un bug qui faisait parfois fonctionner la fonction balayage pour actualiser <a href="https://redmine.stoutner.com/issues/514">même lorsque celle-ci était désactivée</a>.</li>
+            <li>Réorganisation des <a href="https://redmine.stoutner.com/issues/544">menus contextuels</a>.</li>
+            <li>Application d'<a href="https://redmine.stoutner.com/issues/584">en-têtes personnalisées</a> aux liens chargés à partir de WebView.</li>
             <li>Traduction française mise à jour fournie par <a href="mailto:kevinliste@framalistes.org">Kévin LE FLOHIC</a>.</li>
             <li>Traduction allemande mise à jour fournie par Bernhard G. Keller.</li>
             <li>Traduction italienne mise à jour fournie par Francesco Buratti.</li>
index b5e7d71aff07a5d41cd463433c60b782fdffebf2..06831df55f22aedfd5a3fc694235f293a0f7f53c 100644 (file)
         <h3><a href="https://www.stoutner.com/privacy-browser-3-5-1/">3.5.1</a> (version du code 51)</h3>
         <p><a href="https://git.stoutner.com/?p=PrivacyBrowser.git;a=commitdiff;h=1907b1ff1fd02d6f8809aeb6710af42e033c064f">28 Août 2020</a> - API minimale : 19, API optimale : 29</p>
         <ul>
-            <li>Fix a bug that caused new intents (links from other apps) to <a href="https://redmine.stoutner.com/issues/599">not load</a> if Privacy Browser had been killed by the OS in the background.</li>
-            <li>Fix a bug that caused the app to <a href="https://redmine.stoutner.com/issues/605">initialize incorrectly</a> if the app theme was set to the opposite of the OS theme.</li>
+            <li>Correction d'un bug qui empêchait de nouveaux intents (liens en provenance d'autres applications) de <a href="https://redmine.stoutner.com/issues/599">se charger</a>
+                si Privacy Browser avait été tué par le système d'exploitation en arrière-plan.</li>
+            <li>Correction d'un bug qui entraînait une <a href="https://redmine.stoutner.com/issues/605">initialisation incorrecte de l'application</a>
+                si le thème de l'application était défini à l'opposé du thème du système d'exploitation.</li>
         </ul>
 
         <h3><a href="https://www.stoutner.com/privacy-browser-3-5/">3.5</a> (version du code 50)</h3>
         <p><a href="https://git.stoutner.com/?p=PrivacyBrowser.git;a=commitdiff;h=379ae3eabfd9ee949151b7b218b875ffcc627c5a">18 Août 2020</a> - API minimale : 19, API optimale : 29</p>
         <ul>
-            <li>Implement Android’s <a href="https://redmine.stoutner.com/issues/572">relatively</a> <a href="https://redmine.stoutner.com/issues/523">new</a>
-                <a href="https://redmine.stoutner.com/issues/522">Day/Night</a> <a href="https://redmine.stoutner.com/issues/506">theme</a>.</li>
-            <li>Switch to using WebView relatively new built-in <a href="https://redmine.stoutner.com/issues/366">dark theme</a>.</li>
-            <li><a href="https://redmine.stoutner.com/issues/461">Save and restore the state</a> if Privacy Browser is restarted in the background by the OS.</li>
-            <li>Use the Content-Disposition header to get <a href="https://redmine.stoutner.com/issues/547">file names for downloads</a>.</li>
-            <li>Fix <a href="https://redmine.stoutner.com/issues/556">uploading files</a> to some sites.</li>
-            <li>Add <a href="https://redmine.stoutner.com/issues/576">Mojeek</a> and remove <a href="https://redmine.stoutner.com/issues/569">Qwant</a> and
-                <a href="https://redmine.stoutner.com/issues/571">Searx</a> from the list of search engines.</li>
-            <li>Fix a bug that sometimes caused swipe-to-refresh to operate <a href="https://redmine.stoutner.com/issues/514">even when disabled</a>.</li>
-            <li>Reorder the <a href="https://redmine.stoutner.com/issues/544">context menus</a>.</li>
-            <li>Apply <a href="https://redmine.stoutner.com/issues/584">custom headers</a> to links loaded from the WebView.</li>
+            <li>Implémentaton <a href="https://redmine.stoutner.com/issues/572">relativement</a> <a href="https://redmine.stoutner.com/issues/523">récente</a>
+                <a href="https://redmine.stoutner.com/issues/522">du thème</a> <a href="https://redmine.stoutner.com/issues/506">Jour / Nuit</a> d'Android.</li>
+            <li>Ajout d'un bouton permettant d'utiliser le nouveau <a href="https://redmine.stoutner.com/issues/366">thème sombre</a> intégré de WebView.</li>
+            <li><a href="https://redmine.stoutner.com/issues/461">Enregistrement et restauration de l'état</a> de Privacy Browser si celui-ci est redémarré en arrière-plan par le système d'exploitation.</li>
+            <li>Utilisation de l'en-tête Content-Disposition pour obtenir les <a href="https://redmine.stoutner.com/issues/547">noms des fichiers à télécharger</a>.</li>
+            <li>Correction de <a href="https://redmine.stoutner.com/issues/556">l'importation de fichiers</a> sur certains sites.</li>
+            <li>Ajout de <a href="https://redmine.stoutner.com/issues/576">Mojeek</a> et suppression de <a href="https://redmine.stoutner.com/issues/569">Qwant</a> et
+                <a href="https://redmine.stoutner.com/issues/571">Searx</a> dans la liste des moteurs de recherche.</li>
+            <li>Correction d'un bug qui faisait parfois fonctionner la fonction balayage pour actualiser <a href="https://redmine.stoutner.com/issues/514">même lorsque celle-ci était désactivée</a>.</li>
+            <li>Réorganisation des <a href="https://redmine.stoutner.com/issues/544">menus contextuels</a>.</li>
+            <li>Application d'<a href="https://redmine.stoutner.com/issues/584">en-têtes personnalisées</a> aux liens chargés à partir de WebView.</li>
             <li>Traduction française mise à jour fournie par <a href="mailto:kevinliste@framalistes.org">Kévin LE FLOHIC</a>.</li>
             <li>Traduction allemande mise à jour fournie par Bernhard G. Keller.</li>
             <li>Traduction italienne mise à jour fournie par Francesco Buratti.</li>
index 04d5d630aac18f03b8cb75efd0e524d3fa650d95..01ee44a31232e4d3bb3f8d790c377c11ffaf91c4 100644 (file)
@@ -35,7 +35,7 @@
 
         <h3>Traducteurs</h3>
         <a href="mailto:kevinliste@framalistes.org">Kévin LE FLOHIC</a> : Français<br/>
-        <a href="mailto:mochileiro2006-trilhas@yahoo.com.br">Thiago Nazareno Conceição Silva de Jesus</a>: Brazilian Portuguese<br/>
+        <a href="mailto:mochileiro2006-trilhas@yahoo.com.br">Thiago Nazareno Conceição Silva de Jesus</a>: Portugais brésilien<br/>
         Bernhard G. Keller : Allemand<br/>
         Francesco Buratti : Italien<br/>
         Jose A. León : Espagnol
index 13317ed6fd30b4b5ca66a5ffdbb9d4af3b566647..22503bc2575e36491d610e2b969d6d3807a4fb75 100644 (file)
@@ -35,7 +35,7 @@
 
         <h3>Traducteurs</h3>
         <a href="mailto:kevinliste@framalistes.org">Kévin LE FLOHIC</a> : Français<br/>
-        <a href="mailto:mochileiro2006-trilhas@yahoo.com.br">Thiago Nazareno Conceição Silva de Jesus</a>: Brazilian Portuguese<br/>
+        <a href="mailto:mochileiro2006-trilhas@yahoo.com.br">Thiago Nazareno Conceição Silva de Jesus</a>: Portugais brésilien<br/>
         Bernhard G. Keller : Allemand<br/>
         Francesco Buratti : Italien<br/>
         Jose A. León : Espagnol
index 3d5170dfc97d9e60410f3ade3a22942f58e8317d..9ce67ad74b3b054367269b68ee2cc59bafdd821a 100644 (file)
@@ -84,6 +84,9 @@ public class AboutActivity extends AppCompatActivity {
         //  Setup the ViewPager.
         aboutViewPager.setAdapter(new AboutPagerAdapter(getSupportFragmentManager(), getApplicationContext(), blocklistVersions));
 
+        // Keep all the tabs in memory.  This prevents the memory usage updater from running multiple times.
+        aboutViewPager.setOffscreenPageLimit(10);
+
         // Connect the tab layout to the view pager.
         aboutTabLayout.setupWithViewPager(aboutViewPager);
     }
index 7fcf2d3cfb0874338a5df77a697a92839fcaff1c..54c87a87eaa26a6638d2201c73b29d2bf04d7b1c 100644 (file)
@@ -81,6 +81,9 @@ public class GuideActivity extends AppCompatActivity {
         // Set the view pager adapter.
         aboutViewPager.setAdapter(new GuidePagerAdapter(getSupportFragmentManager(), getApplicationContext()));
 
+        // Keep all the tabs in memory.
+        aboutViewPager.setOffscreenPageLimit(10);
+
         // Link the tab layout to the view pager.
         aboutTabLayout.setupWithViewPager(aboutViewPager);
     }
index 1635e5df8bcd5e772862d7733f8c4b65a572c2ab..36c2edebe8a2aea09a51e2c36ed9782abfef940d 100644 (file)
@@ -5032,7 +5032,7 @@ public class MainWebViewActivity extends AppCompatActivity implements CreateBook
                 // Clear the back/forward history for this WebView.
                 nestedScrollWebView.clearHistory();
 
-                // Destroy the internal state of `mainWebView`.
+                // Destroy the internal state of the WebView.
                 nestedScrollWebView.destroy();
             }
         }
index c35b90b64b6231543d6aabc52afc116e6830054a..9d8a2f1c43ebca2c7926b7f3a01dd62753217977 100644 (file)
@@ -20,6 +20,8 @@
 package com.stoutner.privacybrowser.fragments;
 
 import android.annotation.SuppressLint;
+import android.app.Activity;
+import android.app.ActivityManager;
 import android.content.Context;
 import android.content.pm.PackageInfo;
 import android.content.pm.PackageManager;
@@ -27,6 +29,7 @@ import android.content.pm.Signature;
 import android.content.res.Configuration;
 import android.os.Build;
 import android.os.Bundle;
+import android.os.Handler;
 import android.text.SpannableStringBuilder;
 import android.text.Spanned;
 import android.text.style.ForegroundColorSpan;
@@ -51,21 +54,49 @@ import java.security.cert.CertificateException;
 import java.security.cert.CertificateFactory;
 import java.security.cert.X509Certificate;
 import java.text.DateFormat;
+import java.text.NumberFormat;
 import java.util.Date;
 
 public class AboutTabFragment extends Fragment {
-    // Define the class variables.
+    // Declare the class constants.
+    final static String TAB_NUMBER = "tab_number";
+    final static String BLOCKLIST_VERSIONS = "blocklist_versions";
+    final long MEBIBYTE = 1048576;
+
+    // Declare the class variables.
+    private boolean updateMemoryUsageBoolean = true;
     private int tabNumber;
     private String[] blocklistVersions;
     private View tabLayout;
+    private String appConsumedMemoryLabel;
+    private String appAvailableMemoryLabel;
+    private String appTotalMemoryLabel;
+    private String appMaximumMemoryLabel;
+    private String systemConsumedMemoryLabel;
+    private String systemAvailableMemoryLabel;
+    private String systemTotalMemoryLabel;
+    private Runtime runtime;
+    private ActivityManager activityManager;
+    private ActivityManager.MemoryInfo memoryInfo;
+    private NumberFormat numberFormat;
+    private ForegroundColorSpan blueColorSpan;
+
+    // Declare the class views.
+    private TextView appConsumedMemoryTextView;
+    private TextView appAvailableMemoryTextView;
+    private TextView appTotalMemoryTextView;
+    private TextView appMaximumMemoryTextView;
+    private TextView systemConsumedMemoryTextView;
+    private TextView systemAvailableMemoryTextView;
+    private TextView systemTotalMemoryTextView;
 
     public static AboutTabFragment createTab(int tabNumber, String[] blocklistVersions) {
         // Create a bundle.
         Bundle argumentsBundle = new Bundle();
 
         // Store the tab number in the bundle.
-        argumentsBundle.putInt("tab_number", tabNumber);
-        argumentsBundle.putStringArray("blocklist_versions", blocklistVersions);
+        argumentsBundle.putInt(TAB_NUMBER, tabNumber);
+        argumentsBundle.putStringArray(BLOCKLIST_VERSIONS, blocklistVersions);
 
         // Create a new instance of the tab fragment.
         AboutTabFragment aboutTabFragment = new AboutTabFragment();
@@ -89,8 +120,8 @@ public class AboutTabFragment extends Fragment {
         assert arguments != null;
 
         // Store the arguments in class variables.
-        tabNumber = getArguments().getInt("tab_number");
-        blocklistVersions = getArguments().getStringArray("blocklist_versions");
+        tabNumber = getArguments().getInt(TAB_NUMBER);
+        blocklistVersions = getArguments().getStringArray(BLOCKLIST_VERSIONS);
     }
 
     @Override
@@ -123,6 +154,13 @@ public class AboutTabFragment extends Fragment {
             TextView orbotTextView = tabLayout.findViewById(R.id.orbot);
             TextView i2pTextView = tabLayout.findViewById(R.id.i2p);
             TextView openKeychainTextView = tabLayout.findViewById(R.id.open_keychain);
+            appConsumedMemoryTextView = tabLayout.findViewById(R.id.app_consumed_memory);
+            appAvailableMemoryTextView = tabLayout.findViewById(R.id.app_available_memory);
+            appTotalMemoryTextView = tabLayout.findViewById(R.id.app_total_memory);
+            appMaximumMemoryTextView = tabLayout.findViewById(R.id.app_maximum_memory);
+            systemConsumedMemoryTextView = tabLayout.findViewById(R.id.system_consumed_memory);
+            systemAvailableMemoryTextView = tabLayout.findViewById(R.id.system_available_memory);
+            systemTotalMemoryTextView = tabLayout.findViewById(R.id.system_total_memory);
             TextView easyListTextView = tabLayout.findViewById(R.id.easylist);
             TextView easyPrivacyTextView = tabLayout.findViewById(R.id.easyprivacy);
             TextView fanboyAnnoyanceTextView = tabLayout.findViewById(R.id.fanboy_annoyance);
@@ -147,6 +185,13 @@ public class AboutTabFragment extends Fragment {
             String androidLabel = getString(R.string.android) + "  ";
             String buildLabel = getString(R.string.build) + "  ";
             String webViewVersionLabel = getString(R.string.webview_version) + "  ";
+            appConsumedMemoryLabel = getString(R.string.app_consumed_memory) + "  ";
+            appAvailableMemoryLabel = getString(R.string.app_available_memory) + "  ";
+            appTotalMemoryLabel = getString(R.string.app_total_memory) + "  ";
+            appMaximumMemoryLabel = getString(R.string.app_maximum_memory) + "  ";
+            systemConsumedMemoryLabel = getString(R.string.system_consumed_memory) + "  ";
+            systemAvailableMemoryLabel = getString(R.string.system_available_memory) + "  ";
+            systemTotalMemoryLabel = getString(R.string.system_total_memory) + "  ";
             String easyListLabel = getString(R.string.easylist_label) + "  ";
             String easyPrivacyLabel = getString(R.string.easyprivacy_label) + "  ";
             String fanboyAnnoyanceLabel = getString(R.string.fanboy_annoyance_label) + "  ";
@@ -206,7 +251,7 @@ public class AboutTabFragment extends Fragment {
                 openKeychain = "";
             }
 
-            // Create a `SpannableStringBuilder` for the hardware and software `TextViews` that needs multiple colors of text.
+            // Create a spannable string builder for the hardware and software text views that needs multiple colors of text.
             SpannableStringBuilder brandStringBuilder = new SpannableStringBuilder(brandLabel + brand);
             SpannableStringBuilder manufacturerStringBuilder = new SpannableStringBuilder(manufacturerLabel + manufacturer);
             SpannableStringBuilder modelStringBuilder = new SpannableStringBuilder(modelLabel + model);
@@ -222,14 +267,11 @@ public class AboutTabFragment extends Fragment {
             SpannableStringBuilder ultraListStringBuilder = new SpannableStringBuilder(ultraListLabel + blocklistVersions[4]);
             SpannableStringBuilder ultraPrivacyStringBuilder = new SpannableStringBuilder(ultraPrivacyLabel + blocklistVersions[5]);
 
-            // Define the blue color span variable.
-            ForegroundColorSpan blueColorSpan;
-
             // Set the blue color span according to the theme.  The deprecated `getResources()` must be used until the minimum API >= 23.
-            if (currentThemeStatus == Configuration.UI_MODE_NIGHT_YES) {
-                blueColorSpan = new ForegroundColorSpan(getResources().getColor(R.color.violet_500));
-            } else {
+            if (currentThemeStatus == Configuration.UI_MODE_NIGHT_NO) {
                 blueColorSpan = new ForegroundColorSpan(getResources().getColor(R.color.blue_700));
+            } else {
+                blueColorSpan = new ForegroundColorSpan(getResources().getColor(R.color.violet_500));
             }
 
             // Setup the spans to display the device information in blue.  `SPAN_INCLUSIVE_INCLUSIVE` allows the span to grow in either direction.
@@ -399,6 +441,34 @@ public class AboutTabFragment extends Fragment {
                 } catch (CertificateException e) {
                     // Do nothing if there is a certificate error.
                 }
+
+                // Get a handle for the runtime.
+                runtime = Runtime.getRuntime();
+
+                // Get a handle for the activity.
+                Activity activity = getActivity();
+
+                // Remove the incorrect lint warning below that the activity might be null.
+                assert activity != null;
+
+                // Get a handle for the activity manager.
+                activityManager = (ActivityManager) activity.getSystemService(Context.ACTIVITY_SERVICE);
+
+                // Remove the incorrect lint warning below that the activity manager might be null.
+                assert activityManager != null;
+
+                // Instantiate a memory info variable.
+                memoryInfo = new ActivityManager.MemoryInfo();
+
+                // Define a number format.
+                numberFormat = NumberFormat.getInstance();
+
+                // Set the minimum and maximum number of fraction digits.
+                numberFormat.setMinimumFractionDigits(2);
+                numberFormat.setMaximumFractionDigits(2);
+
+                // Update the memory usage.
+                updateMemoryUsage(getActivity());
             } catch (PackageManager.NameNotFoundException e) {
                 // Do nothing if `PackageManager` says Privacy Browser isn't installed.
             }
@@ -480,6 +550,24 @@ public class AboutTabFragment extends Fragment {
         return tabLayout;
     }
 
+    @Override
+    public void onPause() {
+        // Run the default commands.
+        super.onPause();
+
+        // Pause the updating of the memory usage.
+        updateMemoryUsageBoolean = false;
+    }
+
+    @Override
+    public void onResume() {
+        // Run the default commands.
+        super.onResume();
+
+        // Resume the updating of the memory usage.
+        updateMemoryUsageBoolean = true;
+    }
+
     @Override
     public void onSaveInstanceState(@NonNull Bundle savedInstanceState) {
         // Run the default commands.
@@ -491,4 +579,85 @@ public class AboutTabFragment extends Fragment {
             savedInstanceState.putInt("scroll_y", tabLayout.getScrollY());
         }
     }
+
+    public void updateMemoryUsage(Activity activity) {
+        try {
+            // Update the memory usage if enabled.
+            if (updateMemoryUsageBoolean) {
+                // Populate the memory info variable.
+                activityManager.getMemoryInfo(memoryInfo);
+
+                // Get the app memory information.
+                long appAvailableMemoryLong = runtime.freeMemory();
+                long appTotalMemoryLong = runtime.totalMemory();
+                long appMaximumMemoryLong = runtime.maxMemory();
+
+                // Calculate the app consumed memory.
+                long appConsumedMemoryLong = appTotalMemoryLong - appAvailableMemoryLong;
+
+                // Get the system memory information.
+                long systemTotalMemoryLong = memoryInfo.totalMem;
+                long systemAvailableMemoryLong = memoryInfo.availMem;
+
+                // Calculate the system consumed memory.
+                long systemConsumedMemoryLong = systemTotalMemoryLong - systemAvailableMemoryLong;
+
+                // Convert the memory information into mebibytes.
+                float appConsumedMemoryFloat = (float) appConsumedMemoryLong / MEBIBYTE;
+                float appAvailableMemoryFloat = (float) appAvailableMemoryLong / MEBIBYTE;
+                float appTotalMemoryFloat = (float) appTotalMemoryLong / MEBIBYTE;
+                float appMaximumMemoryFloat = (float) appMaximumMemoryLong / MEBIBYTE;
+                float systemConsumedMemoryFloat = (float) systemConsumedMemoryLong / MEBIBYTE;
+                float systemAvailableMemoryFloat = (float) systemAvailableMemoryLong / MEBIBYTE;
+                float systemTotalMemoryFloat = (float) systemTotalMemoryLong / MEBIBYTE;
+
+                // Get the mebibyte string.
+                String mebibyte = getString(R.string.mebibyte);
+
+                // Calculate the mebibyte length.
+                int mebibyteLength = mebibyte.length();
+
+                // Create spannable string builders.
+                SpannableStringBuilder appConsumedMemoryStringBuilder = new SpannableStringBuilder(appConsumedMemoryLabel + numberFormat.format(appConsumedMemoryFloat) + " " + mebibyte);
+                SpannableStringBuilder appAvailableMemoryStringBuilder = new SpannableStringBuilder(appAvailableMemoryLabel + numberFormat.format(appAvailableMemoryFloat) + " " + mebibyte);
+                SpannableStringBuilder appTotalMemoryStringBuilder = new SpannableStringBuilder(appTotalMemoryLabel + numberFormat.format(appTotalMemoryFloat) + " " + mebibyte);
+                SpannableStringBuilder appMaximumMemoryStringBuilder = new SpannableStringBuilder(appMaximumMemoryLabel + numberFormat.format(appMaximumMemoryFloat) + " " + mebibyte);
+                SpannableStringBuilder systemConsumedMemoryStringBuilder = new SpannableStringBuilder(systemConsumedMemoryLabel + numberFormat.format(systemConsumedMemoryFloat) + " " + mebibyte);
+                SpannableStringBuilder systemAvailableMemoryStringBuilder = new SpannableStringBuilder(systemAvailableMemoryLabel + numberFormat.format(systemAvailableMemoryFloat) + " " + mebibyte);
+                SpannableStringBuilder systemTotalMemoryStringBuilder = new SpannableStringBuilder(systemTotalMemoryLabel + numberFormat.format(systemTotalMemoryFloat) + " " + mebibyte);
+
+                // Setup the spans to display the memory information in blue.  `SPAN_INCLUSIVE_INCLUSIVE` allows the span to grow in either direction.
+                appConsumedMemoryStringBuilder.setSpan(blueColorSpan, appConsumedMemoryLabel.length(), appConsumedMemoryStringBuilder.length() - mebibyteLength, Spanned.SPAN_INCLUSIVE_INCLUSIVE);
+                appAvailableMemoryStringBuilder.setSpan(blueColorSpan, appAvailableMemoryLabel.length(), appAvailableMemoryStringBuilder.length() - mebibyteLength, Spanned.SPAN_INCLUSIVE_INCLUSIVE);
+                appTotalMemoryStringBuilder.setSpan(blueColorSpan, appTotalMemoryLabel.length(), appTotalMemoryStringBuilder.length() - mebibyteLength, Spanned.SPAN_INCLUSIVE_INCLUSIVE);
+                appMaximumMemoryStringBuilder.setSpan(blueColorSpan, appMaximumMemoryLabel.length(), appMaximumMemoryStringBuilder.length() - mebibyteLength, Spanned.SPAN_INCLUSIVE_INCLUSIVE);
+                systemConsumedMemoryStringBuilder.setSpan(blueColorSpan, systemConsumedMemoryLabel.length(), systemConsumedMemoryStringBuilder.length() - mebibyteLength, Spanned.SPAN_INCLUSIVE_INCLUSIVE);
+                systemAvailableMemoryStringBuilder.setSpan(blueColorSpan, systemAvailableMemoryLabel.length(), systemAvailableMemoryStringBuilder.length() - mebibyteLength, Spanned.SPAN_INCLUSIVE_INCLUSIVE);
+                systemTotalMemoryStringBuilder.setSpan(blueColorSpan, systemTotalMemoryLabel.length(), systemTotalMemoryStringBuilder.length() - mebibyteLength, Spanned.SPAN_INCLUSIVE_INCLUSIVE);
+
+                // Display the string in the text boxes.
+                appConsumedMemoryTextView.setText(appConsumedMemoryStringBuilder);
+                appAvailableMemoryTextView.setText(appAvailableMemoryStringBuilder);
+                appTotalMemoryTextView.setText(appTotalMemoryStringBuilder);
+                appMaximumMemoryTextView.setText(appMaximumMemoryStringBuilder);
+                systemConsumedMemoryTextView.setText(systemConsumedMemoryStringBuilder);
+                systemAvailableMemoryTextView.setText(systemAvailableMemoryStringBuilder);
+                systemTotalMemoryTextView.setText(systemTotalMemoryStringBuilder);
+            }
+
+            // Schedule another memory update if the activity has not been destroyed.
+            if (!activity.isDestroyed()) {
+                // Create a handler to update the memory usage.
+                Handler updateMemoryUsageHandler = new Handler();
+
+                // Create a runnable to update the memory usage.
+                Runnable updateMemoryUsageRunnable = () -> updateMemoryUsage(activity);
+
+                // Update the memory usage after 1000 milliseconds
+                updateMemoryUsageHandler.postDelayed(updateMemoryUsageRunnable, 1000);
+            }
+        } catch (Exception exception) {
+            // Do nothing.
+        }
+    }
 }
\ No newline at end of file
index 6c12bc6f2ad2ef004a83d17511ccd1f7802c8c6d..c5bc00aceff6327fe14664c1557a7cf27b2ea0bc 100644 (file)
@@ -36,13 +36,15 @@ import java.io.InputStream;
 import java.io.OutputStream;
 
 public class ImportExportDatabaseHelper {
+    // Declare the public constants.
     public static final String EXPORT_SUCCESSFUL = "Export Successful";
     public static final String IMPORT_SUCCESSFUL = "Import Successful";
 
-    private static final int SCHEMA_VERSION = 11;
+    // Declare the class constants.
+    private static final int SCHEMA_VERSION = 12;
     private static final String PREFERENCES_TABLE = "preferences";
 
-    // The preferences constants.
+    // Declare the preferences constants.
     private static final String _ID = "_id";
     private static final String JAVASCRIPT = "javascript";
     private static final String FIRST_PARTY_COOKIES = "first_party_cookies";
@@ -74,6 +76,7 @@ public class ImportExportDatabaseHelper {
     private static final String CLEAR_COOKIES = "clear_cookies";
     private static final String CLEAR_DOM_STORAGE = "clear_dom_storage";
     private static final String CLEAR_FORM_DATA = "clear_form_data";
+    private static final String CLEAR_LOGCAT = "clear_logcat";
     private static final String CLEAR_CACHE = "clear_cache";
     private static final String HOMEPAGE = "homepage";
     private static final String DOWNLOAD_LOCATION = "download_location";
@@ -230,6 +233,7 @@ public class ImportExportDatabaseHelper {
                     CLEAR_COOKIES + " BOOLEAN, " +
                     CLEAR_DOM_STORAGE + " BOOLEAN, " +
                     CLEAR_FORM_DATA + " BOOLEAN, " +
+                    CLEAR_LOGCAT + " BOOLEAN, " +
                     CLEAR_CACHE + " BOOLEAN, " +
                     HOMEPAGE + " TEXT, " +
                     DOWNLOAD_LOCATION + " TEXT, " +
@@ -282,6 +286,7 @@ public class ImportExportDatabaseHelper {
             preferencesContentValues.put(CLEAR_COOKIES, sharedPreferences.getBoolean(CLEAR_COOKIES, true));
             preferencesContentValues.put(CLEAR_DOM_STORAGE, sharedPreferences.getBoolean(CLEAR_DOM_STORAGE, true));
             preferencesContentValues.put(CLEAR_FORM_DATA, sharedPreferences.getBoolean(CLEAR_FORM_DATA, true));  // Clear form data can be removed once the minimum API >= 26.
+            preferencesContentValues.put(CLEAR_LOGCAT, sharedPreferences.getBoolean(CLEAR_LOGCAT, true));
             preferencesContentValues.put(CLEAR_CACHE, sharedPreferences.getBoolean(CLEAR_CACHE, true));
             preferencesContentValues.put(HOMEPAGE, sharedPreferences.getString(HOMEPAGE, context.getString(R.string.homepage_default_value)));
             preferencesContentValues.put(DOWNLOAD_LOCATION, sharedPreferences.getString(DOWNLOAD_LOCATION, context.getString(R.string.download_location_default_value)));
@@ -371,11 +376,11 @@ public class ImportExportDatabaseHelper {
             // Upgrade the database if needed.
             if (importDatabaseVersion < SCHEMA_VERSION) {
                 switch (importDatabaseVersion){
-                    // Upgrade from schema version 1.
+                    // Upgrade from schema version 1, Privacy Browser 2.13.
                     case 1:
                         // Previously this upgrade added `download_with_external_app` to the Preferences table.  But that is now removed in schema version 10.
 
-                    // Upgrade from schema version 2.
+                    // Upgrade from schema version 2, Privacy Browser 2.14.
                     case 2:
                         // Once the SQLite version is >= 3.25.0 `ALTER TABLE RENAME COLUMN` can be used.  https://www.sqlite.org/lang_altertable.html  https://www.sqlite.org/changes.html
                         // https://developer.android.com/reference/android/database/sqlite/package-summary
@@ -402,13 +407,13 @@ public class ImportExportDatabaseHelper {
                         // Populate the preferences table with the current font size value.
                         importDatabase.execSQL("UPDATE " + PREFERENCES_TABLE + " SET " + FONT_SIZE + " = '" + fontSize + "'");
 
-                    // Upgrade from schema version 3.
+                    // Upgrade from schema version 3, Privacy Browser 2.15.
                     case 3:
                         // Add the Pinned IP Addresses columns to the domains table.
                         importDatabase.execSQL("ALTER TABLE " + DomainsDatabaseHelper.DOMAINS_TABLE + " ADD COLUMN " + DomainsDatabaseHelper.PINNED_IP_ADDRESSES + " BOOLEAN");
                         importDatabase.execSQL("ALTER TABLE " + DomainsDatabaseHelper.DOMAINS_TABLE + " ADD COLUMN " + DomainsDatabaseHelper.IP_ADDRESSES + " TEXT");
 
-                    // Upgrade from schema version 4.
+                    // Upgrade from schema version 4, Privacy Browser 2.16.
                     case 4:
                         // Add the hide and scroll app bar columns to the preferences table.
                         importDatabase.execSQL("ALTER TABLE " + PREFERENCES_TABLE + " ADD COLUMN " + HIDE_APP_BAR + " BOOLEAN");
@@ -431,7 +436,7 @@ public class ImportExportDatabaseHelper {
                             importDatabase.execSQL("UPDATE " + PREFERENCES_TABLE + " SET " + SCROLL_APP_BAR + " = " + 0);
                         }
 
-                    // Upgrade from schema version 5.
+                    // Upgrade from schema version 5, Privacy Browser 2.17.
                     case 5:
                         // Add the open intents in new tab column to the preferences table.
                         importDatabase.execSQL("ALTER TABLE " + PREFERENCES_TABLE + " ADD COLUMN " + OPEN_INTENTS_IN_NEW_TAB + " BOOLEAN");
@@ -446,7 +451,7 @@ public class ImportExportDatabaseHelper {
                             importDatabase.execSQL("UPDATE " + PREFERENCES_TABLE + " SET " + OPEN_INTENTS_IN_NEW_TAB + " = " + 0);
                         }
 
-                    // Upgrade from schema version 6.
+                    // Upgrade from schema version 6, Privacy Browser 3.0.
                     case 6:
                         // Add the wide viewport column to the domains table.
                         importDatabase.execSQL("ALTER TABLE " + DomainsDatabaseHelper.DOMAINS_TABLE + " ADD COLUMN " + DomainsDatabaseHelper.WIDE_VIEWPORT + " INTEGER");
@@ -491,7 +496,7 @@ public class ImportExportDatabaseHelper {
                             importDatabase.execSQL("UPDATE " + PREFERENCES_TABLE + " SET " + WIDE_VIEWPORT + " = " + 0);
                         }
 
-                    // Upgrade from schema version 7.
+                    // Upgrade from schema version 7, Privacy Browser 3.1.
                     case 7:
                         // Add the UltraList column to the domains table.
                         importDatabase.execSQL("ALTER TABLE " + DomainsDatabaseHelper.DOMAINS_TABLE + " ADD COLUMN " + DomainsDatabaseHelper.ULTRALIST + " BOOLEAN");
@@ -511,7 +516,7 @@ public class ImportExportDatabaseHelper {
                             importDatabase.execSQL("UPDATE " + PREFERENCES_TABLE + " SET " + ULTRALIST + " = " + 0);
                         }
 
-                    // Upgrade from schema version 8.
+                    // Upgrade from schema version 8, Privacy Browser 3.2.
                     case 8:
                         // Add the new proxy columns to the preferences table.
                         importDatabase.execSQL("ALTER TABLE " + PREFERENCES_TABLE + " ADD COLUMN " + PROXY + " TEXT");
@@ -528,7 +533,7 @@ public class ImportExportDatabaseHelper {
                         importDatabase.execSQL("UPDATE " + PREFERENCES_TABLE + " SET " + PROXY + " = '" + proxy + "'");
                         importDatabase.execSQL("UPDATE " + PREFERENCES_TABLE + " SET " + PROXY_CUSTOM_URL + " = " + proxyCustomUrl);
 
-                    // Upgrade from schema version 9.
+                    // Upgrade from schema version 9, Privacy Browser 3.3.
                     case 9:
                         // Add the download location columns to the preferences table.
                         importDatabase.execSQL("ALTER TABLE " + PREFERENCES_TABLE + " ADD COLUMN " + DOWNLOAD_LOCATION + " TEXT");
@@ -542,7 +547,7 @@ public class ImportExportDatabaseHelper {
                         importDatabase.execSQL("UPDATE " + PREFERENCES_TABLE + " SET " + DOWNLOAD_LOCATION + " = '" + downloadLocation + "'");
                         importDatabase.execSQL("UPDATE " + PREFERENCES_TABLE + " SET " + DOWNLOAD_CUSTOM_LOCATION + " = '" + downloadCustomLocation + "'");
 
-                    // Upgrade from schema version 10.
+                    // Upgrade from schema version 10, Privacy Browser 3.4.
                     case 10:
                         // Add the app theme column to the preferences table.
                         importDatabase.execSQL("ALTER TABLE " + PREFERENCES_TABLE + " ADD COLUMN " + APP_THEME + " TEXT");
@@ -579,6 +584,21 @@ public class ImportExportDatabaseHelper {
 
                         // Set the WebView theme in the preferences table to be the default.
                         importDatabase.execSQL("UPDATE " + PREFERENCES_TABLE + " SET " + WEBVIEW_THEME + " = " + "'" + webViewThemeDefaultValue + "'");
+
+                    // Upgrade from schema version 11, Privacy Browser 3.5.
+                    case 11:
+                        // Add the clear logcat column to the preferences table.
+                        importDatabase.execSQL("ALTER TABLE " + PREFERENCES_TABLE + " ADD COLUMN " + CLEAR_LOGCAT + " BOOLEAN");
+
+                        // Get the current clear logcat value.
+                        boolean clearLogcat = sharedPreferences.getBoolean(CLEAR_LOGCAT, true);
+
+                        // Populate the preference table with the current clear logcat value.
+                        if (clearLogcat) {
+                            importDatabase.execSQL("UPDATE " + PREFERENCES_TABLE + " SET " + CLEAR_LOGCAT + " = " + 1);
+                        } else {
+                            importDatabase.execSQL("UPDATE " + PREFERENCES_TABLE + " SET " + CLEAR_LOGCAT + " = " + 0);
+                        }
                 }
             }
 
@@ -726,6 +746,7 @@ public class ImportExportDatabaseHelper {
                     .putBoolean(CLEAR_DOM_STORAGE, importPreferencesCursor.getInt(importPreferencesCursor.getColumnIndex(CLEAR_DOM_STORAGE)) == 1)
                     // Clear form data can be removed once the minimum API >= 26.
                     .putBoolean(CLEAR_FORM_DATA, importPreferencesCursor.getInt(importPreferencesCursor.getColumnIndex(CLEAR_FORM_DATA)) == 1)
+                    .putBoolean(CLEAR_LOGCAT, importPreferencesCursor.getInt(importPreferencesCursor.getColumnIndex(CLEAR_LOGCAT)) == 1)
                     .putBoolean(CLEAR_CACHE, importPreferencesCursor.getInt(importPreferencesCursor.getColumnIndex(CLEAR_CACHE)) == 1)
                     .putString(HOMEPAGE, importPreferencesCursor.getString(importPreferencesCursor.getColumnIndex(HOMEPAGE)))
                     .putString(DOWNLOAD_LOCATION, importPreferencesCursor.getString(importPreferencesCursor.getColumnIndex(DOWNLOAD_LOCATION)))
index 75bcb3e842d0fd126b87c3236061a502224098db..ef773d5c2ba8d26638895b8d8eb3b1d6a00c2b36 100644 (file)
                 android:layout_width="wrap_content"
                 android:textIsSelectable="true" />
 
-            <!-- Block Lists. -->
+            <!-- Memory usage. -->
+            <TextView
+                android:layout_height="wrap_content"
+                android:layout_width="wrap_content"
+                android:text="@string/memory_usage"
+                android:textStyle="bold"
+                android:textSize="18sp"
+                android:textColor="?attr/blueTitleTextColor"
+                android:paddingTop="12dp" />
+
+            <TextView
+                android:id="@+id/app_consumed_memory"
+                android:layout_height="wrap_content"
+                android:layout_width="wrap_content"
+                android:textIsSelectable="true" />
+
+            <TextView
+                android:id="@+id/app_available_memory"
+                android:layout_height="wrap_content"
+                android:layout_width="wrap_content"
+                android:textIsSelectable="true" />
+
+            <TextView
+                android:id="@+id/app_total_memory"
+                android:layout_height="wrap_content"
+                android:layout_width="wrap_content"
+                android:textIsSelectable="true" />
+
+            <TextView
+                android:id="@+id/app_maximum_memory"
+                android:layout_height="wrap_content"
+                android:layout_width="wrap_content"
+                android:textIsSelectable="true" />
+
+            <TextView
+                android:id="@+id/system_consumed_memory"
+                android:layout_height="wrap_content"
+                android:layout_width="wrap_content"
+                android:textIsSelectable="true" />
+
+            <TextView
+                android:id="@+id/system_available_memory"
+                android:layout_height="wrap_content"
+                android:layout_width="wrap_content"
+                android:textIsSelectable="true" />
+
+            <TextView
+                android:id="@+id/system_total_memory"
+                android:layout_height="wrap_content"
+                android:layout_width="wrap_content"
+                android:textIsSelectable="true" />
+
+            <!-- Blocklists. -->
             <TextView
                 android:layout_height="wrap_content"
                 android:layout_width="wrap_content"
index 7fbe43dc7a3a92fa73bfc5aa8e3392e638082fdb..d185dcb78940160884417544761e383f0d3f4ea3 100644 (file)
         <string name="hide_app_bar_summary" tools:ignore="Typos">Versteckt die App-Leiste, die die URL enthält.</string>
     <string name="clear_everything">Alles löschen</string>
         <!-- The form data part of this string can be removed once the minimum API >= 26. -->
-        <string name="clear_everything_summary">Löscht Cookies, DOM Storage, Formular-Daten und Cache, sowie “app_webview” and “cache”-Ordner.</string>
+        <string name="clear_everything_summary">Löscht Cookies, DOM-Storage, Formular-Daten, das Logcat Systemlogbuch und den WebView-Cache, sowie die gesamten “app_webview”- und “cache”-Ordner.</string>
         <string name="clear_cookies_preference">Cookies löschen</string>
         <string name="clear_cookies_summary">Löscht Cookies und Drittanbieter-Cookies.</string>
         <string name="clear_dom_storage_preference">DOM Storage löschen</string>
         <string name="clear_dom_storage_summary">Löscht DOM storage (aka Web Storage oder Supercookies).</string>
         <string name="clear_form_data_preference">Formulardaten löschen</string>  <!-- The form data strings can be removed once the minimum API >= 26. -->
         <string name="clear_form_data_summary">Löscht in Formulare eingegebene Daten.</string>  <!-- The form data strings can be removed once the minimum API >= 26. -->
+        <string name="clear_logcat_preference">Logcat leeren</string>
+        <string name="clear_logcat_summary">Leert das Logcat Systemlogbuch.</string>
         <string name="clear_cache">Cache löschen</string>
         <string name="clear_cache_summary">Löscht den WebView-Cache.</string>
     <string name="general">Allgemein</string>
index 8362e1e460c79f85f9e91eb9e993a56b236a2f4e..2aa826d3ab0b3a63e513f6b50667cd5805918289 100644 (file)
         <string name="hide_app_bar">Ocultar la barra de aplicaciones</string>
         <string name="hide_app_bar_summary">Ocultar la barra de aplicaciones que contiene la URL.</string>
     <string name="clear_everything">Borrar todo</string>
-        <string name="clear_everything_summary">Borra cookies, almacenamiento DOM, datos de formulario y la caché de  WebView.
+        <!-- The form data part of this string can be removed once the minimum API >= 26. -->
+        <string name="clear_everything_summary">Borra cookies, almacenamiento DOM, datos de formulario, el logcat y la caché de  WebView.
             A continuación borra manualmente los directorios “app_webview” y “cache”.</string>
         <string name="clear_cookies_preference">Borrar cookies</string>
         <string name="clear_cookies_summary">Borra las cookies de primera y terceras partes.</string>
         <string name="clear_dom_storage_preference">Borrar almacenamiento DOM</string>
         <string name="clear_dom_storage_summary">Borra el almacenamiento DOM.</string>
-        <string name="clear_form_data_preference">Borrar datos de formulario</string>
-        <string name="clear_form_data_summary">Borra los datos de formulario.</string>
+        <string name="clear_form_data_preference">Borrar datos de formulario</string>  <!-- The form data strings can be removed once the minimum API >= 26. -->
+        <string name="clear_form_data_summary">Borra los datos de formulario.</string>  <!-- The form data strings can be removed once the minimum API >= 26. -->
+        <string name="clear_logcat_preference">Borrar logcat</string>
+        <string name="clear_logcat_summary">Borra el logcat.</string>
         <string name="clear_cache">Borrar caché</string>
         <string name="clear_cache_summary">Borra la caché de WebView.</string>
     <string name="general">General</string>
index acc4eca0a988efb0d46cfd98888ebd4576f04581..d1666560963db84c92965cef39b1305cf09232af 100644 (file)
         <string name="hide_app_bar_summary">Masquer la barre d\'applications contenant l\'URL.</string>
     <string name="clear_everything">Tout effacer</string>
         <!-- The form data part of this string can be removed once the minimum API >= 26. -->
-        <string name="clear_everything_summary">Efface les cookies, le stockage DOM, les données de formulaire et le cache de WebView.
+        <string name="clear_everything_summary">Efface les cookies, le stockage DOM, les données de formulaire, le logcat et le cache de WebView.
             Supprime ensuite manuellement les répertoires entiers «app_webview» et «cache».</string>
         <string name="clear_cookies_preference">Effacer les cookies</string>
         <string name="clear_cookies_summary">Efface l\'ensemble des cookies internes et tiers</string>
         <string name="clear_dom_storage_summary">Efface le stockage du DOM.</string>
         <string name="clear_form_data_preference">Effacer les données de formulaire</string>  <!-- The form data strings can be removed once the minimum API >= 26. -->
         <string name="clear_form_data_summary">Efface les données de formulaire.</string>  <!-- The form data strings can be removed once the minimum API >= 26. -->
+        <string name="clear_logcat_preference">Vider logcat</string>
+        <string name="clear_logcat_summary">Vide le logcat.</string>
         <string name="clear_cache">Effacer cache</string>
         <string name="clear_cache_summary">Efface le cache WebView.</string>
     <string name="general">General</string>
index 349183e2a7c22542cbe53bb31486f53ffa7d140f..47e1c13a0dba7491d5a373dd35a5948b9ebba1ea 100644 (file)
         <string name="hide_app_bar">Nascondi la barra dell\'applicazione</string>
         <string name="hide_app_bar_summary">Nasconde la barra che contiene l\'URL.</string>
     <string name="clear_everything">Elimina tutto</string>
-        <string name="clear_everything_summary">Cancella i cookies, il DOM storage, i dati dei moduli e la cache di WebView.  Cancella completamente le cartelle “app_webview” e “cache”.</string>
+        <!-- The form data part of this string can be removed once the minimum API >= 26. -->
+        <string name="clear_everything_summary">Cancella i cookies, il DOM storage, i dati dei moduli, il logcat e la cache di WebView.  Cancella completamente le cartelle “app_webview” e “cache”.</string>
         <string name="clear_cookies_preference">Elimina i cookie</string>
         <string name="clear_cookies_summary">Cancella solo i cookie proprietari e di terze parti.</string>
         <string name="clear_dom_storage_preference">Elimina il DOM storage</string>
         <string name="clear_dom_storage_summary">Cancella solo il DOM storage.</string>
-        <string name="clear_form_data_preference">Elimina i dati dei moduli</string>
-        <string name="clear_form_data_summary">Cancella solo i dati dei moduli.</string>
+        <string name="clear_form_data_preference">Elimina i dati dei moduli</string>  <!-- The form data strings can be removed once the minimum API >= 26. -->
+        <string name="clear_form_data_summary">Cancella solo i dati dei moduli.</string>  <!-- The form data strings can be removed once the minimum API >= 26. -->
+        <string name="clear_logcat_preference">Cancella logcat</string>
+        <string name="clear_logcat_summary">Cancella il logcat.</string>
         <string name="clear_cache">Elimina la cache</string>
         <string name="clear_cache_summary">Cancella solo la cache di WebView.</string>
     <string name="general">Generale</string>
index 165463de8de40f3906e8f0eb8f17b6f0173c52d4..01ff4c1c016a71b7a60b28a380472e9153fe2d90 100644 (file)
         <string name="hide_app_bar">Скрыть панель приложения</string>
         <string name="hide_app_bar_summary">Скрывает панель приложения, которая содержит URL.</string>
     <string name="clear_everything">Очистить все</string>
-        <string name="clear_everything_summary">Очищает файлы cookie, DOM-хранилище, данные формы и кэш WebView. Затем вручную удаляются все каталоги "app_webview" и "cache".</string>
+        <!-- The form data part of this string can be removed once the minimum API >= 26. -->
+        <string name="clear_everything_summary">Очищает файлы cookie, DOM-хранилище, данные форм, logcat и кэш WebView. После этого вручную удаляет каталоги "app_webview" и "cache".</string>
         <string name="clear_cookies_preference">Очистить файлы cookie</string>
         <string name="clear_cookies_summary">Очистить первичные и сторонние файлы cookie.</string>
         <string name="clear_dom_storage_preference">Очистить DOM-хранилище</string>
         <string name="clear_dom_storage_summary">Очищает DOM-хранилище.</string>
-        <string name="clear_form_data_preference">Очистка данных формы</string>
-        <string name="clear_form_data_summary">Очищает данные формы.</string>
+        <string name="clear_form_data_preference">Очистка данных формы</string>  <!-- The form data strings can be removed once the minimum API >= 26. -->
+        <string name="clear_form_data_summary">Очищает данные формы.</string>  <!-- The form data strings can be removed once the minimum API >= 26. -->
+        <string name="clear_logcat_preference">Очистить logcat</string>
+        <string name="clear_logcat_summary">Очищает logcat.</string>
         <string name="clear_cache">Очистить кэш</string>
         <string name="clear_cache_summary">Очищает кэш WebView.</string>
     <string name="general">Общее</string>
index 36d418b80522a45ba50b682ee2bf1f72800cad0a..37b6546e7b401df65b10d46537934320140967fa 100644 (file)
     <string name="orbot">Orbot:</string>
     <string name="i2p">I2P:</string>
     <string name="openkeychain">OpenKeychain:</string>
+    <string name="memory_usage">Memory Usage</string>
+    <string name="app_consumed_memory">App Consumed Memory:</string>
+    <string name="app_available_memory">App Available Memory:</string>
+    <string name="app_total_memory">App Total Memory:</string>
+    <string name="app_maximum_memory">App Maximum Memory:</string>
+    <string name="system_consumed_memory">System Consumed Memory:</string>
+    <string name="system_available_memory">System Available Memory:</string>
+    <string name="system_total_memory">System Total Memory:</string>
+    <string name="mebibyte">MiB</string>
     <string name="easylist_label">EasyList:</string>
     <string name="easyprivacy_label">EasyPrivacy:</string>
     <string name="fanboy_annoyance_label">Fanboy’s Annoyance List:</string>
index 8f53d731e3968df4f95bc8554b357f5bb9f27bed..16767dfe95c7b126cc4b31805105e601c6f64a71 100644 (file)
@@ -1,12 +1,12 @@
-• Implement Android’s relatively new Day/Night theme.
-• Switch to using WebView relatively new built-in dark theme.
-• Save and restore the state if Privacy Browser is restarted in the background by the OS.
-• Use the Content-Disposition header to get file names for downloads.
-• Fix uploading files to some sites.
-• Add Mojeek and remove Qwant and Searx from the list of search engines.
-• Fix a bug that sometimes caused swipe-to-refresh to operate even when disabled.
-• Reorder the context menus.
-• Apply custom headers to links loaded from the WebView.
+• Implémentaton relativement récente du thème Jour / Nuit d'Android.
+• Ajout d'un bouton permettant d'utiliser le nouveau thème sombre intégré de WebView.
+• Enregistrement et restauration de l'état de Privacy Browser si celui-ci est redémarré en arrière-plan par le système d'exploitation.
+• Utilisation de l'en-tête Content-Disposition pour obtenir les noms des fichiers à télécharger.
+• Correction de l'importation de fichiers sur certains sites.
+• Ajout de Mojeek et suppression de Qwant et Searx dans la liste des moteurs de recherche.
+• Correction d'un bug qui faisait parfois fonctionner la fonction balayage pour actualiser même lorsque celle-ci était désactivée.
+• Réorganisation des menus contextuels.
+• Application d'en-têtes personnalisées aux liens chargés à partir de WebView.
 • Traduction française mise à jour fournie par Kévin LE FLOHIC.
 • Traduction allemande mise à jour fournie par Bernhard G. Keller.
 • Traduction italienne mise à jour fournie par Francesco Buratti.
index fdbd5eaaf646333831c8d3e063913855a2477a17..17320b8e8b90003df6539183cc4729c623b9e375 100644 (file)
@@ -1,2 +1,2 @@
-• Fix a bug that caused new intents (links from other apps) to not load if Privacy Browser had been killed by the OS in the background.
-• Fix a bug that caused the app to initialize incorrectly if the app theme was set to the opposite of the OS theme.
\ No newline at end of file
+• Correction d'un bug qui empêchait de nouveaux intents (liens en provenance d'autres applications) de se charger si Privacy Browser avait été tué par le système d'exploitation en arrière-plan.
+• Correction d'un bug qui entraînait une initialisation incorrecte de l'application si le thème de l'application était défini à l'opposé du thème du système d'exploitation.
\ No newline at end of file