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