diff options
| author | 2021-02-05 22:18:25 +0000 | |
|---|---|---|
| committer | 2021-02-05 22:18:25 +0000 | |
| commit | ae11a1abcf486697ec770d65f319e0ee00a7587d (patch) | |
| tree | af5aa0ec6d093e28dfc4c902af7c4ce8fc099e41 | |
| parent | 65d500d945cdd2f413146e8ac28b74f1a57abe76 (diff) | |
| parent | c42edd69f93606470e13a5b508087c5ce8476359 (diff) | |
Merge "Enable use of of CompoundButtons in RemoteViews" into sc-dev
| -rw-r--r-- | core/api/current.txt | 13 | ||||
| -rw-r--r-- | core/java/android/widget/CheckBox.java | 2 | ||||
| -rw-r--r-- | core/java/android/widget/CompoundButton.java | 28 | ||||
| -rw-r--r-- | core/java/android/widget/RadioButton.java | 2 | ||||
| -rw-r--r-- | core/java/android/widget/RadioGroup.java | 2 | ||||
| -rw-r--r-- | core/java/android/widget/RemoteViews.java | 114 | ||||
| -rw-r--r-- | core/java/android/widget/Switch.java | 64 |
7 files changed, 221 insertions, 4 deletions
diff --git a/core/api/current.txt b/core/api/current.txt index 5679a3dbcd6a..bfdfb4060078 100644 --- a/core/api/current.txt +++ b/core/api/current.txt @@ -53349,7 +53349,7 @@ package android.widget { method public void onSelectedDayChange(@NonNull android.widget.CalendarView, int, int, int); } - public class CheckBox extends android.widget.CompoundButton { + @android.widget.RemoteViews.RemoteView public class CheckBox extends android.widget.CompoundButton { ctor public CheckBox(android.content.Context); ctor public CheckBox(android.content.Context, android.util.AttributeSet); ctor public CheckBox(android.content.Context, android.util.AttributeSet, int); @@ -53415,6 +53415,7 @@ package android.widget { method public boolean isChecked(); method public void setButtonDrawable(@DrawableRes int); method public void setButtonDrawable(@Nullable android.graphics.drawable.Drawable); + method public void setButtonIcon(@Nullable android.graphics.drawable.Icon); method public void setButtonTintBlendMode(@Nullable android.graphics.BlendMode); method public void setButtonTintList(@Nullable android.content.res.ColorStateList); method public void setButtonTintMode(@Nullable android.graphics.PorterDuff.Mode); @@ -54455,14 +54456,14 @@ package android.widget { field protected String[] mExcludeMimes; } - public class RadioButton extends android.widget.CompoundButton { + @android.widget.RemoteViews.RemoteView public class RadioButton extends android.widget.CompoundButton { ctor public RadioButton(android.content.Context); ctor public RadioButton(android.content.Context, android.util.AttributeSet); ctor public RadioButton(android.content.Context, android.util.AttributeSet, int); ctor public RadioButton(android.content.Context, android.util.AttributeSet, int, int); } - public class RadioGroup extends android.widget.LinearLayout { + @android.widget.RemoteViews.RemoteView public class RadioGroup extends android.widget.LinearLayout { ctor public RadioGroup(android.content.Context); ctor public RadioGroup(android.content.Context, android.util.AttributeSet); method public void check(@IdRes int); @@ -54584,6 +54585,7 @@ package android.widget { method public void setChronometerCountDown(@IdRes int, boolean); method public void setColor(@IdRes int, @NonNull String, @ColorRes int); method public void setColorStateList(@IdRes int, @NonNull String, @ColorRes int); + method public void setCompoundButtonChecked(@IdRes int, boolean); method public void setContentDescription(@IdRes int, CharSequence); method public void setDisplayedChild(@IdRes int, int); method public void setDouble(@IdRes int, String, double); @@ -54608,6 +54610,7 @@ package android.widget { method public void setOnClickResponse(@IdRes int, @NonNull android.widget.RemoteViews.RemoteResponse); method public void setPendingIntentTemplate(@IdRes int, android.app.PendingIntent); method public void setProgressBar(@IdRes int, int, int, boolean); + method public void setRadioGroupChecked(@IdRes int, @IdRes int); method public void setRelativeScrollPosition(@IdRes int, int); method @Deprecated public void setRemoteAdapter(int, @IdRes int, android.content.Intent); method public void setRemoteAdapter(@IdRes int, android.content.Intent); @@ -54974,7 +54977,7 @@ package android.widget { ctor public StackView(android.content.Context, android.util.AttributeSet, int, int); } - public class Switch extends android.widget.CompoundButton { + @android.widget.RemoteViews.RemoteView public class Switch extends android.widget.CompoundButton { ctor public Switch(android.content.Context); ctor public Switch(android.content.Context, android.util.AttributeSet); ctor public Switch(android.content.Context, android.util.AttributeSet, int); @@ -55005,12 +55008,14 @@ package android.widget { method public void setTextOff(CharSequence); method public void setTextOn(CharSequence); method public void setThumbDrawable(android.graphics.drawable.Drawable); + method public void setThumbIcon(@Nullable android.graphics.drawable.Icon); method public void setThumbResource(@DrawableRes int); method public void setThumbTextPadding(int); method public void setThumbTintBlendMode(@Nullable android.graphics.BlendMode); method public void setThumbTintList(@Nullable android.content.res.ColorStateList); method public void setThumbTintMode(@Nullable android.graphics.PorterDuff.Mode); method public void setTrackDrawable(android.graphics.drawable.Drawable); + method public void setTrackIcon(@Nullable android.graphics.drawable.Icon); method public void setTrackResource(@DrawableRes int); method public void setTrackTintBlendMode(@Nullable android.graphics.BlendMode); method public void setTrackTintList(@Nullable android.content.res.ColorStateList); diff --git a/core/java/android/widget/CheckBox.java b/core/java/android/widget/CheckBox.java index 046f75fd37ac..2452e4c6d56a 100644 --- a/core/java/android/widget/CheckBox.java +++ b/core/java/android/widget/CheckBox.java @@ -18,6 +18,7 @@ package android.widget; import android.content.Context; import android.util.AttributeSet; +import android.widget.RemoteViews.RemoteView; /** * <p> @@ -52,6 +53,7 @@ import android.util.AttributeSet; * {@link android.R.styleable#View View Attributes} * </p> */ +@RemoteView public class CheckBox extends CompoundButton { public CheckBox(Context context) { this(context, null); diff --git a/core/java/android/widget/CompoundButton.java b/core/java/android/widget/CompoundButton.java index 135ff9fcd989..63f8ee7528f2 100644 --- a/core/java/android/widget/CompoundButton.java +++ b/core/java/android/widget/CompoundButton.java @@ -27,11 +27,13 @@ import android.graphics.BlendMode; import android.graphics.Canvas; import android.graphics.PorterDuff; import android.graphics.drawable.Drawable; +import android.graphics.drawable.Icon; import android.os.Parcel; import android.os.Parcelable; import android.util.AttributeSet; import android.util.Log; import android.view.Gravity; +import android.view.RemotableViewMethod; import android.view.SoundEffectConstants; import android.view.ViewDebug; import android.view.ViewHierarchyEncoder; @@ -275,6 +277,7 @@ public abstract class CompoundButton extends Button implements Checkable { * @param resId the resource identifier of the drawable * @attr ref android.R.styleable#CompoundButton_button */ + @RemotableViewMethod(asyncImpl = "setButtonDrawableAsync") public void setButtonDrawable(@DrawableRes int resId) { final Drawable d; if (resId != 0) { @@ -285,6 +288,12 @@ public abstract class CompoundButton extends Button implements Checkable { setButtonDrawable(d); } + /** @hide **/ + public Runnable setButtonDrawableAsync(@DrawableRes int resId) { + Drawable drawable = resId == 0 ? null : getContext().getDrawable(resId); + return () -> setButtonDrawable(drawable); + } + /** * Sets a drawable as the compound button image. * @@ -336,6 +345,23 @@ public abstract class CompoundButton extends Button implements Checkable { } /** + * Sets the button of this CompoundButton to the specified Icon. + * + * @param icon an Icon holding the desired button, or {@code null} to clear + * the button + */ + @RemotableViewMethod(asyncImpl = "setButtonIconAsync") + public void setButtonIcon(@Nullable Icon icon) { + setButtonDrawable(icon == null ? null : icon.loadDrawable(getContext())); + } + + /** @hide **/ + public Runnable setButtonIconAsync(@Nullable Icon icon) { + Drawable button = icon == null ? null : icon.loadDrawable(getContext()); + return () -> setButtonDrawable(button); + } + + /** * Applies a tint to the button drawable. Does not modify the current tint * mode, which is {@link PorterDuff.Mode#SRC_IN} by default. * <p> @@ -350,6 +376,7 @@ public abstract class CompoundButton extends Button implements Checkable { * @see #setButtonTintList(ColorStateList) * @see Drawable#setTintList(ColorStateList) */ + @RemotableViewMethod public void setButtonTintList(@Nullable ColorStateList tint) { mButtonTintList = tint; mHasButtonTint = true; @@ -394,6 +421,7 @@ public abstract class CompoundButton extends Button implements Checkable { * @see #getButtonTintMode() * @see Drawable#setTintBlendMode(BlendMode) */ + @RemotableViewMethod public void setButtonTintBlendMode(@Nullable BlendMode tintMode) { mButtonBlendMode = tintMode; mHasButtonBlendMode = true; diff --git a/core/java/android/widget/RadioButton.java b/core/java/android/widget/RadioButton.java index a04d7c34c444..9b3503433e56 100644 --- a/core/java/android/widget/RadioButton.java +++ b/core/java/android/widget/RadioButton.java @@ -20,6 +20,7 @@ import android.annotation.NonNull; import android.content.Context; import android.util.AttributeSet; import android.view.accessibility.AccessibilityNodeInfo; +import android.widget.RemoteViews.RemoteView; import com.android.internal.R; @@ -49,6 +50,7 @@ import com.android.internal.R; * {@link android.R.styleable#View View Attributes} * </p> */ +@RemoteView public class RadioButton extends CompoundButton { public RadioButton(Context context) { diff --git a/core/java/android/widget/RadioGroup.java b/core/java/android/widget/RadioGroup.java index 4722fdc7818f..d445fdc01564 100644 --- a/core/java/android/widget/RadioGroup.java +++ b/core/java/android/widget/RadioGroup.java @@ -31,6 +31,7 @@ import android.view.ViewStructure; import android.view.accessibility.AccessibilityNodeInfo; import android.view.autofill.AutofillManager; import android.view.autofill.AutofillValue; +import android.widget.RemoteViews.RemoteView; import com.android.internal.R; @@ -59,6 +60,7 @@ import com.android.internal.R; * @see RadioButton * */ +@RemoteView public class RadioGroup extends LinearLayout { private static final String LOG_TAG = RadioGroup.class.getSimpleName(); diff --git a/core/java/android/widget/RemoteViews.java b/core/java/android/widget/RemoteViews.java index b47a0acc4fae..dfef7ca825a1 100644 --- a/core/java/android/widget/RemoteViews.java +++ b/core/java/android/widget/RemoteViews.java @@ -132,6 +132,13 @@ import java.util.function.Consumer; * <li>{@link android.widget.TextClock}</li> * <li>{@link android.widget.TextView}</li> * </ul> + * <p>As of API 31, the following widgets and layouts may also be used:</p> + * <ul> + * <li>{@link android.widget.CheckBox}</li> + * <li>{@link android.widget.RadioButton}</li> + * <li>{@link android.widget.RadioGroup}</li> + * <li>{@link android.widget.Switch}</li> + * </ul> * <p>Descendants of these classes are not supported.</p> */ public class RemoteViews implements Parcelable, Filter { @@ -185,6 +192,8 @@ public class RemoteViews implements Parcelable, Filter { private static final int REMOVE_FROM_PARENT_ACTION_TAG = 23; private static final int RESOURCE_REFLECTION_ACTION_TAG = 24; private static final int COMPLEX_UNIT_DIMENSION_REFLECTION_ACTION_TAG = 25; + private static final int SET_COMPOUND_BUTTON_CHECKED_TAG = 26; + private static final int SET_RADIO_GROUP_CHECKED = 27; /** @hide **/ @IntDef(prefix = "MARGIN_", value = { @@ -2552,6 +2561,87 @@ public class RemoteViews implements Parcelable, Filter { } } + private static class SetCompoundButtonCheckedAction extends Action { + + private final boolean mChecked; + + SetCompoundButtonCheckedAction(@IdRes int viewId, boolean checked) { + this.viewId = viewId; + mChecked = checked; + } + + SetCompoundButtonCheckedAction(Parcel in) { + viewId = in.readInt(); + mChecked = in.readBoolean(); + } + + @Override + public void writeToParcel(Parcel dest, int flags) { + dest.writeInt(viewId); + dest.writeBoolean(mChecked); + } + + @Override + public void apply(View root, ViewGroup rootParent, OnClickHandler handler) + throws ActionException { + final View target = root.findViewById(viewId); + if (target == null) return; + + if (!(target instanceof CompoundButton)) { + Log.w(LOG_TAG, "Cannot set checked to view " + + viewId + " because it is not a CompoundButton"); + return; + } + + ((CompoundButton) target).setChecked(mChecked); + } + + @Override + public int getActionTag() { + return SET_COMPOUND_BUTTON_CHECKED_TAG; + } + } + + private static class SetRadioGroupCheckedAction extends Action { + + @IdRes private final int mCheckedId; + + SetRadioGroupCheckedAction(@IdRes int viewId, @IdRes int checkedId) { + this.viewId = viewId; + mCheckedId = checkedId; + } + + SetRadioGroupCheckedAction(Parcel in) { + viewId = in.readInt(); + mCheckedId = in.readInt(); + } + + @Override + public void writeToParcel(Parcel dest, int flags) { + dest.writeInt(viewId); + dest.writeInt(mCheckedId); + } + + @Override + public void apply(View root, ViewGroup rootParent, OnClickHandler handler) + throws ActionException { + final View target = root.findViewById(viewId); + if (target == null) return; + + if (!(target instanceof RadioGroup)) { + Log.w(LOG_TAG, "Cannot check " + viewId + " because it's not a RadioGroup"); + return; + } + + ((RadioGroup) target).check(mCheckedId); + } + + @Override + public int getActionTag() { + return SET_RADIO_GROUP_CHECKED; + } + } + /** * Create a new RemoteViews object that will display the views contained * in the specified layout file. @@ -2766,6 +2856,10 @@ public class RemoteViews implements Parcelable, Filter { return new ResourceReflectionAction(parcel); case COMPLEX_UNIT_DIMENSION_REFLECTION_ACTION_TAG: return new ComplexUnitDimensionReflectionAction(parcel); + case SET_COMPOUND_BUTTON_CHECKED_TAG: + return new SetCompoundButtonCheckedAction(parcel); + case SET_RADIO_GROUP_CHECKED: + return new SetRadioGroupCheckedAction(parcel); default: throw new ActionException("Tag " + tag + " not found"); } @@ -3846,6 +3940,26 @@ public class RemoteViews implements Parcelable, Filter { } /** + * Equivalent to calling {@link android.widget.CompoundButton#setChecked(boolean)}. + * + * @param viewId The id of the view whose property to set. + * @param checked true to check the button, false to uncheck it. + */ + public void setCompoundButtonChecked(@IdRes int viewId, boolean checked) { + addAction(new SetCompoundButtonCheckedAction(viewId, checked)); + } + + /** + * Equivalent to calling {@link android.widget.RadioGroup#check(int)}. + * + * @param viewId The id of the view whose property to set. + * @param checkedId The unique id of the radio button to select in the group. + */ + public void setRadioGroupChecked(@IdRes int viewId, @IdRes int checkedId) { + addAction(new SetRadioGroupCheckedAction(viewId, checkedId)); + } + + /** * Provides an alternate layout ID, which can be used to inflate this view. This layout will be * used by the host when the widgets displayed on a light-background where foreground elements * and text can safely draw using a dark color without any additional background protection. diff --git a/core/java/android/widget/Switch.java b/core/java/android/widget/Switch.java index 3295fd2ea1c3..d3600ef9f557 100644 --- a/core/java/android/widget/Switch.java +++ b/core/java/android/widget/Switch.java @@ -35,6 +35,7 @@ import android.graphics.Rect; import android.graphics.Region.Op; import android.graphics.Typeface; import android.graphics.drawable.Drawable; +import android.graphics.drawable.Icon; import android.os.Build; import android.os.Build.VERSION_CODES; import android.text.Layout; @@ -48,12 +49,14 @@ import android.util.FloatProperty; import android.util.MathUtils; import android.view.Gravity; import android.view.MotionEvent; +import android.view.RemotableViewMethod; import android.view.SoundEffectConstants; import android.view.VelocityTracker; import android.view.ViewConfiguration; import android.view.ViewStructure; import android.view.accessibility.AccessibilityEvent; import android.view.inspector.InspectableProperty; +import android.widget.RemoteViews.RemoteView; import com.android.internal.R; @@ -84,6 +87,7 @@ import com.android.internal.R; * @attr ref android.R.styleable#Switch_thumbTextPadding * @attr ref android.R.styleable#Switch_track */ +@RemoteView public class Switch extends CompoundButton { private static final int THUMB_ANIMATION_DURATION = 250; @@ -441,6 +445,7 @@ public class Switch extends CompoundButton { * * @attr ref android.R.styleable#Switch_switchPadding */ + @RemotableViewMethod public void setSwitchPadding(int pixels) { mSwitchPadding = pixels; requestLayout(); @@ -466,6 +471,7 @@ public class Switch extends CompoundButton { * * @attr ref android.R.styleable#Switch_switchMinWidth */ + @RemotableViewMethod public void setSwitchMinWidth(int pixels) { mSwitchMinWidth = pixels; requestLayout(); @@ -491,6 +497,7 @@ public class Switch extends CompoundButton { * * @attr ref android.R.styleable#Switch_thumbTextPadding */ + @RemotableViewMethod public void setThumbTextPadding(int pixels) { mThumbTextPadding = pixels; requestLayout(); @@ -533,10 +540,17 @@ public class Switch extends CompoundButton { * * @attr ref android.R.styleable#Switch_track */ + @RemotableViewMethod(asyncImpl = "setTrackResourceAsync") public void setTrackResource(@DrawableRes int resId) { setTrackDrawable(getContext().getDrawable(resId)); } + /** @hide **/ + public Runnable setTrackResourceAsync(@DrawableRes int resId) { + Drawable drawable = resId == 0 ? null : getContext().getDrawable(resId); + return () -> setTrackDrawable(drawable); + } + /** * Get the drawable used for the track that the switch slides within. * @@ -550,6 +564,23 @@ public class Switch extends CompoundButton { } /** + * Set the drawable used for the track that the switch slides within to the specified Icon. + * + * @param icon an Icon holding the desired track, or {@code null} to clear + * the track + */ + @RemotableViewMethod(asyncImpl = "setTrackIconAsync") + public void setTrackIcon(@Nullable Icon icon) { + setTrackDrawable(icon == null ? null : icon.loadDrawable(getContext())); + } + + /** @hide **/ + public Runnable setTrackIconAsync(@Nullable Icon icon) { + Drawable track = icon == null ? null : icon.loadDrawable(getContext()); + return () -> setTrackDrawable(track); + } + + /** * Applies a tint to the track drawable. Does not modify the current * tint mode, which is {@link PorterDuff.Mode#SRC_IN} by default. * <p> @@ -563,6 +594,7 @@ public class Switch extends CompoundButton { * @see #getTrackTintList() * @see Drawable#setTintList(ColorStateList) */ + @RemotableViewMethod public void setTrackTintList(@Nullable ColorStateList tint) { mTrackTintList = tint; mHasTrackTint = true; @@ -607,6 +639,7 @@ public class Switch extends CompoundButton { * @see #getTrackTintMode() * @see Drawable#setTintBlendMode(BlendMode) */ + @RemotableViewMethod public void setTrackTintBlendMode(@Nullable BlendMode blendMode) { mTrackBlendMode = blendMode; mHasTrackTintMode = true; @@ -686,10 +719,17 @@ public class Switch extends CompoundButton { * * @attr ref android.R.styleable#Switch_thumb */ + @RemotableViewMethod(asyncImpl = "setThumbResourceAsync") public void setThumbResource(@DrawableRes int resId) { setThumbDrawable(getContext().getDrawable(resId)); } + /** @hide **/ + public Runnable setThumbResourceAsync(@DrawableRes int resId) { + Drawable drawable = resId == 0 ? null : getContext().getDrawable(resId); + return () -> setThumbDrawable(drawable); + } + /** * Get the drawable used for the switch "thumb" - the piece that the user * can physically touch and drag along the track. @@ -704,6 +744,24 @@ public class Switch extends CompoundButton { } /** + * Set the drawable used for the switch "thumb" - the piece that the user + * can physically touch and drag along the track - to the specified Icon. + * + * @param icon an Icon holding the desired thumb, or {@code null} to clear + * the thumb + */ + @RemotableViewMethod(asyncImpl = "setThumbIconAsync") + public void setThumbIcon(@Nullable Icon icon) { + setThumbDrawable(icon == null ? null : icon.loadDrawable(getContext())); + } + + /** @hide **/ + public Runnable setThumbIconAsync(@Nullable Icon icon) { + Drawable track = icon == null ? null : icon.loadDrawable(getContext()); + return () -> setThumbDrawable(track); + } + + /** * Applies a tint to the thumb drawable. Does not modify the current * tint mode, which is {@link PorterDuff.Mode#SRC_IN} by default. * <p> @@ -717,6 +775,7 @@ public class Switch extends CompoundButton { * @see #getThumbTintList() * @see Drawable#setTintList(ColorStateList) */ + @RemotableViewMethod public void setThumbTintList(@Nullable ColorStateList tint) { mThumbTintList = tint; mHasThumbTint = true; @@ -761,6 +820,7 @@ public class Switch extends CompoundButton { * @see #getThumbTintMode() * @see Drawable#setTintBlendMode(BlendMode) */ + @RemotableViewMethod public void setThumbTintBlendMode(@Nullable BlendMode blendMode) { mThumbBlendMode = blendMode; mHasThumbTintMode = true; @@ -822,6 +882,7 @@ public class Switch extends CompoundButton { * * @attr ref android.R.styleable#Switch_splitTrack */ + @RemotableViewMethod public void setSplitTrack(boolean splitTrack) { mSplitTrack = splitTrack; invalidate(); @@ -852,6 +913,7 @@ public class Switch extends CompoundButton { * * @attr ref android.R.styleable#Switch_textOn */ + @RemotableViewMethod public void setTextOn(CharSequence textOn) { mTextOn = textOn; requestLayout(); @@ -875,6 +937,7 @@ public class Switch extends CompoundButton { * * @attr ref android.R.styleable#Switch_textOff */ + @RemotableViewMethod public void setTextOff(CharSequence textOff) { mTextOff = textOff; requestLayout(); @@ -889,6 +952,7 @@ public class Switch extends CompoundButton { * @param showText {@code true} to display on/off text * @attr ref android.R.styleable#Switch_showText */ + @RemotableViewMethod public void setShowText(boolean showText) { if (mShowText != showText) { mShowText = showText; |