From 72c50522229c0f22db4570ef45617c5ef1f7eaa6 Mon Sep 17 00:00:00 2001 From: Daisuke Miyakawa Date: Tue, 7 Jul 2009 15:37:59 -0700 Subject: [PATCH] VCardImporter, VCardExporter --- AndroidManifest.xml | 4 + res/drawable-finger/ic_menu_export_contact.png | Bin 0 -> 1990 bytes res/values/config.xml | 5 +- res/values/strings.xml | 41 +++++++- res/values/styles.xml | 9 ++ src/com/android/contacts/ContactsListActivity.java | 25 ++++- ...VCardImporter.java => ImportVCardActivity.java} | 116 ++++++++++++--------- 7 files changed, 144 insertions(+), 56 deletions(-) create mode 100644 res/drawable-finger/ic_menu_export_contact.png rename src/com/android/contacts/{VCardImporter.java => ImportVCardActivity.java} (88%) diff --git a/AndroidManifest.xml b/AndroidManifest.xml index 33d8168..9ff4b4b 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -26,6 +26,7 @@ + + + diff --git a/res/drawable-finger/ic_menu_export_contact.png b/res/drawable-finger/ic_menu_export_contact.png new file mode 100644 index 0000000000000000000000000000000000000000..d5b755481e593b7e2917ce79146640c4c48918e2 GIT binary patch literal 1990 zcmV;%2RZnOP)dbVG7wVRUJ4ZXi@?ZDjy8FETeT zFgewn-jDzQ0338hSaefwW^{L9a%BKPWN%_+AVz6&Wp{6KYjYq&Q#En5<2C>Q2Omj9 zK~!jg?O97`6YUy)W+roOl9}90)6^zutF54Is4mn^Q&Gg#5jTRMjUWhaELdD9h(EL& zrL_M-ab=^6g1a6>LA8Mz^{fWe?t&N#V<8AHHG)@-#=(FnKpLb0u)8T zhYueve*XM9vif*%};93Huuq6T>j|XnI8&gwL z9RSeW+&lsRpFVvu#BOYC9I14F+7bblWs%8b(AU>D3IP56{QzL7&9dyy5zuuV>2$ha zuf8|R-q9Y=b-gHnrfEgxM%(M5;$_rqHv1Wdk$|5G?6kceD(V52Wu+4*PJGccZFzEX zGDHwWQ7f$tX0*K?Dk31uav~52fMFPM&z?OKG)+U6<%)ysBr2W*qA0>{w zYzPDb$mMeA>FFtwt+lna(&fvSBNmJ0UnFUqI+tY`^YinF#bV3jBbULpZMMBqgWV2a(|Nb3wb94Ck@#Ej) z*HNpeX7pfbs+whJh^0c<|uC=vD*Xzkfe+^5n_rv17+ZX__{Kgvn%rD2iBFSt(gw z=5g$Ye7Ao}8SFlqxR}Fya$qLqkLO;K74~UauEsvl#?IY`fk}CWBkI zZk;YyUPOSVX`DNEPG4SLF6o@jX7Tdn%aSv*t*vcf-@biUYiepBNm60VZkNDD^Rhr- zdV2cefddByeLf#@xm-!-L?ZFiGlpTLBS(%5*Vos#yWMVBtyWMJ1;ChIEtg9kg^et~ zh|0I;~Yi1G39 zM2&cpym48y?Xa-pfIsdHNdG))6VQ8;z#RK#w#cUD(d7sk7) zs+gUf9i5t*N&rAInS{gP2yz_f%eN#+l3-aDBuRo{m{zCL*~+pkc%JWi{rYtH7BVTO<~XMJ6UDW+o;kZXZ8> zeE8_mqZ0%{KvmWEs;VYrS&q)m&W=8P`gFKdJW&+GilP)^Y{%e4PABH(<`UPgU4zA9fubmg$KwN!A3q*g?_EI*&MW3EJ3r`?5nD(f+&ix zTCL!Dz9K2IB{7$m$pBDOQ`28nRaJCeE>vzZf#-Qhk_3if;Pd(VtyU{kRfWl90!`Ck z7zP~2fn`~+EDMHVO3DyJ)#&Pjx5MFp)oLy2N0MYAQ2?MQ3TCspP)1Qy(Y0Q(J3@dY zNpKuj@t>OYd^Z{@<;u4tTw<}<#rzWYPh5(kAQp>VER_qf5%d3d{Pw?D{}A}q`0WY& Y7olXX@@ZlQ6951J07*qoM6N<$f=dIRZ~y=R literal 0 HcmV?d00001 diff --git a/res/values/config.xml b/res/values/config.xml index 9747fd1..369759c 100644 --- a/res/values/config.xml +++ b/res/values/config.xml @@ -19,7 +19,7 @@ - false + false @@ -30,4 +30,7 @@ If config_import_all_vcard_from_sdcard_automatically is set true, this configuration is ignored. --> false + + + false diff --git a/res/values/strings.xml b/res/values/strings.xml index fe866f7..86722f0 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -670,4 +670,43 @@ %s of %s files - + + + Export contacts + + + Confirmation for export + + + Is it ok to export your contact list to \"%s\"? + + + Exporting contact data has failed + + + Exporting contact data has failed\nReason for failure: \"%s\" + + + Too many VCard data on the SD Card + + + Cannot open or create the destination directory\"%s\" + + + Exporting contact data + + + Exporting contact data to \"%s\" + + + Could not initialize the exporter: \"%s\" + + + Error occured during export: \"%s\" + + + Could not open \"%s\": %s + + + %s of %s contacts + \ No newline at end of file diff --git a/res/values/styles.xml b/res/values/styles.xml index c202eda..998da21 100644 --- a/res/values/styles.xml +++ b/res/values/styles.xml @@ -35,4 +35,13 @@ @null + + diff --git a/src/com/android/contacts/ContactsListActivity.java b/src/com/android/contacts/ContactsListActivity.java index 968252e..51363be 100644 --- a/src/com/android/contacts/ContactsListActivity.java +++ b/src/com/android/contacts/ContactsListActivity.java @@ -109,6 +109,7 @@ public final class ContactsListActivity extends ListActivity public static final int MENU_NEW_CONTACT = 10; public static final int MENU_DISPLAY_GROUP = 11; public static final int MENU_IMPORT_CONTACTS = 12; + public static final int MENU_EXPORT_CONTACTS = 13; private static final int SUBACTIVITY_NEW_CONTACT = 1; @@ -335,8 +336,7 @@ public final class ContactsListActivity extends ListActivity if (mIndex == IMPORT_FROM_SIM) { doImportFromSim(); } else { - VCardImporter importer = new VCardImporter(ContactsListActivity.this, mHandler); - importer.startImportVCardFromSdCard(); + doImportFromSDCard(); } } else if (which == DialogInterface.BUTTON_NEGATIVE) { @@ -797,6 +797,12 @@ public final class ContactsListActivity extends ListActivity menu.add(0, MENU_IMPORT_CONTACTS, 0, R.string.importFromSim) .setIcon(R.drawable.ic_menu_import_contact); + /* Temporarily commented out + if (getResources().getBoolean(R.bool.config_allow_export_to_sdcard)) { + menu.add(0, MENU_EXPORT_CONTACTS, 0, R.string.export_contact_list) + .setIcon(R.drawable.ic_menu_export_contact); + }*/ + return super.onCreateOptionsMenu(menu); } @@ -861,7 +867,7 @@ public final class ContactsListActivity extends ListActivity return true; case MENU_IMPORT_CONTACTS: - if (getResources().getBoolean(R.bool.config_allow_import_from_sd_card)) { + if (getResources().getBoolean(R.bool.config_allow_import_from_sdcard)) { ImportTypeSelectedListener listener = new ImportTypeSelectedListener(); AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(this) @@ -878,6 +884,8 @@ public final class ContactsListActivity extends ListActivity } return true; + /*case MENU_EXPORT_CONTACTS: + handleExportContacts();*/ } return false; } @@ -889,6 +897,17 @@ public final class ContactsListActivity extends ListActivity startActivity(importIntent); } + private void doImportFromSDCard() { + Intent intent = new Intent(this, ImportVCardActivity.class); + startActivity(intent); + } + + /* + private void handleExportContacts() { + VCardExporter exporter = new VCardExporter(ContactsListActivity.this, mHandler); + exporter.startExportVCardToSdCard(); + }*/ + @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { diff --git a/src/com/android/contacts/VCardImporter.java b/src/com/android/contacts/ImportVCardActivity.java similarity index 88% rename from src/com/android/contacts/VCardImporter.java rename to src/com/android/contacts/ImportVCardActivity.java index e987e85..07eb821 100644 --- a/src/com/android/contacts/VCardImporter.java +++ b/src/com/android/contacts/ImportVCardActivity.java @@ -16,6 +16,7 @@ package com.android.contacts; +import android.app.Activity; import android.app.AlertDialog; import android.app.ProgressDialog; import android.content.ContentResolver; @@ -23,6 +24,7 @@ import android.content.Context; import android.content.DialogInterface; import android.content.DialogInterface.OnCancelListener; import android.content.DialogInterface.OnClickListener; +import android.os.Bundle; import android.os.Handler; import android.os.PowerManager; import android.syncml.pim.VBuilder; @@ -81,15 +83,27 @@ class VCardFile { * Class for importing vCard. Several user interaction will be required while reading * (selecting a file, waiting a moment, etc.) */ -public class VCardImporter { - private static final String LOG_TAG = "VCardImporter"; +public class ImportVCardActivity extends Activity { + private static final String LOG_TAG = "ImportVCardActivity"; private static final boolean DO_PERFORMANCE_PROFILE = false; private ProgressDialog mProgressDialog; - private Context mParentContext; - private Handler mParentHandler; + private Handler mHandler = new Handler(); private boolean mLastNameComesBeforeFirstName; + private class CancelListener + implements DialogInterface.OnClickListener, DialogInterface.OnCancelListener { + public void onClick(DialogInterface dialog, int which) { + finish(); + } + + public void onCancel(DialogInterface dialog) { + finish(); + } + } + + private CancelListener mCancelListener = new CancelListener(); + private class ErrorDisplayer implements Runnable { private String mErrorMessage; @@ -101,11 +115,12 @@ public class VCardImporter { String message = getString(R.string.reading_vcard_failed_message, mErrorMessage); AlertDialog.Builder builder = - new AlertDialog.Builder(mParentContext) + new AlertDialog.Builder(ImportVCardActivity.this) .setTitle(getString(R.string.reading_vcard_failed_title)) .setIcon(android.R.drawable.ic_dialog_alert) .setMessage(message) - .setPositiveButton(android.R.string.ok, null); + .setOnCancelListener(mCancelListener) + .setPositiveButton(android.R.string.ok, mCancelListener); builder.show(); } } @@ -132,8 +147,9 @@ public class VCardImporter { } private void init() { - mResolver = mParentContext.getContentResolver(); - PowerManager powerManager = (PowerManager)mParentContext.getSystemService( + Context context = ImportVCardActivity.this; + mResolver = context.getContentResolver(); + PowerManager powerManager = (PowerManager)context.getSystemService( Context.POWER_SERVICE); mWakeLock = powerManager.newWakeLock( PowerManager.SCREEN_DIM_WAKE_LOCK | @@ -226,17 +242,19 @@ public class VCardImporter { } finally { mWakeLock.release(); mProgressDialog.dismiss(); + finish(); } } private void doActuallyReadOneVCard(String charset, boolean doIncrementProgress, VCardSourceDetector detector) { VCardDataBuilder builder; + final Context context = ImportVCardActivity.this; if (charset != null) { builder = new VCardDataBuilder(mResolver, mProgressDialog, - mParentContext.getString(R.string.reading_vcard_message), - mParentHandler, + context.getString(R.string.reading_vcard_message), + mHandler, charset, charset, false, @@ -244,8 +262,8 @@ public class VCardImporter { } else { builder = new VCardDataBuilder(mResolver, mProgressDialog, - mParentContext.getString(R.string.reading_vcard_message), - mParentHandler, + context.getString(R.string.reading_vcard_message), + mHandler, null, null, false, @@ -304,7 +322,7 @@ public class VCardImporter { mProgressDialog.dismiss(); - mParentHandler.post(new ErrorDisplayer( + mHandler.post(new ErrorDisplayer( getString(R.string.fail_reason_io_error) + " (" + e.getMessage() + ")")); return false; @@ -313,7 +331,7 @@ public class VCardImporter { throw e; } else { Log.e(LOG_TAG, "VCardNestedException was emitted: " + e); - mParentHandler.post(new ErrorDisplayer( + mHandler.post(new ErrorDisplayer( getString(R.string.fail_reason_vcard_parse_error) + " (" + e.getMessage() + ")")); return false; @@ -321,7 +339,7 @@ public class VCardImporter { } catch (VCardException e) { Log.e(LOG_TAG, "VCardException was emitted: " + e); - mParentHandler.post(new ErrorDisplayer( + mHandler.post(new ErrorDisplayer( getString(R.string.fail_reason_vcard_parse_error) + " (" + e.getMessage() + ")")); return false; @@ -357,7 +375,7 @@ public class VCardImporter { showVCardFileSelectDialog(mVCardFileList); } } else if (which == DialogInterface.BUTTON_NEGATIVE) { - + finish(); } else { mCurrentIndex = which; } @@ -377,7 +395,7 @@ public class VCardImporter { if (which == DialogInterface.BUTTON_POSITIVE) { importOneVCardFromSDCard(mVCardFileList.get(mCurrentIndex).getCanonicalPath()); } else if (which == DialogInterface.BUTTON_NEGATIVE) { - + finish(); } else { // Some file is selected. mCurrentIndex = which; @@ -410,7 +428,7 @@ public class VCardImporter { mRootDirectory = sdcardDirectory; mCheckedPaths = new HashSet(); mVCardFiles = new Vector(); - PowerManager powerManager = (PowerManager)mParentContext.getSystemService( + PowerManager powerManager = (PowerManager)ImportVCardActivity.this.getSystemService( Context.POWER_SERVICE); mWakeLock = powerManager.newWakeLock( PowerManager.SCREEN_DIM_WAKE_LOCK | @@ -437,43 +455,46 @@ public class VCardImporter { mProgressDialog.dismiss(); if (mGotIOException) { - mParentHandler.post(new Runnable() { + 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(mParentContext) + new AlertDialog.Builder(ImportVCardActivity.this) .setTitle(R.string.scanning_sdcard_failed_title) .setIcon(android.R.drawable.ic_dialog_alert) .setMessage(message) - .setPositiveButton(android.R.string.ok, null); + .setOnCancelListener(mCancelListener) + .setPositiveButton(android.R.string.ok, mCancelListener); builder.show(); } }); } else if (mCanceled) { - return; + finish(); } else { - mParentHandler.post(new Runnable() { + mHandler.post(new Runnable() { public void run() { int size = mVCardFiles.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(mParentContext) + new AlertDialog.Builder(context) .setTitle(R.string.scanning_sdcard_failed_title) .setMessage(message) - .setPositiveButton(android.R.string.ok, null); + .setOnCancelListener(mCancelListener) + .setPositiveButton(android.R.string.ok, mCancelListener); builder.show(); return; - } else if (mParentContext.getResources().getBoolean( + } else if (context.getResources().getBoolean( R.bool.config_import_all_vcard_from_sdcard_automatically)) { importAllVCardFromSDCard(mVCardFiles); } else if (size == 1) { importOneVCardFromSDCard(mVCardFiles.get(0).getCanonicalPath()); - } else if (mParentContext.getResources().getBoolean( + } else if (context.getResources().getBoolean( R.bool.config_allow_users_select_all_vcard_import)) { showSelectImportTypeDialog(mVCardFiles); } else { @@ -541,10 +562,11 @@ public class VCardImporter { DialogInterface.OnClickListener listener = new ImportTypeSelectedListener(vcardFileList); AlertDialog.Builder builder = - new AlertDialog.Builder(mParentContext) + new AlertDialog.Builder(ImportVCardActivity.this) .setTitle(R.string.select_vcard_title) .setPositiveButton(android.R.string.ok, listener) - .setNegativeButton(android.R.string.cancel, null); + .setOnCancelListener(mCancelListener) + .setNegativeButton(android.R.string.cancel, mCancelListener); String[] items = new String[2]; items[ImportTypeSelectedListener.IMPORT_ALL] = @@ -561,10 +583,11 @@ public class VCardImporter { DialogInterface.OnClickListener listener = new VCardSelectedListener(vcardFileList); AlertDialog.Builder builder = - new AlertDialog.Builder(mParentContext) + new AlertDialog.Builder(this) .setTitle(R.string.select_vcard_title) .setPositiveButton(android.R.string.ok, listener) - .setNegativeButton(android.R.string.cancel, null); + .setOnCancelListener(mCancelListener) + .setNegativeButton(android.R.string.cancel, mCancelListener); CharSequence[] items = new CharSequence[size]; DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); @@ -591,7 +614,7 @@ public class VCardImporter { private void showReadingVCardDialog(DialogInterface.OnCancelListener listener) { String title = getString(R.string.reading_vcard_title); String message = getString(R.string.reading_vcard_message); - mProgressDialog = new ProgressDialog(mParentContext); + mProgressDialog = new ProgressDialog(this); mProgressDialog.setTitle(title); mProgressDialog.setMessage(message); mProgressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); @@ -599,23 +622,14 @@ public class VCardImporter { mProgressDialog.show(); } - private String getString(int resId, Object... formatArgs) { - return mParentContext.getString(resId, formatArgs); - } - - private String getString(int resId) { - return mParentContext.getString(resId); - } + @Override + protected void onCreate(Bundle bundle) { + super.onCreate(bundle); - /** - * @param parentContext must not be null - * @param parentHandler must not be null - */ - public VCardImporter(Context parentContext, Handler parentHandler) { - mParentContext = parentContext; - mParentHandler = parentHandler; - mLastNameComesBeforeFirstName = parentContext.getResources().getBoolean( + mLastNameComesBeforeFirstName = getResources().getBoolean( com.android.internal.R.bool.config_lastname_comes_before_firstname); + + startImportVCardFromSdCard(); } /** @@ -627,18 +641,18 @@ public class VCardImporter { public void startImportVCardFromSdCard() { File file = new File("/sdcard"); if (!file.exists() || !file.isDirectory() || !file.canRead()) { - new AlertDialog.Builder(mParentContext) + new AlertDialog.Builder(this) .setTitle(R.string.no_sdcard_title) .setIcon(android.R.drawable.ic_dialog_alert) .setMessage(R.string.no_sdcard_message) - .setPositiveButton(android.R.string.ok, null) + .setOnCancelListener(mCancelListener) + .setPositiveButton(android.R.string.ok, mCancelListener) .show(); } else { String title = getString(R.string.searching_vcard_title); String message = getString(R.string.searching_vcard_message); - mProgressDialog = ProgressDialog.show(mParentContext, - title, message, true, false); + mProgressDialog = ProgressDialog.show(this, title, message, true, false); VCardScanThread thread = new VCardScanThread(file); mProgressDialog.setOnCancelListener(thread); thread.start(); -- 2.11.0