Move account selection logic from ImportVCardActivity to ContactListActivity.
Making this change enables SimImport in Phone application utilize account selection
done in ContactListActivity.
This change also fixes internal window leak repored in the internal issue 2124725.
Issue:
Found that the screen freezes when a user slides a hardware keyboard during the import.
Will report it as another issue.
diff --git a/res/values/ids.xml b/res/values/ids.xml
index 892569a..7a5bba8 100644
--- a/res/values/ids.xml
+++ b/res/values/ids.xml
@@ -30,4 +30,13 @@
<item type="id" name="dialog_import_export" />
+ <!-- For ImportVCardActivity -->
+ <item type="id" name="dialog_sdcard_not_found" />
+ <item type="id" name="dialog_vcard_not_found" />
+ <item type="id" name="dialog_select_import_type" />
+ <item type="id" name="dialog_select_one_vcard" />
+ <item type="id" name="dialog_select_multiple_vcard" />
+ <item type="id" name="dialog_reading_vcard" />
+ <item type="id" name="dialog_io_exception" />
+
</resources>
diff --git a/src/com/android/contacts/ContactsListActivity.java b/src/com/android/contacts/ContactsListActivity.java
index ef213df..970deea 100644
--- a/src/com/android/contacts/ContactsListActivity.java
+++ b/src/com/android/contacts/ContactsListActivity.java
@@ -16,15 +16,7 @@
package com.android.contacts;
-import com.android.contacts.model.ContactsSource;
-import com.android.contacts.model.EntityModifier;
-import com.android.contacts.model.Sources;
-import com.android.contacts.model.ContactsSource.DataKind;
-import com.android.contacts.model.ContactsSource.EditType;
-import com.android.contacts.ui.DisplayGroupsActivity;
-import com.android.contacts.ui.DisplayGroupsActivity.Prefs;
-import com.android.contacts.util.Constants;
-
+import android.accounts.Account;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog;
@@ -97,17 +89,25 @@
import android.widget.FasttrackBadgeWidget;
import android.widget.Filter;
import android.widget.ImageView;
-import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.ResourceCursorAdapter;
import android.widget.SectionIndexer;
import android.widget.TextView;
import android.widget.AbsListView.OnScrollListener;
+import com.android.contacts.model.ContactsSource;
+import com.android.contacts.model.Sources;
+import com.android.contacts.model.ContactsSource.DataKind;
+import com.android.contacts.model.ContactsSource.EditType;
+import com.android.contacts.ui.DisplayGroupsActivity;
+import com.android.contacts.ui.DisplayGroupsActivity.Prefs;
+import com.android.contacts.util.Constants;
+
import java.lang.ref.SoftReference;
import java.lang.ref.WeakReference;
import java.util.HashMap;
import java.util.HashSet;
+import java.util.List;
import java.util.Locale;
/*TODO(emillar) I commented most of the code that deals with modes and filtering. It should be
@@ -786,10 +786,98 @@
case R.id.dialog_import_export: {
return createImportExportDialog();
}
+ case R.string.import_from_sim:
+ case R.string.import_from_sdcard: {
+ return createSelectAccountDialog(id);
+ }
}
return super.onCreateDialog(id);
}
+ private class AccountSelectedListener
+ implements DialogInterface.OnClickListener, DialogInterface.OnCancelListener {
+
+ final private List<Account> mAccountList;
+ final private int mResId;
+
+ public AccountSelectedListener(List<Account> accountList, int resId) {
+ if (accountList == null || accountList.size() == 0) {
+ // TODO: Add all the contacts into phone-local account.
+ Log.e(TAG, "The size of Account list is 0");
+ }
+ mAccountList = accountList;
+ mResId = resId;
+ }
+
+ public void onClick(DialogInterface dialog, int which) {
+ dialog.dismiss();
+ switch (mResId) {
+ case R.string.import_from_sim: {
+ doImportFromSim(mAccountList.get(which));
+ break;
+ }
+ case R.string.import_from_sdcard: {
+ doImportFromSdCard(mAccountList.get(which));
+ break;
+ }
+ }
+ }
+
+ public void onCancel(DialogInterface dialog) {
+ dialog.dismiss();
+ }
+ }
+
+ private Dialog createSelectAccountDialog(int resId) {
+ // A lot of codes are copied from EditContactActivity.
+ // TODO: Can we share the logic?
+ final Sources sources = Sources.getInstance(this);
+ final List<Account> accountList = sources.getAccounts(true);
+
+ // Wrap our context to inflate list items using correct theme
+ final Context dialogContext = new ContextThemeWrapper(
+ this, android.R.style.Theme_Light);
+ final LayoutInflater dialogInflater = (LayoutInflater)dialogContext
+ .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
+ final ArrayAdapter<Account> accountAdapter =
+ new ArrayAdapter<Account>(this, android.R.layout.simple_list_item_2, accountList) {
+
+ @Override
+ public View getView(int position, View convertView,
+ ViewGroup parent) {
+ if (convertView == null) {
+ convertView = dialogInflater.inflate(
+ android.R.layout.simple_list_item_2,
+ parent, false);
+ }
+
+ // TODO: show icon along with title
+ final TextView text1 =
+ (TextView)convertView.findViewById(android.R.id.text1);
+ final TextView text2 =
+ (TextView)convertView.findViewById(android.R.id.text2);
+
+ final Account account = this.getItem(position);
+ final ContactsSource source =
+ sources.getInflatedSource(account.type,
+ ContactsSource.LEVEL_SUMMARY);
+
+ text1.setText(source.getDisplayLabel(ContactsListActivity.this));
+ text2.setText(account.name);
+
+ return convertView;
+ }
+ };
+
+ AccountSelectedListener listener = new AccountSelectedListener(accountList, resId);
+ final AlertDialog.Builder builder =
+ new AlertDialog.Builder(this)
+ .setTitle(R.string.dialog_new_contact_account)
+ .setSingleChoiceItems(accountAdapter, 0, listener)
+ .setOnCancelListener(listener);
+ return builder.create();
+ }
+
/**
* Create a {@link Dialog} that allows the user to pick from a bulk import
* or bulk export task across all contacts.
@@ -833,12 +921,9 @@
final int resId = adapter.getItem(which);
switch (resId) {
- case R.string.import_from_sim: {
- doImportFromSim();
- break;
- }
+ case R.string.import_from_sim:
case R.string.import_from_sdcard: {
- doImportFromSdCard();
+ showDialog(resId);
break;
}
case R.string.export_to_sdcard: {
@@ -856,16 +941,20 @@
return builder.create();
}
- private void doImportFromSim() {
+ private void doImportFromSim(Account account) {
Intent importIntent = new Intent(Intent.ACTION_VIEW);
importIntent.setType("vnd.android.cursor.item/sim-contact");
+ importIntent.putExtra("account_name", account.name);
+ importIntent.putExtra("account_type", account.type);
importIntent.setClassName("com.android.phone", "com.android.phone.SimContacts");
startActivity(importIntent);
}
- private void doImportFromSdCard() {
- Intent intent = new Intent(this, ImportVCardActivity.class);
- startActivity(intent);
+ private void doImportFromSdCard(Account account) {
+ Intent importIntent = new Intent(this, ImportVCardActivity.class);
+ importIntent.putExtra("account_name", account.name);
+ importIntent.putExtra("account_type", account.type);
+ startActivity(importIntent);
}
private void doExportToSdCard() {
diff --git a/src/com/android/contacts/ImportVCardActivity.java b/src/com/android/contacts/ImportVCardActivity.java
index c0b7634..ad544c5 100644
--- a/src/com/android/contacts/ImportVCardActivity.java
+++ b/src/com/android/contacts/ImportVCardActivity.java
@@ -19,10 +19,12 @@
import android.accounts.Account;
import android.app.Activity;
import android.app.AlertDialog;
+import android.app.Dialog;
import android.app.ProgressDialog;
import android.content.ContentResolver;
import android.content.Context;
import android.content.DialogInterface;
+import android.content.Intent;
import android.content.DialogInterface.OnCancelListener;
import android.content.DialogInterface.OnClickListener;
import android.os.Bundle;
@@ -43,17 +45,9 @@
import android.pim.vcard.exception.VCardVersionException;
import android.text.SpannableStringBuilder;
import android.text.Spanned;
+import android.text.TextUtils;
import android.text.style.RelativeSizeSpan;
import android.util.Log;
-import android.view.ContextThemeWrapper;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.ViewGroup;
-import android.widget.ArrayAdapter;
-import android.widget.TextView;
-
-import com.android.contacts.model.ContactsSource;
-import com.android.contacts.model.Sources;
import java.io.File;
import java.io.FileInputStream;
@@ -103,6 +97,10 @@
private ProgressDialog mProgressDialog;
private Handler mHandler = new Handler();
+ private Account mAccount;
+
+ private List<VCardFile> mAllVCardFileList;
+ private VCardReadThread mVCardReadThread;
private class CancelListener
implements DialogInterface.OnClickListener, DialogInterface.OnCancelListener {
@@ -146,24 +144,18 @@
private PowerManager.WakeLock mWakeLock;
private String mCanonicalPath;
- // For reading multiple files.
- private List<VCardFile> mVCardFileList;
+ private List<VCardFile> mSelectedVCardFileList;
private List<String> mErrorFileNameList;
- final private Account mAccount;
-
- public VCardReadThread(String canonicalPath, Account account) {
+ public VCardReadThread(String canonicalPath) {
mCanonicalPath = canonicalPath;
- mVCardFileList = null;
- mAccount = account;
init();
}
- public VCardReadThread(List<VCardFile> vcardFileList, Account account) {
+ public VCardReadThread(final List<VCardFile> selectedVCardFileList) {
mCanonicalPath = null;
- mVCardFileList = vcardFileList;
+ mSelectedVCardFileList = selectedVCardFileList;
mErrorFileNameList = new ArrayList<String>();
- mAccount = account;
init();
}
@@ -242,10 +234,10 @@
} else { // Read multiple files.
mProgressDialog.setProgressNumberFormat(
getString(R.string.reading_vcard_files));
- mProgressDialog.setMax(mVCardFileList.size());
+ mProgressDialog.setMax(mSelectedVCardFileList.size());
mProgressDialog.setProgress(0);
- for (VCardFile vcardFile : mVCardFileList) {
+ for (VCardFile vcardFile : mSelectedVCardFileList) {
if (mCanceled) {
return;
}
@@ -286,7 +278,7 @@
}
mHandler.post(new ErrorDisplayer(
- getString(R.string.fail_reason_failed_to_read_files,
+ getString(R.string.fail_reason_failed_to_read_files,
builder.toString())));
}
}
@@ -367,7 +359,7 @@
} else {
mHandler.post(new ErrorDisplayer(
getString(R.string.fail_reason_io_error,
- e.getMessage())));
+ e.getMessage())));
}
return false;
} catch (VCardNotSupportedException e) {
@@ -410,26 +402,20 @@
public static final int IMPORT_ALL = 2;
public static final int IMPORT_TYPE_SIZE = 3;
- final private List<VCardFile> mVCardFileList;
- final private Account mAccount;
private int mCurrentIndex;
- public ImportTypeSelectedListener(List<VCardFile> vcardFileList, Account account) {
- mVCardFileList = vcardFileList;
- mAccount = account;
- }
-
public void onClick(DialogInterface dialog, int which) {
if (which == DialogInterface.BUTTON_POSITIVE) {
switch (mCurrentIndex) {
case IMPORT_ALL:
- importMultipleVCardFromSDCard(mVCardFileList, mAccount);
+ importMultipleVCardFromSDCard(mAllVCardFileList);
break;
case IMPORT_MULTIPLE:
- showVCardFileSelectDialog(mVCardFileList, mAccount, true);
+ showDialog(R.id.dialog_select_multiple_vcard);
break;
default:
- showVCardFileSelectDialog(mVCardFileList, mAccount, false);
+ showDialog(R.id.dialog_select_one_vcard);
+ break;
}
} else if (which == DialogInterface.BUTTON_NEGATIVE) {
finish();
@@ -438,44 +424,13 @@
}
}
}
-
- private class AccountSelectedListener
- implements DialogInterface.OnClickListener, DialogInterface.OnCancelListener {
-
- final private List<Account> mAccountList;
- final private List<VCardFile> mVCardFileList;
-
- public AccountSelectedListener(List<Account> accountList, List<VCardFile> vcardFileList) {
- if (accountList == null || accountList.size() == 0) {
- Log.e(LOG_TAG, "The size of Account list is 0");
- }
- mAccountList = accountList;
- mVCardFileList = vcardFileList;
- }
-
- public void onClick(DialogInterface dialog, int which) {
- dialog.dismiss();
- startVCardSelectAndImport(mVCardFileList, mAccountList.get(which));
- }
-
- public void onCancel(DialogInterface dialog) {
- finish();
- }
- }
private class VCardSelectedListener implements
DialogInterface.OnClickListener, DialogInterface.OnMultiChoiceClickListener {
- final private List<VCardFile> mVCardFileList;
- final private Account mAccount;
private int mCurrentIndex;
private Set<Integer> mSelectedIndexSet;
- public VCardSelectedListener(
- List<VCardFile> vcardFileList,
- Account account,
- boolean multipleSelect) {
- mVCardFileList = vcardFileList;
- mAccount = account;
+ public VCardSelectedListener(boolean multipleSelect) {
mCurrentIndex = 0;
if (multipleSelect) {
mSelectedIndexSet = new HashSet<Integer>();
@@ -486,17 +441,16 @@
if (which == DialogInterface.BUTTON_POSITIVE) {
if (mSelectedIndexSet != null) {
List<VCardFile> selectedVCardFileList = new ArrayList<VCardFile>();
- int size = mVCardFileList.size();
+ int size = mAllVCardFileList.size();
// We'd like to sort the files by its index, so we do not use Set iterator.
for (int i = 0; i < size; i++) {
if (mSelectedIndexSet.contains(i)) {
- selectedVCardFileList.add(mVCardFileList.get(i));
+ selectedVCardFileList.add(mAllVCardFileList.get(i));
}
}
- importMultipleVCardFromSDCard(selectedVCardFileList, mAccount);
+ importMultipleVCardFromSDCard(selectedVCardFileList);
} else {
- importOneVCardFromSDCard(mVCardFileList.get(mCurrentIndex).getCanonicalPath(),
- mAccount);
+ importOneVCardFromSDCard(mAllVCardFileList.get(mCurrentIndex).getCanonicalPath());
}
} else if (which == DialogInterface.BUTTON_NEGATIVE) {
finish();
@@ -516,7 +470,7 @@
public void onClick(DialogInterface dialog, int which, boolean isChecked) {
if (mSelectedIndexSet == null || (mSelectedIndexSet.contains(which) == isChecked)) {
Log.e(LOG_TAG, String.format("Inconsist state in index %d (%s)", which,
- mVCardFileList.get(which).getCanonicalPath()));
+ mAllVCardFileList.get(which).getCanonicalPath()));
} else {
onClick(dialog, which);
}
@@ -532,9 +486,6 @@
private boolean mGotIOException;
private File mRootDirectory;
- // null when search operation is canceled.
- private List<VCardFile> mVCardFileList;
-
// To avoid recursive link.
private Set<String> mCheckedPaths;
private PowerManager.WakeLock mWakeLock;
@@ -547,7 +498,6 @@
mGotIOException = false;
mRootDirectory = sdcardDirectory;
mCheckedPaths = new HashSet<String>();
- mVCardFileList = new Vector<VCardFile>();
PowerManager powerManager = (PowerManager)ImportVCardActivity.this.getSystemService(
Context.POWER_SERVICE);
mWakeLock = powerManager.newWakeLock(
@@ -557,6 +507,7 @@
@Override
public void run() {
+ mAllVCardFileList = new Vector<VCardFile>();
try {
mWakeLock.acquire();
getVCardFileRecursively(mRootDirectory);
@@ -569,7 +520,7 @@
}
if (mCanceled) {
- mVCardFileList = null;
+ mAllVCardFileList = null;
}
mProgressDialog.dismiss();
@@ -577,95 +528,23 @@
if (mGotIOException) {
mHandler.post(new Runnable() {
public void run() {
- String message = (getString(R.string.scanning_sdcard_failed_message,
- getString(R.string.fail_reason_io_error)));
-
- AlertDialog.Builder builder =
- new AlertDialog.Builder(ImportVCardActivity.this)
- .setTitle(R.string.scanning_sdcard_failed_title)
- .setIcon(android.R.drawable.ic_dialog_alert)
- .setMessage(message)
- .setOnCancelListener(mCancelListener)
- .setPositiveButton(android.R.string.ok, mCancelListener);
- builder.show();
+ showDialog(R.id.dialog_io_exception);
}
});
} else if (mCanceled) {
finish();
} else {
- // TODO: too many nest. Clean up this code...
- mHandler.post(new Runnable() {
- public void run() {
- int size = mVCardFileList.size();
- final Context context = ImportVCardActivity.this;
- if (size == 0) {
- String message = (getString(R.string.scanning_sdcard_failed_message,
- getString(R.string.fail_reason_no_vcard_file)));
-
- AlertDialog.Builder builder =
- new AlertDialog.Builder(context)
- .setTitle(R.string.scanning_sdcard_failed_title)
- .setMessage(message)
- .setOnCancelListener(mCancelListener)
- .setPositiveButton(android.R.string.ok, mCancelListener);
- builder.show();
- return;
- } else {
- final Sources sources = Sources.getInstance(context);
- final List<Account> accountList = sources.getAccounts(true);
- if (accountList == null || accountList.size() == 0) {
- startVCardSelectAndImport(mVCardFileList, null);
- } else {
- // A lot of codes are copied from EditContactActivity.
- // TODO: Can we share the logic?
-
- // Wrap our context to inflate list items using correct theme
- final Context dialogContext = new ContextThemeWrapper(
- context, android.R.style.Theme_Light);
- final LayoutInflater dialogInflater = (LayoutInflater)dialogContext
- .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
- final ArrayAdapter<Account> accountAdapter =
- new ArrayAdapter<Account>(context,
- android.R.layout.simple_list_item_2, accountList) {
- @Override
- public View getView(int position, View convertView,
- ViewGroup parent) {
- if (convertView == null) {
- convertView = dialogInflater.inflate(
- android.R.layout.simple_list_item_2,
- parent, false);
- }
-
- // TODO: show icon along with title
- final TextView text1 =
- (TextView)convertView.findViewById(android.R.id.text1);
- final TextView text2 =
- (TextView)convertView.findViewById(android.R.id.text2);
-
- final Account account = this.getItem(position);
- final ContactsSource source =
- sources.getInflatedSource(account.type,
- ContactsSource.LEVEL_SUMMARY);
-
- text1.setText(source.getDisplayLabel(context));
- text2.setText(account.name);
-
- return convertView;
- }
- };
-
- AccountSelectedListener listener =
- new AccountSelectedListener(accountList, mVCardFileList);
- final AlertDialog.Builder builder =
- new AlertDialog.Builder(context)
- .setTitle(R.string.dialog_new_contact_account)
- .setSingleChoiceItems(accountAdapter, 0, listener)
- .setOnCancelListener(listener);
- builder.show();
- }
+ int size = mAllVCardFileList.size();
+ final Context context = ImportVCardActivity.this;
+ if (size == 0) {
+ mHandler.post(new Runnable() {
+ public void run() {
+ showDialog(R.id.dialog_vcard_not_found);
}
- }
- });
+ });
+ } else {
+ startVCardSelectAndImport();
+ }
}
}
@@ -693,7 +572,7 @@
String fileName = file.getName();
VCardFile vcardFile = new VCardFile(
fileName, canonicalPath, file.lastModified());
- mVCardFileList.add(vcardFile);
+ mAllVCardFileList.add(vcardFile);
}
}
}
@@ -709,46 +588,55 @@
}
}
- private void startVCardSelectAndImport(final List<VCardFile> vcardFileList,
- final Account account) {
- final Context context = ImportVCardActivity.this;
- final int size = vcardFileList.size();
- if (context.getResources().getBoolean(
- R.bool.config_import_all_vcard_from_sdcard_automatically)) {
- importMultipleVCardFromSDCard(vcardFileList, account);
+ private void startVCardSelectAndImport() {
+ int size = mAllVCardFileList.size();
+ if (getResources().getBoolean(R.bool.config_import_all_vcard_from_sdcard_automatically)) {
+ importMultipleVCardFromSDCard(mAllVCardFileList);
} else if (size == 1) {
- importOneVCardFromSDCard(vcardFileList.get(0).getCanonicalPath(), account);
- } else if (context.getResources().getBoolean(
- R.bool.config_allow_users_select_all_vcard_import)) {
- showSelectImportTypeDialog(vcardFileList, account);
+ importOneVCardFromSDCard(mAllVCardFileList.get(0).getCanonicalPath());
+ } else if (getResources().getBoolean(R.bool.config_allow_users_select_all_vcard_import)) {
+ mHandler.post(new Runnable() {
+ public void run() {
+ showDialog(R.id.dialog_select_import_type);
+ }
+ });
} else {
- // Let a user to select one vCard file.
- showVCardFileSelectDialog(vcardFileList, account, false);
+ mHandler.post(new Runnable() {
+ public void run() {
+ showDialog(R.id.dialog_select_one_vcard);
+ }
+ });
}
}
- private void importOneVCardFromSDCard(final String canonicalPath, Account account) {
- VCardReadThread thread = new VCardReadThread(canonicalPath, account);
- showReadingVCardDialog(thread);
- thread.start();
+ private void importMultipleVCardFromSDCard(final List<VCardFile> selectedVCardFileList) {
+ mHandler.post(new Runnable() {
+ public void run() {
+ mVCardReadThread = new VCardReadThread(selectedVCardFileList);
+ mVCardReadThread.start();
+ showDialog(R.id.dialog_reading_vcard);
+ }
+ });
}
- private void importMultipleVCardFromSDCard(final List<VCardFile> vcardFileList,
- final Account account) {
- VCardReadThread thread = new VCardReadThread(vcardFileList, account);
- showReadingVCardDialog(thread);
- thread.start();
+ private void importOneVCardFromSDCard(final String canonicalPath) {
+ mHandler.post(new Runnable() {
+ public void run() {
+ mVCardReadThread = new VCardReadThread(canonicalPath);
+ mVCardReadThread.start();
+ showDialog(R.id.dialog_reading_vcard);
+ }
+ });
}
- private void showSelectImportTypeDialog(List<VCardFile> vcardFileList, Account account) {
+ private Dialog getSelectImportTypeDialog() {
DialogInterface.OnClickListener listener =
- new ImportTypeSelectedListener(vcardFileList, account);
- AlertDialog.Builder builder =
- new AlertDialog.Builder(ImportVCardActivity.this)
- .setTitle(R.string.select_vcard_title)
- .setPositiveButton(android.R.string.ok, listener)
- .setOnCancelListener(mCancelListener)
- .setNegativeButton(android.R.string.cancel, mCancelListener);
+ new ImportTypeSelectedListener();
+ AlertDialog.Builder builder = new AlertDialog.Builder(this)
+ .setTitle(R.string.select_vcard_title)
+ .setPositiveButton(android.R.string.ok, listener)
+ .setOnCancelListener(mCancelListener)
+ .setNegativeButton(android.R.string.cancel, mCancelListener);
String[] items = new String[ImportTypeSelectedListener.IMPORT_TYPE_SIZE];
items[ImportTypeSelectedListener.IMPORT_ONE] =
@@ -757,16 +645,13 @@
getString(R.string.import_multiple_vcard_string);
items[ImportTypeSelectedListener.IMPORT_ALL] =
getString(R.string.import_all_vcard_string);
- builder.setSingleChoiceItems(items,
- ImportTypeSelectedListener.IMPORT_ONE, listener);
- builder.show();
+ builder.setSingleChoiceItems(items, ImportTypeSelectedListener.IMPORT_ONE, listener);
+ return builder.create();
}
- private void showVCardFileSelectDialog(
- List<VCardFile> vcardFileList, Account account, boolean multipleSelect) {
- int size = vcardFileList.size();
- VCardSelectedListener listener =
- new VCardSelectedListener(vcardFileList, account, multipleSelect);
+ private Dialog getVCardFileSelectDialog(boolean multipleSelect) {
+ int size = mAllVCardFileList.size();
+ VCardSelectedListener listener = new VCardSelectedListener(multipleSelect);
AlertDialog.Builder builder =
new AlertDialog.Builder(this)
.setTitle(R.string.select_vcard_title)
@@ -777,7 +662,7 @@
CharSequence[] items = new CharSequence[size];
DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
for (int i = 0; i < size; i++) {
- VCardFile vcardFile = vcardFileList.get(i);
+ VCardFile vcardFile = mAllVCardFileList.get(i);
SpannableStringBuilder stringBuilder = new SpannableStringBuilder();
stringBuilder.append(vcardFile.getName());
stringBuilder.append('\n');
@@ -797,27 +682,88 @@
} else {
builder.setSingleChoiceItems(items, 0, listener);
}
- builder.show();
+ return builder.create();
}
- private void showReadingVCardDialog(DialogInterface.OnCancelListener listener) {
+ private Dialog getReadingVCardDialog() {
String title = getString(R.string.reading_vcard_title);
String message = getString(R.string.reading_vcard_message);
mProgressDialog = new ProgressDialog(this);
mProgressDialog.setTitle(title);
mProgressDialog.setMessage(message);
mProgressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
- mProgressDialog.setOnCancelListener(listener);
- mProgressDialog.show();
+ mProgressDialog.setOnCancelListener(mVCardReadThread);
+ return mProgressDialog;
}
@Override
protected void onCreate(Bundle bundle) {
super.onCreate(bundle);
+ Intent intent = getIntent();
+ if (intent != null) {
+ final String accountName = intent.getStringExtra("account_name");
+ final String accountType = intent.getStringExtra("account_type");
+ if (!TextUtils.isEmpty(accountName) && !TextUtils.isEmpty(accountType)) {
+ mAccount = new Account(accountName, accountType);
+ }
+ } else {
+ Log.e(LOG_TAG, "intent does not exist");
+ }
+
startImportVCardFromSdCard();
}
+ @Override
+ protected Dialog onCreateDialog(int resId) {
+ switch (resId) {
+ case R.id.dialog_sdcard_not_found: {
+ AlertDialog.Builder builder = new AlertDialog.Builder(this)
+ .setTitle(R.string.no_sdcard_title)
+ .setIcon(android.R.drawable.ic_dialog_alert)
+ .setMessage(R.string.no_sdcard_message)
+ .setOnCancelListener(mCancelListener)
+ .setPositiveButton(android.R.string.ok, mCancelListener);
+ return builder.create();
+ }
+ case R.id.dialog_vcard_not_found: {
+ String message = (getString(R.string.scanning_sdcard_failed_message,
+ getString(R.string.fail_reason_no_vcard_file)));
+ AlertDialog.Builder builder = new AlertDialog.Builder(this)
+ .setTitle(R.string.scanning_sdcard_failed_title)
+ .setMessage(message)
+ .setOnCancelListener(mCancelListener)
+ .setPositiveButton(android.R.string.ok, mCancelListener);
+ return builder.create();
+ }
+ case R.id.dialog_select_import_type: {
+ return getSelectImportTypeDialog();
+ }
+ case R.id.dialog_select_multiple_vcard: {
+ return getVCardFileSelectDialog(true);
+ }
+ case R.id.dialog_select_one_vcard: {
+ return getVCardFileSelectDialog(false);
+ }
+ case R.id.dialog_reading_vcard: {
+ return getReadingVCardDialog();
+ }
+ case R.id.dialog_io_exception: {
+ String message = (getString(R.string.scanning_sdcard_failed_message,
+ getString(R.string.fail_reason_io_error)));
+ AlertDialog.Builder builder = new AlertDialog.Builder(this)
+ .setTitle(R.string.scanning_sdcard_failed_title)
+ .setIcon(android.R.drawable.ic_dialog_alert)
+ .setMessage(message)
+ .setOnCancelListener(mCancelListener)
+ .setPositiveButton(android.R.string.ok, mCancelListener);
+ return builder.create();
+ }
+ }
+
+ return super.onCreateDialog(resId);
+ }
+
/**
* Tries to start importing VCard. If there's no SDCard available,
* an error dialog is shown. If there is, start scanning using another thread
@@ -827,13 +773,7 @@
public void startImportVCardFromSdCard() {
File file = new File("/sdcard");
if (!file.exists() || !file.isDirectory() || !file.canRead()) {
- new AlertDialog.Builder(this)
- .setTitle(R.string.no_sdcard_title)
- .setIcon(android.R.drawable.ic_dialog_alert)
- .setMessage(R.string.no_sdcard_message)
- .setOnCancelListener(mCancelListener)
- .setPositiveButton(android.R.string.ok, mCancelListener)
- .show();
+ showDialog(R.id.dialog_sdcard_not_found);
} else {
String title = getString(R.string.searching_vcard_title);
String message = getString(R.string.searching_vcard_message);