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