blob: fff36c4a70962f6889205483e5aff9c242616726 [file] [log] [blame]
/*
* 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 android.annotation.NonNull;
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.
*
* <p>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
*/
public final class TimeCapabilities implements Parcelable {
public static final @NonNull Creator<TimeCapabilities> CREATOR =
new Creator<TimeCapabilities>() {
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 mConfigureAutoTimeDetectionEnabledCapability;
private final @CapabilityState int mSuggestTimeManuallyCapability;
private TimeCapabilities(@NonNull Builder builder) {
this.mUserHandle = Objects.requireNonNull(builder.mUserHandle);
this.mConfigureAutoTimeDetectionEnabledCapability =
builder.mConfigureAutoDetectionEnabledCapability;
this.mSuggestTimeManuallyCapability =
builder.mSuggestTimeManuallyCapability;
}
@NonNull
private static TimeCapabilities createFromParcel(Parcel in) {
UserHandle userHandle = UserHandle.readFromParcel(in);
return new TimeCapabilities.Builder(userHandle)
.setConfigureAutoTimeDetectionEnabledCapability(in.readInt())
.setSuggestTimeManuallyCapability(in.readInt())
.build();
}
@Override
public void writeToParcel(@NonNull Parcel dest, int flags) {
UserHandle.writeToParcel(mUserHandle, dest);
dest.writeInt(mConfigureAutoTimeDetectionEnabledCapability);
dest.writeInt(mSuggestTimeManuallyCapability);
}
/**
* Returns the capability state associated with the user's ability to modify the automatic time
* detection setting.
*/
@CapabilityState
public int getConfigureAutoTimeDetectionEnabledCapability() {
return mConfigureAutoTimeDetectionEnabledCapability;
}
/**
* Returns the capability state associated with the user's ability to manually set time on a
* device.
*/
@CapabilityState
public int getSuggestTimeManuallyCapability() {
return mSuggestTimeManuallyCapability;
}
@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 mConfigureAutoTimeDetectionEnabledCapability
== that.mConfigureAutoTimeDetectionEnabledCapability
&& mSuggestTimeManuallyCapability == that.mSuggestTimeManuallyCapability
&& mUserHandle.equals(that.mUserHandle);
}
@Override
public int hashCode() {
return Objects.hash(mUserHandle, mConfigureAutoTimeDetectionEnabledCapability,
mSuggestTimeManuallyCapability);
}
@Override
public String toString() {
return "TimeCapabilities{"
+ "mUserHandle=" + mUserHandle
+ ", mConfigureAutoTimeDetectionEnabledCapability="
+ mConfigureAutoTimeDetectionEnabledCapability
+ ", mSuggestTimeManuallyCapability=" + mSuggestTimeManuallyCapability
+ '}';
}
/**
* A builder of {@link TimeCapabilities} objects.
*
* @hide
*/
public static class Builder {
@NonNull private final UserHandle mUserHandle;
private @CapabilityState int mConfigureAutoDetectionEnabledCapability;
private @CapabilityState int mSuggestTimeManuallyCapability;
public Builder(@NonNull TimeCapabilities timeCapabilities) {
Objects.requireNonNull(timeCapabilities);
this.mUserHandle = timeCapabilities.mUserHandle;
this.mConfigureAutoDetectionEnabledCapability =
timeCapabilities.mConfigureAutoTimeDetectionEnabledCapability;
this.mSuggestTimeManuallyCapability =
timeCapabilities.mSuggestTimeManuallyCapability;
}
public Builder(@NonNull UserHandle userHandle) {
this.mUserHandle = Objects.requireNonNull(userHandle);
}
/** Sets the state for automatic time detection config. */
public Builder setConfigureAutoTimeDetectionEnabledCapability(
@CapabilityState int setConfigureAutoTimeDetectionEnabledCapability) {
this.mConfigureAutoDetectionEnabledCapability =
setConfigureAutoTimeDetectionEnabledCapability;
return this;
}
/** Sets the state for manual time change. */
public Builder setSuggestTimeManuallyCapability(
@CapabilityState int suggestTimeManuallyCapability) {
this.mSuggestTimeManuallyCapability = suggestTimeManuallyCapability;
return this;
}
/** Returns the {@link TimeCapabilities}. */
public TimeCapabilities build() {
verifyCapabilitySet(mConfigureAutoDetectionEnabledCapability,
"configureAutoDetectionEnabledCapability");
verifyCapabilitySet(mSuggestTimeManuallyCapability, "suggestTimeManuallyCapability");
return new TimeCapabilities(this);
}
private void verifyCapabilitySet(int value, String name) {
if (value == 0) {
throw new IllegalStateException(name + " was not set");
}
}
}
}