diff options
| author | Daisuke Miyakawa <dmiyakawa@google.com> | 2011-03-03 11:03:28 -0800 |
|---|---|---|
| committer | Daisuke Miyakawa <dmiyakawa@google.com> | 2011-03-04 11:58:55 -0800 |
| commit | 7e4e86eb5ad2c8a68ca7005ef4dee64a82ce0198 (patch) | |
| tree | 55d14dfa45916b0ae1aa959b8f25e22cd821a044 | |
| parent | a11303ccb430ca40210900823807027cc842bf6c (diff) | |
| download | android_frameworks_opt_vcard-7e4e86eb5ad2c8a68ca7005ef4dee64a82ce0198.tar.gz android_frameworks_opt_vcard-7e4e86eb5ad2c8a68ca7005ef4dee64a82ce0198.tar.bz2 android_frameworks_opt_vcard-7e4e86eb5ad2c8a68ca7005ef4dee64a82ce0198.zip | |
Tiny refactoring, clean up.
- isolate test-related stuffs
- suppress warning
- let constructor accept ContentResolver, which is
useful when test has custom ContentResolver apart from
Context object.
- prohibit multiple init() calls
Change-Id: I0da5af56bf04e8eafbef376668a09002cb62d3f5
4 files changed, 140 insertions, 59 deletions
diff --git a/java/com/android/vcard/VCardComposer.java b/java/com/android/vcard/VCardComposer.java index 2b2495c..d1e0eb6 100644 --- a/java/com/android/vcard/VCardComposer.java +++ b/java/com/android/vcard/VCardComposer.java @@ -100,6 +100,7 @@ import java.util.Map; */ public class VCardComposer { private static final String LOG_TAG = "VCardComposer"; + private static final boolean DEBUG = false; public static final String FAILURE_REASON_FAILED_TO_GET_DATABASE_INFO = "Failed to get database information"; @@ -116,22 +117,11 @@ public class VCardComposer { public static final String NO_ERROR = "No error"; - public static final String VCARD_TYPE_STRING_DOCOMO = "docomo"; - // Strictly speaking, "Shift_JIS" is the most appropriate, but we use upper version here, // since usual vCard devices for Japanese devices already use it. private static final String SHIFT_JIS = "SHIFT_JIS"; private static final String UTF_8 = "UTF-8"; - /** - * Special URI for testing. - */ - public static final String VCARD_TEST_AUTHORITY = "com.android.unit_tests.vcard"; - public static final Uri VCARD_TEST_AUTHORITY_URI = - Uri.parse("content://" + VCARD_TEST_AUTHORITY); - public static final Uri CONTACTS_TEST_CONTENT_URI = - Uri.withAppendedPath(VCARD_TEST_AUTHORITY_URI, "contacts"); - private static final Map<Integer, String> sImMap; static { @@ -161,9 +151,6 @@ public class VCardComposer { * </p> */ public final class HandlerForOutputStream implements OneEntryHandler { - @SuppressWarnings("hiding") - private static final String LOG_TAG = "VCardComposer.HandlerForOutputStream"; - private final OutputStream mOutputStream; // mWriter will close this. private Writer mWriter; @@ -238,12 +225,14 @@ public class VCardComposer { private final boolean mIsDoCoMo; private Cursor mCursor; + private boolean mCursorSuppliedFromOutside; private int mIdColumn; private Uri mContentUriForRawContactsEntity = RawContactsEntity.CONTENT_URI; private final String mCharset; private final List<OneEntryHandler> mHandlerList; + private boolean mInitDone; private String mErrorReason = NO_ERROR; /** @@ -280,7 +269,7 @@ public class VCardComposer { } /** - * Construct for supporting call log entry vCard composing. + * Constructs for supporting call log entry vCard composing. * * @param context Context to be used during the composition. * @param vcardType The type of vCard, typically available via {@link VCardConfig}. @@ -291,10 +280,20 @@ public class VCardComposer { */ public VCardComposer(final Context context, final int vcardType, String charset, final boolean careHandlerErrors) { + this(context, context.getContentResolver(), vcardType, charset, careHandlerErrors); + } + + /** + * Just for testing for now. + * @param resolver {@link ContentResolver} which used by this object. + * @hide + */ + public VCardComposer(final Context context, ContentResolver resolver, + final int vcardType, String charset, final boolean careHandlerErrors) { mContext = context; mVCardType = vcardType; mCareHandlerErrors = careHandlerErrors; - mContentResolver = context.getContentResolver(); + mContentResolver = resolver; mIsDoCoMo = VCardConfig.isDoCoMo(vcardType); mHandlerList = new ArrayList<OneEntryHandler>(); @@ -372,6 +371,11 @@ public class VCardComposer { } /** + * Initializes this object using default {@link Contacts#CONTENT_URI}. + * + * You can call this method or a variant of this method just once. In other words, you cannot + * reuse this object. + * * @return Returns true when initialization is successful and all the other * methods are available. Returns false otherwise. */ @@ -388,14 +392,21 @@ public class VCardComposer { * Cursor cursor = mContentResolver.query( * contentUriForRawContactsEntity, null, selection, selectionArgs, null) * </code> + * + * You can call this method or a variant of this method just once. In other words, you cannot + * reuse this object. */ public boolean initWithRawContactsEntityUri(Uri contentUriForRawContactsEntity) { mContentUriForRawContactsEntity = contentUriForRawContactsEntity; return init(null, null); } + /** + * Initializes this object using default {@link Contacts#CONTENT_URI} and given selection + * arguments. + */ public boolean init(final String selection, final String[] selectionArgs) { - return init(Contacts.CONTENT_URI, selection, selectionArgs, null); + return init(Contacts.CONTENT_URI, sContactsProjection, selection, selectionArgs, null); } /** @@ -403,7 +414,48 @@ public class VCardComposer { */ public boolean init(final Uri contentUri, final String selection, final String[] selectionArgs, final String sortOrder) { - if (contentUri == null) { + return init(contentUri, sContactsProjection, selection, selectionArgs, sortOrder); + } + + private boolean init(final Uri contentUri, final String[] projection, + final String selection, final String[] selectionArgs, final String sortOrder) { + if (!Contacts.CONTENT_URI.equals(contentUri)) { + if (DEBUG) Log.d(LOG_TAG, "Unexpected contentUri: " + contentUri); + mErrorReason = FAILURE_REASON_UNSUPPORTED_URI; + return false; + } + if (!initInterFirstPart()) { + return false; + } + if (!initInterCursorCreationPart(contentUri, projection, selection, selectionArgs, + sortOrder)) { + return false; + } + if (!initInterMainPart()) { + return false; + } + return initInterLastPart(); + } + + /** + * Just for testing for now. Do not use. + * @hide + */ + public boolean init(Cursor cursor) { + if (!initInterFirstPart()) { + return false; + } + mCursorSuppliedFromOutside = true; + mCursor = cursor; + if (!initInterMainPart()) { + return false; + } + return initInterLastPart(); + } + + private boolean initInterFirstPart() { + if (mInitDone) { + Log.e(LOG_TAG, "init() is already called"); return false; } @@ -412,6 +464,11 @@ public class VCardComposer { mHandlerList.size()); for (OneEntryHandler handler : mHandlerList) { if (!handler.onInit(mContext)) { + if (DEBUG) { + Log.d(LOG_TAG, + String.format("One of OneEntryHandler (%s) return false on init.", + handler.toString())); + } for (OneEntryHandler finished : finishedList) { finished.onTerminate(); } @@ -425,36 +482,39 @@ public class VCardComposer { } } - final String[] projection; - if (Contacts.CONTENT_URI.equals(contentUri) || - CONTACTS_TEST_CONTENT_URI.equals(contentUri)) { - projection = sContactsProjection; - } else { - mErrorReason = FAILURE_REASON_UNSUPPORTED_URI; - return false; - } + return true; + } + + private boolean initInterCursorCreationPart( + final Uri contentUri, final String[] projection, + final String selection, final String[] selectionArgs, final String sortOrder) { + mCursorSuppliedFromOutside = false; mCursor = mContentResolver.query( contentUri, projection, selection, selectionArgs, sortOrder); if (mCursor == null) { + Log.e(LOG_TAG, String.format("Cursor became null unexpectedly")); mErrorReason = FAILURE_REASON_FAILED_TO_GET_DATABASE_INFO; return false; } + return true; + } - if (getCount() == 0 || !mCursor.moveToFirst()) { - try { - mCursor.close(); - } catch (SQLiteException e) { - Log.e(LOG_TAG, "SQLiteException on Cursor#close(): " + e.getMessage()); - } finally { - mCursor = null; - mErrorReason = FAILURE_REASON_NO_ENTRY; + private boolean initInterMainPart() { + if (mCursor.getCount() == 0 || !mCursor.moveToFirst()) { + if (DEBUG) { + Log.d(LOG_TAG, + String.format("mCursor has an error (getCount: %d): ", mCursor.getCount())); } + closeCursorIfAppropriate(); return false; } - mIdColumn = mCursor.getColumnIndex(Contacts._ID); + return true; + } + private boolean initInterLastPart() { + mInitDone = true; mTerminateCalled = false; return true; } @@ -468,7 +528,7 @@ public class VCardComposer { * @hide just for testing. */ public boolean createOneEntry(Method getEntityIteratorMethod) { - if (mCursor == null || mCursor.isAfterLast()) { + if (!mInitDone) { mErrorReason = FAILURE_REASON_NOT_INITIALIZED; return false; } @@ -619,7 +679,12 @@ public class VCardComposer { handler.onTerminate(); } - if (mCursor != null) { + closeCursorIfAppropriate(); + mTerminateCalled = true; + } + + private void closeCursorIfAppropriate() { + if (!mCursorSuppliedFromOutside && mCursor != null) { try { mCursor.close(); } catch (SQLiteException e) { @@ -627,8 +692,6 @@ public class VCardComposer { } mCursor = null; } - - mTerminateCalled = true; } @Override diff --git a/tests/src/com/android/vcard/tests/test_utils/ExportTestProvider.java b/tests/src/com/android/vcard/tests/test_utils/ExportTestProvider.java index 87cf1d8..e1b4bcf 100644 --- a/tests/src/com/android/vcard/tests/test_utils/ExportTestProvider.java +++ b/tests/src/com/android/vcard/tests/test_utils/ExportTestProvider.java @@ -28,8 +28,6 @@ import android.test.AndroidTestCase; import android.test.mock.MockContentProvider; import android.test.mock.MockCursor; -import com.android.vcard.VCardComposer; - import junit.framework.TestCase; import java.util.ArrayList; @@ -40,8 +38,8 @@ public class ExportTestProvider extends MockContentProvider { final private ArrayList<ContactEntry> mContactEntryList = new ArrayList<ContactEntry>(); private static class MockEntityIterator implements EntityIterator { - List<Entity> mEntityList; - Iterator<Entity> mIterator; + private final List<Entity> mEntityList; + private Iterator<Entity> mIterator; public MockEntityIterator(List<ContentValues> contentValuesList) { mEntityList = new ArrayList<Entity>(); @@ -53,22 +51,27 @@ public class ExportTestProvider extends MockContentProvider { mIterator = mEntityList.iterator(); } + @Override public boolean hasNext() { return mIterator.hasNext(); } + @Override public Entity next() { return mIterator.next(); } + @Override public void remove() { throw new UnsupportedOperationException("remove not supported"); } + @Override public void reset() { mIterator = mEntityList.iterator(); } + @Override public void close() { } } @@ -108,7 +111,7 @@ public class ExportTestProvider extends MockContentProvider { @Override public Cursor query(Uri uri,String[] projection, String selection, String[] selectionArgs, String sortOrder) { - TestCase.assertTrue(VCardComposer.CONTACTS_TEST_CONTENT_URI.equals(uri)); + TestCase.assertTrue(VCardVerifier.CONTACTS_TEST_CONTENT_URI.equals(uri)); // In this test, following arguments are not supported. TestCase.assertNull(selection); TestCase.assertNull(selectionArgs); diff --git a/tests/src/com/android/vcard/tests/test_utils/ExportTestResolver.java b/tests/src/com/android/vcard/tests/test_utils/ExportTestResolver.java index b89b9d1..7a8f4b3 100644 --- a/tests/src/com/android/vcard/tests/test_utils/ExportTestResolver.java +++ b/tests/src/com/android/vcard/tests/test_utils/ExportTestResolver.java @@ -19,13 +19,11 @@ import android.provider.ContactsContract.RawContacts; import android.test.AndroidTestCase; import android.test.mock.MockContentResolver; -import com.android.vcard.VCardComposer; - public class ExportTestResolver extends MockContentResolver { private final ExportTestProvider mProvider; public ExportTestResolver(AndroidTestCase androidTestCase) { mProvider = new ExportTestProvider(androidTestCase); - addProvider(VCardComposer.VCARD_TEST_AUTHORITY, mProvider); + addProvider(VCardVerifier.VCARD_TEST_AUTHORITY, mProvider); addProvider(RawContacts.CONTENT_URI.getAuthority(), mProvider); } diff --git a/tests/src/com/android/vcard/tests/test_utils/VCardVerifier.java b/tests/src/com/android/vcard/tests/test_utils/VCardVerifier.java index f9fa463..29fc835 100644 --- a/tests/src/com/android/vcard/tests/test_utils/VCardVerifier.java +++ b/tests/src/com/android/vcard/tests/test_utils/VCardVerifier.java @@ -15,15 +15,6 @@ */ package com.android.vcard.tests.test_utils; -import android.content.ContentResolver; -import android.content.Context; -import android.content.EntityIterator; -import android.net.Uri; -import android.test.AndroidTestCase; -import android.test.mock.MockContext; -import android.text.TextUtils; -import android.util.Log; - import com.android.vcard.VCardComposer; import com.android.vcard.VCardConfig; import com.android.vcard.VCardEntryConstructor; @@ -33,6 +24,17 @@ import com.android.vcard.VCardParser; import com.android.vcard.VCardUtils; import com.android.vcard.exception.VCardException; +import android.content.ContentResolver; +import android.content.Context; +import android.content.EntityIterator; +import android.database.Cursor; +import android.net.Uri; +import android.provider.ContactsContract.Contacts; +import android.test.AndroidTestCase; +import android.test.mock.MockContext; +import android.text.TextUtils; +import android.util.Log; + import junit.framework.TestCase; import java.io.ByteArrayInputStream; @@ -55,6 +57,15 @@ import java.util.Arrays; public class VCardVerifier { private static final String LOG_TAG = "VCardVerifier"; + /** + * Special URI for testing. + */ + /* package */ static final String VCARD_TEST_AUTHORITY = "com.android.unit_tests.vcard"; + private static final Uri VCARD_TEST_AUTHORITY_URI = + Uri.parse("content://" + VCARD_TEST_AUTHORITY); + /* package */ static final Uri CONTACTS_TEST_CONTENT_URI = + Uri.withAppendedPath(VCARD_TEST_AUTHORITY_URI, "contacts"); + private static class CustomMockContext extends MockContext { final ContentResolver mResolver; public CustomMockContext(ContentResolver resolver) { @@ -68,13 +79,16 @@ public class VCardVerifier { } private class VCardVerifierInternal implements VCardComposer.OneEntryHandler { + @Override public boolean onInit(Context context) { return true; } + @Override public boolean onEntryCreated(String vcard) { verifyOneVCardForExport(vcard); return true; } + @Override public void onTerminate() { } } @@ -344,11 +358,14 @@ public class VCardVerifier { } private void verifyForExportTest() { - final VCardComposer composer = - new VCardComposer(new CustomMockContext(mExportTestResolver), mVCardType, mCharset); + final CustomMockContext context = new CustomMockContext(mExportTestResolver); + final ContentResolver resolver = context.getContentResolver(); + final VCardComposer composer = new VCardComposer(context, mVCardType, mCharset); + // projection is ignored. + final Cursor cursor = resolver.query(CONTACTS_TEST_CONTENT_URI, null, null, null, null); composer.addHandler(mLineVerifier); composer.addHandler(mVCardVerifierInternal); - if (!composer.init(VCardComposer.CONTACTS_TEST_CONTENT_URI, null, null, null)) { + if (!composer.init(cursor)) { AndroidTestCase.fail("init() failed. Reason: " + composer.getErrorReason()); } AndroidTestCase.assertFalse(composer.isAfterLast()); |
