mirror of
https://github.com/LawnchairLauncher/lawnchair.git
synced 2026-03-04 09:56:49 +00:00
The fixes are:
1. For widgets shown in TableRow, aligns them center vertically.
This is useful when widgets of different height are shown in
the same row.
2. Remove background color from WidgetCell
3. Re-enable swipe in FullWidgetsSheet
4. Use the WidgetCell image as the single & long press area because
1. Previews are now scaled to their default size. The touch area
should already be larger for widgets that are bigger than 2.4
cells
2. WidgetCells also render description. If the user long press the
description area, the drag view will not align in the middle of
the user touch / drag area.
Test: Drag-n-drop widgets from FullWidgetsSheet, BottomWidgetsSheet
and pin widget flow.
In FullWidgetsSheet, swipe left and right to switch work /
personal tab.
Video: https://drive.google.com/file/d/1Ur7PwF1a7iwGGRTZczfc0BSVu-Ta6-Vm/view?usp=sharing
Bug: 179797520
Change-Id: I6fe4bc88d1e1b35b1819d8d7f046105f5ed27043
213 lines
7.9 KiB
Java
213 lines
7.9 KiB
Java
/*
|
|
* Copyright (C) 2017 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.widget;
|
|
|
|
import static com.android.launcher3.anim.Interpolators.FAST_OUT_SLOW_IN;
|
|
|
|
import android.animation.PropertyValuesHolder;
|
|
import android.content.Context;
|
|
import android.graphics.Rect;
|
|
import android.util.AttributeSet;
|
|
import android.util.IntProperty;
|
|
import android.util.Pair;
|
|
import android.view.Gravity;
|
|
import android.view.LayoutInflater;
|
|
import android.view.View;
|
|
import android.view.ViewGroup;
|
|
import android.view.animation.Interpolator;
|
|
import android.widget.ScrollView;
|
|
import android.widget.TableLayout;
|
|
import android.widget.TableRow;
|
|
import android.widget.TextView;
|
|
|
|
import com.android.launcher3.DeviceProfile;
|
|
import com.android.launcher3.Insettable;
|
|
import com.android.launcher3.LauncherAppState;
|
|
import com.android.launcher3.R;
|
|
import com.android.launcher3.anim.PendingAnimation;
|
|
import com.android.launcher3.model.WidgetItem;
|
|
import com.android.launcher3.model.data.ItemInfo;
|
|
import com.android.launcher3.util.PackageUserKey;
|
|
import com.android.launcher3.widget.util.WidgetsTableUtils;
|
|
|
|
import java.util.List;
|
|
|
|
/**
|
|
* Bottom sheet for the "Widgets" system shortcut in the long-press popup.
|
|
*/
|
|
public class WidgetsBottomSheet extends BaseWidgetSheet implements Insettable {
|
|
|
|
private static final IntProperty<View> PADDING_BOTTOM =
|
|
new IntProperty<View>("paddingBottom") {
|
|
@Override
|
|
public void setValue(View view, int paddingBottom) {
|
|
view.setPadding(view.getPaddingLeft(), view.getPaddingTop(),
|
|
view.getPaddingRight(), paddingBottom);
|
|
}
|
|
|
|
@Override
|
|
public Integer get(View view) {
|
|
return view.getPaddingBottom();
|
|
}
|
|
};
|
|
|
|
private static final int DEFAULT_CLOSE_DURATION = 200;
|
|
private ItemInfo mOriginalItemInfo;
|
|
private Rect mInsets;
|
|
private final int mMaxTableHeight;
|
|
private int mMaxHorizontalSpan = 4;
|
|
|
|
public WidgetsBottomSheet(Context context, AttributeSet attrs) {
|
|
this(context, attrs, 0);
|
|
}
|
|
|
|
public WidgetsBottomSheet(Context context, AttributeSet attrs, int defStyleAttr) {
|
|
super(context, attrs, defStyleAttr);
|
|
setWillNotDraw(false);
|
|
mInsets = new Rect();
|
|
mContent = this;
|
|
DeviceProfile deviceProfile = mLauncher.getDeviceProfile();
|
|
// Set the max table height to 2 / 3 of the grid height so that the bottom picker won't
|
|
// take over the entire view vertically.
|
|
mMaxTableHeight = deviceProfile.inv.numRows * 2 / 3 * deviceProfile.cellHeightPx;
|
|
}
|
|
|
|
@Override
|
|
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
|
|
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
|
|
|
|
int paddingPx = 2 * getResources().getDimensionPixelOffset(
|
|
R.dimen.widget_cell_horizontal_padding);
|
|
int maxHorizontalSpan = findViewById(R.id.widgets_table).getMeasuredWidth()
|
|
/ (mLauncher.getDeviceProfile().cellWidthPx + paddingPx);
|
|
|
|
if (mMaxHorizontalSpan != maxHorizontalSpan) {
|
|
// Ensure the table layout is showing widgets in the right column after measure.
|
|
mMaxHorizontalSpan = maxHorizontalSpan;
|
|
onWidgetsBound();
|
|
}
|
|
}
|
|
|
|
@Override
|
|
protected void onLayout(boolean changed, int l, int t, int r, int b) {
|
|
super.onLayout(changed, l, t, r, b);
|
|
setTranslationShift(mTranslationShift);
|
|
|
|
// Ensure the scroll view height is not larger than mMaxTableHeight, which is a value
|
|
// smaller than the entire screen height.
|
|
ScrollView widgetsTableScrollView = findViewById(R.id.widgets_table_scroll_view);
|
|
if (widgetsTableScrollView.getMeasuredHeight() > mMaxTableHeight) {
|
|
ViewGroup.LayoutParams layoutParams = widgetsTableScrollView.getLayoutParams();
|
|
layoutParams.height = mMaxTableHeight;
|
|
widgetsTableScrollView.setLayoutParams(layoutParams);
|
|
}
|
|
}
|
|
|
|
public void populateAndShow(ItemInfo itemInfo) {
|
|
mOriginalItemInfo = itemInfo;
|
|
((TextView) findViewById(R.id.title)).setText(getContext().getString(
|
|
R.string.widgets_bottom_sheet_title, mOriginalItemInfo.title));
|
|
|
|
onWidgetsBound();
|
|
attachToContainer();
|
|
mIsOpen = false;
|
|
animateOpen();
|
|
}
|
|
|
|
@Override
|
|
public void onWidgetsBound() {
|
|
List<WidgetItem> widgets = mLauncher.getPopupDataProvider().getWidgetsForPackageUser(
|
|
new PackageUserKey(
|
|
mOriginalItemInfo.getTargetComponent().getPackageName(),
|
|
mOriginalItemInfo.user));
|
|
|
|
TableLayout widgetsTable = findViewById(R.id.widgets_table);
|
|
widgetsTable.removeAllViews();
|
|
|
|
WidgetsTableUtils.groupWidgetItemsIntoTable(widgets, mMaxHorizontalSpan).forEach(row -> {
|
|
TableRow tableRow = new TableRow(getContext());
|
|
tableRow.setGravity(Gravity.CENTER_VERTICAL);
|
|
row.forEach(widgetItem -> {
|
|
WidgetCell widget = addItemCell(tableRow);
|
|
widget.setPreviewSize(widgetItem.spanX, widgetItem.spanY);
|
|
widget.applyFromCellItem(widgetItem, LauncherAppState.getInstance(mLauncher)
|
|
.getWidgetCache());
|
|
widget.ensurePreview();
|
|
widget.setVisibility(View.VISIBLE);
|
|
});
|
|
widgetsTable.addView(tableRow);
|
|
});
|
|
}
|
|
|
|
protected WidgetCell addItemCell(ViewGroup parent) {
|
|
WidgetCell widget = (WidgetCell) LayoutInflater.from(getContext())
|
|
.inflate(R.layout.widget_cell, parent, false);
|
|
|
|
WidgetImageView preview = widget.findViewById(R.id.widget_preview);
|
|
preview.setOnClickListener(this);
|
|
preview.setOnLongClickListener(this);
|
|
widget.setAnimatePreview(false);
|
|
|
|
parent.addView(widget);
|
|
return widget;
|
|
}
|
|
|
|
private void animateOpen() {
|
|
if (mIsOpen || mOpenCloseAnimator.isRunning()) {
|
|
return;
|
|
}
|
|
mIsOpen = true;
|
|
setupNavBarColor();
|
|
mOpenCloseAnimator.setValues(
|
|
PropertyValuesHolder.ofFloat(TRANSLATION_SHIFT, TRANSLATION_SHIFT_OPENED));
|
|
mOpenCloseAnimator.setInterpolator(FAST_OUT_SLOW_IN);
|
|
mOpenCloseAnimator.start();
|
|
}
|
|
|
|
@Override
|
|
protected void handleClose(boolean animate) {
|
|
handleClose(animate, DEFAULT_CLOSE_DURATION);
|
|
}
|
|
|
|
@Override
|
|
protected boolean isOfType(@FloatingViewType int type) {
|
|
return (type & TYPE_WIDGETS_BOTTOM_SHEET) != 0;
|
|
}
|
|
|
|
@Override
|
|
public void setInsets(Rect insets) {
|
|
// Extend behind left, right, and bottom insets.
|
|
int leftInset = insets.left - mInsets.left;
|
|
int rightInset = insets.right - mInsets.right;
|
|
int bottomInset = insets.bottom - mInsets.bottom;
|
|
mInsets.set(insets);
|
|
setPadding(leftInset, getPaddingTop(), rightInset, bottomInset);
|
|
}
|
|
|
|
@Override
|
|
protected Pair<View, String> getAccessibilityTarget() {
|
|
return Pair.create(findViewById(R.id.title), getContext().getString(
|
|
mIsOpen ? R.string.widgets_list : R.string.widgets_list_closed));
|
|
}
|
|
|
|
@Override
|
|
public void addHintCloseAnim(
|
|
float distanceToMove, Interpolator interpolator, PendingAnimation target) {
|
|
target.setInt(this, PADDING_BOTTOM, (int) (distanceToMove + mInsets.bottom), interpolator);
|
|
}
|
|
}
|