1ef7184a1aa0be5d496a5cb495a0f9e11f342af44Jeff Sharkey/*
2ef7184a1aa0be5d496a5cb495a0f9e11f342af44Jeff Sharkey * Copyright (C) 2013 The Android Open Source Project
3ef7184a1aa0be5d496a5cb495a0f9e11f342af44Jeff Sharkey *
4ef7184a1aa0be5d496a5cb495a0f9e11f342af44Jeff Sharkey * Licensed under the Apache License, Version 2.0 (the "License");
5ef7184a1aa0be5d496a5cb495a0f9e11f342af44Jeff Sharkey * you may not use this file except in compliance with the License.
6ef7184a1aa0be5d496a5cb495a0f9e11f342af44Jeff Sharkey * You may obtain a copy of the License at
7ef7184a1aa0be5d496a5cb495a0f9e11f342af44Jeff Sharkey *
8ef7184a1aa0be5d496a5cb495a0f9e11f342af44Jeff Sharkey *      http://www.apache.org/licenses/LICENSE-2.0
9ef7184a1aa0be5d496a5cb495a0f9e11f342af44Jeff Sharkey *
10ef7184a1aa0be5d496a5cb495a0f9e11f342af44Jeff Sharkey * Unless required by applicable law or agreed to in writing, software
11ef7184a1aa0be5d496a5cb495a0f9e11f342af44Jeff Sharkey * distributed under the License is distributed on an "AS IS" BASIS,
12ef7184a1aa0be5d496a5cb495a0f9e11f342af44Jeff Sharkey * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13ef7184a1aa0be5d496a5cb495a0f9e11f342af44Jeff Sharkey * See the License for the specific language governing permissions and
14ef7184a1aa0be5d496a5cb495a0f9e11f342af44Jeff Sharkey * limitations under the License.
15ef7184a1aa0be5d496a5cb495a0f9e11f342af44Jeff Sharkey */
16ef7184a1aa0be5d496a5cb495a0f9e11f342af44Jeff Sharkey
17ef7184a1aa0be5d496a5cb495a0f9e11f342af44Jeff Sharkeypackage com.android.documentsui;
18ef7184a1aa0be5d496a5cb495a0f9e11f342af44Jeff Sharkey
199bb98f3121e7efa2b232613f89bef99a80d07269Steve McKayimport android.annotation.Nullable;
209efd34e00c5ab7049a2167ca63c089a023255e2bSteve McKayimport android.provider.DocumentsContract.Document;
219bb98f3121e7efa2b232613f89bef99a80d07269Steve McKay
22ae9b51bfa313c51a31af30875a71255d7b6d2e61Jeff Sharkeyimport com.android.documentsui.model.DocumentInfo;
23ef7184a1aa0be5d496a5cb495a0f9e11f342af44Jeff Sharkeyimport com.android.internal.util.Predicate;
24ef7184a1aa0be5d496a5cb495a0f9e11f342af44Jeff Sharkey
25ae9b51bfa313c51a31af30875a71255d7b6d2e61Jeff Sharkeypublic class MimePredicate implements Predicate<DocumentInfo> {
26ef7184a1aa0be5d496a5cb495a0f9e11f342af44Jeff Sharkey    private final String[] mFilters;
27ef7184a1aa0be5d496a5cb495a0f9e11f342af44Jeff Sharkey
289bb98f3121e7efa2b232613f89bef99a80d07269Steve McKay    private static final String APK_TYPE = "application/vnd.android.package-archive";
29f6db154975ef575479ba4ab59d80bcf592288252Jeff Sharkey    /**
30f6db154975ef575479ba4ab59d80bcf592288252Jeff Sharkey     * MIME types that are visual in nature. For example, they should always be
31f6db154975ef575479ba4ab59d80bcf592288252Jeff Sharkey     * shown as thumbnails in list mode.
32f6db154975ef575479ba4ab59d80bcf592288252Jeff Sharkey     */
33f6db154975ef575479ba4ab59d80bcf592288252Jeff Sharkey    public static final String[] VISUAL_MIMES = new String[] { "image/*", "video/*" };
34f6db154975ef575479ba4ab59d80bcf592288252Jeff Sharkey
35ef7184a1aa0be5d496a5cb495a0f9e11f342af44Jeff Sharkey    public MimePredicate(String[] filters) {
36ef7184a1aa0be5d496a5cb495a0f9e11f342af44Jeff Sharkey        mFilters = filters;
37ef7184a1aa0be5d496a5cb495a0f9e11f342af44Jeff Sharkey    }
38ef7184a1aa0be5d496a5cb495a0f9e11f342af44Jeff Sharkey
39ef7184a1aa0be5d496a5cb495a0f9e11f342af44Jeff Sharkey    @Override
40ae9b51bfa313c51a31af30875a71255d7b6d2e61Jeff Sharkey    public boolean apply(DocumentInfo doc) {
41b156f4bf8cdfe475a7116b627d84a281e1a281b7Jeff Sharkey        if (doc.isDirectory()) {
42ef7184a1aa0be5d496a5cb495a0f9e11f342af44Jeff Sharkey            return true;
43ef7184a1aa0be5d496a5cb495a0f9e11f342af44Jeff Sharkey        }
44923396b7720367ec99c889725fddfa556e703971Jeff Sharkey        if (mimeMatches(mFilters, doc.mimeType)) {
45923396b7720367ec99c889725fddfa556e703971Jeff Sharkey            return true;
46923396b7720367ec99c889725fddfa556e703971Jeff Sharkey        }
47923396b7720367ec99c889725fddfa556e703971Jeff Sharkey        return false;
48923396b7720367ec99c889725fddfa556e703971Jeff Sharkey    }
49923396b7720367ec99c889725fddfa556e703971Jeff Sharkey
50923396b7720367ec99c889725fddfa556e703971Jeff Sharkey    public static boolean mimeMatches(String[] filters, String[] tests) {
51923396b7720367ec99c889725fddfa556e703971Jeff Sharkey        if (tests == null) {
52923396b7720367ec99c889725fddfa556e703971Jeff Sharkey            return false;
53923396b7720367ec99c889725fddfa556e703971Jeff Sharkey        }
54923396b7720367ec99c889725fddfa556e703971Jeff Sharkey        for (String test : tests) {
55923396b7720367ec99c889725fddfa556e703971Jeff Sharkey            if (mimeMatches(filters, test)) {
56ef7184a1aa0be5d496a5cb495a0f9e11f342af44Jeff Sharkey                return true;
57ef7184a1aa0be5d496a5cb495a0f9e11f342af44Jeff Sharkey            }
58ef7184a1aa0be5d496a5cb495a0f9e11f342af44Jeff Sharkey        }
59ef7184a1aa0be5d496a5cb495a0f9e11f342af44Jeff Sharkey        return false;
60ef7184a1aa0be5d496a5cb495a0f9e11f342af44Jeff Sharkey    }
61ef7184a1aa0be5d496a5cb495a0f9e11f342af44Jeff Sharkey
62d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey    public static boolean mimeMatches(String filter, String[] tests) {
63d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey        if (tests == null) {
64d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey            return true;
65d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey        }
66d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey        for (String test : tests) {
67d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey            if (mimeMatches(filter, test)) {
68d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey                return true;
69d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey            }
70d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey        }
71d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey        return false;
72d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey    }
73d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey
74923396b7720367ec99c889725fddfa556e703971Jeff Sharkey    public static boolean mimeMatches(String[] filters, String test) {
75923396b7720367ec99c889725fddfa556e703971Jeff Sharkey        if (filters == null) {
76923396b7720367ec99c889725fddfa556e703971Jeff Sharkey            return true;
77923396b7720367ec99c889725fddfa556e703971Jeff Sharkey        }
78923396b7720367ec99c889725fddfa556e703971Jeff Sharkey        for (String filter : filters) {
79ef7184a1aa0be5d496a5cb495a0f9e11f342af44Jeff Sharkey            if (mimeMatches(filter, test)) {
80ef7184a1aa0be5d496a5cb495a0f9e11f342af44Jeff Sharkey                return true;
81ef7184a1aa0be5d496a5cb495a0f9e11f342af44Jeff Sharkey            }
82ef7184a1aa0be5d496a5cb495a0f9e11f342af44Jeff Sharkey        }
83ef7184a1aa0be5d496a5cb495a0f9e11f342af44Jeff Sharkey        return false;
84ef7184a1aa0be5d496a5cb495a0f9e11f342af44Jeff Sharkey    }
85ef7184a1aa0be5d496a5cb495a0f9e11f342af44Jeff Sharkey
86ef7184a1aa0be5d496a5cb495a0f9e11f342af44Jeff Sharkey    public static boolean mimeMatches(String filter, String test) {
87563ee0fbe99c234f3364044cb762a75abbbaa797Jeff Sharkey        if (test == null) {
88a5599ef636e37cb0b6474349936999be1afe6987Jeff Sharkey            return false;
89563ee0fbe99c234f3364044cb762a75abbbaa797Jeff Sharkey        } else if (filter == null || "*/*".equals(filter)) {
90563ee0fbe99c234f3364044cb762a75abbbaa797Jeff Sharkey            return true;
91a5599ef636e37cb0b6474349936999be1afe6987Jeff Sharkey        } else if (filter.equals(test)) {
92ef7184a1aa0be5d496a5cb495a0f9e11f342af44Jeff Sharkey            return true;
93ef7184a1aa0be5d496a5cb495a0f9e11f342af44Jeff Sharkey        } else if (filter.endsWith("/*")) {
94ef7184a1aa0be5d496a5cb495a0f9e11f342af44Jeff Sharkey            return filter.regionMatches(0, test, 0, filter.indexOf('/'));
95ef7184a1aa0be5d496a5cb495a0f9e11f342af44Jeff Sharkey        } else {
96ef7184a1aa0be5d496a5cb495a0f9e11f342af44Jeff Sharkey            return false;
97ef7184a1aa0be5d496a5cb495a0f9e11f342af44Jeff Sharkey        }
98ef7184a1aa0be5d496a5cb495a0f9e11f342af44Jeff Sharkey    }
999bb98f3121e7efa2b232613f89bef99a80d07269Steve McKay
1009bb98f3121e7efa2b232613f89bef99a80d07269Steve McKay    public static boolean isApkType(@Nullable String mimeType) {
1019bb98f3121e7efa2b232613f89bef99a80d07269Steve McKay        return APK_TYPE.equals(mimeType);
1029bb98f3121e7efa2b232613f89bef99a80d07269Steve McKay    }
1039efd34e00c5ab7049a2167ca63c089a023255e2bSteve McKay
1049efd34e00c5ab7049a2167ca63c089a023255e2bSteve McKay    public static boolean isDirectoryType(@Nullable String mimeType) {
1059efd34e00c5ab7049a2167ca63c089a023255e2bSteve McKay        return Document.MIME_TYPE_DIR.equals(mimeType);
1069efd34e00c5ab7049a2167ca63c089a023255e2bSteve McKay    }
107ef7184a1aa0be5d496a5cb495a0f9e11f342af44Jeff Sharkey}
108