Merge "Update undo snackbar visuals" into ub-launcher3-master
diff --git a/res/layout/snackbar.xml b/res/layout/snackbar.xml
index 419fb82..bca3308 100644
--- a/res/layout/snackbar.xml
+++ b/res/layout/snackbar.xml
@@ -25,17 +25,23 @@
android:gravity="center_vertical"
android:paddingLeft="8dp"
android:paddingRight="8dp"
- android:textSize="14sp"
- android:textColor="?android:attr/textColorPrimary"/>
+ android:lines="1"
+ android:ellipsize="end"
+ android:textSize="@dimen/snackbar_max_text_size"
+ android:textColor="?android:attr/textColorPrimary"
+ android:theme="@style/TextTitle"/>
<TextView
android:id="@+id/action"
android:layout_height="@dimen/snackbar_content_height"
android:layout_width="wrap_content"
android:layout_weight="0"
android:gravity="center"
- android:padding="8dp"
+ android:paddingLeft="8dp"
+ android:paddingRight="8dp"
android:background="?android:attr/selectableItemBackground"
android:textStyle="bold"
- android:textColor="?android:attr/textColorPrimary"
- android:textAllCaps="true"/>
+ android:textSize="@dimen/snackbar_max_text_size"
+ android:textColor="?android:attr/colorAccent"
+ android:theme="@style/TextTitle"
+ android:capitalize="sentences"/>
</merge>
\ No newline at end of file
diff --git a/res/values/dimens.xml b/res/values/dimens.xml
index e7bd64c..8adae36 100644
--- a/res/values/dimens.xml
+++ b/res/values/dimens.xml
@@ -230,5 +230,10 @@
<dimen name="snackbar_height">48dp</dimen>
<dimen name="snackbar_content_height">32dp</dimen>
<dimen name="snackbar_padding">8dp</dimen>
- <dimen name="snackbar_margin">16dp</dimen>
+ <dimen name="snackbar_min_margin_left_right">6dp</dimen>
+ <dimen name="snackbar_max_margin_left_right">72dp</dimen>
+ <dimen name="snackbar_margin_bottom">30dp</dimen>
+ <dimen name="snackbar_elevation">3dp</dimen>
+ <dimen name="snackbar_min_text_size">12sp</dimen>
+ <dimen name="snackbar_max_text_size">14sp</dimen>
</resources>
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 6d73dcb..eb6b284 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -262,7 +262,7 @@
<!-- Accessibility confirmation for item removed. [CHAR_LIMIT=50]-->
<string name="item_removed">Item removed</string>
- <!-- Action shown in snackbar to undo item removal. [CHAR_LIMIT=15] -->
+ <!-- Action shown in snackbar to undo item removal. [CHAR_LIMIT=20] -->
<string name="undo">Undo</string>
<!-- Accessibility action to move an item on the workspace. [CHAR_LIMIT=30] -->
diff --git a/src/com/android/launcher3/views/Snackbar.java b/src/com/android/launcher3/views/Snackbar.java
index f515360..04b637b 100644
--- a/src/com/android/launcher3/views/Snackbar.java
+++ b/src/com/android/launcher3/views/Snackbar.java
@@ -20,6 +20,7 @@
import android.content.res.Resources;
import android.graphics.Rect;
import android.util.AttributeSet;
+import android.util.TypedValue;
import android.view.Gravity;
import android.view.MotionEvent;
import android.widget.TextView;
@@ -60,7 +61,7 @@
snackbar.setOrientation(HORIZONTAL);
snackbar.setGravity(Gravity.CENTER_VERTICAL);
Resources res = launcher.getResources();
- snackbar.setElevation(res.getDimension(R.dimen.deep_shortcuts_elevation));
+ snackbar.setElevation(res.getDimension(R.dimen.snackbar_elevation));
int padding = res.getDimensionPixelSize(R.dimen.snackbar_padding);
snackbar.setPadding(padding, padding, padding, padding);
snackbar.setBackgroundResource(R.drawable.round_rect_primary);
@@ -72,14 +73,45 @@
DragLayer.LayoutParams params = (DragLayer.LayoutParams) snackbar.getLayoutParams();
params.gravity = Gravity.CENTER_HORIZONTAL | Gravity.BOTTOM;
params.height = res.getDimensionPixelSize(R.dimen.snackbar_height);
- int margin = res.getDimensionPixelSize(R.dimen.snackbar_margin);
+ int maxMarginLeftRight = res.getDimensionPixelSize(R.dimen.snackbar_max_margin_left_right);
+ int minMarginLeftRight = res.getDimensionPixelSize(R.dimen.snackbar_min_margin_left_right);
+ int marginBottom = res.getDimensionPixelSize(R.dimen.snackbar_margin_bottom);
Rect insets = launcher.getDeviceProfile().getInsets();
- params.width = dragLayer.getWidth() - margin * 2 - insets.left - insets.right;
- params.setMargins(0, margin + insets.top, 0, margin + insets.bottom);
+ int maxWidth = dragLayer.getWidth() - minMarginLeftRight * 2 - insets.left - insets.right;
+ int minWidth = dragLayer.getWidth() - maxMarginLeftRight * 2 - insets.left - insets.right;
+ params.width = minWidth;
+ params.setMargins(0, 0, 0, marginBottom + insets.bottom);
- ((TextView) snackbar.findViewById(R.id.label)).setText(labelStringResId);
- ((TextView) snackbar.findViewById(R.id.action)).setText(actionStringResId);
- snackbar.findViewById(R.id.action).setOnClickListener(v -> {
+ TextView labelView = snackbar.findViewById(R.id.label);
+ TextView actionView = snackbar.findViewById(R.id.action);
+ String labelText = res.getString(labelStringResId);
+ String actionText = res.getString(actionStringResId);
+ int totalContentWidth = (int) (labelView.getPaint().measureText(labelText)
+ + actionView.getPaint().measureText(actionText))
+ + labelView.getPaddingRight() + labelView.getPaddingLeft()
+ + actionView.getPaddingRight() + actionView.getPaddingLeft()
+ + padding * 2;
+ if (totalContentWidth > params.width) {
+ // The text doesn't fit in our standard width so update width to accommodate.
+ if (totalContentWidth <= maxWidth) {
+ params.width = totalContentWidth;
+ } else {
+ // One line will be cut off, fallback to 2 lines and smaller font. (This should only
+ // happen in some languages if system display and font size are set to largest.)
+ int textHeight = res.getDimensionPixelSize(R.dimen.snackbar_content_height);
+ float textSizePx = res.getDimension(R.dimen.snackbar_min_text_size);
+ labelView.setLines(2);
+ labelView.getLayoutParams().height = textHeight * 2;
+ actionView.getLayoutParams().height = textHeight * 2;
+ labelView.setTextSize(TypedValue.COMPLEX_UNIT_PX, textSizePx);
+ actionView.setTextSize(TypedValue.COMPLEX_UNIT_PX, textSizePx);
+ params.height += textHeight;
+ params.width = maxWidth;
+ }
+ }
+ labelView.setText(labelText);
+ actionView.setText(actionText);
+ actionView.setOnClickListener(v -> {
if (onActionClicked != null) {
onActionClicked.run();
}