]> gitweb.stoutner.com Git - PrivacyBrowserAndroid.git/blobdiff - app/src/main/java/com/stoutner/privacybrowser/activities/DomainsActivity.java
Fix scrolling of the bottom app bar. https://redmine.stoutner.com/issues/791
[PrivacyBrowserAndroid.git] / app / src / main / java / com / stoutner / privacybrowser / activities / DomainsActivity.java
index 5d0589fcf8a8455e19b84998018ab1c8db01e317..f4a1e79b8a2bb7a6c6a6139e0a4912f2b66a81cd 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright © 2017-2020 Soren Stoutner <soren@stoutner.com>.
+ * Copyright © 2017-2021 Soren Stoutner <soren@stoutner.com>.
  *
  * This file is part of Privacy Browser <https://www.stoutner.com/privacy-browser>.
  *
@@ -129,8 +129,9 @@ public class DomainsActivity extends AppCompatActivity implements AddDomainDialo
         // Get a handle for the shared preferences.
         SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this);
 
-        // Get the screenshot preference.
-        boolean allowScreenshots = sharedPreferences.getBoolean("allow_screenshots", false);
+        // Get the preferences.
+        boolean allowScreenshots = sharedPreferences.getBoolean(getString(R.string.allow_screenshots_key), false);
+        boolean bottomAppBar = sharedPreferences.getBoolean(getString(R.string.bottom_app_bar_key), false);
 
         // Disable screenshots if not allowed.
         if (!allowScreenshots) {
@@ -178,8 +179,12 @@ public class DomainsActivity extends AppCompatActivity implements AddDomainDialo
         sslEndDateLong = intent.getLongExtra("ssl_end_date", 0);
         currentIpAddresses = intent.getStringExtra("current_ip_addresses");
 
-        // Set the content view.
-        setContentView(R.layout.domains_coordinatorlayout);
+        // Set the view.
+        if (bottomAppBar) {
+            setContentView(R.layout.domains_bottom_appbar);
+        } else {
+            setContentView(R.layout.domains_top_appbar);
+        }
 
         // Populate the class variables.
         coordinatorLayout = findViewById(R.id.domains_coordinatorlayout);
@@ -330,88 +335,98 @@ public class DomainsActivity extends AppCompatActivity implements AddDomainDialo
     @Override
     public boolean onOptionsItemSelected(MenuItem menuItem) {
         // Get the ID of the menu item that was selected.
-        int menuItemID = menuItem.getItemId();
+        int menuItemId = menuItem.getItemId();
 
         // Get a handle for the fragment manager.
         FragmentManager fragmentManager = getSupportFragmentManager();
 
-        switch (menuItemID) {
-            case android.R.id.home:  // The home arrow is identified as `android.R.id.home`, not just `R.id.home`.
-                if (twoPanedMode) {  // The device is in two-paned mode.
-                    // Save the current domain settings if the domain settings fragment is displayed.
-                    if (findViewById(R.id.domain_settings_scrollview) != null) {
-                        saveDomainSettings(coordinatorLayout, resources);
-                    }
-
-                    // Dismiss the undo delete `SnackBar` if it is shown.
-                    if (undoDeleteSnackbar != null && undoDeleteSnackbar.isShown()) {
-                        // Set the close flag.
-                        closeActivityAfterDismissingSnackbar = true;
-
-                        // Dismiss the snackbar.
-                        undoDeleteSnackbar.dismiss();
-                    } else {
-                        // Go home.
-                        NavUtils.navigateUpFromSameTask(this);
-                    }
-                } else if (closeOnBack) {  // Go directly back to the main WebView activity because the domains activity was launched from the options menu.
-                    // Save the current domain settings.
+        // Run the command according to the selected menu item.
+        if (menuItemId == android.R.id.home) {  // The home arrow is identified as `android.R.id.home`, not just `R.id.home`.
+            // Check if the device is in two-paned mode.
+            if (twoPanedMode) {  // The device is in two-paned mode.
+                // Save the current domain settings if the domain settings fragment is displayed.
+                if (findViewById(R.id.domain_settings_scrollview) != null) {
                     saveDomainSettings(coordinatorLayout, resources);
+                }
+
+                // Dismiss the undo delete snackbar if it is shown.
+                if (undoDeleteSnackbar != null && undoDeleteSnackbar.isShown()) {
+                    // Set the close flag.
+                    closeActivityAfterDismissingSnackbar = true;
 
+                    // Dismiss the snackbar.
+                    undoDeleteSnackbar.dismiss();
+                } else {
                     // Go home.
                     NavUtils.navigateUpFromSameTask(this);
-                } else if (findViewById(R.id.domain_settings_scrollview) != null) {  // The device is in single-paned mode and the domain settings fragment is displayed.
-                    // Save the current domain settings.
-                    saveDomainSettings(coordinatorLayout, resources);
+                }
+            } else if (closeOnBack) {  // Go directly back to the main WebView activity because the domains activity was launched from the options menu.
+                // Save the current domain settings.
+                saveDomainSettings(coordinatorLayout, resources);
 
-                    // Display the domains list fragment.
-                    DomainsListFragment domainsListFragment = new DomainsListFragment();
-                    fragmentManager.beginTransaction().replace(R.id.domains_listview_fragment_container, domainsListFragment).commit();
-                    fragmentManager.executePendingTransactions();
+                // Go home.
+                NavUtils.navigateUpFromSameTask(this);
+            } else if (findViewById(R.id.domain_settings_scrollview) != null) {  // The device is in single-paned mode and the domain settings fragment is displayed.
+                // Save the current domain settings.
+                saveDomainSettings(coordinatorLayout, resources);
 
-                    // 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, domainsListViewPosition);
+                // Display the domains list fragment.
+                DomainsListFragment domainsListFragment = new DomainsListFragment();
+                fragmentManager.beginTransaction().replace(R.id.domains_listview_fragment_container, domainsListFragment).commit();
+                fragmentManager.executePendingTransactions();
 
-                    // Show the add domain floating action button.
-                    addDomainFAB.show();
+                // 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, domainsListViewPosition);
 
-                    // Hide the delete menu item.
-                    deleteMenuItem.setVisible(false);
-                } else {  // The device is in single-paned mode and `DomainsListFragment` is displayed.
-                    // Dismiss the undo delete `SnackBar` if it is shown.
-                    if (undoDeleteSnackbar != null && undoDeleteSnackbar.isShown()) {
-                        // Set the close flag.
-                        closeActivityAfterDismissingSnackbar = true;
-
-                        // Dismiss the snackbar.
-                        undoDeleteSnackbar.dismiss();
-                    } else {
-                        // Go home.
-                        NavUtils.navigateUpFromSameTask(this);
-                    }
-                }
-                break;
+                // Show the add domain floating action button.
+                addDomainFAB.show();
+
+                // Hide the delete menu item.
+                deleteMenuItem.setVisible(false);
+            } else {  // The device is in single-paned mode and domains list fragment is displayed.
+                // Dismiss the undo delete `SnackBar` if it is shown.
+                if (undoDeleteSnackbar != null && undoDeleteSnackbar.isShown()) {
+                    // Set the close flag.
+                    closeActivityAfterDismissingSnackbar = true;
 
-            case R.id.delete_domain:
+                    // Dismiss the snackbar.
+                    undoDeleteSnackbar.dismiss();
+                } else {
+                    // Go home.
+                    NavUtils.navigateUpFromSameTask(this);
+                }
+            }
+        } else if (menuItemId == R.id.delete_domain) {  // Delete.
+            // Get a handle for the activity.
+            Activity activity = this;
+
+            // Check to see if the domain settings were loaded directly for editing of this app in single-paned mode.
+            if (closeOnBack && !twoPanedMode) {  // The activity should delete the domain settings and exit straight to the the main WebView activity.
+                // Delete the selected domain.
+                domainsDatabaseHelper.deleteDomain(currentDomainDatabaseId);
+
+                // Go home.
+                NavUtils.navigateUpFromSameTask(activity);
+            } else {  // A snackbar should be shown before deleting the domain settings.
                 // Reset close-on-back, which otherwise can cause errors if the system attempts to save settings for a domain that no longer exists.
                 closeOnBack = false;
 
-                // Store a copy of `currentDomainDatabaseId` because it could change while the `Snackbar` is displayed.
+                // Store a copy of the current domain database ID because it could change while the snackbar is displayed.
                 final int databaseIdToDelete = currentDomainDatabaseId;
 
                 // Update the fragments and menu items.
                 if (twoPanedMode) {  // Two-paned mode.
-                    // Store the deleted domain position, which is needed if `Undo` is selected in the `Snackbar`.
+                    // Store the deleted domain position, which is needed if undo is selected in the snackbar.
                     deletedDomainPosition = domainsListView.getCheckedItemPosition();
 
-                    // Disable the options `MenuItems`.
+                    // Disable the options menu items.
                     deleteMenuItem.setEnabled(false);
                     deleteMenuItem.setIcon(R.drawable.delete_disabled);
 
                     // Remove the domain settings fragment.
                     fragmentManager.beginTransaction().remove(Objects.requireNonNull(fragmentManager.findFragmentById(R.id.domain_settings_fragment_container))).commit();
                 } else {  // Single-paned mode.
-                    // Display `DomainsListFragment`.
+                    // Display the domains list fragment.
                     DomainsListFragment domainsListFragment = new DomainsListFragment();
                     fragmentManager.beginTransaction().replace(R.id.domains_listview_fragment_container, domainsListFragment).commit();
                     fragmentManager.executePendingTransactions();
@@ -423,35 +438,36 @@ public class DomainsActivity extends AppCompatActivity implements AddDomainDialo
                     deleteMenuItem.setVisible(false);
                 }
 
-                // Get a `Cursor` that does not show the domain to be deleted.
+                // Get a cursor that does not show the domain to be deleted.
                 Cursor domainsPendingDeleteCursor = domainsDatabaseHelper.getDomainNameCursorOrderedByDomainExcept(databaseIdToDelete);
 
-                // Setup `domainsPendingDeleteCursorAdapter` with `this` context.  `false` disables `autoRequery`.
+                // Setup the domains pending delete cursor adapter.
                 CursorAdapter domainsPendingDeleteCursorAdapter = new CursorAdapter(this, domainsPendingDeleteCursor, false) {
                     @Override
                     public View newView(Context context, Cursor cursor, ViewGroup parent) {
-                        // Inflate the individual item layout.  `false` does not attach it to the root.
+                        // Inflate the individual item layout.
                         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));
+                        // Get the domain name string.
+                        String domainNameString = cursor.getString(cursor.getColumnIndexOrThrow(DomainsDatabaseHelper.DOMAIN_NAME));
+
+                        // Get a handle for the domain name text view.
                         TextView domainNameTextView = view.findViewById(R.id.domain_name_textview);
+
+                        // Display the domain name.
                         domainNameTextView.setText(domainNameString);
                     }
                 };
 
-                // Update the handle for the current `domains_listview`.
+                // Update the handle for the current domains list view.
                 domainsListView = findViewById(R.id.domains_listview);
 
-                // Update the `ListView`.
+                // Update the list view.
                 domainsListView.setAdapter(domainsPendingDeleteCursorAdapter);
 
-                // Get a handle for the activity.
-                Activity activity = this;
-
                 // Display a snackbar.
                 undoDeleteSnackbar = Snackbar.make(domainsListView, R.string.domain_deleted, Snackbar.LENGTH_LONG)
                         .setAction(R.string.undo, (View v) -> {
@@ -477,22 +493,26 @@ public class DomainsActivity extends AppCompatActivity implements AddDomainDialo
 
                                     // Display the correct fragments.
                                     if (twoPanedMode) {  // The device in in two-paned mode.
-                                        // Get a `Cursor` with the current contents of the domains database.
+                                        // Get a cursor with the current contents of the domains database.
                                         Cursor undoDeleteDomainsCursor = domainsDatabaseHelper.getDomainNameCursorOrderedByDomain();
 
-                                        // Setup `domainsCursorAdapter` with `this` context.  `false` disables `autoRequery`.
+                                        // Setup the domains cursor adapter.
                                         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.
+                                                // Inflate the individual item layout.
                                                 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));
+                                                /// Get the domain name string.
+                                                String domainNameString = cursor.getString(cursor.getColumnIndexOrThrow(DomainsDatabaseHelper.DOMAIN_NAME));
+
+                                                // Get a handle for the domain name text view.
                                                 TextView domainNameTextView = view.findViewById(R.id.domain_name_textview);
+
+                                                // Display the domain name.
                                                 domainNameTextView.setText(domainNameString);
                                             }
                                         };
@@ -578,7 +598,7 @@ public class DomainsActivity extends AppCompatActivity implements AddDomainDialo
 
                 // Show the Snackbar.
                 undoDeleteSnackbar.show();
-                break;
+            }
         }
 
         // Consume the event.
@@ -734,8 +754,7 @@ public class DomainsActivity extends AppCompatActivity implements AddDomainDialo
         // Get handles for the domain settings.
         EditText domainNameEditText = view.findViewById(R.id.domain_settings_name_edittext);
         SwitchCompat javaScriptSwitch = view.findViewById(R.id.javascript_switch);
-        SwitchCompat firstPartyCookiesSwitch = view.findViewById(R.id.first_party_cookies_switch);
-        SwitchCompat thirdPartyCookiesSwitch = view.findViewById(R.id.third_party_cookies_switch);
+        SwitchCompat cookiesSwitch = view.findViewById(R.id.cookies_switch);
         SwitchCompat domStorageSwitch = view.findViewById(R.id.dom_storage_switch);
         SwitchCompat formDataSwitch = view.findViewById(R.id.form_data_switch);  // Form data can be removed once the minimum API >= 26.
         SwitchCompat easyListSwitch = view.findViewById(R.id.easylist_switch);
@@ -761,8 +780,7 @@ public class DomainsActivity extends AppCompatActivity implements AddDomainDialo
         // Extract the data for the domain settings.
         String domainNameString = domainNameEditText.getText().toString();
         boolean javaScript = javaScriptSwitch.isChecked();
-        boolean firstPartyCookies = firstPartyCookiesSwitch.isChecked();
-        boolean thirdPartyCookies = thirdPartyCookiesSwitch.isChecked();
+        boolean cookies = cookiesSwitch.isChecked();
         boolean domStorage  = domStorageSwitch.isChecked();
         boolean formData = formDataSwitch.isChecked();  // Form data can be removed once the minimum API >= 26.
         boolean easyList = easyListSwitch.isChecked();
@@ -814,7 +832,7 @@ public class DomainsActivity extends AppCompatActivity implements AddDomainDialo
         }
 
         // Save the domain settings.
-        domainsDatabaseHelper.updateDomain(DomainsActivity.currentDomainDatabaseId, domainNameString, javaScript, firstPartyCookies, thirdPartyCookies, domStorage, formData, easyList, easyPrivacy,
+        domainsDatabaseHelper.updateDomain(DomainsActivity.currentDomainDatabaseId, domainNameString, javaScript, cookies, domStorage, formData, easyList, easyPrivacy,
                 fanboysAnnoyance, fanboysSocialBlocking, ultraList, ultraPrivacy, blockAllThirdPartyRequests, userAgentName, fontSizeInt, swipeToRefreshInt, webViewThemeInt, wideViewportInt,
                 displayWebpageImagesInt, pinnedSslCertificate, pinnedIpAddress);
 
@@ -850,7 +868,7 @@ public class DomainsActivity extends AppCompatActivity implements AddDomainDialo
             @Override
             public void bindView(View view, Context context, Cursor cursor) {
                 // Set the domain name.
-                String domainNameString = cursor.getString(cursor.getColumnIndex(DomainsDatabaseHelper.DOMAIN_NAME));
+                String domainNameString = cursor.getString(cursor.getColumnIndexOrThrow(DomainsDatabaseHelper.DOMAIN_NAME));
                 TextView domainNameTextView = view.findViewById(R.id.domain_name_textview);
                 domainNameTextView.setText(domainNameString);
             }
@@ -873,7 +891,7 @@ public class DomainsActivity extends AppCompatActivity implements AddDomainDialo
                 domainsCursor.moveToPosition(i);
 
                 // Get the database ID for this position.
-                int currentDatabaseId = domainsCursor.getInt(domainsCursor.getColumnIndex(DomainsDatabaseHelper._ID));
+                int currentDatabaseId = domainsCursor.getInt(domainsCursor.getColumnIndexOrThrow(DomainsDatabaseHelper._ID));
 
                 // Set `highlightedDomainPosition` if the database ID for this matches `highlightedDomainDatabaseId`.
                 if (highlightedDomainDatabaseId == currentDatabaseId) {
@@ -886,7 +904,7 @@ public class DomainsActivity extends AppCompatActivity implements AddDomainDialo
 
             // Get the database ID for the highlighted domain.
             domainsCursor.moveToPosition(highlightedDomainPosition);
-            currentDomainDatabaseId = domainsCursor.getInt(domainsCursor.getColumnIndex(DomainsDatabaseHelper._ID));
+            currentDomainDatabaseId = domainsCursor.getInt(domainsCursor.getColumnIndexOrThrow(DomainsDatabaseHelper._ID));
 
             // Create an arguments bundle.
             Bundle argumentsBundle = new Bundle();