1ae9b51bfa313c51a31af30875a71255d7b6d2e61Jeff Sharkey/*
2ae9b51bfa313c51a31af30875a71255d7b6d2e61Jeff Sharkey * Copyright (C) 2013 The Android Open Source Project
3ae9b51bfa313c51a31af30875a71255d7b6d2e61Jeff Sharkey *
4ae9b51bfa313c51a31af30875a71255d7b6d2e61Jeff Sharkey * Licensed under the Apache License, Version 2.0 (the "License");
5ae9b51bfa313c51a31af30875a71255d7b6d2e61Jeff Sharkey * you may not use this file except in compliance with the License.
6ae9b51bfa313c51a31af30875a71255d7b6d2e61Jeff Sharkey * You may obtain a copy of the License at
7ae9b51bfa313c51a31af30875a71255d7b6d2e61Jeff Sharkey *
8ae9b51bfa313c51a31af30875a71255d7b6d2e61Jeff Sharkey *      http://www.apache.org/licenses/LICENSE-2.0
9ae9b51bfa313c51a31af30875a71255d7b6d2e61Jeff Sharkey *
10ae9b51bfa313c51a31af30875a71255d7b6d2e61Jeff Sharkey * Unless required by applicable law or agreed to in writing, software
11ae9b51bfa313c51a31af30875a71255d7b6d2e61Jeff Sharkey * distributed under the License is distributed on an "AS IS" BASIS,
12ae9b51bfa313c51a31af30875a71255d7b6d2e61Jeff Sharkey * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13ae9b51bfa313c51a31af30875a71255d7b6d2e61Jeff Sharkey * See the License for the specific language governing permissions and
14ae9b51bfa313c51a31af30875a71255d7b6d2e61Jeff Sharkey * limitations under the License.
15ae9b51bfa313c51a31af30875a71255d7b6d2e61Jeff Sharkey */
16ae9b51bfa313c51a31af30875a71255d7b6d2e61Jeff Sharkey
17ae9b51bfa313c51a31af30875a71255d7b6d2e61Jeff Sharkeypackage com.android.documentsui.model;
18ae9b51bfa313c51a31af30875a71255d7b6d2e61Jeff Sharkey
19ae9b51bfa313c51a31af30875a71255d7b6d2e61Jeff Sharkeyimport static com.android.documentsui.model.DocumentInfo.getCursorInt;
20ae9b51bfa313c51a31af30875a71255d7b6d2e61Jeff Sharkeyimport static com.android.documentsui.model.DocumentInfo.getCursorLong;
21ae9b51bfa313c51a31af30875a71255d7b6d2e61Jeff Sharkeyimport static com.android.documentsui.model.DocumentInfo.getCursorString;
22ae9b51bfa313c51a31af30875a71255d7b6d2e61Jeff Sharkey
23ae9b51bfa313c51a31af30875a71255d7b6d2e61Jeff Sharkeyimport android.content.Context;
24ae9b51bfa313c51a31af30875a71255d7b6d2e61Jeff Sharkeyimport android.database.Cursor;
25ae9b51bfa313c51a31af30875a71255d7b6d2e61Jeff Sharkeyimport android.graphics.drawable.Drawable;
26d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkeyimport android.os.Parcel;
27d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkeyimport android.os.Parcelable;
28ae9b51bfa313c51a31af30875a71255d7b6d2e61Jeff Sharkeyimport android.provider.DocumentsContract.Root;
294ec973925fc2cd18f9ec0d0ca5af588564fded27Jeff Sharkeyimport android.text.TextUtils;
30ae9b51bfa313c51a31af30875a71255d7b6d2e61Jeff Sharkey
310b14db3cf5eac43736462999337c9a3efdc1ac81Jeff Sharkeyimport com.android.documentsui.IconUtils;
326d97d3c1a2ebac4e3f32c7e5bc134864ace1c17fJeff Sharkeyimport com.android.documentsui.R;
330b14db3cf5eac43736462999337c9a3efdc1ac81Jeff Sharkey
34d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkeyimport java.io.DataInputStream;
35d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkeyimport java.io.DataOutputStream;
36d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkeyimport java.io.IOException;
37d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkeyimport java.net.ProtocolException;
38251097b3789632000ccdaf7fb7d66a82ff37d882Jeff Sharkeyimport java.util.Objects;
39251097b3789632000ccdaf7fb7d66a82ff37d882Jeff Sharkey
40ae9b51bfa313c51a31af30875a71255d7b6d2e61Jeff Sharkey/**
41ae9b51bfa313c51a31af30875a71255d7b6d2e61Jeff Sharkey * Representation of a {@link Root}.
42ae9b51bfa313c51a31af30875a71255d7b6d2e61Jeff Sharkey */
43d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkeypublic class RootInfo implements Durable, Parcelable {
44d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey    private static final int VERSION_INIT = 1;
456efba22ce510352bb84910d6efc42fecafd31ed7Jeff Sharkey    private static final int VERSION_DROP_TYPE = 2;
46d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey
47ae9b51bfa313c51a31af30875a71255d7b6d2e61Jeff Sharkey    public String authority;
48ae9b51bfa313c51a31af30875a71255d7b6d2e61Jeff Sharkey    public String rootId;
49ae9b51bfa313c51a31af30875a71255d7b6d2e61Jeff Sharkey    public int flags;
50ae9b51bfa313c51a31af30875a71255d7b6d2e61Jeff Sharkey    public int icon;
51ae9b51bfa313c51a31af30875a71255d7b6d2e61Jeff Sharkey    public String title;
52ae9b51bfa313c51a31af30875a71255d7b6d2e61Jeff Sharkey    public String summary;
53ae9b51bfa313c51a31af30875a71255d7b6d2e61Jeff Sharkey    public String documentId;
54ae9b51bfa313c51a31af30875a71255d7b6d2e61Jeff Sharkey    public long availableBytes;
55d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey    public String mimeTypes;
56d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey
57d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey    /** Derived fields that aren't persisted */
58a9ce049db87259e302e2368d2a4a1c11a94fd831Jeff Sharkey    public String derivedPackageName;
59d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey    public String[] derivedMimeTypes;
60d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey    public int derivedIcon;
61d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey
62d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey    public RootInfo() {
63d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey        reset();
64d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey    }
65d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey
66d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey    @Override
67d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey    public void reset() {
68d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey        authority = null;
69d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey        rootId = null;
70d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey        flags = 0;
71d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey        icon = 0;
72d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey        title = null;
73d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey        summary = null;
74d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey        documentId = null;
75d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey        availableBytes = -1;
76d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey        mimeTypes = null;
77d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey
78a9ce049db87259e302e2368d2a4a1c11a94fd831Jeff Sharkey        derivedPackageName = null;
79d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey        derivedMimeTypes = null;
80d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey        derivedIcon = 0;
81d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey    }
82d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey
83d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey    @Override
84d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey    public void read(DataInputStream in) throws IOException {
85d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey        final int version = in.readInt();
86d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey        switch (version) {
876efba22ce510352bb84910d6efc42fecafd31ed7Jeff Sharkey            case VERSION_DROP_TYPE:
88d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey                authority = DurableUtils.readNullableString(in);
89d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey                rootId = DurableUtils.readNullableString(in);
90d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey                flags = in.readInt();
91d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey                icon = in.readInt();
92d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey                title = DurableUtils.readNullableString(in);
93d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey                summary = DurableUtils.readNullableString(in);
94d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey                documentId = DurableUtils.readNullableString(in);
95d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey                availableBytes = in.readLong();
96d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey                mimeTypes = DurableUtils.readNullableString(in);
97d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey                deriveFields();
98d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey                break;
99d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey            default:
100d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey                throw new ProtocolException("Unknown version " + version);
101d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey        }
102d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey    }
103d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey
104d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey    @Override
105d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey    public void write(DataOutputStream out) throws IOException {
1066efba22ce510352bb84910d6efc42fecafd31ed7Jeff Sharkey        out.writeInt(VERSION_DROP_TYPE);
107d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey        DurableUtils.writeNullableString(out, authority);
108d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey        DurableUtils.writeNullableString(out, rootId);
109d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey        out.writeInt(flags);
110d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey        out.writeInt(icon);
111d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey        DurableUtils.writeNullableString(out, title);
112d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey        DurableUtils.writeNullableString(out, summary);
113d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey        DurableUtils.writeNullableString(out, documentId);
114d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey        out.writeLong(availableBytes);
115d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey        DurableUtils.writeNullableString(out, mimeTypes);
116d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey    }
117d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey
118d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey    @Override
119d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey    public int describeContents() {
120d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey        return 0;
121d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey    }
122d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey
123d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey    @Override
124d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey    public void writeToParcel(Parcel dest, int flags) {
125d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey        DurableUtils.writeToParcel(dest, this);
126d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey    }
127d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey
128d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey    public static final Creator<RootInfo> CREATOR = new Creator<RootInfo>() {
129d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey        @Override
130d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey        public RootInfo createFromParcel(Parcel in) {
131d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey            final RootInfo root = new RootInfo();
132d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey            DurableUtils.readFromParcel(in, root);
133d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey            return root;
134d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey        }
135d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey
136d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey        @Override
137d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey        public RootInfo[] newArray(int size) {
138d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey            return new RootInfo[size];
139d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey        }
140d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey    };
141ae9b51bfa313c51a31af30875a71255d7b6d2e61Jeff Sharkey
142ae9b51bfa313c51a31af30875a71255d7b6d2e61Jeff Sharkey    public static RootInfo fromRootsCursor(String authority, Cursor cursor) {
143ae9b51bfa313c51a31af30875a71255d7b6d2e61Jeff Sharkey        final RootInfo root = new RootInfo();
144ae9b51bfa313c51a31af30875a71255d7b6d2e61Jeff Sharkey        root.authority = authority;
145ae9b51bfa313c51a31af30875a71255d7b6d2e61Jeff Sharkey        root.rootId = getCursorString(cursor, Root.COLUMN_ROOT_ID);
146ae9b51bfa313c51a31af30875a71255d7b6d2e61Jeff Sharkey        root.flags = getCursorInt(cursor, Root.COLUMN_FLAGS);
147ae9b51bfa313c51a31af30875a71255d7b6d2e61Jeff Sharkey        root.icon = getCursorInt(cursor, Root.COLUMN_ICON);
148ae9b51bfa313c51a31af30875a71255d7b6d2e61Jeff Sharkey        root.title = getCursorString(cursor, Root.COLUMN_TITLE);
149ae9b51bfa313c51a31af30875a71255d7b6d2e61Jeff Sharkey        root.summary = getCursorString(cursor, Root.COLUMN_SUMMARY);
150ae9b51bfa313c51a31af30875a71255d7b6d2e61Jeff Sharkey        root.documentId = getCursorString(cursor, Root.COLUMN_DOCUMENT_ID);
151ae9b51bfa313c51a31af30875a71255d7b6d2e61Jeff Sharkey        root.availableBytes = getCursorLong(cursor, Root.COLUMN_AVAILABLE_BYTES);
152d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey        root.mimeTypes = getCursorString(cursor, Root.COLUMN_MIME_TYPES);
153d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey        root.deriveFields();
154d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey        return root;
155d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey    }
156e37ea6123d1aa3cd3e8804988886b1f6046d79d6Jeff Sharkey
157d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey    private void deriveFields() {
158d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey        derivedMimeTypes = (mimeTypes != null) ? mimeTypes.split("\n") : null;
159e37ea6123d1aa3cd3e8804988886b1f6046d79d6Jeff Sharkey
1606d97d3c1a2ebac4e3f32c7e5bc134864ace1c17fJeff Sharkey        // TODO: remove these special case icons
1616efba22ce510352bb84910d6efc42fecafd31ed7Jeff Sharkey        if (isExternalStorage()) {
162c29dd61cbfc9f073239bdce3f4fe397deae2c623Jeff Sharkey            derivedIcon = R.drawable.ic_root_sdcard;
1636efba22ce510352bb84910d6efc42fecafd31ed7Jeff Sharkey        } else if (isDownloads()) {
164c29dd61cbfc9f073239bdce3f4fe397deae2c623Jeff Sharkey            derivedIcon = R.drawable.ic_root_download;
1656efba22ce510352bb84910d6efc42fecafd31ed7Jeff Sharkey        } else if (isImages()) {
166c29dd61cbfc9f073239bdce3f4fe397deae2c623Jeff Sharkey            derivedIcon = R.drawable.ic_doc_image;
1676efba22ce510352bb84910d6efc42fecafd31ed7Jeff Sharkey        } else if (isVideos()) {
168c29dd61cbfc9f073239bdce3f4fe397deae2c623Jeff Sharkey            derivedIcon = R.drawable.ic_doc_video;
1696efba22ce510352bb84910d6efc42fecafd31ed7Jeff Sharkey        } else if (isAudio()) {
170c29dd61cbfc9f073239bdce3f4fe397deae2c623Jeff Sharkey            derivedIcon = R.drawable.ic_doc_audio;
1716d97d3c1a2ebac4e3f32c7e5bc134864ace1c17fJeff Sharkey        }
1726efba22ce510352bb84910d6efc42fecafd31ed7Jeff Sharkey    }
1736efba22ce510352bb84910d6efc42fecafd31ed7Jeff Sharkey
1746efba22ce510352bb84910d6efc42fecafd31ed7Jeff Sharkey    public boolean isRecents() {
1756efba22ce510352bb84910d6efc42fecafd31ed7Jeff Sharkey        return authority == null && rootId == null;
1766efba22ce510352bb84910d6efc42fecafd31ed7Jeff Sharkey    }
1776efba22ce510352bb84910d6efc42fecafd31ed7Jeff Sharkey
1786efba22ce510352bb84910d6efc42fecafd31ed7Jeff Sharkey    public boolean isExternalStorage() {
1796efba22ce510352bb84910d6efc42fecafd31ed7Jeff Sharkey        return "com.android.externalstorage.documents".equals(authority);
1806efba22ce510352bb84910d6efc42fecafd31ed7Jeff Sharkey    }
1816efba22ce510352bb84910d6efc42fecafd31ed7Jeff Sharkey
1826efba22ce510352bb84910d6efc42fecafd31ed7Jeff Sharkey    public boolean isDownloads() {
1836efba22ce510352bb84910d6efc42fecafd31ed7Jeff Sharkey        return "com.android.providers.downloads.documents".equals(authority);
1846efba22ce510352bb84910d6efc42fecafd31ed7Jeff Sharkey    }
1856efba22ce510352bb84910d6efc42fecafd31ed7Jeff Sharkey
1866efba22ce510352bb84910d6efc42fecafd31ed7Jeff Sharkey    public boolean isImages() {
1876efba22ce510352bb84910d6efc42fecafd31ed7Jeff Sharkey        return "com.android.providers.media.documents".equals(authority)
1886efba22ce510352bb84910d6efc42fecafd31ed7Jeff Sharkey                && "images_root".equals(rootId);
1896efba22ce510352bb84910d6efc42fecafd31ed7Jeff Sharkey    }
1906efba22ce510352bb84910d6efc42fecafd31ed7Jeff Sharkey
1916efba22ce510352bb84910d6efc42fecafd31ed7Jeff Sharkey    public boolean isVideos() {
1926efba22ce510352bb84910d6efc42fecafd31ed7Jeff Sharkey        return "com.android.providers.media.documents".equals(authority)
1936efba22ce510352bb84910d6efc42fecafd31ed7Jeff Sharkey                && "videos_root".equals(rootId);
1946efba22ce510352bb84910d6efc42fecafd31ed7Jeff Sharkey    }
1956efba22ce510352bb84910d6efc42fecafd31ed7Jeff Sharkey
1966efba22ce510352bb84910d6efc42fecafd31ed7Jeff Sharkey    public boolean isAudio() {
1976efba22ce510352bb84910d6efc42fecafd31ed7Jeff Sharkey        return "com.android.providers.media.documents".equals(authority)
1986efba22ce510352bb84910d6efc42fecafd31ed7Jeff Sharkey                && "audio_root".equals(rootId);
199d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey    }
2006d97d3c1a2ebac4e3f32c7e5bc134864ace1c17fJeff Sharkey
201d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey    @Override
202d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey    public String toString() {
2035545f56f7561810187545a1817b6001dd1f9931bJeff Sharkey        return "Root{authority=" + authority + ", rootId=" + rootId + ", title=" + title + "}";
204ae9b51bfa313c51a31af30875a71255d7b6d2e61Jeff Sharkey    }
205ae9b51bfa313c51a31af30875a71255d7b6d2e61Jeff Sharkey
206ae9b51bfa313c51a31af30875a71255d7b6d2e61Jeff Sharkey    public Drawable loadIcon(Context context) {
207d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey        if (derivedIcon != 0) {
20803d30a573b8bc8e169e153a0fffa053ffedcd5eeAlan Viverette            return context.getDrawable(derivedIcon);
2096d97d3c1a2ebac4e3f32c7e5bc134864ace1c17fJeff Sharkey        } else {
2106d97d3c1a2ebac4e3f32c7e5bc134864ace1c17fJeff Sharkey            return IconUtils.loadPackageIcon(context, authority, icon);
2116d97d3c1a2ebac4e3f32c7e5bc134864ace1c17fJeff Sharkey        }
212ae9b51bfa313c51a31af30875a71255d7b6d2e61Jeff Sharkey    }
213251097b3789632000ccdaf7fb7d66a82ff37d882Jeff Sharkey
214cbce47001e15be85b084c36a64c20039a0c4a667Jeff Sharkey    public Drawable loadDrawerIcon(Context context) {
215cbce47001e15be85b084c36a64c20039a0c4a667Jeff Sharkey        if (derivedIcon != 0) {
216cbce47001e15be85b084c36a64c20039a0c4a667Jeff Sharkey            return IconUtils.applyTintColor(context, derivedIcon, R.color.item_root_icon);
217cbce47001e15be85b084c36a64c20039a0c4a667Jeff Sharkey        } else {
218cbce47001e15be85b084c36a64c20039a0c4a667Jeff Sharkey            return IconUtils.loadPackageIcon(context, authority, icon);
219cbce47001e15be85b084c36a64c20039a0c4a667Jeff Sharkey        }
220cbce47001e15be85b084c36a64c20039a0c4a667Jeff Sharkey    }
221cbce47001e15be85b084c36a64c20039a0c4a667Jeff Sharkey
222c29dd61cbfc9f073239bdce3f4fe397deae2c623Jeff Sharkey    public Drawable loadGridIcon(Context context) {
223c29dd61cbfc9f073239bdce3f4fe397deae2c623Jeff Sharkey        if (derivedIcon != 0) {
224cbce47001e15be85b084c36a64c20039a0c4a667Jeff Sharkey            return IconUtils.applyTintAttr(context, derivedIcon,
225c29dd61cbfc9f073239bdce3f4fe397deae2c623Jeff Sharkey                    android.R.attr.textColorPrimaryInverse);
226c29dd61cbfc9f073239bdce3f4fe397deae2c623Jeff Sharkey        } else {
227c29dd61cbfc9f073239bdce3f4fe397deae2c623Jeff Sharkey            return IconUtils.loadPackageIcon(context, authority, icon);
228c29dd61cbfc9f073239bdce3f4fe397deae2c623Jeff Sharkey        }
229c29dd61cbfc9f073239bdce3f4fe397deae2c623Jeff Sharkey    }
230c29dd61cbfc9f073239bdce3f4fe397deae2c623Jeff Sharkey
231c29dd61cbfc9f073239bdce3f4fe397deae2c623Jeff Sharkey    public Drawable loadToolbarIcon(Context context) {
232c29dd61cbfc9f073239bdce3f4fe397deae2c623Jeff Sharkey        if (derivedIcon != 0) {
233cbce47001e15be85b084c36a64c20039a0c4a667Jeff Sharkey            return IconUtils.applyTintAttr(context, derivedIcon,
234c29dd61cbfc9f073239bdce3f4fe397deae2c623Jeff Sharkey                    android.R.attr.colorControlNormal);
235a847d79310320ae8adbedb281123a0f879c2fc6eJeff Sharkey        } else {
236c29dd61cbfc9f073239bdce3f4fe397deae2c623Jeff Sharkey            return IconUtils.loadPackageIcon(context, authority, icon);
237a847d79310320ae8adbedb281123a0f879c2fc6eJeff Sharkey        }
238a847d79310320ae8adbedb281123a0f879c2fc6eJeff Sharkey    }
239a847d79310320ae8adbedb281123a0f879c2fc6eJeff Sharkey
240251097b3789632000ccdaf7fb7d66a82ff37d882Jeff Sharkey    @Override
241251097b3789632000ccdaf7fb7d66a82ff37d882Jeff Sharkey    public boolean equals(Object o) {
242251097b3789632000ccdaf7fb7d66a82ff37d882Jeff Sharkey        if (o instanceof RootInfo) {
243251097b3789632000ccdaf7fb7d66a82ff37d882Jeff Sharkey            final RootInfo root = (RootInfo) o;
244251097b3789632000ccdaf7fb7d66a82ff37d882Jeff Sharkey            return Objects.equals(authority, root.authority) && Objects.equals(rootId, root.rootId);
245251097b3789632000ccdaf7fb7d66a82ff37d882Jeff Sharkey        } else {
246251097b3789632000ccdaf7fb7d66a82ff37d882Jeff Sharkey            return false;
247251097b3789632000ccdaf7fb7d66a82ff37d882Jeff Sharkey        }
248251097b3789632000ccdaf7fb7d66a82ff37d882Jeff Sharkey    }
249251097b3789632000ccdaf7fb7d66a82ff37d882Jeff Sharkey
250251097b3789632000ccdaf7fb7d66a82ff37d882Jeff Sharkey    @Override
251251097b3789632000ccdaf7fb7d66a82ff37d882Jeff Sharkey    public int hashCode() {
252251097b3789632000ccdaf7fb7d66a82ff37d882Jeff Sharkey        return Objects.hash(authority, rootId);
253251097b3789632000ccdaf7fb7d66a82ff37d882Jeff Sharkey    }
254251097b3789632000ccdaf7fb7d66a82ff37d882Jeff Sharkey
255251097b3789632000ccdaf7fb7d66a82ff37d882Jeff Sharkey    public String getDirectoryString() {
2564ec973925fc2cd18f9ec0d0ca5af588564fded27Jeff Sharkey        return !TextUtils.isEmpty(summary) ? summary : title;
257251097b3789632000ccdaf7fb7d66a82ff37d882Jeff Sharkey    }
258ae9b51bfa313c51a31af30875a71255d7b6d2e61Jeff Sharkey}
259