blob: f9829cd0495ed0ba8d02fc19acf51ce25f9aca1e [file] [log] [blame]
/*
* 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.protolayout.expression;
import android.annotation.SuppressLint;
import androidx.annotation.ColorInt;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.annotation.RestrictTo;
import androidx.annotation.RestrictTo.Scope;
import androidx.wear.protolayout.expression.proto.DynamicProto;
import androidx.wear.protolayout.expression.proto.FixedProto;
import androidx.wear.protolayout.expression.proto.StateEntryProto;
/**
* Builders for fixed value primitive types that can be used in dynamic expressions and in for state
* state values.
*/
final class FixedValueBuilders {
private FixedValueBuilders() {}
/**
* A fixed int32 type.
*
* @since 1.2
*/
static final class FixedInt32
implements DynamicBuilders.DynamicInt32, StateEntryBuilders.StateEntryValue {
private final FixedProto.FixedInt32 mImpl;
@Nullable private final Fingerprint mFingerprint;
FixedInt32(FixedProto.FixedInt32 impl, @Nullable Fingerprint fingerprint) {
this.mImpl = impl;
this.mFingerprint = fingerprint;
}
/**
* Gets the value.
*
* @since 1.2
*/
public int getValue() {
return mImpl.getValue();
}
@Override
@RestrictTo(Scope.LIBRARY_GROUP)
@Nullable
public Fingerprint getFingerprint() {
return mFingerprint;
}
@NonNull
static FixedInt32 fromProto(@NonNull FixedProto.FixedInt32 proto) {
return new FixedInt32(proto, null);
}
@NonNull
FixedProto.FixedInt32 toProto() {
return mImpl;
}
@Override
@RestrictTo(Scope.LIBRARY_GROUP)
@NonNull
public DynamicProto.DynamicInt32 toDynamicInt32Proto() {
return DynamicProto.DynamicInt32.newBuilder().setFixed(mImpl).build();
}
@Override
@RestrictTo(Scope.LIBRARY_GROUP)
@NonNull
public StateEntryProto.StateEntryValue toStateEntryValueProto() {
return StateEntryProto.StateEntryValue.newBuilder().setInt32Val(mImpl).build();
}
@Override
@NonNull
public String toString() {
return "FixedInt32{" + "value=" + getValue() + "}";
}
/** Builder for {@link FixedInt32}. */
public static final class Builder
implements DynamicBuilders.DynamicInt32.Builder,
StateEntryBuilders.StateEntryValue.Builder {
private final FixedProto.FixedInt32.Builder mImpl = FixedProto.FixedInt32.newBuilder();
private final Fingerprint mFingerprint = new Fingerprint(974881783);
public Builder() {}
/**
* Sets the value.
*
* @since 1.2
*/
@NonNull
public Builder setValue(int value) {
mImpl.setValue(value);
mFingerprint.recordPropertyUpdate(1, value);
return this;
}
@Override
@NonNull
public FixedInt32 build() {
return new FixedInt32(mImpl.build(), mFingerprint);
}
}
}
/**
* A fixed string type.
*
* @since 1.2
*/
static final class FixedString
implements DynamicBuilders.DynamicString, StateEntryBuilders.StateEntryValue {
private final FixedProto.FixedString mImpl;
@Nullable private final Fingerprint mFingerprint;
FixedString(FixedProto.FixedString impl, @Nullable Fingerprint fingerprint) {
this.mImpl = impl;
this.mFingerprint = fingerprint;
}
/**
* Gets the value.
*
* @since 1.2
*/
@NonNull
public String getValue() {
return mImpl.getValue();
}
@Override
@RestrictTo(Scope.LIBRARY_GROUP)
@Nullable
public Fingerprint getFingerprint() {
return mFingerprint;
}
@NonNull
static FixedString fromProto(@NonNull FixedProto.FixedString proto) {
return new FixedString(proto, null);
}
@NonNull
FixedProto.FixedString toProto() {
return mImpl;
}
@Override
@RestrictTo(Scope.LIBRARY_GROUP)
@NonNull
public DynamicProto.DynamicString toDynamicStringProto() {
return DynamicProto.DynamicString.newBuilder().setFixed(mImpl).build();
}
@Override
@RestrictTo(Scope.LIBRARY_GROUP)
@NonNull
public StateEntryProto.StateEntryValue toStateEntryValueProto() {
return StateEntryProto.StateEntryValue.newBuilder().setStringVal(mImpl).build();
}
@Override
@NonNull
public String toString() {
return "FixedString{" + "value=" + getValue() + "}";
}
/** Builder for {@link FixedString}. */
public static final class Builder
implements DynamicBuilders.DynamicString.Builder,
StateEntryBuilders.StateEntryValue.Builder {
private final FixedProto.FixedString.Builder mImpl = FixedProto.FixedString.newBuilder();
private final Fingerprint mFingerprint = new Fingerprint(1963352072);
public Builder() {}
/**
* Sets the value.
*
* @since 1.2
*/
@NonNull
public Builder setValue(@NonNull String value) {
mImpl.setValue(value);
mFingerprint.recordPropertyUpdate(1, value.hashCode());
return this;
}
@Override
@NonNull
public FixedString build() {
return new FixedString(mImpl.build(), mFingerprint);
}
}
}
/**
* A fixed float type.
*
* @since 1.2
*/
static final class FixedFloat
implements DynamicBuilders.DynamicFloat, StateEntryBuilders.StateEntryValue {
private final FixedProto.FixedFloat mImpl;
@Nullable private final Fingerprint mFingerprint;
FixedFloat(FixedProto.FixedFloat impl, @Nullable Fingerprint fingerprint) {
this.mImpl = impl;
this.mFingerprint = fingerprint;
}
/**
* Gets the value. Note that a NaN value is considered invalid and any expression with this node
* will have an invalid value delivered via {@link DynamicTypeValueReceiver<T>#onInvalidate()}.
*
* @since 1.2
*/
public float getValue() {
return mImpl.getValue();
}
@Override
@RestrictTo(Scope.LIBRARY_GROUP)
@Nullable
public Fingerprint getFingerprint() {
return mFingerprint;
}
@NonNull
static FixedFloat fromProto(@NonNull FixedProto.FixedFloat proto) {
return new FixedFloat(proto, null);
}
@NonNull
FixedProto.FixedFloat toProto() {
return mImpl;
}
@Override
@RestrictTo(Scope.LIBRARY_GROUP)
@NonNull
public DynamicProto.DynamicFloat toDynamicFloatProto() {
return DynamicProto.DynamicFloat.newBuilder().setFixed(mImpl).build();
}
@Override
@RestrictTo(Scope.LIBRARY_GROUP)
@NonNull
public StateEntryProto.StateEntryValue toStateEntryValueProto() {
return StateEntryProto.StateEntryValue.newBuilder().setFloatVal(mImpl).build();
}
@Override
@NonNull
public String toString() {
return "FixedFloat{" + "value=" + getValue() + "}";
}
/** Builder for {@link FixedFloat}. */
public static final class Builder
implements DynamicBuilders.DynamicFloat.Builder,
StateEntryBuilders.StateEntryValue.Builder {
private final FixedProto.FixedFloat.Builder mImpl = FixedProto.FixedFloat.newBuilder();
private final Fingerprint mFingerprint = new Fingerprint(-144724541);
public Builder() {}
/**
* Sets the value. Note that a NaN value is considered invalid and any expression with this
* node will have an invalid value delivered via
* {@link DynamicTypeValueReceiver<T>#onInvalidate()}.
*
* @since 1.2
*/
@NonNull
public Builder setValue(float value) {
mImpl.setValue(value);
mFingerprint.recordPropertyUpdate(1, Float.floatToIntBits(value));
return this;
}
@Override
@NonNull
public FixedFloat build() {
return new FixedFloat(mImpl.build(), mFingerprint);
}
}
}
/**
* A fixed boolean type.
*
* @since 1.2
*/
static final class FixedBool
implements DynamicBuilders.DynamicBool, StateEntryBuilders.StateEntryValue {
private final FixedProto.FixedBool mImpl;
@Nullable private final Fingerprint mFingerprint;
FixedBool(FixedProto.FixedBool impl, @Nullable Fingerprint fingerprint) {
this.mImpl = impl;
this.mFingerprint = fingerprint;
}
/**
* Gets the value.
*
* @since 1.2
*/
public boolean getValue() {
return mImpl.getValue();
}
@Override
@RestrictTo(Scope.LIBRARY_GROUP)
@Nullable
public Fingerprint getFingerprint() {
return mFingerprint;
}
@NonNull
static FixedBool fromProto(@NonNull FixedProto.FixedBool proto) {
return new FixedBool(proto, null);
}
@NonNull
FixedProto.FixedBool toProto() {
return mImpl;
}
@Override
@RestrictTo(Scope.LIBRARY_GROUP)
@NonNull
public DynamicProto.DynamicBool toDynamicBoolProto() {
return DynamicProto.DynamicBool.newBuilder().setFixed(mImpl).build();
}
@Override
@RestrictTo(Scope.LIBRARY_GROUP)
@NonNull
public StateEntryProto.StateEntryValue toStateEntryValueProto() {
return StateEntryProto.StateEntryValue.newBuilder().setBoolVal(mImpl).build();
}
@Override
@NonNull
public String toString() {
return "FixedBool{" + "value=" + getValue() + "}";
}
/** Builder for {@link FixedBool}. */
public static final class Builder
implements DynamicBuilders.DynamicBool.Builder, StateEntryBuilders.StateEntryValue.Builder {
private final FixedProto.FixedBool.Builder mImpl = FixedProto.FixedBool.newBuilder();
private final Fingerprint mFingerprint = new Fingerprint(-665116398);
public Builder() {}
/**
* Sets the value.
*
* @since 1.2
*/
@SuppressLint("MissingGetterMatchingBuilder")
@NonNull
public Builder setValue(boolean value) {
mImpl.setValue(value);
mFingerprint.recordPropertyUpdate(1, Boolean.hashCode(value));
return this;
}
@Override
@NonNull
public FixedBool build() {
return new FixedBool(mImpl.build(), mFingerprint);
}
}
}
/**
* A fixed color type.
*
* @since 1.2
*/
static final class FixedColor
implements DynamicBuilders.DynamicColor, StateEntryBuilders.StateEntryValue {
private final FixedProto.FixedColor mImpl;
@Nullable private final Fingerprint mFingerprint;
FixedColor(FixedProto.FixedColor impl, @Nullable Fingerprint fingerprint) {
this.mImpl = impl;
this.mFingerprint = fingerprint;
}
/**
* Gets the color value, in ARGB format.
*
* @since 1.2
*/
@ColorInt
public int getArgb() {
return mImpl.getArgb();
}
@Override
@RestrictTo(Scope.LIBRARY_GROUP)
@Nullable
public Fingerprint getFingerprint() {
return mFingerprint;
}
@NonNull
static FixedColor fromProto(@NonNull FixedProto.FixedColor proto) {
return new FixedColor(proto, null);
}
@NonNull
FixedProto.FixedColor toProto() {
return mImpl;
}
@Override
@RestrictTo(Scope.LIBRARY_GROUP)
@NonNull
public DynamicProto.DynamicColor toDynamicColorProto() {
return DynamicProto.DynamicColor.newBuilder().setFixed(mImpl).build();
}
@Override
@RestrictTo(Scope.LIBRARY_GROUP)
@NonNull
public StateEntryProto.StateEntryValue toStateEntryValueProto() {
return StateEntryProto.StateEntryValue.newBuilder().setColorVal(mImpl).build();
}
@Override
@NonNull
public String toString() {
return "FixedColor{" + "argb=" + getArgb() + "}";
}
/** Builder for {@link FixedColor}. */
public static final class Builder
implements DynamicBuilders.DynamicColor.Builder,
StateEntryBuilders.StateEntryValue.Builder {
private final FixedProto.FixedColor.Builder mImpl = FixedProto.FixedColor.newBuilder();
private final Fingerprint mFingerprint = new Fingerprint(-1895809356);
public Builder() {}
/**
* Sets the color value, in ARGB format.
*
* @since 1.2
*/
@NonNull
public Builder setArgb(@ColorInt int argb) {
mImpl.setArgb(argb);
mFingerprint.recordPropertyUpdate(1, argb);
return this;
}
@Override
@NonNull
public FixedColor build() {
return new FixedColor(mImpl.build(), mFingerprint);
}
}
}
/**
* A fixed time instant type.
*
* @since 1.2
*/
static final class FixedInstant implements DynamicBuilders.DynamicInstant {
private final FixedProto.FixedInstant mImpl;
@Nullable private final Fingerprint mFingerprint;
FixedInstant(FixedProto.FixedInstant impl, @Nullable Fingerprint fingerprint) {
this.mImpl = impl;
this.mFingerprint = fingerprint;
}
/**
* Gets the number of seconds that have elapsed since 00:00:00 UTC on 1 January 1970.
*
* @since 1.2
*/
public long getEpochSeconds() {
return mImpl.getEpochSeconds();
}
@Override
@RestrictTo(Scope.LIBRARY_GROUP)
@Nullable
public Fingerprint getFingerprint() {
return mFingerprint;
}
@NonNull
static FixedInstant fromProto(@NonNull FixedProto.FixedInstant proto) {
return new FixedInstant(proto, null);
}
@NonNull
FixedProto.FixedInstant toProto() {
return mImpl;
}
@Override
@RestrictTo(Scope.LIBRARY_GROUP)
@NonNull
public DynamicProto.DynamicInstant toDynamicInstantProto() {
return DynamicProto.DynamicInstant.newBuilder().setFixed(mImpl).build();
}
@Override
@NonNull
public String toString() {
return "FixedInstant{" + "epochSeconds=" + getEpochSeconds() + "}";
}
/** Builder for {@link FixedInstant}. */
public static final class Builder implements DynamicBuilders.DynamicInstant.Builder {
private final FixedProto.FixedInstant.Builder mImpl = FixedProto.FixedInstant.newBuilder();
private final Fingerprint mFingerprint = new Fingerprint(-1986552556);
public Builder() {}
/**
* Sets the number of seconds that have elapsed since 00:00:00 UTC on 1 January 1970.
*
* @since 1.2
*/
@NonNull
public Builder setEpochSeconds(long epochSeconds) {
mImpl.setEpochSeconds(epochSeconds);
mFingerprint.recordPropertyUpdate(1, Long.hashCode(epochSeconds));
return this;
}
@Override
@NonNull
public FixedInstant build() {
return new FixedInstant(mImpl.build(), mFingerprint);
}
}
}
}