LayoutElementBuilders.Image.Builder deprecated in WearOS Tiles

5 days ago 5
ARTICLE AD BOX

Google recently deprecated (here, here) LayoutElementBuilders.Image.Builder, which is used to display images in a WearOS Tile. I'm having trouble refactoring my code.

This is the original code:

new LayoutElementBuilders.Image.Builder() .setResourceId("image_play") .build()

This is how you I set "image_play":

@Override protected ListenableFuture<androidx.wear.protolayout.ResourceBuilders.Resources> onTileResourcesRequest(@NonNull RequestBuilders.ResourcesRequest requestParams) { return Futures.immediateFuture(new ResourceBuilders.Resources.Builder() .setVersion(RESOURCES_VERSION) .addIdToImageMapping("image_play", new ResourceBuilders.ImageResource.Builder() .setAndroidResourceByResId(new ResourceBuilders.AndroidImageResourceByResId.Builder() .setResourceId(R.drawable.ic_action_tile_play).build()).build() ) .build() ); }

This is my refactored code:

new LayoutElementBuilders.Image.Builder(new ProtoLayoutScope()) .setImageResource(new ResourceBuilders.ImageResource.Builder() .setAndroidResourceByResId(new ResourceBuilders.AndroidImageResourceByResId.Builder() .setResourceId(R.drawable.ic_action_tile_play) .build()) .build()) .build()

The code compiles but the image does not display in the Tile. This is the entire layout code:

return new LayoutElementBuilders.Column.Builder() .setHeight(DimensionBuilders.expand()) .setHorizontalAlignment(LayoutElementBuilders.HORIZONTAL_ALIGN_CENTER) .addContent( new LayoutElementBuilders.Row.Builder() .setWidth(DimensionBuilders.wrap()) .setHeight(DimensionBuilders.expand()) .setVerticalAlignment(LayoutElementBuilders.VERTICAL_ALIGN_CENTER) .addContent(new LayoutElementBuilders.Image.Builder() .setModifiers(new ModifiersBuilders.Modifiers.Builder() .setClickable(new ModifiersBuilders.Clickable.Builder() .setId("tile_play") .setOnClick(new ActionBuilders.LoadAction.Builder().build()) .build() ).build() ) .setResourceId("image_play") .setWidth(DimensionBuilders.dp(55f)) .setHeight(DimensionBuilders.dp(55f)).build() ).build() ).build();

AFter some tinkering I found this works:

new LayoutElementBuilders.Image.Builder(new ProtoLayoutScope()) .setImageResource(new ResourceBuilders.ImageResource.Builder() .setAndroidResourceByResId(new ResourceBuilders.AndroidImageResourceByResId.Builder() .setResourceId(R.drawable.ic_action_tile_play).build()).build(), "image_play") .build()

If you pass in the ID the resources set in onTileResourcesRequest, it works. I don't know if it's correct though.

Read Entire Article