]> gitweb.stoutner.com Git - PrivacyBrowserAndroid.git/blobdiff - app/src/main/java/com/stoutner/privacybrowser/fragments/DomainsListFragment.java
Implement a night mode option. https://redmine.stoutner.com/issues/145.
[PrivacyBrowserAndroid.git] / app / src / main / java / com / stoutner / privacybrowser / fragments / DomainsListFragment.java
index cd4bec0c102341809684c8b69277e8ff984d527a..172a6438279ce315366bde0b774ec762988845af 100644 (file)
@@ -19,6 +19,7 @@
 
 package com.stoutner.privacybrowser.fragments;
 
+import android.net.http.SslCertificate;
 import android.os.Bundle;
 import android.support.design.widget.FloatingActionButton;
 // We have to use `android.support.v4.app.Fragment` until minimum API >= 23.  Otherwise we cannot call `getContext()`.
@@ -30,6 +31,7 @@ import android.view.ViewGroup;
 import android.widget.AdapterView;
 import android.widget.EditText;
 import android.widget.ListView;
+import android.widget.RadioButton;
 import android.widget.Spinner;
 import android.widget.Switch;
 
@@ -55,7 +57,14 @@ public class DomainsListFragment extends Fragment {
         domainsListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
             @Override
             public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
-                // Save the current domain settings if operating in two-paned mode a domain is currently selected.
+                // Dismiss `undoDeleteSnackbar` if it is currently displayed (because a domain has just been deleted).
+                if ((DomainsActivity.undoDeleteSnackbar != null) && (DomainsActivity.undoDeleteSnackbar.isShown())) {
+                    DomainsActivity.dismissingSnackbar = true;
+
+                    DomainsActivity.undoDeleteSnackbar.dismiss();
+                }
+
+                // Save the current domain settings if operating in two-paned mode and a domain is currently selected.
                 if (DomainsActivity.twoPanedMode && DomainsActivity.deleteMenuItem.isEnabled()) {
                     View domainSettingsFragmentView = supportFragmentManager.findFragmentById(R.id.domain_settings_fragment_container).getView();
                     assert domainSettingsFragmentView != null;
@@ -71,6 +80,10 @@ public class DomainsListFragment extends Fragment {
                     EditText customUserAgentEditText = (EditText) domainSettingsFragmentView.findViewById(R.id.domain_settings_custom_user_agent_edittext);
                     Spinner fontSizeSpinner = (Spinner) domainSettingsFragmentView.findViewById(R.id.domain_settings_font_size_spinner);
                     Spinner displayWebpageImagesSpinner = (Spinner) domainSettingsFragmentView.findViewById(R.id.domain_settings_display_webpage_images_spinner);
+                    Spinner nightModeSpinner = (Spinner) domainSettingsFragmentView.findViewById(R.id.domain_settings_night_mode_spinner);
+                    Switch pinnedSslCertificateSwitch = (Switch) domainSettingsFragmentView.findViewById(R.id.domain_settings_pinned_ssl_certificate_switch);
+                    RadioButton savedSslCertificateRadioButton = (RadioButton) domainSettingsFragmentView.findViewById(R.id.saved_ssl_certificate_radiobutton);
+                    RadioButton currentWebsiteCertificateRadioButton = (RadioButton) domainSettingsFragmentView.findViewById(R.id.current_website_certificate_radiobutton);
 
                     // Extract the data for the domain settings.
                     String domainNameString = domainNameEditText.getText().toString();
@@ -82,6 +95,8 @@ public class DomainsListFragment extends Fragment {
                     int userAgentPositionInt = userAgentSpinner.getSelectedItemPosition();
                     int fontSizePositionInt = fontSizeSpinner.getSelectedItemPosition();
                     int displayWebpageImagesInt = displayWebpageImagesSpinner.getSelectedItemPosition();
+                    int nightModeInt = nightModeSpinner.getSelectedItemPosition();
+                    boolean pinnedSslCertificate = pinnedSslCertificateSwitch.isChecked();
 
                     // Get the data for the `Spinners` from the entry values string arrays.
                     String userAgentString = getResources().getStringArray(R.array.domain_settings_user_agent_entry_values)[userAgentPositionInt];
@@ -94,8 +109,33 @@ public class DomainsListFragment extends Fragment {
                     }
 
                     // Save the domain settings.
-                    domainsDatabaseHelper.saveDomain(DomainsActivity.currentDomainDatabaseId, domainNameString, javaScriptEnabledBoolean, firstPartyCookiesEnabledBoolean, thirdPartyCookiesEnabledBoolean, domStorageEnabledEnabledBoolean, formDataEnabledBoolean, userAgentString, fontSizeInt,
-                            displayWebpageImagesInt);
+                    if (savedSslCertificateRadioButton.isChecked()) {  // The current certificate is being used.
+                        // Update the database except for the certificate.
+                        domainsDatabaseHelper.updateDomainExceptCertificate(DomainsActivity.currentDomainDatabaseId, domainNameString, javaScriptEnabledBoolean, firstPartyCookiesEnabledBoolean, thirdPartyCookiesEnabledBoolean, domStorageEnabledEnabledBoolean,
+                                formDataEnabledBoolean, userAgentString, fontSizeInt, displayWebpageImagesInt, nightModeInt, pinnedSslCertificate);
+                    } else if (currentWebsiteCertificateRadioButton.isChecked()) {  // The certificate is being updated with the current website certificate.
+                        // 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.updateDomainWithCertificate(DomainsActivity.currentDomainDatabaseId, domainNameString, javaScriptEnabledBoolean, firstPartyCookiesEnabledBoolean, thirdPartyCookiesEnabledBoolean, domStorageEnabledEnabledBoolean,
+                                formDataEnabledBoolean, userAgentString, fontSizeInt, displayWebpageImagesInt, nightModeInt, pinnedSslCertificate, issuedToCommonName, issuedToOrganization, issuedToOrganizationalUnit, issuedByCommonName, issuedByOrganization,
+                                issuedByOrganizationalUnit, startDateLong, endDateLong);
+                    } else {  // No certificate is selected.
+                        // Update the database, with PINNED_SSL_CERTIFICATE set to false.
+                        domainsDatabaseHelper.updateDomainExceptCertificate(DomainsActivity.currentDomainDatabaseId, domainNameString, javaScriptEnabledBoolean, firstPartyCookiesEnabledBoolean, thirdPartyCookiesEnabledBoolean, domStorageEnabledEnabledBoolean,
+                                formDataEnabledBoolean, userAgentString, fontSizeInt, displayWebpageImagesInt, nightModeInt, false);
+                    }
                 }
 
                 // Store the new `currentDomainDatabaseId`, converting it from `long` to `int` to match the format of the domains database.
@@ -111,29 +151,31 @@ public class DomainsListFragment extends Fragment {
 
                 // Display the domain settings fragment.
                 if (DomainsActivity.twoPanedMode) {  // The device in in two-paned mode.
+                    // enable `deleteMenuItem` if the system is not waiting for a `Snackbar` to be dismissed.
+                    if (!DomainsActivity.dismissingSnackbar) {
+                        // Enable `deleteMenuItem`.
+                        DomainsActivity.deleteMenuItem.setEnabled(true);
+
+                        // Set the delete icon according to the theme.
+                        if (MainWebViewActivity.darkTheme) {
+                            DomainsActivity.deleteMenuItem.setIcon(R.drawable.delete_dark);
+                        } else {
+                            DomainsActivity.deleteMenuItem.setIcon(R.drawable.delete_light);
+                        }
+                    }
+
                     // Display `domainSettingsFragment`.
                     supportFragmentManager.beginTransaction().replace(R.id.domain_settings_fragment_container, domainSettingsFragment).commit();
-
-                    // Enable the options `MenuItems`.
-                    DomainsActivity.deleteMenuItem.setEnabled(true);
-
-                    // Set the delete icon according to the theme.
-                    if (MainWebViewActivity.darkTheme) {
-                        DomainsActivity.deleteMenuItem.setIcon(R.drawable.delete_dark);
-                    } else {
-                        DomainsActivity.deleteMenuItem.setIcon(R.drawable.delete_light);
-                    }
                 } else { // The device in in single-paned mode
+                    // Show `deleteMenuItem` if the system is not waiting for a `Snackbar` to be dismissed.
+                    if (!DomainsActivity.dismissingSnackbar) {
+                        DomainsActivity.deleteMenuItem.setVisible(true);
+                    }
+
                     // Hide `add_domain_fab`.
                     FloatingActionButton addDomainFAB = (FloatingActionButton) getActivity().findViewById(R.id.add_domain_fab);
                     addDomainFAB.setVisibility(View.GONE);
 
-                    // Show and enable `deleteMenuItem`.
-                    DomainsActivity.deleteMenuItem.setVisible(true);
-
-                    // Set `domainSettingsFragmentDisplayed`.
-                    DomainsActivity.domainSettingsFragmentDisplayed = true;
-
                     // Display `domainSettingsFragment`.
                     supportFragmentManager.beginTransaction().replace(R.id.domains_listview_fragment_container, domainSettingsFragment).commit();
                 }