Fixing support for contact shortcuts.
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.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.widget.ImageView;
import android.widget.TextView;
+import java.util.ArrayList;
+
/**
* The base Activity class for viewing and editing a contact.
*/
@@ -56,6 +57,7 @@
private static final String TAG = "BaseContactCardActivity";
private SparseArray<Long> mTabRawContactIdMap;
+ protected Uri mOriginalUri;
protected Uri mUri;
protected ScrollingTabWidget mTabWidget;
protected ContactHeaderWidget mContactHeaderWidget;
@@ -85,7 +87,7 @@
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 @@
}
+ 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 @@
@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.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.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 @@
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 @@
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 @@
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 @@
} 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 @@
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 @@
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 @@
* 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 @@
// 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 @@
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 @@
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 @@
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 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.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.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 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 @@
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 @@
}
} 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();
}
}