b66675a36d
=> Before this change, scrolling horizontally on the the hotseat area was a no-op => This is a mild usability issue (or arguably WAI) for the default grid, but for larger grids it feels really broken as you have to reach very high just to scroll to another page. issue 156507399 Test: manual. Also verified that swipe up still works and goes through the same code path. Change-Id: I760aca473dd36bc8cfb906cb58e897e2ab7fd1d9
149 lines
5.1 KiB
Java
149 lines
5.1 KiB
Java
/*
|
|
* Copyright (C) 2011 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;
|
|
|
|
import static com.android.launcher3.logging.LoggerUtils.newContainerTarget;
|
|
|
|
import android.content.Context;
|
|
import android.graphics.Rect;
|
|
import android.util.AttributeSet;
|
|
import android.view.Gravity;
|
|
import android.view.MotionEvent;
|
|
import android.view.ViewDebug;
|
|
import android.view.ViewGroup;
|
|
import android.widget.FrameLayout;
|
|
|
|
import com.android.launcher3.logging.StatsLogUtils.LogContainerProvider;
|
|
import com.android.launcher3.model.data.ItemInfo;
|
|
import com.android.launcher3.userevent.nano.LauncherLogProto;
|
|
import com.android.launcher3.userevent.nano.LauncherLogProto.Target;
|
|
|
|
import java.util.ArrayList;
|
|
|
|
public class Hotseat extends CellLayout implements LogContainerProvider, Insettable {
|
|
|
|
@ViewDebug.ExportedProperty(category = "launcher")
|
|
private boolean mHasVerticalHotseat;
|
|
private Workspace mWorkspace;
|
|
private boolean mSendTouchToWorkspace;
|
|
|
|
public Hotseat(Context context) {
|
|
this(context, null);
|
|
}
|
|
|
|
public Hotseat(Context context, AttributeSet attrs) {
|
|
this(context, attrs, 0);
|
|
}
|
|
|
|
public Hotseat(Context context, AttributeSet attrs, int defStyle) {
|
|
super(context, attrs, defStyle);
|
|
}
|
|
|
|
/**
|
|
* Returns orientation specific cell X given invariant order in the hotseat
|
|
*/
|
|
public int getCellXFromOrder(int rank) {
|
|
return mHasVerticalHotseat ? 0 : rank;
|
|
}
|
|
|
|
/**
|
|
* Returns orientation specific cell Y given invariant order in the hotseat
|
|
*/
|
|
public int getCellYFromOrder(int rank) {
|
|
return mHasVerticalHotseat ? (getCountY() - (rank + 1)) : 0;
|
|
}
|
|
|
|
public void resetLayout(boolean hasVerticalHotseat) {
|
|
removeAllViewsInLayout();
|
|
mHasVerticalHotseat = hasVerticalHotseat;
|
|
InvariantDeviceProfile idp = mActivity.getDeviceProfile().inv;
|
|
if (hasVerticalHotseat) {
|
|
setGridSize(1, idp.numHotseatIcons);
|
|
} else {
|
|
setGridSize(idp.numHotseatIcons, 1);
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public void fillInLogContainerData(ItemInfo childInfo, Target child,
|
|
ArrayList<Target> parents) {
|
|
child.rank = childInfo.rank;
|
|
child.gridX = childInfo.cellX;
|
|
child.gridY = childInfo.cellY;
|
|
parents.add(newContainerTarget(LauncherLogProto.ContainerType.HOTSEAT));
|
|
}
|
|
|
|
@Override
|
|
public void setInsets(Rect insets) {
|
|
FrameLayout.LayoutParams lp = (FrameLayout.LayoutParams) getLayoutParams();
|
|
DeviceProfile grid = mActivity.getDeviceProfile();
|
|
insets = grid.getInsets();
|
|
|
|
if (grid.isVerticalBarLayout()) {
|
|
lp.height = ViewGroup.LayoutParams.MATCH_PARENT;
|
|
if (grid.isSeascape()) {
|
|
lp.gravity = Gravity.LEFT;
|
|
lp.width = grid.hotseatBarSizePx + insets.left;
|
|
} else {
|
|
lp.gravity = Gravity.RIGHT;
|
|
lp.width = grid.hotseatBarSizePx + insets.right;
|
|
}
|
|
} else {
|
|
lp.gravity = Gravity.BOTTOM;
|
|
lp.width = ViewGroup.LayoutParams.MATCH_PARENT;
|
|
lp.height = grid.hotseatBarSizePx + insets.bottom;
|
|
}
|
|
Rect padding = grid.getHotseatLayoutPadding();
|
|
setPadding(padding.left, padding.top, padding.right, padding.bottom);
|
|
|
|
setLayoutParams(lp);
|
|
InsettableFrameLayout.dispatchInsets(this, insets);
|
|
}
|
|
|
|
public void setWorkspace(Workspace w) {
|
|
mWorkspace = w;
|
|
}
|
|
|
|
@Override
|
|
public boolean onInterceptTouchEvent(MotionEvent ev) {
|
|
// We allow horizontal workspace scrolling from within the Hotseat. We do this by delegating
|
|
// touch intercept the Workspace, and if it intercepts, delegating touch to the Workspace
|
|
// for the remainder of the this input stream.
|
|
int yThreshold = getMeasuredHeight() - getPaddingBottom();
|
|
if (mWorkspace != null && ev.getY() <= yThreshold) {
|
|
mSendTouchToWorkspace = mWorkspace.onInterceptTouchEvent(ev);
|
|
return mSendTouchToWorkspace;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
@Override
|
|
public boolean onTouchEvent(MotionEvent event) {
|
|
// See comment in #onInterceptTouchEvent
|
|
if (mSendTouchToWorkspace) {
|
|
final int action = event.getAction();
|
|
switch (action & MotionEvent.ACTION_MASK) {
|
|
case MotionEvent.ACTION_UP:
|
|
case MotionEvent.ACTION_CANCEL:
|
|
mSendTouchToWorkspace = false;
|
|
}
|
|
return mWorkspace.onTouchEvent(event);
|
|
}
|
|
return event.getY() > getCellHeight();
|
|
}
|
|
}
|