From e1d974e19f181b8a6df33b223df37b6f82a6c0ec Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sun, 13 Jul 2025 08:55:32 +0000 Subject: [PATCH 1/5] Initial plan From 55f47df17a7f274e1cfe4ed62bf57d03afe8c07d Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sun, 13 Jul 2025 09:02:53 +0000 Subject: [PATCH 2/5] Implement back button navigation fix for internally opened documents Co-authored-by: TomTasche <128734+TomTasche@users.noreply.github.com> --- .../reader/ui/activity/MainActivity.java | 41 +++++++++++++++++++ 1 file changed, 41 insertions(+) diff --git a/app/src/main/java/at/tomtasche/reader/ui/activity/MainActivity.java b/app/src/main/java/at/tomtasche/reader/ui/activity/MainActivity.java index 81aa4f3248bf..910dad486156 100644 --- a/app/src/main/java/at/tomtasche/reader/ui/activity/MainActivity.java +++ b/app/src/main/java/at/tomtasche/reader/ui/activity/MainActivity.java @@ -28,6 +28,7 @@ import android.widget.CompoundButton; import android.widget.LinearLayout; +import androidx.activity.OnBackPressedCallback; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.annotation.VisibleForTesting; @@ -101,6 +102,7 @@ private static boolean isTesting() { private Uri lastUri; private Uri loadOnStart; private Uri lastSaveUri; + private boolean documentOpenedInternally = false; @Nullable private CountingIdlingResource openFileIdlingResource; @@ -182,6 +184,7 @@ public void onClick(View view) { // (i.e. after bringing app back from background) if (getIntent().getData() != null) { loadOnStart = getIntent().getData(); + documentOpenedInternally = false; // External launch analyticsManager.report(FirebaseAnalytics.Event.SELECT_CONTENT, FirebaseAnalytics.Param.CONTENT_TYPE, "other"); } else { @@ -194,6 +197,26 @@ public void onClick(View view) { } addMenuProvider(this, this); + + // Set up back button handling + getOnBackPressedDispatcher().addCallback(this, new OnBackPressedCallback(true) { + @Override + public void handleOnBackPressed() { + if (fullscreen) { + leaveFullscreen(); + return; + } + + // If document is currently displayed and was opened internally, go back to landing + if (documentContainer.getVisibility() == View.VISIBLE && documentOpenedInternally) { + showLandingScreen(); + } else { + // For external launches or when already on landing screen, use default behavior (close app) + setEnabled(false); + getOnBackPressedDispatcher().onBackPressed(); + } + } + }); } @Override @@ -321,6 +344,7 @@ protected void onNewIntent(Intent intent) { if (intent.getData() != null) { crashManager.log("onNewIntent loadUri"); + documentOpenedInternally = false; // External launch loadUri(intent.getData()); analyticsManager.report(FirebaseAnalytics.Event.SELECT_CONTENT, FirebaseAnalytics.Param.CONTENT_TYPE, "other"); @@ -606,6 +630,8 @@ public void onClick(DialogInterface dialog, int which) { openFileIdlingResource.increment(); } + // Mark that the next document will be opened internally + documentOpenedInternally = true; startActivityForResult(intent, 42); } catch (Exception e) { if (null != openFileIdlingResource) { @@ -663,6 +689,21 @@ protected void onDestroy() { } } + private void showLandingScreen() { + landingContainer.setVisibility(View.VISIBLE); + documentContainer.setVisibility(View.GONE); + + // Clear the document state + lastUri = null; + lastSaveUri = null; + documentOpenedInternally = false; + + // Clear the action bar title + setTitle(""); + + analyticsManager.setCurrentScreen(this, "screen_main"); + } + public CrashManager getCrashManager() { return crashManager; } From 2a7c5a8bf4baea14dc7313be94a56480ccb4a746 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sun, 13 Jul 2025 09:05:39 +0000 Subject: [PATCH 3/5] Refactor loadUri methods and fix RecentDocumentDialogFragment navigation Co-authored-by: TomTasche <128734+TomTasche@users.noreply.github.com> --- .../reader/ui/activity/MainActivity.java | 49 +++++++++++-------- .../widget/RecentDocumentDialogFragment.java | 2 +- 2 files changed, 29 insertions(+), 22 deletions(-) diff --git a/app/src/main/java/at/tomtasche/reader/ui/activity/MainActivity.java b/app/src/main/java/at/tomtasche/reader/ui/activity/MainActivity.java index 910dad486156..620f0d66f5ff 100644 --- a/app/src/main/java/at/tomtasche/reader/ui/activity/MainActivity.java +++ b/app/src/main/java/at/tomtasche/reader/ui/activity/MainActivity.java @@ -28,7 +28,6 @@ import android.widget.CompoundButton; import android.widget.LinearLayout; -import androidx.activity.OnBackPressedCallback; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.annotation.VisibleForTesting; @@ -197,26 +196,6 @@ public void onClick(View view) { } addMenuProvider(this, this); - - // Set up back button handling - getOnBackPressedDispatcher().addCallback(this, new OnBackPressedCallback(true) { - @Override - public void handleOnBackPressed() { - if (fullscreen) { - leaveFullscreen(); - return; - } - - // If document is currently displayed and was opened internally, go back to landing - if (documentContainer.getVisibility() == View.VISIBLE && documentOpenedInternally) { - showLandingScreen(); - } else { - // For external launches or when already on landing screen, use default behavior (close app) - setEnabled(false); - getOnBackPressedDispatcher().onBackPressed(); - } - } - }); } @Override @@ -385,6 +364,18 @@ protected void onActivityResult(int requestCode, int resultCode, Intent intent) } public void loadUri(Uri uri) { + loadUriInternal(uri, false); + } + + public void loadUriFromInternalNavigation(Uri uri) { + loadUriInternal(uri, true); + } + + private void loadUriInternal(Uri uri, boolean isInternal) { + if (isInternal) { + documentOpenedInternally = true; + } + lastSaveUri = null; lastUri = uri; @@ -581,6 +572,22 @@ public boolean onKeyDown(int keyCode, KeyEvent event) { return super.onKeyDown(keyCode, event); } + @Override + public void onBackPressed() { + if (fullscreen) { + leaveFullscreen(); + return; + } + + // If document is currently displayed and was opened internally, go back to landing + if (documentContainer.getVisibility() == View.VISIBLE && documentOpenedInternally) { + showLandingScreen(); + } else { + // For external launches or when already on landing screen, use default behavior (close app) + super.onBackPressed(); + } + } + public void findDocument() { final Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT); intent.addCategory(Intent.CATEGORY_OPENABLE); diff --git a/app/src/main/java/at/tomtasche/reader/ui/widget/RecentDocumentDialogFragment.java b/app/src/main/java/at/tomtasche/reader/ui/widget/RecentDocumentDialogFragment.java index d21fff6851a3..a2c4f88f80c8 100644 --- a/app/src/main/java/at/tomtasche/reader/ui/widget/RecentDocumentDialogFragment.java +++ b/app/src/main/java/at/tomtasche/reader/ui/widget/RecentDocumentDialogFragment.java @@ -102,7 +102,7 @@ public void onItemClick(AdapterView arg0, View arg1, int arg2, long arg3) { dismiss(); MainActivity activity = ((MainActivity) getActivity()); - activity.loadUri(Uri.parse(uri)); + activity.loadUriFromInternalNavigation(Uri.parse(uri)); } @Override From 3df6fb3f2ff7ee4c860aeab07ffed4d5c9457f3e Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sun, 13 Jul 2025 09:07:06 +0000 Subject: [PATCH 4/5] Use modern OnBackPressedCallback instead of deprecated onBackPressed Co-authored-by: TomTasche <128734+TomTasche@users.noreply.github.com> --- .../reader/ui/activity/MainActivity.java | 37 +++++++++++-------- 1 file changed, 21 insertions(+), 16 deletions(-) diff --git a/app/src/main/java/at/tomtasche/reader/ui/activity/MainActivity.java b/app/src/main/java/at/tomtasche/reader/ui/activity/MainActivity.java index 620f0d66f5ff..368c261810d5 100644 --- a/app/src/main/java/at/tomtasche/reader/ui/activity/MainActivity.java +++ b/app/src/main/java/at/tomtasche/reader/ui/activity/MainActivity.java @@ -28,6 +28,7 @@ import android.widget.CompoundButton; import android.widget.LinearLayout; +import androidx.activity.OnBackPressedCallback; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.annotation.VisibleForTesting; @@ -196,6 +197,26 @@ public void onClick(View view) { } addMenuProvider(this, this); + + // Set up modern back button handling + getOnBackPressedDispatcher().addCallback(this, new OnBackPressedCallback(true) { + @Override + public void handleOnBackPressed() { + if (fullscreen) { + leaveFullscreen(); + return; + } + + // If document is currently displayed and was opened internally, go back to landing + if (documentContainer.getVisibility() == View.VISIBLE && documentOpenedInternally) { + showLandingScreen(); + } else { + // For external launches or when already on landing screen, use default behavior (close app) + setEnabled(false); + getOnBackPressedDispatcher().onBackPressed(); + } + } + }); } @Override @@ -572,22 +593,6 @@ public boolean onKeyDown(int keyCode, KeyEvent event) { return super.onKeyDown(keyCode, event); } - @Override - public void onBackPressed() { - if (fullscreen) { - leaveFullscreen(); - return; - } - - // If document is currently displayed and was opened internally, go back to landing - if (documentContainer.getVisibility() == View.VISIBLE && documentOpenedInternally) { - showLandingScreen(); - } else { - // For external launches or when already on landing screen, use default behavior (close app) - super.onBackPressed(); - } - } - public void findDocument() { final Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT); intent.addCategory(Intent.CATEGORY_OPENABLE); From 563a2b1ab8f9281efa5e846e31ebaebce8008972 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sun, 13 Jul 2025 09:10:40 +0000 Subject: [PATCH 5/5] Final cleanup: Add verification notes and gitignore entry Co-authored-by: TomTasche <128734+TomTasche@users.noreply.github.com> --- .gitignore | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.gitignore b/.gitignore index f278eab3e2e5..7cebb6e2077d 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,5 @@ +verification_notes.md + ## Android.gitignore # Built application files *.apk