summaryrefslogtreecommitdiff
path: root/core/java/android/widget/RemoteViews.java
diff options
context:
space:
mode:
authorJeff DeCew <jeffdq@google.com>2021-01-11 21:48:22 +0000
committerAndroid (Google) Code Review <android-gerrit@google.com>2021-01-11 21:48:22 +0000
commitb1e9252d657bcc70c824eef8af86747efd9c9fa2 (patch)
treeef5a23e6b6794faa96d8a336859997933d514b87 /core/java/android/widget/RemoteViews.java
parent19d37240a51eafe10f7f2dc4c8f638588df52d19 (diff)
parentcb189d4630b9425da6c04f47fbfb42a875b4d782 (diff)
Merge changes from topic "decorate_custom_notifs"
* changes: Improve RemoteViews to simplify notification view hierarchy. Fully custom view notifications now receive minimal decoration when targeting S.
Diffstat (limited to 'core/java/android/widget/RemoteViews.java')
-rw-r--r--core/java/android/widget/RemoteViews.java102
1 files changed, 102 insertions, 0 deletions
diff --git a/core/java/android/widget/RemoteViews.java b/core/java/android/widget/RemoteViews.java
index 220a31c12f4e..8dafc5db6178 100644
--- a/core/java/android/widget/RemoteViews.java
+++ b/core/java/android/widget/RemoteViews.java
@@ -75,6 +75,8 @@ import android.view.RemotableViewMethod;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewGroup.MarginLayoutParams;
+import android.view.ViewManager;
+import android.view.ViewParent;
import android.view.ViewStub;
import android.widget.AdapterView.OnItemClickListener;
@@ -177,6 +179,7 @@ public class RemoteViews implements Parcelable, Filter {
private static final int OVERRIDE_TEXT_COLORS_TAG = 20;
private static final int SET_RIPPLE_DRAWABLE_COLOR_TAG = 21;
private static final int SET_INT_TAG_TAG = 22;
+ private static final int REMOVE_FROM_PARENT_ACTION_TAG = 23;
/** @hide **/
@IntDef(prefix = "MARGIN_", value = {
@@ -1831,6 +1834,75 @@ public class RemoteViews implements Parcelable, Filter {
}
/**
+ * Action to remove a view from its parent.
+ */
+ private class RemoveFromParentAction extends Action {
+
+ RemoveFromParentAction(@IdRes int viewId) {
+ this.viewId = viewId;
+ }
+
+ RemoveFromParentAction(Parcel parcel) {
+ viewId = parcel.readInt();
+ }
+
+ public void writeToParcel(Parcel dest, int flags) {
+ dest.writeInt(viewId);
+ }
+
+ @Override
+ public void apply(View root, ViewGroup rootParent, OnClickHandler handler) {
+ final View target = root.findViewById(viewId);
+
+ if (target == null || target == root) {
+ return;
+ }
+
+ ViewParent parent = target.getParent();
+ if (parent instanceof ViewManager) {
+ ((ViewManager) parent).removeView(target);
+ }
+ }
+
+ @Override
+ public Action initActionAsync(ViewTree root, ViewGroup rootParent, OnClickHandler handler) {
+ // In the async implementation, update the view tree so that subsequent calls to
+ // findViewById return the correct view.
+ root.createTree();
+ ViewTree target = root.findViewTreeById(viewId);
+
+ if (target == null || target == root) {
+ return ACTION_NOOP;
+ }
+
+ ViewTree parent = root.findViewTreeParentOf(target);
+ if (parent == null || !(parent.mRoot instanceof ViewManager)) {
+ return ACTION_NOOP;
+ }
+ final ViewManager parentVg = (ViewManager) parent.mRoot;
+
+ parent.mChildren.remove(target);
+ return new RuntimeAction() {
+ @Override
+ public void apply(View root, ViewGroup rootParent, OnClickHandler handler)
+ throws ActionException {
+ parentVg.removeView(target.mRoot);
+ }
+ };
+ }
+
+ @Override
+ public int getActionTag() {
+ return REMOVE_FROM_PARENT_ACTION_TAG;
+ }
+
+ @Override
+ public int mergeBehavior() {
+ return MERGE_APPEND;
+ }
+ }
+
+ /**
* Helper action to set compound drawables on a TextView. Supports relative
* (s/t/e/b) or cardinal (l/t/r/b) arrangement.
*/
@@ -2537,6 +2609,8 @@ public class RemoteViews implements Parcelable, Filter {
return new SetRippleDrawableColor(parcel);
case SET_INT_TAG_TAG:
return new SetIntTagAction(parcel);
+ case REMOVE_FROM_PARENT_ACTION_TAG:
+ return new RemoveFromParentAction(parcel);
default:
throw new ActionException("Tag " + tag + " not found");
}
@@ -2675,6 +2749,18 @@ public class RemoteViews implements Parcelable, Filter {
}
/**
+ * Removes the {@link View} specified by the {@code viewId} from its parent {@link ViewManager}.
+ * This will do nothing if the viewId specifies the root view of this RemoteViews.
+ *
+ * @param viewId The id of the {@link View} to remove from its parent.
+ *
+ * @hide
+ */
+ public void removeFromParent(@IdRes int viewId) {
+ addAction(new RemoveFromParentAction(viewId));
+ }
+
+ /**
* Equivalent to calling {@link AdapterViewAnimator#showNext()}
*
* @param viewId The id of the view on which to call {@link AdapterViewAnimator#showNext()}
@@ -4025,6 +4111,22 @@ public class RemoteViews implements Parcelable, Filter {
return null;
}
+ public ViewTree findViewTreeParentOf(ViewTree child) {
+ if (mChildren == null) {
+ return null;
+ }
+ for (ViewTree tree : mChildren) {
+ if (tree == child) {
+ return this;
+ }
+ ViewTree result = tree.findViewTreeParentOf(child);
+ if (result != null) {
+ return result;
+ }
+ }
+ return null;
+ }
+
public void replaceView(View v) {
mRoot = v;
mChildren = null;