Loading core/api/current.txt +9 −0 Original line number Diff line number Diff line Loading @@ -55532,13 +55532,16 @@ package android.widget { method public void setChar(@IdRes int, String, char); method public void setCharSequence(@IdRes int, String, CharSequence); method public void setCharSequence(@IdRes int, @NonNull String, @StringRes int); method public void setCharSequenceAttr(@IdRes int, @NonNull String, @AttrRes int); method public void setChronometer(@IdRes int, long, String, boolean); method public void setChronometerCountDown(@IdRes int, boolean); method public void setColor(@IdRes int, @NonNull String, @ColorRes int); method public void setColorAttr(@IdRes int, @NonNull String, @AttrRes int); method public void setColorInt(@IdRes int, @NonNull String, @ColorInt int, @ColorInt int); method public void setColorStateList(@IdRes int, @NonNull String, @Nullable android.content.res.ColorStateList); method public void setColorStateList(@IdRes int, @NonNull String, @Nullable android.content.res.ColorStateList, @Nullable android.content.res.ColorStateList); method public void setColorStateList(@IdRes int, @NonNull String, @ColorRes int); method public void setColorStateListAttr(@IdRes int, @NonNull String, @AttrRes int); method public void setCompoundButtonChecked(@IdRes int, boolean); method public void setContentDescription(@IdRes int, CharSequence); method public void setDisplayedChild(@IdRes int, int); Loading @@ -55547,6 +55550,7 @@ package android.widget { method public void setFloat(@IdRes int, String, float); method public void setFloatDimen(@IdRes int, @NonNull String, @DimenRes int); method public void setFloatDimen(@IdRes int, @NonNull String, float, int); method public void setFloatDimenAttr(@IdRes int, @NonNull String, @AttrRes int); method public void setIcon(@IdRes int, String, android.graphics.drawable.Icon); method public void setIcon(@IdRes int, @NonNull String, @Nullable android.graphics.drawable.Icon, @Nullable android.graphics.drawable.Icon); method public void setImageViewBitmap(@IdRes int, android.graphics.Bitmap); Loading @@ -55556,6 +55560,7 @@ package android.widget { method public void setInt(@IdRes int, String, int); method public void setIntDimen(@IdRes int, @NonNull String, @DimenRes int); method public void setIntDimen(@IdRes int, @NonNull String, float, int); method public void setIntDimenAttr(@IdRes int, @NonNull String, @AttrRes int); method public void setIntent(@IdRes int, String, android.content.Intent); method public void setLabelFor(@IdRes int, @IdRes int); method public void setLightBackgroundLayoutId(@LayoutRes int); Loading @@ -55581,12 +55586,16 @@ package android.widget { method public void setTextViewTextSize(@IdRes int, int, float); method public void setUri(@IdRes int, String, android.net.Uri); method public void setViewLayoutHeight(@IdRes int, float, int); method public void setViewLayoutHeightAttr(@IdRes int, @AttrRes int); method public void setViewLayoutHeightDimen(@IdRes int, @DimenRes int); method public void setViewLayoutMargin(@IdRes int, int, float, int); method public void setViewLayoutMarginAttr(@IdRes int, int, @AttrRes int); method public void setViewLayoutMarginDimen(@IdRes int, int, @DimenRes int); method public void setViewLayoutWidth(@IdRes int, float, int); method public void setViewLayoutWidthAttr(@IdRes int, @AttrRes int); method public void setViewLayoutWidthDimen(@IdRes int, @DimenRes int); method public void setViewOutlinePreferredRadius(@IdRes int, float, int); method public void setViewOutlinePreferredRadiusAttr(@IdRes int, @AttrRes int); method public void setViewOutlinePreferredRadiusDimen(@IdRes int, @DimenRes int); method public void setViewPadding(@IdRes int, @Px int, @Px int, @Px int, @Px int); method public void setViewVisibility(@IdRes int, int); core/java/android/widget/RemoteViews.java +322 −38 Original line number Diff line number Diff line Loading @@ -16,6 +16,7 @@ package android.widget; import android.annotation.AttrRes; import android.annotation.ColorInt; import android.annotation.ColorRes; import android.annotation.DimenRes; Loading Loading @@ -228,6 +229,7 @@ public class RemoteViews implements Parcelable, Filter { private static final int SET_ON_CHECKED_CHANGE_RESPONSE_TAG = 29; private static final int NIGHT_MODE_REFLECTION_ACTION_TAG = 30; private static final int SET_REMOTE_COLLECTION_ITEMS_ADAPTER_TAG = 31; private static final int ATTRIBUTE_REFLECTION_ACTION_TAG = 32; /** @hide **/ @IntDef(prefix = "MARGIN_", value = { Loading @@ -253,6 +255,19 @@ public class RemoteViews implements Parcelable, Filter { /** The value will apply to the marginEnd. */ public static final int MARGIN_END = 5; @IntDef(prefix = "VALUE_TYPE_", value = { VALUE_TYPE_RAW, VALUE_TYPE_COMPLEX_UNIT, VALUE_TYPE_RESOURCE, VALUE_TYPE_ATTRIBUTE }) @Retention(RetentionPolicy.SOURCE) @interface ValueType {} static final int VALUE_TYPE_RAW = 1; static final int VALUE_TYPE_COMPLEX_UNIT = 2; static final int VALUE_TYPE_RESOURCE = 3; static final int VALUE_TYPE_ATTRIBUTE = 4; /** @hide **/ @IntDef(flag = true, value = { FLAG_REAPPLY_DISALLOWED, Loading Loading @@ -1918,6 +1933,88 @@ public class RemoteViews implements Parcelable, Filter { } } private final class AttributeReflectionAction extends BaseReflectionAction { static final int DIMEN_RESOURCE = 1; static final int COLOR_RESOURCE = 2; static final int STRING_RESOURCE = 3; private final int mResourceType; private final int mAttrId; AttributeReflectionAction(@IdRes int viewId, String methodName, int parameterType, int resourceType, int attrId) { super(viewId, methodName, parameterType); this.mResourceType = resourceType; this.mAttrId = attrId; } AttributeReflectionAction(Parcel in) { super(in); this.mResourceType = in.readInt(); this.mAttrId = in.readInt(); } @Override public void writeToParcel(Parcel dest, int flags) { super.writeToParcel(dest, flags); dest.writeInt(this.mResourceType); dest.writeInt(this.mAttrId); } @Override protected @NonNull Object getParameterValue(View view) throws ActionException { try { TypedArray typedArray = view.getContext().obtainStyledAttributes( new int[]{this.mAttrId}); try { if (typedArray.getType(0) == TypedValue.TYPE_NULL) { throw new ActionException("Attribute 0x" + Integer.toHexString(this.mAttrId) + " is not defined"); } switch (this.mResourceType) { case DIMEN_RESOURCE: if (this.type == BaseReflectionAction.INT) { return typedArray.getDimensionPixelSize(0, 0); } return typedArray.getDimension(0, 0); case COLOR_RESOURCE: switch (this.type) { case BaseReflectionAction.INT: return typedArray.getColor(0, 0); case BaseReflectionAction.COLOR_STATE_LIST: return typedArray.getColorStateList(0); default: throw new ActionException( "Color attribute 0x" + Integer.toHexString(this.mAttrId) + " must be used as int or ColorStateList"); } case STRING_RESOURCE: String value = typedArray.getString(0); if (value == null) { throw new ActionException("Attribute 0x" + Integer.toHexString(this.mAttrId) + " is not a defined or is not a string"); } return value; default: // Note: This can only be an implementation error. throw new ActionException( "Unknown resource type: " + this.mResourceType); } } finally { typedArray.recycle(); } } catch (Throwable t) { throw new ActionException(t); } } @Override public int getActionTag() { return ATTRIBUTE_REFLECTION_ACTION_TAG; } } private final class ComplexUnitDimensionReflectionAction extends BaseReflectionAction { private final float mValue; Loading Loading @@ -2792,7 +2889,7 @@ public class RemoteViews implements Parcelable, Filter { static final int LAYOUT_HEIGHT = 9; final int mProperty; final boolean mIsDimen; final int mValueType; final int mValue; /** Loading @@ -2805,33 +2902,36 @@ public class RemoteViews implements Parcelable, Filter { @ComplexDimensionUnit int units) { this.viewId = viewId; this.mProperty = property; this.mIsDimen = false; this.mValueType = VALUE_TYPE_COMPLEX_UNIT; this.mValue = TypedValue.createComplexDimension(value, units); } /** * @param viewId ID of the view alter * @param property which layout parameter to alter * @param dimen new dimension with the value of the layout parameter * @param value value to set. * @param valueType must be one of {@link #VALUE_TYPE_COMPLEX_UNIT}, * {@link #VALUE_TYPE_RESOURCE}, {@link #VALUE_TYPE_ATTRIBUTE} or * {@link #VALUE_TYPE_RAW}. */ LayoutParamAction(@IdRes int viewId, int property, @DimenRes int dimen) { LayoutParamAction(@IdRes int viewId, int property, int value, @ValueType int valueType) { this.viewId = viewId; this.mProperty = property; this.mIsDimen = true; this.mValue = dimen; this.mValueType = valueType; this.mValue = value; } public LayoutParamAction(Parcel parcel) { viewId = parcel.readInt(); mProperty = parcel.readInt(); mIsDimen = parcel.readBoolean(); mValueType = parcel.readInt(); mValue = parcel.readInt(); } public void writeToParcel(Parcel dest, int flags) { dest.writeInt(viewId); dest.writeInt(mProperty); dest.writeBoolean(mIsDimen); dest.writeInt(mValueType); dest.writeInt(mValue); } Loading Loading @@ -2897,25 +2997,57 @@ public class RemoteViews implements Parcelable, Filter { } private int getPixelOffset(View target) { if (mIsDimen) { try { switch (mValueType) { case VALUE_TYPE_ATTRIBUTE: TypedArray typedArray = target.getContext().obtainStyledAttributes( new int[]{this.mValue}); try { return typedArray.getDimensionPixelOffset(0, 0); } finally { typedArray.recycle(); } case VALUE_TYPE_RESOURCE: if (mValue == 0) { return 0; } return target.getResources().getDimensionPixelOffset(mValue); } case VALUE_TYPE_COMPLEX_UNIT: return TypedValue.complexToDimensionPixelOffset(mValue, target.getResources().getDisplayMetrics()); default: return mValue; } } catch (Throwable t) { throw new ActionException(t); } } private int getPixelSize(View target) { if (mIsDimen) { try { switch (mValueType) { case VALUE_TYPE_ATTRIBUTE: TypedArray typedArray = target.getContext().obtainStyledAttributes( new int[]{this.mValue}); try { return typedArray.getDimensionPixelSize(0, 0); } finally { typedArray.recycle(); } case VALUE_TYPE_RESOURCE: if (mValue == 0) { return 0; } return target.getResources().getDimensionPixelSize(mValue); } case VALUE_TYPE_COMPLEX_UNIT: return TypedValue.complexToDimensionPixelSize(mValue, target.getResources().getDisplayMetrics()); default: return mValue; } } catch (Throwable t) { throw new ActionException(t); } } @Override Loading Loading @@ -3170,33 +3302,35 @@ public class RemoteViews implements Parcelable, Filter { private static class SetViewOutlinePreferredRadiusAction extends Action { private final boolean mIsDimen; @ValueType private final int mValueType; private final int mValue; SetViewOutlinePreferredRadiusAction(@IdRes int viewId, @DimenRes int dimenResId) { SetViewOutlinePreferredRadiusAction(@IdRes int viewId, int value, @ValueType int valueType) { this.viewId = viewId; this.mIsDimen = true; this.mValue = dimenResId; this.mValueType = valueType; this.mValue = value; } SetViewOutlinePreferredRadiusAction( @IdRes int viewId, float radius, @ComplexDimensionUnit int units) { this.viewId = viewId; this.mIsDimen = false; this.mValueType = VALUE_TYPE_COMPLEX_UNIT; this.mValue = TypedValue.createComplexDimension(radius, units); } SetViewOutlinePreferredRadiusAction(Parcel in) { viewId = in.readInt(); mIsDimen = in.readBoolean(); mValueType = in.readInt(); mValue = in.readInt(); } @Override public void writeToParcel(Parcel dest, int flags) { dest.writeInt(viewId); dest.writeBoolean(mIsDimen); dest.writeInt(mValueType); dest.writeInt(mValue); } Loading @@ -3206,14 +3340,32 @@ public class RemoteViews implements Parcelable, Filter { final View target = root.findViewById(viewId); if (target == null) return; try { float radius; if (mIsDimen) { switch (mValueType) { case VALUE_TYPE_ATTRIBUTE: TypedArray typedArray = target.getContext().obtainStyledAttributes( new int[]{mValue}); try { radius = typedArray.getDimension(0, 0); } finally { typedArray.recycle(); } break; case VALUE_TYPE_RESOURCE: radius = mValue == 0 ? 0 : target.getResources().getDimension(mValue); } else { radius = TypedValue.complexToDimensionPixelSize(mValue, break; case VALUE_TYPE_COMPLEX_UNIT: radius = TypedValue.complexToDimension(mValue, target.getResources().getDisplayMetrics()); break; default: radius = mValue; } target.setOutlineProvider(new RemoteViewOutlineProvider(radius)); } catch (Throwable t) { throw new ActionException(t); } } @Override Loading Loading @@ -3613,6 +3765,8 @@ public class RemoteViews implements Parcelable, Filter { return new NightModeReflectionAction(parcel); case SET_REMOTE_COLLECTION_ITEMS_ADAPTER_TAG: return new SetRemoteCollectionItemListAdapterAction(parcel); case ATTRIBUTE_REFLECTION_ACTION_TAG: return new AttributeReflectionAction(parcel); default: throw new ActionException("Tag " + tag + " not found"); } Loading Loading @@ -4348,7 +4502,20 @@ public class RemoteViews implements Parcelable, Filter { */ public void setViewLayoutMarginDimen(@IdRes int viewId, @MarginType int type, @DimenRes int dimen) { addAction(new LayoutParamAction(viewId, type, dimen)); addAction(new LayoutParamAction(viewId, type, dimen, VALUE_TYPE_RESOURCE)); } /** * Equivalent to calling {@link MarginLayoutParams#setMarginEnd}. * Only works if the {@link View#getLayoutParams()} supports margins. * * @param viewId The id of the view to change * @param type The margin being set e.g. {@link #MARGIN_END} * @param attr a dimension attribute to apply to the margin. */ public void setViewLayoutMarginAttr(@IdRes int viewId, @MarginType int type, @AttrRes int attr) { addAction(new LayoutParamAction(viewId, type, attr, VALUE_TYPE_ATTRIBUTE)); } /** Loading Loading @@ -4393,7 +4560,19 @@ public class RemoteViews implements Parcelable, Filter { * @param widthDimen the dimension resource for the view's width */ public void setViewLayoutWidthDimen(@IdRes int viewId, @DimenRes int widthDimen) { addAction(new LayoutParamAction(viewId, LayoutParamAction.LAYOUT_WIDTH, widthDimen)); addAction(new LayoutParamAction(viewId, LayoutParamAction.LAYOUT_WIDTH, widthDimen, VALUE_TYPE_RESOURCE)); } /** * Equivalent to setting {@link android.view.ViewGroup.LayoutParams#width} with * the value of the given attribute in the current theme. * * @param widthAttr the dimension attribute for the view's width */ public void setViewLayoutWidthAttr(@IdRes int viewId, @AttrRes int widthAttr) { addAction(new LayoutParamAction(viewId, LayoutParamAction.LAYOUT_WIDTH, widthAttr, VALUE_TYPE_ATTRIBUTE)); } /** Loading @@ -4420,7 +4599,19 @@ public class RemoteViews implements Parcelable, Filter { * @param heightDimen a dimen resource to read the height from. */ public void setViewLayoutHeightDimen(@IdRes int viewId, @DimenRes int heightDimen) { addAction(new LayoutParamAction(viewId, LayoutParamAction.LAYOUT_HEIGHT, heightDimen)); addAction(new LayoutParamAction(viewId, LayoutParamAction.LAYOUT_HEIGHT, heightDimen, VALUE_TYPE_RESOURCE)); } /** * Equivalent to setting {@link android.view.ViewGroup.LayoutParams#height} with * the value of the given attribute in the current theme. * * @param heightAttr a dimen attribute to read the height from. */ public void setViewLayoutHeightAttr(@IdRes int viewId, @AttrRes int heightAttr) { addAction(new LayoutParamAction(viewId, LayoutParamAction.LAYOUT_HEIGHT, heightAttr, VALUE_TYPE_ATTRIBUTE)); } /** Loading @@ -4441,7 +4632,15 @@ public class RemoteViews implements Parcelable, Filter { * {@code resId}. */ public void setViewOutlinePreferredRadiusDimen(@IdRes int viewId, @DimenRes int resId) { addAction(new SetViewOutlinePreferredRadiusAction(viewId, resId)); addAction(new SetViewOutlinePreferredRadiusAction(viewId, resId, VALUE_TYPE_RESOURCE)); } /** * Sets an OutlineProvider on the view whose corner radius is a dimension attribute with * {@code attrId}. */ public void setViewOutlinePreferredRadiusAttr(@IdRes int viewId, @AttrRes int attrId) { addAction(new SetViewOutlinePreferredRadiusAction(viewId, attrId, VALUE_TYPE_ATTRIBUTE)); } /** Loading Loading @@ -4522,6 +4721,23 @@ public class RemoteViews implements Parcelable, Filter { value, unit)); } /** * Call a method taking one int, a size in pixels, on a view in the layout for this * RemoteViews. * * The dimension will be resolved from the theme attribute at the time the * {@link RemoteViews} is (re-)applied. * * @param viewId The id of the view on which to call the method. * @param methodName The name of the method to call. * @param dimenAttr The attribute to resolve and pass as argument to the method. */ public void setIntDimenAttr(@IdRes int viewId, @NonNull String methodName, @AttrRes int dimenAttr) { addAction(new AttributeReflectionAction(viewId, methodName, BaseReflectionAction.INT, ResourceReflectionAction.DIMEN_RESOURCE, dimenAttr)); } /** * Call a method taking one int, a color, on a view in the layout for this RemoteViews. * Loading @@ -4538,6 +4754,22 @@ public class RemoteViews implements Parcelable, Filter { ResourceReflectionAction.COLOR_RESOURCE, colorResource)); } /** * Call a method taking one int, a color, on a view in the layout for this RemoteViews. * * The Color will be resolved from the theme attribute at the time the {@link RemoteViews} is * (re-)applied. * * @param viewId The id of the view on which to call the method. * @param methodName The name of the method to call. * @param colorAttribute The theme attribute to resolve and pass as argument to the method. */ public void setColorAttr(@IdRes int viewId, @NonNull String methodName, @AttrRes int colorAttribute) { addAction(new AttributeReflectionAction(viewId, methodName, BaseReflectionAction.INT, AttributeReflectionAction.COLOR_RESOURCE, colorAttribute)); } /** * Call a method taking one int, a color, on a view in the layout for this RemoteViews. * Loading Loading @@ -4617,6 +4849,23 @@ public class RemoteViews implements Parcelable, Filter { colorResource)); } /** * Call a method taking one ColorStateList on a view in the layout for this RemoteViews. * * The ColorStateList will be resolved from the theme attribute at the time the * {@link RemoteViews} is (re-)applied. * * @param viewId The id of the view on which to call the method. * @param methodName The name of the method to call. * @param colorAttr The theme attribute to resolve and pass as argument to the method. */ public void setColorStateListAttr(@IdRes int viewId, @NonNull String methodName, @AttrRes int colorAttr) { addAction(new AttributeReflectionAction(viewId, methodName, BaseReflectionAction.COLOR_STATE_LIST, ResourceReflectionAction.COLOR_RESOURCE, colorAttr)); } /** * Call a method taking one long on a view in the layout for this RemoteViews. * Loading Loading @@ -4675,6 +4924,23 @@ public class RemoteViews implements Parcelable, Filter { value, unit)); } /** * Call a method taking one float, a size in pixels, on a view in the layout for this * RemoteViews. * * The dimension will be resolved from the theme attribute at the time the {@link RemoteViews} * is (re-)applied. * * @param viewId The id of the view on which to call the method. * @param methodName The name of the method to call. * @param dimenAttr The attribute to resolve and pass as argument to the method. */ public void setFloatDimenAttr(@IdRes int viewId, @NonNull String methodName, @AttrRes int dimenAttr) { addAction(new AttributeReflectionAction(viewId, methodName, BaseReflectionAction.FLOAT, ResourceReflectionAction.DIMEN_RESOURCE, dimenAttr)); } /** * Call a method taking one double on a view in the layout for this RemoteViews. * Loading Loading @@ -4737,6 +5003,24 @@ public class RemoteViews implements Parcelable, Filter { ResourceReflectionAction.STRING_RESOURCE, stringResource)); } /** * Call a method taking one CharSequence on a view in the layout for this RemoteViews. * * The CharSequence will be resolved from the theme attribute at the time the * {@link RemoteViews} is (re-)applied. * * @param viewId The id of the view on which to call the method. * @param methodName The name of the method to call. * @param stringAttribute The attribute to resolve and pass as argument to the method. */ public void setCharSequenceAttr(@IdRes int viewId, @NonNull String methodName, @AttrRes int stringAttribute) { addAction( new AttributeReflectionAction(viewId, methodName, BaseReflectionAction.CHAR_SEQUENCE, AttributeReflectionAction.STRING_RESOURCE, stringAttribute)); } /** * Call a method taking one Uri on a view in the layout for this RemoteViews. * Loading Loading
core/api/current.txt +9 −0 Original line number Diff line number Diff line Loading @@ -55532,13 +55532,16 @@ package android.widget { method public void setChar(@IdRes int, String, char); method public void setCharSequence(@IdRes int, String, CharSequence); method public void setCharSequence(@IdRes int, @NonNull String, @StringRes int); method public void setCharSequenceAttr(@IdRes int, @NonNull String, @AttrRes int); method public void setChronometer(@IdRes int, long, String, boolean); method public void setChronometerCountDown(@IdRes int, boolean); method public void setColor(@IdRes int, @NonNull String, @ColorRes int); method public void setColorAttr(@IdRes int, @NonNull String, @AttrRes int); method public void setColorInt(@IdRes int, @NonNull String, @ColorInt int, @ColorInt int); method public void setColorStateList(@IdRes int, @NonNull String, @Nullable android.content.res.ColorStateList); method public void setColorStateList(@IdRes int, @NonNull String, @Nullable android.content.res.ColorStateList, @Nullable android.content.res.ColorStateList); method public void setColorStateList(@IdRes int, @NonNull String, @ColorRes int); method public void setColorStateListAttr(@IdRes int, @NonNull String, @AttrRes int); method public void setCompoundButtonChecked(@IdRes int, boolean); method public void setContentDescription(@IdRes int, CharSequence); method public void setDisplayedChild(@IdRes int, int); Loading @@ -55547,6 +55550,7 @@ package android.widget { method public void setFloat(@IdRes int, String, float); method public void setFloatDimen(@IdRes int, @NonNull String, @DimenRes int); method public void setFloatDimen(@IdRes int, @NonNull String, float, int); method public void setFloatDimenAttr(@IdRes int, @NonNull String, @AttrRes int); method public void setIcon(@IdRes int, String, android.graphics.drawable.Icon); method public void setIcon(@IdRes int, @NonNull String, @Nullable android.graphics.drawable.Icon, @Nullable android.graphics.drawable.Icon); method public void setImageViewBitmap(@IdRes int, android.graphics.Bitmap); Loading @@ -55556,6 +55560,7 @@ package android.widget { method public void setInt(@IdRes int, String, int); method public void setIntDimen(@IdRes int, @NonNull String, @DimenRes int); method public void setIntDimen(@IdRes int, @NonNull String, float, int); method public void setIntDimenAttr(@IdRes int, @NonNull String, @AttrRes int); method public void setIntent(@IdRes int, String, android.content.Intent); method public void setLabelFor(@IdRes int, @IdRes int); method public void setLightBackgroundLayoutId(@LayoutRes int); Loading @@ -55581,12 +55586,16 @@ package android.widget { method public void setTextViewTextSize(@IdRes int, int, float); method public void setUri(@IdRes int, String, android.net.Uri); method public void setViewLayoutHeight(@IdRes int, float, int); method public void setViewLayoutHeightAttr(@IdRes int, @AttrRes int); method public void setViewLayoutHeightDimen(@IdRes int, @DimenRes int); method public void setViewLayoutMargin(@IdRes int, int, float, int); method public void setViewLayoutMarginAttr(@IdRes int, int, @AttrRes int); method public void setViewLayoutMarginDimen(@IdRes int, int, @DimenRes int); method public void setViewLayoutWidth(@IdRes int, float, int); method public void setViewLayoutWidthAttr(@IdRes int, @AttrRes int); method public void setViewLayoutWidthDimen(@IdRes int, @DimenRes int); method public void setViewOutlinePreferredRadius(@IdRes int, float, int); method public void setViewOutlinePreferredRadiusAttr(@IdRes int, @AttrRes int); method public void setViewOutlinePreferredRadiusDimen(@IdRes int, @DimenRes int); method public void setViewPadding(@IdRes int, @Px int, @Px int, @Px int, @Px int); method public void setViewVisibility(@IdRes int, int);
core/java/android/widget/RemoteViews.java +322 −38 Original line number Diff line number Diff line Loading @@ -16,6 +16,7 @@ package android.widget; import android.annotation.AttrRes; import android.annotation.ColorInt; import android.annotation.ColorRes; import android.annotation.DimenRes; Loading Loading @@ -228,6 +229,7 @@ public class RemoteViews implements Parcelable, Filter { private static final int SET_ON_CHECKED_CHANGE_RESPONSE_TAG = 29; private static final int NIGHT_MODE_REFLECTION_ACTION_TAG = 30; private static final int SET_REMOTE_COLLECTION_ITEMS_ADAPTER_TAG = 31; private static final int ATTRIBUTE_REFLECTION_ACTION_TAG = 32; /** @hide **/ @IntDef(prefix = "MARGIN_", value = { Loading @@ -253,6 +255,19 @@ public class RemoteViews implements Parcelable, Filter { /** The value will apply to the marginEnd. */ public static final int MARGIN_END = 5; @IntDef(prefix = "VALUE_TYPE_", value = { VALUE_TYPE_RAW, VALUE_TYPE_COMPLEX_UNIT, VALUE_TYPE_RESOURCE, VALUE_TYPE_ATTRIBUTE }) @Retention(RetentionPolicy.SOURCE) @interface ValueType {} static final int VALUE_TYPE_RAW = 1; static final int VALUE_TYPE_COMPLEX_UNIT = 2; static final int VALUE_TYPE_RESOURCE = 3; static final int VALUE_TYPE_ATTRIBUTE = 4; /** @hide **/ @IntDef(flag = true, value = { FLAG_REAPPLY_DISALLOWED, Loading Loading @@ -1918,6 +1933,88 @@ public class RemoteViews implements Parcelable, Filter { } } private final class AttributeReflectionAction extends BaseReflectionAction { static final int DIMEN_RESOURCE = 1; static final int COLOR_RESOURCE = 2; static final int STRING_RESOURCE = 3; private final int mResourceType; private final int mAttrId; AttributeReflectionAction(@IdRes int viewId, String methodName, int parameterType, int resourceType, int attrId) { super(viewId, methodName, parameterType); this.mResourceType = resourceType; this.mAttrId = attrId; } AttributeReflectionAction(Parcel in) { super(in); this.mResourceType = in.readInt(); this.mAttrId = in.readInt(); } @Override public void writeToParcel(Parcel dest, int flags) { super.writeToParcel(dest, flags); dest.writeInt(this.mResourceType); dest.writeInt(this.mAttrId); } @Override protected @NonNull Object getParameterValue(View view) throws ActionException { try { TypedArray typedArray = view.getContext().obtainStyledAttributes( new int[]{this.mAttrId}); try { if (typedArray.getType(0) == TypedValue.TYPE_NULL) { throw new ActionException("Attribute 0x" + Integer.toHexString(this.mAttrId) + " is not defined"); } switch (this.mResourceType) { case DIMEN_RESOURCE: if (this.type == BaseReflectionAction.INT) { return typedArray.getDimensionPixelSize(0, 0); } return typedArray.getDimension(0, 0); case COLOR_RESOURCE: switch (this.type) { case BaseReflectionAction.INT: return typedArray.getColor(0, 0); case BaseReflectionAction.COLOR_STATE_LIST: return typedArray.getColorStateList(0); default: throw new ActionException( "Color attribute 0x" + Integer.toHexString(this.mAttrId) + " must be used as int or ColorStateList"); } case STRING_RESOURCE: String value = typedArray.getString(0); if (value == null) { throw new ActionException("Attribute 0x" + Integer.toHexString(this.mAttrId) + " is not a defined or is not a string"); } return value; default: // Note: This can only be an implementation error. throw new ActionException( "Unknown resource type: " + this.mResourceType); } } finally { typedArray.recycle(); } } catch (Throwable t) { throw new ActionException(t); } } @Override public int getActionTag() { return ATTRIBUTE_REFLECTION_ACTION_TAG; } } private final class ComplexUnitDimensionReflectionAction extends BaseReflectionAction { private final float mValue; Loading Loading @@ -2792,7 +2889,7 @@ public class RemoteViews implements Parcelable, Filter { static final int LAYOUT_HEIGHT = 9; final int mProperty; final boolean mIsDimen; final int mValueType; final int mValue; /** Loading @@ -2805,33 +2902,36 @@ public class RemoteViews implements Parcelable, Filter { @ComplexDimensionUnit int units) { this.viewId = viewId; this.mProperty = property; this.mIsDimen = false; this.mValueType = VALUE_TYPE_COMPLEX_UNIT; this.mValue = TypedValue.createComplexDimension(value, units); } /** * @param viewId ID of the view alter * @param property which layout parameter to alter * @param dimen new dimension with the value of the layout parameter * @param value value to set. * @param valueType must be one of {@link #VALUE_TYPE_COMPLEX_UNIT}, * {@link #VALUE_TYPE_RESOURCE}, {@link #VALUE_TYPE_ATTRIBUTE} or * {@link #VALUE_TYPE_RAW}. */ LayoutParamAction(@IdRes int viewId, int property, @DimenRes int dimen) { LayoutParamAction(@IdRes int viewId, int property, int value, @ValueType int valueType) { this.viewId = viewId; this.mProperty = property; this.mIsDimen = true; this.mValue = dimen; this.mValueType = valueType; this.mValue = value; } public LayoutParamAction(Parcel parcel) { viewId = parcel.readInt(); mProperty = parcel.readInt(); mIsDimen = parcel.readBoolean(); mValueType = parcel.readInt(); mValue = parcel.readInt(); } public void writeToParcel(Parcel dest, int flags) { dest.writeInt(viewId); dest.writeInt(mProperty); dest.writeBoolean(mIsDimen); dest.writeInt(mValueType); dest.writeInt(mValue); } Loading Loading @@ -2897,25 +2997,57 @@ public class RemoteViews implements Parcelable, Filter { } private int getPixelOffset(View target) { if (mIsDimen) { try { switch (mValueType) { case VALUE_TYPE_ATTRIBUTE: TypedArray typedArray = target.getContext().obtainStyledAttributes( new int[]{this.mValue}); try { return typedArray.getDimensionPixelOffset(0, 0); } finally { typedArray.recycle(); } case VALUE_TYPE_RESOURCE: if (mValue == 0) { return 0; } return target.getResources().getDimensionPixelOffset(mValue); } case VALUE_TYPE_COMPLEX_UNIT: return TypedValue.complexToDimensionPixelOffset(mValue, target.getResources().getDisplayMetrics()); default: return mValue; } } catch (Throwable t) { throw new ActionException(t); } } private int getPixelSize(View target) { if (mIsDimen) { try { switch (mValueType) { case VALUE_TYPE_ATTRIBUTE: TypedArray typedArray = target.getContext().obtainStyledAttributes( new int[]{this.mValue}); try { return typedArray.getDimensionPixelSize(0, 0); } finally { typedArray.recycle(); } case VALUE_TYPE_RESOURCE: if (mValue == 0) { return 0; } return target.getResources().getDimensionPixelSize(mValue); } case VALUE_TYPE_COMPLEX_UNIT: return TypedValue.complexToDimensionPixelSize(mValue, target.getResources().getDisplayMetrics()); default: return mValue; } } catch (Throwable t) { throw new ActionException(t); } } @Override Loading Loading @@ -3170,33 +3302,35 @@ public class RemoteViews implements Parcelable, Filter { private static class SetViewOutlinePreferredRadiusAction extends Action { private final boolean mIsDimen; @ValueType private final int mValueType; private final int mValue; SetViewOutlinePreferredRadiusAction(@IdRes int viewId, @DimenRes int dimenResId) { SetViewOutlinePreferredRadiusAction(@IdRes int viewId, int value, @ValueType int valueType) { this.viewId = viewId; this.mIsDimen = true; this.mValue = dimenResId; this.mValueType = valueType; this.mValue = value; } SetViewOutlinePreferredRadiusAction( @IdRes int viewId, float radius, @ComplexDimensionUnit int units) { this.viewId = viewId; this.mIsDimen = false; this.mValueType = VALUE_TYPE_COMPLEX_UNIT; this.mValue = TypedValue.createComplexDimension(radius, units); } SetViewOutlinePreferredRadiusAction(Parcel in) { viewId = in.readInt(); mIsDimen = in.readBoolean(); mValueType = in.readInt(); mValue = in.readInt(); } @Override public void writeToParcel(Parcel dest, int flags) { dest.writeInt(viewId); dest.writeBoolean(mIsDimen); dest.writeInt(mValueType); dest.writeInt(mValue); } Loading @@ -3206,14 +3340,32 @@ public class RemoteViews implements Parcelable, Filter { final View target = root.findViewById(viewId); if (target == null) return; try { float radius; if (mIsDimen) { switch (mValueType) { case VALUE_TYPE_ATTRIBUTE: TypedArray typedArray = target.getContext().obtainStyledAttributes( new int[]{mValue}); try { radius = typedArray.getDimension(0, 0); } finally { typedArray.recycle(); } break; case VALUE_TYPE_RESOURCE: radius = mValue == 0 ? 0 : target.getResources().getDimension(mValue); } else { radius = TypedValue.complexToDimensionPixelSize(mValue, break; case VALUE_TYPE_COMPLEX_UNIT: radius = TypedValue.complexToDimension(mValue, target.getResources().getDisplayMetrics()); break; default: radius = mValue; } target.setOutlineProvider(new RemoteViewOutlineProvider(radius)); } catch (Throwable t) { throw new ActionException(t); } } @Override Loading Loading @@ -3613,6 +3765,8 @@ public class RemoteViews implements Parcelable, Filter { return new NightModeReflectionAction(parcel); case SET_REMOTE_COLLECTION_ITEMS_ADAPTER_TAG: return new SetRemoteCollectionItemListAdapterAction(parcel); case ATTRIBUTE_REFLECTION_ACTION_TAG: return new AttributeReflectionAction(parcel); default: throw new ActionException("Tag " + tag + " not found"); } Loading Loading @@ -4348,7 +4502,20 @@ public class RemoteViews implements Parcelable, Filter { */ public void setViewLayoutMarginDimen(@IdRes int viewId, @MarginType int type, @DimenRes int dimen) { addAction(new LayoutParamAction(viewId, type, dimen)); addAction(new LayoutParamAction(viewId, type, dimen, VALUE_TYPE_RESOURCE)); } /** * Equivalent to calling {@link MarginLayoutParams#setMarginEnd}. * Only works if the {@link View#getLayoutParams()} supports margins. * * @param viewId The id of the view to change * @param type The margin being set e.g. {@link #MARGIN_END} * @param attr a dimension attribute to apply to the margin. */ public void setViewLayoutMarginAttr(@IdRes int viewId, @MarginType int type, @AttrRes int attr) { addAction(new LayoutParamAction(viewId, type, attr, VALUE_TYPE_ATTRIBUTE)); } /** Loading Loading @@ -4393,7 +4560,19 @@ public class RemoteViews implements Parcelable, Filter { * @param widthDimen the dimension resource for the view's width */ public void setViewLayoutWidthDimen(@IdRes int viewId, @DimenRes int widthDimen) { addAction(new LayoutParamAction(viewId, LayoutParamAction.LAYOUT_WIDTH, widthDimen)); addAction(new LayoutParamAction(viewId, LayoutParamAction.LAYOUT_WIDTH, widthDimen, VALUE_TYPE_RESOURCE)); } /** * Equivalent to setting {@link android.view.ViewGroup.LayoutParams#width} with * the value of the given attribute in the current theme. * * @param widthAttr the dimension attribute for the view's width */ public void setViewLayoutWidthAttr(@IdRes int viewId, @AttrRes int widthAttr) { addAction(new LayoutParamAction(viewId, LayoutParamAction.LAYOUT_WIDTH, widthAttr, VALUE_TYPE_ATTRIBUTE)); } /** Loading @@ -4420,7 +4599,19 @@ public class RemoteViews implements Parcelable, Filter { * @param heightDimen a dimen resource to read the height from. */ public void setViewLayoutHeightDimen(@IdRes int viewId, @DimenRes int heightDimen) { addAction(new LayoutParamAction(viewId, LayoutParamAction.LAYOUT_HEIGHT, heightDimen)); addAction(new LayoutParamAction(viewId, LayoutParamAction.LAYOUT_HEIGHT, heightDimen, VALUE_TYPE_RESOURCE)); } /** * Equivalent to setting {@link android.view.ViewGroup.LayoutParams#height} with * the value of the given attribute in the current theme. * * @param heightAttr a dimen attribute to read the height from. */ public void setViewLayoutHeightAttr(@IdRes int viewId, @AttrRes int heightAttr) { addAction(new LayoutParamAction(viewId, LayoutParamAction.LAYOUT_HEIGHT, heightAttr, VALUE_TYPE_ATTRIBUTE)); } /** Loading @@ -4441,7 +4632,15 @@ public class RemoteViews implements Parcelable, Filter { * {@code resId}. */ public void setViewOutlinePreferredRadiusDimen(@IdRes int viewId, @DimenRes int resId) { addAction(new SetViewOutlinePreferredRadiusAction(viewId, resId)); addAction(new SetViewOutlinePreferredRadiusAction(viewId, resId, VALUE_TYPE_RESOURCE)); } /** * Sets an OutlineProvider on the view whose corner radius is a dimension attribute with * {@code attrId}. */ public void setViewOutlinePreferredRadiusAttr(@IdRes int viewId, @AttrRes int attrId) { addAction(new SetViewOutlinePreferredRadiusAction(viewId, attrId, VALUE_TYPE_ATTRIBUTE)); } /** Loading Loading @@ -4522,6 +4721,23 @@ public class RemoteViews implements Parcelable, Filter { value, unit)); } /** * Call a method taking one int, a size in pixels, on a view in the layout for this * RemoteViews. * * The dimension will be resolved from the theme attribute at the time the * {@link RemoteViews} is (re-)applied. * * @param viewId The id of the view on which to call the method. * @param methodName The name of the method to call. * @param dimenAttr The attribute to resolve and pass as argument to the method. */ public void setIntDimenAttr(@IdRes int viewId, @NonNull String methodName, @AttrRes int dimenAttr) { addAction(new AttributeReflectionAction(viewId, methodName, BaseReflectionAction.INT, ResourceReflectionAction.DIMEN_RESOURCE, dimenAttr)); } /** * Call a method taking one int, a color, on a view in the layout for this RemoteViews. * Loading @@ -4538,6 +4754,22 @@ public class RemoteViews implements Parcelable, Filter { ResourceReflectionAction.COLOR_RESOURCE, colorResource)); } /** * Call a method taking one int, a color, on a view in the layout for this RemoteViews. * * The Color will be resolved from the theme attribute at the time the {@link RemoteViews} is * (re-)applied. * * @param viewId The id of the view on which to call the method. * @param methodName The name of the method to call. * @param colorAttribute The theme attribute to resolve and pass as argument to the method. */ public void setColorAttr(@IdRes int viewId, @NonNull String methodName, @AttrRes int colorAttribute) { addAction(new AttributeReflectionAction(viewId, methodName, BaseReflectionAction.INT, AttributeReflectionAction.COLOR_RESOURCE, colorAttribute)); } /** * Call a method taking one int, a color, on a view in the layout for this RemoteViews. * Loading Loading @@ -4617,6 +4849,23 @@ public class RemoteViews implements Parcelable, Filter { colorResource)); } /** * Call a method taking one ColorStateList on a view in the layout for this RemoteViews. * * The ColorStateList will be resolved from the theme attribute at the time the * {@link RemoteViews} is (re-)applied. * * @param viewId The id of the view on which to call the method. * @param methodName The name of the method to call. * @param colorAttr The theme attribute to resolve and pass as argument to the method. */ public void setColorStateListAttr(@IdRes int viewId, @NonNull String methodName, @AttrRes int colorAttr) { addAction(new AttributeReflectionAction(viewId, methodName, BaseReflectionAction.COLOR_STATE_LIST, ResourceReflectionAction.COLOR_RESOURCE, colorAttr)); } /** * Call a method taking one long on a view in the layout for this RemoteViews. * Loading Loading @@ -4675,6 +4924,23 @@ public class RemoteViews implements Parcelable, Filter { value, unit)); } /** * Call a method taking one float, a size in pixels, on a view in the layout for this * RemoteViews. * * The dimension will be resolved from the theme attribute at the time the {@link RemoteViews} * is (re-)applied. * * @param viewId The id of the view on which to call the method. * @param methodName The name of the method to call. * @param dimenAttr The attribute to resolve and pass as argument to the method. */ public void setFloatDimenAttr(@IdRes int viewId, @NonNull String methodName, @AttrRes int dimenAttr) { addAction(new AttributeReflectionAction(viewId, methodName, BaseReflectionAction.FLOAT, ResourceReflectionAction.DIMEN_RESOURCE, dimenAttr)); } /** * Call a method taking one double on a view in the layout for this RemoteViews. * Loading Loading @@ -4737,6 +5003,24 @@ public class RemoteViews implements Parcelable, Filter { ResourceReflectionAction.STRING_RESOURCE, stringResource)); } /** * Call a method taking one CharSequence on a view in the layout for this RemoteViews. * * The CharSequence will be resolved from the theme attribute at the time the * {@link RemoteViews} is (re-)applied. * * @param viewId The id of the view on which to call the method. * @param methodName The name of the method to call. * @param stringAttribute The attribute to resolve and pass as argument to the method. */ public void setCharSequenceAttr(@IdRes int viewId, @NonNull String methodName, @AttrRes int stringAttribute) { addAction( new AttributeReflectionAction(viewId, methodName, BaseReflectionAction.CHAR_SEQUENCE, AttributeReflectionAction.STRING_RESOURCE, stringAttribute)); } /** * Call a method taking one Uri on a view in the layout for this RemoteViews. * Loading