19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* 29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2008 The Android Open Source Project 39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License. 69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at 79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and 149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License. 159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage android.test.mock; 189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.ContentProvider; 209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.ContentResolver; 219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.Context; 229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.IContentProvider; 239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.database.ContentObserver; 249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.net.Uri; 259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport com.google.android.collect.Maps; 279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.Map; 299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/** 317d433aabb731a790fc8d06d260c826751215113fJoe Malin * <p> 327d433aabb731a790fc8d06d260c826751215113fJoe Malin * An extension of {@link android.content.ContentResolver} that is designed for 337d433aabb731a790fc8d06d260c826751215113fJoe Malin * testing. 347d433aabb731a790fc8d06d260c826751215113fJoe Malin * </p> 357d433aabb731a790fc8d06d260c826751215113fJoe Malin * <p> 367d433aabb731a790fc8d06d260c826751215113fJoe Malin * MockContentResolver overrides Android's normal way of resolving providers by 377d433aabb731a790fc8d06d260c826751215113fJoe Malin * authority. To have access to a provider based on its authority, users of 387d433aabb731a790fc8d06d260c826751215113fJoe Malin * MockContentResolver first instantiate the provider and 397d433aabb731a790fc8d06d260c826751215113fJoe Malin * use {@link MockContentResolver#addProvider(String, ContentProvider)}. Resolution of an 407d433aabb731a790fc8d06d260c826751215113fJoe Malin * authority occurs entirely within MockContentResolver. 417d433aabb731a790fc8d06d260c826751215113fJoe Malin * </p> 427d433aabb731a790fc8d06d260c826751215113fJoe Malin * <p> 437d433aabb731a790fc8d06d260c826751215113fJoe Malin * Users can also set an authority's entry in the map to null, so that a provider is completely 447d433aabb731a790fc8d06d260c826751215113fJoe Malin * mocked out. 457d433aabb731a790fc8d06d260c826751215113fJoe Malin * </p> 463aef8e1d1b2f0b87d470bcccf37ba4ebb6560c45Joe Fernandez * 473aef8e1d1b2f0b87d470bcccf37ba4ebb6560c45Joe Fernandez * <div class="special reference"> 483aef8e1d1b2f0b87d470bcccf37ba4ebb6560c45Joe Fernandez * <h3>Developer Guides</h3> 493aef8e1d1b2f0b87d470bcccf37ba4ebb6560c45Joe Fernandez * <p>For more information about application testing, read the 503aef8e1d1b2f0b87d470bcccf37ba4ebb6560c45Joe Fernandez * <a href="{@docRoot}guide/topics/testing/index.html">Testing</a> developer guide.</p> 513aef8e1d1b2f0b87d470bcccf37ba4ebb6560c45Joe Fernandez * </div> 529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 537d433aabb731a790fc8d06d260c826751215113fJoe Malin 549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class MockContentResolver extends ContentResolver { 559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Map<String, ContentProvider> mProviders; 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5766a017b63461a22842b3678c9520f803d5ddadfcJeff Sharkey /** 5866a017b63461a22842b3678c9520f803d5ddadfcJeff Sharkey * Creates a local map of providers. This map is used instead of the global 5966a017b63461a22842b3678c9520f803d5ddadfcJeff Sharkey * map when an API call tries to acquire a provider. 607d433aabb731a790fc8d06d260c826751215113fJoe Malin */ 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public MockContentResolver() { 6266a017b63461a22842b3678c9520f803d5ddadfcJeff Sharkey this(null); 6366a017b63461a22842b3678c9520f803d5ddadfcJeff Sharkey } 6466a017b63461a22842b3678c9520f803d5ddadfcJeff Sharkey 6566a017b63461a22842b3678c9520f803d5ddadfcJeff Sharkey /** 6666a017b63461a22842b3678c9520f803d5ddadfcJeff Sharkey * Creates a local map of providers. This map is used instead of the global 6766a017b63461a22842b3678c9520f803d5ddadfcJeff Sharkey * map when an API call tries to acquire a provider. 6866a017b63461a22842b3678c9520f803d5ddadfcJeff Sharkey */ 6966a017b63461a22842b3678c9520f803d5ddadfcJeff Sharkey public MockContentResolver(Context context) { 7066a017b63461a22842b3678c9520f803d5ddadfcJeff Sharkey super(context); 719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mProviders = Maps.newHashMap(); 729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 747d433aabb731a790fc8d06d260c826751215113fJoe Malin /** 757d433aabb731a790fc8d06d260c826751215113fJoe Malin * Adds access to a provider based on its authority 767d433aabb731a790fc8d06d260c826751215113fJoe Malin * 777d433aabb731a790fc8d06d260c826751215113fJoe Malin * @param name The authority name associated with the provider. 787d433aabb731a790fc8d06d260c826751215113fJoe Malin * @param provider An instance of {@link android.content.ContentProvider} or one of its 797d433aabb731a790fc8d06d260c826751215113fJoe Malin * subclasses, or null. 807d433aabb731a790fc8d06d260c826751215113fJoe Malin */ 819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void addProvider(String name, ContentProvider provider) { 827d433aabb731a790fc8d06d260c826751215113fJoe Malin 837d433aabb731a790fc8d06d260c826751215113fJoe Malin /* 847d433aabb731a790fc8d06d260c826751215113fJoe Malin * Maps the authority to the provider locally. 857d433aabb731a790fc8d06d260c826751215113fJoe Malin */ 869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mProviders.put(name, provider); 879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** @hide */ 909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected IContentProvider acquireProvider(Context context, String name) { 92cca1f0e3476edd09cdd81b075a6b7780a2959b46Dianne Hackborn return acquireExistingProvider(context, name); 93cca1f0e3476edd09cdd81b075a6b7780a2959b46Dianne Hackborn } 94cca1f0e3476edd09cdd81b075a6b7780a2959b46Dianne Hackborn 95cca1f0e3476edd09cdd81b075a6b7780a2959b46Dianne Hackborn /** @hide */ 96cca1f0e3476edd09cdd81b075a6b7780a2959b46Dianne Hackborn @Override 97cca1f0e3476edd09cdd81b075a6b7780a2959b46Dianne Hackborn protected IContentProvider acquireExistingProvider(Context context, String name) { 987d433aabb731a790fc8d06d260c826751215113fJoe Malin 997d433aabb731a790fc8d06d260c826751215113fJoe Malin /* 1007d433aabb731a790fc8d06d260c826751215113fJoe Malin * Gets the content provider from the local map 1017d433aabb731a790fc8d06d260c826751215113fJoe Malin */ 1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final ContentProvider provider = mProviders.get(name); 1037d433aabb731a790fc8d06d260c826751215113fJoe Malin 1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (provider != null) { 1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return provider.getIContentProvider(); 1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** @hide */ 1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean releaseProvider(IContentProvider provider) { 1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 117652b6d1e591f6684cda4b93d4712920f287991b4Dianne Hackborn /** @hide */ 118652b6d1e591f6684cda4b93d4712920f287991b4Dianne Hackborn @Override 119652b6d1e591f6684cda4b93d4712920f287991b4Dianne Hackborn protected IContentProvider acquireUnstableProvider(Context c, String name) { 120652b6d1e591f6684cda4b93d4712920f287991b4Dianne Hackborn return acquireProvider(c, name); 121652b6d1e591f6684cda4b93d4712920f287991b4Dianne Hackborn } 122652b6d1e591f6684cda4b93d4712920f287991b4Dianne Hackborn 123652b6d1e591f6684cda4b93d4712920f287991b4Dianne Hackborn /** @hide */ 124652b6d1e591f6684cda4b93d4712920f287991b4Dianne Hackborn @Override 125652b6d1e591f6684cda4b93d4712920f287991b4Dianne Hackborn public boolean releaseUnstableProvider(IContentProvider icp) { 126652b6d1e591f6684cda4b93d4712920f287991b4Dianne Hackborn return releaseProvider(icp); 127652b6d1e591f6684cda4b93d4712920f287991b4Dianne Hackborn } 128652b6d1e591f6684cda4b93d4712920f287991b4Dianne Hackborn 1296ae8d1821822296df0606c9cd1c46708cc21cb58Dianne Hackborn /** @hide */ 1306ae8d1821822296df0606c9cd1c46708cc21cb58Dianne Hackborn @Override 1316ae8d1821822296df0606c9cd1c46708cc21cb58Dianne Hackborn public void unstableProviderDied(IContentProvider icp) { 1326ae8d1821822296df0606c9cd1c46708cc21cb58Dianne Hackborn } 1336ae8d1821822296df0606c9cd1c46708cc21cb58Dianne Hackborn 1347d433aabb731a790fc8d06d260c826751215113fJoe Malin /** 1357d433aabb731a790fc8d06d260c826751215113fJoe Malin * Overrides {@link android.content.ContentResolver#notifyChange(Uri, ContentObserver, boolean) 1367d433aabb731a790fc8d06d260c826751215113fJoe Malin * ContentResolver.notifChange(Uri, ContentObserver, boolean)}. All parameters are ignored. 1377d433aabb731a790fc8d06d260c826751215113fJoe Malin * The method hides providers linked to MockContentResolver from other observers in the system. 1387d433aabb731a790fc8d06d260c826751215113fJoe Malin * 1397d433aabb731a790fc8d06d260c826751215113fJoe Malin * @param uri (Ignored) The uri of the content provider. 1407d433aabb731a790fc8d06d260c826751215113fJoe Malin * @param observer (Ignored) The observer that originated the change. 1417d433aabb731a790fc8d06d260c826751215113fJoe Malin * @param syncToNetwork (Ignored) If true, attempt to sync the change to the network. 1427d433aabb731a790fc8d06d260c826751215113fJoe Malin */ 1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 1447d433aabb731a790fc8d06d260c826751215113fJoe Malin public void notifyChange(Uri uri, 1457d433aabb731a790fc8d06d260c826751215113fJoe Malin ContentObserver observer, 1467d433aabb731a790fc8d06d260c826751215113fJoe Malin boolean syncToNetwork) { 1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 149