1251097b3789632000ccdaf7fb7d66a82ff37d882Jeff Sharkey/*
2251097b3789632000ccdaf7fb7d66a82ff37d882Jeff Sharkey * Copyright (C) 2013 The Android Open Source Project
3251097b3789632000ccdaf7fb7d66a82ff37d882Jeff Sharkey *
4251097b3789632000ccdaf7fb7d66a82ff37d882Jeff Sharkey * Licensed under the Apache License, Version 2.0 (the "License");
5251097b3789632000ccdaf7fb7d66a82ff37d882Jeff Sharkey * you may not use this file except in compliance with the License.
6251097b3789632000ccdaf7fb7d66a82ff37d882Jeff Sharkey * You may obtain a copy of the License at
7251097b3789632000ccdaf7fb7d66a82ff37d882Jeff Sharkey *
8251097b3789632000ccdaf7fb7d66a82ff37d882Jeff Sharkey *      http://www.apache.org/licenses/LICENSE-2.0
9251097b3789632000ccdaf7fb7d66a82ff37d882Jeff Sharkey *
10251097b3789632000ccdaf7fb7d66a82ff37d882Jeff Sharkey * Unless required by applicable law or agreed to in writing, software
11251097b3789632000ccdaf7fb7d66a82ff37d882Jeff Sharkey * distributed under the License is distributed on an "AS IS" BASIS,
12251097b3789632000ccdaf7fb7d66a82ff37d882Jeff Sharkey * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13251097b3789632000ccdaf7fb7d66a82ff37d882Jeff Sharkey * See the License for the specific language governing permissions and
14251097b3789632000ccdaf7fb7d66a82ff37d882Jeff Sharkey * limitations under the License.
15251097b3789632000ccdaf7fb7d66a82ff37d882Jeff Sharkey */
16251097b3789632000ccdaf7fb7d66a82ff37d882Jeff Sharkey
17251097b3789632000ccdaf7fb7d66a82ff37d882Jeff Sharkeypackage com.android.documentsui;
18251097b3789632000ccdaf7fb7d66a82ff37d882Jeff Sharkey
19251097b3789632000ccdaf7fb7d66a82ff37d882Jeff Sharkeyimport android.database.AbstractCursor;
20251097b3789632000ccdaf7fb7d66a82ff37d882Jeff Sharkeyimport android.database.Cursor;
21954be0232655d316bc5decbbd35579af902c75c2Jeff Sharkeyimport android.os.Bundle;
22251097b3789632000ccdaf7fb7d66a82ff37d882Jeff Sharkey
23251097b3789632000ccdaf7fb7d66a82ff37d882Jeff Sharkey/**
24251097b3789632000ccdaf7fb7d66a82ff37d882Jeff Sharkey * Cursor wrapper that adds columns to identify which root a document came from.
25251097b3789632000ccdaf7fb7d66a82ff37d882Jeff Sharkey */
26251097b3789632000ccdaf7fb7d66a82ff37d882Jeff Sharkeypublic class RootCursorWrapper extends AbstractCursor {
27251097b3789632000ccdaf7fb7d66a82ff37d882Jeff Sharkey    private final String mAuthority;
28251097b3789632000ccdaf7fb7d66a82ff37d882Jeff Sharkey    private final String mRootId;
29251097b3789632000ccdaf7fb7d66a82ff37d882Jeff Sharkey
30251097b3789632000ccdaf7fb7d66a82ff37d882Jeff Sharkey    private final Cursor mCursor;
31251097b3789632000ccdaf7fb7d66a82ff37d882Jeff Sharkey    private final int mCount;
32251097b3789632000ccdaf7fb7d66a82ff37d882Jeff Sharkey
33251097b3789632000ccdaf7fb7d66a82ff37d882Jeff Sharkey    private final String[] mColumnNames;
34251097b3789632000ccdaf7fb7d66a82ff37d882Jeff Sharkey
35251097b3789632000ccdaf7fb7d66a82ff37d882Jeff Sharkey    private final int mAuthorityIndex;
36251097b3789632000ccdaf7fb7d66a82ff37d882Jeff Sharkey    private final int mRootIdIndex;
37251097b3789632000ccdaf7fb7d66a82ff37d882Jeff Sharkey
38251097b3789632000ccdaf7fb7d66a82ff37d882Jeff Sharkey    public static final String COLUMN_AUTHORITY = "android:authority";
39251097b3789632000ccdaf7fb7d66a82ff37d882Jeff Sharkey    public static final String COLUMN_ROOT_ID = "android:rootId";
40251097b3789632000ccdaf7fb7d66a82ff37d882Jeff Sharkey
41251097b3789632000ccdaf7fb7d66a82ff37d882Jeff Sharkey    public RootCursorWrapper(String authority, String rootId, Cursor cursor, int maxCount) {
42251097b3789632000ccdaf7fb7d66a82ff37d882Jeff Sharkey        mAuthority = authority;
43251097b3789632000ccdaf7fb7d66a82ff37d882Jeff Sharkey        mRootId = rootId;
44251097b3789632000ccdaf7fb7d66a82ff37d882Jeff Sharkey        mCursor = cursor;
45251097b3789632000ccdaf7fb7d66a82ff37d882Jeff Sharkey
46251097b3789632000ccdaf7fb7d66a82ff37d882Jeff Sharkey        final int count = cursor.getCount();
47251097b3789632000ccdaf7fb7d66a82ff37d882Jeff Sharkey        if (maxCount > 0 && count > maxCount) {
48251097b3789632000ccdaf7fb7d66a82ff37d882Jeff Sharkey            mCount = maxCount;
49251097b3789632000ccdaf7fb7d66a82ff37d882Jeff Sharkey        } else {
50251097b3789632000ccdaf7fb7d66a82ff37d882Jeff Sharkey            mCount = count;
51251097b3789632000ccdaf7fb7d66a82ff37d882Jeff Sharkey        }
52251097b3789632000ccdaf7fb7d66a82ff37d882Jeff Sharkey
53251097b3789632000ccdaf7fb7d66a82ff37d882Jeff Sharkey        if (cursor.getColumnIndex(COLUMN_AUTHORITY) != -1
54251097b3789632000ccdaf7fb7d66a82ff37d882Jeff Sharkey                || cursor.getColumnIndex(COLUMN_ROOT_ID) != -1) {
55251097b3789632000ccdaf7fb7d66a82ff37d882Jeff Sharkey            throw new IllegalArgumentException("Cursor contains internal columns!");
56251097b3789632000ccdaf7fb7d66a82ff37d882Jeff Sharkey        }
57251097b3789632000ccdaf7fb7d66a82ff37d882Jeff Sharkey        final String[] before = cursor.getColumnNames();
58251097b3789632000ccdaf7fb7d66a82ff37d882Jeff Sharkey        mColumnNames = new String[before.length + 2];
59251097b3789632000ccdaf7fb7d66a82ff37d882Jeff Sharkey        System.arraycopy(before, 0, mColumnNames, 0, before.length);
60251097b3789632000ccdaf7fb7d66a82ff37d882Jeff Sharkey        mAuthorityIndex = before.length;
61251097b3789632000ccdaf7fb7d66a82ff37d882Jeff Sharkey        mRootIdIndex = before.length + 1;
62251097b3789632000ccdaf7fb7d66a82ff37d882Jeff Sharkey        mColumnNames[mAuthorityIndex] = COLUMN_AUTHORITY;
63251097b3789632000ccdaf7fb7d66a82ff37d882Jeff Sharkey        mColumnNames[mRootIdIndex] = COLUMN_ROOT_ID;
64251097b3789632000ccdaf7fb7d66a82ff37d882Jeff Sharkey    }
65251097b3789632000ccdaf7fb7d66a82ff37d882Jeff Sharkey
66251097b3789632000ccdaf7fb7d66a82ff37d882Jeff Sharkey    @Override
67954be0232655d316bc5decbbd35579af902c75c2Jeff Sharkey    public Bundle getExtras() {
68954be0232655d316bc5decbbd35579af902c75c2Jeff Sharkey        return mCursor.getExtras();
69954be0232655d316bc5decbbd35579af902c75c2Jeff Sharkey    }
70954be0232655d316bc5decbbd35579af902c75c2Jeff Sharkey
71954be0232655d316bc5decbbd35579af902c75c2Jeff Sharkey    @Override
72251097b3789632000ccdaf7fb7d66a82ff37d882Jeff Sharkey    public void close() {
73251097b3789632000ccdaf7fb7d66a82ff37d882Jeff Sharkey        super.close();
74251097b3789632000ccdaf7fb7d66a82ff37d882Jeff Sharkey        mCursor.close();
75251097b3789632000ccdaf7fb7d66a82ff37d882Jeff Sharkey    }
76251097b3789632000ccdaf7fb7d66a82ff37d882Jeff Sharkey
77251097b3789632000ccdaf7fb7d66a82ff37d882Jeff Sharkey    @Override
78251097b3789632000ccdaf7fb7d66a82ff37d882Jeff Sharkey    public boolean onMove(int oldPosition, int newPosition) {
79251097b3789632000ccdaf7fb7d66a82ff37d882Jeff Sharkey        return mCursor.moveToPosition(newPosition);
80251097b3789632000ccdaf7fb7d66a82ff37d882Jeff Sharkey    }
81251097b3789632000ccdaf7fb7d66a82ff37d882Jeff Sharkey
82251097b3789632000ccdaf7fb7d66a82ff37d882Jeff Sharkey    @Override
83251097b3789632000ccdaf7fb7d66a82ff37d882Jeff Sharkey    public String[] getColumnNames() {
84251097b3789632000ccdaf7fb7d66a82ff37d882Jeff Sharkey        return mColumnNames;
85251097b3789632000ccdaf7fb7d66a82ff37d882Jeff Sharkey    }
86251097b3789632000ccdaf7fb7d66a82ff37d882Jeff Sharkey
87251097b3789632000ccdaf7fb7d66a82ff37d882Jeff Sharkey    @Override
88251097b3789632000ccdaf7fb7d66a82ff37d882Jeff Sharkey    public int getCount() {
89251097b3789632000ccdaf7fb7d66a82ff37d882Jeff Sharkey        return mCount;
90251097b3789632000ccdaf7fb7d66a82ff37d882Jeff Sharkey    }
91251097b3789632000ccdaf7fb7d66a82ff37d882Jeff Sharkey
92251097b3789632000ccdaf7fb7d66a82ff37d882Jeff Sharkey    @Override
93251097b3789632000ccdaf7fb7d66a82ff37d882Jeff Sharkey    public double getDouble(int column) {
94251097b3789632000ccdaf7fb7d66a82ff37d882Jeff Sharkey        return mCursor.getDouble(column);
95251097b3789632000ccdaf7fb7d66a82ff37d882Jeff Sharkey    }
96251097b3789632000ccdaf7fb7d66a82ff37d882Jeff Sharkey
97251097b3789632000ccdaf7fb7d66a82ff37d882Jeff Sharkey    @Override
98251097b3789632000ccdaf7fb7d66a82ff37d882Jeff Sharkey    public float getFloat(int column) {
99251097b3789632000ccdaf7fb7d66a82ff37d882Jeff Sharkey        return mCursor.getFloat(column);
100251097b3789632000ccdaf7fb7d66a82ff37d882Jeff Sharkey    }
101251097b3789632000ccdaf7fb7d66a82ff37d882Jeff Sharkey
102251097b3789632000ccdaf7fb7d66a82ff37d882Jeff Sharkey    @Override
103251097b3789632000ccdaf7fb7d66a82ff37d882Jeff Sharkey    public int getInt(int column) {
104251097b3789632000ccdaf7fb7d66a82ff37d882Jeff Sharkey        return mCursor.getInt(column);
105251097b3789632000ccdaf7fb7d66a82ff37d882Jeff Sharkey    }
106251097b3789632000ccdaf7fb7d66a82ff37d882Jeff Sharkey
107251097b3789632000ccdaf7fb7d66a82ff37d882Jeff Sharkey    @Override
108251097b3789632000ccdaf7fb7d66a82ff37d882Jeff Sharkey    public long getLong(int column) {
109251097b3789632000ccdaf7fb7d66a82ff37d882Jeff Sharkey        return mCursor.getLong(column);
110251097b3789632000ccdaf7fb7d66a82ff37d882Jeff Sharkey    }
111251097b3789632000ccdaf7fb7d66a82ff37d882Jeff Sharkey
112251097b3789632000ccdaf7fb7d66a82ff37d882Jeff Sharkey    @Override
113251097b3789632000ccdaf7fb7d66a82ff37d882Jeff Sharkey    public short getShort(int column) {
114251097b3789632000ccdaf7fb7d66a82ff37d882Jeff Sharkey        return mCursor.getShort(column);
115251097b3789632000ccdaf7fb7d66a82ff37d882Jeff Sharkey    }
116251097b3789632000ccdaf7fb7d66a82ff37d882Jeff Sharkey
117251097b3789632000ccdaf7fb7d66a82ff37d882Jeff Sharkey    @Override
118251097b3789632000ccdaf7fb7d66a82ff37d882Jeff Sharkey    public String getString(int column) {
119251097b3789632000ccdaf7fb7d66a82ff37d882Jeff Sharkey        if (column == mAuthorityIndex) {
120251097b3789632000ccdaf7fb7d66a82ff37d882Jeff Sharkey            return mAuthority;
121251097b3789632000ccdaf7fb7d66a82ff37d882Jeff Sharkey        } else if (column == mRootIdIndex) {
122251097b3789632000ccdaf7fb7d66a82ff37d882Jeff Sharkey            return mRootId;
123251097b3789632000ccdaf7fb7d66a82ff37d882Jeff Sharkey        } else {
124251097b3789632000ccdaf7fb7d66a82ff37d882Jeff Sharkey            return mCursor.getString(column);
125251097b3789632000ccdaf7fb7d66a82ff37d882Jeff Sharkey        }
126251097b3789632000ccdaf7fb7d66a82ff37d882Jeff Sharkey    }
127251097b3789632000ccdaf7fb7d66a82ff37d882Jeff Sharkey
128251097b3789632000ccdaf7fb7d66a82ff37d882Jeff Sharkey    @Override
129251097b3789632000ccdaf7fb7d66a82ff37d882Jeff Sharkey    public int getType(int column) {
130251097b3789632000ccdaf7fb7d66a82ff37d882Jeff Sharkey        return mCursor.getType(column);
131251097b3789632000ccdaf7fb7d66a82ff37d882Jeff Sharkey    }
132251097b3789632000ccdaf7fb7d66a82ff37d882Jeff Sharkey
133251097b3789632000ccdaf7fb7d66a82ff37d882Jeff Sharkey    @Override
134251097b3789632000ccdaf7fb7d66a82ff37d882Jeff Sharkey    public boolean isNull(int column) {
135251097b3789632000ccdaf7fb7d66a82ff37d882Jeff Sharkey        return mCursor.isNull(column);
136251097b3789632000ccdaf7fb7d66a82ff37d882Jeff Sharkey    }
137251097b3789632000ccdaf7fb7d66a82ff37d882Jeff Sharkey}
138