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