Merge "Add scroll indicators to resolver list" into nyc-dev

This commit is contained in:
Alan Viverette
2016-04-14 01:45:33 +00:00
committed by Android (Google) Code Review
4 changed files with 202 additions and 129 deletions

View File

@@ -17,9 +17,15 @@
package com.android.internal.widget;
import com.android.internal.R;
import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Rect;
import android.graphics.drawable.ColorDrawable;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.os.Parcel;
import android.os.Parcelable;
@@ -38,7 +44,6 @@ import android.view.accessibility.AccessibilityNodeInfo.AccessibilityAction;
import android.view.animation.AnimationUtils;
import android.widget.AbsListView;
import android.widget.OverScroller;
import com.android.internal.R;
public class ResolverDrawerLayout extends ViewGroup {
private static final String TAG = "ResolverDrawerLayout";
@@ -86,6 +91,8 @@ public class ResolverDrawerLayout extends ViewGroup {
private final OverScroller mScroller;
private final VelocityTracker mVelocityTracker;
private Drawable mScrollIndicatorDrawable;
private OnDismissedListener mOnDismissedListener;
private RunOnDismissedListener mRunOnDismissedListener;
@@ -127,6 +134,8 @@ public class ResolverDrawerLayout extends ViewGroup {
mMaxCollapsedHeight);
a.recycle();
mScrollIndicatorDrawable = mContext.getDrawable(R.drawable.scroll_indicator_material);
mScroller = new OverScroller(context, AnimationUtils.loadInterpolator(context,
android.R.interpolator.decelerate_quint));
mVelocityTracker = VelocityTracker.obtain();
@@ -202,8 +211,7 @@ public class ResolverDrawerLayout extends ViewGroup {
}
final boolean isCollapsedNew = mCollapseOffset != 0;
if (isCollapsedOld != isCollapsedNew) {
notifyViewAccessibilityStateChangedIfNeeded(
AccessibilityEvent.CONTENT_CHANGE_TYPE_UNDEFINED);
onCollapsedChanged(isCollapsedNew);
}
} else {
// Start out collapsed at first unless we restored state for otherwise
@@ -442,8 +450,7 @@ public class ResolverDrawerLayout extends ViewGroup {
mTopOffset += dy;
final boolean isCollapsedNew = newPos != 0;
if (isCollapsedOld != isCollapsedNew) {
notifyViewAccessibilityStateChangedIfNeeded(
AccessibilityEvent.CONTENT_CHANGE_TYPE_UNDEFINED);
onCollapsedChanged(isCollapsedNew);
}
postInvalidateOnAnimation();
return dy;
@@ -451,6 +458,15 @@ public class ResolverDrawerLayout extends ViewGroup {
return 0;
}
private void onCollapsedChanged(boolean isCollapsed) {
notifyViewAccessibilityStateChangedIfNeeded(
AccessibilityEvent.CONTENT_CHANGE_TYPE_UNDEFINED);
if (mScrollIndicatorDrawable != null) {
setWillNotDraw(!isCollapsed);
}
}
void dispatchOnDismissed() {
if (mOnDismissedListener != null) {
mOnDismissedListener.onDismissed();
@@ -708,6 +724,15 @@ public class ResolverDrawerLayout extends ViewGroup {
return false;
}
@Override
public void onDrawForeground(Canvas canvas) {
if (mScrollIndicatorDrawable != null) {
mScrollIndicatorDrawable.draw(canvas);
}
super.onDrawForeground(canvas);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
final int sourceWidth = MeasureSpec.getSize(widthMeasureSpec);
@@ -794,6 +819,8 @@ public class ResolverDrawerLayout extends ViewGroup {
protected void onLayout(boolean changed, int l, int t, int r, int b) {
final int width = getWidth();
View indicatorHost = null;
int ypos = mTopOffset;
int leftEdge = getPaddingLeft();
int rightEdge = width - getPaddingRight();
@@ -802,6 +829,9 @@ public class ResolverDrawerLayout extends ViewGroup {
for (int i = 0; i < childCount; i++) {
final View child = getChildAt(i);
final LayoutParams lp = (LayoutParams) child.getLayoutParams();
if (lp.hasNestedScrollIndicator) {
indicatorHost = child;
}
if (child.getVisibility() == GONE) {
continue;
@@ -822,6 +852,20 @@ public class ResolverDrawerLayout extends ViewGroup {
ypos = bottom + lp.bottomMargin;
}
if (mScrollIndicatorDrawable != null) {
if (indicatorHost != null) {
final int left = indicatorHost.getLeft();
final int right = indicatorHost.getRight();
final int bottom = indicatorHost.getTop();
final int top = bottom - mScrollIndicatorDrawable.getIntrinsicHeight();
mScrollIndicatorDrawable.setBounds(left, top, right, bottom);
setWillNotDraw(!isCollapsed());
} else {
mScrollIndicatorDrawable = null;
setWillNotDraw(true);
}
}
}
@Override
@@ -861,6 +905,7 @@ public class ResolverDrawerLayout extends ViewGroup {
public static class LayoutParams extends MarginLayoutParams {
public boolean alwaysShow;
public boolean ignoreOffset;
public boolean hasNestedScrollIndicator;
public LayoutParams(Context c, AttributeSet attrs) {
super(c, attrs);
@@ -873,6 +918,9 @@ public class ResolverDrawerLayout extends ViewGroup {
ignoreOffset = a.getBoolean(
R.styleable.ResolverDrawerLayout_LayoutParams_layout_ignoreOffset,
false);
hasNestedScrollIndicator = a.getBoolean(
R.styleable.ResolverDrawerLayout_LayoutParams_layout_hasNestedScrollIndicator,
false);
a.recycle();
}
@@ -884,6 +932,7 @@ public class ResolverDrawerLayout extends ViewGroup {
super(source);
this.alwaysShow = source.alwaysShow;
this.ignoreOffset = source.ignoreOffset;
this.hasNestedScrollIndicator = source.hasNestedScrollIndicator;
}
public LayoutParams(MarginLayoutParams source) {

View File

@@ -30,33 +30,37 @@
android:layout_height="wrap_content"
android:layout_alwaysShow="true"
android:elevation="8dp"
android:background="@color/white" >
<TextView android:id="@+id/profile_button"
android:layout_width="wrap_content"
android:layout_height="48dp"
android:layout_marginEnd="8dp"
android:paddingStart="8dp"
android:paddingEnd="8dp"
android:visibility="gone"
style="?attr/borderlessButtonStyle"
android:textAppearance="?attr/textAppearanceButton"
android:textColor="@color/material_deep_teal_500"
android:gravity="center_vertical"
android:layout_alignParentTop="true"
android:layout_alignParentRight="true"
android:singleLine="true"/>
<TextView android:id="@+id/title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:minHeight="56dp"
android:textAppearance="?attr/textAppearanceMedium"
android:gravity="start|center_vertical"
android:paddingStart="?attr/dialogPreferredPadding"
android:paddingEnd="?attr/dialogPreferredPadding"
android:paddingTop="8dp"
android:layout_below="@id/profile_button"
android:layout_alignParentLeft="true"
android:paddingBottom="8dp" />
android:background="@color/white">
<TextView
android:id="@+id/profile_button"
android:layout_width="wrap_content"
android:layout_height="48dp"
android:layout_marginEnd="8dp"
android:paddingStart="8dp"
android:paddingEnd="8dp"
android:visibility="gone"
style="?attr/borderlessButtonStyle"
android:textAppearance="?attr/textAppearanceButton"
android:textColor="@color/material_deep_teal_500"
android:gravity="center_vertical"
android:layout_alignParentTop="true"
android:layout_alignParentRight="true"
android:singleLine="true" />
<TextView
android:id="@+id/title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:minHeight="56dp"
android:textAppearance="?attr/textAppearanceMedium"
android:gravity="start|center_vertical"
android:paddingStart="?attr/dialogPreferredPadding"
android:paddingEnd="?attr/dialogPreferredPadding"
android:paddingTop="8dp"
android:layout_below="@id/profile_button"
android:layout_alignParentLeft="true"
android:paddingBottom="8dp" />
</RelativeLayout>
<ListView
@@ -68,6 +72,7 @@
android:background="@color/white"
android:elevation="8dp"
android:nestedScrollingEnabled="true"
android:scrollIndicators="top|bottom"
android:divider="@null" />
<TextView android:id="@+id/empty"
@@ -84,11 +89,12 @@
<LinearLayout
android:id="@+id/button_bar"
android:visibility="gone"
style="?android:attr/buttonBarStyle"
style="?attr/buttonBarStyle"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_ignoreOffset="true"
android:layout_alwaysShow="true"
android:layout_hasNestedScrollIndicator="true"
android:gravity="end|center_vertical"
android:orientation="horizontal"
android:layoutDirection="locale"
@@ -99,26 +105,30 @@
android:paddingStart="12dp"
android:paddingEnd="12dp"
android:elevation="8dp">
<Button android:id="@+id/button_once"
android:layout_width="wrap_content"
android:layout_gravity="start"
android:maxLines="2"
style="?android:attr/buttonBarNegativeButtonStyle"
android:minHeight="@dimen/alert_dialog_button_bar_height"
android:layout_height="wrap_content"
android:enabled="false"
android:text="@string/activity_resolver_use_once"
android:onClick="onButtonClick" />
<Button android:id="@+id/button_always"
android:layout_width="wrap_content"
android:layout_gravity="end"
android:maxLines="2"
android:minHeight="@dimen/alert_dialog_button_bar_height"
style="?android:attr/buttonBarPositiveButtonStyle"
android:layout_height="wrap_content"
android:enabled="false"
android:text="@string/activity_resolver_use_always"
android:onClick="onButtonClick" />
<Button
android:id="@+id/button_once"
android:layout_width="wrap_content"
android:layout_gravity="start"
android:maxLines="2"
style="?attr/buttonBarNegativeButtonStyle"
android:minHeight="@dimen/alert_dialog_button_bar_height"
android:layout_height="wrap_content"
android:enabled="false"
android:text="@string/activity_resolver_use_once"
android:onClick="onButtonClick" />
<Button
android:id="@+id/button_always"
android:layout_width="wrap_content"
android:layout_gravity="end"
android:maxLines="2"
android:minHeight="@dimen/alert_dialog_button_bar_height"
style="?attr/buttonBarPositiveButtonStyle"
android:layout_height="wrap_content"
android:enabled="false"
android:text="@string/activity_resolver_use_always"
android:onClick="onButtonClick" />
</LinearLayout>
</com.android.internal.widget.ResolverDrawerLayout>

View File

@@ -22,8 +22,7 @@
android:layout_height="match_parent"
android:maxWidth="@dimen/resolver_max_width"
android:maxCollapsedHeight="144dp"
android:id="@id/contentPanel"
>
android:id="@id/contentPanel">
<LinearLayout
android:layout_width="match_parent"
@@ -31,66 +30,75 @@
android:layout_alwaysShow="true"
android:orientation="vertical"
android:background="@color/white"
android:elevation="8dp" >
android:elevation="8dp">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="64dp"
android:orientation="horizontal" >
android:orientation="horizontal">
<ImageView android:id="@+id/icon"
android:layout_width="24dp"
android:layout_height="24dp"
android:layout_gravity="start|top"
android:layout_marginStart="16dp"
android:layout_marginEnd="16dp"
android:layout_marginTop="20dp"
android:scaleType="fitCenter" />
<TextView android:id="@+id/title"
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="?android:attr/listPreferredItemHeight"
android:layout_marginStart="16dp"
android:textAppearance="?android:attr/textAppearanceMedium"
android:gravity="start|center_vertical"
android:paddingEnd="16dp" />
<LinearLayout android:id="@+id/profile_button"
android:layout_width="wrap_content"
android:layout_height="48dp"
android:layout_marginTop="4dp"
android:layout_marginEnd="4dp"
android:paddingStart="8dp"
android:paddingEnd="8dp"
android:paddingTop="4dp"
android:paddingBottom="4dp"
android:focusable="true"
android:visibility="gone"
style="?attr/borderlessButtonStyle">
<ImageView android:id="@+id/icon"
android:layout_width="24dp"
android:layout_height="24dp"
android:layout_gravity="start|center_vertical"
android:layout_marginEnd="?attr/listPreferredItemPaddingEnd"
android:layout_marginTop="12dp"
android:layout_marginBottom="12dp"
android:scaleType="fitCenter" />
<TextView android:id="@id/text1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="start|center_vertical"
android:layout_marginEnd="?attr/listPreferredItemPaddingEnd"
android:textAppearance="?attr/textAppearanceButton"
android:textColor="?attr/textColorPrimary"
android:minLines="1"
android:maxLines="1"
android:ellipsize="marquee" />
<ImageView
android:id="@+id/icon"
android:layout_width="24dp"
android:layout_height="24dp"
android:layout_gravity="start|top"
android:layout_marginStart="16dp"
android:layout_marginEnd="16dp"
android:layout_marginTop="20dp"
android:scaleType="fitCenter" />
<TextView
android:id="@+id/title"
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="?attr/listPreferredItemHeight"
android:layout_marginStart="16dp"
android:textAppearance="?attr/textAppearanceMedium"
android:gravity="start|center_vertical"
android:paddingEnd="16dp" />
<LinearLayout
android:id="@+id/profile_button"
android:layout_width="wrap_content"
android:layout_height="48dp"
android:layout_marginTop="4dp"
android:layout_marginEnd="4dp"
android:paddingStart="8dp"
android:paddingEnd="8dp"
android:paddingTop="4dp"
android:paddingBottom="4dp"
android:focusable="true"
android:visibility="gone"
style="?attr/borderlessButtonStyle">
<ImageView
android:id="@+id/icon"
android:layout_width="24dp"
android:layout_height="24dp"
android:layout_gravity="start|center_vertical"
android:layout_marginEnd="?attr/listPreferredItemPaddingEnd"
android:layout_marginTop="12dp"
android:layout_marginBottom="12dp"
android:scaleType="fitCenter" />
<TextView
android:id="@id/text1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="start|center_vertical"
android:layout_marginEnd="?attr/listPreferredItemPaddingEnd"
android:textAppearance="?attr/textAppearanceButton"
android:textColor="?attr/textColorPrimary"
android:minLines="1"
android:maxLines="1"
android:ellipsize="marquee" />
</LinearLayout>
</LinearLayout>
<LinearLayout
android:id="@+id/button_bar"
android:visibility="gone"
style="?android:attr/buttonBarStyle"
style="?attr/buttonBarStyle"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alwaysShow="true"
@@ -104,30 +112,36 @@
android:paddingEnd="12dp"
android:background="@color/white"
android:elevation="8dp">
<Button android:id="@+id/button_once"
android:layout_width="wrap_content"
android:layout_gravity="start"
android:maxLines="2"
style="?android:attr/buttonBarNegativeButtonStyle"
android:minHeight="@dimen/alert_dialog_button_bar_height"
android:layout_height="wrap_content"
android:enabled="false"
android:text="@string/activity_resolver_use_once"
android:onClick="onButtonClick" />
<Button android:id="@+id/button_always"
android:layout_width="wrap_content"
android:layout_gravity="end"
android:maxLines="2"
android:minHeight="@dimen/alert_dialog_button_bar_height"
style="?android:attr/buttonBarPositiveButtonStyle"
android:layout_height="wrap_content"
android:enabled="false"
android:text="@string/activity_resolver_use_always"
android:onClick="onButtonClick" />
<Button
android:id="@+id/button_once"
android:layout_width="wrap_content"
android:layout_gravity="start"
android:maxLines="2"
style="?attr/buttonBarNegativeButtonStyle"
android:minHeight="@dimen/alert_dialog_button_bar_height"
android:layout_height="wrap_content"
android:enabled="false"
android:text="@string/activity_resolver_use_once"
android:onClick="onButtonClick" />
<Button
android:id="@+id/button_always"
android:layout_width="wrap_content"
android:layout_gravity="end"
android:maxLines="2"
android:minHeight="@dimen/alert_dialog_button_bar_height"
style="?attr/buttonBarPositiveButtonStyle"
android:layout_height="wrap_content"
android:enabled="false"
android:text="@string/activity_resolver_use_always"
android:onClick="onButtonClick" />
</LinearLayout>
<View android:layout_width="match_parent"
android:layout_height="1dp"
android:background="?android:attr/dividerVertical" />
<View
android:layout_width="match_parent"
android:layout_height="1dp"
android:background="?attr/dividerVertical" />
</LinearLayout>
<ListView
@@ -139,7 +153,6 @@
android:background="@color/white"
android:elevation="8dp"
android:nestedScrollingEnabled="true"
android:divider="@null"
/>
android:divider="@null" />
</com.android.internal.widget.ResolverDrawerLayout>

View File

@@ -8138,6 +8138,7 @@ i
<attr name="layout_alwaysShow" format="boolean" />
<attr name="layout_ignoreOffset" format="boolean" />
<attr name="layout_gravity" />
<attr name="layout_hasNestedScrollIndicator" format="boolean" />
</declare-styleable>
<!-- @hide -->