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