merge in jb-mr1-release history after reset to jb-mr1-dev
diff --git a/res/values-zh-rCN/strings.xml b/res/values-zh-rCN/strings.xml
index 567f985..7d93ad6 100644
--- a/res/values-zh-rCN/strings.xml
+++ b/res/values-zh-rCN/strings.xml
@@ -510,7 +510,7 @@
<string name="voicemail_fetching_timout" msgid="6691792377574905201">"无法抓取语音邮件。"</string>
<string name="call_log_new_header" msgid="846546437517724715">"新记录"</string>
<string name="call_log_old_header" msgid="6262205894314263629">"旧记录"</string>
- <string name="call_log_voicemail_header" msgid="4484032064803446806">"通过语音信箱接听的电话"</string>
+ <string name="call_log_voicemail_header" msgid="4484032064803446806">"通过语音信箱接到的电话"</string>
<string name="call_log_incoming_header" msgid="297542827180501480">"来电"</string>
<string name="call_log_outgoing_header" msgid="9017138725495067284">"外拨电话"</string>
<string name="call_log_missed_header" msgid="2168865291934970151">"未接来电"</string>
diff --git a/res/values/donottranslate_config.xml b/res/values/donottranslate_config.xml
index dd94097..2110a8b 100644
--- a/res/values/donottranslate_config.xml
+++ b/res/values/donottranslate_config.xml
@@ -55,9 +55,6 @@
specific to some vendor (like DoCoMo), specify this type (e.g. "docomo") -->
<string name="config_export_vcard_type" translatable="false">default</string>
- <!-- Directory in which exported VCard file is stored -->
- <string name="config_export_dir" translatable="false">/mnt/sdcard</string>
-
<!-- Prefix of exported VCard file -->
<string name="config_export_file_prefix" translatable="false"></string>
diff --git a/src/com/android/contacts/detail/ContactDetailFragment.java b/src/com/android/contacts/detail/ContactDetailFragment.java
index f66466d..87c321e 100644
--- a/src/com/android/contacts/detail/ContactDetailFragment.java
+++ b/src/com/android/contacts/detail/ContactDetailFragment.java
@@ -42,7 +42,6 @@
import android.provider.ContactsContract.Directory;
import android.provider.ContactsContract.DisplayNameSources;
import android.provider.ContactsContract.StatusUpdates;
-import android.telephony.PhoneNumberUtils;
import android.text.TextUtils;
import android.util.Log;
import android.view.ContextMenu;
@@ -573,9 +572,7 @@
} else if (dataItem instanceof PhoneDataItem && hasData) {
PhoneDataItem phone = (PhoneDataItem) dataItem;
// Build phone entries
- String phoneNumberE164 = phone.getNormalizedNumber();
- entry.data = PhoneNumberUtils.formatNumber(
- entry.data, phoneNumberE164, mDefaultCountryIso);
+ entry.data = phone.getFormattedPhoneNumber();
final Intent phoneIntent = mHasPhone ?
ContactsUtils.getCallIntent(entry.data) : null;
final Intent smsIntent = mHasSms ? new Intent(Intent.ACTION_SENDTO,
diff --git a/src/com/android/contacts/detail/ContactLoaderFragment.java b/src/com/android/contacts/detail/ContactLoaderFragment.java
index 6a69744..37fabb0 100644
--- a/src/com/android/contacts/detail/ContactLoaderFragment.java
+++ b/src/com/android/contacts/detail/ContactLoaderFragment.java
@@ -187,7 +187,7 @@
Uri lookupUri = args.getParcelable(LOADER_ARG_CONTACT_URI);
return new ContactLoader(mContext, lookupUri, true /* loadGroupMetaData */,
true /* loadStreamItems */, true /* load invitable account types */,
- true /* postViewNotification */);
+ true /* postViewNotification */, true /* computeFormattedPhoneNumber */);
}
@Override
diff --git a/src/com/android/contacts/model/ContactLoader.java b/src/com/android/contacts/model/ContactLoader.java
index 28000a6..0b7e40d 100644
--- a/src/com/android/contacts/model/ContactLoader.java
+++ b/src/com/android/contacts/model/ContactLoader.java
@@ -41,10 +41,12 @@
import android.util.Log;
import android.util.LongSparseArray;
+import com.android.contacts.ContactsUtils;
import com.android.contacts.GroupMetaData;
import com.android.contacts.model.account.AccountType;
import com.android.contacts.model.account.AccountTypeWithDataSet;
import com.android.contacts.model.dataitem.DataItem;
+import com.android.contacts.model.dataitem.PhoneDataItem;
import com.android.contacts.model.dataitem.PhotoDataItem;
import com.android.contacts.util.ContactLoaderUtils;
import com.android.contacts.util.DataStatus;
@@ -81,17 +83,18 @@
private boolean mLoadStreamItems;
private boolean mLoadInvitableAccountTypes;
private boolean mPostViewNotification;
+ private boolean mComputeFormattedPhoneNumber;
private Contact mContact;
private ForceLoadContentObserver mObserver;
private final Set<Long> mNotifiedRawContactIds = Sets.newHashSet();
public ContactLoader(Context context, Uri lookupUri, boolean postViewNotification) {
- this(context, lookupUri, false, false, false, postViewNotification);
+ this(context, lookupUri, false, false, false, postViewNotification, false);
}
public ContactLoader(Context context, Uri lookupUri, boolean loadGroupMetaData,
boolean loadStreamItems, boolean loadInvitableAccountTypes,
- boolean postViewNotification) {
+ boolean postViewNotification, boolean computeFormattedPhoneNumber) {
super(context);
mLookupUri = lookupUri;
mRequestedUri = lookupUri;
@@ -99,6 +102,7 @@
mLoadStreamItems = loadStreamItems;
mLoadInvitableAccountTypes = loadInvitableAccountTypes;
mPostViewNotification = postViewNotification;
+ mComputeFormattedPhoneNumber = computeFormattedPhoneNumber;
}
/**
@@ -379,7 +383,8 @@
}
if (!cursor.isNull(ContactQuery.DATA_ID)) {
ContentValues data = loadDataValues(cursor);
- rawContact.addDataItemValues(data);
+ final DataItem item = rawContact.addDataItemValues(data);
+ processDataItem(item);
if (!cursor.isNull(ContactQuery.PRESENCE)
|| !cursor.isNull(ContactQuery.STATUS)) {
@@ -400,6 +405,19 @@
}
/**
+ * Performs any further computations on the data item
+ */
+ private void processDataItem(DataItem dataItem) {
+ if (dataItem instanceof PhoneDataItem) {
+ if (mComputeFormattedPhoneNumber) {
+ final PhoneDataItem phoneDataItem = (PhoneDataItem) dataItem;
+ final String defaultCountryIso = ContactsUtils.getCurrentCountryIso(getContext());
+ phoneDataItem.computeFormattedPhoneNumber(defaultCountryIso);
+ }
+ }
+ }
+
+ /**
* Looks for the photo data item in entities. If found, creates a new Bitmap instance. If
* not found, returns null
*/
diff --git a/src/com/android/contacts/model/RawContact.java b/src/com/android/contacts/model/RawContact.java
index d884198..6d4a881 100644
--- a/src/com/android/contacts/model/RawContact.java
+++ b/src/com/android/contacts/model/RawContact.java
@@ -228,12 +228,18 @@
setAccount(null, null, null);
}
- public void addDataItemValues(ContentValues values) {
- addNamedDataItemValues(Data.CONTENT_URI, values);
+ /**
+ * Creates and inserts a DataItem object that wraps the content values, and returns it.
+ */
+ public DataItem addDataItemValues(ContentValues values) {
+ final NamedDataItem namedItem = addNamedDataItemValues(Data.CONTENT_URI, values);
+ return namedItem.dataItem;
}
- public void addNamedDataItemValues(Uri uri, ContentValues values) {
- mDataItems.add(new NamedDataItem(uri, DataItem.createFrom(this, values)));
+ public NamedDataItem addNamedDataItemValues(Uri uri, ContentValues values) {
+ final NamedDataItem namedItem = new NamedDataItem(uri, DataItem.createFrom(this, values));
+ mDataItems.add(namedItem);
+ return namedItem;
}
public List<DataItem> getDataItems() {
diff --git a/src/com/android/contacts/model/dataitem/PhoneDataItem.java b/src/com/android/contacts/model/dataitem/PhoneDataItem.java
index 94a0054..61d62c1 100644
--- a/src/com/android/contacts/model/dataitem/PhoneDataItem.java
+++ b/src/com/android/contacts/model/dataitem/PhoneDataItem.java
@@ -19,6 +19,7 @@
import android.content.ContentValues;
import android.provider.ContactsContract;
import android.provider.ContactsContract.CommonDataKinds.Phone;
+import android.telephony.PhoneNumberUtils;
import com.android.contacts.model.RawContact;
@@ -28,6 +29,8 @@
*/
public class PhoneDataItem extends DataItem {
+ public static final String KEY_FORMATTED_PHONE_NUMBER = "formattedPhoneNumber";
+
/* package */ PhoneDataItem(RawContact rawContact, ContentValues values) {
super(rawContact, values);
}
@@ -43,6 +46,10 @@
return getContentValues().getAsString(Phone.NORMALIZED_NUMBER);
}
+ public String getFormattedPhoneNumber() {
+ return getContentValues().getAsString(KEY_FORMATTED_PHONE_NUMBER);
+ }
+
/**
* Values are Phone.TYPE_*
*/
@@ -54,4 +61,13 @@
return getContentValues().getAsString(Phone.LABEL);
}
+ public void computeFormattedPhoneNumber(String defaultCountryIso) {
+ final String phoneNumber = getNumber();
+ if (phoneNumber != null) {
+ final String formattedPhoneNumber = PhoneNumberUtils.formatNumber(phoneNumber,
+ getNormalizedNumber(), defaultCountryIso);
+ getContentValues().put(KEY_FORMATTED_PHONE_NUMBER, formattedPhoneNumber);
+ }
+ }
+
}
diff --git a/src/com/android/contacts/socialwidget/SocialWidgetProvider.java b/src/com/android/contacts/socialwidget/SocialWidgetProvider.java
index 03517d4..259f38d 100644
--- a/src/com/android/contacts/socialwidget/SocialWidgetProvider.java
+++ b/src/com/android/contacts/socialwidget/SocialWidgetProvider.java
@@ -114,7 +114,7 @@
return;
}
final ContactLoader contactLoader = new ContactLoader(context, contactUri, false, true,
- false, true);
+ false, true, false);
contactLoader.registerListener(0,
new ContactLoader.OnLoadCompleteListener<Contact>() {
@Override
diff --git a/src/com/android/contacts/vcard/ExportVCardActivity.java b/src/com/android/contacts/vcard/ExportVCardActivity.java
index ac0850f..6bed577 100644
--- a/src/com/android/contacts/vcard/ExportVCardActivity.java
+++ b/src/com/android/contacts/vcard/ExportVCardActivity.java
@@ -25,6 +25,7 @@
import android.content.ServiceConnection;
import android.net.Uri;
import android.os.Bundle;
+import android.os.Environment;
import android.os.Handler;
import android.os.IBinder;
import android.os.Message;
@@ -148,7 +149,14 @@
super.onCreate(bundle);
// Check directory is available.
- final File targetDirectory = new File(getString(R.string.config_export_dir));
+ if (!Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
+ Log.w(LOG_TAG, "External storage is in state " + Environment.getExternalStorageState() +
+ ". Cancelling export");
+ showDialog(R.id.dialog_sdcard_not_found);
+ return;
+ }
+
+ final File targetDirectory = Environment.getExternalStorageDirectory();
if (!(targetDirectory.exists() &&
targetDirectory.isDirectory() &&
targetDirectory.canRead()) &&
diff --git a/src/com/android/contacts/vcard/VCardService.java b/src/com/android/contacts/vcard/VCardService.java
index 4ef1bcb..74ce69c 100644
--- a/src/com/android/contacts/vcard/VCardService.java
+++ b/src/com/android/contacts/vcard/VCardService.java
@@ -22,6 +22,7 @@
import android.media.MediaScannerConnection.MediaScannerConnectionClient;
import android.net.Uri;
import android.os.Binder;
+import android.os.Environment;
import android.os.IBinder;
import android.os.Message;
import android.os.Messenger;
@@ -117,7 +118,7 @@
// If true, VCardExporter is able to emits files longer than 8.3 format.
private static final boolean ALLOW_LONG_FILE_NAME = false;
- private String mTargetDirectory;
+ private File mTargetDirectory;
private String mFileNamePrefix;
private String mFileNameSuffix;
private int mFileIndexMinimum;
@@ -146,7 +147,7 @@
}
private void initExporterParams() {
- mTargetDirectory = getString(R.string.config_export_dir);
+ mTargetDirectory = Environment.getExternalStorageDirectory();
mFileNamePrefix = getString(R.string.config_export_file_prefix);
mFileNameSuffix = getString(R.string.config_export_file_suffix);
mFileNameExtension = getString(R.string.config_export_file_extension);
@@ -453,7 +454,7 @@
* @return destination path for a vCard file to be exported. null on error and mErrorReason
* is correctly set.
*/
- private String getAppropriateDestination(final String destDirectory) {
+ private String getAppropriateDestination(final File destDirectory) {
/*
* Here, file names have 5 parts: directory, prefix, index, suffix, and extension.
* e.g. "/mnt/sdcard/prfx00001sfx.vcf" -> "/mnt/sdcard", "prfx", "00001", "sfx", and ".vcf"
@@ -498,28 +499,30 @@
for (int i = mFileIndexMinimum; i <= mFileIndexMaximum; i++) {
boolean numberIsAvailable = true;
- String body = null;
+ final String body = String.format(bodyFormat, mFileNamePrefix, i, mFileNameSuffix);
+ // Make sure that none of the extensions of mExtensionsToConsider matches. If this
+ // number is free, we'll go ahead with mFileNameExtension (which is included in
+ // mExtensionsToConsider)
for (String possibleExtension : mExtensionsToConsider) {
- body = String.format(bodyFormat, mFileNamePrefix, i, mFileNameSuffix);
- final String path =
- String.format("%s/%s.%s", destDirectory, body, possibleExtension);
+ final File file = new File(destDirectory, body + "." + possibleExtension);
+ final String path = file.getAbsolutePath();
synchronized (this) {
+ // Is this being exported right now? Skip this number
if (mReservedDestination.contains(path)) {
if (DEBUG) {
- Log.d(LOG_TAG, String.format("The path %s is reserved.", path));
+ Log.d(LOG_TAG, String.format("%s is already being exported.", path));
}
numberIsAvailable = false;
break;
}
}
- final File file = new File(path);
if (file.exists()) {
numberIsAvailable = false;
break;
}
}
if (numberIsAvailable) {
- return String.format("%s/%s.%s", destDirectory, body, mFileNameExtension);
+ return new File(destDirectory, body + "." + mFileNameExtension).getAbsolutePath();
}
}