1248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank/*******************************************************************************
2248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank *      Copyright (C) 2012 Google Inc.
3248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank *      Licensed to The Android Open Source Project.
4248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank *
5248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank *      Licensed under the Apache License, Version 2.0 (the "License");
6248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank *      you may not use this file except in compliance with the License.
7248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank *      You may obtain a copy of the License at
8248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank *
9248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank *           http://www.apache.org/licenses/LICENSE-2.0
10248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank *
11248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank *      Unless required by applicable law or agreed to in writing, software
12248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank *      distributed under the License is distributed on an "AS IS" BASIS,
13248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank *      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank *      See the License for the specific language governing permissions and
15248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank *      limitations under the License.
16248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank *******************************************************************************/
17248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank
18248b1b49455785aa2fa426bc28090547abfcb01aMarc Blankpackage com.android.mail.browse;
19248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank
20248b1b49455785aa2fa426bc28090547abfcb01aMarc Blankimport android.content.ContentProvider;
21248b1b49455785aa2fa426bc28090547abfcb01aMarc Blankimport android.content.ContentValues;
22248b1b49455785aa2fa426bc28090547abfcb01aMarc Blankimport android.content.Context;
23248b1b49455785aa2fa426bc28090547abfcb01aMarc Blankimport android.content.UriMatcher;
24248b1b49455785aa2fa426bc28090547abfcb01aMarc Blankimport android.database.Cursor;
25248b1b49455785aa2fa426bc28090547abfcb01aMarc Blankimport android.database.MatrixCursor;
26248b1b49455785aa2fa426bc28090547abfcb01aMarc Blankimport android.net.Uri;
27248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank
28384b8de1a1e18b29fe392151b06ce6fbe07be4bdScott Kennedyimport com.android.mail.utils.MatrixCursorWithCachedColumns;
29384b8de1a1e18b29fe392151b06ce6fbe07be4bdScott Kennedy
30248b1b49455785aa2fa426bc28090547abfcb01aMarc Blankimport java.util.ArrayList;
31248b1b49455785aa2fa426bc28090547abfcb01aMarc Blankimport java.util.HashMap;
32248b1b49455785aa2fa426bc28090547abfcb01aMarc Blankimport java.util.Map.Entry;
33384b8de1a1e18b29fe392151b06ce6fbe07be4bdScott Kennedyimport java.util.Set;
34248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank
35248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank/**
36248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank * TestProvider is a ContentProvider that can be used to simulate the storage and retrieval of
37248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank * rows from any ContentProvider, even if that provider does not exist in the caller's package.
38248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank *
39248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank * It is specifically designed to enable testing of sync adapters that create
40248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank * ContentProviderOperations (CPOs) that are then executed using ContentResolver.applyBatch().
41248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank * Why is this useful? Because we can't instantiate CalendarProvider or ContactsProvider from our
42248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank * package, as required by MockContentResolver.addProvider()
43248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank *
44248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank * Usage:
45248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank *
46248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank * ContentResolver.applyBatch(MockProvider.AUTHORITY, batch) will cause the CPOs to be executed,
47248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank * returning an array of ContentProviderResult; in the case of inserts, the result will include
48248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank * a Uri that can be used via query(). Note that the CPOs can contain references to any authority.
49248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank *
50248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank * query() does not allow non-null selection, selectionArgs, or sortOrder arguments; the
51248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank * presence of these will result in an UnsupportedOperationException insert() acts as expected,
52248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank * returning a Uri that can be directly used in a query
53248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank *
54248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank * delete() and update() do not allow non-null selection or selectionArgs arguments; the presence
55248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank * of these will result in an UnsupportedOperationException
56248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank *
57248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank * NOTE: When using any operation other than applyBatch, the Uri to be used must be created with
58248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank * MockProvider.uri(yourUri). This guarantees that the operation is sent to MockProvider
59248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank *
60248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank * NOTE: MockProvider only simulates direct storage/retrieval of rows; it does not (and can not)
61248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank * simulate other actions (e.g. creation of ancillary data) that the actual provider might perform
62248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank *
63248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank * NOTE: See MockProviderTests for usage examples
64248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank **/
65248b1b49455785aa2fa426bc28090547abfcb01aMarc Blankpublic class TestProvider extends ContentProvider {
66248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank    public static final String AUTHORITY = "com.android.mail.mock.provider";
67248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank    /* package */static final UriMatcher sURIMatcher = new UriMatcher(UriMatcher.NO_MATCH);
68248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank
69248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank    /* package */static final int TABLE = 100;
70248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank    /* package */static final int RECORD = 101;
71248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank
72248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank    public static final String ID_COLUMN = "_id";
73248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank
74248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank    public TestProvider() {
75248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank        super();
76248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank    }
77248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank
78248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank    public TestProvider(Context context) {
79248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank        this();
80248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank        attachInfo(context, null);
81248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank    }
82248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank
83248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank    // We'll store our values here
84248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank    private HashMap<String, ContentValues> mMockStore = new HashMap<String, ContentValues>();
85248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank    // And we'll generate new id's from here
86248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank    long mMockId = 1;
87248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank
88248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank    /**
89248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank     * Create a Uri for MockProvider from a given Uri
90248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank     *
91248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank     * @param uri the Uri from which the MockProvider Uri will be created
92248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank     * @return a Uri that can be used with MockProvider
93248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank     */
94248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank    public static Uri uri(Uri uri) {
95248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank        return new Uri.Builder().scheme("content").authority(AUTHORITY)
96248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank                .path(uri.getPath().substring(1)).build();
97248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank    }
98248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank
99248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank    @Override
100248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank    public int delete(Uri uri, String selection, String[] selectionArgs) {
101248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank        if (selection != null || selectionArgs != null) {
102248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank            throw new UnsupportedOperationException();
103248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank        }
104248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank        String path = uri.getPath();
105248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank        if (mMockStore.containsKey(path)) {
106248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank            mMockStore.remove(path);
107248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank            return 1;
108248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank        } else {
109248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank            return 0;
110248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank        }
111248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank    }
112248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank
113248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank    @Override
114248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank    public String getType(Uri uri) {
115248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank        throw new UnsupportedOperationException();
116248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank    }
117248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank
118248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank    @Override
119248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank    public Uri insert(Uri uri, ContentValues values) {
120248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank        // Remove the leading slash
121248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank        String table = uri.getPath().substring(1);
122248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank        long id = mMockId++;
123248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank        Uri newUri = new Uri.Builder().scheme("content").authority(AUTHORITY).path(table)
124248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank                .appendPath(Long.toString(id)).build();
125248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank        // Remember to store the _id
126248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank        values.put(ID_COLUMN, id);
127248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank        mMockStore.put(newUri.getPath(), values);
128248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank        int match = sURIMatcher.match(uri);
129248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank        if (match == UriMatcher.NO_MATCH) {
130248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank            sURIMatcher.addURI(AUTHORITY, table, TABLE);
131248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank            sURIMatcher.addURI(AUTHORITY, table + "/#", RECORD);
132248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank        }
133248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank        return newUri;
134248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank    }
135248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank
136248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank    @Override
137248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank    public boolean onCreate() {
138248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank        return false;
139248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank    }
140248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank
141248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank    @Override
142248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank    public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs,
143248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank            String sortOrder) {
144248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank        if (selection != null || selectionArgs != null || sortOrder != null || projection == null) {
145248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank            throw new UnsupportedOperationException();
146248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank        }
147248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank        final int match = sURIMatcher.match(uri(uri));
148248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank        ArrayList<ContentValues> valuesList = new ArrayList<ContentValues>();
149248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank        switch (match) {
150248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank            case TABLE:
151248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank                Set<Entry<String, ContentValues>> entrySet = mMockStore.entrySet();
152248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank                String prefix = uri.getPath() + "/";
153248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank                for (Entry<String, ContentValues> entry : entrySet) {
154248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank                    if (entry.getKey().startsWith(prefix)) {
155248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank                        valuesList.add(entry.getValue());
156248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank                    }
157248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank                }
158248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank                break;
159248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank            case RECORD:
160248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank                ContentValues values = mMockStore.get(uri.getPath());
161248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank                if (values != null) {
162248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank                    valuesList.add(values);
163248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank                }
164248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank                break;
165248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank            default:
166248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank                throw new IllegalArgumentException("Unknown URI " + uri);
167248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank        }
168384b8de1a1e18b29fe392151b06ce6fbe07be4bdScott Kennedy        MatrixCursor cursor = new MatrixCursorWithCachedColumns(projection, 1);
169248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank        for (ContentValues cv : valuesList) {
170248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank            Object[] rowValues = new Object[projection.length];
171248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank            int i = 0;
172248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank            for (String column : projection) {
173248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank                rowValues[i++] = cv.get(column);
174248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank            }
175248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank            cursor.addRow(rowValues);
176248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank        }
177248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank        return cursor;
178248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank    }
179248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank
180248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank    @Override
181248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank    public int update(Uri uri, ContentValues newValues, String selection, String[] selectionArgs) {
182248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank        if (selection != null || selectionArgs != null) {
183248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank            throw new UnsupportedOperationException();
184248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank        }
185248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank        final int match = sURIMatcher.match(uri(uri));
186248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank        ArrayList<ContentValues> updateValuesList = new ArrayList<ContentValues>();
187248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank        String path = uri.getPath();
188248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank        switch (match) {
189248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank            case TABLE:
190248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank                Set<Entry<String, ContentValues>> entrySet = mMockStore.entrySet();
191248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank                String prefix = path + "/";
192248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank                for (Entry<String, ContentValues> entry : entrySet) {
193248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank                    if (entry.getKey().startsWith(prefix)) {
194248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank                        updateValuesList.add(entry.getValue());
195248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank                    }
196248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank                }
197248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank                break;
198248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank            case RECORD:
199248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank                ContentValues cv = mMockStore.get(path);
200248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank                if (cv != null) {
201248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank                    updateValuesList.add(cv);
202248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank                }
203248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank                break;
204248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank            default:
205248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank                throw new IllegalArgumentException("Unknown URI " + uri);
206248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank        }
207248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank        Set<Entry<String, Object>> newValuesSet = newValues.valueSet();
208248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank        for (Entry<String, Object> entry : newValuesSet) {
209248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank            String key = entry.getKey();
210248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank            Object value = entry.getValue();
211248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank            for (ContentValues targetValues : updateValuesList) {
212248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank                if (value instanceof Integer) {
213248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank                    targetValues.put(key, (Integer) value);
214248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank                } else if (value instanceof Long) {
215248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank                    targetValues.put(key, (Long) value);
216248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank                } else if (value instanceof String) {
217248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank                    targetValues.put(key, (String) value);
218248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank                } else if (value instanceof Boolean) {
219248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank                    targetValues.put(key, (Boolean) value);
220248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank                } else {
221248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank                    throw new IllegalArgumentException();
222248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank                }
223248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank            }
224248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank        }
225248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank        for (ContentValues targetValues : updateValuesList) {
226248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank            switch(match) {
227248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank                case TABLE:
228248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank                    mMockStore.put(path + "/" + targetValues.getAsLong(ID_COLUMN), targetValues);
229248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank                    break;
230248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank                case RECORD:
231248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank                    mMockStore.put(path, targetValues);
232248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank                    break;
233248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank            }
234248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank        }
235248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank        return updateValuesList.size();
236248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank    }
237248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank}
238