/* * Copyright (C) 2009 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of * the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations under * the License. */ package android.pim.vcard; import android.content.ContentResolver; import android.content.ContentValues; import android.content.Entity; import android.content.EntityIterator; import android.database.Cursor; import android.net.Uri; import android.provider.ContactsContract.Contacts; import android.provider.ContactsContract.Data; import android.provider.ContactsContract.RawContacts; import android.test.mock.MockContentResolver; import android.test.mock.MockCursor; import junit.framework.TestCase; import java.util.ArrayList; import java.util.Iterator; import java.util.List; /* package */ public class ExportTestResolver extends MockContentResolver { ExportTestProvider mProvider; public ExportTestResolver(TestCase testCase) { mProvider = new ExportTestProvider(testCase); addProvider(VCardComposer.VCARD_TEST_AUTHORITY, mProvider); addProvider(RawContacts.CONTENT_URI.getAuthority(), mProvider); } public ContactEntry addInputContactEntry() { return mProvider.buildInputEntry(); } } /* package */ class MockEntityIterator implements EntityIterator { List<Entity> mEntityList; Iterator<Entity> mIterator; public MockEntityIterator(List<ContentValues> contentValuesList) { mEntityList = new ArrayList<Entity>(); Entity entity = new Entity(new ContentValues()); for (ContentValues contentValues : contentValuesList) { entity.addSubValue(Data.CONTENT_URI, contentValues); } mEntityList.add(entity); mIterator = mEntityList.iterator(); } public boolean hasNext() { return mIterator.hasNext(); } public Entity next() { return mIterator.next(); } public void remove() { throw new UnsupportedOperationException("remove not supported"); } public void reset() { mIterator = mEntityList.iterator(); } public void close() { } } /** * Represents one contact, which should contain multiple ContentValues like * StructuredName, Email, etc. */ /* package */ class ContactEntry { private final List<ContentValues> mContentValuesList = new ArrayList<ContentValues>(); public ContentValuesBuilder addContentValues(String mimeType) { ContentValues contentValues = new ContentValues(); contentValues.put(Data.MIMETYPE, mimeType); mContentValuesList.add(contentValues); return new ContentValuesBuilder(contentValues); } public List<ContentValues> getList() { return mContentValuesList; } } /* package */ class ExportTestProvider extends MockContentProvider { final private TestCase mTestCase; final private ArrayList<ContactEntry> mContactEntryList = new ArrayList<ContactEntry>(); public ExportTestProvider(TestCase testCase) { mTestCase = testCase; } public ContactEntry buildInputEntry() { ContactEntry contactEntry = new ContactEntry(); mContactEntryList.add(contactEntry); return contactEntry; } /** * <p> * An old method which had existed but was removed from ContentResolver. * </p> * <p> * We still keep using this method since we don't have a propeer way to know * which value in the ContentValue corresponds to the entry in Contacts database. * </p> * <p> * Detail: * There's an easy way to know which index "family name" corresponds to, via * {@link android.provider.ContactsContract}. * FAMILY_NAME equals DATA3, so the corresponding index * for "family name" should be 2 (note that index is 0-origin). * However, we cannot know what the index 2 corresponds to; it may be "family name", * "label" for now, but may be the other some column in the future. We don't have * convenient way to know the original data structure. * </p> */ public EntityIterator queryEntities(Uri uri, String selection, String[] selectionArgs, String sortOrder) { mTestCase.assertTrue(uri != null); mTestCase.assertTrue(ContentResolver.SCHEME_CONTENT.equals(uri.getScheme())); final String authority = uri.getAuthority(); mTestCase.assertTrue(RawContacts.CONTENT_URI.getAuthority().equals(authority)); mTestCase.assertTrue((Data.CONTACT_ID + "=?").equals(selection)); mTestCase.assertEquals(1, selectionArgs.length); final int id = Integer.parseInt(selectionArgs[0]); mTestCase.assertTrue(id >= 0 && id < mContactEntryList.size()); return new MockEntityIterator(mContactEntryList.get(id).getList()); } @Override public Cursor query(Uri uri,String[] projection, String selection, String[] selectionArgs, String sortOrder) { mTestCase.assertTrue(VCardComposer.CONTACTS_TEST_CONTENT_URI.equals(uri)); // In this test, following arguments are not supported. mTestCase.assertNull(selection); mTestCase.assertNull(selectionArgs); mTestCase.assertNull(sortOrder); return new MockCursor() { int mCurrentPosition = -1; @Override public int getCount() { return mContactEntryList.size(); } @Override public boolean moveToFirst() { mCurrentPosition = 0; return true; } @Override public boolean moveToNext() { if (mCurrentPosition < mContactEntryList.size()) { mCurrentPosition++; return true; } else { return false; } } @Override public boolean isBeforeFirst() { return mCurrentPosition < 0; } @Override public boolean isAfterLast() { return mCurrentPosition >= mContactEntryList.size(); } @Override public int getColumnIndex(String columnName) { mTestCase.assertEquals(Contacts._ID, columnName); return 0; } @Override public int getInt(int columnIndex) { mTestCase.assertEquals(0, columnIndex); mTestCase.assertTrue(mCurrentPosition >= 0 && mCurrentPosition < mContactEntryList.size()); return mCurrentPosition; } @Override public String getString(int columnIndex) { return String.valueOf(getInt(columnIndex)); } @Override public void close() { } }; } }