1/*
2 * Copyright (C) 2015 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package android.os.storage;
18
19import android.os.Parcel;
20import android.os.Parcelable;
21import android.util.DebugUtils;
22import android.util.TimeUtils;
23
24import com.android.internal.util.IndentingPrintWriter;
25import com.android.internal.util.Preconditions;
26
27import java.util.Objects;
28
29/**
30 * Metadata for a storage volume which may not be currently present.
31 *
32 * @hide
33 */
34public class VolumeRecord implements Parcelable {
35    public static final String EXTRA_FS_UUID =
36            "android.os.storage.extra.FS_UUID";
37
38    public static final int USER_FLAG_INITED = 1 << 0;
39    public static final int USER_FLAG_SNOOZED = 1 << 1;
40
41    public final int type;
42    public final String fsUuid;
43    public String partGuid;
44    public String nickname;
45    public int userFlags;
46    public long createdMillis;
47    public long lastTrimMillis;
48    public long lastBenchMillis;
49
50    public VolumeRecord(int type, String fsUuid) {
51        this.type = type;
52        this.fsUuid = Preconditions.checkNotNull(fsUuid);
53    }
54
55    public VolumeRecord(Parcel parcel) {
56        type = parcel.readInt();
57        fsUuid = parcel.readString();
58        partGuid = parcel.readString();
59        nickname = parcel.readString();
60        userFlags = parcel.readInt();
61        createdMillis = parcel.readLong();
62        lastTrimMillis = parcel.readLong();
63        lastBenchMillis = parcel.readLong();
64    }
65
66    public int getType() {
67        return type;
68    }
69
70    public String getFsUuid() {
71        return fsUuid;
72    }
73
74    public String getNickname() {
75        return nickname;
76    }
77
78    public boolean isInited() {
79        return (userFlags & USER_FLAG_INITED) != 0;
80    }
81
82    public boolean isSnoozed() {
83        return (userFlags & USER_FLAG_SNOOZED) != 0;
84    }
85
86    public void dump(IndentingPrintWriter pw) {
87        pw.println("VolumeRecord:");
88        pw.increaseIndent();
89        pw.printPair("type", DebugUtils.valueToString(VolumeInfo.class, "TYPE_", type));
90        pw.printPair("fsUuid", fsUuid);
91        pw.printPair("partGuid", partGuid);
92        pw.println();
93        pw.printPair("nickname", nickname);
94        pw.printPair("userFlags",
95                DebugUtils.flagsToString(VolumeRecord.class, "USER_FLAG_", userFlags));
96        pw.println();
97        pw.printPair("createdMillis", TimeUtils.formatForLogging(createdMillis));
98        pw.printPair("lastTrimMillis", TimeUtils.formatForLogging(lastTrimMillis));
99        pw.printPair("lastBenchMillis", TimeUtils.formatForLogging(lastBenchMillis));
100        pw.decreaseIndent();
101        pw.println();
102    }
103
104    @Override
105    public VolumeRecord clone() {
106        final Parcel temp = Parcel.obtain();
107        try {
108            writeToParcel(temp, 0);
109            temp.setDataPosition(0);
110            return CREATOR.createFromParcel(temp);
111        } finally {
112            temp.recycle();
113        }
114    }
115
116    @Override
117    public boolean equals(Object o) {
118        if (o instanceof VolumeRecord) {
119            return Objects.equals(fsUuid, ((VolumeRecord) o).fsUuid);
120        } else {
121            return false;
122        }
123    }
124
125    @Override
126    public int hashCode() {
127        return fsUuid.hashCode();
128    }
129
130    public static final Creator<VolumeRecord> CREATOR = new Creator<VolumeRecord>() {
131        @Override
132        public VolumeRecord createFromParcel(Parcel in) {
133            return new VolumeRecord(in);
134        }
135
136        @Override
137        public VolumeRecord[] newArray(int size) {
138            return new VolumeRecord[size];
139        }
140    };
141
142    @Override
143    public int describeContents() {
144        return 0;
145    }
146
147    @Override
148    public void writeToParcel(Parcel parcel, int flags) {
149        parcel.writeInt(type);
150        parcel.writeString(fsUuid);
151        parcel.writeString(partGuid);
152        parcel.writeString(nickname);
153        parcel.writeInt(userFlags);
154        parcel.writeLong(createdMillis);
155        parcel.writeLong(lastTrimMillis);
156        parcel.writeLong(lastBenchMillis);
157    }
158}
159