| /* |
| * 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.anim.SpringAnimationHandler; |
| 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.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().isLandscape) { |
| 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 void initSprings() { |
| mSpringHandlers = new SpringAnimationHandler[0]; |
| } |
| |
| @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; |
| } |
| } |
| } |