Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit cb0315f2 authored by Louis Chang's avatar Louis Chang
Browse files

Revert "Intercept back for task root activity only"

This reverts commit 0b463e53.

Reason for revert: b/432384513

Flag: EXEMPT bugfix
Change-Id: I3321e8a5aa89c0dc5b5e6649d98ca86009546276
parent f6613ab4
Loading
Loading
Loading
Loading
+20 −29
Original line number Diff line number Diff line
@@ -156,13 +156,12 @@ class BackNavigationController {
        public void onBackInvoked() {
            synchronized (mWindowManagerService.mGlobalLock) {
                final ActivityRecord r = mActivityRecordRef.get();
                if (r != null && mWindowManagerService.mAtmService.mTaskOrganizerController
                        .handleInterceptBackPressedOnTaskRoot(r)) {
                    // Handled by the controller, exit early.
                    return;
                boolean handled = false;
                if (r != null) {
                    handled = mWindowManagerService.mAtmService.mTaskOrganizerController
                            .handleInterceptBackPressedOnTaskRoot(r);
                }

                if (mFallbackCallbackRef == null) {
                if (handled || mFallbackCallbackRef == null) {
                    return;
                }

@@ -305,8 +304,21 @@ class BackNavigationController {
                return null;
            }

            final OnBackInvokedCallbackInfo callbackInfo = getOnBackInvokedCallbackInfo(
                    window, currentTask, currentActivity);
            final boolean interceptBack = currentTask != null
                    && currentTask.mAtmService.mTaskOrganizerController
                            .shouldInterceptBackPressedOnRootTask(currentTask.getRootTask());
            final OnBackInvokedCallbackInfo callbackInfo;
            if (interceptBack) {
                final OnBackInvokedCallbackInfo info = window.getOnBackInvokedCallbackInfo();
                final IOnBackInvokedCallback callback =
                        new OnInterceptBackInvokedCallback(currentActivity,
                                info != null ? info.getCallback() : null);
                callbackInfo = new OnBackInvokedCallbackInfo(callback, PRIORITY_DEFAULT, false,
                        OVERRIDE_UNDEFINED);
            } else {
                // Now let's find if this window has a callback from the client side.
                callbackInfo = window.getOnBackInvokedCallbackInfo();
            }
            if (callbackInfo == null) {
                Slog.e(TAG, "No callback registered, returning null.");
                return null;
@@ -529,27 +541,6 @@ class BackNavigationController {
        }
    }

    @VisibleForTesting(visibility = VisibleForTesting.Visibility.PRIVATE)
    @Nullable OnBackInvokedCallbackInfo getOnBackInvokedCallbackInfo(@NonNull WindowState window,
            @Nullable Task task, @Nullable ActivityRecord activity) {
        final OnBackInvokedCallbackInfo info = window.getOnBackInvokedCallbackInfo();
        if (activity == null || task == null) {
            return info;
        }

        final ActivityRecord root = task.getRootActivity(
                false /*ignoreRelinquishIdentity*/, true /*setToBottomIfNone*/);
        if (activity != root || !task.mAtmService.mTaskOrganizerController
                        .shouldInterceptBackPressedOnRootTask(task.getRootTask())) {
            return info;
        }

        final IOnBackInvokedCallback callback = new OnInterceptBackInvokedCallback(activity,
                info != null ? info.getCallback() : null);
        return new OnBackInvokedCallbackInfo(callback, PRIORITY_DEFAULT, false,
                    OVERRIDE_UNDEFINED);
    }

    /**
     * Gets previous activities from currentActivity.
     *
+0 −52
Original line number Diff line number Diff line
@@ -552,58 +552,6 @@ public class BackNavigationControllerTests extends WindowTestsBase {
        assertThat(backNavigationInfo.getOnBackInvokedCallback()).isEqualTo(callback);
    }

    @Test
    public void testGetOnBackInvokedCallbackInfo_interceptBackDisabled_returnsCallbackInfo() {
        final Task topTask = createTopTaskWithActivity();
        final WindowState window = topTask.getTopVisibleAppMainWindow();
        final ActivityRecord r = window.getActivityRecord();
        final OnBackInvokedCallbackInfo callbackInfo = mock(OnBackInvokedCallbackInfo.class);
        window.setOnBackInvokedCallbackInfo(callbackInfo);
        spyOn(mAtm.mTaskOrganizerController);
        Mockito.doReturn(false).when(mAtm.mTaskOrganizerController)
                .shouldInterceptBackPressedOnRootTask(eq(topTask));

        final OnBackInvokedCallbackInfo info =
                mBackNavigationController.getOnBackInvokedCallbackInfo(window, topTask, r);

        assertThat(info).isEqualTo(callbackInfo);
    }

    @Test
    public void testGetOnBackInvokedCallbackInfo_interceptBackRootActivity_returnsNewCallback() {
        final Task topTask = createTopTaskWithActivity();
        final WindowState window = topTask.getTopVisibleAppMainWindow();
        final ActivityRecord root = window.getActivityRecord();
        final OnBackInvokedCallbackInfo callbackInfo = mock(OnBackInvokedCallbackInfo.class);
        window.setOnBackInvokedCallbackInfo(callbackInfo);
        spyOn(mAtm.mTaskOrganizerController);
        Mockito.doReturn(true).when(mAtm.mTaskOrganizerController)
                .shouldInterceptBackPressedOnRootTask(eq(topTask));

        final OnBackInvokedCallbackInfo info =
                mBackNavigationController.getOnBackInvokedCallbackInfo(window, topTask, root);

        assertThat(info).isNotNull();
        assertThat(info).isNotEqualTo(callbackInfo);
    }

    @Test
    public void testGetOnBackInvokedCallbackInfo_interceptBackChildActivity_returnsCallbackInfo() {
        final Task topTask = createTopTaskWithActivity();
        final WindowState window = topTask.getTopVisibleAppMainWindow();
        final ActivityRecord child = createActivityRecord(topTask);
        final OnBackInvokedCallbackInfo callbackInfo = mock(OnBackInvokedCallbackInfo.class);
        window.setOnBackInvokedCallbackInfo(callbackInfo);
        spyOn(mAtm.mTaskOrganizerController);
        Mockito.doReturn(true).when(mAtm.mTaskOrganizerController)
                .shouldInterceptBackPressedOnRootTask(eq(topTask));

        final OnBackInvokedCallbackInfo info =
                mBackNavigationController.getOnBackInvokedCallbackInfo(window, topTask, child);

        assertThat(info).isEqualTo(callbackInfo);
    }

    @Test
    public void preparesForBackToHome() {
        final Task topTask = createTopTaskWithActivity();