From 3d53ce29692986b304951f903f0c7554444c7cb8 Mon Sep 17 00:00:00 2001 From: Dmitri Plotnikov Date: Wed, 2 Sep 2009 08:44:32 -0700 Subject: [PATCH] Fixing support for contact shortcuts. --- res/values/strings.xml | 7 ++ .../android/contacts/BaseContactCardActivity.java | 17 +++-- src/com/android/contacts/ContactsListActivity.java | 75 ++++++++++------------ src/com/android/contacts/ViewContactActivity.java | 15 +---- 4 files changed, 57 insertions(+), 57 deletions(-) diff --git a/res/values/strings.xml b/res/values/strings.xml index e51389c..78b0131 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -847,6 +847,13 @@ Other Custom + +H +M +W +P +O + Home 2 Work 2 diff --git a/src/com/android/contacts/BaseContactCardActivity.java b/src/com/android/contacts/BaseContactCardActivity.java index bd62b8a..f5b207c 100644 --- a/src/com/android/contacts/BaseContactCardActivity.java +++ b/src/com/android/contacts/BaseContactCardActivity.java @@ -16,12 +16,10 @@ package com.android.contacts; -import java.util.ArrayList; - import com.android.contacts.ScrollingTabWidget.OnTabSelectionChangedListener; import com.android.contacts.model.ContactsSource; -import com.android.contacts.util.NotifyingAsyncQueryHandler; import com.android.contacts.model.Sources; +import com.android.contacts.util.NotifyingAsyncQueryHandler; import com.android.internal.widget.ContactHeaderWidget; import android.app.Activity; @@ -36,6 +34,7 @@ import android.graphics.drawable.Drawable; import android.net.Uri; import android.os.Bundle; import android.os.RemoteException; +import android.provider.ContactsContract; import android.provider.ContactsContract.Contacts; import android.provider.ContactsContract.RawContacts; import android.util.Log; @@ -47,6 +46,8 @@ import android.view.Window; import android.widget.ImageView; import android.widget.TextView; +import java.util.ArrayList; + /** * The base Activity class for viewing and editing a contact. */ @@ -56,6 +57,7 @@ public abstract class BaseContactCardActivity extends Activity implements private static final String TAG = "BaseContactCardActivity"; private SparseArray mTabRawContactIdMap; + protected Uri mOriginalUri; protected Uri mUri; protected ScrollingTabWidget mTabWidget; protected ContactHeaderWidget mContactHeaderWidget; @@ -85,7 +87,7 @@ public abstract class BaseContactCardActivity extends Activity implements mInflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE); final Intent intent = getIntent(); - mUri = intent.getData(); + resolveContactUriFromIntent(intent); requestWindowFeature(Window.FEATURE_NO_TITLE); setContentView(R.layout.contact_card_layout); @@ -110,6 +112,11 @@ public abstract class BaseContactCardActivity extends Activity implements } + private void resolveContactUriFromIntent(final Intent intent) { + mOriginalUri = intent.getData(); + mUri = ContactsContract.Contacts.lookupContact(getContentResolver(), mOriginalUri); + } + @Override protected void onRestoreInstanceState(Bundle savedInstanceState) { super.onRestoreInstanceState(savedInstanceState); @@ -248,8 +255,8 @@ public abstract class BaseContactCardActivity extends Activity implements @Override public void onNewIntent(Intent newIntent) { setIntent(newIntent); + resolveContactUriFromIntent(newIntent); selectInitialTab(); - mUri = newIntent.getData(); } /** diff --git a/src/com/android/contacts/ContactsListActivity.java b/src/com/android/contacts/ContactsListActivity.java index 8da6c72..a578576 100644 --- a/src/com/android/contacts/ContactsListActivity.java +++ b/src/com/android/contacts/ContactsListActivity.java @@ -35,7 +35,6 @@ import android.content.SharedPreferences; import android.content.res.Resources; import android.database.CharArrayBuffer; import android.database.Cursor; -import android.database.DatabaseUtils; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Canvas; @@ -61,6 +60,7 @@ import android.provider.ContactsContract.Contacts; import android.provider.ContactsContract.Data; import android.provider.ContactsContract.Intents; import android.provider.ContactsContract.Presence; +import android.provider.ContactsContract.RawContacts; import android.provider.ContactsContract.CommonDataKinds.Phone; import android.provider.ContactsContract.CommonDataKinds.Photo; import android.provider.ContactsContract.CommonDataKinds.StructuredPostal; @@ -108,7 +108,7 @@ public final class ContactsListActivity extends ListActivity implements View.OnCreateContextMenuListener, View.OnClickListener { private static final String TAG = "ContactsListActivity"; - private static final boolean ENABLE_ACTION_ICON_OVERLAYS = false; + private static final boolean ENABLE_ACTION_ICON_OVERLAYS = true; private static final String LIST_STATE_KEY = "liststate"; private static final String FOCUS_KEY = "focused"; @@ -243,6 +243,7 @@ public final class ContactsListActivity extends ListActivity implements CommonDataKinds.Phone.LABEL, //2 CommonDataKinds.Phone.NUMBER, //3 Contacts.DISPLAY_NAME, // 4 + RawContacts.CONTACT_ID, // 5 }; static final String[] LEGACY_PHONES_PROJECTION = new String[] { Phones._ID, //0 @@ -256,6 +257,7 @@ public final class ContactsListActivity extends ListActivity implements static final int PHONE_LABEL_COLUMN_INDEX = 2; static final int PHONE_NUMBER_COLUMN_INDEX = 3; static final int PHONE_DISPLAY_NAME_COLUMN_INDEX = 4; + static final int PHONE_CONTACT_ID_COLUMN_INDEX = 5; static final String[] POSTALS_PROJECTION = new String[] { Data._ID, //0 @@ -1066,7 +1068,7 @@ public final class ContactsListActivity extends ListActivity implements } else if (mMode == MODE_PICK_PHONE) { if (mShortcutAction != null) { Cursor c = (Cursor) mAdapter.getItem(position); - returnPickerResult(c, c.getString(SUMMARY_NAME_COLUMN_INDEX), uri, id); + returnPickerResult(c, c.getString(PHONE_DISPLAY_NAME_COLUMN_INDEX), uri, id); } else { returnPickerResult(null, null, uri, id); } @@ -1092,7 +1094,8 @@ public final class ContactsListActivity extends ListActivity implements Intent shortcutIntent; if (Intent.ACTION_VIEW.equals(mShortcutAction)) { // This is a simple shortcut to view a contact. - shortcutIntent = new Intent(mShortcutAction, uri); + Uri lookupUri = Contacts.getLookupUri(getContentResolver(), uri); + shortcutIntent = new Intent(mShortcutAction, lookupUri); final Bitmap icon = loadContactPhoto(id, null); if (icon != null) { intent.putExtra(Intent.EXTRA_SHORTCUT_ICON, icon); @@ -1114,25 +1117,15 @@ public final class ContactsListActivity extends ListActivity implements scheme = "smsto"; resid = R.drawable.badge_action_sms; } + // Make the URI a direct tel: URI so that it will always continue to work Uri phoneUri = Uri.fromParts(scheme, number, null); shortcutIntent = new Intent(mShortcutAction, phoneUri); - // Find the People._ID for this phone number -/* TODO bring back the better icon handling - final long personId = c.getLong(PHONES_PERSON_ID_INDEX); - Uri personUri = ContentUris.withAppendedId(People.CONTENT_URI, personId); + // Find the Contacts._ID for this phone number + long contactId = c.getLong(PHONE_CONTACT_ID_COLUMN_INDEX); intent.putExtra(Intent.EXTRA_SHORTCUT_ICON, - generatePhoneNumberIcon(personUri, type, resid)); -*/ - final Bitmap icon = loadContactPhoto(id, null); - if (icon != null) { - intent.putExtra(Intent.EXTRA_SHORTCUT_ICON, icon); - } else { - intent.putExtra(Intent.EXTRA_SHORTCUT_ICON_RESOURCE, - Intent.ShortcutIconResource.fromContext(this, - R.drawable.ic_launcher_shortcut_contact)); - } + generatePhoneNumberIcon(contactId, type, resid)); } shortcutIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); intent.putExtra(Intent.EXTRA_SHORTCUT_INTENT, shortcutIntent); @@ -1148,16 +1141,16 @@ public final class ContactsListActivity extends ListActivity implements * Generates a phone number shortcut icon. Adds an overlay describing the type of the phone * number, and if there is a photo also adds the call action icon. * - * @param personUri The person the phone number belongs to + * @param contactId The person the phone number belongs to * @param type The type of the phone number * @param actionResId The ID for the action resource * @return The bitmap for the icon */ - private Bitmap generatePhoneNumberIcon(Uri personUri, int type, int actionResId) { + private Bitmap generatePhoneNumberIcon(long contactId, int type, int actionResId) { final Resources r = getResources(); boolean drawPhoneOverlay = true; - Bitmap photo = People.loadContactPhoto(this, personUri, 0, null); + Bitmap photo = loadContactPhoto(contactId, null); if (photo == null) { // If there isn't a photo use the generic phone action icon instead Bitmap phoneIcon = getPhoneActionIcon(r, actionResId); @@ -1185,24 +1178,24 @@ public final class ContactsListActivity extends ListActivity implements // Create an overlay for the phone number type String overlay = null; switch (type) { - case Phones.TYPE_HOME: - overlay = "H"; + case Phone.TYPE_HOME: + overlay = getString(R.string.type_short_home); break; - case Phones.TYPE_MOBILE: - overlay = "M"; + case Phone.TYPE_MOBILE: + overlay = getString(R.string.type_short_mobile); break; - case Phones.TYPE_WORK: - overlay = "W"; + case Phone.TYPE_WORK: + overlay = getString(R.string.type_short_work); break; - case Phones.TYPE_PAGER: - overlay = "P"; + case Phone.TYPE_PAGER: + overlay = getString(R.string.type_short_pager); break; - case Phones.TYPE_OTHER: - overlay = "O"; + case Phone.TYPE_OTHER: + overlay = getString(R.string.type_short_other); break; } if (overlay != null) { @@ -1218,7 +1211,7 @@ public final class ContactsListActivity extends ListActivity implements if (ENABLE_ACTION_ICON_OVERLAYS && drawPhoneOverlay) { Bitmap phoneIcon = getPhoneActionIcon(r, actionResId); if (phoneIcon != null) { - src.set(0,0, phoneIcon.getWidth(),phoneIcon.getHeight()); + src.set(0, 0, phoneIcon.getWidth(), phoneIcon.getHeight()); int iconWidth = icon.getWidth(); dst.set(iconWidth - 20, -1, iconWidth, 19); canvas.drawBitmap(phoneIcon, src, dst, photoPaint); @@ -1347,15 +1340,17 @@ public final class ContactsListActivity extends ListActivity implements return CONTACTS_SUMMARY_PROJECTION; } - private Bitmap loadContactPhoto(long dataId, BitmapFactory.Options options) { + private Bitmap loadContactPhoto(long contactId, BitmapFactory.Options options) { Cursor cursor = null; - Bitmap bm; + Bitmap bm = null; try { - cursor = getContentResolver().query( - ContentUris.withAppendedId(Data.CONTENT_URI, dataId), - new String[] {Photo.PHOTO}, null, null, null); - cursor.moveToFirst(); - bm = ContactsUtils.loadContactPhoto(cursor, 0, options); + Uri contactUri = ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId); + Uri photoUri = Uri.withAppendedPath(contactUri, Contacts.Photo.CONTENT_DIRECTORY); + cursor = getContentResolver().query(photoUri, new String[] {Photo.PHOTO}, + null, null, null); + if (cursor.moveToFirst()) { + bm = ContactsUtils.loadContactPhoto(cursor, 0, options); + } } finally { if (cursor != null) { cursor.close(); @@ -1941,7 +1936,7 @@ public final class ContactsListActivity extends ListActivity implements final ContactListItemCache cache = new ContactListItemCache(); cache.header = (TextView) view.findViewById(R.id.header); - cache.divider = (View) view.findViewById(R.id.list_divider); + cache.divider = view.findViewById(R.id.list_divider); cache.nameView = (TextView) view.findViewById(R.id.name); cache.labelView = (TextView) view.findViewById(R.id.label); cache.dataView = (TextView) view.findViewById(R.id.data); diff --git a/src/com/android/contacts/ViewContactActivity.java b/src/com/android/contacts/ViewContactActivity.java index 5efe5ca..549c8ab 100644 --- a/src/com/android/contacts/ViewContactActivity.java +++ b/src/com/android/contacts/ViewContactActivity.java @@ -16,15 +16,12 @@ package com.android.contacts; -import static com.android.contacts.ContactEntryAdapter.CONTACT_PHOTO_ID; import static com.android.contacts.ContactEntryAdapter.CONTACT_PROJECTION; -import static com.android.contacts.ContactEntryAdapter.CONTACT_STARRED_COLUMN; import static com.android.contacts.ContactEntryAdapter.DATA_1_COLUMN; import static com.android.contacts.ContactEntryAdapter.DATA_2_COLUMN; import static com.android.contacts.ContactEntryAdapter.DATA_3_COLUMN; import static com.android.contacts.ContactEntryAdapter.DATA_4_COLUMN; import static com.android.contacts.ContactEntryAdapter.DATA_5_COLUMN; -import static com.android.contacts.ContactEntryAdapter.DATA_9_COLUMN; import static com.android.contacts.ContactEntryAdapter.DATA_CONTACT_ID_COLUMN; import static com.android.contacts.ContactEntryAdapter.DATA_ID_COLUMN; import static com.android.contacts.ContactEntryAdapter.DATA_IS_SUPER_PRIMARY_COLUMN; @@ -37,7 +34,6 @@ import com.android.internal.telephony.ITelephony; import android.app.AlertDialog; import android.app.Dialog; -import android.app.ListActivity; import android.content.ActivityNotFoundException; import android.content.ContentResolver; import android.content.ContentUris; @@ -52,15 +48,14 @@ import android.content.pm.ResolveInfo; import android.content.res.Resources; import android.database.ContentObserver; import android.database.Cursor; -import android.graphics.Bitmap; +import android.database.DatabaseUtils; import android.graphics.drawable.Drawable; import android.net.Uri; import android.os.Bundle; import android.os.Handler; import android.os.RemoteException; import android.os.ServiceManager; -import android.os.SystemClock; -import android.provider.ContactsContract.Contacts; +import android.provider.ContactsContract; import android.provider.ContactsContract.AggregationExceptions; import android.provider.ContactsContract.CommonDataKinds; import android.provider.ContactsContract.Data; @@ -73,14 +68,12 @@ import android.util.Log; import android.view.ContextMenu; import android.view.ContextThemeWrapper; import android.view.KeyEvent; -import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; import android.view.ContextMenu.ContextMenuInfo; import android.widget.AdapterView; -import android.widget.CheckBox; import android.widget.FrameLayout; import android.widget.ImageView; import android.widget.ListView; @@ -115,7 +108,6 @@ public class ViewContactActivity extends BaseContactCardActivity public static final int MENU_ITEM_JOIN_AGGREGATE = 6; public static final int MENU_ITEM_OPTIONS = 7; - private Uri mUri; private ContentResolver mResolver; private ViewAdapter mAdapter; private int mNumPhoneNumbers = 0; @@ -183,7 +175,6 @@ public class ViewContactActivity extends BaseContactCardActivity mTabContentLayout = (FrameLayout) findViewById(android.R.id.tabcontent); mTabContentLayout.addView(mListView); - mUri = getIntent().getData(); mResolver = getContentResolver(); // Build the list of sections. The order they're added to mSections dictates the @@ -295,7 +286,7 @@ public class ViewContactActivity extends BaseContactCardActivity } } else { Toast.makeText(this, R.string.invalidContactMessage, Toast.LENGTH_SHORT).show(); - Log.e(TAG, "invalid contact uri: " + mUri); + Log.e(TAG, "invalid contact uri: " + mOriginalUri); finish(); } } -- 2.11.0