1 /* 2 * Copyright (C) 2019 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package com.android.launcher3.touch; 18 19 import static com.android.launcher3.LauncherAnimUtils.VIEW_TRANSLATE_X; 20 import static com.android.launcher3.LauncherAnimUtils.VIEW_TRANSLATE_Y; 21 import static com.android.launcher3.touch.SingleAxisSwipeDetector.VERTICAL; 22 23 import android.content.res.Resources; 24 import android.graphics.PointF; 25 import android.graphics.Rect; 26 import android.graphics.RectF; 27 import android.util.FloatProperty; 28 import android.view.MotionEvent; 29 import android.view.Surface; 30 import android.view.VelocityTracker; 31 import android.view.View; 32 import android.view.accessibility.AccessibilityEvent; 33 import android.widget.LinearLayout; 34 35 import com.android.launcher3.PagedView; 36 import com.android.launcher3.Utilities; 37 import com.android.launcher3.util.OverScroller; 38 39 public class PortraitPagedViewHandler implements PagedOrientationHandler { 40 41 @Override getPrimaryValue(int x, int y)42 public int getPrimaryValue(int x, int y) { 43 return x; 44 } 45 46 @Override getSecondaryValue(int x, int y)47 public int getSecondaryValue(int x, int y) { 48 return y; 49 } 50 51 @Override delegateScrollTo(PagedView pagedView, int secondaryScroll, int primaryScroll)52 public void delegateScrollTo(PagedView pagedView, int secondaryScroll, int primaryScroll) { 53 pagedView.superScrollTo(primaryScroll, secondaryScroll); 54 } 55 56 @Override delegateScrollBy(PagedView pagedView, int unboundedScroll, int x, int y)57 public void delegateScrollBy(PagedView pagedView, int unboundedScroll, int x, int y) { 58 pagedView.scrollTo(unboundedScroll + x, pagedView.getScrollY() + y); 59 } 60 61 @Override scrollerStartScroll(OverScroller scroller, int newPosition)62 public void scrollerStartScroll(OverScroller scroller, int newPosition) { 63 scroller.startScroll(newPosition - scroller.getCurrPos(), scroller.getCurrPos()); 64 } 65 66 @Override getCurveProperties(PagedView view, Rect insets, CurveProperties out)67 public void getCurveProperties(PagedView view, Rect insets, CurveProperties out) { 68 out.scroll = view.getScrollX(); 69 out.halfPageSize = view.getNormalChildWidth() / 2; 70 out.halfScreenSize = view.getMeasuredWidth() / 2; 71 out.screenCenter = insets.left + view.getPaddingLeft() + out.scroll + out.halfPageSize; 72 } 73 74 @Override isGoingUp(float displacement, boolean isRtl)75 public boolean isGoingUp(float displacement, boolean isRtl) { 76 // Ignore rtl since it only affects X value displacement, Y displacement doesn't change 77 return displacement < 0; 78 } 79 80 @Override isLayoutNaturalToLauncher()81 public boolean isLayoutNaturalToLauncher() { 82 return true; 83 } 84 85 @Override adjustFloatingIconStartVelocity(PointF velocity)86 public void adjustFloatingIconStartVelocity(PointF velocity) { 87 //no-op 88 } 89 90 @Override delegateScrollTo(PagedView pagedView, int primaryScroll)91 public void delegateScrollTo(PagedView pagedView, int primaryScroll) { 92 pagedView.superScrollTo(primaryScroll, pagedView.getScrollY()); 93 } 94 95 @Override set(T target, Int2DAction<T> action, int param)96 public <T> void set(T target, Int2DAction<T> action, int param) { 97 action.call(target, param, 0); 98 } 99 100 @Override set(T target, Float2DAction<T> action, float param)101 public <T> void set(T target, Float2DAction<T> action, float param) { 102 action.call(target, param, 0); 103 } 104 105 @Override getPrimaryDirection(MotionEvent event, int pointerIndex)106 public float getPrimaryDirection(MotionEvent event, int pointerIndex) { 107 return event.getX(pointerIndex); 108 } 109 110 @Override getPrimaryVelocity(VelocityTracker velocityTracker, int pointerId)111 public float getPrimaryVelocity(VelocityTracker velocityTracker, int pointerId) { 112 return velocityTracker.getXVelocity(pointerId); 113 } 114 115 @Override getMeasuredSize(View view)116 public int getMeasuredSize(View view) { 117 return view.getMeasuredWidth(); 118 } 119 120 @Override getPrimarySize(RectF rect)121 public float getPrimarySize(RectF rect) { 122 return rect.width(); 123 } 124 125 @Override getClearAllScrollOffset(View view, boolean isRtl)126 public int getClearAllScrollOffset(View view, boolean isRtl) { 127 return (isRtl ? view.getPaddingRight() : - view.getPaddingLeft()) / 2; 128 } 129 130 @Override getSecondaryDimension(View view)131 public int getSecondaryDimension(View view) { 132 return view.getHeight(); 133 } 134 135 @Override getPrimaryViewTranslate()136 public FloatProperty<View> getPrimaryViewTranslate() { 137 return VIEW_TRANSLATE_X; 138 } 139 140 @Override getSecondaryViewTranslate()141 public FloatProperty<View> getSecondaryViewTranslate() { 142 return VIEW_TRANSLATE_Y; 143 } 144 145 @Override setPrimaryAndResetSecondaryTranslate(View view, float translation)146 public void setPrimaryAndResetSecondaryTranslate(View view, float translation) { 147 view.setTranslationX(translation); 148 view.setTranslationY(0); 149 } 150 151 @Override getPrimaryScroll(View view)152 public int getPrimaryScroll(View view) { 153 return view.getScrollX(); 154 } 155 156 @Override getPrimaryScale(View view)157 public float getPrimaryScale(View view) { 158 return view.getScaleX(); 159 } 160 161 @Override setMaxScroll(AccessibilityEvent event, int maxScroll)162 public void setMaxScroll(AccessibilityEvent event, int maxScroll) { 163 event.setMaxScrollX(maxScroll); 164 } 165 166 @Override getRecentsRtlSetting(Resources resources)167 public boolean getRecentsRtlSetting(Resources resources) { 168 return !Utilities.isRtl(resources); 169 } 170 171 @Override getDegreesRotated()172 public float getDegreesRotated() { 173 return 0; 174 } 175 176 @Override getRotation()177 public int getRotation() { 178 return Surface.ROTATION_0; 179 } 180 181 @Override getChildStart(View view)182 public int getChildStart(View view) { 183 return view.getLeft(); 184 } 185 186 @Override getChildStartWithTranslation(View view)187 public float getChildStartWithTranslation(View view) { 188 return view.getLeft() + view.getTranslationX(); 189 } 190 191 @Override getCenterForPage(View view, Rect insets)192 public int getCenterForPage(View view, Rect insets) { 193 return (view.getPaddingTop() + view.getMeasuredHeight() + insets.top 194 - insets.bottom - view.getPaddingBottom()) / 2; 195 } 196 197 @Override getScrollOffsetStart(View view, Rect insets)198 public int getScrollOffsetStart(View view, Rect insets) { 199 return insets.left + view.getPaddingLeft(); 200 } 201 202 @Override getScrollOffsetEnd(View view, Rect insets)203 public int getScrollOffsetEnd(View view, Rect insets) { 204 return view.getWidth() - view.getPaddingRight() - insets.right; 205 } 206 207 @Override getOppositeSwipeDirection()208 public SingleAxisSwipeDetector.Direction getOppositeSwipeDirection() { 209 return VERTICAL; 210 } 211 212 @Override getTaskDismissDirectionFactor()213 public int getTaskDismissDirectionFactor() { 214 return -1; 215 } 216 217 @Override getTaskDragDisplacementFactor(boolean isRtl)218 public int getTaskDragDisplacementFactor(boolean isRtl) { 219 // Ignore rtl since it only affects X value displacement, Y displacement doesn't change 220 return 1; 221 } 222 223 @Override getTaskMenuX(float x, View thumbnailView)224 public float getTaskMenuX(float x, View thumbnailView) { 225 return x; 226 } 227 228 @Override getTaskMenuY(float y, View thumbnailView)229 public float getTaskMenuY(float y, View thumbnailView) { 230 return y; 231 } 232 233 @Override getTaskMenuWidth(View view)234 public int getTaskMenuWidth(View view) { 235 return view.getMeasuredWidth(); 236 } 237 238 @Override getTaskMenuLayoutOrientation(LinearLayout taskMenuLayout)239 public int getTaskMenuLayoutOrientation(LinearLayout taskMenuLayout) { 240 return taskMenuLayout.getOrientation(); 241 } 242 243 @Override setLayoutParamsForTaskMenuOptionItem(LinearLayout.LayoutParams lp)244 public void setLayoutParamsForTaskMenuOptionItem(LinearLayout.LayoutParams lp) { 245 // no-op, defaults are fine 246 } 247 248 @Override getChildBounds(View child, int childStart, int pageCenter, boolean layoutChild)249 public ChildBounds getChildBounds(View child, int childStart, int pageCenter, 250 boolean layoutChild) { 251 final int childWidth = child.getMeasuredWidth(); 252 final int childRight = childStart + childWidth; 253 final int childHeight = child.getMeasuredHeight(); 254 final int childTop = pageCenter - childHeight / 2; 255 if (layoutChild) { 256 child.layout(childStart, childTop, childRight, childTop + childHeight); 257 } 258 return new ChildBounds(childWidth, childHeight, childRight, childTop); 259 } 260 } 261