11b8ef7e3165ff9aa52a4905dafc8d0f83e7403f9Jeff Sharkey/* 21b8ef7e3165ff9aa52a4905dafc8d0f83e7403f9Jeff Sharkey * Copyright (C) 2015 The Android Open Source Project 31b8ef7e3165ff9aa52a4905dafc8d0f83e7403f9Jeff Sharkey * 41b8ef7e3165ff9aa52a4905dafc8d0f83e7403f9Jeff Sharkey * Licensed under the Apache License, Version 2.0 (the "License"); 51b8ef7e3165ff9aa52a4905dafc8d0f83e7403f9Jeff Sharkey * you may not use this file except in compliance with the License. 61b8ef7e3165ff9aa52a4905dafc8d0f83e7403f9Jeff Sharkey * You may obtain a copy of the License at 71b8ef7e3165ff9aa52a4905dafc8d0f83e7403f9Jeff Sharkey * 81b8ef7e3165ff9aa52a4905dafc8d0f83e7403f9Jeff Sharkey * http://www.apache.org/licenses/LICENSE-2.0 91b8ef7e3165ff9aa52a4905dafc8d0f83e7403f9Jeff Sharkey * 101b8ef7e3165ff9aa52a4905dafc8d0f83e7403f9Jeff Sharkey * Unless required by applicable law or agreed to in writing, software 111b8ef7e3165ff9aa52a4905dafc8d0f83e7403f9Jeff Sharkey * distributed under the License is distributed on an "AS IS" BASIS, 121b8ef7e3165ff9aa52a4905dafc8d0f83e7403f9Jeff Sharkey * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 131b8ef7e3165ff9aa52a4905dafc8d0f83e7403f9Jeff Sharkey * See the License for the specific language governing permissions and 141b8ef7e3165ff9aa52a4905dafc8d0f83e7403f9Jeff Sharkey * limitations under the License. 151b8ef7e3165ff9aa52a4905dafc8d0f83e7403f9Jeff Sharkey */ 161b8ef7e3165ff9aa52a4905dafc8d0f83e7403f9Jeff Sharkey 171b8ef7e3165ff9aa52a4905dafc8d0f83e7403f9Jeff Sharkeypackage android.os.storage; 181b8ef7e3165ff9aa52a4905dafc8d0f83e7403f9Jeff Sharkey 19d95d3bfb2b28a4f21f3fdcd740160c9a61eb0363Jeff Sharkeyimport android.annotation.NonNull; 2059d577a518333f4b4514315b6d10e8dba160abcdJeff Sharkeyimport android.content.res.Resources; 211b8ef7e3165ff9aa52a4905dafc8d0f83e7403f9Jeff Sharkeyimport android.os.Parcel; 221b8ef7e3165ff9aa52a4905dafc8d0f83e7403f9Jeff Sharkeyimport android.os.Parcelable; 237e92ef3a1146102806fa0543ef12e09231c55639Jeff Sharkeyimport android.text.TextUtils; 241b8ef7e3165ff9aa52a4905dafc8d0f83e7403f9Jeff Sharkeyimport android.util.DebugUtils; 251b8ef7e3165ff9aa52a4905dafc8d0f83e7403f9Jeff Sharkey 261b8ef7e3165ff9aa52a4905dafc8d0f83e7403f9Jeff Sharkeyimport com.android.internal.util.IndentingPrintWriter; 271b8ef7e3165ff9aa52a4905dafc8d0f83e7403f9Jeff Sharkeyimport com.android.internal.util.Preconditions; 281b8ef7e3165ff9aa52a4905dafc8d0f83e7403f9Jeff Sharkey 297151a9a887051542c6da9f380376f3b306184e5cJeff Sharkeyimport java.io.CharArrayWriter; 30e2d45be4dae116307f8edd85eaa61134221cb8f9Jeff Sharkeyimport java.util.Objects; 317151a9a887051542c6da9f380376f3b306184e5cJeff Sharkey 321b8ef7e3165ff9aa52a4905dafc8d0f83e7403f9Jeff Sharkey/** 331b8ef7e3165ff9aa52a4905dafc8d0f83e7403f9Jeff Sharkey * Information about a physical disk which may contain one or more 341b8ef7e3165ff9aa52a4905dafc8d0f83e7403f9Jeff Sharkey * {@link VolumeInfo}. 351b8ef7e3165ff9aa52a4905dafc8d0f83e7403f9Jeff Sharkey * 361b8ef7e3165ff9aa52a4905dafc8d0f83e7403f9Jeff Sharkey * @hide 371b8ef7e3165ff9aa52a4905dafc8d0f83e7403f9Jeff Sharkey */ 381b8ef7e3165ff9aa52a4905dafc8d0f83e7403f9Jeff Sharkeypublic class DiskInfo implements Parcelable { 39620b32b316fd4f1bab4eef55ec8802d14a55e7ddJeff Sharkey public static final String ACTION_DISK_SCANNED = 40620b32b316fd4f1bab4eef55ec8802d14a55e7ddJeff Sharkey "android.os.storage.action.DISK_SCANNED"; 41620b32b316fd4f1bab4eef55ec8802d14a55e7ddJeff Sharkey public static final String EXTRA_DISK_ID = 42620b32b316fd4f1bab4eef55ec8802d14a55e7ddJeff Sharkey "android.os.storage.extra.DISK_ID"; 43c7acac6798e12780194af33d5a9fdf382ab17155Jeff Sharkey public static final String EXTRA_VOLUME_COUNT = 44c7acac6798e12780194af33d5a9fdf382ab17155Jeff Sharkey "android.os.storage.extra.VOLUME_COUNT"; 4556bd3129138b525b0f2eba52bd4fa140f23e792cJeff Sharkey 461b8ef7e3165ff9aa52a4905dafc8d0f83e7403f9Jeff Sharkey public static final int FLAG_ADOPTABLE = 1 << 0; 471b8ef7e3165ff9aa52a4905dafc8d0f83e7403f9Jeff Sharkey public static final int FLAG_DEFAULT_PRIMARY = 1 << 1; 481b8ef7e3165ff9aa52a4905dafc8d0f83e7403f9Jeff Sharkey public static final int FLAG_SD = 1 << 2; 491b8ef7e3165ff9aa52a4905dafc8d0f83e7403f9Jeff Sharkey public static final int FLAG_USB = 1 << 3; 501b8ef7e3165ff9aa52a4905dafc8d0f83e7403f9Jeff Sharkey 511b8ef7e3165ff9aa52a4905dafc8d0f83e7403f9Jeff Sharkey public final String id; 521b8ef7e3165ff9aa52a4905dafc8d0f83e7403f9Jeff Sharkey public final int flags; 531b8ef7e3165ff9aa52a4905dafc8d0f83e7403f9Jeff Sharkey public long size; 541b8ef7e3165ff9aa52a4905dafc8d0f83e7403f9Jeff Sharkey public String label; 55f5a6bd7538a6800c2a43ace5ad67d65b1f8f697aJeff Sharkey /** Hacky; don't rely on this count */ 56f5a6bd7538a6800c2a43ace5ad67d65b1f8f697aJeff Sharkey public int volumeCount; 57e8a4b66960056c2dc2c8dbb5f8df00710645cc64Jeff Sharkey public String sysPath; 581b8ef7e3165ff9aa52a4905dafc8d0f83e7403f9Jeff Sharkey 591b8ef7e3165ff9aa52a4905dafc8d0f83e7403f9Jeff Sharkey public DiskInfo(String id, int flags) { 601b8ef7e3165ff9aa52a4905dafc8d0f83e7403f9Jeff Sharkey this.id = Preconditions.checkNotNull(id); 611b8ef7e3165ff9aa52a4905dafc8d0f83e7403f9Jeff Sharkey this.flags = flags; 621b8ef7e3165ff9aa52a4905dafc8d0f83e7403f9Jeff Sharkey } 631b8ef7e3165ff9aa52a4905dafc8d0f83e7403f9Jeff Sharkey 641b8ef7e3165ff9aa52a4905dafc8d0f83e7403f9Jeff Sharkey public DiskInfo(Parcel parcel) { 651b8ef7e3165ff9aa52a4905dafc8d0f83e7403f9Jeff Sharkey id = parcel.readString(); 661b8ef7e3165ff9aa52a4905dafc8d0f83e7403f9Jeff Sharkey flags = parcel.readInt(); 671b8ef7e3165ff9aa52a4905dafc8d0f83e7403f9Jeff Sharkey size = parcel.readLong(); 681b8ef7e3165ff9aa52a4905dafc8d0f83e7403f9Jeff Sharkey label = parcel.readString(); 69f5a6bd7538a6800c2a43ace5ad67d65b1f8f697aJeff Sharkey volumeCount = parcel.readInt(); 70e8a4b66960056c2dc2c8dbb5f8df00710645cc64Jeff Sharkey sysPath = parcel.readString(); 711b8ef7e3165ff9aa52a4905dafc8d0f83e7403f9Jeff Sharkey } 721b8ef7e3165ff9aa52a4905dafc8d0f83e7403f9Jeff Sharkey 73d95d3bfb2b28a4f21f3fdcd740160c9a61eb0363Jeff Sharkey public @NonNull String getId() { 74d95d3bfb2b28a4f21f3fdcd740160c9a61eb0363Jeff Sharkey return id; 75d95d3bfb2b28a4f21f3fdcd740160c9a61eb0363Jeff Sharkey } 76d95d3bfb2b28a4f21f3fdcd740160c9a61eb0363Jeff Sharkey 77e6c04f9417cc4bff0f5f9e72f0d6d66d2aab6e80Jeff Sharkey private boolean isInteresting(String label) { 78e6c04f9417cc4bff0f5f9e72f0d6d66d2aab6e80Jeff Sharkey if (TextUtils.isEmpty(label)) { 79e6c04f9417cc4bff0f5f9e72f0d6d66d2aab6e80Jeff Sharkey return false; 80e6c04f9417cc4bff0f5f9e72f0d6d66d2aab6e80Jeff Sharkey } 8174acbbb2cd367c6e78db7de5118ff9dd56da61d0Jeff Sharkey if (label.equalsIgnoreCase("ata")) { 8274acbbb2cd367c6e78db7de5118ff9dd56da61d0Jeff Sharkey return false; 8374acbbb2cd367c6e78db7de5118ff9dd56da61d0Jeff Sharkey } 84e6c04f9417cc4bff0f5f9e72f0d6d66d2aab6e80Jeff Sharkey if (label.toLowerCase().contains("generic")) { 85e6c04f9417cc4bff0f5f9e72f0d6d66d2aab6e80Jeff Sharkey return false; 86e6c04f9417cc4bff0f5f9e72f0d6d66d2aab6e80Jeff Sharkey } 8747b872d9c36347382dd24ad5c3f70490d8fcbb23Jeff Sharkey if (label.toLowerCase().startsWith("usb")) { 8847b872d9c36347382dd24ad5c3f70490d8fcbb23Jeff Sharkey return false; 8947b872d9c36347382dd24ad5c3f70490d8fcbb23Jeff Sharkey } 9047b872d9c36347382dd24ad5c3f70490d8fcbb23Jeff Sharkey if (label.toLowerCase().startsWith("multiple")) { 9147b872d9c36347382dd24ad5c3f70490d8fcbb23Jeff Sharkey return false; 9247b872d9c36347382dd24ad5c3f70490d8fcbb23Jeff Sharkey } 93e6c04f9417cc4bff0f5f9e72f0d6d66d2aab6e80Jeff Sharkey return true; 94e6c04f9417cc4bff0f5f9e72f0d6d66d2aab6e80Jeff Sharkey } 95e6c04f9417cc4bff0f5f9e72f0d6d66d2aab6e80Jeff Sharkey 9659d577a518333f4b4514315b6d10e8dba160abcdJeff Sharkey public String getDescription() { 977e92ef3a1146102806fa0543ef12e09231c55639Jeff Sharkey final Resources res = Resources.getSystem(); 981b8ef7e3165ff9aa52a4905dafc8d0f83e7403f9Jeff Sharkey if ((flags & FLAG_SD) != 0) { 99e6c04f9417cc4bff0f5f9e72f0d6d66d2aab6e80Jeff Sharkey if (isInteresting(label)) { 1007e92ef3a1146102806fa0543ef12e09231c55639Jeff Sharkey return res.getString(com.android.internal.R.string.storage_sd_card_label, label); 101e6c04f9417cc4bff0f5f9e72f0d6d66d2aab6e80Jeff Sharkey } else { 102e6c04f9417cc4bff0f5f9e72f0d6d66d2aab6e80Jeff Sharkey return res.getString(com.android.internal.R.string.storage_sd_card); 1037e92ef3a1146102806fa0543ef12e09231c55639Jeff Sharkey } 1041b8ef7e3165ff9aa52a4905dafc8d0f83e7403f9Jeff Sharkey } else if ((flags & FLAG_USB) != 0) { 105e6c04f9417cc4bff0f5f9e72f0d6d66d2aab6e80Jeff Sharkey if (isInteresting(label)) { 1067e92ef3a1146102806fa0543ef12e09231c55639Jeff Sharkey return res.getString(com.android.internal.R.string.storage_usb_drive_label, label); 107e6c04f9417cc4bff0f5f9e72f0d6d66d2aab6e80Jeff Sharkey } else { 108e6c04f9417cc4bff0f5f9e72f0d6d66d2aab6e80Jeff Sharkey return res.getString(com.android.internal.R.string.storage_usb_drive); 1097e92ef3a1146102806fa0543ef12e09231c55639Jeff Sharkey } 1101b8ef7e3165ff9aa52a4905dafc8d0f83e7403f9Jeff Sharkey } else { 1111b8ef7e3165ff9aa52a4905dafc8d0f83e7403f9Jeff Sharkey return null; 1121b8ef7e3165ff9aa52a4905dafc8d0f83e7403f9Jeff Sharkey } 1131b8ef7e3165ff9aa52a4905dafc8d0f83e7403f9Jeff Sharkey } 1141b8ef7e3165ff9aa52a4905dafc8d0f83e7403f9Jeff Sharkey 115620b32b316fd4f1bab4eef55ec8802d14a55e7ddJeff Sharkey public boolean isAdoptable() { 116620b32b316fd4f1bab4eef55ec8802d14a55e7ddJeff Sharkey return (flags & FLAG_ADOPTABLE) != 0; 117620b32b316fd4f1bab4eef55ec8802d14a55e7ddJeff Sharkey } 118620b32b316fd4f1bab4eef55ec8802d14a55e7ddJeff Sharkey 119620b32b316fd4f1bab4eef55ec8802d14a55e7ddJeff Sharkey public boolean isDefaultPrimary() { 120620b32b316fd4f1bab4eef55ec8802d14a55e7ddJeff Sharkey return (flags & FLAG_DEFAULT_PRIMARY) != 0; 121620b32b316fd4f1bab4eef55ec8802d14a55e7ddJeff Sharkey } 122620b32b316fd4f1bab4eef55ec8802d14a55e7ddJeff Sharkey 12356bd3129138b525b0f2eba52bd4fa140f23e792cJeff Sharkey public boolean isSd() { 12456bd3129138b525b0f2eba52bd4fa140f23e792cJeff Sharkey return (flags & FLAG_SD) != 0; 12556bd3129138b525b0f2eba52bd4fa140f23e792cJeff Sharkey } 12656bd3129138b525b0f2eba52bd4fa140f23e792cJeff Sharkey 12756bd3129138b525b0f2eba52bd4fa140f23e792cJeff Sharkey public boolean isUsb() { 12856bd3129138b525b0f2eba52bd4fa140f23e792cJeff Sharkey return (flags & FLAG_USB) != 0; 12956bd3129138b525b0f2eba52bd4fa140f23e792cJeff Sharkey } 13056bd3129138b525b0f2eba52bd4fa140f23e792cJeff Sharkey 1317151a9a887051542c6da9f380376f3b306184e5cJeff Sharkey @Override 1327151a9a887051542c6da9f380376f3b306184e5cJeff Sharkey public String toString() { 1337151a9a887051542c6da9f380376f3b306184e5cJeff Sharkey final CharArrayWriter writer = new CharArrayWriter(); 1347151a9a887051542c6da9f380376f3b306184e5cJeff Sharkey dump(new IndentingPrintWriter(writer, " ", 80)); 1357151a9a887051542c6da9f380376f3b306184e5cJeff Sharkey return writer.toString(); 1367151a9a887051542c6da9f380376f3b306184e5cJeff Sharkey } 1371b8ef7e3165ff9aa52a4905dafc8d0f83e7403f9Jeff Sharkey 1381b8ef7e3165ff9aa52a4905dafc8d0f83e7403f9Jeff Sharkey public void dump(IndentingPrintWriter pw) { 1397e92ef3a1146102806fa0543ef12e09231c55639Jeff Sharkey pw.println("DiskInfo{" + id + "}:"); 1401b8ef7e3165ff9aa52a4905dafc8d0f83e7403f9Jeff Sharkey pw.increaseIndent(); 1411b8ef7e3165ff9aa52a4905dafc8d0f83e7403f9Jeff Sharkey pw.printPair("flags", DebugUtils.flagsToString(getClass(), "FLAG_", flags)); 1421b8ef7e3165ff9aa52a4905dafc8d0f83e7403f9Jeff Sharkey pw.printPair("size", size); 1431b8ef7e3165ff9aa52a4905dafc8d0f83e7403f9Jeff Sharkey pw.printPair("label", label); 144e8a4b66960056c2dc2c8dbb5f8df00710645cc64Jeff Sharkey pw.println(); 145e8a4b66960056c2dc2c8dbb5f8df00710645cc64Jeff Sharkey pw.printPair("sysPath", sysPath); 1461b8ef7e3165ff9aa52a4905dafc8d0f83e7403f9Jeff Sharkey pw.decreaseIndent(); 1471b8ef7e3165ff9aa52a4905dafc8d0f83e7403f9Jeff Sharkey pw.println(); 1481b8ef7e3165ff9aa52a4905dafc8d0f83e7403f9Jeff Sharkey } 1491b8ef7e3165ff9aa52a4905dafc8d0f83e7403f9Jeff Sharkey 1507151a9a887051542c6da9f380376f3b306184e5cJeff Sharkey @Override 1517151a9a887051542c6da9f380376f3b306184e5cJeff Sharkey public DiskInfo clone() { 1527151a9a887051542c6da9f380376f3b306184e5cJeff Sharkey final Parcel temp = Parcel.obtain(); 1537151a9a887051542c6da9f380376f3b306184e5cJeff Sharkey try { 1547151a9a887051542c6da9f380376f3b306184e5cJeff Sharkey writeToParcel(temp, 0); 1557151a9a887051542c6da9f380376f3b306184e5cJeff Sharkey temp.setDataPosition(0); 1567151a9a887051542c6da9f380376f3b306184e5cJeff Sharkey return CREATOR.createFromParcel(temp); 1577151a9a887051542c6da9f380376f3b306184e5cJeff Sharkey } finally { 1587151a9a887051542c6da9f380376f3b306184e5cJeff Sharkey temp.recycle(); 1597151a9a887051542c6da9f380376f3b306184e5cJeff Sharkey } 1607151a9a887051542c6da9f380376f3b306184e5cJeff Sharkey } 1617151a9a887051542c6da9f380376f3b306184e5cJeff Sharkey 162e2d45be4dae116307f8edd85eaa61134221cb8f9Jeff Sharkey @Override 163e2d45be4dae116307f8edd85eaa61134221cb8f9Jeff Sharkey public boolean equals(Object o) { 164e2d45be4dae116307f8edd85eaa61134221cb8f9Jeff Sharkey if (o instanceof DiskInfo) { 165e2d45be4dae116307f8edd85eaa61134221cb8f9Jeff Sharkey return Objects.equals(id, ((DiskInfo) o).id); 166e2d45be4dae116307f8edd85eaa61134221cb8f9Jeff Sharkey } else { 167e2d45be4dae116307f8edd85eaa61134221cb8f9Jeff Sharkey return false; 168e2d45be4dae116307f8edd85eaa61134221cb8f9Jeff Sharkey } 169e2d45be4dae116307f8edd85eaa61134221cb8f9Jeff Sharkey } 170e2d45be4dae116307f8edd85eaa61134221cb8f9Jeff Sharkey 171e2d45be4dae116307f8edd85eaa61134221cb8f9Jeff Sharkey @Override 172e2d45be4dae116307f8edd85eaa61134221cb8f9Jeff Sharkey public int hashCode() { 173e2d45be4dae116307f8edd85eaa61134221cb8f9Jeff Sharkey return id.hashCode(); 174e2d45be4dae116307f8edd85eaa61134221cb8f9Jeff Sharkey } 175e2d45be4dae116307f8edd85eaa61134221cb8f9Jeff Sharkey 1761b8ef7e3165ff9aa52a4905dafc8d0f83e7403f9Jeff Sharkey public static final Creator<DiskInfo> CREATOR = new Creator<DiskInfo>() { 1771b8ef7e3165ff9aa52a4905dafc8d0f83e7403f9Jeff Sharkey @Override 1781b8ef7e3165ff9aa52a4905dafc8d0f83e7403f9Jeff Sharkey public DiskInfo createFromParcel(Parcel in) { 1791b8ef7e3165ff9aa52a4905dafc8d0f83e7403f9Jeff Sharkey return new DiskInfo(in); 1801b8ef7e3165ff9aa52a4905dafc8d0f83e7403f9Jeff Sharkey } 1811b8ef7e3165ff9aa52a4905dafc8d0f83e7403f9Jeff Sharkey 1821b8ef7e3165ff9aa52a4905dafc8d0f83e7403f9Jeff Sharkey @Override 1831b8ef7e3165ff9aa52a4905dafc8d0f83e7403f9Jeff Sharkey public DiskInfo[] newArray(int size) { 1841b8ef7e3165ff9aa52a4905dafc8d0f83e7403f9Jeff Sharkey return new DiskInfo[size]; 1851b8ef7e3165ff9aa52a4905dafc8d0f83e7403f9Jeff Sharkey } 1861b8ef7e3165ff9aa52a4905dafc8d0f83e7403f9Jeff Sharkey }; 1871b8ef7e3165ff9aa52a4905dafc8d0f83e7403f9Jeff Sharkey 1881b8ef7e3165ff9aa52a4905dafc8d0f83e7403f9Jeff Sharkey @Override 1891b8ef7e3165ff9aa52a4905dafc8d0f83e7403f9Jeff Sharkey public int describeContents() { 1901b8ef7e3165ff9aa52a4905dafc8d0f83e7403f9Jeff Sharkey return 0; 1911b8ef7e3165ff9aa52a4905dafc8d0f83e7403f9Jeff Sharkey } 1921b8ef7e3165ff9aa52a4905dafc8d0f83e7403f9Jeff Sharkey 1931b8ef7e3165ff9aa52a4905dafc8d0f83e7403f9Jeff Sharkey @Override 1941b8ef7e3165ff9aa52a4905dafc8d0f83e7403f9Jeff Sharkey public void writeToParcel(Parcel parcel, int flags) { 1951b8ef7e3165ff9aa52a4905dafc8d0f83e7403f9Jeff Sharkey parcel.writeString(id); 19659d577a518333f4b4514315b6d10e8dba160abcdJeff Sharkey parcel.writeInt(this.flags); 1971b8ef7e3165ff9aa52a4905dafc8d0f83e7403f9Jeff Sharkey parcel.writeLong(size); 1981b8ef7e3165ff9aa52a4905dafc8d0f83e7403f9Jeff Sharkey parcel.writeString(label); 199f5a6bd7538a6800c2a43ace5ad67d65b1f8f697aJeff Sharkey parcel.writeInt(volumeCount); 200e8a4b66960056c2dc2c8dbb5f8df00710645cc64Jeff Sharkey parcel.writeString(sysPath); 2011b8ef7e3165ff9aa52a4905dafc8d0f83e7403f9Jeff Sharkey } 2021b8ef7e3165ff9aa52a4905dafc8d0f83e7403f9Jeff Sharkey} 203