Due to the change Iae8dbac1, all tests for vCard exporeter has failed.
This change fixes the breakage by using a kind of dirty Dependency Injection.
Current test framework for vCard exporter strongly depends on the assumption that
ContentValues objects are able to be directly passed to objects which use
ContentResolver, while the change above disabled the feature by removing
queryEntities().
This change makes VCardComposer forcibly uses queryEntities() via Reflection.
I agree that this change is not so clean, but works fine for now.
Merge commit '328c0e7986aa6bb7752ec6de3da9c999920bb55f' into eclair-mr2-plus-aosp
* commit '328c0e7986aa6bb7752ec6de3da9c999920bb55f':
- removed the concept of Entity from the ContentProvider APIs
As for VCardBuilder, there was a class with the same name, but this implementation is fundamentally different.
This time, VCardBuilder is like StringBuilder. It enables developers to create their own vCard by themselves.
Make Constants public and rename it to VCardConstants.
Internal issue number: 2242528, 2195990
Previous change selected the first ContactValues object even when its name fields are all empty.
This time, vCard composer checks the name fields and skip the object withouth valid name.
One exception is the object with IS_SUPER_PRIMARY flag. If IS_SUPER_PRIMARY flag is set, the object will be
selected even when the object does not have valid name.
Add a unit test for this fix.
Internal issue number: 2252304
e.g. "# Comment?"
In both vCard 2.1 and vCard 3.0, this syntax is never allowed, but some actual exporter seems to emit this kind of comment sometimes.
Both vCard 2.1 and vCard 3.0 allows some property to use multiple lines, so this change may cause another problem.
For example, if the "NOTE" property uses Quoted-Printable type, has several lines, and one of the lines starts with '#', we cannot know whether the line is "comment" or not.
Fortunately, in this change, the line is parsed as part of "NOTE" property, so I think there's no problem "right now", which does not mean that it is completely fine with vCard files Android will encounter in the future.
Internal issue number: 2245363
We had been using "parameter"/"param" by mistake, while both vCard
formats uses theterm "attribute"/"attr". This is confusing.
Internal issue number: 2233884
In the near future, all the values which cannot be converted to
vCard property is expressed as "X-ANDROID-CUSTOM" property + MIME_TYPE.
Example (Nick name):
X-ANDROID-CUSTOM:vnd.android.cursor.item/nickname;Nicky;;;;;;;;;;;;;
All the data are stored ordered by its column name ("data1" - "data15").
Currently the code assumes the max num is 15.
Internal Issue number: 2079082
Now, basic tests are almost ready.
TODO:
- importer test toward multiple vCard input (though it was tested with real usage)
- exporter tests for multiple composition
- tests with non-Ascii
- tests with special types like TYPE_DOCOMO
ISSUE:
In order to fully check the validity of exporter, we may have to develop
some vCard importer which rejects vCard which is valid but a kind of dubious.
Internal Issue Number: 2160039
In order to share the logic between tests for importer and those for exporter,
PropertyNodesVerifier is now a separated class and drastically modified.
Now the class accept "unordered" expected PropertyNode objects, which allows vCard
composer to not care the exact order of each elements.
MockCursor is added, which may be added into the public API in the future, but in
the test directory for now.
Another MockContentProvider is (temporarily) developed so that it can be accepted by
MockContentResolver#addProvider(), which does not allow IContentProvider and its
descendants but only exact ContentProvider, while the original MockContentProvider in
android.test.mock.MockContentProvider implements IContentProvider.
The test development is still on-going, but this test suffices minimal requirement of
vCard tests.
Internal issue number: 2160039
Note that refactor is still on-going. Some changes done now may be
reverted in the future.
- Move reusable constants from VCardComposer to Constants.
- Make ContactStruct appropriately refers to Constants.
- Move PBAP-related code at the bottom of vCard composer
- Remove some redundant code.
Internal issue number: 2160039
along with the tests
Make test code not only check the validity of VCardParser but also check
the validity of the data insertion part of ContactStruct class, using
MockContentResolver/MockContentProvider. With these tests, we are now really sure
vCard side appropriately sends vCard data into the resolver.
Fix ContactStruct so that it properly handles ORG property and TITLE property,
though it still does not see Group information. There's no vCard found which
uses Group and ORG and TITLE in convolted orders...
e.g. Current implementation misinterprets the following case, but we're not sure
whether any exporter emits data in this kind of complicated form...
group2.ORG:ComparyA
group1.ORG:CompanyB
group1.TITLE:TitleForA
group2.TITLE:TitleForB
Expected: CompanyA + TitleForA, CompanyB + TitleForB
Actual: CompanyA + TitleForB, CompanyB + TitleForA
Also change the parser part a little, so that some component can be reused via
the other part of vCard code.
Added several additional files for the tests, which ensures that
- ORG/TITLE properties are handled as we expect.
- PREF is appropriately handled and passed to the resolver as "IS_PRIMARY" flag.
-- We discarded the code which ensures that "IS_PRIMARY" is added to only one
field in each type, after the local discussion (the duplication or no primary
state should be handled by the resolver).
Internal Issue number: 2160039
Merge commit 'ccc214b21edaaddf46960388ec4d3e3ca89a01ae' into eclair-mr2
* commit 'ccc214b21edaaddf46960388ec4d3e3ca89a01ae':
Make VCardComposer create the instance for mHandlerList.
Previously the creation was delayed until addHandler(), which
had been required to be called.
However, after VCardComoser's support toward PBAP stuffs,
the guarantee was not true any more.
So by creating the instance in constructor, we refrain NPE during
finalize() when PBAP uses VCardComposer.
- Make it allow composer users to emit Quoted-Printabled primary ("N", "FN", etc.) properties.
- Make it strictly check whether it is necessary for the composer to emit CHARSET infomation.
-- Added the logic "not vCard 3.0, or, CHARSET is not UTF-8".
- Clean up the code (again...)
With this change, the vCard composer does not emit any information
about CHARSET until it is really needed for parsing it (e.g. when
non-ascii chacacters are included in some value). This "may" be
effective toward external vCard importers which are not able to
understand non-ascii characters and CHARSET info itself.
Also now vCard composer does not use Quoted Printable until it is
really needed (e.g. until when the composer find non-"7bit"
characters are included in some value. "7bit" is defined in vCard 2.1,
which is "<7bit us-ascii printable chars, excluding CR LF>".
The vCard composer detects duplicate phone numbers, email addresses,
and remove them in default. The duplication would come from
aggregation done by the new ContactsProvider introduced in Eclair.
Even when two Accounts have two exactly same addresses, we cannot
ask ContactsProvider to exclude them since current implementation of
ContactsProvider2#queryEntities() does not acceps Contacts.CONTENT_URI
but only RawContacts.CONTENT_URI, which inevitably returns same
email addresses with different Accounts (ACCOUNT_NAME and ACCOUNT_TYPE
should be different. If not, the original contact itself should have
the duplication).
The vCard composer now detects null returned from queryEntities().
The null value is potentially harmful for vCard file, since it forces
the (old) vCard composer to emit meaningless line like "BDAY:".
Internal Issue number: 2150768, 2151954, 2154235
- Add FOR_EXPORT_ONLY to Data column.
- Make VCardComposer use Contacts instead of RawContacts.
- Make VCardComposer honor FOR_CONTACT_ONLY regardless of
the intention of any caller, which makes composer unable to
compose any contact with "is_restricted" flag, which is unseen
from outside the contacts provider.
Internal Issue number: 2147248, 2143207
- Separate the two cases: mCursor == null and mCursor.getCount() == 0.
- Make error messages viewable from user applications, which enables them to
translate those messages.
Internal issue number: 2138187, 27103