summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Stevie Kideckel <kideckel@google.com> 2021-02-05 22:18:25 +0000
committer Android (Google) Code Review <android-gerrit@google.com> 2021-02-05 22:18:25 +0000
commitae11a1abcf486697ec770d65f319e0ee00a7587d (patch)
treeaf5aa0ec6d093e28dfc4c902af7c4ce8fc099e41
parent65d500d945cdd2f413146e8ac28b74f1a57abe76 (diff)
parentc42edd69f93606470e13a5b508087c5ce8476359 (diff)
Merge "Enable use of of CompoundButtons in RemoteViews" into sc-dev
-rw-r--r--core/api/current.txt13
-rw-r--r--core/java/android/widget/CheckBox.java2
-rw-r--r--core/java/android/widget/CompoundButton.java28
-rw-r--r--core/java/android/widget/RadioButton.java2
-rw-r--r--core/java/android/widget/RadioGroup.java2
-rw-r--r--core/java/android/widget/RemoteViews.java114
-rw-r--r--core/java/android/widget/Switch.java64
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;