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