/* * Copyright (C) 2021 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 android.app.time; import static android.app.time.Capabilities.CAPABILITY_NOT_APPLICABLE; import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.SystemApi; import android.app.time.Capabilities.CapabilityState; import android.os.Parcel; import android.os.Parcelable; import android.os.UserHandle; import java.util.Objects; /** * Time-relate capabilities for a user. * *

For configuration settings capabilities, the associated settings value can be found via * {@link TimeManager#getTimeCapabilitiesAndConfig()} and may be changed using {@link * TimeManager#updateTimeConfiguration(TimeConfiguration)} (if the user's capabilities * allow). * * @hide */ @SystemApi public final class TimeCapabilities implements Parcelable { public static final @NonNull Creator CREATOR = new Creator<>() { public TimeCapabilities createFromParcel(Parcel in) { return TimeCapabilities.createFromParcel(in); } public TimeCapabilities[] newArray(int size) { return new TimeCapabilities[size]; } }; /** * The user the capabilities are for. This is used for object equality and debugging but there * is no accessor. */ @NonNull private final UserHandle mUserHandle; private final @CapabilityState int mConfigureAutoDetectionEnabledCapability; private final @CapabilityState int mSetManualTimeCapability; private TimeCapabilities(@NonNull Builder builder) { this.mUserHandle = Objects.requireNonNull(builder.mUserHandle); this.mConfigureAutoDetectionEnabledCapability = builder.mConfigureAutoDetectionEnabledCapability; this.mSetManualTimeCapability = builder.mSetManualTimeCapability; } @NonNull private static TimeCapabilities createFromParcel(@NonNull Parcel in) { UserHandle userHandle = UserHandle.readFromParcel(in); return new TimeCapabilities.Builder(userHandle) .setConfigureAutoDetectionEnabledCapability(in.readInt()) .setSetManualTimeCapability(in.readInt()) .build(); } @Override public void writeToParcel(@NonNull Parcel dest, int flags) { UserHandle.writeToParcel(mUserHandle, dest); dest.writeInt(mConfigureAutoDetectionEnabledCapability); dest.writeInt(mSetManualTimeCapability); } /** * Returns the capability state associated with the user's ability to modify the automatic time * detection setting. The setting can be updated via {@link * TimeManager#updateTimeConfiguration(TimeConfiguration)}. */ @CapabilityState public int getConfigureAutoDetectionEnabledCapability() { return mConfigureAutoDetectionEnabledCapability; } /** * Returns the capability state associated with the user's ability to manually set time on a * device. The setting can be updated via {@link * TimeManager#updateTimeConfiguration(TimeConfiguration)}. */ @CapabilityState public int getSetManualTimeCapability() { return mSetManualTimeCapability; } /** * Tries to create a new {@link TimeConfiguration} from the {@code config} and the set of * {@code requestedChanges}, if {@code this} capabilities allow. The new configuration is * returned. If the capabilities do not permit one or more of the requested changes then {@code * null} is returned. * * @hide */ @Nullable public TimeConfiguration tryApplyConfigChanges( @NonNull TimeConfiguration config, @NonNull TimeConfiguration requestedChanges) { TimeConfiguration.Builder newConfigBuilder = new TimeConfiguration.Builder(config); if (requestedChanges.hasIsAutoDetectionEnabled()) { if (this.getConfigureAutoDetectionEnabledCapability() < CAPABILITY_NOT_APPLICABLE) { return null; } newConfigBuilder.setAutoDetectionEnabled(requestedChanges.isAutoDetectionEnabled()); } return newConfigBuilder.build(); } @Override public int describeContents() { return 0; } @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; TimeCapabilities that = (TimeCapabilities) o; return mConfigureAutoDetectionEnabledCapability == that.mConfigureAutoDetectionEnabledCapability && mSetManualTimeCapability == that.mSetManualTimeCapability && mUserHandle.equals(that.mUserHandle); } @Override public int hashCode() { return Objects.hash(mUserHandle, mConfigureAutoDetectionEnabledCapability, mSetManualTimeCapability); } @Override public String toString() { return "TimeCapabilities{" + "mUserHandle=" + mUserHandle + ", mConfigureAutoDetectionEnabledCapability=" + mConfigureAutoDetectionEnabledCapability + ", mSetManualTimeCapability=" + mSetManualTimeCapability + '}'; } /** * A builder of {@link TimeCapabilities} objects. * * @hide */ public static class Builder { @NonNull private final UserHandle mUserHandle; private @CapabilityState int mConfigureAutoDetectionEnabledCapability; private @CapabilityState int mSetManualTimeCapability; public Builder(@NonNull UserHandle userHandle) { this.mUserHandle = Objects.requireNonNull(userHandle); } public Builder(@NonNull TimeCapabilities timeCapabilities) { Objects.requireNonNull(timeCapabilities); this.mUserHandle = timeCapabilities.mUserHandle; this.mConfigureAutoDetectionEnabledCapability = timeCapabilities.mConfigureAutoDetectionEnabledCapability; this.mSetManualTimeCapability = timeCapabilities.mSetManualTimeCapability; } /** Sets the value for the "configure automatic time detection" capability. */ public Builder setConfigureAutoDetectionEnabledCapability(@CapabilityState int value) { this.mConfigureAutoDetectionEnabledCapability = value; return this; } /** Sets the value for the "set manual time" capability. */ public Builder setSetManualTimeCapability(@CapabilityState int value) { this.mSetManualTimeCapability = value; return this; } /** Returns the {@link TimeCapabilities}. */ public TimeCapabilities build() { verifyCapabilitySet(mConfigureAutoDetectionEnabledCapability, "configureAutoDetectionEnabledCapability"); verifyCapabilitySet(mSetManualTimeCapability, "mSetManualTimeCapability"); return new TimeCapabilities(this); } private void verifyCapabilitySet(int value, String name) { if (value == 0) { throw new IllegalStateException(name + " was not set"); } } } }