]> gitweb.stoutner.com Git - PrivacyBrowserAndroid.git/blobdiff - app/src/main/java/com/stoutner/privacybrowser/fragments/DomainsListFragment.kt
Fix crash when adding domain settings with null domain. https://redmine.stoutner...
[PrivacyBrowserAndroid.git] / app / src / main / java / com / stoutner / privacybrowser / fragments / DomainsListFragment.kt
diff --git a/app/src/main/java/com/stoutner/privacybrowser/fragments/DomainsListFragment.kt b/app/src/main/java/com/stoutner/privacybrowser/fragments/DomainsListFragment.kt
new file mode 100644 (file)
index 0000000..558bba2
--- /dev/null
@@ -0,0 +1,136 @@
+/*
+ * Copyright © 2017-2020,2022 Soren Stoutner <soren@stoutner.com>.
+ *
+ * This file is part of Privacy Browser Android <https://www.stoutner.com/privacy-browser-android>.
+ *
+ * Privacy Browser Android is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Privacy Browser Android is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Privacy Browser Android.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+package com.stoutner.privacybrowser.fragments
+
+import android.content.Context
+import android.os.Bundle
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import android.widget.AdapterView
+import android.widget.AdapterView.OnItemClickListener
+import android.widget.ListView
+
+import androidx.fragment.app.Fragment
+
+import com.google.android.material.floatingactionbutton.FloatingActionButton
+
+import com.stoutner.privacybrowser.R
+import com.stoutner.privacybrowser.activities.DomainsActivity
+
+class DomainsListFragment : Fragment() {
+    // Declare the class variables.
+    private lateinit var dismissSnackbarInterface: DismissSnackbarInterface
+    private lateinit var saveDomainSettingsInterface: SaveDomainSettingsInterface
+
+    // Define the public dismiss snackbar interface.
+    interface DismissSnackbarInterface {
+        fun dismissSnackbar()
+    }
+
+    // Define the public save domain interface.
+    interface SaveDomainSettingsInterface {
+        fun saveDomainSettings(view: View)
+    }
+
+    override fun onAttach(context: Context) {
+        // Run the default commands.
+        super.onAttach(context)
+
+        // Populate the interfaces.
+        dismissSnackbarInterface = context as DismissSnackbarInterface
+        saveDomainSettingsInterface = context as SaveDomainSettingsInterface
+    }
+
+    override fun onCreateView(layoutInflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View {
+        // Inflate the layout.  The fragment will take care of attaching the root automatically.
+        val domainsListFragmentView = layoutInflater.inflate(R.layout.domains_list_fragment, container, false)
+
+        // Get a handle for the domains list view.
+        val domainsListView = domainsListFragmentView.findViewById<ListView>(R.id.domains_listview)
+
+        // Get a handle for the support fragment manager.
+        val supportFragmentManager = requireActivity().supportFragmentManager
+
+        // Handle clicks on the domains list view.
+        domainsListView.onItemClickListener = OnItemClickListener { _: AdapterView<*>, _: View, _: Int, id: Long ->
+            // Dismiss the snackbar if it is visible.
+            dismissSnackbarInterface.dismissSnackbar()
+
+            // Save the current domain settings if operating in two-paned mode and a domain is currently selected.
+            if (DomainsActivity.twoPanedMode && DomainsActivity.deleteMenuItem.isEnabled) {
+                // Get a handle for the domain settings fragment.
+                val domainSettingsFragment = supportFragmentManager.findFragmentById(R.id.domain_settings_fragment_container)!!
+
+                // Get a handle for the domain settings fragment view.
+                val domainSettingsFragmentView = domainSettingsFragment.requireView()
+
+                // Save the domain settings.
+                saveDomainSettingsInterface.saveDomainSettings(domainSettingsFragmentView)
+            }
+
+            // Store the new current domain database ID, converting it from long to int to match the format of the domains database.
+            DomainsActivity.currentDomainDatabaseId = id.toInt()
+
+            // Create an arguments bundle.
+            val argumentsBundle = Bundle()
+
+            // Add the current domain database ID to the arguments bundle.
+            argumentsBundle.putInt(DomainSettingsFragment.DATABASE_ID, DomainsActivity.currentDomainDatabaseId)
+
+            // Create a new domains settings fragment instance.
+            val domainSettingsFragment = DomainSettingsFragment()
+
+            // Add the arguments bundle to the domain settings fragment.
+            domainSettingsFragment.arguments = argumentsBundle
+
+            // Check to see if the device is in two paned mode.
+            if (DomainsActivity.twoPanedMode) {  // The device in in two-paned mode.
+                // Enable the delete menu item if the system is not waiting for a snackbar to be dismissed.
+                if (!DomainsActivity.dismissingSnackbar) {
+                    // Enable the delete menu item.
+                    DomainsActivity.deleteMenuItem.isEnabled = true
+                }
+
+                // Display the domain settings fragment.
+                supportFragmentManager.beginTransaction().replace(R.id.domain_settings_fragment_container, domainSettingsFragment).commit()
+            } else { // The device in in single-paned mode
+                // Save the domains listview position.
+                DomainsActivity.domainsListViewPosition = domainsListView.firstVisiblePosition
+
+                // Show the delete menu item if the system is not waiting for a snackbar to be dismissed.
+                if (!DomainsActivity.dismissingSnackbar)
+                    DomainsActivity.deleteMenuItem.isVisible = true
+
+                // Get a handle for the add domain floating action button.
+                val addDomainFab = requireActivity().findViewById<FloatingActionButton>(R.id.add_domain_fab)
+
+                // Hide the add domain FAB.
+                addDomainFab.hide()
+
+                // Display the domain settings fragment.
+                supportFragmentManager.beginTransaction().replace(R.id.domains_listview_fragment_container, domainSettingsFragment).commit()
+            }
+        }
+
+        // Return the domains list fragment.
+        return domainsListFragmentView
+    }
+}
\ No newline at end of file