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
This commit is contained in:
Shridhar Goel 2018-12-22 18:57:47 +05:30 committed by Adam Jones
parent 493fa6b721
commit b447612cc5
6 changed files with 37 additions and 6 deletions

View file

@ -6,6 +6,7 @@
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_SYNC_SETTINGS" />
<uses-permission android:name="android.permission.READ_SYNC_STATS" />
<uses-permission android:name="android.permission.REORDER_TASKS" />
<uses-permission android:name="android.permission.WRITE_SYNC_SETTINGS" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

View file

@ -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);
}

View file

@ -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);
}

View file

@ -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);

View file

@ -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);
}

View file

@ -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