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