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