Loading src/com/android/contacts/common/ContactPhotoManager.java +16 −7 Original line number Original line Diff line number Diff line Loading @@ -830,7 +830,7 @@ class ContactPhotoManagerImpl extends ContactPhotoManager implements Callback { } else { } else { if (DEBUG) Log.d(TAG, "loadPhoto request: " + photoId); if (DEBUG) Log.d(TAG, "loadPhoto request: " + photoId); loadPhotoByIdOrUri(view, Request.createFromThumbnailId(photoId, darkTheme, isCircular, loadPhotoByIdOrUri(view, Request.createFromThumbnailId(photoId, darkTheme, isCircular, defaultProvider)); defaultProvider, defaultImageRequest)); } } } } Loading Loading @@ -1178,6 +1178,8 @@ class ContactPhotoManagerImpl extends ContactPhotoManager implements Callback { /** /** * Stores the supplied bitmap in cache. * Stores the supplied bitmap in cache. * bytes should be null to indicate a failure to load the photo. An empty byte[] signifies * a successful load but no photo was available. */ */ private void cacheBitmap(Object key, byte[] bytes, boolean preloading, int requestedExtent) { private void cacheBitmap(Object key, byte[] bytes, boolean preloading, int requestedExtent) { if (DEBUG) { if (DEBUG) { Loading @@ -1203,10 +1205,11 @@ class ContactPhotoManagerImpl extends ContactPhotoManager implements Callback { } } if (bytes != null) { if (bytes != null) { mBitmapHolderCache.put(key, holder); if (mBitmapHolderCache.get(key) != holder) { if (mBitmapHolderCache.get(key) != holder) { Log.w(TAG, "Bitmap too big to fit in cache."); Log.w(TAG, "Bitmap too big to fit in cache."); mBitmapHolderCache.put(key, BITMAP_UNAVAILABLE); mBitmapHolderCache.put(key, BITMAP_UNAVAILABLE); } else { mBitmapHolderCache.put(key, holder); } } } else { } else { mBitmapHolderCache.put(key, BITMAP_UNAVAILABLE); mBitmapHolderCache.put(key, BITMAP_UNAVAILABLE); Loading Loading @@ -1507,6 +1510,9 @@ class ContactPhotoManagerImpl extends ContactPhotoManager implements Callback { while (cursor.moveToNext()) { while (cursor.moveToNext()) { Long id = cursor.getLong(0); Long id = cursor.getLong(0); byte[] bytes = cursor.getBlob(1); byte[] bytes = cursor.getBlob(1); if (bytes == null) { bytes = new byte[0]; } cacheBitmap(id, bytes, preloading, -1); cacheBitmap(id, bytes, preloading, -1); mPhotoIds.remove(id); mPhotoIds.remove(id); } } Loading @@ -1526,8 +1532,11 @@ class ContactPhotoManagerImpl extends ContactPhotoManager implements Callback { ContentUris.withAppendedId(Data.CONTENT_URI, id), ContentUris.withAppendedId(Data.CONTENT_URI, id), COLUMNS, null, null, null); COLUMNS, null, null, null); if (profileCursor != null && profileCursor.moveToFirst()) { if (profileCursor != null && profileCursor.moveToFirst()) { cacheBitmap(profileCursor.getLong(0), profileCursor.getBlob(1), byte[] bytes = profileCursor.getBlob(1); preloading, -1); if (bytes == null) { bytes = new byte[0]; } cacheBitmap(profileCursor.getLong(0), bytes, preloading, -1); } else { } else { // Couldn't load a photo this way either. // Couldn't load a photo this way either. cacheBitmap(id, null, preloading, -1); cacheBitmap(id, null, preloading, -1); Loading Loading @@ -1641,9 +1650,9 @@ class ContactPhotoManagerImpl extends ContactPhotoManager implements Callback { } } public static Request createFromThumbnailId(long id, boolean darkTheme, boolean isCircular, public static Request createFromThumbnailId(long id, boolean darkTheme, boolean isCircular, DefaultImageProvider defaultProvider) { DefaultImageProvider defaultProvider, DefaultImageRequest defaultRequest) { return new Request(id, null /* no URI */, -1, darkTheme, isCircular, defaultProvider, return new Request(id, null /* no URI */, -1, darkTheme, isCircular, defaultProvider, /* defaultRequest */ null); defaultRequest); } } public static Request createFromUri(Uri uri, int requestedExtent, boolean darkTheme, public static Request createFromUri(Uri uri, int requestedExtent, boolean darkTheme, Loading src/com/android/contacts/editor/PickRawContactDialogFragment.java +3 −10 Original line number Original line Diff line number Diff line Loading @@ -3,12 +3,9 @@ package com.android.contacts.editor; import android.app.AlertDialog; import android.app.AlertDialog; import android.app.Dialog; import android.app.Dialog; import android.app.DialogFragment; import android.app.DialogFragment; import android.content.ContentUris; import android.content.Context; import android.content.Context; import android.content.DialogInterface; import android.content.DialogInterface; import android.net.Uri; import android.os.Bundle; import android.os.Bundle; import android.provider.ContactsContract.RawContacts; import android.text.TextUtils; import android.text.TextUtils; import android.view.LayoutInflater; import android.view.LayoutInflater; import android.view.View; import android.view.View; Loading Loading @@ -130,16 +127,12 @@ public class PickRawContactDialogFragment extends DialogFragment { final ContactPhotoManager.DefaultImageRequest final ContactPhotoManager.DefaultImageRequest request = new ContactPhotoManager.DefaultImageRequest( request = new ContactPhotoManager.DefaultImageRequest( displayName, String.valueOf(rawContact.id), /* isCircular = */ true); displayName, String.valueOf(rawContact.id), /* isCircular = */ true); final Uri photoUri = Uri.withAppendedPath( ContentUris.withAppendedId(RawContacts.CONTENT_URI, rawContact.id), RawContacts.DisplayPhoto.CONTENT_DIRECTORY); ContactPhotoManager.getInstance(mContext).loadDirectoryPhoto(holder.photo, ContactPhotoManager.getInstance(mContext).loadThumbnail(holder.photo, photoUri, rawContact.photoId, /* darkTheme = */ false, /* darkTheme = */ false, /* isCircular = */ true, /* isCircular = */ true, request); request); return view; return view; } } Loading src/com/android/contacts/editor/PickRawContactLoader.java +44 −1 Original line number Original line Diff line number Diff line Loading @@ -9,12 +9,16 @@ import android.os.Parcel; import android.os.Parcelable; import android.os.Parcelable; import android.provider.ContactsContract; import android.provider.ContactsContract; import android.provider.ContactsContract.Contacts; import android.provider.ContactsContract.Contacts; import android.provider.ContactsContract.Data; import android.provider.ContactsContract.Profile; import android.provider.ContactsContract.RawContacts; import android.provider.ContactsContract.RawContacts; import com.android.contacts.common.model.AccountTypeManager; import com.android.contacts.common.model.AccountTypeManager; import com.android.contacts.common.model.account.AccountType; import com.android.contacts.common.model.account.AccountType; import java.util.ArrayList; import java.util.ArrayList; import java.util.HashMap; import java.util.Map; /** /** * Loader for the pick a raw contact to edit activity. Loads all raw contact metadata for the * Loader for the pick a raw contact to edit activity. Loads all raw contact metadata for the Loading Loading @@ -43,6 +47,11 @@ public class PickRawContactLoader extends private static final int DISPLAY_NAME_PRIMARY = 4; private static final int DISPLAY_NAME_PRIMARY = 4; private static final int DISPLAY_NAME_ALTERNATIVE = 5; private static final int DISPLAY_NAME_ALTERNATIVE = 5; private static final String PHOTO_SELECTION_PREFIX = ContactsContract.Data.RAW_CONTACT_ID + " IN ("; private static final String PHOTO_SELECTION_SUFFIX = ") AND " + ContactsContract.Data.MIMETYPE + "=" + ContactsContract.CommonDataKinds.Photo.CONTENT_ITEM_TYPE; public PickRawContactLoader(Context context, Uri contactUri) { public PickRawContactLoader(Context context, Uri contactUri) { super(context); super(context); mContactUri = ensureIsContactUri(contactUri); mContactUri = ensureIsContactUri(contactUri); Loading Loading @@ -92,20 +101,51 @@ public class PickRawContactLoader extends } } rawContactCursor.moveToPosition(-1); rawContactCursor.moveToPosition(-1); final StringBuilder photoSelection = new StringBuilder(PHOTO_SELECTION_PREFIX); final Map<Long, RawContact> rawContactMap = new HashMap<>(); try { try { while (rawContactCursor.moveToNext()) { while (rawContactCursor.moveToNext()) { RawContact rawContact = new RawContact(); RawContact rawContact = new RawContact(); rawContact.id = rawContactCursor.getLong(RAW_CONTACT_ID); rawContact.id = rawContactCursor.getLong(RAW_CONTACT_ID); photoSelection.append(rawContact.id).append(','); rawContact.displayName = rawContactCursor.getString(DISPLAY_NAME_PRIMARY); rawContact.displayName = rawContactCursor.getString(DISPLAY_NAME_PRIMARY); rawContact.displayNameAlt = rawContactCursor.getString(DISPLAY_NAME_ALTERNATIVE); rawContact.displayNameAlt = rawContactCursor.getString(DISPLAY_NAME_ALTERNATIVE); rawContact.accountName = rawContactCursor.getString(ACCOUNT_NAME); rawContact.accountName = rawContactCursor.getString(ACCOUNT_NAME); rawContact.accountType = rawContactCursor.getString(ACCOUNT_TYPE); rawContact.accountType = rawContactCursor.getString(ACCOUNT_TYPE); rawContact.accountDataSet = rawContactCursor.getString(DATA_SET); rawContact.accountDataSet = rawContactCursor.getString(DATA_SET); result.rawContacts.add(rawContact); result.rawContacts.add(rawContact); rawContactMap.put(rawContact.id, rawContact); } } } finally { } finally { rawContactCursor.close(); rawContactCursor.close(); } } // Remove the last ',' if (photoSelection.length() > 0) { photoSelection.deleteCharAt(photoSelection.length() - 1); } photoSelection.append(PHOTO_SELECTION_SUFFIX); final Uri dataUri = result.isUserProfile ? Uri.withAppendedPath(Profile.CONTENT_URI, Data.CONTENT_URI.getPath()) : Data.CONTENT_URI; final Cursor photoCursor = resolver.query( dataUri, new String[] {Data.RAW_CONTACT_ID, Contacts.Photo._ID}, photoSelection.toString(), null, null); if (photoCursor != null) { try { photoCursor.moveToPosition(-1); while (photoCursor.moveToNext()) { final long rawContactId = photoCursor.getLong(/* Data.RAW_CONTACT_ID */ 0); rawContactMap.get(rawContactId).photoId = photoCursor.getLong(/* PHOTO._ID */ 1); } } finally { photoCursor.close(); } } return result; return result; } } Loading Loading @@ -225,6 +265,7 @@ public class PickRawContactLoader extends }; }; public long id; public long id; public long photoId; public String displayName; public String displayName; public String displayNameAlt; public String displayNameAlt; public String accountName; public String accountName; Loading @@ -235,6 +276,7 @@ public class PickRawContactLoader extends private RawContact(Parcel in) { private RawContact(Parcel in) { id = in.readLong(); id = in.readLong(); photoId = in.readLong(); displayName = in.readString(); displayName = in.readString(); displayNameAlt = in.readString(); displayNameAlt = in.readString(); accountName = in.readString(); accountName = in.readString(); Loading @@ -250,6 +292,7 @@ public class PickRawContactLoader extends @Override @Override public void writeToParcel(Parcel dest, int flags) { public void writeToParcel(Parcel dest, int flags) { dest.writeLong(id); dest.writeLong(id); dest.writeLong(photoId); dest.writeString(displayName); dest.writeString(displayName); dest.writeString(displayNameAlt); dest.writeString(displayNameAlt); dest.writeString(accountName); dest.writeString(accountName); Loading Loading
src/com/android/contacts/common/ContactPhotoManager.java +16 −7 Original line number Original line Diff line number Diff line Loading @@ -830,7 +830,7 @@ class ContactPhotoManagerImpl extends ContactPhotoManager implements Callback { } else { } else { if (DEBUG) Log.d(TAG, "loadPhoto request: " + photoId); if (DEBUG) Log.d(TAG, "loadPhoto request: " + photoId); loadPhotoByIdOrUri(view, Request.createFromThumbnailId(photoId, darkTheme, isCircular, loadPhotoByIdOrUri(view, Request.createFromThumbnailId(photoId, darkTheme, isCircular, defaultProvider)); defaultProvider, defaultImageRequest)); } } } } Loading Loading @@ -1178,6 +1178,8 @@ class ContactPhotoManagerImpl extends ContactPhotoManager implements Callback { /** /** * Stores the supplied bitmap in cache. * Stores the supplied bitmap in cache. * bytes should be null to indicate a failure to load the photo. An empty byte[] signifies * a successful load but no photo was available. */ */ private void cacheBitmap(Object key, byte[] bytes, boolean preloading, int requestedExtent) { private void cacheBitmap(Object key, byte[] bytes, boolean preloading, int requestedExtent) { if (DEBUG) { if (DEBUG) { Loading @@ -1203,10 +1205,11 @@ class ContactPhotoManagerImpl extends ContactPhotoManager implements Callback { } } if (bytes != null) { if (bytes != null) { mBitmapHolderCache.put(key, holder); if (mBitmapHolderCache.get(key) != holder) { if (mBitmapHolderCache.get(key) != holder) { Log.w(TAG, "Bitmap too big to fit in cache."); Log.w(TAG, "Bitmap too big to fit in cache."); mBitmapHolderCache.put(key, BITMAP_UNAVAILABLE); mBitmapHolderCache.put(key, BITMAP_UNAVAILABLE); } else { mBitmapHolderCache.put(key, holder); } } } else { } else { mBitmapHolderCache.put(key, BITMAP_UNAVAILABLE); mBitmapHolderCache.put(key, BITMAP_UNAVAILABLE); Loading Loading @@ -1507,6 +1510,9 @@ class ContactPhotoManagerImpl extends ContactPhotoManager implements Callback { while (cursor.moveToNext()) { while (cursor.moveToNext()) { Long id = cursor.getLong(0); Long id = cursor.getLong(0); byte[] bytes = cursor.getBlob(1); byte[] bytes = cursor.getBlob(1); if (bytes == null) { bytes = new byte[0]; } cacheBitmap(id, bytes, preloading, -1); cacheBitmap(id, bytes, preloading, -1); mPhotoIds.remove(id); mPhotoIds.remove(id); } } Loading @@ -1526,8 +1532,11 @@ class ContactPhotoManagerImpl extends ContactPhotoManager implements Callback { ContentUris.withAppendedId(Data.CONTENT_URI, id), ContentUris.withAppendedId(Data.CONTENT_URI, id), COLUMNS, null, null, null); COLUMNS, null, null, null); if (profileCursor != null && profileCursor.moveToFirst()) { if (profileCursor != null && profileCursor.moveToFirst()) { cacheBitmap(profileCursor.getLong(0), profileCursor.getBlob(1), byte[] bytes = profileCursor.getBlob(1); preloading, -1); if (bytes == null) { bytes = new byte[0]; } cacheBitmap(profileCursor.getLong(0), bytes, preloading, -1); } else { } else { // Couldn't load a photo this way either. // Couldn't load a photo this way either. cacheBitmap(id, null, preloading, -1); cacheBitmap(id, null, preloading, -1); Loading Loading @@ -1641,9 +1650,9 @@ class ContactPhotoManagerImpl extends ContactPhotoManager implements Callback { } } public static Request createFromThumbnailId(long id, boolean darkTheme, boolean isCircular, public static Request createFromThumbnailId(long id, boolean darkTheme, boolean isCircular, DefaultImageProvider defaultProvider) { DefaultImageProvider defaultProvider, DefaultImageRequest defaultRequest) { return new Request(id, null /* no URI */, -1, darkTheme, isCircular, defaultProvider, return new Request(id, null /* no URI */, -1, darkTheme, isCircular, defaultProvider, /* defaultRequest */ null); defaultRequest); } } public static Request createFromUri(Uri uri, int requestedExtent, boolean darkTheme, public static Request createFromUri(Uri uri, int requestedExtent, boolean darkTheme, Loading
src/com/android/contacts/editor/PickRawContactDialogFragment.java +3 −10 Original line number Original line Diff line number Diff line Loading @@ -3,12 +3,9 @@ package com.android.contacts.editor; import android.app.AlertDialog; import android.app.AlertDialog; import android.app.Dialog; import android.app.Dialog; import android.app.DialogFragment; import android.app.DialogFragment; import android.content.ContentUris; import android.content.Context; import android.content.Context; import android.content.DialogInterface; import android.content.DialogInterface; import android.net.Uri; import android.os.Bundle; import android.os.Bundle; import android.provider.ContactsContract.RawContacts; import android.text.TextUtils; import android.text.TextUtils; import android.view.LayoutInflater; import android.view.LayoutInflater; import android.view.View; import android.view.View; Loading Loading @@ -130,16 +127,12 @@ public class PickRawContactDialogFragment extends DialogFragment { final ContactPhotoManager.DefaultImageRequest final ContactPhotoManager.DefaultImageRequest request = new ContactPhotoManager.DefaultImageRequest( request = new ContactPhotoManager.DefaultImageRequest( displayName, String.valueOf(rawContact.id), /* isCircular = */ true); displayName, String.valueOf(rawContact.id), /* isCircular = */ true); final Uri photoUri = Uri.withAppendedPath( ContentUris.withAppendedId(RawContacts.CONTENT_URI, rawContact.id), RawContacts.DisplayPhoto.CONTENT_DIRECTORY); ContactPhotoManager.getInstance(mContext).loadDirectoryPhoto(holder.photo, ContactPhotoManager.getInstance(mContext).loadThumbnail(holder.photo, photoUri, rawContact.photoId, /* darkTheme = */ false, /* darkTheme = */ false, /* isCircular = */ true, /* isCircular = */ true, request); request); return view; return view; } } Loading
src/com/android/contacts/editor/PickRawContactLoader.java +44 −1 Original line number Original line Diff line number Diff line Loading @@ -9,12 +9,16 @@ import android.os.Parcel; import android.os.Parcelable; import android.os.Parcelable; import android.provider.ContactsContract; import android.provider.ContactsContract; import android.provider.ContactsContract.Contacts; import android.provider.ContactsContract.Contacts; import android.provider.ContactsContract.Data; import android.provider.ContactsContract.Profile; import android.provider.ContactsContract.RawContacts; import android.provider.ContactsContract.RawContacts; import com.android.contacts.common.model.AccountTypeManager; import com.android.contacts.common.model.AccountTypeManager; import com.android.contacts.common.model.account.AccountType; import com.android.contacts.common.model.account.AccountType; import java.util.ArrayList; import java.util.ArrayList; import java.util.HashMap; import java.util.Map; /** /** * Loader for the pick a raw contact to edit activity. Loads all raw contact metadata for the * Loader for the pick a raw contact to edit activity. Loads all raw contact metadata for the Loading Loading @@ -43,6 +47,11 @@ public class PickRawContactLoader extends private static final int DISPLAY_NAME_PRIMARY = 4; private static final int DISPLAY_NAME_PRIMARY = 4; private static final int DISPLAY_NAME_ALTERNATIVE = 5; private static final int DISPLAY_NAME_ALTERNATIVE = 5; private static final String PHOTO_SELECTION_PREFIX = ContactsContract.Data.RAW_CONTACT_ID + " IN ("; private static final String PHOTO_SELECTION_SUFFIX = ") AND " + ContactsContract.Data.MIMETYPE + "=" + ContactsContract.CommonDataKinds.Photo.CONTENT_ITEM_TYPE; public PickRawContactLoader(Context context, Uri contactUri) { public PickRawContactLoader(Context context, Uri contactUri) { super(context); super(context); mContactUri = ensureIsContactUri(contactUri); mContactUri = ensureIsContactUri(contactUri); Loading Loading @@ -92,20 +101,51 @@ public class PickRawContactLoader extends } } rawContactCursor.moveToPosition(-1); rawContactCursor.moveToPosition(-1); final StringBuilder photoSelection = new StringBuilder(PHOTO_SELECTION_PREFIX); final Map<Long, RawContact> rawContactMap = new HashMap<>(); try { try { while (rawContactCursor.moveToNext()) { while (rawContactCursor.moveToNext()) { RawContact rawContact = new RawContact(); RawContact rawContact = new RawContact(); rawContact.id = rawContactCursor.getLong(RAW_CONTACT_ID); rawContact.id = rawContactCursor.getLong(RAW_CONTACT_ID); photoSelection.append(rawContact.id).append(','); rawContact.displayName = rawContactCursor.getString(DISPLAY_NAME_PRIMARY); rawContact.displayName = rawContactCursor.getString(DISPLAY_NAME_PRIMARY); rawContact.displayNameAlt = rawContactCursor.getString(DISPLAY_NAME_ALTERNATIVE); rawContact.displayNameAlt = rawContactCursor.getString(DISPLAY_NAME_ALTERNATIVE); rawContact.accountName = rawContactCursor.getString(ACCOUNT_NAME); rawContact.accountName = rawContactCursor.getString(ACCOUNT_NAME); rawContact.accountType = rawContactCursor.getString(ACCOUNT_TYPE); rawContact.accountType = rawContactCursor.getString(ACCOUNT_TYPE); rawContact.accountDataSet = rawContactCursor.getString(DATA_SET); rawContact.accountDataSet = rawContactCursor.getString(DATA_SET); result.rawContacts.add(rawContact); result.rawContacts.add(rawContact); rawContactMap.put(rawContact.id, rawContact); } } } finally { } finally { rawContactCursor.close(); rawContactCursor.close(); } } // Remove the last ',' if (photoSelection.length() > 0) { photoSelection.deleteCharAt(photoSelection.length() - 1); } photoSelection.append(PHOTO_SELECTION_SUFFIX); final Uri dataUri = result.isUserProfile ? Uri.withAppendedPath(Profile.CONTENT_URI, Data.CONTENT_URI.getPath()) : Data.CONTENT_URI; final Cursor photoCursor = resolver.query( dataUri, new String[] {Data.RAW_CONTACT_ID, Contacts.Photo._ID}, photoSelection.toString(), null, null); if (photoCursor != null) { try { photoCursor.moveToPosition(-1); while (photoCursor.moveToNext()) { final long rawContactId = photoCursor.getLong(/* Data.RAW_CONTACT_ID */ 0); rawContactMap.get(rawContactId).photoId = photoCursor.getLong(/* PHOTO._ID */ 1); } } finally { photoCursor.close(); } } return result; return result; } } Loading Loading @@ -225,6 +265,7 @@ public class PickRawContactLoader extends }; }; public long id; public long id; public long photoId; public String displayName; public String displayName; public String displayNameAlt; public String displayNameAlt; public String accountName; public String accountName; Loading @@ -235,6 +276,7 @@ public class PickRawContactLoader extends private RawContact(Parcel in) { private RawContact(Parcel in) { id = in.readLong(); id = in.readLong(); photoId = in.readLong(); displayName = in.readString(); displayName = in.readString(); displayNameAlt = in.readString(); displayNameAlt = in.readString(); accountName = in.readString(); accountName = in.readString(); Loading @@ -250,6 +292,7 @@ public class PickRawContactLoader extends @Override @Override public void writeToParcel(Parcel dest, int flags) { public void writeToParcel(Parcel dest, int flags) { dest.writeLong(id); dest.writeLong(id); dest.writeLong(photoId); dest.writeString(displayName); dest.writeString(displayName); dest.writeString(displayNameAlt); dest.writeString(displayNameAlt); dest.writeString(accountName); dest.writeString(accountName); Loading