diff --git a/app/src/main/java/com/limelight/HelpActivity.java b/app/src/main/java/com/limelight/HelpActivity.java index fe06e5b6..44361e90 100644 --- a/app/src/main/java/com/limelight/HelpActivity.java +++ b/app/src/main/java/com/limelight/HelpActivity.java @@ -2,9 +2,12 @@ package com.limelight; import android.app.Activity; import android.graphics.Bitmap; +import android.os.Build; import android.os.Bundle; import android.webkit.WebView; import android.webkit.WebViewClient; +import android.window.OnBackInvokedCallback; +import android.window.OnBackInvokedDispatcher; import com.limelight.utils.SpinnerDialog; @@ -13,10 +16,26 @@ public class HelpActivity extends Activity { private SpinnerDialog loadingDialog; private WebView webView; + private boolean backCallbackRegistered; + private OnBackInvokedCallback onBackInvokedCallback; + @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + onBackInvokedCallback = new OnBackInvokedCallback() { + @Override + public void onBackInvoked() { + // We should always be able to go back because we unregister our callback + // when we can't go back. Nonetheless, we will still check anyway. + if (webView.canGoBack()) { + webView.goBack(); + } + } + }; + } + webView = new WebView(this); setContentView(webView); @@ -39,6 +58,8 @@ public class HelpActivity extends Activity { getResources().getString(R.string.help_loading_title), getResources().getString(R.string.help_loading_msg), false); } + + refreshBackDispatchState(); } @Override @@ -47,6 +68,8 @@ public class HelpActivity extends Activity { loadingDialog.dismiss(); loadingDialog = null; } + + refreshBackDispatchState(); } @Override @@ -59,6 +82,31 @@ public class HelpActivity extends Activity { webView.loadUrl(getIntent().getData().toString()); } + private void refreshBackDispatchState() { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + if (webView.canGoBack() && !backCallbackRegistered) { + getOnBackInvokedDispatcher().registerOnBackInvokedCallback( + OnBackInvokedDispatcher.PRIORITY_DEFAULT, onBackInvokedCallback); + backCallbackRegistered = true; + } + else if (!webView.canGoBack() && backCallbackRegistered) { + getOnBackInvokedDispatcher().unregisterOnBackInvokedCallback(onBackInvokedCallback); + backCallbackRegistered = false; + } + } + } + + @Override + protected void onDestroy() { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + if (backCallbackRegistered) { + getOnBackInvokedDispatcher().unregisterOnBackInvokedCallback(onBackInvokedCallback); + } + } + + super.onDestroy(); + } + @Override public void onBackPressed() { // Back goes back through the WebView history