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

Commit 3cf264f4 authored by Schneider Victor-tulias's avatar Schneider Victor-tulias
Browse files

Prevent hotseat updates if it is visible to the user.

Test: manual

Fixes: 168653219

Changing app icons under the user's finger could be disruptive. Added a checks for whether the hotseatand all apps predictions are visible and callbacks to update them when they become hidden.

Change-Id: Ib9e6e904e9f662ecfaeea6a2fe21d1d81ba39b96
parent b6aff1f5
Loading
Loading
Loading
Loading
+21 −0
Original line number Diff line number Diff line
@@ -108,6 +108,8 @@ public class PredictionRowView extends LinearLayout implements

    AllAppsSectionDecorator.SectionDecorationHandler mDecorationHandler;

    @Nullable private List<ItemInfo> mPendingPredictedItems;

    public PredictionRowView(@NonNull Context context) {
        this(context, null);
    }
@@ -203,6 +205,16 @@ public class PredictionRowView extends LinearLayout implements
     * we can optimize by swapping them in place.
     */
    public void setPredictedApps(List<ItemInfo> items) {
        if (isShown() && getWindowVisibility() == View.VISIBLE) {
            mPendingPredictedItems = items;
            return;
        }

        applyPredictedApps(items);
    }

    private void applyPredictedApps(List<ItemInfo> items) {
        mPendingPredictedItems = null;
        mPredictedApps.clear();
        items.stream()
                .filter(itemInfo -> itemInfo instanceof WorkspaceItemInfo)
@@ -341,4 +353,13 @@ public class PredictionRowView extends LinearLayout implements
    public View getFocusedChild() {
        return getChildAt(0);
    }

    @Override
    public void onVisibilityAggregated(boolean isVisible) {
        super.onVisibilityAggregated(isVisible);

        if (mPendingPredictedItems != null && !isVisible) {
            applyPredictedApps(mPendingPredictedItems);
        }
    }
}
+20 −0
Original line number Diff line number Diff line
@@ -251,6 +251,26 @@ public class HotseatPredictionController implements DragController.DragListener,
     * Sets or updates the predicted items
     */
    public void setPredictedItems(FixedContainerItems items) {
        if (mHotseat.isShown() && mHotseat.getWindowVisibility() == View.VISIBLE) {
            mHotseat.setOnVisibilityAggregatedCallback((isVisible) -> {
                if (isVisible) {
                    return;
                }
                mHotseat.setOnVisibilityAggregatedCallback(null);

                applyPredictedItems(items);
            });
        } else {
            mHotseat.setOnVisibilityAggregatedCallback(null);

            applyPredictedItems(items);
        }
    }

    /**
     * Sets or updates the predicted items only once the hotseat becomes hidden to the user
     */
    private void applyPredictedItems(FixedContainerItems items) {
        mPredictedItems = items.items;
        if (mPredictedItems.isEmpty()) {
            HotseatRestoreHelper.restoreBackup(mLauncher);
+19 −0
Original line number Diff line number Diff line
@@ -25,6 +25,10 @@ import android.view.ViewDebug;
import android.view.ViewGroup;
import android.widget.FrameLayout;

import androidx.annotation.Nullable;

import java.util.function.Consumer;

/**
 * View class that represents the bottom row of the home screen.
 */
@@ -34,6 +38,7 @@ public class Hotseat extends CellLayout implements Insettable {
    private boolean mHasVerticalHotseat;
    private Workspace mWorkspace;
    private boolean mSendTouchToWorkspace;
    @Nullable private Consumer<Boolean> mOnVisibilityAggregatedCallback;

    public Hotseat(Context context) {
        this(context, null);
@@ -129,4 +134,18 @@ public class Hotseat extends CellLayout implements Insettable {
        }
        return event.getY() > getCellHeight();
    }

    @Override
    public void onVisibilityAggregated(boolean isVisible) {
        super.onVisibilityAggregated(isVisible);

        if (mOnVisibilityAggregatedCallback != null) {
            mOnVisibilityAggregatedCallback.accept(isVisible);
        }
    }

    /** Sets a callback to be called onVisibilityAggregated */
    public void setOnVisibilityAggregatedCallback(@Nullable Consumer<Boolean> callback) {
        mOnVisibilityAggregatedCallback = callback;
    }
}