1bcf32320e2600e96c8a9e997a8903bfc3893b35eMakoto Onuki/* 2bcf32320e2600e96c8a9e997a8903bfc3893b35eMakoto Onuki * Copyright (C) 2010 The Android Open Source Project 3bcf32320e2600e96c8a9e997a8903bfc3893b35eMakoto Onuki * 4bcf32320e2600e96c8a9e997a8903bfc3893b35eMakoto Onuki * Licensed under the Apache License, Version 2.0 (the "License"); 5bcf32320e2600e96c8a9e997a8903bfc3893b35eMakoto Onuki * you may not use this file except in compliance with the License. 6bcf32320e2600e96c8a9e997a8903bfc3893b35eMakoto Onuki * You may obtain a copy of the License at 7bcf32320e2600e96c8a9e997a8903bfc3893b35eMakoto Onuki * 8bcf32320e2600e96c8a9e997a8903bfc3893b35eMakoto Onuki * http://www.apache.org/licenses/LICENSE-2.0 9bcf32320e2600e96c8a9e997a8903bfc3893b35eMakoto Onuki * 10bcf32320e2600e96c8a9e997a8903bfc3893b35eMakoto Onuki * Unless required by applicable law or agreed to in writing, software 11bcf32320e2600e96c8a9e997a8903bfc3893b35eMakoto Onuki * distributed under the License is distributed on an "AS IS" BASIS, 12bcf32320e2600e96c8a9e997a8903bfc3893b35eMakoto Onuki * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13bcf32320e2600e96c8a9e997a8903bfc3893b35eMakoto Onuki * See the License for the specific language governing permissions and 14bcf32320e2600e96c8a9e997a8903bfc3893b35eMakoto Onuki * limitations under the License. 15bcf32320e2600e96c8a9e997a8903bfc3893b35eMakoto Onuki */ 16bcf32320e2600e96c8a9e997a8903bfc3893b35eMakoto Onuki 17bcf32320e2600e96c8a9e997a8903bfc3893b35eMakoto Onukipackage com.android.email; 18bcf32320e2600e96c8a9e997a8903bfc3893b35eMakoto Onuki 19d1ee5b8fa5fe92df1ded5953a9e3f001b38a1ac7Makoto Onukiimport com.android.email.provider.AttachmentProvider; 20c849936a36424645af73dc307b19778a89d6ee84Makoto Onukiimport com.android.email.provider.ContentCache; 21bcf32320e2600e96c8a9e997a8903bfc3893b35eMakoto Onukiimport com.android.email.provider.EmailProvider; 22a7bc0319a75184ad706bb35c049af107ac3688e6Marc Blankimport com.android.emailcommon.provider.EmailContent; 238a574694606f0e5d781334d0d426fc379c51f3edMarc Blankimport com.android.emailcommon.utility.AttachmentUtilities; 24bcf32320e2600e96c8a9e997a8903bfc3893b35eMakoto Onuki 25bcf32320e2600e96c8a9e997a8903bfc3893b35eMakoto Onukiimport android.content.ContentProvider; 26bcf32320e2600e96c8a9e997a8903bfc3893b35eMakoto Onukiimport android.content.ContentResolver; 27bcf32320e2600e96c8a9e997a8903bfc3893b35eMakoto Onukiimport android.content.ContentValues; 28b8f31d5490eba7f307ee578426020bff2ee528ecMakoto Onukiimport android.content.Context; 292f371e85537a199cfa8a489007916dab56215a6dTodd Kennedyimport android.content.SharedPreferences; 30b8f31d5490eba7f307ee578426020bff2ee528ecMakoto Onukiimport android.content.res.Resources; 3174e094834c6efd3260c717090a89232a892c411bMakoto Onukiimport android.content.res.Resources.Theme; 32bcf32320e2600e96c8a9e997a8903bfc3893b35eMakoto Onukiimport android.database.Cursor; 33bcf32320e2600e96c8a9e997a8903bfc3893b35eMakoto Onukiimport android.net.Uri; 34b8f31d5490eba7f307ee578426020bff2ee528ecMakoto Onukiimport android.test.IsolatedContext; 35b8f31d5490eba7f307ee578426020bff2ee528ecMakoto Onukiimport android.test.RenamingDelegatingContext; 36bcf32320e2600e96c8a9e997a8903bfc3893b35eMakoto Onukiimport android.test.mock.MockContentResolver; 37bcf32320e2600e96c8a9e997a8903bfc3893b35eMakoto Onukiimport android.test.mock.MockContext; 38bcf32320e2600e96c8a9e997a8903bfc3893b35eMakoto Onukiimport android.test.mock.MockCursor; 39bcf32320e2600e96c8a9e997a8903bfc3893b35eMakoto Onuki 40b8f31d5490eba7f307ee578426020bff2ee528ecMakoto Onukiimport java.io.File; 41b8f31d5490eba7f307ee578426020bff2ee528ecMakoto Onuki 42bcf32320e2600e96c8a9e997a8903bfc3893b35eMakoto Onuki/** 43bcf32320e2600e96c8a9e997a8903bfc3893b35eMakoto Onuki * Helper classes (and possibly methods) for database related tests. 44bcf32320e2600e96c8a9e997a8903bfc3893b35eMakoto Onuki */ 45bcf32320e2600e96c8a9e997a8903bfc3893b35eMakoto Onukipublic final class DBTestHelper { 46bcf32320e2600e96c8a9e997a8903bfc3893b35eMakoto Onuki private DBTestHelper() { // Utility class. No instantiation. 47bcf32320e2600e96c8a9e997a8903bfc3893b35eMakoto Onuki } 48bcf32320e2600e96c8a9e997a8903bfc3893b35eMakoto Onuki 49bcf32320e2600e96c8a9e997a8903bfc3893b35eMakoto Onuki /** 50bcf32320e2600e96c8a9e997a8903bfc3893b35eMakoto Onuki * A simple {@link Context} that returns {@link MyProvider} as the email content provider. 51bcf32320e2600e96c8a9e997a8903bfc3893b35eMakoto Onuki */ 52bcf32320e2600e96c8a9e997a8903bfc3893b35eMakoto Onuki public static class MyContext extends MockContext { 53bcf32320e2600e96c8a9e997a8903bfc3893b35eMakoto Onuki private final MockContentResolver mContentResolver; 54bcf32320e2600e96c8a9e997a8903bfc3893b35eMakoto Onuki private final MyProvider mProvider; 55bcf32320e2600e96c8a9e997a8903bfc3893b35eMakoto Onuki 56bcf32320e2600e96c8a9e997a8903bfc3893b35eMakoto Onuki public MyContext() { 57bcf32320e2600e96c8a9e997a8903bfc3893b35eMakoto Onuki mProvider = new MyProvider(); 58bcf32320e2600e96c8a9e997a8903bfc3893b35eMakoto Onuki mContentResolver = new MockContentResolver(); 5931d9acbf0623872f9d4a2b3210b5970854b654c7Marc Blank mContentResolver.addProvider(EmailContent.AUTHORITY, mProvider); 60bcf32320e2600e96c8a9e997a8903bfc3893b35eMakoto Onuki } 61bcf32320e2600e96c8a9e997a8903bfc3893b35eMakoto Onuki 62bcf32320e2600e96c8a9e997a8903bfc3893b35eMakoto Onuki @Override 63bcf32320e2600e96c8a9e997a8903bfc3893b35eMakoto Onuki public ContentResolver getContentResolver() { 64bcf32320e2600e96c8a9e997a8903bfc3893b35eMakoto Onuki return mContentResolver; 65bcf32320e2600e96c8a9e997a8903bfc3893b35eMakoto Onuki } 66bcf32320e2600e96c8a9e997a8903bfc3893b35eMakoto Onuki 67bcf32320e2600e96c8a9e997a8903bfc3893b35eMakoto Onuki public MyProvider getMyProvider() { 68bcf32320e2600e96c8a9e997a8903bfc3893b35eMakoto Onuki return mProvider; 69bcf32320e2600e96c8a9e997a8903bfc3893b35eMakoto Onuki } 70bcf32320e2600e96c8a9e997a8903bfc3893b35eMakoto Onuki } 71bcf32320e2600e96c8a9e997a8903bfc3893b35eMakoto Onuki 72bcf32320e2600e96c8a9e997a8903bfc3893b35eMakoto Onuki /** 73bcf32320e2600e96c8a9e997a8903bfc3893b35eMakoto Onuki * A simply {@link ContentProvider} to mock out {@link ContentProvider#query}. 74bcf32320e2600e96c8a9e997a8903bfc3893b35eMakoto Onuki */ 75bcf32320e2600e96c8a9e997a8903bfc3893b35eMakoto Onuki public static class MyProvider extends ContentProvider { 76bcf32320e2600e96c8a9e997a8903bfc3893b35eMakoto Onuki public Cursor mQueryPresetResult; 77bcf32320e2600e96c8a9e997a8903bfc3893b35eMakoto Onuki public Uri mPassedUri; 78bcf32320e2600e96c8a9e997a8903bfc3893b35eMakoto Onuki public String[] mPassedProjection; 79bcf32320e2600e96c8a9e997a8903bfc3893b35eMakoto Onuki public String mPassedSelection; 80bcf32320e2600e96c8a9e997a8903bfc3893b35eMakoto Onuki public String[] mPassedSelectionArgs; 81bcf32320e2600e96c8a9e997a8903bfc3893b35eMakoto Onuki public String mPassedSortOrder; 82bcf32320e2600e96c8a9e997a8903bfc3893b35eMakoto Onuki 83bcf32320e2600e96c8a9e997a8903bfc3893b35eMakoto Onuki public void reset() { 84bcf32320e2600e96c8a9e997a8903bfc3893b35eMakoto Onuki mQueryPresetResult = null; 85bcf32320e2600e96c8a9e997a8903bfc3893b35eMakoto Onuki mPassedUri = null; 86bcf32320e2600e96c8a9e997a8903bfc3893b35eMakoto Onuki mPassedProjection = null; 87bcf32320e2600e96c8a9e997a8903bfc3893b35eMakoto Onuki mPassedSelection = null; 88bcf32320e2600e96c8a9e997a8903bfc3893b35eMakoto Onuki mPassedSelectionArgs = null; 89bcf32320e2600e96c8a9e997a8903bfc3893b35eMakoto Onuki mPassedSortOrder = null; 90bcf32320e2600e96c8a9e997a8903bfc3893b35eMakoto Onuki } 91bcf32320e2600e96c8a9e997a8903bfc3893b35eMakoto Onuki 92bcf32320e2600e96c8a9e997a8903bfc3893b35eMakoto Onuki @Override 93bcf32320e2600e96c8a9e997a8903bfc3893b35eMakoto Onuki public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, 94bcf32320e2600e96c8a9e997a8903bfc3893b35eMakoto Onuki String sortOrder) { 95bcf32320e2600e96c8a9e997a8903bfc3893b35eMakoto Onuki mPassedUri = uri; 96bcf32320e2600e96c8a9e997a8903bfc3893b35eMakoto Onuki mPassedProjection = projection; 97bcf32320e2600e96c8a9e997a8903bfc3893b35eMakoto Onuki mPassedSelection = selection; 98bcf32320e2600e96c8a9e997a8903bfc3893b35eMakoto Onuki mPassedSelectionArgs = selectionArgs; 99bcf32320e2600e96c8a9e997a8903bfc3893b35eMakoto Onuki mPassedSortOrder = sortOrder; 100bcf32320e2600e96c8a9e997a8903bfc3893b35eMakoto Onuki return mQueryPresetResult; 101bcf32320e2600e96c8a9e997a8903bfc3893b35eMakoto Onuki } 102bcf32320e2600e96c8a9e997a8903bfc3893b35eMakoto Onuki 103bcf32320e2600e96c8a9e997a8903bfc3893b35eMakoto Onuki @Override 104bcf32320e2600e96c8a9e997a8903bfc3893b35eMakoto Onuki public int delete(Uri uri, String selection, String[] selectionArgs) { 105bcf32320e2600e96c8a9e997a8903bfc3893b35eMakoto Onuki throw new UnsupportedOperationException(); 106bcf32320e2600e96c8a9e997a8903bfc3893b35eMakoto Onuki } 107bcf32320e2600e96c8a9e997a8903bfc3893b35eMakoto Onuki 108bcf32320e2600e96c8a9e997a8903bfc3893b35eMakoto Onuki @Override 109bcf32320e2600e96c8a9e997a8903bfc3893b35eMakoto Onuki public String getType(Uri uri) { 110bcf32320e2600e96c8a9e997a8903bfc3893b35eMakoto Onuki throw new UnsupportedOperationException(); 111bcf32320e2600e96c8a9e997a8903bfc3893b35eMakoto Onuki } 112bcf32320e2600e96c8a9e997a8903bfc3893b35eMakoto Onuki 113bcf32320e2600e96c8a9e997a8903bfc3893b35eMakoto Onuki @Override 114bcf32320e2600e96c8a9e997a8903bfc3893b35eMakoto Onuki public Uri insert(Uri uri, ContentValues values) { 115bcf32320e2600e96c8a9e997a8903bfc3893b35eMakoto Onuki throw new UnsupportedOperationException(); 116bcf32320e2600e96c8a9e997a8903bfc3893b35eMakoto Onuki } 117bcf32320e2600e96c8a9e997a8903bfc3893b35eMakoto Onuki 118bcf32320e2600e96c8a9e997a8903bfc3893b35eMakoto Onuki @Override 119bcf32320e2600e96c8a9e997a8903bfc3893b35eMakoto Onuki public boolean onCreate() { 120bcf32320e2600e96c8a9e997a8903bfc3893b35eMakoto Onuki throw new UnsupportedOperationException(); 121bcf32320e2600e96c8a9e997a8903bfc3893b35eMakoto Onuki } 122bcf32320e2600e96c8a9e997a8903bfc3893b35eMakoto Onuki 123bcf32320e2600e96c8a9e997a8903bfc3893b35eMakoto Onuki @Override 124bcf32320e2600e96c8a9e997a8903bfc3893b35eMakoto Onuki public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) { 125bcf32320e2600e96c8a9e997a8903bfc3893b35eMakoto Onuki throw new UnsupportedOperationException(); 126bcf32320e2600e96c8a9e997a8903bfc3893b35eMakoto Onuki } 127bcf32320e2600e96c8a9e997a8903bfc3893b35eMakoto Onuki } 128bcf32320e2600e96c8a9e997a8903bfc3893b35eMakoto Onuki 129bcf32320e2600e96c8a9e997a8903bfc3893b35eMakoto Onuki /** 130bcf32320e2600e96c8a9e997a8903bfc3893b35eMakoto Onuki * Simple {@link MockCursor} subclass that implements common methods. 131bcf32320e2600e96c8a9e997a8903bfc3893b35eMakoto Onuki */ 132bcf32320e2600e96c8a9e997a8903bfc3893b35eMakoto Onuki public static class EasyMockCursor extends MockCursor { 133bcf32320e2600e96c8a9e997a8903bfc3893b35eMakoto Onuki public int mCount; 134bcf32320e2600e96c8a9e997a8903bfc3893b35eMakoto Onuki public boolean mClosed; 135bcf32320e2600e96c8a9e997a8903bfc3893b35eMakoto Onuki 136bcf32320e2600e96c8a9e997a8903bfc3893b35eMakoto Onuki public EasyMockCursor(int count) { 137bcf32320e2600e96c8a9e997a8903bfc3893b35eMakoto Onuki mCount = count; 138bcf32320e2600e96c8a9e997a8903bfc3893b35eMakoto Onuki } 139bcf32320e2600e96c8a9e997a8903bfc3893b35eMakoto Onuki 140bcf32320e2600e96c8a9e997a8903bfc3893b35eMakoto Onuki @Override 141bcf32320e2600e96c8a9e997a8903bfc3893b35eMakoto Onuki public int getCount() { 142bcf32320e2600e96c8a9e997a8903bfc3893b35eMakoto Onuki return mCount; 143bcf32320e2600e96c8a9e997a8903bfc3893b35eMakoto Onuki } 144bcf32320e2600e96c8a9e997a8903bfc3893b35eMakoto Onuki 145bcf32320e2600e96c8a9e997a8903bfc3893b35eMakoto Onuki @Override 146bcf32320e2600e96c8a9e997a8903bfc3893b35eMakoto Onuki public void close() { 147bcf32320e2600e96c8a9e997a8903bfc3893b35eMakoto Onuki mClosed = true; 148bcf32320e2600e96c8a9e997a8903bfc3893b35eMakoto Onuki } 149bcf32320e2600e96c8a9e997a8903bfc3893b35eMakoto Onuki } 150b8f31d5490eba7f307ee578426020bff2ee528ecMakoto Onuki 151b8f31d5490eba7f307ee578426020bff2ee528ecMakoto Onuki /** 152b8f31d5490eba7f307ee578426020bff2ee528ecMakoto Onuki * This class has only one method, that creats an isolated {@link Context} similar to what 153b8f31d5490eba7f307ee578426020bff2ee528ecMakoto Onuki * {@link android.test.ProviderTestCase2} provides. 154b8f31d5490eba7f307ee578426020bff2ee528ecMakoto Onuki * 155b8f31d5490eba7f307ee578426020bff2ee528ecMakoto Onuki * The method also creates a {@link ContentProvider} of {@code providerClass}, and add it to 156b8f31d5490eba7f307ee578426020bff2ee528ecMakoto Onuki * the context. See the javadoc on android.test.ProviderTestCase2 for the details. 157b8f31d5490eba7f307ee578426020bff2ee528ecMakoto Onuki */ 158b8f31d5490eba7f307ee578426020bff2ee528ecMakoto Onuki public static class ProviderContextSetupHelper { 159b8f31d5490eba7f307ee578426020bff2ee528ecMakoto Onuki // Based on ProviderTestCase2.MockContext2. 160b8f31d5490eba7f307ee578426020bff2ee528ecMakoto Onuki private static class MockContext2 extends MockContext { 161b8f31d5490eba7f307ee578426020bff2ee528ecMakoto Onuki private final Context mBaseContext; 162b8f31d5490eba7f307ee578426020bff2ee528ecMakoto Onuki 163b8f31d5490eba7f307ee578426020bff2ee528ecMakoto Onuki public MockContext2(Context baseContext) { 164b8f31d5490eba7f307ee578426020bff2ee528ecMakoto Onuki mBaseContext = baseContext; 165b8f31d5490eba7f307ee578426020bff2ee528ecMakoto Onuki } 166b8f31d5490eba7f307ee578426020bff2ee528ecMakoto Onuki 167b8f31d5490eba7f307ee578426020bff2ee528ecMakoto Onuki @Override 168b8f31d5490eba7f307ee578426020bff2ee528ecMakoto Onuki public Resources getResources() { 169b8f31d5490eba7f307ee578426020bff2ee528ecMakoto Onuki return mBaseContext.getResources(); 170b8f31d5490eba7f307ee578426020bff2ee528ecMakoto Onuki } 171b8f31d5490eba7f307ee578426020bff2ee528ecMakoto Onuki 172b8f31d5490eba7f307ee578426020bff2ee528ecMakoto Onuki @Override 173b8f31d5490eba7f307ee578426020bff2ee528ecMakoto Onuki public File getDir(String name, int mode) { 174b8f31d5490eba7f307ee578426020bff2ee528ecMakoto Onuki return mBaseContext.getDir("mockcontext2_" + name, mode); 175b8f31d5490eba7f307ee578426020bff2ee528ecMakoto Onuki } 176b8f31d5490eba7f307ee578426020bff2ee528ecMakoto Onuki } 177b8f31d5490eba7f307ee578426020bff2ee528ecMakoto Onuki 178b8f31d5490eba7f307ee578426020bff2ee528ecMakoto Onuki /** {@link IsolatedContext} + getApplicationContext() */ 179b8f31d5490eba7f307ee578426020bff2ee528ecMakoto Onuki private static class MyIsolatedContext extends IsolatedContext { 18074e094834c6efd3260c717090a89232a892c411bMakoto Onuki private final Context mRealContext; 18174e094834c6efd3260c717090a89232a892c411bMakoto Onuki 18274e094834c6efd3260c717090a89232a892c411bMakoto Onuki public MyIsolatedContext(ContentResolver resolver, Context targetContext, 18374e094834c6efd3260c717090a89232a892c411bMakoto Onuki Context realContext) { 184b8f31d5490eba7f307ee578426020bff2ee528ecMakoto Onuki super(resolver, targetContext); 18574e094834c6efd3260c717090a89232a892c411bMakoto Onuki mRealContext = realContext; 186b8f31d5490eba7f307ee578426020bff2ee528ecMakoto Onuki } 187b8f31d5490eba7f307ee578426020bff2ee528ecMakoto Onuki 188b8f31d5490eba7f307ee578426020bff2ee528ecMakoto Onuki @Override 189b8f31d5490eba7f307ee578426020bff2ee528ecMakoto Onuki public Context getApplicationContext() { 190b8f31d5490eba7f307ee578426020bff2ee528ecMakoto Onuki return this; 191b8f31d5490eba7f307ee578426020bff2ee528ecMakoto Onuki } 19274e094834c6efd3260c717090a89232a892c411bMakoto Onuki 19374e094834c6efd3260c717090a89232a892c411bMakoto Onuki // Following methods are not supported by the mock context. 19474e094834c6efd3260c717090a89232a892c411bMakoto Onuki // Redirect to the actual context. 19574e094834c6efd3260c717090a89232a892c411bMakoto Onuki @Override 19674e094834c6efd3260c717090a89232a892c411bMakoto Onuki public String getPackageName() { 19774e094834c6efd3260c717090a89232a892c411bMakoto Onuki return mRealContext.getPackageName(); 19874e094834c6efd3260c717090a89232a892c411bMakoto Onuki } 19974e094834c6efd3260c717090a89232a892c411bMakoto Onuki 20074e094834c6efd3260c717090a89232a892c411bMakoto Onuki @Override 20174e094834c6efd3260c717090a89232a892c411bMakoto Onuki public Theme getTheme() { 20274e094834c6efd3260c717090a89232a892c411bMakoto Onuki return mRealContext.getTheme(); 20374e094834c6efd3260c717090a89232a892c411bMakoto Onuki } 2042f371e85537a199cfa8a489007916dab56215a6dTodd Kennedy 2052f371e85537a199cfa8a489007916dab56215a6dTodd Kennedy @Override 2062f371e85537a199cfa8a489007916dab56215a6dTodd Kennedy public SharedPreferences getSharedPreferences(String name, int mode) { 2072f371e85537a199cfa8a489007916dab56215a6dTodd Kennedy return new MockSharedPreferences(); 2082f371e85537a199cfa8a489007916dab56215a6dTodd Kennedy } 209369905c95d8b069205f30726edc54122e6bc388fMakoto Onuki 210369905c95d8b069205f30726edc54122e6bc388fMakoto Onuki @Override 211369905c95d8b069205f30726edc54122e6bc388fMakoto Onuki public Object getSystemService(String name) { 212369905c95d8b069205f30726edc54122e6bc388fMakoto Onuki if (Context.LAYOUT_INFLATER_SERVICE.equals(name)) { 213369905c95d8b069205f30726edc54122e6bc388fMakoto Onuki return mRealContext.getSystemService(name); 214369905c95d8b069205f30726edc54122e6bc388fMakoto Onuki } 215369905c95d8b069205f30726edc54122e6bc388fMakoto Onuki return super.getSystemService(name); 216369905c95d8b069205f30726edc54122e6bc388fMakoto Onuki } 217b8f31d5490eba7f307ee578426020bff2ee528ecMakoto Onuki } 218b8f31d5490eba7f307ee578426020bff2ee528ecMakoto Onuki 219c849936a36424645af73dc307b19778a89d6ee84Makoto Onuki /** 220c849936a36424645af73dc307b19778a89d6ee84Makoto Onuki * Return {@link Context} with isolated EmailProvider and AttachmentProvider. This method 221c849936a36424645af73dc307b19778a89d6ee84Makoto Onuki * also invalidates the DB cache. 222c849936a36424645af73dc307b19778a89d6ee84Makoto Onuki */ 223d1ee5b8fa5fe92df1ded5953a9e3f001b38a1ac7Makoto Onuki public static Context getProviderContext(Context context) throws Exception { 224b8f31d5490eba7f307ee578426020bff2ee528ecMakoto Onuki MockContentResolver resolver = new MockContentResolver(); 225b8f31d5490eba7f307ee578426020bff2ee528ecMakoto Onuki final String filenamePrefix = "test."; 226b8f31d5490eba7f307ee578426020bff2ee528ecMakoto Onuki RenamingDelegatingContext targetContextWrapper = new RenamingDelegatingContext( 227b8f31d5490eba7f307ee578426020bff2ee528ecMakoto Onuki new MockContext2(context), // The context that most methods are delegated to 228b8f31d5490eba7f307ee578426020bff2ee528ecMakoto Onuki context, // The context that file methods are delegated to 229b8f31d5490eba7f307ee578426020bff2ee528ecMakoto Onuki filenamePrefix); 23074e094834c6efd3260c717090a89232a892c411bMakoto Onuki final Context providerContext = new MyIsolatedContext(resolver, targetContextWrapper, 23174e094834c6efd3260c717090a89232a892c411bMakoto Onuki context); 232b8f31d5490eba7f307ee578426020bff2ee528ecMakoto Onuki providerContext.getContentResolver(); 233b8f31d5490eba7f307ee578426020bff2ee528ecMakoto Onuki 234d1ee5b8fa5fe92df1ded5953a9e3f001b38a1ac7Makoto Onuki // register EmailProvider and AttachmentProvider. 235d1ee5b8fa5fe92df1ded5953a9e3f001b38a1ac7Makoto Onuki final EmailProvider ep = new EmailProvider(); 236d1ee5b8fa5fe92df1ded5953a9e3f001b38a1ac7Makoto Onuki ep.attachInfo(providerContext, null); 237d1ee5b8fa5fe92df1ded5953a9e3f001b38a1ac7Makoto Onuki resolver.addProvider(EmailContent.AUTHORITY, ep); 238d1ee5b8fa5fe92df1ded5953a9e3f001b38a1ac7Makoto Onuki 239d1ee5b8fa5fe92df1ded5953a9e3f001b38a1ac7Makoto Onuki final AttachmentProvider ap = new AttachmentProvider(); 240d1ee5b8fa5fe92df1ded5953a9e3f001b38a1ac7Makoto Onuki ap.attachInfo(providerContext, null); 2418a574694606f0e5d781334d0d426fc379c51f3edMarc Blank resolver.addProvider(AttachmentUtilities.AUTHORITY, ap); 242c849936a36424645af73dc307b19778a89d6ee84Makoto Onuki 2436e418aa41a17136be0dddb816d843428a0a1e722Marc Blank ContentCache.invalidateAllCaches(); 244c849936a36424645af73dc307b19778a89d6ee84Makoto Onuki 245b8f31d5490eba7f307ee578426020bff2ee528ecMakoto Onuki return providerContext; 246b8f31d5490eba7f307ee578426020bff2ee528ecMakoto Onuki } 247b8f31d5490eba7f307ee578426020bff2ee528ecMakoto Onuki } 248bcf32320e2600e96c8a9e997a8903bfc3893b35eMakoto Onuki} 249