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 577d433aabb731a790fc8d06d260c826751215113fJoe Malin /* 587d433aabb731a790fc8d06d260c826751215113fJoe Malin * Creates a local map of providers. This map is used instead of the global map when an 597d433aabb731a790fc8d06d260c826751215113fJoe Malin * API call tries to acquire a provider. 607d433aabb731a790fc8d06d260c826751215113fJoe Malin */ 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public MockContentResolver() { 629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super(null); 639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mProviders = Maps.newHashMap(); 649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 667d433aabb731a790fc8d06d260c826751215113fJoe Malin /** 677d433aabb731a790fc8d06d260c826751215113fJoe Malin * Adds access to a provider based on its authority 687d433aabb731a790fc8d06d260c826751215113fJoe Malin * 697d433aabb731a790fc8d06d260c826751215113fJoe Malin * @param name The authority name associated with the provider. 707d433aabb731a790fc8d06d260c826751215113fJoe Malin * @param provider An instance of {@link android.content.ContentProvider} or one of its 717d433aabb731a790fc8d06d260c826751215113fJoe Malin * subclasses, or null. 727d433aabb731a790fc8d06d260c826751215113fJoe Malin */ 739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void addProvider(String name, ContentProvider provider) { 747d433aabb731a790fc8d06d260c826751215113fJoe Malin 757d433aabb731a790fc8d06d260c826751215113fJoe Malin /* 767d433aabb731a790fc8d06d260c826751215113fJoe Malin * Maps the authority to the provider locally. 777d433aabb731a790fc8d06d260c826751215113fJoe Malin */ 789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mProviders.put(name, provider); 799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** @hide */ 829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected IContentProvider acquireProvider(Context context, String name) { 84cca1f0e3476edd09cdd81b075a6b7780a2959b46Dianne Hackborn return acquireExistingProvider(context, name); 85cca1f0e3476edd09cdd81b075a6b7780a2959b46Dianne Hackborn } 86cca1f0e3476edd09cdd81b075a6b7780a2959b46Dianne Hackborn 87cca1f0e3476edd09cdd81b075a6b7780a2959b46Dianne Hackborn /** @hide */ 88cca1f0e3476edd09cdd81b075a6b7780a2959b46Dianne Hackborn @Override 89cca1f0e3476edd09cdd81b075a6b7780a2959b46Dianne Hackborn protected IContentProvider acquireExistingProvider(Context context, String name) { 907d433aabb731a790fc8d06d260c826751215113fJoe Malin 917d433aabb731a790fc8d06d260c826751215113fJoe Malin /* 927d433aabb731a790fc8d06d260c826751215113fJoe Malin * Gets the content provider from the local map 937d433aabb731a790fc8d06d260c826751215113fJoe Malin */ 949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final ContentProvider provider = mProviders.get(name); 957d433aabb731a790fc8d06d260c826751215113fJoe Malin 969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (provider != null) { 979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return provider.getIContentProvider(); 989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** @hide */ 1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean releaseProvider(IContentProvider provider) { 1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 109652b6d1e591f6684cda4b93d4712920f287991b4Dianne Hackborn /** @hide */ 110652b6d1e591f6684cda4b93d4712920f287991b4Dianne Hackborn @Override 111652b6d1e591f6684cda4b93d4712920f287991b4Dianne Hackborn protected IContentProvider acquireUnstableProvider(Context c, String name) { 112652b6d1e591f6684cda4b93d4712920f287991b4Dianne Hackborn return acquireProvider(c, name); 113652b6d1e591f6684cda4b93d4712920f287991b4Dianne Hackborn } 114652b6d1e591f6684cda4b93d4712920f287991b4Dianne Hackborn 115652b6d1e591f6684cda4b93d4712920f287991b4Dianne Hackborn /** @hide */ 116652b6d1e591f6684cda4b93d4712920f287991b4Dianne Hackborn @Override 117652b6d1e591f6684cda4b93d4712920f287991b4Dianne Hackborn public boolean releaseUnstableProvider(IContentProvider icp) { 118652b6d1e591f6684cda4b93d4712920f287991b4Dianne Hackborn return releaseProvider(icp); 119652b6d1e591f6684cda4b93d4712920f287991b4Dianne Hackborn } 120652b6d1e591f6684cda4b93d4712920f287991b4Dianne Hackborn 1216ae8d1821822296df0606c9cd1c46708cc21cb58Dianne Hackborn /** @hide */ 1226ae8d1821822296df0606c9cd1c46708cc21cb58Dianne Hackborn @Override 1236ae8d1821822296df0606c9cd1c46708cc21cb58Dianne Hackborn public void unstableProviderDied(IContentProvider icp) { 1246ae8d1821822296df0606c9cd1c46708cc21cb58Dianne Hackborn } 1256ae8d1821822296df0606c9cd1c46708cc21cb58Dianne Hackborn 1267d433aabb731a790fc8d06d260c826751215113fJoe Malin /** 1277d433aabb731a790fc8d06d260c826751215113fJoe Malin * Overrides {@link android.content.ContentResolver#notifyChange(Uri, ContentObserver, boolean) 1287d433aabb731a790fc8d06d260c826751215113fJoe Malin * ContentResolver.notifChange(Uri, ContentObserver, boolean)}. All parameters are ignored. 1297d433aabb731a790fc8d06d260c826751215113fJoe Malin * The method hides providers linked to MockContentResolver from other observers in the system. 1307d433aabb731a790fc8d06d260c826751215113fJoe Malin * 1317d433aabb731a790fc8d06d260c826751215113fJoe Malin * @param uri (Ignored) The uri of the content provider. 1327d433aabb731a790fc8d06d260c826751215113fJoe Malin * @param observer (Ignored) The observer that originated the change. 1337d433aabb731a790fc8d06d260c826751215113fJoe Malin * @param syncToNetwork (Ignored) If true, attempt to sync the change to the network. 1347d433aabb731a790fc8d06d260c826751215113fJoe Malin */ 1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 1367d433aabb731a790fc8d06d260c826751215113fJoe Malin public void notifyChange(Uri uri, 1377d433aabb731a790fc8d06d260c826751215113fJoe Malin ContentObserver observer, 1387d433aabb731a790fc8d06d260c826751215113fJoe Malin boolean syncToNetwork) { 1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 141