1 /*
2  * Copyright (C) 2017 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 package com.android.documentsui.base;
17 
18 import static com.android.documentsui.base.DocumentInfo.getCursorInt;
19 import static com.android.documentsui.base.DocumentInfo.getCursorString;
20 
21 import android.database.Cursor;
22 import android.provider.DocumentsContract.Document;
23 
24 import com.android.documentsui.archives.ArchivesProvider;
25 import com.android.documentsui.roots.RootCursorWrapper;
26 
27 import java.util.function.Predicate;
28 
29 /**
30  * Predicates for matching certain types of document records
31  * in {@link Cursor}s.
32  */
33 public final class DocumentFilters {
34 
35     private static int MOVABLE_MASK = Document.FLAG_SUPPORTS_REMOVE
36             | Document.FLAG_SUPPORTS_DELETE
37             | Document.FLAG_SUPPORTS_MOVE;
38 
39     public static final Predicate<Cursor> ANY = (Cursor c) -> { return true; };
40     public static final Predicate<Cursor> VIRTUAL  = DocumentFilters::isVirtual;
41     public static final Predicate<Cursor> NOT_MOVABLE = DocumentFilters::isNotMovable;
42     private static final Predicate<Cursor> O_SHARABLE = DocumentFilters::isSharableInO;
43     private static final Predicate<Cursor> PREO_SHARABLE = DocumentFilters::isSharablePreO;
44 
sharable(Features features)45     public static Predicate<Cursor> sharable(Features features) {
46         return features.isVirtualFilesSharingEnabled()
47                 ? DocumentFilters.O_SHARABLE
48                 : DocumentFilters.PREO_SHARABLE;
49     }
50 
isSharableInO(Cursor c)51     private static boolean isSharableInO(Cursor c) {
52         int flags = getCursorInt(c, Document.COLUMN_FLAGS);
53         String authority = getCursorString(c, RootCursorWrapper.COLUMN_AUTHORITY);
54 
55         return (flags & Document.FLAG_PARTIAL) == 0
56                 && !ArchivesProvider.AUTHORITY.equals(authority);
57     }
58 
59     /**
60      * Filter that passes (returns true) for all files which can be shared in O.
61      */
isSharablePreO(Cursor c)62     private static boolean isSharablePreO(Cursor c) {
63         int flags = getCursorInt(c, Document.COLUMN_FLAGS);
64         String authority = getCursorString(c, RootCursorWrapper.COLUMN_AUTHORITY);
65 
66         return (flags & Document.FLAG_PARTIAL) == 0
67                 && (flags & Document.FLAG_VIRTUAL_DOCUMENT) == 0
68                 && !ArchivesProvider.AUTHORITY.equals(authority);
69     }
70 
71     /**
72      * Filter that passes (returns true) only virtual documents.
73      */
isVirtual(Cursor c)74     private static final boolean isVirtual(Cursor c) {
75         int flags = getCursorInt(c, Document.COLUMN_FLAGS);
76         return (flags & Document.FLAG_VIRTUAL_DOCUMENT) != 0;
77     }
78 
79     /**
80      * Filter that passes (returns true) for files that can not be moved.
81      */
isNotMovable(Cursor c)82     private static final boolean isNotMovable(Cursor c) {
83         int flags = getCursorInt(c, Document.COLUMN_FLAGS);
84         return (flags & MOVABLE_MASK) == 0;
85     }
86 }
87