OSDN Git Service

DiskInfo: support CD/DVD type
[android-x86/frameworks-base.git] / core / java / android / os / storage / DiskInfo.java
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
17 package android.os.storage;
18
19 import android.annotation.NonNull;
20 import android.content.res.Resources;
21 import android.os.Parcel;
22 import android.os.Parcelable;
23 import android.text.TextUtils;
24 import android.util.DebugUtils;
25
26 import com.android.internal.util.IndentingPrintWriter;
27 import com.android.internal.util.Preconditions;
28
29 import java.io.CharArrayWriter;
30 import java.util.Objects;
31
32 /**
33  * Information about a physical disk which may contain one or more
34  * {@link VolumeInfo}.
35  *
36  * @hide
37  */
38 public class DiskInfo implements Parcelable {
39     public static final String ACTION_DISK_SCANNED =
40             "android.os.storage.action.DISK_SCANNED";
41     public static final String EXTRA_DISK_ID =
42             "android.os.storage.extra.DISK_ID";
43     public static final String EXTRA_VOLUME_COUNT =
44             "android.os.storage.extra.VOLUME_COUNT";
45
46     public static final int FLAG_ADOPTABLE = 1 << 0;
47     public static final int FLAG_DEFAULT_PRIMARY = 1 << 1;
48     public static final int FLAG_SD = 1 << 2;
49     public static final int FLAG_USB = 1 << 3;
50     public static final int FLAG_CDROM = 1 << 6;
51
52     public final String id;
53     public final int flags;
54     public long size;
55     public String label;
56     /** Hacky; don't rely on this count */
57     public int volumeCount;
58     public String sysPath;
59
60     public DiskInfo(String id, int flags) {
61         this.id = Preconditions.checkNotNull(id);
62         this.flags = flags;
63     }
64
65     public DiskInfo(Parcel parcel) {
66         id = parcel.readString();
67         flags = parcel.readInt();
68         size = parcel.readLong();
69         label = parcel.readString();
70         volumeCount = parcel.readInt();
71         sysPath = parcel.readString();
72     }
73
74     public @NonNull String getId() {
75         return id;
76     }
77
78     private boolean isInteresting(String label) {
79         if (TextUtils.isEmpty(label)) {
80             return false;
81         }
82         if (label.equalsIgnoreCase("ata")) {
83             return false;
84         }
85         if (label.toLowerCase().contains("generic")) {
86             return false;
87         }
88         if (label.toLowerCase().startsWith("usb")) {
89             return false;
90         }
91         if (label.toLowerCase().startsWith("multiple")) {
92             return false;
93         }
94         return true;
95     }
96
97     public String getDescription() {
98         final Resources res = Resources.getSystem();
99         if ((flags & FLAG_SD) != 0) {
100             if (isInteresting(label)) {
101                 return res.getString(com.android.internal.R.string.storage_sd_card_label, label);
102             } else {
103                 return res.getString(com.android.internal.R.string.storage_sd_card);
104             }
105         } else if ((flags & FLAG_USB) != 0) {
106             if (isInteresting(label)) {
107                 return res.getString(com.android.internal.R.string.storage_usb_drive_label, label);
108             } else {
109                 return res.getString(com.android.internal.R.string.storage_usb_drive);
110             }
111         } else if ((flags & FLAG_CDROM) != 0) {
112             if (isInteresting(label)) {
113                 return res.getString(com.android.internal.R.string.storage_cdrom_label, label);
114             } else {
115                 return res.getString(com.android.internal.R.string.storage_cdrom);
116             }
117         } else {
118             return null;
119         }
120     }
121
122     public boolean isAdoptable() {
123         return (flags & FLAG_ADOPTABLE) != 0;
124     }
125
126     public boolean isDefaultPrimary() {
127         return (flags & FLAG_DEFAULT_PRIMARY) != 0;
128     }
129
130     public boolean isSd() {
131         return (flags & FLAG_SD) != 0;
132     }
133
134     public boolean isUsb() {
135         return (flags & FLAG_USB) != 0;
136     }
137
138     @Override
139     public String toString() {
140         final CharArrayWriter writer = new CharArrayWriter();
141         dump(new IndentingPrintWriter(writer, "    ", 80));
142         return writer.toString();
143     }
144
145     public void dump(IndentingPrintWriter pw) {
146         pw.println("DiskInfo{" + id + "}:");
147         pw.increaseIndent();
148         pw.printPair("flags", DebugUtils.flagsToString(getClass(), "FLAG_", flags));
149         pw.printPair("size", size);
150         pw.printPair("label", label);
151         pw.println();
152         pw.printPair("sysPath", sysPath);
153         pw.decreaseIndent();
154         pw.println();
155     }
156
157     @Override
158     public DiskInfo clone() {
159         final Parcel temp = Parcel.obtain();
160         try {
161             writeToParcel(temp, 0);
162             temp.setDataPosition(0);
163             return CREATOR.createFromParcel(temp);
164         } finally {
165             temp.recycle();
166         }
167     }
168
169     @Override
170     public boolean equals(Object o) {
171         if (o instanceof DiskInfo) {
172             return Objects.equals(id, ((DiskInfo) o).id);
173         } else {
174             return false;
175         }
176     }
177
178     @Override
179     public int hashCode() {
180         return id.hashCode();
181     }
182
183     public static final Creator<DiskInfo> CREATOR = new Creator<DiskInfo>() {
184         @Override
185         public DiskInfo createFromParcel(Parcel in) {
186             return new DiskInfo(in);
187         }
188
189         @Override
190         public DiskInfo[] newArray(int size) {
191             return new DiskInfo[size];
192         }
193     };
194
195     @Override
196     public int describeContents() {
197         return 0;
198     }
199
200     @Override
201     public void writeToParcel(Parcel parcel, int flags) {
202         parcel.writeString(id);
203         parcel.writeInt(this.flags);
204         parcel.writeLong(size);
205         parcel.writeString(label);
206         parcel.writeInt(volumeCount);
207         parcel.writeString(sysPath);
208     }
209 }