diff --git a/app/build.gradle b/app/build.gradle index 27b5a6b1..7788cc63 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -129,7 +129,7 @@ dependencies { implementation 'androidx.navigation:navigation-ui:2.8.9' implementation 'com.google.code.gson:gson:2.11.0' implementation 'io.github.medyo:android-about-page:2.0.0' - implementation 'androidx.webkit:webkit:1.13.0' + implementation 'androidx.webkit:webkit:1.17.0' implementation 'com.jakewharton:process-phoenix:2.1.2' testImplementation 'junit:junit:4.13.2' testImplementation 'org.robolectric:robolectric:4.14.1' diff --git a/app/src/main/java/com/cylonid/nativealpha/WebViewActivity.java b/app/src/main/java/com/cylonid/nativealpha/WebViewActivity.java index ad2aa915..c5bcd044 100644 --- a/app/src/main/java/com/cylonid/nativealpha/WebViewActivity.java +++ b/app/src/main/java/com/cylonid/nativealpha/WebViewActivity.java @@ -52,6 +52,7 @@ import androidx.core.app.ShareCompat; import androidx.core.content.ContextCompat; import androidx.webkit.WebSettingsCompat; +import androidx.webkit.WebViewCompat; import androidx.webkit.WebViewFeature; import com.cylonid.nativealpha.databinding.DialogHttpAuthBinding; @@ -119,6 +120,8 @@ public class WebViewActivity extends AppCompatActivity implements EasyPermission private AdblockProviderApiHelper adblockProviderApiHelper; private AdblockLifecycleHelper adblockLifecycleHelper; + private static final int MAX_SAVED_STATE_BYTES = 256 * 1024; + @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); @@ -135,14 +138,14 @@ protected void onCreate(Bundle savedInstanceState) { finish(); } else { if(webapp.isBiometricProtection()) { - new BiometricPromptHelper(WebViewActivity.this).showPrompt(() -> setupWebView(), () -> finish(), getString(R.string.bioprompt_restricted_webapp)); + new BiometricPromptHelper(WebViewActivity.this).showPrompt(() -> setupWebView(savedInstanceState), () -> finish(), getString(R.string.bioprompt_restricted_webapp)); } - setupWebView(); + setupWebView(savedInstanceState); } } @SuppressLint("ClickableViewAccessibility") - private void setupWebView() { + private void setupWebView(Bundle savedState) { String processName = Application.getProcessName(); String packageName = this.getPackageName(); @@ -245,8 +248,14 @@ private void setupWebView() { wv.getSettings().setBuiltInZoomControls(true); } + if (WebViewFeature.isFeatureSupported(WebViewFeature.BACK_FORWARD_CACHE)) { + WebSettingsCompat.setBackForwardCacheEnabled(wv.getSettings(), true); + } + CUSTOM_HEADERS = initCustomHeaders(webapp.isSendSavedataRequest()); - loadURL(wv, url); + if (savedState == null || wv.restoreState(savedState) == null) { + loadURL(wv, url); + } wv.setWebChromeClient(new CustomWebChromeClient()); wv.setOnLongClickListener(view -> { if(webapp.getAlwaysUseFallbackContextMenu()) return false; @@ -507,6 +516,14 @@ private void showWebViewPopupMenu() { mPopupMenu.show(); } + @Override + protected void onSaveInstanceState(@NonNull Bundle outState) { + super.onSaveInstanceState(outState); + if (wv != null && WebViewFeature.isFeatureSupported(WebViewFeature.SAVE_STATE)) { + WebViewCompat.saveState(wv, outState, MAX_SAVED_STATE_BYTES, false); + } + } + @Override public void onConfigurationChanged(@NonNull Configuration newConfig) { super.onConfigurationChanged(newConfig);