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
Contacts app's EditContactActivity now explicitly set those to null, so I thought vCard importer
also shold do so.
Internal issue number: 2141766
TODO:
Contacts app's side should be also modified to completely fix the issue above.
- The logic for emitting "FN" is wrong.
- FileWriter's "double close" problem should occur in the current implementation.
- Let VCardParser_V31.java ignore AGENT field instead of throwing an unkind VCardNotSupportedException.
Phase 2
Make VCard Importer use Data structures in ContactsContract instead of
using old Conatacts structure.
Phase 3
Developed VCardComposer, which was originally in Contacts package, but
now in base/core/java. Also made it use queryEntries() as per jsharkey's
suggestion.
Phase 4
Added VCardUtils and moved some common methods to it, some of which should be
in public API, but hidden for now.
Phase 5
Made VCardComposer emits (almost) valid vCard 3.0 data.
Confirmed with vCard data emitted by Mac.
Related issue:
1784580, 1728351, 1967349
Note:
Probable next step:
- Add "fast parse" mode in VCradBuilder, in which, VCardBuilder skip parsing the value of
each property. It will make the parsing faster.
-- Note that parsing the parameters of each entry cannot be skipped, since it may contains
the information about Encoding of the property. In other words, if the line is
in Quoted-Printable format, the next line may be the part of the property, not a
separated property, which should be parsed accordingly.
- Needs test
Move VCard code from android/syncml/pim to android/pim since the code is not
related to SyncML at all; Previous code was misplaced, I suppose.
Reorganize "Builder" structure:
Create VCardBuilderBase.java as a base class for "Builder" classes.
Separate VCardDataBuilder to several components.
Now, VCardBuilder is able to accept EntryHandlers (interface) which handle each VCard entry.
Add EntriCommitter and ProgressShower as ones of EntryHandler implementations.
Stop using VNode/PropertyNode in the actual importing path. Instead, VCard importer directly
creates ContactStruct object.
PropertyNode is still used in test codes, since it does not drop any kind of information
while ContactStruct does.
All codes are made hidden (with package.html) like the files in syncml directory;
These files are only for Contacts app.
Issue
- due to internal issue 1975498, any performance test cannot be conducted.
Next todos
- Add tests for ContactStruct.
- remove android/syncml directory.
- Rename several methods; old names are based on V??? structure, which does not make sense in the current code.
- Use ContentProviderOperation instead of relying on beginTransaction()/endTransaction().
- Use ContactsContact in Eclair
Related internal issues
- 1784580, 1728351
Use java.text.DateFormat where possible, since that is already using
the CLDR data for the things it supports. Remove an unused date format
object from DatePickerDialog.
Add a new method for getting the standalone month names from applications,
although @hidden for now because it is an API change.
Pass the standalone month names down to native code in Time so that
tztime's strftime() can use them.
And then the bulk of the change: replace all the names for the months
and the days of the week, and AM and PM, and yesterday, today, and tomorrow,
with strings from CLDR. And replace several of the date format strings
with ones derived from CLDR, but reformatted to use strftime() style
instead of SimpleDateFormat style.
All these resource changes go into new donottranslate-cldr.xml files
and are removed from strings.xml so that they aren't part of the
normal translation process and the translators don't have to bother
with them (and risk messing them up).