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