import android.content.Context;
import android.content.res.TypedArray;
+import android.graphics.Rect;
import android.graphics.drawable.ColorDrawable;
import android.graphics.drawable.Drawable;
import android.graphics.drawable.InsetDrawable;
import com.android.launcher3.allapps.AllAppsContainerView;
import com.android.launcher3.config.FeatureFlags;
+import com.android.launcher3.util.TransformingTouchDelegate;
/**
* A base container view, which supports resizing.
protected int mContainerPaddingTop;
protected int mContainerPaddingBottom;
- private InsetDrawable mRevealDrawable;
protected final Drawable mBaseDrawable;
+ private final Rect mBgPaddingRect = new Rect();
private View mRevealView;
private View mContent;
+ private TransformingTouchDelegate mTouchDelegate;
+
public BaseContainerView(Context context) {
this(context, null);
}
DeviceProfile grid = Launcher.getLauncher(getContext()).getDeviceProfile();
grid.addLauncherLayoutChangedListener(this);
+
+ View touchDelegateTargetView = getTouchDelegateTargetView();
+ if (touchDelegateTargetView != null) {
+ mTouchDelegate = new TransformingTouchDelegate(touchDelegateTargetView);
+ ((View) touchDelegateTargetView.getParent()).setTouchDelegate(mTouchDelegate);
+ }
}
@Override
}
@Override
+ protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
+ super.onLayout(changed, left, top, right, bottom);
+ getRevealView().getBackground().getPadding(mBgPaddingRect);
+
+ View touchDelegateTargetView = getTouchDelegateTargetView();
+ if (touchDelegateTargetView != null) {
+ mTouchDelegate.setBounds(
+ touchDelegateTargetView.getLeft() - mBgPaddingRect.left,
+ touchDelegateTargetView.getTop() - mBgPaddingRect.top,
+ touchDelegateTargetView.getRight() + mBgPaddingRect.right,
+ touchDelegateTargetView.getBottom() + mBgPaddingRect.bottom);
+ }
+ }
+
+ @Override
public void onLauncherLayoutChanged() {
updatePaddings();
}
}
}
- mRevealDrawable = new InsetDrawable(mBaseDrawable,
+ InsetDrawable revealDrawable = new InsetDrawable(mBaseDrawable,
mContainerPaddingLeft, mContainerPaddingTop, mContainerPaddingRight,
mContainerPaddingBottom);
- mRevealView.setBackground(mRevealDrawable);
- if (FeatureFlags.LAUNCHER3_ALL_APPS_PULL_UP && this instanceof AllAppsContainerView) {
- // Skip updating the content background
- } else {
- mContent.setBackground(mRevealDrawable);
- }
+ mRevealView.setBackground(revealDrawable);
+ mContent.setBackground(revealDrawable);
}
+
+ public abstract View getTouchDelegateTargetView();
}
private View mSearchContainer;
private ExtendedEditText mSearchInput;
private HeaderElevationController mElevationController;
- private int mSearchContainerOffsetTop;
private SpannableStringBuilder mSearchQueryBuilder = null;
private int mSectionNamesMargin;
private int mNumAppsPerRow;
private int mNumPredictedAppsPerRow;
- private int mRecyclerViewBottomPadding;
// This coordinate is relative to this container view
private final Point mBoundsCheckLastTouchDownPos = new Point(-1, -1);
mLayoutManager = mAdapter.getLayoutManager();
mItemDecoration = mAdapter.getItemDecoration();
DeviceProfile grid = mLauncher.getDeviceProfile();
- if (FeatureFlags.LAUNCHER3_ALL_APPS_PULL_UP && !grid.isVerticalBarLayout()) {
- mRecyclerViewBottomPadding = 0;
- setPadding(0, 0, 0, 0);
- } else {
- mRecyclerViewBottomPadding =
- res.getDimensionPixelSize(R.dimen.all_apps_list_bottom_padding);
- }
mSearchQueryBuilder = new SpannableStringBuilder();
Selection.setSelection(mSearchQueryBuilder, 0);
}
0, 1, Spannable.SPAN_EXCLUSIVE_INCLUSIVE);
mSearchInput.setHint(spanned);
- mSearchContainerOffsetTop = getResources().getDimensionPixelSize(
- R.dimen.all_apps_search_bar_margin_top);
-
mElevationController = Utilities.ATLEAST_LOLLIPOP
? new HeaderElevationController.ControllerVL(mSearchContainer)
: new HeaderElevationController.ControllerV16(mSearchContainer);
}
@Override
+ public View getTouchDelegateTargetView() {
+ return mAppsRecyclerView;
+ }
+
+ @Override
public void onBoundsChanged(Rect newBounds) { }
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int widthPx = MeasureSpec.getSize(widthMeasureSpec);
int heightPx = MeasureSpec.getSize(heightMeasureSpec);
- updatePaddingsAndMargins(widthPx, heightPx);
mContentBounds.set(mContainerPaddingLeft, 0, widthPx - mContainerPaddingRight, heightPx);
DeviceProfile grid = mLauncher.getDeviceProfile();
mAppsRecyclerView.setNumAppsPerRow(grid, mNumAppsPerRow);
mAdapter.setNumAppsPerRow(mNumAppsPerRow);
mApps.setNumAppsPerRow(mNumAppsPerRow, mNumPredictedAppsPerRow, new FullMergeAlgorithm());
- if (mNumAppsPerRow > 0) {
- int rvPadding = mAppsRecyclerView.getPaddingStart(); // Assumes symmetry
- final int thumbMaxWidth =
- getResources().getDimensionPixelSize(
- R.dimen.container_fastscroll_thumb_max_width);
- mSearchContainer.setPadding(
- rvPadding - mContainerPaddingLeft + thumbMaxWidth,
- mSearchContainer.getPaddingTop(),
- rvPadding - mContainerPaddingRight + thumbMaxWidth,
- mSearchContainer.getPaddingBottom());
- }
+ }
+
+ if (!grid.isVerticalBarLayout()) {
+ View navBarBg = findViewById(R.id.nav_bar_bg);
+ ViewGroup.LayoutParams params = navBarBg.getLayoutParams();
+ params.height = mLauncher.getDragLayer().getInsets().bottom;
+ navBarBg.setLayoutParams(params);
+ navBarBg.setVisibility(View.VISIBLE);
}
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
return;
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}
- /**
- * Update the background and padding of the Apps view and children. Instead of insetting the
- * container view, we inset the background and padding of the recycler view to allow for the
- * recycler view to handle touch events (for fast scrolling) all the way to the edge.
- */
- private void updatePaddingsAndMargins(int widthPx, int heightPx) {
- Rect bgPadding = new Rect();
- getRevealView().getBackground().getPadding(bgPadding);
-
- mAppsRecyclerView.updateBackgroundPadding(bgPadding);
- mAdapter.updateBackgroundPadding(bgPadding);
- mElevationController.updateBackgroundPadding(bgPadding);
-
- // Pad the recycler view by the background padding plus the start margin (for the section
- // names)
- int maxScrollBarWidth = mAppsRecyclerView.getMaxScrollbarWidth();
- int startInset = Math.max(mSectionNamesMargin, maxScrollBarWidth);
- if (Utilities.isRtl(getResources())) {
- mAppsRecyclerView.setPadding(bgPadding.left + maxScrollBarWidth, 0, bgPadding.right
- + startInset, mRecyclerViewBottomPadding);
- } else {
- mAppsRecyclerView.setPadding(bgPadding.left + startInset, 0, bgPadding.right +
- maxScrollBarWidth, mRecyclerViewBottomPadding);
- }
-
- MarginLayoutParams lp = (MarginLayoutParams) mSearchContainer.getLayoutParams();
- lp.leftMargin = bgPadding.left;
- lp.rightMargin = bgPadding.right;
-
- // Clip the view to the left and right edge of the background to
- // to prevent shadows from rendering beyond the edges
- final Rect newClipBounds = new Rect(
- bgPadding.left, 0, widthPx - bgPadding.right, heightPx);
- setClipBounds(newClipBounds);
-
- // Allow the overscroll effect to reach the edges of the view
- mAppsRecyclerView.setClipToPadding(false);
-
- DeviceProfile grid = mLauncher.getDeviceProfile();
- if (FeatureFlags.LAUNCHER3_ALL_APPS_PULL_UP) {
- if (!grid.isVerticalBarLayout()) {
- MarginLayoutParams mlp = (MarginLayoutParams) mAppsRecyclerView.getLayoutParams();
-
- Rect insets = mLauncher.getDragLayer().getInsets();
- getContentView().setPadding(0, 0, 0, 0);
- int height = insets.top + grid.hotseatCellHeightPx;
-
- mlp.topMargin = height;
- mAppsRecyclerView.setLayoutParams(mlp);
-
- mSearchContainer.setPadding(
- mSearchContainer.getPaddingLeft(),
- insets.top + mSearchContainerOffsetTop,
- mSearchContainer.getPaddingRight(),
- mSearchContainer.getPaddingBottom());
- lp.height = height;
-
- View navBarBg = findViewById(R.id.nav_bar_bg);
- ViewGroup.LayoutParams params = navBarBg.getLayoutParams();
- params.height = insets.bottom;
- navBarBg.setLayoutParams(params);
- navBarBg.setVisibility(View.VISIBLE);
- }
- }
- mSearchContainer.setLayoutParams(lp);
- }
-
@Override
public boolean dispatchKeyEvent(KeyEvent event) {
// Determine if the key event was actual text, if so, focus the search bar and then dispatch
import android.graphics.Rect;
import android.graphics.drawable.Drawable;
import android.support.v7.widget.LinearLayoutManager;
-import android.support.v7.widget.RecyclerView.State;
import android.util.AttributeSet;
import android.util.Log;
import android.view.View;
import com.android.launcher3.userevent.nano.LauncherLogProto;
import com.android.launcher3.userevent.nano.LauncherLogProto.Target;
import com.android.launcher3.util.Thunk;
-import com.android.launcher3.util.TransformingTouchDelegate;
/**
* The widgets list view container.
private DragController mDragController;
private IconCache mIconCache;
- private final Rect mTmpBgPaddingRect = new Rect();
-
/* Recycler view related member variables */
private WidgetsRecyclerView mRecyclerView;
private WidgetsListAdapter mAdapter;
- private TransformingTouchDelegate mRecyclerViewTouchDelegate;
/* Touch handling related member variables. */
private Toast mWidgetInstructionToast;
}
@Override
- protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
- super.onLayout(changed, left, top, right, bottom);
- getRevealView().getBackground().getPadding(mTmpBgPaddingRect);
- mRecyclerViewTouchDelegate.setBounds(
- mRecyclerView.getLeft() - mTmpBgPaddingRect.left,
- mRecyclerView.getTop() - mTmpBgPaddingRect.top,
- mRecyclerView.getRight() + mTmpBgPaddingRect.right,
- mRecyclerView.getBottom() + mTmpBgPaddingRect.bottom);
+ public View getTouchDelegateTargetView() {
+ return mRecyclerView;
}
@Override
mRecyclerView = (WidgetsRecyclerView) getContentView().findViewById(R.id.widgets_list_view);
mRecyclerView.setAdapter(mAdapter);
mRecyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
- mRecyclerViewTouchDelegate = new TransformingTouchDelegate(mRecyclerView);
- }
-
- @Override
- protected void onAttachedToWindow() {
- super.onAttachedToWindow();
- ((View) mRecyclerView.getParent()).setTouchDelegate(mRecyclerViewTouchDelegate);
}
//