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

Commit 2e38cf48 authored by Sunny Goyal's avatar Sunny Goyal Committed by Android (Google) Code Review
Browse files

Merge "Changing the overviewState to show appsearch and floating header" into ub-launcher3-master

parents 6742b3a5 7185dd63
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -85,8 +85,8 @@ public class AllAppsState extends LauncherState {
    }

    @Override
    public float getHoseatAlpha(Launcher launcher) {
        return 0;
    public int getVisibleElements(Launcher launcher) {
        return ALL_APPS_HEADER | ALL_APPS_CONTENT;
    }

    @Override
+0 −92
Original line number Diff line number Diff line
/*
 * Copyright (C) 2017 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package com.android.launcher3.uioverrides;

import com.android.launcher3.Alarm;
import com.android.launcher3.OnAlarmListener;

/**
 * Utility class to detect a pause during a drag.
 */
public class DragPauseDetector implements OnAlarmListener {

    private static final float MAX_VELOCITY_TO_PAUSE = 0.2f;
    private static final long PAUSE_DURATION = 100;

    private final Alarm mAlarm;
    private final Runnable mOnPauseCallback;

    private boolean mTriggered = false;
    private int mDisabledFlags = 0;

    public DragPauseDetector(Runnable onPauseCallback) {
        mOnPauseCallback = onPauseCallback;

        mAlarm = new Alarm();
        mAlarm.setOnAlarmListener(this);
        mAlarm.setAlarm(PAUSE_DURATION);
    }

    public void onDrag(float velocity) {
        if (mTriggered || !isEnabled()) {
            return;
        }

        if (Math.abs(velocity) > MAX_VELOCITY_TO_PAUSE) {
            // Cancel any previous alarm and set a new alarm
            mAlarm.setAlarm(PAUSE_DURATION);
        }
    }

    @Override
    public void onAlarm(Alarm alarm) {
        if (!mTriggered && isEnabled()) {
            mTriggered = true;
            mOnPauseCallback.run();
        }
    }

    public boolean isTriggered () {
        return mTriggered;
    }

    public boolean isEnabled() {
        return mDisabledFlags == 0;
    }

    public void addDisabledFlags(int flags) {
        boolean wasEnabled = isEnabled();
        mDisabledFlags |= flags;
        resetAlarm(wasEnabled);
    }

    public void clearDisabledFlags(int flags) {
        boolean wasEnabled = isEnabled();
        mDisabledFlags  &= ~flags;
        resetAlarm(wasEnabled);
    }

    private void resetAlarm(boolean wasEnabled) {
        boolean isEnabled = isEnabled();
        if (wasEnabled == isEnabled) {
          // Nothing has changed
        } if (isEnabled && !mTriggered) {
            mAlarm.setAlarm(PAUSE_DURATION);
        } else if (!isEnabled) {
            mAlarm.cancelAlarm();
        }
    }
}
+0 −165
Original line number Diff line number Diff line
/*
 * Copyright (C) 2018 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package com.android.launcher3.uioverrides;

import static com.android.launcher3.LauncherState.NORMAL;
import static com.android.launcher3.LauncherState.OVERVIEW;
import static com.android.launcher3.touch.SwipeDetector.DIRECTION_NEGATIVE;
import static com.android.launcher3.touch.SwipeDetector.DIRECTION_POSITIVE;
import static com.android.launcher3.touch.SwipeDetector.HORIZONTAL;
import static com.android.launcher3.touch.SwipeDetector.VERTICAL;
import static com.android.quickstep.TouchInteractionService.EDGE_NAV_BAR;

import android.graphics.Rect;
import android.metrics.LogMaker;
import android.view.MotionEvent;

import com.android.launcher3.DeviceProfile;
import com.android.launcher3.DeviceProfile.OnDeviceProfileChangeListener;
import com.android.launcher3.Launcher;
import com.android.launcher3.LauncherState;
import com.android.launcher3.dragndrop.DragLayer;
import com.android.launcher3.userevent.nano.LauncherLogProto.Action.Touch;
import com.android.launcher3.userevent.nano.LauncherLogProto.Action.Direction;
import com.android.launcher3.userevent.nano.LauncherLogProto.ContainerType;
import com.android.launcher3.util.VerticalSwipeController;
import com.android.quickstep.views.RecentsView;

class EventLogTags {
    private EventLogTags() {
    }  // don't instantiate

    /** 524292 sysui_multi_action (content|4) */
    public static final int SYSUI_MULTI_ACTION = 524292;

    public static void writeSysuiMultiAction(Object[] content) {
        android.util.EventLog.writeEvent(SYSUI_MULTI_ACTION, content);
    }
}

class MetricsLogger {
    private static MetricsLogger sMetricsLogger;

    private static MetricsLogger getLogger() {
        if (sMetricsLogger == null) {
            sMetricsLogger = new MetricsLogger();
        }
        return sMetricsLogger;
    }

    protected void saveLog(Object[] rep) {
        EventLogTags.writeSysuiMultiAction(rep);
    }

    public void write(LogMaker content) {
        if (content.getType() == 0/*MetricsEvent.TYPE_UNKNOWN*/) {
            content.setType(4/*MetricsEvent.TYPE_ACTION*/);
        }
        saveLog(content.serialize());
    }
}

/**
 * Extension of {@link VerticalSwipeController} to go from NORMAL to OVERVIEW.
 */
public class EdgeSwipeController extends VerticalSwipeController implements
        OnDeviceProfileChangeListener {

    private static final Rect sTempRect = new Rect();

    private final MetricsLogger mMetricsLogger = new MetricsLogger();

    public EdgeSwipeController(Launcher l) {
        super(l, NORMAL, OVERVIEW, l.getDeviceProfile().isVerticalBarLayout()
                ? HORIZONTAL : VERTICAL);
        l.addOnDeviceProfileChangeListener(this);
    }

    @Override
    public void onDeviceProfileChanged(DeviceProfile dp) {
        mDetector.updateDirection(dp.isVerticalBarLayout() ? HORIZONTAL : VERTICAL);
    }

    @Override
    protected boolean shouldInterceptTouch(MotionEvent ev) {
        return mLauncher.isInState(NORMAL) && (ev.getEdgeFlags() & EDGE_NAV_BAR) != 0;
    }

    @Override
    protected int getSwipeDirection(MotionEvent ev) {
        return isTransitionFlipped() ? DIRECTION_NEGATIVE : DIRECTION_POSITIVE;
    }

    public EdgeSwipeController(Launcher l, LauncherState baseState) {
        super(l, baseState);
    }

    @Override
    protected boolean isTransitionFlipped() {
        return mLauncher.getDeviceProfile().isSeascape();
    }

    @Override
    protected void onTransitionComplete(boolean wasFling, boolean stateChanged) {
        if (stateChanged && mToState instanceof OverviewState) {
            // Mimic ActivityMetricsLogger.logAppTransitionMultiEvents() logging for
            // "Recents" activity for app transition tests.
            final LogMaker builder = new LogMaker(761/*APP_TRANSITION*/);
            builder.setPackageName("com.android.systemui");
            builder.addTaggedData(871/*FIELD_CLASS_NAME*/,
                    "com.android.systemui.recents.RecentsActivity");
            builder.addTaggedData(319/*APP_TRANSITION_DELAY_MS*/,
                    0/* zero time */);
            mMetricsLogger.write(builder);

            // Add user event logging for launcher pipeline
            int direction = Direction.UP;
            if (mLauncher.getDeviceProfile().isVerticalBarLayout()) {
                direction = Direction.LEFT;
                if (mLauncher.getDeviceProfile().isSeascape()) {
                    direction = Direction.RIGHT;
                }
            }
            mLauncher.getUserEventDispatcher().logStateChangeAction(
                    wasFling ? Touch.FLING : Touch.SWIPE, direction,
                    ContainerType.NAVBAR, ContainerType.WORKSPACE, // src target
                    ContainerType.TASKSWITCHER,                    // dst target
                    mLauncher.getWorkspace().getCurrentPage());
        }
    }

    @Override
    protected float getShiftRange() {
        return getShiftRange(mLauncher);
    }

    public static float getShiftRange(Launcher launcher) {
        RecentsView.getPageRect(launcher.getDeviceProfile(), launcher, sTempRect);
        DragLayer dl = launcher.getDragLayer();
        Rect insets = dl.getInsets();
        DeviceProfile dp = launcher.getDeviceProfile();

        if (dp.isVerticalBarLayout()) {
            if (dp.isSeascape()) {
                return insets.left + sTempRect.left;
            } else {
                return dl.getWidth() - sTempRect.right + insets.right;
            }
        } else {
            return dl.getHeight() - sTempRect.bottom + insets.bottom;
        }
    }
}
+3 −3
Original line number Diff line number Diff line
@@ -41,10 +41,10 @@ public class FastOverviewState extends OverviewState {
    }

    @Override
    public float getHoseatAlpha(Launcher launcher) {
    public int getVisibleElements(Launcher launcher) {
        if (DEBUG_DIFFERENT_UI) {
            return 0;
            return NONE;
        }
        return super.getHoseatAlpha(launcher);
        return super.getVisibleElements(launcher);
    }
}
+71 −0
Original line number Diff line number Diff line
package com.android.launcher3.uioverrides;

import static com.android.launcher3.LauncherState.NORMAL;
import static com.android.launcher3.LauncherState.OVERVIEW;
import static com.android.quickstep.TouchInteractionService.EDGE_NAV_BAR;

import android.view.MotionEvent;

import com.android.launcher3.AbstractFloatingView;
import com.android.launcher3.Launcher;
import com.android.launcher3.LauncherState;
import com.android.launcher3.touch.AbstractStateChangeTouchController;
import com.android.launcher3.touch.SwipeDetector;
import com.android.launcher3.userevent.nano.LauncherLogProto.Action.Direction;
import com.android.quickstep.util.SysuiEventLogger;

/**
 * Touch controller for handling edge swipes in landscape/seascape UI
 */
public class LandscapeEdgeSwipeController extends AbstractStateChangeTouchController {

    public LandscapeEdgeSwipeController(Launcher l) {
        super(l, SwipeDetector.HORIZONTAL);
    }

    @Override
    protected boolean canInterceptTouch(MotionEvent ev) {
        if (mCurrentAnimation != null) {
            // If we are already animating from a previous state, we can intercept.
            return true;
        }
        if (AbstractFloatingView.getTopOpenView(mLauncher) != null) {
            return false;
        }
        return mLauncher.isInState(NORMAL) && (ev.getEdgeFlags() & EDGE_NAV_BAR) != 0;
    }

    @Override
    protected int getSwipeDirection(MotionEvent ev) {
        mFromState = NORMAL;
        mToState = OVERVIEW;
        return SwipeDetector.DIRECTION_BOTH;
    }

    @Override
    protected float getShiftRange() {
        return mLauncher.getDragLayer().getWidth();
    }

    @Override
    protected float initCurrentAnimation() {
        float range = getShiftRange();
        long maxAccuracy = (long) (2 * range);
        mCurrentAnimation = mLauncher.getStateManager()
                .createAnimationToNewWorkspace(mToState, maxAccuracy);
        return (mLauncher.getDeviceProfile().isSeascape() ? 2 : -2) / range;
    }

    @Override
    protected int getDirectionForLog() {
        return mLauncher.getDeviceProfile().isSeascape() ? Direction.RIGHT : Direction.LEFT;
    }

    @Override
    protected void onSwipeInteractionCompleted(LauncherState targetState, int logAction) {
        super.onSwipeInteractionCompleted(targetState, logAction);
        if (mFromState == NORMAL && targetState == OVERVIEW) {
            SysuiEventLogger.writeDummyRecentsTransition(0);
        }
    }
}
Loading