RequestBuilders.java

/*
 * Copyright 2022 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package androidx.wear.tiles;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.annotation.RestrictTo;
import androidx.annotation.RestrictTo.Scope;
import androidx.wear.protolayout.DeviceParametersBuilders.DeviceParameters;
import androidx.wear.protolayout.StateBuilders.State;
import androidx.wear.protolayout.proto.DeviceParametersProto;
import androidx.wear.protolayout.proto.StateProto;
import androidx.wear.tiles.proto.RequestProto;

import java.util.List;

/** Builders for request messages used to fetch tiles and resources. */
public final class RequestBuilders {
    private RequestBuilders() {}

    /**
     * Parameters passed to a {@link androidx.wear.tiles.TileBuilders.Tile} Service when the
     * renderer is requesting a new version of the tile.
     *
     * @since 1.0
     */
    public static final class TileRequest {
        private final RequestProto.TileRequest mImpl;

        TileRequest(RequestProto.TileRequest impl) {
            this.mImpl = impl;
        }

        /**
         * Gets the {@link DeviceParameters} describing the device requesting the tile update.
         * If it was not set, a default empty instance is returned.
         *
         * @since 1.0
         */
        @NonNull
        public DeviceParameters getDeviceConfiguration() {
            if (mImpl.hasDeviceConfiguration()) {
                return DeviceParameters.fromProto(mImpl.getDeviceConfiguration());
            } else {
                return DeviceParameters.fromProto(
                        DeviceParametersProto.DeviceParameters.getDefaultInstance());
            }
        }

        /**
         * Gets the {@link State} that should be used when building the tile.
         *
         * @since 1.0
         */
        @NonNull
        public State getCurrentState() {
            if (mImpl.hasCurrentState()) {
                return State.fromProto(mImpl.getCurrentState());
            } else {
                return State.fromProto(StateProto.State.getDefaultInstance());
            }
        }

        /**
         * Gets the {@link androidx.wear.tiles.DeviceParametersBuilders.DeviceParameters} object
         * describing the device requesting the tile update.
         *
         * @since 1.0
         */
        @Nullable
        public androidx.wear.tiles.DeviceParametersBuilders.DeviceParameters getDeviceParameters() {
            if (mImpl.hasDeviceConfiguration()) {
                return androidx.wear.tiles.DeviceParametersBuilders.DeviceParameters.fromProto(
                        mImpl.getDeviceConfiguration());
            } else {
                return null;
            }
        }

        /**
         * Gets the {@link androidx.wear.tiles.StateBuilders.State} that should be used when
         * building the tile.
         *
         * @since 1.0
         */
        @Nullable
        public androidx.wear.tiles.StateBuilders.State getState() {
            if (mImpl.hasCurrentState()) {
                return androidx.wear.tiles.StateBuilders.State.fromProto(mImpl.getCurrentState());
            } else {
                return null;
            }
        }

        /**
         * Creates a new wrapper instance from the proto.
         *
         * @hide
         */
        @RestrictTo(Scope.LIBRARY_GROUP)
        @NonNull
        public static TileRequest fromProto(@NonNull RequestProto.TileRequest proto) {
            return new TileRequest(proto);
        }

        /**
         * Returns the internal proto instance.
         *
         * @hide
         */
        @RestrictTo(Scope.LIBRARY_GROUP)
        @NonNull
        public RequestProto.TileRequest toProto() {
            return mImpl;
        }

        /** Builder for {@link TileRequest} */
        public static final class Builder {
            private final RequestProto.TileRequest.Builder mImpl =
                    RequestProto.TileRequest.newBuilder();

            public Builder() {}

            /**
             * Sets a {@link DeviceParameters} object describing the device requesting the tile
             * update.
             * If not set, a default empty instance is used.
             *
             * @since 1.0
             */
            @NonNull
            public Builder setDeviceConfiguration(@NonNull DeviceParameters deviceConfiguration) {
                mImpl.setDeviceConfiguration(deviceConfiguration.toProto());
                return this;
            }

            /**
             * Sets the {@link State} that should be used when building the tile.
             *
             * @since 1.0
             */
            @NonNull
            public Builder setCurrentState(@NonNull State currentState) {
                mImpl.setCurrentState(currentState.toProto());
                return this;
            }

            /**
             * Sets a {@link androidx.wear.tiles.DeviceParametersBuilders.DeviceParameters} object
             * describing the device requesting the tile update.
             *
             * @since 1.0
             */
            @NonNull
            public Builder setDeviceParameters(
                    @NonNull
                            androidx.wear.tiles.DeviceParametersBuilders.DeviceParameters
                                    deviceParameters) {
                mImpl.setDeviceConfiguration(deviceParameters.toProto());
                return this;
            }

            /**
             * Sets the {@link androidx.wear.tiles.StateBuilders.State} that should be used when
             * building the tile.
             *
             * @since 1.0
             */
            @NonNull
            public Builder setState(@NonNull androidx.wear.tiles.StateBuilders.State state) {
                mImpl.setCurrentState(state.toProto());
                return this;
            }

            /** Builds an instance from accumulated values. */
            @NonNull
            public TileRequest build() {
                return TileRequest.fromProto(mImpl.build());
            }
        }
    }

    /**
     * Parameters passed to a {@link androidx.wear.tiles.TileBuilders.Tile} Service when the
     * renderer is requesting a specific resource version.
     *
     * @since 1.0
     */
    public static final class ResourcesRequest {
        private final RequestProto.ResourcesRequest mImpl;

        ResourcesRequest(RequestProto.ResourcesRequest impl) {
            this.mImpl = impl;
        }

        /**
         * Gets the version of the resources being fetched. This is the same as the requested
         * resource version, passed in {@link androidx.wear.tiles.TileBuilders.Tile}.
         *
         * @since 1.0
         */
        @NonNull
        public String getVersion() {
            return mImpl.getVersion();
        }

        /**
         * Gets requested resource IDs. This specifies which tile resources should be returned in
         * the {@link androidx.wear.protolayout.ResourceBuilders.Resources} response. If not
         * specified, all resources for the given version must be provided in the response.
         *
         * <p>Note that resource IDs here correspond to tile resources (i.e. keys that would be used
         * in {@link androidx.wear.protolayout.ResourceBuilders.Resources}.idToImage), not Android
         * resource names or similar.
         *
         * @since 1.0
         */
        @NonNull
        public List<String> getResourceIds() {
            return mImpl.getResourceIdsList();
        }

        /**
         * Gets the {@link DeviceParameters} object describing the device requesting the resources.
         * If it was not set, a default empty instance is returned.
         *
         * @since 1.0
         */
        @NonNull
        public DeviceParameters getDeviceConfiguration() {
            if (mImpl.hasDeviceConfiguration()) {
                return DeviceParameters.fromProto(mImpl.getDeviceConfiguration());
            } else {
                return DeviceParameters.fromProto(
                        DeviceParametersProto.DeviceParameters.getDefaultInstance());
            }
        }

        /**
         * Gets the {@link androidx.wear.tiles.DeviceParametersBuilders.DeviceParameters} object
         * describing the device requesting the resources.
         *
         * @since 1.0
         */
        @Nullable
        public androidx.wear.tiles.DeviceParametersBuilders.DeviceParameters getDeviceParameters() {
            if (mImpl.hasDeviceConfiguration()) {
                return androidx.wear.tiles.DeviceParametersBuilders.DeviceParameters.fromProto(
                        mImpl.getDeviceConfiguration());
            } else {
                return null;
            }
        }

        /**
         * Creates a new wrapper instance from the proto.
         *
         * @hide
         */
        @RestrictTo(Scope.LIBRARY_GROUP)
        @NonNull
        public static ResourcesRequest fromProto(@NonNull RequestProto.ResourcesRequest proto) {
            return new ResourcesRequest(proto);
        }

        /**
         * Returns the internal proto instance.
         *
         * @hide
         */
        @RestrictTo(Scope.LIBRARY_GROUP)
        @NonNull
        public RequestProto.ResourcesRequest toProto() {
            return mImpl;
        }

        /** Builder for {@link ResourcesRequest} */
        public static final class Builder {
            private final RequestProto.ResourcesRequest.Builder mImpl =
                    RequestProto.ResourcesRequest.newBuilder();

            public Builder() {}

            /**
             * Sets the version of the resources being fetched. This is the same as the requested
             * resource version, passed in {@link androidx.wear.tiles.TileBuilders.Tile}.
             *
             * @since 1.0
             */
            @NonNull
            public Builder setVersion(@NonNull String version) {
                mImpl.setVersion(version);
                return this;
            }

            /**
             * Adds one item to requested resource IDs. This specifies which tile resources should
             * be returned in the {@link androidx.wear.protolayout.ResourceBuilders.Resources}
             * response. If not specified, all resources for the given version must be provided in
             * the response.
             *
             * <p>Note that resource IDs here correspond to tile resources (i.e. keys that would be
             * used in {@link androidx.wear.protolayout.ResourceBuilders.Resources}.idToImage), not
             * Android resource names or similar.
             *
             * @since 1.0
             */
            @NonNull
            public Builder addResourceId(@NonNull String resourceId) {
                mImpl.addResourceIds(resourceId);
                return this;
            }

            /**
             * Sets a {@link DeviceParameters} object describing the device requesting the
             * resources.
             * If not set, a default empty instance is used.
             *
             * @since 1.0
             */
            @NonNull
            public Builder setDeviceConfiguration(@NonNull DeviceParameters deviceConfiguration) {
                mImpl.setDeviceConfiguration(deviceConfiguration.toProto());
                return this;
            }

            /**
             * Sets a {@link androidx.wear.tiles.DeviceParametersBuilders.DeviceParameters} object
             * describing the device requesting the resources.
             *
             * @since 1.0
             */
            @NonNull
            public Builder setDeviceParameters(
                    @NonNull
                            androidx.wear.tiles.DeviceParametersBuilders.DeviceParameters
                                    deviceParameters) {
                mImpl.setDeviceConfiguration(deviceParameters.toProto());
                return this;
            }

            /** Builds an instance from accumulated values. */
            @NonNull
            public ResourcesRequest build() {
                return ResourcesRequest.fromProto(mImpl.build());
            }
        }
    }
}