Merge "Catch double unbind of dead service" into pi-dev
diff --git a/core/java/android/text/method/LinkMovementMethod.java b/core/java/android/text/method/LinkMovementMethod.java
index e60377b..549f8b3 100644
--- a/core/java/android/text/method/LinkMovementMethod.java
+++ b/core/java/android/text/method/LinkMovementMethod.java
@@ -25,6 +25,7 @@
import android.view.KeyEvent;
import android.view.MotionEvent;
import android.view.View;
+import android.view.textclassifier.TextLinks.TextLinkSpan;
import android.widget.TextView;
/**
@@ -130,64 +131,70 @@
selStart = selEnd = -1;
switch (what) {
- case CLICK:
- if (selStart == selEnd) {
- return false;
- }
+ case CLICK:
+ if (selStart == selEnd) {
+ return false;
+ }
- ClickableSpan[] link = buffer.getSpans(selStart, selEnd, ClickableSpan.class);
+ ClickableSpan[] links = buffer.getSpans(selStart, selEnd, ClickableSpan.class);
- if (link.length != 1)
- return false;
+ if (links.length != 1) {
+ return false;
+ }
- link[0].onClick(widget);
- break;
+ ClickableSpan link = links[0];
+ if (link instanceof TextLinkSpan) {
+ ((TextLinkSpan) link).onClick(widget, TextLinkSpan.INVOCATION_METHOD_KEYBOARD);
+ } else {
+ link.onClick(widget);
+ }
+ break;
- case UP:
- int bestStart, bestEnd;
+ case UP:
+ int bestStart, bestEnd;
- bestStart = -1;
- bestEnd = -1;
+ bestStart = -1;
+ bestEnd = -1;
- for (int i = 0; i < candidates.length; i++) {
- int end = buffer.getSpanEnd(candidates[i]);
+ for (int i = 0; i < candidates.length; i++) {
+ int end = buffer.getSpanEnd(candidates[i]);
- if (end < selEnd || selStart == selEnd) {
- if (end > bestEnd) {
- bestStart = buffer.getSpanStart(candidates[i]);
- bestEnd = end;
+ if (end < selEnd || selStart == selEnd) {
+ if (end > bestEnd) {
+ bestStart = buffer.getSpanStart(candidates[i]);
+ bestEnd = end;
+ }
}
}
- }
- if (bestStart >= 0) {
- Selection.setSelection(buffer, bestEnd, bestStart);
- return true;
- }
+ if (bestStart >= 0) {
+ Selection.setSelection(buffer, bestEnd, bestStart);
+ return true;
+ }
- break;
+ break;
- case DOWN:
- bestStart = Integer.MAX_VALUE;
- bestEnd = Integer.MAX_VALUE;
+ case DOWN:
+ bestStart = Integer.MAX_VALUE;
+ bestEnd = Integer.MAX_VALUE;
- for (int i = 0; i < candidates.length; i++) {
- int start = buffer.getSpanStart(candidates[i]);
+ for (int i = 0; i < candidates.length; i++) {
+ int start = buffer.getSpanStart(candidates[i]);
- if (start > selStart || selStart == selEnd) {
- if (start < bestStart) {
- bestStart = start;
- bestEnd = buffer.getSpanEnd(candidates[i]);
+ if (start > selStart || selStart == selEnd) {
+ if (start < bestStart) {
+ bestStart = start;
+ bestEnd = buffer.getSpanEnd(candidates[i]);
+ }
}
}
- }
- if (bestEnd < Integer.MAX_VALUE) {
- Selection.setSelection(buffer, bestStart, bestEnd);
- return true;
- }
+ if (bestEnd < Integer.MAX_VALUE) {
+ Selection.setSelection(buffer, bestStart, bestEnd);
+ return true;
+ }
- break;
+ break;
}
return false;
@@ -215,8 +222,14 @@
ClickableSpan[] links = buffer.getSpans(off, off, ClickableSpan.class);
if (links.length != 0) {
+ ClickableSpan link = links[0];
if (action == MotionEvent.ACTION_UP) {
- links[0].onClick(widget);
+ if (link instanceof TextLinkSpan) {
+ ((TextLinkSpan) link).onClick(
+ widget, TextLinkSpan.INVOCATION_METHOD_TOUCH);
+ } else {
+ link.onClick(widget);
+ }
} else if (action == MotionEvent.ACTION_DOWN) {
if (widget.getContext().getApplicationInfo().targetSdkVersion
>= Build.VERSION_CODES.P) {
@@ -225,8 +238,8 @@
widget.hideFloatingToolbar(HIDE_FLOATING_TOOLBAR_DELAY_MS);
}
Selection.setSelection(buffer,
- buffer.getSpanStart(links[0]),
- buffer.getSpanEnd(links[0]));
+ buffer.getSpanStart(link),
+ buffer.getSpanEnd(link));
}
return true;
} else {
diff --git a/core/java/android/view/textclassifier/TextLinks.java b/core/java/android/view/textclassifier/TextLinks.java
index 851b2c9..e7faf14 100644
--- a/core/java/android/view/textclassifier/TextLinks.java
+++ b/core/java/android/view/textclassifier/TextLinks.java
@@ -503,6 +503,22 @@
*/
public static class TextLinkSpan extends ClickableSpan {
+ /**
+ * How the clickspan is triggered.
+ * @hide
+ */
+ @Retention(RetentionPolicy.SOURCE)
+ @IntDef({INVOCATION_METHOD_UNSPECIFIED, INVOCATION_METHOD_TOUCH,
+ INVOCATION_METHOD_KEYBOARD})
+ public @interface InvocationMethod {}
+
+ /** @hide */
+ public static final int INVOCATION_METHOD_UNSPECIFIED = -1;
+ /** @hide */
+ public static final int INVOCATION_METHOD_TOUCH = 0;
+ /** @hide */
+ public static final int INVOCATION_METHOD_KEYBOARD = 1;
+
private final TextLink mTextLink;
public TextLinkSpan(@NonNull TextLink textLink) {
@@ -511,16 +527,24 @@
@Override
public void onClick(View widget) {
+ onClick(widget, INVOCATION_METHOD_UNSPECIFIED);
+ }
+
+ /** @hide */
+ public final void onClick(View widget, @InvocationMethod int invocationMethod) {
if (widget instanceof TextView) {
final TextView textView = (TextView) widget;
final Context context = textView.getContext();
if (TextClassificationManager.getSettings(context).isSmartLinkifyEnabled()) {
- if (textView.requestFocus()) {
- textView.requestActionMode(this);
- } else {
- // If textView can not take focus, then simply handle the click as it will
- // be difficult to get rid of the floating action mode.
- textView.handleClick(this);
+ switch (invocationMethod) {
+ case INVOCATION_METHOD_TOUCH:
+ textView.requestActionMode(this);
+ break;
+ case INVOCATION_METHOD_KEYBOARD:// fall though
+ case INVOCATION_METHOD_UNSPECIFIED: // fall through
+ default:
+ textView.handleClick(this);
+ break;
}
} else {
if (mTextLink.mUrlSpan != null) {
diff --git a/core/java/com/android/internal/widget/FloatingToolbar.java b/core/java/com/android/internal/widget/FloatingToolbar.java
index 2ce5a0b..63c2e96 100644
--- a/core/java/com/android/internal/widget/FloatingToolbar.java
+++ b/core/java/com/android/internal/widget/FloatingToolbar.java
@@ -1176,6 +1176,9 @@
final boolean showIcon = isFirstItem && menuItem.getItemId() == R.id.textAssist;
final View menuItemButton = createMenuItemButton(
mContext, menuItem, mIconTextSpacing, showIcon);
+ if (!showIcon && menuItemButton instanceof LinearLayout) {
+ ((LinearLayout) menuItemButton).setGravity(Gravity.CENTER);
+ }
// Adding additional start padding for the first button to even out button spacing.
if (isFirstItem) {
@@ -1200,57 +1203,21 @@
final int menuItemButtonWidth = Math.min(
menuItemButton.getMeasuredWidth(), toolbarWidth);
- final boolean isNewGroup = !isFirstItem && lastGroupId != menuItem.getGroupId();
- final int extraPadding = isNewGroup ? menuItemButton.getPaddingEnd() * 2 : 0;
-
// Check if we can fit an item while reserving space for the overflowButton.
final boolean canFitWithOverflow =
menuItemButtonWidth <=
- availableWidth - mOverflowButtonSize.getWidth() - extraPadding;
+ availableWidth - mOverflowButtonSize.getWidth();
final boolean canFitNoOverflow =
- isLastItem && menuItemButtonWidth <= availableWidth - extraPadding;
+ isLastItem && menuItemButtonWidth <= availableWidth;
if (canFitWithOverflow || canFitNoOverflow) {
- if (isNewGroup) {
- final View divider = createDivider(mContext);
- final int dividerWidth = divider.getLayoutParams().width;
-
- // Add extra padding to the end of the previous button.
- // Half of the extra padding (less borderWidth) goes to the previous button.
- final View previousButton = mMainPanel.getChildAt(
- mMainPanel.getChildCount() - 1);
- final int prevPaddingEnd = previousButton.getPaddingEnd()
- + extraPadding / 2 - dividerWidth;
- previousButton.setPaddingRelative(
- previousButton.getPaddingStart(),
- previousButton.getPaddingTop(),
- prevPaddingEnd,
- previousButton.getPaddingBottom());
- final ViewGroup.LayoutParams prevParams = previousButton.getLayoutParams();
- prevParams.width += extraPadding / 2 - dividerWidth;
- previousButton.setLayoutParams(prevParams);
-
- // Add extra padding to the start of this button.
- // Other half of the extra padding goes to this button.
- final int paddingStart = menuItemButton.getPaddingStart()
- + extraPadding / 2;
- menuItemButton.setPaddingRelative(
- paddingStart,
- menuItemButton.getPaddingTop(),
- menuItemButton.getPaddingEnd(),
- menuItemButton.getPaddingBottom());
-
- // Include a divider.
- mMainPanel.addView(divider);
- }
-
setButtonTagAndClickListener(menuItemButton, menuItem);
// Set tooltips for main panel items, but not overflow items (b/35726766).
menuItemButton.setTooltipText(menuItem.getTooltipText());
mMainPanel.addView(menuItemButton);
final ViewGroup.LayoutParams params = menuItemButton.getLayoutParams();
- params.width = menuItemButtonWidth + extraPadding / 2;
+ params.width = menuItemButtonWidth;
menuItemButton.setLayoutParams(params);
- availableWidth -= menuItemButtonWidth + extraPadding;
+ availableWidth -= menuItemButtonWidth;
remainingMenuItems.pop();
} else {
break;
@@ -1726,30 +1693,6 @@
return popupWindow;
}
- private static View createDivider(Context context) {
- // TODO: Inflate this instead.
- View divider = new View(context);
-
- int _1dp = (int) TypedValue.applyDimension(
- TypedValue.COMPLEX_UNIT_DIP, 1, context.getResources().getDisplayMetrics());
- LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(
- _1dp, ViewGroup.LayoutParams.MATCH_PARENT);
- params.setMarginsRelative(0, _1dp * 10, 0, _1dp * 10);
- divider.setLayoutParams(params);
-
- TypedArray a = context.obtainStyledAttributes(
- new TypedValue().data, new int[] { R.attr.floatingToolbarDividerColor });
- divider.setBackgroundColor(a.getColor(0, 0));
- a.recycle();
-
- divider.setImportantForAccessibility(View.IMPORTANT_FOR_ACCESSIBILITY_NO);
- divider.setEnabled(false);
- divider.setFocusable(false);
- divider.setContentDescription(null);
-
- return divider;
- }
-
/**
* Creates an "appear" animation for the specified view.
*
diff --git a/core/res/res/values/dimens.xml b/core/res/res/values/dimens.xml
index 2aa40fd..a135b28 100644
--- a/core/res/res/values/dimens.xml
+++ b/core/res/res/values/dimens.xml
@@ -536,7 +536,7 @@
<dimen name="floating_toolbar_menu_image_width">24dp</dimen>
<dimen name="floating_toolbar_menu_image_button_width">56dp</dimen>
<dimen name="floating_toolbar_menu_image_button_vertical_padding">12dp</dimen>
- <dimen name="floating_toolbar_menu_button_side_padding">11dp</dimen>
+ <dimen name="floating_toolbar_menu_button_side_padding">8dp</dimen>
<dimen name="floating_toolbar_overflow_image_button_width">60dp</dimen>
<dimen name="floating_toolbar_overflow_side_padding">18dp</dimen>
<dimen name="floating_toolbar_text_size">14sp</dimen>
diff --git a/packages/SystemUI/plugin/src/com/android/systemui/plugins/qs/QSTileView.java b/packages/SystemUI/plugin/src/com/android/systemui/plugins/qs/QSTileView.java
index ad300f4..53f7e44 100644
--- a/packages/SystemUI/plugin/src/com/android/systemui/plugins/qs/QSTileView.java
+++ b/packages/SystemUI/plugin/src/com/android/systemui/plugins/qs/QSTileView.java
@@ -50,6 +50,4 @@
public abstract void onStateChanged(State state);
public abstract int getDetailY();
-
- public void setExpansion(float expansion) {}
}
diff --git a/packages/SystemUI/res/layout/qs_tile_label.xml b/packages/SystemUI/res/layout/qs_tile_label.xml
index 74c22b0..49d142a 100644
--- a/packages/SystemUI/res/layout/qs_tile_label.xml
+++ b/packages/SystemUI/res/layout/qs_tile_label.xml
@@ -76,7 +76,7 @@
android:layout_below="@id/label_group"
android:clickable="false"
android:ellipsize="marquee"
- android:maxLines="1"
+ android:singleLine="true"
android:padding="0dp"
android:visibility="gone"
android:gravity="center"
diff --git a/packages/SystemUI/src/com/android/systemui/qs/PagedTileLayout.java b/packages/SystemUI/src/com/android/systemui/qs/PagedTileLayout.java
index d8d07c0..1fd6023 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/PagedTileLayout.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/PagedTileLayout.java
@@ -56,6 +56,7 @@
private AnimatorSet mBounceAnimatorSet;
private int mAnimatingToPage = -1;
+ private float mLastExpansion;
public PagedTileLayout(Context context, AttributeSet attrs) {
super(context, attrs);
@@ -172,8 +173,19 @@
@Override
public void setExpansion(float expansion) {
- for (TileRecord tr : mTiles) {
- tr.tileView.setExpansion(expansion);
+ mLastExpansion = expansion;
+ updateSelected();
+ }
+
+ private void updateSelected() {
+ // Start the marquee when fully expanded and stop when fully collapsed. Leave as is for
+ // other expansion ratios since there is no way way to pause the marquee.
+ if (mLastExpansion > 0f && mLastExpansion < 1f) {
+ return;
+ }
+ boolean selected = mLastExpansion == 1f;
+ for (int i = 0; i < mPages.size(); i++) {
+ mPages.get(i).setSelected(i == getCurrentItem() ? selected : false);
}
}
@@ -323,6 +335,7 @@
new ViewPager.SimpleOnPageChangeListener() {
@Override
public void onPageSelected(int position) {
+ updateSelected();
if (mPageIndicator == null) return;
if (mPageListener != null) {
mPageListener.onPageChanged(isLayoutRtl() ? position == mPages.size() - 1
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSTileView.java b/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSTileView.java
index d21b06f..5649f7f 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSTileView.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSTileView.java
@@ -107,15 +107,6 @@
}
@Override
- public void setExpansion(float expansion) {
- // Start the marquee when fully expanded and stop when fully collapsed. Leave as is for
- // other expansion ratios since there is no way way to pause the marquee.
- boolean selected = expansion == 1f ? true : expansion == 0f ? false : mLabel.isSelected();
- mLabel.setSelected(selected);
- mSecondLine.setSelected(selected);
- }
-
- @Override
protected void handleStateChanged(QSTile.State state) {
super.handleStateChanged(state);
if (!Objects.equals(mLabel.getText(), state.label) || mState != state.state) {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/car/UserGridRecyclerView.java b/packages/SystemUI/src/com/android/systemui/statusbar/car/UserGridRecyclerView.java
index dbd1cd4..f1e2302 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/car/UserGridRecyclerView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/car/UserGridRecyclerView.java
@@ -20,7 +20,9 @@
import android.content.pm.UserInfo;
import android.content.res.ColorStateList;
import android.content.res.Resources;
+import android.graphics.Bitmap;
import android.os.AsyncTask;
+import android.os.UserHandle;
import android.support.v7.widget.RecyclerView;
import android.util.AttributeSet;
import android.view.LayoutInflater;
@@ -31,6 +33,7 @@
import androidx.car.widget.PagedListView;
+import com.android.internal.util.UserIcons;
import com.android.settingslib.users.UserManagerHelper;
import com.android.systemui.R;
@@ -180,13 +183,7 @@
@Override
public void onBindViewHolder(UserAdapterViewHolder holder, int position) {
UserRecord userRecord = mUsers.get(position);
- if (!userRecord.mIsAddUser) {
- holder.mUserAvatarImageView.setImageBitmap(mUserManagerHelper
- .getUserIcon(userRecord.mInfo));
- } else {
- holder.mUserAvatarImageView.setImageDrawable(mContext
- .getDrawable(R.drawable.car_add_circle_round));
- }
+ holder.mUserAvatarImageView.setImageBitmap(getUserRecordIcon(userRecord));
holder.mUserNameTextView.setText(userRecord.mInfo.name);
holder.mView.setOnClickListener(v -> {
if (userRecord == null) {
@@ -219,6 +216,20 @@
}
+ private Bitmap getUserRecordIcon(UserRecord userRecord) {
+ if (userRecord.mIsStartGuestSession) {
+ return UserIcons.convertToBitmap(UserIcons.getDefaultUserIcon(
+ mContext.getResources(), UserHandle.USER_NULL, false));
+ }
+
+ if (userRecord.mIsAddUser) {
+ return UserIcons.convertToBitmap(mContext
+ .getDrawable(R.drawable.car_add_circle_round));
+ }
+
+ return mUserManagerHelper.getUserIcon(userRecord.mInfo);
+ }
+
private class AddNewUserTask extends AsyncTask<String, Void, UserInfo> {
@Override
diff --git a/services/core/java/com/android/server/wm/WindowState.java b/services/core/java/com/android/server/wm/WindowState.java
index f61ea52..6c2821d 100644
--- a/services/core/java/com/android/server/wm/WindowState.java
+++ b/services/core/java/com/android/server/wm/WindowState.java
@@ -4717,16 +4717,38 @@
outPoint.offset(-mAttrs.surfaceInsets.left, -mAttrs.surfaceInsets.top);
}
+ boolean needsRelativeLayeringToIme() {
+ // We only use the relative layering mode in split screen, as part of elevating the IME
+ // and windows above it's target above the docked divider.
+ if (!inSplitScreenWindowingMode()) {
+ return false;
+ }
+
+ if (isChildWindow()) {
+ // If we are a child of the input method target we need this promotion.
+ if (getParentWindow().isInputMethodTarget()) {
+ return true;
+ }
+ } else if (mAppToken != null) {
+ // Likewise if we share a token with the Input method target and are ordered
+ // above it but not necessarily a child (e.g. a Dialog) then we also need
+ // this promotion.
+ final WindowState imeTarget = mService.mInputMethodTarget;
+ boolean inTokenWithAndAboveImeTarget = imeTarget != null && imeTarget != this
+ && imeTarget.mToken == mToken && imeTarget.compareTo(this) <= 0;
+ return inTokenWithAndAboveImeTarget;
+ }
+ return false;
+ }
+
@Override
void assignLayer(Transaction t, int layer) {
// See comment in assignRelativeLayerForImeTargetChild
- if (!isChildWindow()
- || (!getParentWindow().isInputMethodTarget())
- || !inSplitScreenWindowingMode()) {
- super.assignLayer(t, layer);
+ if (needsRelativeLayeringToIme()) {
+ getDisplayContent().assignRelativeLayerForImeTargetChild(t, this);
return;
}
- getDisplayContent().assignRelativeLayerForImeTargetChild(t, this);
+ super.assignLayer(t, layer);
}
@Override
diff --git a/tools/aapt2/Resources.proto b/tools/aapt2/Resources.proto
index df483b2..d7a3771 100644
--- a/tools/aapt2/Resources.proto
+++ b/tools/aapt2/Resources.proto
@@ -306,6 +306,7 @@
}
// A value that represents a primitive data type (float, int, boolean, etc.).
+// Refer to Res_value in ResourceTypes.h for info on types and formatting
message Primitive {
message NullType {
}
@@ -315,8 +316,8 @@
NullType null_value = 1;
EmptyType empty_value = 2;
float float_value = 3;
- float dimension_value = 4;
- float fraction_value = 5;
+ uint32 dimension_value = 13;
+ uint32 fraction_value = 14;
int32 int_decimal_value = 6;
uint32 int_hexadecimal_value = 7;
bool boolean_value = 8;
@@ -324,6 +325,8 @@
uint32 color_rgb8_value = 10;
uint32 color_argb4_value = 11;
uint32 color_rgb4_value = 12;
+ float dimension_value_deprecated = 4 [deprecated=true];
+ float fraction_value_deprecated = 5 [deprecated=true];
}
}
diff --git a/tools/aapt2/format/proto/ProtoDeserialize.cpp b/tools/aapt2/format/proto/ProtoDeserialize.cpp
index f1eb952..3b101b7 100644
--- a/tools/aapt2/format/proto/ProtoDeserialize.cpp
+++ b/tools/aapt2/format/proto/ProtoDeserialize.cpp
@@ -780,13 +780,11 @@
} break;
case pb::Primitive::kDimensionValue: {
val.dataType = android::Res_value::TYPE_DIMENSION;
- float dimen_val = pb_prim.dimension_value();
- val.data = *(uint32_t*)&dimen_val;
+ val.data = pb_prim.dimension_value();
} break;
case pb::Primitive::kFractionValue: {
val.dataType = android::Res_value::TYPE_FRACTION;
- float fraction_val = pb_prim.fraction_value();
- val.data = *(uint32_t*)&fraction_val;
+ val.data = pb_prim.fraction_value();
} break;
case pb::Primitive::kIntDecimalValue: {
val.dataType = android::Res_value::TYPE_INT_DEC;
@@ -816,6 +814,16 @@
val.dataType = android::Res_value::TYPE_INT_COLOR_RGB4;
val.data = pb_prim.color_rgb4_value();
} break;
+ case pb::Primitive::kDimensionValueDeprecated: { // DEPRECATED
+ val.dataType = android::Res_value::TYPE_DIMENSION;
+ float dimen_val = pb_prim.dimension_value_deprecated();
+ val.data = *(uint32_t*)&dimen_val;
+ } break;
+ case pb::Primitive::kFractionValueDeprecated: { // DEPRECATED
+ val.dataType = android::Res_value::TYPE_FRACTION;
+ float fraction_val = pb_prim.fraction_value_deprecated();
+ val.data = *(uint32_t*)&fraction_val;
+ } break;
default: {
LOG(FATAL) << "Unexpected Primitive type: "
<< static_cast<uint32_t>(pb_prim.oneof_value_case());
diff --git a/tools/aapt2/format/proto/ProtoSerialize.cpp b/tools/aapt2/format/proto/ProtoSerialize.cpp
index 2e56359..411cc29 100644
--- a/tools/aapt2/format/proto/ProtoSerialize.cpp
+++ b/tools/aapt2/format/proto/ProtoSerialize.cpp
@@ -452,10 +452,10 @@
pb_prim->set_float_value(*(float*)&val.data);
} break;
case android::Res_value::TYPE_DIMENSION: {
- pb_prim->set_dimension_value(*(float*)&val.data);
+ pb_prim->set_dimension_value(val.data);
} break;
case android::Res_value::TYPE_FRACTION: {
- pb_prim->set_fraction_value(*(float*)&val.data);
+ pb_prim->set_fraction_value(val.data);
} break;
case android::Res_value::TYPE_INT_DEC: {
pb_prim->set_int_decimal_value(static_cast<int32_t>(val.data));
diff --git a/tools/aapt2/format/proto/ProtoSerialize_test.cpp b/tools/aapt2/format/proto/ProtoSerialize_test.cpp
index 6366a3d..21fdbd8 100644
--- a/tools/aapt2/format/proto/ProtoSerialize_test.cpp
+++ b/tools/aapt2/format/proto/ProtoSerialize_test.cpp
@@ -271,6 +271,7 @@
.AddValue("android:integer/hex_int_abcd", ResourceUtils::TryParseInt("0xABCD"))
.AddValue("android:dimen/dimen_1.39mm", ResourceUtils::TryParseFloat("1.39mm"))
.AddValue("android:fraction/fraction_27", ResourceUtils::TryParseFloat("27%"))
+ .AddValue("android:dimen/neg_2.3in", ResourceUtils::TryParseFloat("-2.3in"))
.AddValue("android:integer/null", ResourceUtils::MakeEmpty())
.Build();
@@ -353,6 +354,12 @@
EXPECT_THAT(bp->value.dataType, Eq(android::Res_value::TYPE_FRACTION));
EXPECT_THAT(bp->value.data, Eq(ResourceUtils::TryParseFloat("27%")->value.data));
+ bp = test::GetValueForConfigAndProduct<BinaryPrimitive>(&new_table, "android:dimen/neg_2.3in",
+ ConfigDescription::DefaultConfig(), "");
+ ASSERT_THAT(bp, NotNull());
+ EXPECT_THAT(bp->value.dataType, Eq(android::Res_value::TYPE_DIMENSION));
+ EXPECT_THAT(bp->value.data, Eq(ResourceUtils::TryParseFloat("-2.3in")->value.data));
+
bp = test::GetValueForConfigAndProduct<BinaryPrimitive>(&new_table, "android:integer/null",
ConfigDescription::DefaultConfig(), "");
ASSERT_THAT(bp, NotNull());