package com.stoutner.privacybrowser.activities;
-import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
+import android.content.SharedPreferences;
import android.content.res.Resources;
import android.database.Cursor;
-import android.net.http.SslCertificate;
import android.os.Bundle;
import android.os.Handler;
+import android.preference.PreferenceManager;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
// `dismissingSnackbar` is public static so it can be accessed from `DomainsListFragment`. It is also used in `onOptionsItemSelected()`.
public static boolean dismissingSnackbar;
+ // The SSL certificate and IP address information are accessed from `DomainSettingsFragment` and `saveDomainSettings()`.
+ public static String sslIssuedToCName;
+ public static String sslIssuedToOName;
+ public static String sslIssuedToUName;
+ public static String sslIssuedByCName;
+ public static String sslIssuedByOName;
+ public static String sslIssuedByUName;
+ public static long sslStartDateLong;
+ public static long sslEndDateLong;
+ public static String currentIpAddresses;
+
+
// `closeActivityAfterDismissingSnackbar` is used in `onOptionsItemSelected()`, and `onBackPressed()`.
private boolean closeActivityAfterDismissingSnackbar;
@Override
protected void onCreate(Bundle savedInstanceState) {
+ // Get a handle for the shared preferences.
+ SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this);
+
+ // Get the theme and screenshot preferences.
+ boolean darkTheme = sharedPreferences.getBoolean("dark_theme", false);
+ boolean allowScreenshots = sharedPreferences.getBoolean("allow_screenshots", false);
+
// Disable screenshots if not allowed.
- if (!MainWebViewActivity.allowScreenshots) {
+ if (!allowScreenshots) {
getWindow().addFlags(WindowManager.LayoutParams.FLAG_SECURE);
}
// Set the activity theme.
- if (MainWebViewActivity.darkTheme) {
+ if (darkTheme) {
setTheme(R.style.PrivacyBrowserDark_SecondaryActivity);
} else {
setTheme(R.style.PrivacyBrowserLight_SecondaryActivity);
// Extract the values from `savedInstanceState` if it is not `null`.
if (savedInstanceState != null) {
restartAfterRotate = true;
- domainSettingsDisplayedBeforeRotate = savedInstanceState.getBoolean("domainSettingsDisplayed");
- domainSettingsDatabaseIdBeforeRotate = savedInstanceState.getInt("domainSettingsDatabaseId");
+ domainSettingsDisplayedBeforeRotate = savedInstanceState.getBoolean("domain_settings_displayed");
+ domainSettingsDatabaseIdBeforeRotate = savedInstanceState.getInt("domain_settings_database_id");
}
// Get the launching intent
Intent intent = getIntent();
// Extract the domain to load if there is one. `-1` is the default value.
- goDirectlyToDatabaseId = intent.getIntExtra("loadDomain", -1);
+ goDirectlyToDatabaseId = intent.getIntExtra("load_domain", -1);
// Get the status of close-on-back, which is true when the domains activity is called from the options menu.
- closeOnBack = intent.getBooleanExtra("closeOnBack", false);
+ closeOnBack = intent.getBooleanExtra("close_on_back", false);
+
+ // Get the current URL.
+ String currentUrl = intent.getStringExtra("current_url");
+
+ // Store the current SSL certificate information in class variables.
+ sslIssuedToCName = intent.getStringExtra("ssl_issued_to_cname");
+ sslIssuedToOName = intent.getStringExtra("ssl_issued_to_oname");
+ sslIssuedToUName = intent.getStringExtra("ssl_issued_to_uname");
+ sslIssuedByCName = intent.getStringExtra("ssl_issued_by_cname");
+ sslIssuedByOName = intent.getStringExtra("ssl_issued_by_oname");
+ sslIssuedByUName = intent.getStringExtra("ssl_issued_by_uname");
+ sslStartDateLong = intent.getLongExtra("ssl_start_date", 0);
+ sslEndDateLong = intent.getLongExtra("ssl_end_date", 0);
+ currentIpAddresses = intent.getStringExtra("current_ip_addresses");
// Set the content view.
setContentView(R.layout.domains_coordinatorlayout);
// Determine if we are in two pane mode. `domain_settings_fragment_container` does not exist on devices with a width less than 900dp.
twoPanedMode = (findViewById(R.id.domain_settings_fragment_container) != null);
- // Configure `addDomainFAB`.
+ // Get a handle for the add domain floating action button.
addDomainFAB = findViewById(R.id.add_domain_fab);
+
+ // Configure the add domain floating action button.
addDomainFAB.setOnClickListener((View view) -> {
- // Show the add domain `AlertDialog`.
- DialogFragment addDomainDialog = new AddDomainDialog();
+ // Create an add domain dialog.
+ DialogFragment addDomainDialog = AddDomainDialog.addDomain(currentUrl);
+
+ // Show the add domain dialog.
addDomainDialog.show(getSupportFragmentManager(), resources.getString(R.string.add_domain));
});
}
// Show `deleteMenuItem`.
deleteMenuItem.setVisible(true);
- // Hide `add_domain_fab`.
+ // Hide the add domain floating action button.
addDomainFAB.hide();
// Display `domainSettingsFragment`.
// Show `deleteMenuItem`.
deleteMenuItem.setVisible(true);
- // Hide `add_domain_fab`.
+ // Hide the add domain floating action button.
addDomainFAB.hide();
// Display `domainSettingsFragment`.
// Populate the list of domains. `-1` highlights the first domain if in two-paned mode. It has no effect in single-paned mode.
populateDomainsListView(-1);
- // Show the add domain FAB.
+ // Show the add domain floating action button.
addDomainFAB.show();
// Hide the delete menu item.
fragmentManager.beginTransaction().replace(R.id.domains_listview_fragment_container, domainsListFragment).commit();
fragmentManager.executePendingTransactions();
- // Show the add domain FAB.
+ // Show the add domain floating action button.
addDomainFAB.show();
// Hide `deleteMenuItem`.
// Do nothing because everything will be handled by `onDismissed()` below.
})
.addCallback(new Snackbar.Callback() {
- @SuppressLint("SwitchIntDef") // Ignore the lint warning about not handling the other possible events as they are covered by `default:`.
@Override
public void onDismissed(Snackbar snackbar, int event) {
- switch (event) {
- // The user pushed the `Undo` button.
- case Snackbar.Callback.DISMISS_EVENT_ACTION:
- // Store `databaseId` in `argumentsBundle`.
- Bundle argumentsBundle = new Bundle();
- argumentsBundle.putInt(DomainSettingsFragment.DATABASE_ID, databaseIdToDelete);
-
- // Add `argumentsBundle` to `domainSettingsFragment`.
- DomainSettingsFragment domainSettingsFragment = new DomainSettingsFragment();
- domainSettingsFragment.setArguments(argumentsBundle);
-
- // Display the correct fragments.
- if (twoPanedMode) { // The device in in two-paned mode.
- // Get a `Cursor` with the current contents of the domains database.
- Cursor undoDeleteDomainsCursor = domainsDatabaseHelper.getDomainNameCursorOrderedByDomain();
-
- // Setup `domainsCursorAdapter` with `this` context. `false` disables `autoRequery`.
- CursorAdapter undoDeleteDomainsCursorAdapter = new CursorAdapter(getApplicationContext(), undoDeleteDomainsCursor, false) {
- @Override
- public View newView(Context context, Cursor cursor, ViewGroup parent) {
- // Inflate the individual item layout. `false` does not attach it to the root.
- return getLayoutInflater().inflate(R.layout.domain_name_linearlayout, parent, false);
+ // Run commands based on the event.
+ if (event == Snackbar.Callback.DISMISS_EVENT_ACTION) { // The user pushed the `Undo` button.
+ // Store the database ID in arguments bundle.
+ Bundle argumentsBundle = new Bundle();
+ argumentsBundle.putInt(DomainSettingsFragment.DATABASE_ID, databaseIdToDelete);
+
+ // Add the arguments bundle to the domain settings fragment.
+ DomainSettingsFragment domainSettingsFragment = new DomainSettingsFragment();
+ domainSettingsFragment.setArguments(argumentsBundle);
+
+ // Display the correct fragments.
+ if (twoPanedMode) { // The device in in two-paned mode.
+ // Get a `Cursor` with the current contents of the domains database.
+ Cursor undoDeleteDomainsCursor = domainsDatabaseHelper.getDomainNameCursorOrderedByDomain();
+
+ // Setup `domainsCursorAdapter` with `this` context. `false` disables `autoRequery`.
+ CursorAdapter undoDeleteDomainsCursorAdapter = new CursorAdapter(getApplicationContext(), undoDeleteDomainsCursor, false) {
+ @Override
+ public View newView(Context context, Cursor cursor, ViewGroup parent) {
+ // Inflate the individual item layout. `false` does not attach it to the root.
+ return getLayoutInflater().inflate(R.layout.domain_name_linearlayout, parent, false);
+ }
+
+ @Override
+ public void bindView(View view, Context context, Cursor cursor) {
+ // Set the domain name.
+ String domainNameString = cursor.getString(cursor.getColumnIndex(DomainsDatabaseHelper.DOMAIN_NAME));
+ TextView domainNameTextView = view.findViewById(R.id.domain_name_textview);
+ domainNameTextView.setText(domainNameString);
+ }
+ };
+
+ // Update the `ListView`.
+ domainsListView.setAdapter(undoDeleteDomainsCursorAdapter);
+ // Select the previously deleted domain in `domainsListView`.
+ domainsListView.setItemChecked(deletedDomainPosition, true);
+
+ // Display `domainSettingsFragment`.
+ fragmentManager.beginTransaction().replace(R.id.domain_settings_fragment_container, domainSettingsFragment).commit();
+
+ // Enable the options `MenuItems`.
+ deleteMenuItem.setEnabled(true);
+ deleteMenuItem.setIcon(R.drawable.delete_light);
+ } else { // The device in in one-paned mode.
+ // Display `domainSettingsFragment`.
+ fragmentManager.beginTransaction().replace(R.id.domains_listview_fragment_container, domainSettingsFragment).commit();
+
+ // Hide the add domain floating action button.
+ addDomainFAB.hide();
+
+ // Show and enable `deleteMenuItem`.
+ deleteMenuItem.setVisible(true);
+
+ // Display `domainSettingsFragment`.
+ fragmentManager.beginTransaction().replace(R.id.domains_listview_fragment_container, domainSettingsFragment).commit();
+ }
+ } else { // The snackbar was dismissed without the undo button being pushed.
+ // Delete the selected domain.
+ domainsDatabaseHelper.deleteDomain(databaseIdToDelete);
+
+ // Enable the delete menu item if the system was waiting for a snackbar to be dismissed.
+ if (dismissingSnackbar) {
+ // Create a `Runnable` to enable the delete menu item.
+ Runnable enableDeleteMenuItemRunnable = () -> {
+ // Enable `deleteMenuItem` according to the display mode.
+ if (twoPanedMode) { // Two-paned mode.
+ // Enable the delete menu item.
+ deleteMenuItem.setEnabled(true);
+
+ // Get a handle for the shared preferences.
+ SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
+
+ // Get the theme preferences.
+ boolean darkTheme = sharedPreferences.getBoolean("dark_theme", false);
+
+ // Set the delete icon according to the theme.
+ if (darkTheme) {
+ deleteMenuItem.setIcon(R.drawable.delete_dark);
+ } else {
+ deleteMenuItem.setIcon(R.drawable.delete_light);
}
-
- @Override
- public void bindView(View view, Context context, Cursor cursor) {
- // Set the domain name.
- String domainNameString = cursor.getString(cursor.getColumnIndex(DomainsDatabaseHelper.DOMAIN_NAME));
- TextView domainNameTextView = view.findViewById(R.id.domain_name_textview);
- domainNameTextView.setText(domainNameString);
- }
- };
-
- // Update the `ListView`.
- domainsListView.setAdapter(undoDeleteDomainsCursorAdapter);
- // Select the previously deleted domain in `domainsListView`.
- domainsListView.setItemChecked(deletedDomainPosition, true);
-
- // Display `domainSettingsFragment`.
- fragmentManager.beginTransaction().replace(R.id.domain_settings_fragment_container, domainSettingsFragment).commit();
-
- // Enable the options `MenuItems`.
- deleteMenuItem.setEnabled(true);
- deleteMenuItem.setIcon(R.drawable.delete_light);
- } else { // The device in in one-paned mode.
- // Display `domainSettingsFragment`.
- fragmentManager.beginTransaction().replace(R.id.domains_listview_fragment_container, domainSettingsFragment).commit();
-
- // Hide the add domain FAB.
- addDomainFAB.hide();
-
- // Show and enable `deleteMenuItem`.
- deleteMenuItem.setVisible(true);
-
- // Display `domainSettingsFragment`.
- fragmentManager.beginTransaction().replace(R.id.domains_listview_fragment_container, domainSettingsFragment).commit();
- }
- break;
-
- // The `Snackbar` was dismissed without the `Undo` button being pushed.
- default:
- // Delete the selected domain.
- domainsDatabaseHelper.deleteDomain(databaseIdToDelete);
-
- // Enable the delete menu item if the system was waiting for a snackbar to be dismissed.
- if (dismissingSnackbar) {
- // Create a `Runnable` to enable the delete menu item.
- Runnable enableDeleteMenuItemRunnable = () -> {
- // Enable `deleteMenuItem` according to the display mode.
- if (twoPanedMode) { // Two-paned mode.
- // Enable `deleteMenuItem`.
- deleteMenuItem.setEnabled(true);
-
- // Set the delete icon according to the theme.
- if (MainWebViewActivity.darkTheme) {
- deleteMenuItem.setIcon(R.drawable.delete_dark);
- } else {
- deleteMenuItem.setIcon(R.drawable.delete_light);
- }
- } else { // Single-paned mode.
- // Show `deleteMenuItem`.
- deleteMenuItem.setVisible(true);
- }
-
- // Reset `dismissingSnackbar`.
- dismissingSnackbar = false;
- };
-
- // Enable the delete menu icon after 100 milliseconds to make sure that the previous domain has been deleted from the database.
- Handler handler = new Handler();
- handler.postDelayed(enableDeleteMenuItemRunnable, 100);
- }
-
- // Close the activity if back was pressed.
- if (closeActivityAfterDismissingSnackbar) {
- // Go home.
- NavUtils.navigateUpFromSameTask(activity);
- }
-
- break;
+ } else { // Single-paned mode.
+ // Show `deleteMenuItem`.
+ deleteMenuItem.setVisible(true);
+ }
+
+ // Reset `dismissingSnackbar`.
+ dismissingSnackbar = false;
+ };
+
+ // Enable the delete menu icon after 100 milliseconds to make sure that the previous domain has been deleted from the database.
+ Handler handler = new Handler();
+ handler.postDelayed(enableDeleteMenuItemRunnable, 100);
+ }
+
+ // Close the activity if back was pressed.
+ if (closeActivityAfterDismissingSnackbar) {
+ // Go home.
+ NavUtils.navigateUpFromSameTask(activity);
+ }
}
}
});
saveDomainSettings(coordinatorLayout, resources);
// Store `DomainSettingsDisplayed`.
- outState.putBoolean("domainSettingsDisplayed", true);
- outState.putInt("domainSettingsDatabaseId", DomainSettingsFragment.databaseId);
+ outState.putBoolean("domain_settings_displayed", true);
+ outState.putInt("domain_settings_database_id", DomainSettingsFragment.databaseId);
} else { // `DomainSettingsFragment` is not displayed.
- outState.putBoolean("domainSettingsDisplayed", false);
- outState.putInt("domainSettingsDatabaseId", -1);
+ outState.putBoolean("domain_settings_displayed", false);
+ outState.putInt("domain_settings_database_id", -1);
}
super.onSaveInstanceState(outState);
// Populate the list of domains. `-1` highlights the first domain if in two-paned mode. It has no effect in single-paned mode.
populateDomainsListView(-1);
- // Show the add domain FAB.
+ // Show the add domain floating action button.
addDomainFAB.show();
// Hide the delete menu item.
if (twoPanedMode) { // The device in in two-paned mode.
populateDomainsListView(currentDomainDatabaseId);
} else { // The device is in single-paned mode.
- // Hide the add domain FAB.
+ // Hide the add domain floating action button.
addDomainFAB.hide();
// Show and enable `deleteMenuItem`.
Switch easyPrivacySwitch = view.findViewById(R.id.easyprivacy_switch);
Switch fanboysAnnoyanceSwitch = view.findViewById(R.id.fanboys_annoyance_list_switch);
Switch fanboysSocialBlockingSwitch = view.findViewById(R.id.fanboys_social_blocking_list_switch);
+ Switch ultraListSwitch = view.findViewById(R.id.ultralist_switch);
Switch ultraPrivacySwitch = view.findViewById(R.id.ultraprivacy_switch);
Switch blockAllThirdPartyRequestsSwitch = view.findViewById(R.id.block_all_third_party_requests_switch);
Spinner userAgentSpinner = view.findViewById(R.id.user_agent_spinner);
EditText customUserAgentEditText = view.findViewById(R.id.custom_user_agent_edittext);
Spinner fontSizeSpinner = view.findViewById(R.id.font_size_spinner);
Spinner swipeToRefreshSpinner = view.findViewById(R.id.swipe_to_refresh_spinner);
- Spinner displayWebpageImagesSpinner = view.findViewById(R.id.display_webpage_images_spinner);
Spinner nightModeSpinner = view.findViewById(R.id.night_mode_spinner);
+ Spinner wideViewportSpinner = view.findViewById(R.id.wide_viewport_spinner);
+ Spinner displayWebpageImagesSpinner = view.findViewById(R.id.display_webpage_images_spinner);
Switch pinnedSslCertificateSwitch = view.findViewById(R.id.pinned_ssl_certificate_switch);
RadioButton currentWebsiteCertificateRadioButton = view.findViewById(R.id.current_website_certificate_radiobutton);
Switch pinnedIpAddressesSwitch = view.findViewById(R.id.pinned_ip_addresses_switch);
RadioButton currentIpAddressesRadioButton = view.findViewById(R.id.current_ip_addresses_radiobutton);
- TextView currentIpAddressesTextView = view.findViewById(R.id.current_ip_addresses_textview);
// Extract the data for the domain settings.
String domainNameString = domainNameEditText.getText().toString();
- boolean javaScriptEnabled = javaScriptSwitch.isChecked();
- boolean firstPartyCookiesEnabled = firstPartyCookiesSwitch.isChecked();
- boolean thirdPartyCookiesEnabled = thirdPartyCookiesSwitch.isChecked();
- boolean domStorageEnabled = domStorageSwitch.isChecked();
- boolean formDataEnabled = formDataSwitch.isChecked(); // Form data can be removed once the minimum API >= 26.
- boolean easyListEnabled = easyListSwitch.isChecked();
- boolean easyPrivacyEnabled = easyPrivacySwitch.isChecked();
- boolean fanboysAnnoyanceEnabled = fanboysAnnoyanceSwitch.isChecked();
- boolean fanboysSocialBlockingEnabled = fanboysSocialBlockingSwitch.isChecked();
- boolean ultraPrivacyEnabled = ultraPrivacySwitch.isChecked();
+ boolean javaScript = javaScriptSwitch.isChecked();
+ boolean firstPartyCookies = firstPartyCookiesSwitch.isChecked();
+ boolean thirdPartyCookies = thirdPartyCookiesSwitch.isChecked();
+ boolean domStorage = domStorageSwitch.isChecked();
+ boolean formData = formDataSwitch.isChecked(); // Form data can be removed once the minimum API >= 26.
+ boolean easyList = easyListSwitch.isChecked();
+ boolean easyPrivacy = easyPrivacySwitch.isChecked();
+ boolean fanboysAnnoyance = fanboysAnnoyanceSwitch.isChecked();
+ boolean fanboysSocialBlocking = fanboysSocialBlockingSwitch.isChecked();
+ boolean ultraList = ultraListSwitch.isChecked();
+ boolean ultraPrivacy = ultraPrivacySwitch.isChecked();
boolean blockAllThirdPartyRequests = blockAllThirdPartyRequestsSwitch.isChecked();
int userAgentPosition = userAgentSpinner.getSelectedItemPosition();
int fontSizePosition = fontSizeSpinner.getSelectedItemPosition();
int swipeToRefreshInt = swipeToRefreshSpinner.getSelectedItemPosition();
- int displayWebpageImagesInt = displayWebpageImagesSpinner.getSelectedItemPosition();
int nightModeInt = nightModeSpinner.getSelectedItemPosition();
+ int wideViewportInt = wideViewportSpinner.getSelectedItemPosition();
+ int displayWebpageImagesInt = displayWebpageImagesSpinner.getSelectedItemPosition();
boolean pinnedSslCertificate = pinnedSslCertificateSwitch.isChecked();
boolean pinnedIpAddress = pinnedIpAddressesSwitch.isChecked();
int fontSizeInt = Integer.parseInt(resources.getStringArray(R.array.domain_settings_font_size_entry_values)[fontSizePosition]);
// Save the domain settings.
- domainsDatabaseHelper.updateDomain(DomainsActivity.currentDomainDatabaseId, domainNameString, javaScriptEnabled, firstPartyCookiesEnabled, thirdPartyCookiesEnabled,
- domStorageEnabled, formDataEnabled, easyListEnabled, easyPrivacyEnabled, fanboysAnnoyanceEnabled, fanboysSocialBlockingEnabled, ultraPrivacyEnabled, blockAllThirdPartyRequests,
- userAgentName, fontSizeInt, swipeToRefreshInt, nightModeInt, displayWebpageImagesInt, pinnedSslCertificate, pinnedIpAddress);
+ domainsDatabaseHelper.updateDomain(DomainsActivity.currentDomainDatabaseId, domainNameString, javaScript, firstPartyCookies, thirdPartyCookies, domStorage, formData, easyList, easyPrivacy,
+ fanboysAnnoyance, fanboysSocialBlocking, ultraList, ultraPrivacy, blockAllThirdPartyRequests, userAgentName, fontSizeInt, swipeToRefreshInt, nightModeInt, wideViewportInt,
+ displayWebpageImagesInt, pinnedSslCertificate, pinnedIpAddress);
// Update the pinned SSL certificate if a new one is checked.
if (currentWebsiteCertificateRadioButton.isChecked()) {
- // Get the current website SSL certificate.
- SslCertificate currentWebsiteSslCertificate = MainWebViewActivity.sslCertificate;
-
- // Store the values from the SSL certificate.
- String issuedToCommonName = currentWebsiteSslCertificate.getIssuedTo().getCName();
- String issuedToOrganization = currentWebsiteSslCertificate.getIssuedTo().getOName();
- String issuedToOrganizationalUnit = currentWebsiteSslCertificate.getIssuedTo().getUName();
- String issuedByCommonName = currentWebsiteSslCertificate.getIssuedBy().getCName();
- String issuedByOrganization = currentWebsiteSslCertificate.getIssuedBy().getOName();
- String issuedByOrganizationalUnit = currentWebsiteSslCertificate.getIssuedBy().getUName();
- long startDateLong = currentWebsiteSslCertificate.getValidNotBeforeDate().getTime();
- long endDateLong = currentWebsiteSslCertificate.getValidNotAfterDate().getTime();
-
// Update the database.
- domainsDatabaseHelper.updatePinnedSslCertificate(currentDomainDatabaseId, issuedToCommonName, issuedToOrganization, issuedToOrganizationalUnit, issuedByCommonName, issuedByOrganization,
- issuedByOrganizationalUnit, startDateLong, endDateLong);
+ domainsDatabaseHelper.updatePinnedSslCertificate(currentDomainDatabaseId, sslIssuedToCName, sslIssuedToOName, sslIssuedToUName, sslIssuedByCName, sslIssuedByOName, sslIssuedByUName,
+ sslStartDateLong, sslEndDateLong);
}
// Update the pinned IP addresses if new ones are checked.
if (currentIpAddressesRadioButton.isChecked()) {
- // Get the current IP addresses.
- String currentIpAddresses = currentIpAddressesTextView.getText().toString();
-
// Update the database.
domainsDatabaseHelper.updatePinnedIpAddresses(currentDomainDatabaseId, currentIpAddresses);
}
}
};
- // Update the `ListView`.
+ // Update the list view.
domainsListView.setAdapter(domainsCursorAdapter);
// Display the domain settings in the second pane if operating in two pane mode and the database contains at least one domain.
// Enable the delete options menu items.
deleteMenuItem.setEnabled(true);
+ // Get a handle for the shared preferences.
+ SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this);
+
+ // Get the theme and screenshot preferences.
+ boolean darkTheme = sharedPreferences.getBoolean("dark_theme", false);
+
// Set the delete icon according to the theme.
- if (MainWebViewActivity.darkTheme) {
+ if (darkTheme) {
deleteMenuItem.setIcon(R.drawable.delete_dark);
} else {
deleteMenuItem.setIcon(R.drawable.delete_light);