313 lines
11 KiB
Java
313 lines
11 KiB
Java
![]() |
/*
|
||
|
* Copyright (C) 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 android.safetycenter;
|
||
|
|
||
|
import static android.os.Build.VERSION_CODES.TIRAMISU;
|
||
|
|
||
|
import static java.util.Collections.unmodifiableList;
|
||
|
import static java.util.Objects.requireNonNull;
|
||
|
|
||
|
import android.annotation.NonNull;
|
||
|
import android.annotation.Nullable;
|
||
|
import android.annotation.SystemApi;
|
||
|
import android.os.Parcel;
|
||
|
import android.os.Parcelable;
|
||
|
import android.safetycenter.config.SafetySourcesGroup;
|
||
|
import android.text.TextUtils;
|
||
|
|
||
|
import androidx.annotation.RequiresApi;
|
||
|
|
||
|
import java.util.ArrayList;
|
||
|
import java.util.List;
|
||
|
import java.util.Objects;
|
||
|
|
||
|
/**
|
||
|
* A group of conceptually related Safety Center entries.
|
||
|
*
|
||
|
* @hide
|
||
|
*/
|
||
|
@SystemApi
|
||
|
@RequiresApi(TIRAMISU)
|
||
|
public final class SafetyCenterEntryGroup implements Parcelable {
|
||
|
|
||
|
@NonNull
|
||
|
public static final Creator<SafetyCenterEntryGroup> CREATOR =
|
||
|
new Creator<SafetyCenterEntryGroup>() {
|
||
|
@Override
|
||
|
public SafetyCenterEntryGroup createFromParcel(Parcel in) {
|
||
|
String id = in.readString();
|
||
|
CharSequence title = TextUtils.CHAR_SEQUENCE_CREATOR.createFromParcel(in);
|
||
|
return new Builder(id, title)
|
||
|
.setSummary(TextUtils.CHAR_SEQUENCE_CREATOR.createFromParcel(in))
|
||
|
.setSeverityLevel(in.readInt())
|
||
|
.setSeverityUnspecifiedIconType(in.readInt())
|
||
|
.setEntries(in.createTypedArrayList(SafetyCenterEntry.CREATOR))
|
||
|
.build();
|
||
|
}
|
||
|
|
||
|
@Override
|
||
|
public SafetyCenterEntryGroup[] newArray(int size) {
|
||
|
return new SafetyCenterEntryGroup[size];
|
||
|
}
|
||
|
};
|
||
|
|
||
|
@NonNull private final String mId;
|
||
|
@NonNull private final CharSequence mTitle;
|
||
|
@Nullable private final CharSequence mSummary;
|
||
|
@SafetyCenterEntry.EntrySeverityLevel private final int mSeverityLevel;
|
||
|
@SafetyCenterEntry.SeverityUnspecifiedIconType private final int mSeverityUnspecifiedIconType;
|
||
|
@NonNull private final List<SafetyCenterEntry> mEntries;
|
||
|
|
||
|
private SafetyCenterEntryGroup(
|
||
|
@NonNull String id,
|
||
|
@NonNull CharSequence title,
|
||
|
@Nullable CharSequence summary,
|
||
|
@SafetyCenterEntry.EntrySeverityLevel int severityLevel,
|
||
|
@SafetyCenterEntry.SeverityUnspecifiedIconType int severityUnspecifiedIconType,
|
||
|
@NonNull List<SafetyCenterEntry> entries) {
|
||
|
mId = id;
|
||
|
mTitle = title;
|
||
|
mSummary = summary;
|
||
|
mSeverityLevel = severityLevel;
|
||
|
mSeverityUnspecifiedIconType = severityUnspecifiedIconType;
|
||
|
mEntries = entries;
|
||
|
}
|
||
|
|
||
|
/** Returns the ID of the {@link SafetySourcesGroup} that this group corresponds to. */
|
||
|
@NonNull
|
||
|
public String getId() {
|
||
|
return mId;
|
||
|
}
|
||
|
|
||
|
/** Returns the title of this entry group. */
|
||
|
@NonNull
|
||
|
public CharSequence getTitle() {
|
||
|
return mTitle;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Returns the summary string describing this entry group if present, or {@code null} otherwise.
|
||
|
*/
|
||
|
@Nullable
|
||
|
public CharSequence getSummary() {
|
||
|
return mSummary;
|
||
|
}
|
||
|
|
||
|
/** Returns the combined severity level of the entries in this entry group. */
|
||
|
@SafetyCenterEntry.EntrySeverityLevel
|
||
|
public int getSeverityLevel() {
|
||
|
return mSeverityLevel;
|
||
|
}
|
||
|
|
||
|
/** Returns the {@link SafetyCenterEntry.SeverityUnspecifiedIconType} for this entry group. */
|
||
|
@SafetyCenterEntry.SeverityUnspecifiedIconType
|
||
|
public int getSeverityUnspecifiedIconType() {
|
||
|
return mSeverityUnspecifiedIconType;
|
||
|
}
|
||
|
|
||
|
/** Returns the entries that comprise this entry group. */
|
||
|
@NonNull
|
||
|
public List<SafetyCenterEntry> getEntries() {
|
||
|
return mEntries;
|
||
|
}
|
||
|
|
||
|
@Override
|
||
|
public boolean equals(Object o) {
|
||
|
if (this == o) return true;
|
||
|
if (!(o instanceof SafetyCenterEntryGroup)) return false;
|
||
|
SafetyCenterEntryGroup that = (SafetyCenterEntryGroup) o;
|
||
|
return mSeverityLevel == that.mSeverityLevel
|
||
|
&& mSeverityUnspecifiedIconType == that.mSeverityUnspecifiedIconType
|
||
|
&& Objects.equals(mId, that.mId)
|
||
|
&& TextUtils.equals(mTitle, that.mTitle)
|
||
|
&& TextUtils.equals(mSummary, that.mSummary)
|
||
|
&& Objects.equals(mEntries, that.mEntries);
|
||
|
}
|
||
|
|
||
|
@Override
|
||
|
public int hashCode() {
|
||
|
return Objects.hash(
|
||
|
mId, mTitle, mSummary, mSeverityLevel, mSeverityUnspecifiedIconType, mEntries);
|
||
|
}
|
||
|
|
||
|
@Override
|
||
|
public String toString() {
|
||
|
return "SafetyCenterEntryGroup{"
|
||
|
+ "mId="
|
||
|
+ mId
|
||
|
+ ", mTitle="
|
||
|
+ mTitle
|
||
|
+ ", mSummary="
|
||
|
+ mSummary
|
||
|
+ ", mSeverityLevel="
|
||
|
+ mSeverityLevel
|
||
|
+ ", mSeverityUnspecifiedIconType="
|
||
|
+ mSeverityUnspecifiedIconType
|
||
|
+ ", mEntries="
|
||
|
+ mEntries
|
||
|
+ '}';
|
||
|
}
|
||
|
|
||
|
@Override
|
||
|
public int describeContents() {
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
@Override
|
||
|
public void writeToParcel(@NonNull Parcel dest, int flags) {
|
||
|
dest.writeString(mId);
|
||
|
TextUtils.writeToParcel(mTitle, dest, flags);
|
||
|
TextUtils.writeToParcel(mSummary, dest, flags);
|
||
|
dest.writeInt(mSeverityLevel);
|
||
|
dest.writeInt(mSeverityUnspecifiedIconType);
|
||
|
dest.writeTypedList(mEntries);
|
||
|
}
|
||
|
|
||
|
/** Builder class for {@link SafetyCenterEntryGroup} */
|
||
|
public static final class Builder {
|
||
|
|
||
|
@NonNull private String mId;
|
||
|
@NonNull private CharSequence mTitle;
|
||
|
@Nullable private CharSequence mSummary;
|
||
|
|
||
|
@SafetyCenterEntry.EntrySeverityLevel
|
||
|
private int mSeverityLevel = SafetyCenterEntry.ENTRY_SEVERITY_LEVEL_UNKNOWN;
|
||
|
|
||
|
@SafetyCenterEntry.SeverityUnspecifiedIconType
|
||
|
private int mSeverityUnspecifiedIconType =
|
||
|
SafetyCenterEntry.SEVERITY_UNSPECIFIED_ICON_TYPE_NO_ICON;
|
||
|
|
||
|
@NonNull private List<SafetyCenterEntry> mEntries = new ArrayList<>();
|
||
|
|
||
|
/**
|
||
|
* Creates a {@link Builder} for a {@link SafetyCenterEntryGroup}.
|
||
|
*
|
||
|
* @param id a unique encoded string ID, see {@link #getId} for details
|
||
|
* @param title a title for this group of entries
|
||
|
*/
|
||
|
public Builder(@NonNull String id, @NonNull CharSequence title) {
|
||
|
mId = requireNonNull(id);
|
||
|
mTitle = requireNonNull(title);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Creates a {@link Builder} with the values from the given {@link SafetyCenterEntryGroup}.
|
||
|
*/
|
||
|
public Builder(@NonNull SafetyCenterEntryGroup safetyCenterEntryGroup) {
|
||
|
mId = safetyCenterEntryGroup.mId;
|
||
|
mTitle = safetyCenterEntryGroup.mTitle;
|
||
|
mSummary = safetyCenterEntryGroup.mSummary;
|
||
|
mSeverityLevel = safetyCenterEntryGroup.mSeverityLevel;
|
||
|
mSeverityUnspecifiedIconType = safetyCenterEntryGroup.mSeverityUnspecifiedIconType;
|
||
|
mEntries = new ArrayList<>(safetyCenterEntryGroup.mEntries);
|
||
|
}
|
||
|
|
||
|
/** Sets the ID for this entry group. */
|
||
|
@NonNull
|
||
|
public Builder setId(@NonNull String id) {
|
||
|
mId = requireNonNull(id);
|
||
|
return this;
|
||
|
}
|
||
|
|
||
|
/** Sets the title for this entry group. */
|
||
|
@NonNull
|
||
|
public Builder setTitle(@NonNull CharSequence title) {
|
||
|
mTitle = requireNonNull(title);
|
||
|
return this;
|
||
|
}
|
||
|
|
||
|
/** Sets the optional summary text for this entry group. */
|
||
|
@NonNull
|
||
|
public Builder setSummary(@Nullable CharSequence summary) {
|
||
|
mSummary = summary;
|
||
|
return this;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Sets the {@link SafetyCenterEntry.EntrySeverityLevel} of this entry group. Defaults to
|
||
|
* {@link SafetyCenterEntry#ENTRY_SEVERITY_LEVEL_UNKNOWN}.
|
||
|
*/
|
||
|
@NonNull
|
||
|
public Builder setSeverityLevel(@SafetyCenterEntry.EntrySeverityLevel int severityLevel) {
|
||
|
mSeverityLevel = validateEntrySeverityLevel(severityLevel);
|
||
|
return this;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Sets the {@link SafetyCenterEntry.SeverityUnspecifiedIconType} of this entry group.
|
||
|
* Defaults to {@link SafetyCenterEntry#SEVERITY_UNSPECIFIED_ICON_TYPE_NO_ICON}.
|
||
|
*/
|
||
|
@NonNull
|
||
|
public Builder setSeverityUnspecifiedIconType(
|
||
|
@SafetyCenterEntry.SeverityUnspecifiedIconType int severityUnspecifiedIconType) {
|
||
|
mSeverityUnspecifiedIconType =
|
||
|
validateSeverityUnspecifiedIconType(severityUnspecifiedIconType);
|
||
|
return this;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Sets the list of {@link SafetyCenterEntry} contained by this entry group. Defaults to an
|
||
|
* empty list.
|
||
|
*/
|
||
|
@NonNull
|
||
|
public Builder setEntries(@NonNull List<SafetyCenterEntry> entries) {
|
||
|
mEntries = requireNonNull(entries);
|
||
|
return this;
|
||
|
}
|
||
|
|
||
|
/** Creates the {@link SafetyCenterEntryGroup} defined by this {@link Builder}. */
|
||
|
@NonNull
|
||
|
public SafetyCenterEntryGroup build() {
|
||
|
return new SafetyCenterEntryGroup(
|
||
|
mId,
|
||
|
mTitle,
|
||
|
mSummary,
|
||
|
mSeverityLevel,
|
||
|
mSeverityUnspecifiedIconType,
|
||
|
unmodifiableList(new ArrayList<>(mEntries)));
|
||
|
}
|
||
|
}
|
||
|
|
||
|
@SafetyCenterEntry.EntrySeverityLevel
|
||
|
private static int validateEntrySeverityLevel(int value) {
|
||
|
switch (value) {
|
||
|
case SafetyCenterEntry.ENTRY_SEVERITY_LEVEL_UNKNOWN:
|
||
|
case SafetyCenterEntry.ENTRY_SEVERITY_LEVEL_UNSPECIFIED:
|
||
|
case SafetyCenterEntry.ENTRY_SEVERITY_LEVEL_OK:
|
||
|
case SafetyCenterEntry.ENTRY_SEVERITY_LEVEL_RECOMMENDATION:
|
||
|
case SafetyCenterEntry.ENTRY_SEVERITY_LEVEL_CRITICAL_WARNING:
|
||
|
return value;
|
||
|
default:
|
||
|
}
|
||
|
throw new IllegalArgumentException(
|
||
|
"Unexpected EntrySeverityLevel for SafetyCenterEntryGroup: " + value);
|
||
|
}
|
||
|
|
||
|
@SafetyCenterEntry.SeverityUnspecifiedIconType
|
||
|
private static int validateSeverityUnspecifiedIconType(int value) {
|
||
|
switch (value) {
|
||
|
case SafetyCenterEntry.SEVERITY_UNSPECIFIED_ICON_TYPE_NO_ICON:
|
||
|
case SafetyCenterEntry.SEVERITY_UNSPECIFIED_ICON_TYPE_PRIVACY:
|
||
|
case SafetyCenterEntry.SEVERITY_UNSPECIFIED_ICON_TYPE_NO_RECOMMENDATION:
|
||
|
return value;
|
||
|
default:
|
||
|
}
|
||
|
throw new IllegalArgumentException(
|
||
|
"Unexpected SeverityUnspecifiedIconType for SafetyCenterEntryGroup: " + value);
|
||
|
}
|
||
|
}
|