diff options
| author | 2024-10-08 18:43:45 +0000 | |
|---|---|---|
| committer | 2024-10-08 18:43:45 +0000 | |
| commit | 2d24f84d820611fcdfc07e4c46aac158e0e8e3af (patch) | |
| tree | 539f1973329f3f1646eafa0a3c0a8b340d67f14e | |
| parent | 9f5fe2148b391a7493219f70f929a22138761c94 (diff) | |
| parent | ab580dd276b05ba1d9c671f7494a2b28afb5560a (diff) | |
Merge "Write RemoteViews actions to proto (3/3)" into main
| -rw-r--r-- | core/java/android/widget/RemoteViews.java | 558 | ||||
| -rw-r--r-- | core/proto/android/widget/remoteviews.proto | 69 |
2 files changed, 627 insertions, 0 deletions
diff --git a/core/java/android/widget/RemoteViews.java b/core/java/android/widget/RemoteViews.java index 06820cd4c2ce..d7b5211ad9fd 100644 --- a/core/java/android/widget/RemoteViews.java +++ b/core/java/android/widget/RemoteViews.java @@ -46,6 +46,7 @@ import android.app.LoadedApk; import android.app.PendingIntent; import android.app.RemoteInput; import android.appwidget.AppWidgetHostView; +import android.appwidget.flags.Flags; import android.compat.annotation.UnsupportedAppUsage; import android.content.ComponentName; import android.content.Context; @@ -4119,6 +4120,71 @@ public class RemoteViews implements Parcelable, Filter { public void visitUris(@NonNull Consumer<Uri> visitor) { mNestedViews.visitUris(visitor); } + + @Override + public boolean canWriteToProto() { + return true; + } + + @Override + public void writeToProto(ProtoOutputStream out, Context context, Resources appResources) { + if (!Flags.remoteViewsProto()) return; + final long token = out.start(RemoteViewsProto.Action.VIEW_GROUP_ADD_ACTION); + out.write(RemoteViewsProto.ViewGroupAddAction.VIEW_ID, + appResources.getResourceName(mViewId)); + out.write(RemoteViewsProto.ViewGroupAddAction.INDEX, mIndex); + out.write(RemoteViewsProto.ViewGroupAddAction.STABLE_ID, mStableId); + long rvToken = out.start(RemoteViewsProto.ViewGroupAddAction.NESTED_VIEWS); + mNestedViews.writePreviewToProto(context, out); + out.end(rvToken); + out.end(token); + } + } + + private PendingResources<Action> createViewGroupActionAddFromProto(ProtoInputStream in) + throws Exception { + final LongSparseArray<Object> values = new LongSparseArray<>(); + + final long token = in.start(RemoteViewsProto.Action.VIEW_GROUP_ADD_ACTION); + while (in.nextField() != NO_MORE_FIELDS) { + switch (in.getFieldNumber()) { + case (int) RemoteViewsProto.ViewGroupAddAction.VIEW_ID: + values.put(RemoteViewsProto.ViewGroupAddAction.VIEW_ID, + in.readString(RemoteViewsProto.ViewGroupAddAction.VIEW_ID)); + break; + case (int) RemoteViewsProto.ViewGroupAddAction.NESTED_VIEWS: + final long nvToken = in.start(RemoteViewsProto.ViewGroupAddAction.NESTED_VIEWS); + values.put(RemoteViewsProto.ViewGroupAddAction.NESTED_VIEWS, + createFromProto(in)); + in.end(nvToken); + break; + case (int) RemoteViewsProto.ViewGroupAddAction.INDEX: + values.put(RemoteViewsProto.ViewGroupAddAction.INDEX, + in.readInt(RemoteViewsProto.ViewGroupAddAction.INDEX)); + break; + case (int) RemoteViewsProto.ViewGroupAddAction.STABLE_ID: + values.put(RemoteViewsProto.ViewGroupAddAction.STABLE_ID, + in.readInt(RemoteViewsProto.ViewGroupAddAction.STABLE_ID)); + break; + default: + Log.w(LOG_TAG, "Unhandled field while reading RemoteViews proto!\n" + + ProtoUtils.currentFieldToString(in)); + } + } + in.end(token); + + checkContainsKeys(values, new long[]{RemoteViewsProto.ViewGroupAddAction.VIEW_ID, + RemoteViewsProto.ViewGroupAddAction.NESTED_VIEWS}); + + return (context, resources, rootData, depth) -> { + int viewId = getAsIdentifier(resources, values, + RemoteViewsProto.ViewGroupAddAction.VIEW_ID); + return new ViewGroupActionAdd(viewId, ((PendingResources<RemoteViews>) values.get( + RemoteViewsProto.ViewGroupAddAction.NESTED_VIEWS)).create(context, resources, + rootData, depth), + (int) values.get(RemoteViewsProto.ViewGroupAddAction.INDEX, 0), + (int) values.get(RemoteViewsProto.ViewGroupAddAction.STABLE_ID, 0)); + }; } /** @@ -4241,6 +4307,60 @@ public class RemoteViews implements Parcelable, Filter { public int mergeBehavior() { return MERGE_APPEND; } + + @Override + public boolean canWriteToProto() { + return true; + } + + @Override + public void writeToProto(ProtoOutputStream out, Context context, Resources appResources) { + final long token = out.start(RemoteViewsProto.Action.VIEW_GROUP_REMOVE_ACTION); + out.write(RemoteViewsProto.ViewGroupRemoveAction.VIEW_ID, + appResources.getResourceName(mViewId)); + if (mViewIdToKeep != REMOVE_ALL_VIEWS_ID) { + out.write(RemoteViewsProto.ViewGroupRemoveAction.VIEW_ID_TO_KEEP, + appResources.getResourceName(mViewIdToKeep)); + } + out.end(token); + } + + public static PendingResources<Action> createFromProto(ProtoInputStream in) + throws Exception { + final LongSparseArray<Object> values = new LongSparseArray<>(); + + final long token = in.start(RemoteViewsProto.Action.VIEW_GROUP_REMOVE_ACTION); + while (in.nextField() != NO_MORE_FIELDS) { + switch (in.getFieldNumber()) { + case (int) RemoteViewsProto.ViewGroupRemoveAction.VIEW_ID: + values.put(RemoteViewsProto.ViewGroupRemoveAction.VIEW_ID, + in.readString(RemoteViewsProto.ViewGroupRemoveAction.VIEW_ID)); + break; + case (int) RemoteViewsProto.ViewGroupRemoveAction.VIEW_ID_TO_KEEP: + values.put(RemoteViewsProto.ViewGroupRemoveAction.VIEW_ID_TO_KEEP, + in.readString( + RemoteViewsProto.ViewGroupRemoveAction.VIEW_ID_TO_KEEP)); + break; + default: + Log.w(LOG_TAG, "Unhandled field while reading RemoteViews proto!\n" + + ProtoUtils.currentFieldToString(in)); + } + } + in.end(token); + + checkContainsKeys(values, new long[]{RemoteViewsProto.ViewGroupRemoveAction.VIEW_ID}); + + return (context, resources, rootData, depth) -> { + int viewId = getAsIdentifier(resources, values, + RemoteViewsProto.ViewGroupRemoveAction.VIEW_ID); + int viewIdToKeep = (values.indexOfKey( + RemoteViewsProto.ViewGroupRemoveAction.VIEW_ID_TO_KEEP) >= 0) + ? getAsIdentifier(resources, values, + RemoteViewsProto.ViewGroupRemoveAction.VIEW_ID_TO_KEEP) + : REMOVE_ALL_VIEWS_ID; + return new ViewGroupActionRemove(viewId, viewIdToKeep); + }; + } } /** @@ -4497,6 +4617,200 @@ public class RemoteViews implements Parcelable, Filter { visitIconUri(mI4, visitor); } } + + @Override + public boolean canWriteToProto() { + return true; + } + + @Override + public void writeToProto(ProtoOutputStream out, Context context, + Resources appResources) { // rebase + final long token = out.start(RemoteViewsProto.Action.TEXT_VIEW_DRAWABLE_ACTION); + out.write(RemoteViewsProto.TextViewDrawableAction.VIEW_ID, + appResources.getResourceName(mViewId)); + out.write(RemoteViewsProto.TextViewDrawableAction.IS_RELATIVE, mIsRelative); + if (mUseIcons) { + long iconsToken = out.start(RemoteViewsProto.TextViewDrawableAction.ICONS); + if (mI1 != null) { + writeIconToProto(out, appResources, mI1, + RemoteViewsProto.TextViewDrawableAction.Icons.ONE); + } + if (mI2 != null) { + writeIconToProto(out, appResources, mI2, + RemoteViewsProto.TextViewDrawableAction.Icons.TWO); + } + if (mI3 != null) { + writeIconToProto(out, appResources, mI3, + RemoteViewsProto.TextViewDrawableAction.Icons.THREE); + } + if (mI4 != null) { + writeIconToProto(out, appResources, mI4, + RemoteViewsProto.TextViewDrawableAction.Icons.FOUR); + } + out.end(iconsToken); + } else { + long resourcesToken = out.start(RemoteViewsProto.TextViewDrawableAction.RESOURCES); + if (mD1 != 0) { + out.write(RemoteViewsProto.TextViewDrawableAction.Resources.ONE, + appResources.getResourceName(mD1)); + } + if (mD2 != 0) { + out.write(RemoteViewsProto.TextViewDrawableAction.Resources.TWO, + appResources.getResourceName(mD2)); + } + if (mD3 != 0) { + out.write(RemoteViewsProto.TextViewDrawableAction.Resources.THREE, + appResources.getResourceName(mD3)); + } + if (mD4 != 0) { + out.write(RemoteViewsProto.TextViewDrawableAction.Resources.FOUR, + appResources.getResourceName(mD4)); + } + out.end(resourcesToken); + } + out.end(token); + } + + public static PendingResources<Action> createFromProto(ProtoInputStream in) + throws Exception { + final LongSparseArray<Object> values = new LongSparseArray<>(); + + values.put(RemoteViewsProto.TextViewDrawableAction.ICONS, + new SparseArray<PendingResources<Icon>>()); + values.put(RemoteViewsProto.TextViewDrawableAction.RESOURCES, + new SparseArray<String>()); + final long token = in.start(RemoteViewsProto.Action.TEXT_VIEW_DRAWABLE_ACTION); + while (in.nextField() != NO_MORE_FIELDS) { + switch (in.getFieldNumber()) { + case (int) RemoteViewsProto.TextViewDrawableAction.VIEW_ID: + values.put(RemoteViewsProto.TextViewDrawableAction.VIEW_ID, + in.readString(RemoteViewsProto.TextViewDrawableAction.VIEW_ID)); + break; + case (int) RemoteViewsProto.TextViewDrawableAction.IS_RELATIVE: + values.put(RemoteViewsProto.TextViewDrawableAction.IS_RELATIVE, + in.readBoolean( + RemoteViewsProto.TextViewDrawableAction.IS_RELATIVE)); + break; + case (int) RemoteViewsProto.TextViewDrawableAction.RESOURCES: + final long resourcesToken = in.start( + RemoteViewsProto.TextViewDrawableAction.RESOURCES); + while (in.nextField() != NO_MORE_FIELDS) { + switch (in.getFieldNumber()) { + case (int) RemoteViewsProto.TextViewDrawableAction.Resources.ONE: + ((SparseArray<String>) values.get( + RemoteViewsProto.TextViewDrawableAction.RESOURCES)).put( + 1, in.readString( + RemoteViewsProto + .TextViewDrawableAction.Resources.ONE)); + break; + case (int) RemoteViewsProto.TextViewDrawableAction.Resources.TWO: + ((SparseArray<String>) values.get( + RemoteViewsProto.TextViewDrawableAction.RESOURCES)).put( + 2, in.readString( + RemoteViewsProto + .TextViewDrawableAction.Resources.TWO)); + break; + case (int) RemoteViewsProto.TextViewDrawableAction.Resources.THREE: + ((SparseArray<String>) values.get( + RemoteViewsProto.TextViewDrawableAction.RESOURCES)).put( + 3, in.readString( + RemoteViewsProto + .TextViewDrawableAction + .Resources.THREE)); + break; + case (int) RemoteViewsProto.TextViewDrawableAction.Resources.FOUR: + ((SparseArray<String>) values.get( + RemoteViewsProto.TextViewDrawableAction.RESOURCES)).put( + 4, in.readString( + RemoteViewsProto + .TextViewDrawableAction + .Resources.FOUR)); + break; + default: + Log.w(LOG_TAG, + "Unhandled field while reading RemoteViews proto!\n" + + ProtoUtils.currentFieldToString(in)); + } + } + in.end(resourcesToken); + break; + case (int) RemoteViewsProto.TextViewDrawableAction.ICONS: + final long iconsToken = in.start( + RemoteViewsProto.TextViewDrawableAction.ICONS); + while (in.nextField() != NO_MORE_FIELDS) { + switch (in.getFieldNumber()) { + case (int) RemoteViewsProto.TextViewDrawableAction.Icons.ONE: + ((SparseArray<PendingResources<Icon>>) values.get( + RemoteViewsProto.TextViewDrawableAction.ICONS)).put(1, + createIconFromProto(in, + RemoteViewsProto + .TextViewDrawableAction.Icons.ONE)); + break; + case (int) RemoteViewsProto.TextViewDrawableAction.Icons.TWO: + ((SparseArray<PendingResources<Icon>>) values.get( + RemoteViewsProto.TextViewDrawableAction.ICONS)).put(2, + createIconFromProto(in, + RemoteViewsProto + .TextViewDrawableAction.Icons.TWO)); + break; + case (int) RemoteViewsProto.TextViewDrawableAction.Icons.THREE: + ((SparseArray<PendingResources<Icon>>) values.get( + RemoteViewsProto.TextViewDrawableAction.ICONS)).put(3, + createIconFromProto(in, + RemoteViewsProto + .TextViewDrawableAction.Icons.THREE)); + break; + case (int) RemoteViewsProto.TextViewDrawableAction.Icons.FOUR: + ((SparseArray<PendingResources<Icon>>) values.get( + RemoteViewsProto.TextViewDrawableAction.ICONS)).put(4, + createIconFromProto(in, + RemoteViewsProto + .TextViewDrawableAction.Icons.FOUR)); + break; + default: + Log.w(LOG_TAG, + "Unhandled field while reading RemoteViews proto!\n" + + ProtoUtils.currentFieldToString(in)); + } + } + in.end(iconsToken); + break; + default: + Log.w(LOG_TAG, "Unhandled field while reading RemoteViews proto!\n" + + ProtoUtils.currentFieldToString(in)); + } + } + in.end(token); + + checkContainsKeys(values, new long[]{RemoteViewsProto.TextViewDrawableAction.VIEW_ID}); + + return (context, resources, rootData, depth) -> { + int viewId = getAsIdentifier(resources, values, + RemoteViewsProto.TextViewDrawableAction.VIEW_ID); + SparseArray<PendingResources<Icon>> icons = + (SparseArray<PendingResources<Icon>>) values.get( + RemoteViewsProto.TextViewDrawableAction.ICONS); + SparseArray<String> resArray = (SparseArray<String>) values.get( + RemoteViewsProto.TextViewDrawableAction.RESOURCES); + boolean isRelative = (boolean) values.get( + RemoteViewsProto.TextViewDrawableAction.IS_RELATIVE, false); + if (icons.size() > 0) { + return new TextViewDrawableAction(viewId, isRelative, + icons.get(1).create(context, resources, rootData, depth), + icons.get(2).create(context, resources, rootData, depth), + icons.get(3).create(context, resources, rootData, depth), + icons.get(4).create(context, resources, rootData, depth)); + } else { + int first = resArray.contains(1) ? getAsIdentifier(resources, resArray, 1) : 0; + int second = resArray.contains(2) ? getAsIdentifier(resources, resArray, 2) : 0; + int third = resArray.contains(3) ? getAsIdentifier(resources, resArray, 3) : 0; + int fourth = resArray.contains(4) ? getAsIdentifier(resources, resArray, 4) : 0; + return new TextViewDrawableAction(viewId, isRelative, first, second, third, + fourth); + } + }; + } } /** @@ -4535,6 +4849,58 @@ public class RemoteViews implements Parcelable, Filter { public int getActionTag() { return TEXT_VIEW_SIZE_ACTION_TAG; } + + @Override + public boolean canWriteToProto() { + return true; + } + + @Override + public void writeToProto(ProtoOutputStream out, Context context, Resources appResources) { + final long token = out.start(RemoteViewsProto.Action.TEXT_VIEW_SIZE_ACTION); + out.write(RemoteViewsProto.TextViewSizeAction.VIEW_ID, + appResources.getResourceName(mViewId)); + out.write(RemoteViewsProto.TextViewSizeAction.UNITS, mUnits); + out.write(RemoteViewsProto.TextViewSizeAction.SIZE, mSize); + out.end(token); + } + + public static PendingResources<Action> createFromProto(ProtoInputStream in) + throws Exception { + final LongSparseArray<Object> values = new LongSparseArray<>(); + + final long token = in.start(RemoteViewsProto.Action.TEXT_VIEW_SIZE_ACTION); + while (in.nextField() != NO_MORE_FIELDS) { + switch (in.getFieldNumber()) { + case (int) RemoteViewsProto.TextViewSizeAction.VIEW_ID: + values.put(RemoteViewsProto.TextViewSizeAction.VIEW_ID, + in.readString(RemoteViewsProto.TextViewSizeAction.VIEW_ID)); + break; + case (int) RemoteViewsProto.TextViewSizeAction.UNITS: + values.put(RemoteViewsProto.TextViewSizeAction.UNITS, + in.readInt(RemoteViewsProto.TextViewSizeAction.UNITS)); + break; + case (int) RemoteViewsProto.TextViewSizeAction.SIZE: + values.put(RemoteViewsProto.TextViewSizeAction.SIZE, + in.readFloat(RemoteViewsProto.TextViewSizeAction.SIZE)); + break; + default: + Log.w(LOG_TAG, "Unhandled field while reading RemoteViews proto!\n" + + ProtoUtils.currentFieldToString(in)); + } + } + in.end(token); + + checkContainsKeys(values, new long[]{RemoteViewsProto.TextViewSizeAction.VIEW_ID}); + + return (context, resources, rootData, depth) -> { + int viewId = getAsIdentifier(resources, values, + RemoteViewsProto.TextViewSizeAction.VIEW_ID); + return new TextViewSizeAction(viewId, + (int) values.get(RemoteViewsProto.TextViewSizeAction.UNITS, 0), + (float) values.get(RemoteViewsProto.TextViewSizeAction.SIZE, 0)); + }; + } } /** @@ -4579,6 +4945,70 @@ public class RemoteViews implements Parcelable, Filter { public int getActionTag() { return VIEW_PADDING_ACTION_TAG; } + + @Override + public boolean canWriteToProto() { + return true; + } + + @Override + public void writeToProto(ProtoOutputStream out, Context context, Resources appResources) { + final long token = out.start(RemoteViewsProto.Action.VIEW_PADDING_ACTION); + out.write(RemoteViewsProto.ViewPaddingAction.VIEW_ID, + appResources.getResourceName(mViewId)); + out.write(RemoteViewsProto.ViewPaddingAction.LEFT, mLeft); + out.write(RemoteViewsProto.ViewPaddingAction.RIGHT, mRight); + out.write(RemoteViewsProto.ViewPaddingAction.TOP, mTop); + out.write(RemoteViewsProto.ViewPaddingAction.BOTTOM, mBottom); + out.end(token); + } + + public static PendingResources<Action> createFromProto(ProtoInputStream in) + throws Exception { + final LongSparseArray<Object> values = new LongSparseArray<>(); + + final long token = in.start(RemoteViewsProto.Action.VIEW_PADDING_ACTION); + while (in.nextField() != NO_MORE_FIELDS) { + switch (in.getFieldNumber()) { + case (int) RemoteViewsProto.ViewPaddingAction.VIEW_ID: + values.put(RemoteViewsProto.ViewPaddingAction.VIEW_ID, + in.readString(RemoteViewsProto.ViewPaddingAction.VIEW_ID)); + break; + case (int) RemoteViewsProto.ViewPaddingAction.LEFT: + values.put(RemoteViewsProto.ViewPaddingAction.LEFT, + in.readInt(RemoteViewsProto.ViewPaddingAction.LEFT)); + break; + case (int) RemoteViewsProto.ViewPaddingAction.RIGHT: + values.put(RemoteViewsProto.ViewPaddingAction.RIGHT, + in.readInt(RemoteViewsProto.ViewPaddingAction.RIGHT)); + break; + case (int) RemoteViewsProto.ViewPaddingAction.TOP: + values.put(RemoteViewsProto.ViewPaddingAction.TOP, + in.readInt(RemoteViewsProto.ViewPaddingAction.TOP)); + break; + case (int) RemoteViewsProto.ViewPaddingAction.BOTTOM: + values.put(RemoteViewsProto.ViewPaddingAction.BOTTOM, + in.readInt(RemoteViewsProto.ViewPaddingAction.BOTTOM)); + break; + default: + Log.w(LOG_TAG, "Unhandled field while reading RemoteViews proto!\n" + + ProtoUtils.currentFieldToString(in)); + } + } + in.end(token); + + checkContainsKeys(values, new long[]{RemoteViewsProto.ViewPaddingAction.VIEW_ID}); + + return (context, resources, rootData, depth) -> { + int viewId = getAsIdentifier(resources, values, + RemoteViewsProto.ViewPaddingAction.VIEW_ID); + return new ViewPaddingAction(viewId, + (int) values.get(RemoteViewsProto.ViewPaddingAction.LEFT, 0), + (int) values.get(RemoteViewsProto.ViewPaddingAction.TOP, 0), + (int) values.get(RemoteViewsProto.ViewPaddingAction.RIGHT, 0), + (int) values.get(RemoteViewsProto.ViewPaddingAction.BOTTOM, 0)); + }; + } } /** @@ -5241,6 +5671,69 @@ public class RemoteViews implements Parcelable, Filter { public int getActionTag() { return SET_VIEW_OUTLINE_RADIUS_TAG; } + + @Override + public boolean canWriteToProto() { + return true; + } + + @Override + public void writeToProto(ProtoOutputStream out, Context context, Resources appResources) { + final long token = out.start( + RemoteViewsProto.Action.SET_VIEW_OUTLINE_PREFERRED_RADIUS_ACTION); + out.write(RemoteViewsProto.SetViewOutlinePreferredRadiusAction.VIEW_ID, + appResources.getResourceName(mViewId)); + out.write(RemoteViewsProto.SetViewOutlinePreferredRadiusAction.VALUE_TYPE, mValueType); + out.write(RemoteViewsProto.SetViewOutlinePreferredRadiusAction.VALUE, mValue); + out.end(token); + } + + public static PendingResources<Action> createFromProto(ProtoInputStream in) + throws Exception { + final LongSparseArray<Object> values = new LongSparseArray<>(); + + final long token = in.start( + RemoteViewsProto.Action.SET_VIEW_OUTLINE_PREFERRED_RADIUS_ACTION); + while (in.nextField() != NO_MORE_FIELDS) { + switch (in.getFieldNumber()) { + case (int) RemoteViewsProto.SetViewOutlinePreferredRadiusAction.VIEW_ID: + values.put(RemoteViewsProto.SetViewOutlinePreferredRadiusAction.VIEW_ID, + in.readString( + RemoteViewsProto + .SetViewOutlinePreferredRadiusAction.VIEW_ID)); + break; + case (int) RemoteViewsProto.SetViewOutlinePreferredRadiusAction.VALUE_TYPE: + values.put(RemoteViewsProto.SetViewOutlinePreferredRadiusAction.VALUE_TYPE, + in.readInt( + RemoteViewsProto + .SetViewOutlinePreferredRadiusAction.VALUE_TYPE)); + break; + case (int) RemoteViewsProto.SetViewOutlinePreferredRadiusAction.VALUE: + values.put(RemoteViewsProto.SetViewOutlinePreferredRadiusAction.VALUE, + in.readInt( + RemoteViewsProto + .SetViewOutlinePreferredRadiusAction.VALUE)); + break; + default: + Log.w(LOG_TAG, "Unhandled field while reading RemoteViews proto!\n" + + ProtoUtils.currentFieldToString(in)); + } + } + in.end(token); + + checkContainsKeys(values, + new long[]{RemoteViewsProto.SetViewOutlinePreferredRadiusAction.VIEW_ID, + RemoteViewsProto.SetViewOutlinePreferredRadiusAction.VALUE_TYPE}); + + return (context, resources, rootData, depth) -> { + int viewId = getAsIdentifier(resources, values, + RemoteViewsProto.SetViewOutlinePreferredRadiusAction.VIEW_ID); + return new SetViewOutlinePreferredRadiusAction(viewId, + (int) values.get(RemoteViewsProto.SetViewOutlinePreferredRadiusAction.VALUE, + 0), (int) values.get( + RemoteViewsProto.SetViewOutlinePreferredRadiusAction.VALUE_TYPE)); + }; + } } /** @@ -5324,6 +5817,46 @@ public class RemoteViews implements Parcelable, Filter { public int getActionTag() { return SET_DRAW_INSTRUCTION_TAG; } + + @Override + public boolean canWriteToProto() { + return drawDataParcel(); + } + + @Override + public void writeToProto(ProtoOutputStream out, Context context, Resources appResources) { + if (!drawDataParcel()) return; + final long token = out.start(RemoteViewsProto.Action.SET_DRAW_INSTRUCTION_ACTION); + if (mInstructions != null) { + for (byte[] bytes : mInstructions.mInstructions) { + out.write(RemoteViewsProto.SetDrawInstructionAction.INSTRUCTIONS, bytes); + } + } + out.end(token); + } + } + + @FlaggedApi(FLAG_DRAW_DATA_PARCEL) + private PendingResources<Action> createSetDrawInstructionActionFromProto(ProtoInputStream in) + throws Exception { + List<byte[]> instructions = new ArrayList<byte[]>(); + + final long token = in.start(RemoteViewsProto.Action.SET_DRAW_INSTRUCTION_ACTION); + while (in.nextField() != NO_MORE_FIELDS) { + switch (in.getFieldNumber()) { + case (int) RemoteViewsProto.SetDrawInstructionAction.INSTRUCTIONS: + instructions.add( + in.readBytes(RemoteViewsProto.SetDrawInstructionAction.INSTRUCTIONS)); + break; + default: + Log.w(LOG_TAG, "Unhandled field while reading RemoteViews proto!\n" + + ProtoUtils.currentFieldToString(in)); + } + } + in.end(token); + + return (context, resources, rootData, depth) -> new SetDrawInstructionAction( + new DrawInstructions.Builder(instructions).build()); } /** @@ -9604,12 +10137,20 @@ public class RemoteViews implements Parcelable, Filter { } if (ref.mMode == MODE_NORMAL) { rv.setIdealSize(ref.mIdealSize); + boolean hasDrawInstructionAction = false; for (PendingResources<Action> pendingAction : ref.mActions) { Action action = pendingAction.create(appContext, appResources, rootData, depth); if (action != null) { + if (action instanceof SetDrawInstructionAction) { + hasDrawInstructionAction = true; + } rv.addAction(action); } } + if (rv.mHasDrawInstructions && !hasDrawInstructionAction) { + throw new InvalidProtoException( + "RemoteViews proto is missing DrawInstructions"); + } return rv; } else if (ref.mMode == MODE_HAS_SIZED_REMOTEVIEWS) { List<RemoteViews> sizedViews = new ArrayList<>(); @@ -9685,6 +10226,23 @@ public class RemoteViews implements Parcelable, Filter { return rv.createSetRemoteCollectionItemListAdapterActionFromProto(in); case (int) RemoteViewsProto.Action.SET_RIPPLE_DRAWABLE_COLOR_ACTION: return SetRippleDrawableColor.createFromProto(in); + case (int) RemoteViewsProto.Action.SET_VIEW_OUTLINE_PREFERRED_RADIUS_ACTION: + return SetViewOutlinePreferredRadiusAction.createFromProto(in); + case (int) RemoteViewsProto.Action.TEXT_VIEW_DRAWABLE_ACTION: + return TextViewDrawableAction.createFromProto(in); + case (int) RemoteViewsProto.Action.TEXT_VIEW_SIZE_ACTION: + return TextViewSizeAction.createFromProto(in); + case (int) RemoteViewsProto.Action.VIEW_GROUP_ADD_ACTION: + return rv.createViewGroupActionAddFromProto(in); + case (int) RemoteViewsProto.Action.VIEW_GROUP_REMOVE_ACTION: + return ViewGroupActionRemove.createFromProto(in); + case (int) RemoteViewsProto.Action.VIEW_PADDING_ACTION: + return ViewPaddingAction.createFromProto(in); + case (int) RemoteViewsProto.Action.SET_DRAW_INSTRUCTION_ACTION: + if (!drawDataParcel()) { + return null; + } + return rv.createSetDrawInstructionActionFromProto(in); default: throw new RuntimeException("Unhandled field while reading Action proto!\n" + ProtoUtils.currentFieldToString(in)); diff --git a/core/proto/android/widget/remoteviews.proto b/core/proto/android/widget/remoteviews.proto index f477d32cd915..6a987a475711 100644 --- a/core/proto/android/widget/remoteviews.proto +++ b/core/proto/android/widget/remoteviews.proto @@ -32,6 +32,8 @@ import "frameworks/base/core/proto/android/content/res/color_state_list.proto"; * * Do not change the tag number or type of any fields in order to maintain compatibility with * previous versions. If a field is deleted, use `reserved` to mark its tag number. + * + * Next tag: 17 */ message RemoteViewsProto { option (android.msg_privacy).dest = DEST_AUTOMATIC; @@ -290,6 +292,7 @@ message RemoteViewsProto { } } + // Next tag: 23 message Action { oneof action { AttributeReflectionAction attribute_reflection_action = 1; @@ -307,6 +310,13 @@ message RemoteViewsProto { SetRadioGroupCheckedAction set_radio_group_checked_action = 13; SetRemoteCollectionItemListAdapterAction set_remote_collection_item_list_adapter_action = 14; SetRippleDrawableColorAction set_ripple_drawable_color_action = 15; + SetViewOutlinePreferredRadiusAction set_view_outline_preferred_radius_action = 16; + TextViewDrawableAction text_view_drawable_action = 17; + TextViewSizeAction text_view_size_action = 18; + ViewGroupAddAction view_group_add_action = 19; + ViewGroupRemoveAction view_group_remove_action = 20; + ViewPaddingAction view_padding_action = 21; + SetDrawInstructionAction set_draw_instruction_action = 22; } } @@ -428,6 +438,65 @@ message RemoteViewsProto { optional string view_id = 1; optional android.content.res.ColorStateListProto color_state_list = 2; } + + message SetViewOutlinePreferredRadiusAction { + optional string view_id = 1; + optional int32 value_type = 2; + optional int32 value = 3; + } + + message TextViewDrawableAction { + optional string view_id = 1; + optional bool is_relative = 2; + oneof drawables { + Resources resources = 3; + Icons icons = 4; + }; + + message Resources { + optional string one = 1; + optional string two = 2; + optional string three = 3; + optional string four = 4; + } + + message Icons { + optional Icon one = 1; + optional Icon two = 2; + optional Icon three = 3; + optional Icon four = 4; + } + } + + message TextViewSizeAction { + optional string view_id = 1; + optional int32 units = 2; + optional float size = 3; + } + + message ViewGroupAddAction { + optional string view_id = 1; + optional RemoteViewsProto nested_views = 2; + optional int32 index = 3; + optional int32 stableId = 4; + } + + message ViewGroupRemoveAction { + optional string view_id = 1; + optional string view_id_to_keep = 2; + } + + message ViewPaddingAction { + optional string view_id = 1; + optional int32 left = 2; + optional int32 right = 3; + optional int32 top = 4; + optional int32 bottom = 5; + } + + message SetDrawInstructionAction { + repeated bytes instructions = 1; + } } |