1d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey/*
2d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey * Copyright (C) 2013 The Android Open Source Project
3d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey *
4d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey * Licensed under the Apache License, Version 2.0 (the "License");
5d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey * you may not use this file except in compliance with the License.
6d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey * You may obtain a copy of the License at
7d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey *
8d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey *      http://www.apache.org/licenses/LICENSE-2.0
9d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey *
10d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey * Unless required by applicable law or agreed to in writing, software
11d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey * distributed under the License is distributed on an "AS IS" BASIS,
12d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey * See the License for the specific language governing permissions and
14d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey * limitations under the License.
15d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey */
16d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey
17d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkeypackage com.android.documentsui;
18d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey
19d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkeyimport static com.android.documentsui.DocumentsActivity.TAG;
205d321d472d9983db52610393e6506e2b2d2da4bfJeff Sharkeyimport static com.android.documentsui.model.DocumentInfo.getCursorLong;
215d321d472d9983db52610393e6506e2b2d2da4bfJeff Sharkeyimport static com.android.documentsui.model.DocumentInfo.getCursorString;
22d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey
23d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkeyimport android.database.AbstractCursor;
24d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkeyimport android.database.Cursor;
25d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkeyimport android.os.Bundle;
26d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkeyimport android.provider.DocumentsContract.Document;
27d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkeyimport android.util.Log;
28d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey
29d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey/**
30d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey * Cursor wrapper that filters MIME types not matching given list.
31d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey */
32d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkeypublic class FilteringCursorWrapper extends AbstractCursor {
33d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey    private final Cursor mCursor;
34d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey
35d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey    private final int[] mPosition;
36d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey    private int mCount;
37d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey
38d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey    public FilteringCursorWrapper(Cursor cursor, String[] acceptMimes) {
396efba22ce510352bb84910d6efc42fecafd31ed7Jeff Sharkey        this(cursor, acceptMimes, null, Long.MIN_VALUE);
404ec973925fc2cd18f9ec0d0ca5af588564fded27Jeff Sharkey    }
414ec973925fc2cd18f9ec0d0ca5af588564fded27Jeff Sharkey
424ec973925fc2cd18f9ec0d0ca5af588564fded27Jeff Sharkey    public FilteringCursorWrapper(Cursor cursor, String[] acceptMimes, String[] rejectMimes) {
436efba22ce510352bb84910d6efc42fecafd31ed7Jeff Sharkey        this(cursor, acceptMimes, rejectMimes, Long.MIN_VALUE);
446efba22ce510352bb84910d6efc42fecafd31ed7Jeff Sharkey    }
456efba22ce510352bb84910d6efc42fecafd31ed7Jeff Sharkey
466efba22ce510352bb84910d6efc42fecafd31ed7Jeff Sharkey    public FilteringCursorWrapper(
476efba22ce510352bb84910d6efc42fecafd31ed7Jeff Sharkey            Cursor cursor, String[] acceptMimes, String[] rejectMimes, long rejectBefore) {
48d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey        mCursor = cursor;
49d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey
50d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey        final int count = cursor.getCount();
51d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey        mPosition = new int[count];
52d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey
53d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey        cursor.moveToPosition(-1);
54e2515ac296d51e188b15790afd1e56b31d965ac8Jeff Sharkey        while (cursor.moveToNext() && mCount < count) {
555d321d472d9983db52610393e6506e2b2d2da4bfJeff Sharkey            final String mimeType = getCursorString(cursor, Document.COLUMN_MIME_TYPE);
565d321d472d9983db52610393e6506e2b2d2da4bfJeff Sharkey            final long lastModified = getCursorLong(cursor, Document.COLUMN_LAST_MODIFIED);
574ec973925fc2cd18f9ec0d0ca5af588564fded27Jeff Sharkey            if (rejectMimes != null && MimePredicate.mimeMatches(rejectMimes, mimeType)) {
584ec973925fc2cd18f9ec0d0ca5af588564fded27Jeff Sharkey                continue;
594ec973925fc2cd18f9ec0d0ca5af588564fded27Jeff Sharkey            }
606efba22ce510352bb84910d6efc42fecafd31ed7Jeff Sharkey            if (lastModified < rejectBefore) {
616efba22ce510352bb84910d6efc42fecafd31ed7Jeff Sharkey                continue;
626efba22ce510352bb84910d6efc42fecafd31ed7Jeff Sharkey            }
63d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey            if (MimePredicate.mimeMatches(acceptMimes, mimeType)) {
64d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey                mPosition[mCount++] = cursor.getPosition();
65d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey            }
66d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey        }
67d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey
68d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey        Log.d(TAG, "Before filtering " + cursor.getCount() + ", after " + mCount);
69d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey    }
70d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey
71d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey    @Override
72d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey    public Bundle getExtras() {
73d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey        return mCursor.getExtras();
74d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey    }
75d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey
76d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey    @Override
77d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey    public void close() {
78d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey        super.close();
79d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey        mCursor.close();
80d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey    }
81d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey
82d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey    @Override
83d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey    public boolean onMove(int oldPosition, int newPosition) {
84d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey        return mCursor.moveToPosition(mPosition[newPosition]);
85d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey    }
86d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey
87d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey    @Override
88d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey    public String[] getColumnNames() {
89d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey        return mCursor.getColumnNames();
90d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey    }
91d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey
92d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey    @Override
93d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey    public int getCount() {
94d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey        return mCount;
95d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey    }
96d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey
97d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey    @Override
98d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey    public double getDouble(int column) {
99d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey        return mCursor.getDouble(column);
100d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey    }
101d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey
102d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey    @Override
103d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey    public float getFloat(int column) {
104d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey        return mCursor.getFloat(column);
105d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey    }
106d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey
107d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey    @Override
108d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey    public int getInt(int column) {
109d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey        return mCursor.getInt(column);
110d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey    }
111d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey
112d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey    @Override
113d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey    public long getLong(int column) {
114d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey        return mCursor.getLong(column);
115d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey    }
116d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey
117d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey    @Override
118d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey    public short getShort(int column) {
119d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey        return mCursor.getShort(column);
120d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey    }
121d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey
122d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey    @Override
123d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey    public String getString(int column) {
124d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey        return mCursor.getString(column);
125d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey    }
126d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey
127d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey    @Override
128d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey    public int getType(int column) {
129d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey        return mCursor.getType(column);
130d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey    }
131d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey
132d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey    @Override
133d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey    public boolean isNull(int column) {
134d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey        return mCursor.isNull(column);
135d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey    }
136d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey}
137