From b447612cc5810a3731e78933303e9326d5a207b2 Mon Sep 17 00:00:00 2001
From: Shridhar Goel <35566748+ShridharGoel@users.noreply.github.com>
Date: Sat, 22 Dec 2018 18:57:47 +0530
Subject: [PATCH] Fix #2200: Prevent app from closing while navigating to Home
(#2204)
* Fix #2200 Prevent app from closing while navigating to Home
* Add workaround for reorder activity Android bug in some API levels
---
app/src/main/AndroidManifest.xml | 1 +
.../commons/bookmarks/BookmarksActivity.java | 2 +-
.../category/CategoryDetailsActivity.java | 2 +-
.../category/CategoryImagesActivity.java | 2 +-
.../notification/NotificationActivity.java | 2 +-
.../commons/theme/NavigationBaseActivity.java | 34 +++++++++++++++++--
6 files changed, 37 insertions(+), 6 deletions(-)
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 559470c84..551df1942 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -6,6 +6,7 @@
+
diff --git a/app/src/main/java/fr/free/nrw/commons/bookmarks/BookmarksActivity.java b/app/src/main/java/fr/free/nrw/commons/bookmarks/BookmarksActivity.java
index 35c465288..84966ed20 100644
--- a/app/src/main/java/fr/free/nrw/commons/bookmarks/BookmarksActivity.java
+++ b/app/src/main/java/fr/free/nrw/commons/bookmarks/BookmarksActivity.java
@@ -54,7 +54,7 @@ public class BookmarksActivity extends NavigationBaseActivity
*/
public static void startYourself(Context context) {
Intent intent = new Intent(context, BookmarksActivity.class);
- intent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
+ intent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT | Intent.FLAG_ACTIVITY_SINGLE_TOP);
context.startActivity(intent);
}
diff --git a/app/src/main/java/fr/free/nrw/commons/category/CategoryDetailsActivity.java b/app/src/main/java/fr/free/nrw/commons/category/CategoryDetailsActivity.java
index fce2fac5e..bf4617c09 100644
--- a/app/src/main/java/fr/free/nrw/commons/category/CategoryDetailsActivity.java
+++ b/app/src/main/java/fr/free/nrw/commons/category/CategoryDetailsActivity.java
@@ -140,7 +140,7 @@ public class CategoryDetailsActivity extends NavigationBaseActivity
*/
public static void startYourself(Context context, String categoryName) {
Intent intent = new Intent(context, CategoryDetailsActivity.class);
- intent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
+ intent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT | Intent.FLAG_ACTIVITY_SINGLE_TOP);
intent.putExtra("categoryName", categoryName);
context.startActivity(intent);
}
diff --git a/app/src/main/java/fr/free/nrw/commons/category/CategoryImagesActivity.java b/app/src/main/java/fr/free/nrw/commons/category/CategoryImagesActivity.java
index eafc46e68..11ef6aefc 100644
--- a/app/src/main/java/fr/free/nrw/commons/category/CategoryImagesActivity.java
+++ b/app/src/main/java/fr/free/nrw/commons/category/CategoryImagesActivity.java
@@ -148,7 +148,7 @@ public class CategoryImagesActivity
*/
public static void startYourself(Context context, String title, String categoryName) {
Intent intent = new Intent(context, CategoryImagesActivity.class);
- intent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
+ intent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT | Intent.FLAG_ACTIVITY_SINGLE_TOP);
intent.putExtra("title", title);
intent.putExtra("categoryName", categoryName);
context.startActivity(intent);
diff --git a/app/src/main/java/fr/free/nrw/commons/notification/NotificationActivity.java b/app/src/main/java/fr/free/nrw/commons/notification/NotificationActivity.java
index 5036d6fa8..7ce3d1c17 100644
--- a/app/src/main/java/fr/free/nrw/commons/notification/NotificationActivity.java
+++ b/app/src/main/java/fr/free/nrw/commons/notification/NotificationActivity.java
@@ -136,7 +136,7 @@ public class NotificationActivity extends NavigationBaseActivity {
public static void startYourself(Context context) {
Intent intent = new Intent(context, NotificationActivity.class);
- intent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
+ intent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT | Intent.FLAG_ACTIVITY_SINGLE_TOP);
context.startActivity(intent);
}
diff --git a/app/src/main/java/fr/free/nrw/commons/theme/NavigationBaseActivity.java b/app/src/main/java/fr/free/nrw/commons/theme/NavigationBaseActivity.java
index 025dbb90d..06c654b0f 100644
--- a/app/src/main/java/fr/free/nrw/commons/theme/NavigationBaseActivity.java
+++ b/app/src/main/java/fr/free/nrw/commons/theme/NavigationBaseActivity.java
@@ -2,11 +2,13 @@ package fr.free.nrw.commons.theme;
import android.accounts.Account;
import android.accounts.AccountManager;
+import android.app.ActivityManager;
import android.content.ActivityNotFoundException;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.net.Uri;
+import android.os.Build;
import android.support.annotation.NonNull;
import android.support.design.widget.NavigationView;
import android.support.v4.widget.DrawerLayout;
@@ -44,6 +46,7 @@ public abstract class NavigationBaseActivity extends BaseActivity
implements NavigationView.OnNavigationItemSelectedListener {
private static final String FEATURED_IMAGES_CATEGORY = "Category:Featured_pictures_on_Wikimedia_Commons";
+ private boolean isRestoredToTop;
@BindView(R.id.toolbar)
Toolbar toolbar;
@@ -172,11 +175,13 @@ public abstract class NavigationBaseActivity extends BaseActivity
return true;
case R.id.action_about:
drawerLayout.closeDrawer(navigationView);
- startActivityWithFlags(this, AboutActivity.class, Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
+ startActivityWithFlags(this, AboutActivity.class, Intent.FLAG_ACTIVITY_REORDER_TO_FRONT,
+ Intent.FLAG_ACTIVITY_SINGLE_TOP);
return true;
case R.id.action_settings:
drawerLayout.closeDrawer(navigationView);
- startActivityWithFlags(this, SettingsActivity.class, Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
+ startActivityWithFlags(this, SettingsActivity.class, Intent.FLAG_ACTIVITY_REORDER_TO_FRONT,
+ Intent.FLAG_ACTIVITY_SINGLE_TOP);
return true;
case R.id.action_introduction:
drawerLayout.closeDrawer(navigationView);
@@ -249,6 +254,31 @@ public abstract class NavigationBaseActivity extends BaseActivity
context.startActivity(intent);
}
+ /* This is a workaround for a known Android bug which is present in some API levels.
+ https://issuetracker.google.com/issues/36986021
+ */
+ @Override
+ protected void onNewIntent(Intent intent) {
+ super.onNewIntent(intent);
+ if ((intent.getFlags() | Intent.FLAG_ACTIVITY_REORDER_TO_FRONT) > 0) {
+ isRestoredToTop = true;
+ }
+ }
+
+ @Override
+ public void finish() {
+ super.finish();
+ if (Build.VERSION.SDK_INT == 19 || Build.VERSION.SDK_INT == 24 || Build.VERSION.SDK_INT == 25
+ && !isTaskRoot() && isRestoredToTop) {
+ // Issue with FLAG_ACTIVITY_REORDER_TO_FRONT,
+ // Reordered activity back press will go to home unexpectly,
+ // Workaround: move reordered activity current task to front when it's finished.
+ ActivityManager tasksManager = (ActivityManager) getSystemService(ACTIVITY_SERVICE);
+ tasksManager.moveTaskToFront(getTaskId(), ActivityManager.MOVE_TASK_NO_USER_ACTION);
+ }
+ }
+
+
/**
* Handles visibility of navigation base toolbar
* @param show : Used to handle visibility of toolbar