133873d2b41a5cd2597b20a4e88eb8942944c0f23Tyler Schultzpackage com.xtremelabs.robolectric.shadows;
244ade170c5bc611222ed25d5b1f8e7745104057dChristian Williams
37b5e903f71127867950ba87f363a491ba5e8306dDiego Garciaimport java.util.HashMap;
47b5e903f71127867950ba87f363a491ba5e8306dDiego Garciaimport java.util.Map;
57b5e903f71127867950ba87f363a491ba5e8306dDiego Garcia
67b5e903f71127867950ba87f363a491ba5e8306dDiego Garciaimport android.content.ContentResolver;
744ade170c5bc611222ed25d5b1f8e7745104057dChristian Williamsimport android.database.AbstractCursor;
8b970da24960c184335a2aba413e3f5bfbbed7825Chris Van Vrankenimport android.database.CursorWindow;
97b5e903f71127867950ba87f363a491ba5e8306dDiego Garciaimport android.net.Uri;
107b5e903f71127867950ba87f363a491ba5e8306dDiego Garcia
1122c22c9aa4ca68c2deac6164edc1d82bc9645310Christian Williams & Phil Goodwinimport com.xtremelabs.robolectric.internal.Implementation;
1222c22c9aa4ca68c2deac6164edc1d82bc9645310Christian Williams & Phil Goodwinimport com.xtremelabs.robolectric.internal.Implements;
1322c22c9aa4ca68c2deac6164edc1d82bc9645310Christian Williams & Phil Goodwinimport com.xtremelabs.robolectric.internal.RealObject;
1444ade170c5bc611222ed25d5b1f8e7745104057dChristian Williams
15b970da24960c184335a2aba413e3f5bfbbed7825Chris Van Vranken
160b378afcde0200166e546c46a7642015accfce49Christian Williams & Ian Fisher@Implements(AbstractCursor.class)
17afe0a89d904a7fe2f5980b9deb26cc3240192459Christian Williamspublic class ShadowAbstractCursor {
18e2623f9312670f0df22c6e6c5f7969bd01d18130Joe Moore & Tyler Schultz    @RealObject
19e2623f9312670f0df22c6e6c5f7969bd01d18130Joe Moore & Tyler Schultz    private AbstractCursor realAbstractCursor;
20e2623f9312670f0df22c6e6c5f7969bd01d18130Joe Moore & Tyler Schultz
21b970da24960c184335a2aba413e3f5bfbbed7825Chris Van Vranken    protected Map<String, Object> currentRow;
22b970da24960c184335a2aba413e3f5bfbbed7825Chris Van Vranken    protected int currentRowNumber = -1;
23b970da24960c184335a2aba413e3f5bfbbed7825Chris Van Vranken    protected Map<String, Integer> columnNames = new HashMap<String, Integer>();
24b970da24960c184335a2aba413e3f5bfbbed7825Chris Van Vranken    protected String[] columnNameArray;
25b970da24960c184335a2aba413e3f5bfbbed7825Chris Van Vranken    protected Map<Integer, Map<String, Object>> rows = new HashMap<Integer, Map<String, Object>>();
26b970da24960c184335a2aba413e3f5bfbbed7825Chris Van Vranken    protected int rowCount;
277b5e903f71127867950ba87f363a491ba5e8306dDiego Garcia    protected Uri notificationUri;
28605fe2e0d79665282551b03424c4552bf9157060Savvas Dalkitsis	protected boolean mClosed;
29e2623f9312670f0df22c6e6c5f7969bd01d18130Joe Moore & Tyler Schultz
30b970da24960c184335a2aba413e3f5bfbbed7825Chris Van Vranken    @Implementation
31e2623f9312670f0df22c6e6c5f7969bd01d18130Joe Moore & Tyler Schultz    public int getCount() {
32b970da24960c184335a2aba413e3f5bfbbed7825Chris Van Vranken        return rowCount;
33b970da24960c184335a2aba413e3f5bfbbed7825Chris Van Vranken    }
34088872bfbd8b60074e647dacaa2804a87bf6d604Jan Berkel
35de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams    @Implementation
36b574da97569d2d098d0aaebbb947bffa8514a4f7Michael Portuesi    public boolean moveToFirst() {
37e2623f9312670f0df22c6e6c5f7969bd01d18130Joe Moore & Tyler Schultz        setPosition(0);
384a7b7902404d0c3743f96c043e3cc6b9069cf438Christian Williams        return realAbstractCursor.getCount() > 0;
3944ade170c5bc611222ed25d5b1f8e7745104057dChristian Williams    }
40088872bfbd8b60074e647dacaa2804a87bf6d604Jan Berkel
410b1cf2dae9f688eaf17eee6ba853ebf5f9b21689adriancowham    @Implementation
420b1cf2dae9f688eaf17eee6ba853ebf5f9b21689adriancowham    public boolean moveToLast() {
430b1cf2dae9f688eaf17eee6ba853ebf5f9b21689adriancowham    	if( realAbstractCursor.getCount() == 0 ) {
440b1cf2dae9f688eaf17eee6ba853ebf5f9b21689adriancowham    		return false;
450b1cf2dae9f688eaf17eee6ba853ebf5f9b21689adriancowham    	}
460b1cf2dae9f688eaf17eee6ba853ebf5f9b21689adriancowham    	setPosition( realAbstractCursor.getCount() - 1 );
470b1cf2dae9f688eaf17eee6ba853ebf5f9b21689adriancowham    	return true;
480b1cf2dae9f688eaf17eee6ba853ebf5f9b21689adriancowham    }
4940c6251719cccc0a84ae99c976d2836b14374ce6Christian Williams
50595a0c838d8e59d44d8aab3d468b71e3dbf43e52Michael Portuesi    @Implementation
51595a0c838d8e59d44d8aab3d468b71e3dbf43e52Michael Portuesi    public int getPosition() {
5240c6251719cccc0a84ae99c976d2836b14374ce6Christian Williams        return currentRowNumber;
53595a0c838d8e59d44d8aab3d468b71e3dbf43e52Michael Portuesi    }
54b970da24960c184335a2aba413e3f5bfbbed7825Chris Van Vranken
55b970da24960c184335a2aba413e3f5bfbbed7825Chris Van Vranken
565c64020aebafacaa7677f81c044ca22cb1694539Michael Portuesi    @Implementation
57e2623f9312670f0df22c6e6c5f7969bd01d18130Joe Moore & Tyler Schultz    public boolean moveToPosition(int pos) {
585c64020aebafacaa7677f81c044ca22cb1694539Michael Portuesi        if (pos >= realAbstractCursor.getCount()) {
595c64020aebafacaa7677f81c044ca22cb1694539Michael Portuesi            return false;
605c64020aebafacaa7677f81c044ca22cb1694539Michael Portuesi        }
61e2623f9312670f0df22c6e6c5f7969bd01d18130Joe Moore & Tyler Schultz
62b970da24960c184335a2aba413e3f5bfbbed7825Chris Van Vranken        setPosition(pos);
635c64020aebafacaa7677f81c044ca22cb1694539Michael Portuesi        return true;
645c64020aebafacaa7677f81c044ca22cb1694539Michael Portuesi    }
65e2623f9312670f0df22c6e6c5f7969bd01d18130Joe Moore & Tyler Schultz
66b970da24960c184335a2aba413e3f5bfbbed7825Chris Van Vranken    /**
67b970da24960c184335a2aba413e3f5bfbbed7825Chris Van Vranken     * Set currentRowNumber(Int) and currentRow (Map)
68e2623f9312670f0df22c6e6c5f7969bd01d18130Joe Moore & Tyler Schultz     *
69b970da24960c184335a2aba413e3f5bfbbed7825Chris Van Vranken     * @param pos = the position to set
70b970da24960c184335a2aba413e3f5bfbbed7825Chris Van Vranken     */
71b970da24960c184335a2aba413e3f5bfbbed7825Chris Van Vranken    private void setPosition(int pos) {
72e2623f9312670f0df22c6e6c5f7969bd01d18130Joe Moore & Tyler Schultz        currentRowNumber = pos;
73e2623f9312670f0df22c6e6c5f7969bd01d18130Joe Moore & Tyler Schultz        if ((-1 == currentRowNumber) || (rowCount == currentRowNumber)) {
74e2623f9312670f0df22c6e6c5f7969bd01d18130Joe Moore & Tyler Schultz            currentRow = null;
75e2623f9312670f0df22c6e6c5f7969bd01d18130Joe Moore & Tyler Schultz        } else {
76e2623f9312670f0df22c6e6c5f7969bd01d18130Joe Moore & Tyler Schultz            currentRow = rows.get(currentRowNumber);
77e2623f9312670f0df22c6e6c5f7969bd01d18130Joe Moore & Tyler Schultz        }
78b970da24960c184335a2aba413e3f5bfbbed7825Chris Van Vranken    }
79e2623f9312670f0df22c6e6c5f7969bd01d18130Joe Moore & Tyler Schultz
80595a0c838d8e59d44d8aab3d468b71e3dbf43e52Michael Portuesi    @Implementation
81b574da97569d2d098d0aaebbb947bffa8514a4f7Michael Portuesi    public boolean moveToNext() {
82bf6a1c2145b187c23b06243ceaa6f85c24498643Lenny Turetsky & Phil Plante        if (currentRowNumber + 1 >= realAbstractCursor.getCount()) {
83bf6a1c2145b187c23b06243ceaa6f85c24498643Lenny Turetsky & Phil Plante            currentRowNumber = realAbstractCursor.getCount();
8440c6251719cccc0a84ae99c976d2836b14374ce6Christian Williams            return false;
8540c6251719cccc0a84ae99c976d2836b14374ce6Christian Williams        }
86b970da24960c184335a2aba413e3f5bfbbed7825Chris Van Vranken        setPosition(++currentRowNumber);
8740c6251719cccc0a84ae99c976d2836b14374ce6Christian Williams        return true;
88595a0c838d8e59d44d8aab3d468b71e3dbf43e52Michael Portuesi    }
89e2623f9312670f0df22c6e6c5f7969bd01d18130Joe Moore & Tyler Schultz
90a18b850f368f1d491b024561e2087569d3c636a8Chris Van Vranken    @Implementation
91a18b850f368f1d491b024561e2087569d3c636a8Chris Van Vranken    public boolean moveToPrevious() {
92a18b850f368f1d491b024561e2087569d3c636a8Chris Van Vranken        if (currentRowNumber < 0 || realAbstractCursor.getCount() == 0) {
93a18b850f368f1d491b024561e2087569d3c636a8Chris Van Vranken            return false;
94a18b850f368f1d491b024561e2087569d3c636a8Chris Van Vranken        }
95a18b850f368f1d491b024561e2087569d3c636a8Chris Van Vranken        setPosition(--currentRowNumber);
96a18b850f368f1d491b024561e2087569d3c636a8Chris Van Vranken        return true;
97a18b850f368f1d491b024561e2087569d3c636a8Chris Van Vranken    }
98e2623f9312670f0df22c6e6c5f7969bd01d18130Joe Moore & Tyler Schultz
99b970da24960c184335a2aba413e3f5bfbbed7825Chris Van Vranken    @Implementation
100b970da24960c184335a2aba413e3f5bfbbed7825Chris Van Vranken    public CursorWindow getWindow() {
101b970da24960c184335a2aba413e3f5bfbbed7825Chris Van Vranken        return null;
102b970da24960c184335a2aba413e3f5bfbbed7825Chris Van Vranken    }
103e2623f9312670f0df22c6e6c5f7969bd01d18130Joe Moore & Tyler Schultz
104b970da24960c184335a2aba413e3f5bfbbed7825Chris Van Vranken    @Implementation
105b970da24960c184335a2aba413e3f5bfbbed7825Chris Van Vranken    public String[] getColumnNames() {
106e2623f9312670f0df22c6e6c5f7969bd01d18130Joe Moore & Tyler Schultz        return columnNameArray;
107b970da24960c184335a2aba413e3f5bfbbed7825Chris Van Vranken    }
108e2623f9312670f0df22c6e6c5f7969bd01d18130Joe Moore & Tyler Schultz
109b970da24960c184335a2aba413e3f5bfbbed7825Chris Van Vranken    @Implementation
110088872bfbd8b60074e647dacaa2804a87bf6d604Jan Berkel    public String getColumnName(int column) {
111088872bfbd8b60074e647dacaa2804a87bf6d604Jan Berkel        return columnNameArray[column];
112088872bfbd8b60074e647dacaa2804a87bf6d604Jan Berkel    }
113088872bfbd8b60074e647dacaa2804a87bf6d604Jan Berkel
114088872bfbd8b60074e647dacaa2804a87bf6d604Jan Berkel    @Implementation
115088872bfbd8b60074e647dacaa2804a87bf6d604Jan Berkel    public int getColumnIndex(String columnName) {
116088872bfbd8b60074e647dacaa2804a87bf6d604Jan Berkel        for (int i=0; i<columnNameArray.length; i++) {
117088872bfbd8b60074e647dacaa2804a87bf6d604Jan Berkel            if (columnName.equals(columnNameArray[i])) return i;
118088872bfbd8b60074e647dacaa2804a87bf6d604Jan Berkel        }
119088872bfbd8b60074e647dacaa2804a87bf6d604Jan Berkel        return -1;
120088872bfbd8b60074e647dacaa2804a87bf6d604Jan Berkel    }
121088872bfbd8b60074e647dacaa2804a87bf6d604Jan Berkel
122088872bfbd8b60074e647dacaa2804a87bf6d604Jan Berkel    @Implementation
123088872bfbd8b60074e647dacaa2804a87bf6d604Jan Berkel    public int getColumnIndexOrThrow(String columnName) {
124088872bfbd8b60074e647dacaa2804a87bf6d604Jan Berkel        int idx = getColumnIndex(columnName);
125088872bfbd8b60074e647dacaa2804a87bf6d604Jan Berkel        if (idx >= 0) return idx; else throw new IllegalArgumentException("column does not exist");
126088872bfbd8b60074e647dacaa2804a87bf6d604Jan Berkel    }
127088872bfbd8b60074e647dacaa2804a87bf6d604Jan Berkel
128088872bfbd8b60074e647dacaa2804a87bf6d604Jan Berkel    @Implementation
129b970da24960c184335a2aba413e3f5bfbbed7825Chris Van Vranken    public int getColumnCount() {
130b970da24960c184335a2aba413e3f5bfbbed7825Chris Van Vranken        return getColumnNames().length;
131e2623f9312670f0df22c6e6c5f7969bd01d18130Joe Moore & Tyler Schultz    }
132e2623f9312670f0df22c6e6c5f7969bd01d18130Joe Moore & Tyler Schultz
1337bf3f1f842b448cd4a422fa0d7e4469d50deb279Michael Portuesi    @Implementation
1347bf3f1f842b448cd4a422fa0d7e4469d50deb279Michael Portuesi    public boolean isFirst() {
135e2623f9312670f0df22c6e6c5f7969bd01d18130Joe Moore & Tyler Schultz        return currentRowNumber == 0;
1367bf3f1f842b448cd4a422fa0d7e4469d50deb279Michael Portuesi    }
137e2623f9312670f0df22c6e6c5f7969bd01d18130Joe Moore & Tyler Schultz
1387bf3f1f842b448cd4a422fa0d7e4469d50deb279Michael Portuesi    @Implementation
1397bf3f1f842b448cd4a422fa0d7e4469d50deb279Michael Portuesi    public boolean isLast() {
140e2623f9312670f0df22c6e6c5f7969bd01d18130Joe Moore & Tyler Schultz        return currentRowNumber == realAbstractCursor.getCount() - 1;
1417bf3f1f842b448cd4a422fa0d7e4469d50deb279Michael Portuesi    }
142e2623f9312670f0df22c6e6c5f7969bd01d18130Joe Moore & Tyler Schultz
1437bf3f1f842b448cd4a422fa0d7e4469d50deb279Michael Portuesi    @Implementation
1447bf3f1f842b448cd4a422fa0d7e4469d50deb279Michael Portuesi    public boolean isBeforeFirst() {
145e2623f9312670f0df22c6e6c5f7969bd01d18130Joe Moore & Tyler Schultz        return currentRowNumber < 0;
1467bf3f1f842b448cd4a422fa0d7e4469d50deb279Michael Portuesi    }
147e2623f9312670f0df22c6e6c5f7969bd01d18130Joe Moore & Tyler Schultz
1487bf3f1f842b448cd4a422fa0d7e4469d50deb279Michael Portuesi    @Implementation
1497bf3f1f842b448cd4a422fa0d7e4469d50deb279Michael Portuesi    public boolean isAfterLast() {
150e2623f9312670f0df22c6e6c5f7969bd01d18130Joe Moore & Tyler Schultz        return currentRowNumber >= realAbstractCursor.getCount();
1517bf3f1f842b448cd4a422fa0d7e4469d50deb279Michael Portuesi    }
1527b5e903f71127867950ba87f363a491ba5e8306dDiego Garcia
1537b5e903f71127867950ba87f363a491ba5e8306dDiego Garcia    @Implementation
1547b5e903f71127867950ba87f363a491ba5e8306dDiego Garcia    public void setNotificationUri(ContentResolver cr, Uri notifyUri) {
1557b5e903f71127867950ba87f363a491ba5e8306dDiego Garcia        notificationUri = notifyUri;
1567b5e903f71127867950ba87f363a491ba5e8306dDiego Garcia    }
1577b5e903f71127867950ba87f363a491ba5e8306dDiego Garcia
158605fe2e0d79665282551b03424c4552bf9157060Savvas Dalkitsis	@Implementation
159605fe2e0d79665282551b03424c4552bf9157060Savvas Dalkitsis	public boolean isClosed() {
160605fe2e0d79665282551b03424c4552bf9157060Savvas Dalkitsis		return mClosed;
161605fe2e0d79665282551b03424c4552bf9157060Savvas Dalkitsis	}
162605fe2e0d79665282551b03424c4552bf9157060Savvas Dalkitsis
163605fe2e0d79665282551b03424c4552bf9157060Savvas Dalkitsis	@Implementation
164605fe2e0d79665282551b03424c4552bf9157060Savvas Dalkitsis	public void close() {
165605fe2e0d79665282551b03424c4552bf9157060Savvas Dalkitsis		mClosed = true;
166605fe2e0d79665282551b03424c4552bf9157060Savvas Dalkitsis	}
167605fe2e0d79665282551b03424c4552bf9157060Savvas Dalkitsis
168605fe2e0d79665282551b03424c4552bf9157060Savvas Dalkitsis	/**
1697b5e903f71127867950ba87f363a491ba5e8306dDiego Garcia     * Returns the Uri set by {@code setNotificationUri()}.  Method included for testing
1707b5e903f71127867950ba87f363a491ba5e8306dDiego Garcia     * pre-API 11 projects.
1717b5e903f71127867950ba87f363a491ba5e8306dDiego Garcia     */
1727b5e903f71127867950ba87f363a491ba5e8306dDiego Garcia    public Uri getNotificationUri_Compatibility() {
1737b5e903f71127867950ba87f363a491ba5e8306dDiego Garcia        return notificationUri;
1747b5e903f71127867950ba87f363a491ba5e8306dDiego Garcia    }
175605fe2e0d79665282551b03424c4552bf9157060Savvas Dalkitsis
176605fe2e0d79665282551b03424c4552bf9157060Savvas Dalkitsis
17709e5078f4b638fae60c67b2e6b8f43cc796574a3Chris Van Vranken}