/* * 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 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(); } }