]> gitweb.stoutner.com Git - PrivacyBrowserAndroid.git/blobdiff - app/src/main/java/com/stoutner/privacybrowser/adapters/WebViewPagerAdapter.java
Add share, copy, and save options to About > Version. https://redmine.stoutner.com...
[PrivacyBrowserAndroid.git] / app / src / main / java / com / stoutner / privacybrowser / adapters / WebViewPagerAdapter.java
index 3bec00521955b29d8e5ea315d00eb0b6242d7239..e6c831653e84c200ce4903ea4c678f03911073e3 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright © 2019 Soren Stoutner <soren@stoutner.com>.
+ * Copyright © 2019-2020 Soren Stoutner <soren@stoutner.com>.
  *
  * This file is part of Privacy Browser <https://www.stoutner.com/privacy-browser>.
  *
 
 package com.stoutner.privacybrowser.adapters;
 
-import com.stoutner.privacybrowser.fragments.WebViewTabFragment;
-
-import java.util.LinkedList;
+import android.os.Bundle;
 
 import androidx.annotation.NonNull;
 import androidx.fragment.app.Fragment;
 import androidx.fragment.app.FragmentManager;
 import androidx.fragment.app.FragmentPagerAdapter;
+import androidx.viewpager.widget.ViewPager;
+
+import com.stoutner.privacybrowser.fragments.WebViewTabFragment;
+
+import java.util.LinkedList;
 
 public class WebViewPagerAdapter extends FragmentPagerAdapter {
     // The WebView fragments list contains all the WebViews.
     private LinkedList<WebViewTabFragment> webViewFragmentsList = new LinkedList<>();
 
     // Define the constructor.
-    public WebViewPagerAdapter(FragmentManager fragmentManager){
+    public WebViewPagerAdapter(FragmentManager fragmentManager) {
         // Run the default commands.
-        super(fragmentManager);
+        super(fragmentManager, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT);
     }
 
     @Override
@@ -58,6 +61,7 @@ public class WebViewPagerAdapter extends FragmentPagerAdapter {
     }
 
     @Override
+    @NonNull
     public Fragment getItem(int pageNumber) {
         // Get the fragment for a particular page.  Page numbers are 0 indexed.
         return webViewFragmentsList.get(pageNumber);
@@ -66,10 +70,10 @@ public class WebViewPagerAdapter extends FragmentPagerAdapter {
     @Override
     public long getItemId(int position) {
         // Return the unique ID for this page.
-        return webViewFragmentsList.get(position).tabId;
+        return webViewFragmentsList.get(position).fragmentId;
     }
 
-    public int getPositionForId(long pageId) {
+    public int getPositionForId(long fragmentId) {
         // Initialize the position variable.
         int position = -1;
 
@@ -79,7 +83,7 @@ public class WebViewPagerAdapter extends FragmentPagerAdapter {
         // Find the current position of the WebView fragment with the given ID.
         while (position < 0 && i < webViewFragmentsList.size()) {
             // Check to see if the tab ID of this WebView matches the page ID.
-            if (webViewFragmentsList.get(i).tabId == pageId) {
+            if (webViewFragmentsList.get(i).fragmentId == fragmentId) {
                 // Store the position if they are a match.
                 position = i;
             }
@@ -88,27 +92,51 @@ public class WebViewPagerAdapter extends FragmentPagerAdapter {
             i++;
         }
 
+        // Set the position to be the last tab if it is not found.
+        // Sometimes there is a race condition in populating the webView fragments list when resuming Privacy Browser and displaying an SSL certificate error while loading a new intent.
+        // In that case, the last tab should be the one it is looking for.
+        if (position == -1) {
+            position = webViewFragmentsList.size() - 1;
+        }
+
         // Return the position.
         return position;
     }
 
-    public void addPage(int pageNumber) {
+    public void addPage(int pageNumber, ViewPager webViewPager, String url, boolean moveToNewPage) {
         // Add a new page.
-        webViewFragmentsList.add(WebViewTabFragment.createPage(pageNumber));
+        webViewFragmentsList.add(WebViewTabFragment.createPage(pageNumber, url));
+
+        // Update the view pager.
+        notifyDataSetChanged();
+
+        // Move to the new page if indicated.
+        if (moveToNewPage) {
+            webViewPager.setCurrentItem(pageNumber);
+        }
+    }
+
+    public void restorePage(Bundle savedState, Bundle savedNestedScrollWebViewState) {
+        // Restore the page.
+        webViewFragmentsList.add(WebViewTabFragment.restorePage(savedState, savedNestedScrollWebViewState));
 
         // Update the view pager.
         notifyDataSetChanged();
     }
 
-    public void deletePage(int pageNumber) {
+    public boolean deletePage(int pageNumber, ViewPager webViewPager) {
         // Delete the page.
         webViewFragmentsList.remove(pageNumber);
 
         // Update the view pager.
         notifyDataSetChanged();
+
+        // Return true if the selected page number did not change after the delete.  This will cause the calling method to reset the current WebView to the new contents of this page number.
+        return (webViewPager.getCurrentItem() == pageNumber);
     }
 
     public WebViewTabFragment getPageFragment(int pageNumber) {
+        // Return the page fragment.
         return webViewFragmentsList.get(pageNumber);
     }
 }
\ No newline at end of file