RootInfo.java revision 323dffb4cffde781d325ddd3a36da9ed7b5bfec6
1724deeb5558a517471e9bf7168b456e6daec62f8Jeff Sharkey/* 2724deeb5558a517471e9bf7168b456e6daec62f8Jeff Sharkey * Copyright (C) 2013 The Android Open Source Project 3724deeb5558a517471e9bf7168b456e6daec62f8Jeff Sharkey * 4724deeb5558a517471e9bf7168b456e6daec62f8Jeff Sharkey * Licensed under the Apache License, Version 2.0 (the "License"); 5724deeb5558a517471e9bf7168b456e6daec62f8Jeff Sharkey * you may not use this file except in compliance with the License. 6724deeb5558a517471e9bf7168b456e6daec62f8Jeff Sharkey * You may obtain a copy of the License at 7724deeb5558a517471e9bf7168b456e6daec62f8Jeff Sharkey * 8724deeb5558a517471e9bf7168b456e6daec62f8Jeff Sharkey * http://www.apache.org/licenses/LICENSE-2.0 9724deeb5558a517471e9bf7168b456e6daec62f8Jeff Sharkey * 10724deeb5558a517471e9bf7168b456e6daec62f8Jeff Sharkey * Unless required by applicable law or agreed to in writing, software 11724deeb5558a517471e9bf7168b456e6daec62f8Jeff Sharkey * distributed under the License is distributed on an "AS IS" BASIS, 12724deeb5558a517471e9bf7168b456e6daec62f8Jeff Sharkey * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13724deeb5558a517471e9bf7168b456e6daec62f8Jeff Sharkey * See the License for the specific language governing permissions and 14724deeb5558a517471e9bf7168b456e6daec62f8Jeff Sharkey * limitations under the License. 15724deeb5558a517471e9bf7168b456e6daec62f8Jeff Sharkey */ 16724deeb5558a517471e9bf7168b456e6daec62f8Jeff Sharkey 17724deeb5558a517471e9bf7168b456e6daec62f8Jeff Sharkeypackage com.android.documentsui.model; 18724deeb5558a517471e9bf7168b456e6daec62f8Jeff Sharkey 19724deeb5558a517471e9bf7168b456e6daec62f8Jeff Sharkeyimport static com.android.documentsui.model.DocumentInfo.getCursorInt; 20724deeb5558a517471e9bf7168b456e6daec62f8Jeff Sharkeyimport static com.android.documentsui.model.DocumentInfo.getCursorLong; 21724deeb5558a517471e9bf7168b456e6daec62f8Jeff Sharkeyimport static com.android.documentsui.model.DocumentInfo.getCursorString; 22724deeb5558a517471e9bf7168b456e6daec62f8Jeff Sharkey 23724deeb5558a517471e9bf7168b456e6daec62f8Jeff Sharkeyimport android.content.Context; 24724deeb5558a517471e9bf7168b456e6daec62f8Jeff Sharkeyimport android.database.Cursor; 25724deeb5558a517471e9bf7168b456e6daec62f8Jeff Sharkeyimport android.graphics.drawable.Drawable; 2631e104f83db7dae9e8620ef1d3151f9a580e6dcbSteve McKayimport android.net.Uri; 27a4d1f2200ddfb0d12145fba8457c47e8051c84f7Jeff Sharkeyimport android.os.Parcel; 28a4d1f2200ddfb0d12145fba8457c47e8051c84f7Jeff Sharkeyimport android.os.Parcelable; 2931e104f83db7dae9e8620ef1d3151f9a580e6dcbSteve McKayimport android.provider.DocumentsContract; 30724deeb5558a517471e9bf7168b456e6daec62f8Jeff Sharkeyimport android.provider.DocumentsContract.Root; 31a35ac2dd16a64014a524d1441fb20d5a02b40836Jeff Sharkeyimport android.text.TextUtils; 32724deeb5558a517471e9bf7168b456e6daec62f8Jeff Sharkey 335629ec5989006bfc4ad3cb19a92163d581ff02e6Jeff Sharkeyimport com.android.documentsui.IconUtils; 3406c4187080497dffbcdb438aa45b262eb37706b1Jeff Sharkeyimport com.android.documentsui.R; 355629ec5989006bfc4ad3cb19a92163d581ff02e6Jeff Sharkey 36a4d1f2200ddfb0d12145fba8457c47e8051c84f7Jeff Sharkeyimport java.io.DataInputStream; 37a4d1f2200ddfb0d12145fba8457c47e8051c84f7Jeff Sharkeyimport java.io.DataOutputStream; 38a4d1f2200ddfb0d12145fba8457c47e8051c84f7Jeff Sharkeyimport java.io.IOException; 39a4d1f2200ddfb0d12145fba8457c47e8051c84f7Jeff Sharkeyimport java.net.ProtocolException; 40d82b26b58a0950a0dd3522e630bd87fe85290ab2Jeff Sharkeyimport java.util.Objects; 41d82b26b58a0950a0dd3522e630bd87fe85290ab2Jeff Sharkey 42724deeb5558a517471e9bf7168b456e6daec62f8Jeff Sharkey/** 43724deeb5558a517471e9bf7168b456e6daec62f8Jeff Sharkey * Representation of a {@link Root}. 44724deeb5558a517471e9bf7168b456e6daec62f8Jeff Sharkey */ 45a4d1f2200ddfb0d12145fba8457c47e8051c84f7Jeff Sharkeypublic class RootInfo implements Durable, Parcelable { 46a4d1f2200ddfb0d12145fba8457c47e8051c84f7Jeff Sharkey private static final int VERSION_INIT = 1; 479dd02629d12d05c2e77780dc6b9fcc7639192de6Jeff Sharkey private static final int VERSION_DROP_TYPE = 2; 48a4d1f2200ddfb0d12145fba8457c47e8051c84f7Jeff Sharkey 4985c8cdd2e79e96f719932db64b61d3c51d4aeefcBen Kwa // The values of these constants determine the sort order of various roots in the RootsFragment. 5085c8cdd2e79e96f719932db64b61d3c51d4aeefcBen Kwa public static final int TYPE_IMAGES = 1; 5185c8cdd2e79e96f719932db64b61d3c51d4aeefcBen Kwa public static final int TYPE_VIDEO = 2; 5285c8cdd2e79e96f719932db64b61d3c51d4aeefcBen Kwa public static final int TYPE_AUDIO = 3; 5385c8cdd2e79e96f719932db64b61d3c51d4aeefcBen Kwa public static final int TYPE_RECENTS = 4; 5485c8cdd2e79e96f719932db64b61d3c51d4aeefcBen Kwa public static final int TYPE_DOWNLOADS = 5; 5585c8cdd2e79e96f719932db64b61d3c51d4aeefcBen Kwa public static final int TYPE_LOCAL = 6; 569fb33890e10dac56ced4559b4d325ba1a7470dc6Daichi Hirono public static final int TYPE_MTP = 7; 5712ef53e81e604a0668bc09747577c1686c90d2fbSteve McKay public static final int TYPE_OTHER = 8; 5885c8cdd2e79e96f719932db64b61d3c51d4aeefcBen Kwa 59724deeb5558a517471e9bf7168b456e6daec62f8Jeff Sharkey public String authority; 60724deeb5558a517471e9bf7168b456e6daec62f8Jeff Sharkey public String rootId; 61724deeb5558a517471e9bf7168b456e6daec62f8Jeff Sharkey public int flags; 62724deeb5558a517471e9bf7168b456e6daec62f8Jeff Sharkey public int icon; 63724deeb5558a517471e9bf7168b456e6daec62f8Jeff Sharkey public String title; 64724deeb5558a517471e9bf7168b456e6daec62f8Jeff Sharkey public String summary; 65724deeb5558a517471e9bf7168b456e6daec62f8Jeff Sharkey public String documentId; 66724deeb5558a517471e9bf7168b456e6daec62f8Jeff Sharkey public long availableBytes; 67a4d1f2200ddfb0d12145fba8457c47e8051c84f7Jeff Sharkey public String mimeTypes; 68a4d1f2200ddfb0d12145fba8457c47e8051c84f7Jeff Sharkey 69a4d1f2200ddfb0d12145fba8457c47e8051c84f7Jeff Sharkey /** Derived fields that aren't persisted */ 70a4d1f2200ddfb0d12145fba8457c47e8051c84f7Jeff Sharkey public String[] derivedMimeTypes; 71a4d1f2200ddfb0d12145fba8457c47e8051c84f7Jeff Sharkey public int derivedIcon; 7285c8cdd2e79e96f719932db64b61d3c51d4aeefcBen Kwa public int derivedType; 73a4d1f2200ddfb0d12145fba8457c47e8051c84f7Jeff Sharkey 74a4d1f2200ddfb0d12145fba8457c47e8051c84f7Jeff Sharkey public RootInfo() { 75a4d1f2200ddfb0d12145fba8457c47e8051c84f7Jeff Sharkey reset(); 76a4d1f2200ddfb0d12145fba8457c47e8051c84f7Jeff Sharkey } 77a4d1f2200ddfb0d12145fba8457c47e8051c84f7Jeff Sharkey 78a4d1f2200ddfb0d12145fba8457c47e8051c84f7Jeff Sharkey @Override 79a4d1f2200ddfb0d12145fba8457c47e8051c84f7Jeff Sharkey public void reset() { 80a4d1f2200ddfb0d12145fba8457c47e8051c84f7Jeff Sharkey authority = null; 81a4d1f2200ddfb0d12145fba8457c47e8051c84f7Jeff Sharkey rootId = null; 82a4d1f2200ddfb0d12145fba8457c47e8051c84f7Jeff Sharkey flags = 0; 83a4d1f2200ddfb0d12145fba8457c47e8051c84f7Jeff Sharkey icon = 0; 84a4d1f2200ddfb0d12145fba8457c47e8051c84f7Jeff Sharkey title = null; 85a4d1f2200ddfb0d12145fba8457c47e8051c84f7Jeff Sharkey summary = null; 86a4d1f2200ddfb0d12145fba8457c47e8051c84f7Jeff Sharkey documentId = null; 87a4d1f2200ddfb0d12145fba8457c47e8051c84f7Jeff Sharkey availableBytes = -1; 88a4d1f2200ddfb0d12145fba8457c47e8051c84f7Jeff Sharkey mimeTypes = null; 89a4d1f2200ddfb0d12145fba8457c47e8051c84f7Jeff Sharkey 90a4d1f2200ddfb0d12145fba8457c47e8051c84f7Jeff Sharkey derivedMimeTypes = null; 91a4d1f2200ddfb0d12145fba8457c47e8051c84f7Jeff Sharkey derivedIcon = 0; 9285c8cdd2e79e96f719932db64b61d3c51d4aeefcBen Kwa derivedType = 0; 93a4d1f2200ddfb0d12145fba8457c47e8051c84f7Jeff Sharkey } 94a4d1f2200ddfb0d12145fba8457c47e8051c84f7Jeff Sharkey 95a4d1f2200ddfb0d12145fba8457c47e8051c84f7Jeff Sharkey @Override 96a4d1f2200ddfb0d12145fba8457c47e8051c84f7Jeff Sharkey public void read(DataInputStream in) throws IOException { 97a4d1f2200ddfb0d12145fba8457c47e8051c84f7Jeff Sharkey final int version = in.readInt(); 98a4d1f2200ddfb0d12145fba8457c47e8051c84f7Jeff Sharkey switch (version) { 999dd02629d12d05c2e77780dc6b9fcc7639192de6Jeff Sharkey case VERSION_DROP_TYPE: 100a4d1f2200ddfb0d12145fba8457c47e8051c84f7Jeff Sharkey authority = DurableUtils.readNullableString(in); 101a4d1f2200ddfb0d12145fba8457c47e8051c84f7Jeff Sharkey rootId = DurableUtils.readNullableString(in); 102a4d1f2200ddfb0d12145fba8457c47e8051c84f7Jeff Sharkey flags = in.readInt(); 103a4d1f2200ddfb0d12145fba8457c47e8051c84f7Jeff Sharkey icon = in.readInt(); 104a4d1f2200ddfb0d12145fba8457c47e8051c84f7Jeff Sharkey title = DurableUtils.readNullableString(in); 105a4d1f2200ddfb0d12145fba8457c47e8051c84f7Jeff Sharkey summary = DurableUtils.readNullableString(in); 106a4d1f2200ddfb0d12145fba8457c47e8051c84f7Jeff Sharkey documentId = DurableUtils.readNullableString(in); 107a4d1f2200ddfb0d12145fba8457c47e8051c84f7Jeff Sharkey availableBytes = in.readLong(); 108a4d1f2200ddfb0d12145fba8457c47e8051c84f7Jeff Sharkey mimeTypes = DurableUtils.readNullableString(in); 109a4d1f2200ddfb0d12145fba8457c47e8051c84f7Jeff Sharkey deriveFields(); 110a4d1f2200ddfb0d12145fba8457c47e8051c84f7Jeff Sharkey break; 111a4d1f2200ddfb0d12145fba8457c47e8051c84f7Jeff Sharkey default: 112a4d1f2200ddfb0d12145fba8457c47e8051c84f7Jeff Sharkey throw new ProtocolException("Unknown version " + version); 113a4d1f2200ddfb0d12145fba8457c47e8051c84f7Jeff Sharkey } 114a4d1f2200ddfb0d12145fba8457c47e8051c84f7Jeff Sharkey } 115a4d1f2200ddfb0d12145fba8457c47e8051c84f7Jeff Sharkey 116a4d1f2200ddfb0d12145fba8457c47e8051c84f7Jeff Sharkey @Override 117a4d1f2200ddfb0d12145fba8457c47e8051c84f7Jeff Sharkey public void write(DataOutputStream out) throws IOException { 1189dd02629d12d05c2e77780dc6b9fcc7639192de6Jeff Sharkey out.writeInt(VERSION_DROP_TYPE); 119a4d1f2200ddfb0d12145fba8457c47e8051c84f7Jeff Sharkey DurableUtils.writeNullableString(out, authority); 120a4d1f2200ddfb0d12145fba8457c47e8051c84f7Jeff Sharkey DurableUtils.writeNullableString(out, rootId); 121a4d1f2200ddfb0d12145fba8457c47e8051c84f7Jeff Sharkey out.writeInt(flags); 122a4d1f2200ddfb0d12145fba8457c47e8051c84f7Jeff Sharkey out.writeInt(icon); 123a4d1f2200ddfb0d12145fba8457c47e8051c84f7Jeff Sharkey DurableUtils.writeNullableString(out, title); 124a4d1f2200ddfb0d12145fba8457c47e8051c84f7Jeff Sharkey DurableUtils.writeNullableString(out, summary); 125a4d1f2200ddfb0d12145fba8457c47e8051c84f7Jeff Sharkey DurableUtils.writeNullableString(out, documentId); 126a4d1f2200ddfb0d12145fba8457c47e8051c84f7Jeff Sharkey out.writeLong(availableBytes); 127a4d1f2200ddfb0d12145fba8457c47e8051c84f7Jeff Sharkey DurableUtils.writeNullableString(out, mimeTypes); 128a4d1f2200ddfb0d12145fba8457c47e8051c84f7Jeff Sharkey } 129a4d1f2200ddfb0d12145fba8457c47e8051c84f7Jeff Sharkey 130a4d1f2200ddfb0d12145fba8457c47e8051c84f7Jeff Sharkey @Override 131a4d1f2200ddfb0d12145fba8457c47e8051c84f7Jeff Sharkey public int describeContents() { 132a4d1f2200ddfb0d12145fba8457c47e8051c84f7Jeff Sharkey return 0; 133a4d1f2200ddfb0d12145fba8457c47e8051c84f7Jeff Sharkey } 134a4d1f2200ddfb0d12145fba8457c47e8051c84f7Jeff Sharkey 135a4d1f2200ddfb0d12145fba8457c47e8051c84f7Jeff Sharkey @Override 136a4d1f2200ddfb0d12145fba8457c47e8051c84f7Jeff Sharkey public void writeToParcel(Parcel dest, int flags) { 137a4d1f2200ddfb0d12145fba8457c47e8051c84f7Jeff Sharkey DurableUtils.writeToParcel(dest, this); 138a4d1f2200ddfb0d12145fba8457c47e8051c84f7Jeff Sharkey } 139a4d1f2200ddfb0d12145fba8457c47e8051c84f7Jeff Sharkey 140a4d1f2200ddfb0d12145fba8457c47e8051c84f7Jeff Sharkey public static final Creator<RootInfo> CREATOR = new Creator<RootInfo>() { 141a4d1f2200ddfb0d12145fba8457c47e8051c84f7Jeff Sharkey @Override 142a4d1f2200ddfb0d12145fba8457c47e8051c84f7Jeff Sharkey public RootInfo createFromParcel(Parcel in) { 143a4d1f2200ddfb0d12145fba8457c47e8051c84f7Jeff Sharkey final RootInfo root = new RootInfo(); 144a4d1f2200ddfb0d12145fba8457c47e8051c84f7Jeff Sharkey DurableUtils.readFromParcel(in, root); 145a4d1f2200ddfb0d12145fba8457c47e8051c84f7Jeff Sharkey return root; 146a4d1f2200ddfb0d12145fba8457c47e8051c84f7Jeff Sharkey } 147a4d1f2200ddfb0d12145fba8457c47e8051c84f7Jeff Sharkey 148a4d1f2200ddfb0d12145fba8457c47e8051c84f7Jeff Sharkey @Override 149a4d1f2200ddfb0d12145fba8457c47e8051c84f7Jeff Sharkey public RootInfo[] newArray(int size) { 150a4d1f2200ddfb0d12145fba8457c47e8051c84f7Jeff Sharkey return new RootInfo[size]; 151a4d1f2200ddfb0d12145fba8457c47e8051c84f7Jeff Sharkey } 152a4d1f2200ddfb0d12145fba8457c47e8051c84f7Jeff Sharkey }; 153724deeb5558a517471e9bf7168b456e6daec62f8Jeff Sharkey 154724deeb5558a517471e9bf7168b456e6daec62f8Jeff Sharkey public static RootInfo fromRootsCursor(String authority, Cursor cursor) { 155724deeb5558a517471e9bf7168b456e6daec62f8Jeff Sharkey final RootInfo root = new RootInfo(); 156724deeb5558a517471e9bf7168b456e6daec62f8Jeff Sharkey root.authority = authority; 157724deeb5558a517471e9bf7168b456e6daec62f8Jeff Sharkey root.rootId = getCursorString(cursor, Root.COLUMN_ROOT_ID); 158724deeb5558a517471e9bf7168b456e6daec62f8Jeff Sharkey root.flags = getCursorInt(cursor, Root.COLUMN_FLAGS); 159724deeb5558a517471e9bf7168b456e6daec62f8Jeff Sharkey root.icon = getCursorInt(cursor, Root.COLUMN_ICON); 160724deeb5558a517471e9bf7168b456e6daec62f8Jeff Sharkey root.title = getCursorString(cursor, Root.COLUMN_TITLE); 161724deeb5558a517471e9bf7168b456e6daec62f8Jeff Sharkey root.summary = getCursorString(cursor, Root.COLUMN_SUMMARY); 162724deeb5558a517471e9bf7168b456e6daec62f8Jeff Sharkey root.documentId = getCursorString(cursor, Root.COLUMN_DOCUMENT_ID); 163724deeb5558a517471e9bf7168b456e6daec62f8Jeff Sharkey root.availableBytes = getCursorLong(cursor, Root.COLUMN_AVAILABLE_BYTES); 164a4d1f2200ddfb0d12145fba8457c47e8051c84f7Jeff Sharkey root.mimeTypes = getCursorString(cursor, Root.COLUMN_MIME_TYPES); 165a4d1f2200ddfb0d12145fba8457c47e8051c84f7Jeff Sharkey root.deriveFields(); 166a4d1f2200ddfb0d12145fba8457c47e8051c84f7Jeff Sharkey return root; 167a4d1f2200ddfb0d12145fba8457c47e8051c84f7Jeff Sharkey } 168e1a2ceef30fe9c514152c3fab3cedcb99bdb68dfJeff Sharkey 169a4d1f2200ddfb0d12145fba8457c47e8051c84f7Jeff Sharkey private void deriveFields() { 170a4d1f2200ddfb0d12145fba8457c47e8051c84f7Jeff Sharkey derivedMimeTypes = (mimeTypes != null) ? mimeTypes.split("\n") : null; 171e1a2ceef30fe9c514152c3fab3cedcb99bdb68dfJeff Sharkey 17206c4187080497dffbcdb438aa45b262eb37706b1Jeff Sharkey // TODO: remove these special case icons 17312ef53e81e604a0668bc09747577c1686c90d2fbSteve McKay if (isHome()) { 1743eafe2f6e4cd649b2bdeff0bb5c7e8da5786de61Steve McKay derivedIcon = R.drawable.ic_root_documents; 17512ef53e81e604a0668bc09747577c1686c90d2fbSteve McKay derivedType = TYPE_LOCAL; 17612ef53e81e604a0668bc09747577c1686c90d2fbSteve McKay } else if (isExternalStorage()) { 177c9a0d952656e990091ea653d5a598503eaa2fe54Aga Wronska derivedIcon = R.drawable.ic_root_smartphone; 17885c8cdd2e79e96f719932db64b61d3c51d4aeefcBen Kwa derivedType = TYPE_LOCAL; 17936787540589e768fce222629a75e951904383250Steve McKay // TODO: Apply SD card icon to SD devices. 1809dd02629d12d05c2e77780dc6b9fcc7639192de6Jeff Sharkey } else if (isDownloads()) { 18134c5409fb31d0aae417db265dce4f49ee8a93227Jeff Sharkey derivedIcon = R.drawable.ic_root_download; 18285c8cdd2e79e96f719932db64b61d3c51d4aeefcBen Kwa derivedType = TYPE_DOWNLOADS; 1839dd02629d12d05c2e77780dc6b9fcc7639192de6Jeff Sharkey } else if (isImages()) { 18434c5409fb31d0aae417db265dce4f49ee8a93227Jeff Sharkey derivedIcon = R.drawable.ic_doc_image; 18585c8cdd2e79e96f719932db64b61d3c51d4aeefcBen Kwa derivedType = TYPE_IMAGES; 1869dd02629d12d05c2e77780dc6b9fcc7639192de6Jeff Sharkey } else if (isVideos()) { 18734c5409fb31d0aae417db265dce4f49ee8a93227Jeff Sharkey derivedIcon = R.drawable.ic_doc_video; 18885c8cdd2e79e96f719932db64b61d3c51d4aeefcBen Kwa derivedType = TYPE_VIDEO; 1899dd02629d12d05c2e77780dc6b9fcc7639192de6Jeff Sharkey } else if (isAudio()) { 19034c5409fb31d0aae417db265dce4f49ee8a93227Jeff Sharkey derivedIcon = R.drawable.ic_doc_audio; 19185c8cdd2e79e96f719932db64b61d3c51d4aeefcBen Kwa derivedType = TYPE_AUDIO; 19285c8cdd2e79e96f719932db64b61d3c51d4aeefcBen Kwa } else if (isRecents()) { 19385c8cdd2e79e96f719932db64b61d3c51d4aeefcBen Kwa derivedType = TYPE_RECENTS; 1949fb33890e10dac56ced4559b4d325ba1a7470dc6Daichi Hirono } else if (isMtp()) { 1959fb33890e10dac56ced4559b4d325ba1a7470dc6Daichi Hirono derivedType = TYPE_MTP; 19685c8cdd2e79e96f719932db64b61d3c51d4aeefcBen Kwa } else { 19712ef53e81e604a0668bc09747577c1686c90d2fbSteve McKay derivedType = TYPE_OTHER; 19806c4187080497dffbcdb438aa45b262eb37706b1Jeff Sharkey } 1999dd02629d12d05c2e77780dc6b9fcc7639192de6Jeff Sharkey } 2009dd02629d12d05c2e77780dc6b9fcc7639192de6Jeff Sharkey 20131e104f83db7dae9e8620ef1d3151f9a580e6dcbSteve McKay public Uri getUri() { 20231e104f83db7dae9e8620ef1d3151f9a580e6dcbSteve McKay return DocumentsContract.buildRootUri(authority, rootId); 20331e104f83db7dae9e8620ef1d3151f9a580e6dcbSteve McKay } 20431e104f83db7dae9e8620ef1d3151f9a580e6dcbSteve McKay 2059dd02629d12d05c2e77780dc6b9fcc7639192de6Jeff Sharkey public boolean isRecents() { 2069dd02629d12d05c2e77780dc6b9fcc7639192de6Jeff Sharkey return authority == null && rootId == null; 2079dd02629d12d05c2e77780dc6b9fcc7639192de6Jeff Sharkey } 2089dd02629d12d05c2e77780dc6b9fcc7639192de6Jeff Sharkey 20912ef53e81e604a0668bc09747577c1686c90d2fbSteve McKay public boolean isHome() { 21012ef53e81e604a0668bc09747577c1686c90d2fbSteve McKay // Note that "home" is the expected root id for the auto-created 21112ef53e81e604a0668bc09747577c1686c90d2fbSteve McKay // user home directory on external storage. The "home" value should 21212ef53e81e604a0668bc09747577c1686c90d2fbSteve McKay // match ExternalStorageProvider.ROOT_ID_HOME. 21312ef53e81e604a0668bc09747577c1686c90d2fbSteve McKay return isExternalStorage() && "home".equals(rootId); 21412ef53e81e604a0668bc09747577c1686c90d2fbSteve McKay } 21512ef53e81e604a0668bc09747577c1686c90d2fbSteve McKay 2169dd02629d12d05c2e77780dc6b9fcc7639192de6Jeff Sharkey public boolean isExternalStorage() { 2179dd02629d12d05c2e77780dc6b9fcc7639192de6Jeff Sharkey return "com.android.externalstorage.documents".equals(authority); 2189dd02629d12d05c2e77780dc6b9fcc7639192de6Jeff Sharkey } 2199dd02629d12d05c2e77780dc6b9fcc7639192de6Jeff Sharkey 2209dd02629d12d05c2e77780dc6b9fcc7639192de6Jeff Sharkey public boolean isDownloads() { 2219dd02629d12d05c2e77780dc6b9fcc7639192de6Jeff Sharkey return "com.android.providers.downloads.documents".equals(authority); 2229dd02629d12d05c2e77780dc6b9fcc7639192de6Jeff Sharkey } 2239dd02629d12d05c2e77780dc6b9fcc7639192de6Jeff Sharkey 2249dd02629d12d05c2e77780dc6b9fcc7639192de6Jeff Sharkey public boolean isImages() { 2259dd02629d12d05c2e77780dc6b9fcc7639192de6Jeff Sharkey return "com.android.providers.media.documents".equals(authority) 2269dd02629d12d05c2e77780dc6b9fcc7639192de6Jeff Sharkey && "images_root".equals(rootId); 2279dd02629d12d05c2e77780dc6b9fcc7639192de6Jeff Sharkey } 2289dd02629d12d05c2e77780dc6b9fcc7639192de6Jeff Sharkey 2299dd02629d12d05c2e77780dc6b9fcc7639192de6Jeff Sharkey public boolean isVideos() { 2309dd02629d12d05c2e77780dc6b9fcc7639192de6Jeff Sharkey return "com.android.providers.media.documents".equals(authority) 2319dd02629d12d05c2e77780dc6b9fcc7639192de6Jeff Sharkey && "videos_root".equals(rootId); 2329dd02629d12d05c2e77780dc6b9fcc7639192de6Jeff Sharkey } 2339dd02629d12d05c2e77780dc6b9fcc7639192de6Jeff Sharkey 2349dd02629d12d05c2e77780dc6b9fcc7639192de6Jeff Sharkey public boolean isAudio() { 2359dd02629d12d05c2e77780dc6b9fcc7639192de6Jeff Sharkey return "com.android.providers.media.documents".equals(authority) 2369dd02629d12d05c2e77780dc6b9fcc7639192de6Jeff Sharkey && "audio_root".equals(rootId); 237a4d1f2200ddfb0d12145fba8457c47e8051c84f7Jeff Sharkey } 23806c4187080497dffbcdb438aa45b262eb37706b1Jeff Sharkey 2399fb33890e10dac56ced4559b4d325ba1a7470dc6Daichi Hirono public boolean isMtp() { 2409fb33890e10dac56ced4559b4d325ba1a7470dc6Daichi Hirono return "com.android.mtp.documents".equals(authority); 2419fb33890e10dac56ced4559b4d325ba1a7470dc6Daichi Hirono } 2429fb33890e10dac56ced4559b4d325ba1a7470dc6Daichi Hirono 2439fb33890e10dac56ced4559b4d325ba1a7470dc6Daichi Hirono public boolean isLibrary() { 2449fb33890e10dac56ced4559b4d325ba1a7470dc6Daichi Hirono return derivedType == TYPE_IMAGES || derivedType == TYPE_VIDEO || derivedType == TYPE_AUDIO 2459fb33890e10dac56ced4559b4d325ba1a7470dc6Daichi Hirono || derivedType == TYPE_RECENTS || derivedType == TYPE_DOWNLOADS; 2469fb33890e10dac56ced4559b4d325ba1a7470dc6Daichi Hirono } 2479fb33890e10dac56ced4559b4d325ba1a7470dc6Daichi Hirono 24836787540589e768fce222629a75e951904383250Steve McKay public boolean hasSettings() { 24936787540589e768fce222629a75e951904383250Steve McKay return (flags & Root.FLAG_HAS_SETTINGS) != 0; 25036787540589e768fce222629a75e951904383250Steve McKay } 25136787540589e768fce222629a75e951904383250Steve McKay 252323dffb4cffde781d325ddd3a36da9ed7b5bfec6Steve McKay public boolean supportsChildren() { 253323dffb4cffde781d325ddd3a36da9ed7b5bfec6Steve McKay return (flags & Root.FLAG_SUPPORTS_IS_CHILD) != 0; 254323dffb4cffde781d325ddd3a36da9ed7b5bfec6Steve McKay } 255323dffb4cffde781d325ddd3a36da9ed7b5bfec6Steve McKay 256323dffb4cffde781d325ddd3a36da9ed7b5bfec6Steve McKay public boolean supportsCreate() { 257323dffb4cffde781d325ddd3a36da9ed7b5bfec6Steve McKay return (flags & Root.FLAG_SUPPORTS_CREATE) != 0; 258323dffb4cffde781d325ddd3a36da9ed7b5bfec6Steve McKay } 259323dffb4cffde781d325ddd3a36da9ed7b5bfec6Steve McKay 260323dffb4cffde781d325ddd3a36da9ed7b5bfec6Steve McKay public boolean isAdvanced() { 261323dffb4cffde781d325ddd3a36da9ed7b5bfec6Steve McKay return (flags & Root.FLAG_ADVANCED) != 0; 262323dffb4cffde781d325ddd3a36da9ed7b5bfec6Steve McKay } 263323dffb4cffde781d325ddd3a36da9ed7b5bfec6Steve McKay 264323dffb4cffde781d325ddd3a36da9ed7b5bfec6Steve McKay public boolean isLocalOnly() { 265323dffb4cffde781d325ddd3a36da9ed7b5bfec6Steve McKay return (flags & Root.FLAG_LOCAL_ONLY) != 0; 266323dffb4cffde781d325ddd3a36da9ed7b5bfec6Steve McKay } 267323dffb4cffde781d325ddd3a36da9ed7b5bfec6Steve McKay 268323dffb4cffde781d325ddd3a36da9ed7b5bfec6Steve McKay public boolean isEmpty() { 269323dffb4cffde781d325ddd3a36da9ed7b5bfec6Steve McKay return (flags & Root.FLAG_EMPTY) != 0; 270323dffb4cffde781d325ddd3a36da9ed7b5bfec6Steve McKay } 271323dffb4cffde781d325ddd3a36da9ed7b5bfec6Steve McKay 272724deeb5558a517471e9bf7168b456e6daec62f8Jeff Sharkey public Drawable loadIcon(Context context) { 273a4d1f2200ddfb0d12145fba8457c47e8051c84f7Jeff Sharkey if (derivedIcon != 0) { 27461791445af80ab126478e4bc956fe5d44086cf38Alan Viverette return context.getDrawable(derivedIcon); 27506c4187080497dffbcdb438aa45b262eb37706b1Jeff Sharkey } else { 27606c4187080497dffbcdb438aa45b262eb37706b1Jeff Sharkey return IconUtils.loadPackageIcon(context, authority, icon); 27706c4187080497dffbcdb438aa45b262eb37706b1Jeff Sharkey } 278724deeb5558a517471e9bf7168b456e6daec62f8Jeff Sharkey } 279d82b26b58a0950a0dd3522e630bd87fe85290ab2Jeff Sharkey 2807e544619f6518dd5eeed8262604edfc08942471fJeff Sharkey public Drawable loadDrawerIcon(Context context) { 2817e544619f6518dd5eeed8262604edfc08942471fJeff Sharkey if (derivedIcon != 0) { 2827e544619f6518dd5eeed8262604edfc08942471fJeff Sharkey return IconUtils.applyTintColor(context, derivedIcon, R.color.item_root_icon); 2837e544619f6518dd5eeed8262604edfc08942471fJeff Sharkey } else { 2847e544619f6518dd5eeed8262604edfc08942471fJeff Sharkey return IconUtils.loadPackageIcon(context, authority, icon); 2857e544619f6518dd5eeed8262604edfc08942471fJeff Sharkey } 2867e544619f6518dd5eeed8262604edfc08942471fJeff Sharkey } 2877e544619f6518dd5eeed8262604edfc08942471fJeff Sharkey 28834c5409fb31d0aae417db265dce4f49ee8a93227Jeff Sharkey public Drawable loadToolbarIcon(Context context) { 28934c5409fb31d0aae417db265dce4f49ee8a93227Jeff Sharkey if (derivedIcon != 0) { 2907e544619f6518dd5eeed8262604edfc08942471fJeff Sharkey return IconUtils.applyTintAttr(context, derivedIcon, 29134c5409fb31d0aae417db265dce4f49ee8a93227Jeff Sharkey android.R.attr.colorControlNormal); 29293cdbc2c32f3bb0dd83cc1dfcaf109626d9632d9Jeff Sharkey } else { 29334c5409fb31d0aae417db265dce4f49ee8a93227Jeff Sharkey return IconUtils.loadPackageIcon(context, authority, icon); 29493cdbc2c32f3bb0dd83cc1dfcaf109626d9632d9Jeff Sharkey } 29593cdbc2c32f3bb0dd83cc1dfcaf109626d9632d9Jeff Sharkey } 29693cdbc2c32f3bb0dd83cc1dfcaf109626d9632d9Jeff Sharkey 297d82b26b58a0950a0dd3522e630bd87fe85290ab2Jeff Sharkey @Override 298d82b26b58a0950a0dd3522e630bd87fe85290ab2Jeff Sharkey public boolean equals(Object o) { 299405142a83f58ccf9c2c3ba66951aa714075b3932Steve McKay if (o == null) { 300d82b26b58a0950a0dd3522e630bd87fe85290ab2Jeff Sharkey return false; 301d82b26b58a0950a0dd3522e630bd87fe85290ab2Jeff Sharkey } 302405142a83f58ccf9c2c3ba66951aa714075b3932Steve McKay 303405142a83f58ccf9c2c3ba66951aa714075b3932Steve McKay if (this == o) { 304405142a83f58ccf9c2c3ba66951aa714075b3932Steve McKay return true; 305405142a83f58ccf9c2c3ba66951aa714075b3932Steve McKay } 306405142a83f58ccf9c2c3ba66951aa714075b3932Steve McKay 307405142a83f58ccf9c2c3ba66951aa714075b3932Steve McKay if (o instanceof RootInfo) { 308405142a83f58ccf9c2c3ba66951aa714075b3932Steve McKay RootInfo other = (RootInfo) o; 309405142a83f58ccf9c2c3ba66951aa714075b3932Steve McKay return Objects.equals(authority, other.authority) 310405142a83f58ccf9c2c3ba66951aa714075b3932Steve McKay && Objects.equals(rootId, other.rootId); 311405142a83f58ccf9c2c3ba66951aa714075b3932Steve McKay } 312405142a83f58ccf9c2c3ba66951aa714075b3932Steve McKay 313405142a83f58ccf9c2c3ba66951aa714075b3932Steve McKay return false; 314d82b26b58a0950a0dd3522e630bd87fe85290ab2Jeff Sharkey } 315d82b26b58a0950a0dd3522e630bd87fe85290ab2Jeff Sharkey 316d82b26b58a0950a0dd3522e630bd87fe85290ab2Jeff Sharkey @Override 317d82b26b58a0950a0dd3522e630bd87fe85290ab2Jeff Sharkey public int hashCode() { 318d82b26b58a0950a0dd3522e630bd87fe85290ab2Jeff Sharkey return Objects.hash(authority, rootId); 319d82b26b58a0950a0dd3522e630bd87fe85290ab2Jeff Sharkey } 320d82b26b58a0950a0dd3522e630bd87fe85290ab2Jeff Sharkey 32131e104f83db7dae9e8620ef1d3151f9a580e6dcbSteve McKay @Override 32231e104f83db7dae9e8620ef1d3151f9a580e6dcbSteve McKay public String toString() { 32331e104f83db7dae9e8620ef1d3151f9a580e6dcbSteve McKay return "Root{authority=" + authority + ", rootId=" + rootId + ", title=" + title + "}"; 32431e104f83db7dae9e8620ef1d3151f9a580e6dcbSteve McKay } 32531e104f83db7dae9e8620ef1d3151f9a580e6dcbSteve McKay 326d82b26b58a0950a0dd3522e630bd87fe85290ab2Jeff Sharkey public String getDirectoryString() { 327a35ac2dd16a64014a524d1441fb20d5a02b40836Jeff Sharkey return !TextUtils.isEmpty(summary) ? summary : title; 328d82b26b58a0950a0dd3522e630bd87fe85290ab2Jeff Sharkey } 329724deeb5558a517471e9bf7168b456e6daec62f8Jeff Sharkey} 330