<w>macos</w>
<w>mailto</w>
<w>materialdesignicons</w>
+ <w>mebibytes</w>
<w>mimetype</w>
<w>mitm</w>
<w>mojeek</w>
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
<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>
<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>
<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
<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
// 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);
}
// 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);
}
// 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();
}
}
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;
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;
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();
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
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);
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) + " ";
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);
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.
} 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.
}
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.
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
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";
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";
CLEAR_COOKIES + " BOOLEAN, " +
CLEAR_DOM_STORAGE + " BOOLEAN, " +
CLEAR_FORM_DATA + " BOOLEAN, " +
+ CLEAR_LOGCAT + " BOOLEAN, " +
CLEAR_CACHE + " BOOLEAN, " +
HOMEPAGE + " TEXT, " +
DOWNLOAD_LOCATION + " TEXT, " +
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)));
// 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
// 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");
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");
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");
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");
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");
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");
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");
// 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);
+ }
}
}
.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)))
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"
<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>
<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>
<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>
<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>
<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>
<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>
-• 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.
-• 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