Merge "Consistent scrolling experience for All apps and widget tray" into ub-launcher3-burnaby
This commit is contained in:
committed by
Android (Google) Code Review
commit
7b3bdcd6bb
@@ -39,7 +39,6 @@
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:background="@drawable/quantum_panel_dark"
|
||||
android:scrollbars="vertical"
|
||||
android:elevation="15dp"
|
||||
android:visibility="gone" />
|
||||
|
||||
|
||||
@@ -61,7 +61,6 @@
|
||||
<dimen name="all_apps_prediction_icon_top_bottom_padding">12dp</dimen>
|
||||
|
||||
<dimen name="all_apps_fast_scroll_bar_width">4dp</dimen>
|
||||
<dimen name="all_apps_fast_scroll_bar_min_height">64dp</dimen>
|
||||
<dimen name="all_apps_fast_scroll_scrubber_touch_inset">-16dp</dimen>
|
||||
<dimen name="all_apps_fast_scroll_popup_size">72dp</dimen>
|
||||
<dimen name="all_apps_fast_scroll_text_size">48dp</dimen>
|
||||
|
||||
@@ -86,10 +86,8 @@ public class BaseRecyclerView extends RecyclerView
|
||||
|
||||
private int mDownX;
|
||||
private int mDownY;
|
||||
private int mLastX;
|
||||
private int mLastY;
|
||||
private int mScrollbarWidth;
|
||||
private int mScrollbarMinHeight;
|
||||
private int mScrollbarInset;
|
||||
private Rect mBackgroundPadding = new Rect();
|
||||
|
||||
@@ -121,8 +119,6 @@ public class BaseRecyclerView extends RecyclerView
|
||||
mFastScrollTextPaint.setTextSize(res.getDimensionPixelSize(
|
||||
R.dimen.all_apps_fast_scroll_text_size));
|
||||
mScrollbarWidth = res.getDimensionPixelSize(R.dimen.all_apps_fast_scroll_bar_width);
|
||||
mScrollbarMinHeight =
|
||||
res.getDimensionPixelSize(R.dimen.all_apps_fast_scroll_bar_min_height);
|
||||
mScrollbarInset =
|
||||
res.getDimensionPixelSize(R.dimen.all_apps_fast_scroll_scrubber_touch_inset);
|
||||
setFastScrollerAlpha(mFastScrollAlpha);
|
||||
@@ -173,7 +169,7 @@ public class BaseRecyclerView extends RecyclerView
|
||||
switch (action) {
|
||||
case MotionEvent.ACTION_DOWN:
|
||||
// Keep track of the down positions
|
||||
mDownX = mLastX = x;
|
||||
mDownX = x;
|
||||
mDownY = mLastY = y;
|
||||
if (shouldStopScroll(ev)) {
|
||||
stopScroll();
|
||||
@@ -188,7 +184,6 @@ public class BaseRecyclerView extends RecyclerView
|
||||
animateFastScrollerVisibility(true);
|
||||
}
|
||||
if (mDraggingFastScroller) {
|
||||
mLastX = x;
|
||||
mLastY = y;
|
||||
|
||||
// Scroll to the right position, and update the section name
|
||||
|
||||
@@ -16,7 +16,6 @@
|
||||
|
||||
package com.android.launcher3.model;
|
||||
|
||||
import android.content.ComponentName;
|
||||
import android.graphics.Bitmap;
|
||||
|
||||
import com.android.launcher3.ItemInfo;
|
||||
@@ -27,7 +26,6 @@ import java.util.Arrays;
|
||||
* Represents a {@link Package} in the widget tray section.
|
||||
*/
|
||||
public class PackageItemInfo extends ItemInfo {
|
||||
private static final String TAG = "PackageInfo";
|
||||
|
||||
/**
|
||||
* A bitmap version of the application icon.
|
||||
@@ -35,12 +33,21 @@ public class PackageItemInfo extends ItemInfo {
|
||||
public Bitmap iconBitmap;
|
||||
|
||||
/**
|
||||
* Indicates whether we're using a low res icon
|
||||
* Indicates whether we're using a low res icon.
|
||||
*/
|
||||
public boolean usingLowResIcon;
|
||||
|
||||
/**
|
||||
* Package name of the {@link ItemInfo}.
|
||||
*/
|
||||
public String packageName;
|
||||
|
||||
/**
|
||||
* Character that is used as a section name for the {@link ItemInfo#title}.
|
||||
* (e.g., "G" will be stored if title is "Google")
|
||||
*/
|
||||
public String titleSectionName;
|
||||
|
||||
int flags = 0;
|
||||
|
||||
PackageItemInfo(String packageName) {
|
||||
|
||||
@@ -10,6 +10,7 @@ import com.android.launcher3.LauncherAppState;
|
||||
import com.android.launcher3.LauncherAppWidgetProviderInfo;
|
||||
|
||||
import com.android.launcher3.Utilities;
|
||||
import com.android.launcher3.compat.AlphabeticIndexCompat;
|
||||
import com.android.launcher3.compat.UserHandleCompat;
|
||||
|
||||
import java.util.ArrayList;
|
||||
@@ -39,11 +40,13 @@ public class WidgetsModel {
|
||||
private final Comparator mWidgetAndShortcutNameComparator;
|
||||
private final Comparator mAppNameComparator;
|
||||
private final IconCache mIconCache;
|
||||
private AlphabeticIndexCompat mIndexer;
|
||||
|
||||
public WidgetsModel(Context context) {
|
||||
mWidgetAndShortcutNameComparator = new WidgetsAndShortcutNameComparator(context);
|
||||
mAppNameComparator = (new AppNameComparator(context)).getAppInfoComparator();
|
||||
mIconCache = LauncherAppState.getInstance().getIconCache();
|
||||
mIndexer = new AlphabeticIndexCompat(context);
|
||||
}
|
||||
|
||||
private WidgetsModel(WidgetsModel model) {
|
||||
@@ -62,6 +65,9 @@ public class WidgetsModel {
|
||||
|
||||
// Access methods that may be deleted if the private fields are made package-private.
|
||||
public PackageItemInfo getPackageItemInfo(int pos) {
|
||||
if (pos >= mPackageItemInfos.size() || pos < 0) {
|
||||
return null;
|
||||
}
|
||||
return mPackageItemInfos.get(pos);
|
||||
}
|
||||
|
||||
@@ -112,6 +118,7 @@ public class WidgetsModel {
|
||||
pInfo = new PackageItemInfo(packageName);
|
||||
mIconCache.getTitleAndIconForApp(packageName, UserHandleCompat.myUserHandle(),
|
||||
true /* userLowResIcon */, pInfo);
|
||||
pInfo.titleSectionName = mIndexer.computeSectionName(pInfo.title);
|
||||
mWidgetsList.put(pInfo, widgetsShortcutsList);
|
||||
tmpPackageItemInfos.put(packageName, pInfo);
|
||||
mPackageItemInfos.add(pInfo);
|
||||
|
||||
@@ -20,8 +20,8 @@ import android.content.Context;
|
||||
import android.graphics.Bitmap;
|
||||
import android.graphics.Rect;
|
||||
import android.graphics.drawable.Drawable;
|
||||
import android.graphics.drawable.InsetDrawable;
|
||||
import android.support.v7.widget.LinearLayoutManager;
|
||||
import android.support.v7.widget.RecyclerView;
|
||||
import android.support.v7.widget.RecyclerView.State;
|
||||
import android.util.AttributeSet;
|
||||
import android.util.Log;
|
||||
@@ -93,7 +93,6 @@ public class WidgetsContainerView extends BaseContainerView
|
||||
mWidgetHostViewLoader = new WidgetHostViewLoader(mLauncher);
|
||||
mAdapter = new WidgetsListAdapter(context, this, this, mLauncher);
|
||||
mIconCache = (LauncherAppState.getInstance()).getIconCache();
|
||||
|
||||
if (DEBUG) {
|
||||
Log.d(TAG, "WidgetsContainerView constructor");
|
||||
}
|
||||
@@ -347,6 +346,23 @@ public class WidgetsContainerView extends BaseContainerView
|
||||
setPadding(mFixedBounds.left, mFixedBounds.top, getMeasuredWidth() - mFixedBounds.right,
|
||||
mFixedBounds.bottom);
|
||||
}
|
||||
|
||||
int inset = mFixedBounds.isEmpty() ? mView.getScrollbarWidth() : mFixedBoundsContainerInset;
|
||||
mView.setPadding(inset + mView.getScrollbarWidth(), inset,
|
||||
inset, inset);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onUpdateBackgrounds() {
|
||||
InsetDrawable background;
|
||||
// Update the background of the reveal view and list to be inset with the fixed bound
|
||||
// insets instead of the default insets
|
||||
// TODO: Use quantum_panel instead of quantum_panel_shape.
|
||||
int inset = mFixedBounds.isEmpty() ? mView.getScrollbarWidth() : mFixedBoundsContainerInset;
|
||||
background = new InsetDrawable(
|
||||
getContext().getResources().getDrawable(R.drawable.quantum_panel_shape),
|
||||
inset, 0, inset, 0);
|
||||
mView.updateBackgroundPadding(background);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -19,20 +19,25 @@ package com.android.launcher3.widget;
|
||||
import android.content.Context;
|
||||
import android.graphics.Rect;
|
||||
import android.graphics.drawable.Drawable;
|
||||
import android.support.v7.widget.RecyclerView;
|
||||
import android.support.v7.widget.LinearLayoutManager;
|
||||
import android.util.AttributeSet;
|
||||
import android.view.MotionEvent;
|
||||
import android.view.View;
|
||||
|
||||
import com.android.launcher3.BaseRecyclerView;
|
||||
import com.android.launcher3.Utilities;
|
||||
import com.android.launcher3.compat.AlphabeticIndexCompat;
|
||||
import com.android.launcher3.model.WidgetsModel;
|
||||
import com.android.launcher3.model.PackageItemInfo;
|
||||
|
||||
/**
|
||||
* The widgets recycler view.
|
||||
*/
|
||||
public class WidgetsRecyclerView extends BaseRecyclerView {
|
||||
|
||||
private static final String TAG = "WidgetsRecyclerView";
|
||||
private WidgetsModel mWidgets;
|
||||
private Rect mBackgroundPadding = new Rect();
|
||||
private PackageItemInfo mLastPackageItemInfo;
|
||||
|
||||
public WidgetsRecyclerView(Context context) {
|
||||
this(context, null);
|
||||
@@ -68,8 +73,17 @@ public class WidgetsRecyclerView extends BaseRecyclerView {
|
||||
*/
|
||||
@Override
|
||||
public String scrollToPositionAtProgress(float touchFraction) {
|
||||
// Ensure that we have any sections
|
||||
return "";
|
||||
float pos = mWidgets.getPackageSize() * touchFraction;
|
||||
|
||||
int posInt = (int) pos;
|
||||
LinearLayoutManager layoutManager = ((LinearLayoutManager) getLayoutManager());
|
||||
getCurScrollState(scrollPosState);
|
||||
layoutManager.scrollToPositionWithOffset((int) pos,
|
||||
(int) (scrollPosState.rowHeight * ((float) posInt - pos)));
|
||||
|
||||
posInt = (int) ((touchFraction == 1)? pos -1 : pos);
|
||||
PackageItemInfo p = mWidgets.getPackageItemInfo(posInt);
|
||||
return p.titleSectionName;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -78,19 +92,41 @@ public class WidgetsRecyclerView extends BaseRecyclerView {
|
||||
@Override
|
||||
public void updateVerticalScrollbarBounds() {
|
||||
int rowCount = mWidgets.getPackageSize();
|
||||
verticalScrollbarBounds.setEmpty();
|
||||
|
||||
// Skip early if there are no items.
|
||||
// Skip early if, there are no items.
|
||||
if (rowCount == 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Skip early if, there no child laid out in the container.
|
||||
getCurScrollState(scrollPosState);
|
||||
if (scrollPosState.rowIndex < 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
int actualHeight = getHeight() - getPaddingTop() - getPaddingBottom();
|
||||
int totalScrollHeight = rowCount * scrollPosState.rowHeight;
|
||||
// Skip early if the height of all the rows are actually less than the container height.
|
||||
if (totalScrollHeight < actualHeight) {
|
||||
verticalScrollbarBounds.setEmpty();
|
||||
return;
|
||||
}
|
||||
|
||||
int x, y;
|
||||
getCurScrollState(scrollPosState);
|
||||
if (scrollPosState.rowIndex < 0) {
|
||||
verticalScrollbarBounds.setEmpty();
|
||||
int scrollbarHeight = (int) (actualHeight / ((float) totalScrollHeight / actualHeight));
|
||||
int availableY = totalScrollHeight - actualHeight;
|
||||
int availableScrollY = actualHeight - scrollbarHeight;
|
||||
int y = (scrollPosState.rowIndex * scrollPosState.rowHeight)
|
||||
- scrollPosState.rowTopOffset;
|
||||
y = getPaddingTop() +
|
||||
(int) (((float) (getPaddingTop() + y) / availableY) * availableScrollY);
|
||||
|
||||
// Calculate the position and size of the scroll bar.
|
||||
int x = getWidth() - getScrollbarWidth() - mBackgroundPadding.right;
|
||||
if (Utilities.isRtl(getResources())) {
|
||||
x = mBackgroundPadding.left;
|
||||
}
|
||||
// TODO
|
||||
verticalScrollbarBounds.set(x, y, x + getScrollbarWidth(), y + scrollbarHeight);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -107,6 +143,11 @@ public class WidgetsRecyclerView extends BaseRecyclerView {
|
||||
if (rowCount == 0) {
|
||||
return;
|
||||
}
|
||||
// TODO
|
||||
View child = getChildAt(0);
|
||||
int position = getChildPosition(child);
|
||||
|
||||
stateOut.rowIndex = position;
|
||||
stateOut.rowTopOffset = getLayoutManager().getDecoratedTop(child);
|
||||
stateOut.rowHeight = child.getHeight();
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user