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

Commit 0ae61c8d authored by Riddle Hsu's avatar Riddle Hsu
Browse files

Invalidate snapshot of home if its UI is changed

Snapshot may be enabled for home task when turning off
screen. If home UI has changed after screen off, the
snapshot should not be used to avoid ugly visual effect.

Bug: 140811348
Test: Lock/unlock device while home is on top with 4 cases:
      1. All apps is shown.
      2. Overview is shown.
      3. Options menu is shown.
      4. Quick search bar is active.
      The expected result should be no starting window
      when unlocking because the snapshot is dropped.

Change-Id: I4bd9926b6f9332ac16b1b3a25ffdd44706015a33
parent e8dc428a
Loading
Loading
Loading
Loading
+7 −0
Original line number Diff line number Diff line
@@ -49,6 +49,7 @@ import com.android.quickstep.SysUINavigationMode.NavigationModeChangeListener;
import com.android.quickstep.SystemUiProxy;
import com.android.quickstep.util.RemoteFadeOutAnimationListener;
import com.android.quickstep.util.ShelfPeekAnim;
import com.android.systemui.shared.system.ActivityManagerWrapper;

import java.util.stream.Stream;

@@ -143,6 +144,12 @@ public abstract class BaseQuickstepLauncher extends Launcher
        RecentsModel.INSTANCE.get(this).onTrimMemory(level);
    }

    @Override
    protected void onUiChangedWhileSleeping() {
        // Remove the snapshot because the content view may have obvious changes.
        ActivityManagerWrapper.getInstance().invalidateHomeTaskSnapshot(this);
    }

    @Override
    public void startIntentSenderForResult(IntentSender intent, int requestCode,
            Intent fillInIntent, int flagsMask, int flagsValues, int extraFlags, Bundle options) {
+22 −0
Original line number Diff line number Diff line
@@ -932,6 +932,9 @@ public class Launcher extends BaseDraggingActivity implements LauncherExterns,

    @Override
    protected void onStop() {
        final boolean wasActive = isUserActive();
        final LauncherState origState = getStateManager().getState();
        final int origDragLayerChildCount = mDragLayer.getChildCount();
        super.onStop();

        if (mDeferOverlayCallbacks) {
@@ -949,6 +952,20 @@ public class Launcher extends BaseDraggingActivity implements LauncherExterns,

        // Workaround for b/78520668, explicitly trim memory once UI is hidden
        onTrimMemory(TRIM_MEMORY_UI_HIDDEN);

        if (wasActive) {
            // The expected condition is that this activity is stopped because the device goes to
            // sleep and the UI may have noticeable changes.
            mDragLayer.post(() -> {
                if ((!getStateManager().isInStableState(origState)
                        // The drag layer may be animating (e.g. dismissing QSB).
                        || mDragLayer.getAlpha() < 1
                        // Maybe an ArrowPopup is closed.
                        || mDragLayer.getChildCount() != origDragLayerChildCount)) {
                    onUiChangedWhileSleeping();
                }
            });
        }
    }

    @Override
@@ -1343,11 +1360,16 @@ public class Launcher extends BaseDraggingActivity implements LauncherExterns,
            // Reset AllApps to its initial state only if we are not in the middle of
            // processing a multi-step drop
            if (mPendingRequestArgs == null) {
                if (!isInState(NORMAL)) {
                    onUiChangedWhileSleeping();
                }
                mStateManager.goToState(NORMAL);
            }
        }
    };

    protected void onUiChangedWhileSleeping() { }

    public void updateNotificationDots(Predicate<PackageUserKey> updatedDots) {
        mWorkspace.updateNotificationDots(updatedDots);
        mAppsView.getAppsStore().updateNotificationDots(updatedDots);
+9 −0
Original line number Diff line number Diff line
@@ -163,6 +163,15 @@ public class LauncherStateManager {
        return !mLauncher.isForceInvisible() && mLauncher.isStarted();
    }

    /**
     * @return {@code true} if the state matches the current state and there is no active
     *         transition to different state.
     */
    public boolean isInStableState(LauncherState state) {
        return mState == state && mCurrentStableState == state
                && (mConfig.mTargetState == null || mConfig.mTargetState == state);
    }

    /**
     * @see #goToState(LauncherState, boolean, Runnable)
     */