Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 3a53328f authored by Gary Mai's avatar Gary Mai
Browse files

Revert "Revert "Load the raw contact's photo in picker dialog""

This reverts commit 3a5f94ff.

Roll forward with fixes.

Test: manually verified:
  * contact photos load in the main list
  * no crash on viewing picker dialog

Bug: 32096517
Bug: 32384257
Change-Id: I6f798787abc928f6d287cde48182f2643aad364a
parent 3ca4af5a
Loading
Loading
Loading
Loading
+14 −6
Original line number Diff line number Diff line
@@ -830,7 +830,7 @@ class ContactPhotoManagerImpl extends ContactPhotoManager implements Callback {
        } else {
            if (DEBUG) Log.d(TAG, "loadPhoto request: " + photoId);
            loadPhotoByIdOrUri(view, Request.createFromThumbnailId(photoId, darkTheme, isCircular,
                    defaultProvider));
                    defaultProvider, defaultImageRequest));
        }
    }

@@ -1178,6 +1178,8 @@ class ContactPhotoManagerImpl extends ContactPhotoManager implements Callback {

    /**
     * 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) {
        if (DEBUG) {
@@ -1507,6 +1509,9 @@ class ContactPhotoManagerImpl extends ContactPhotoManager implements Callback {
                    while (cursor.moveToNext()) {
                        Long id = cursor.getLong(0);
                        byte[] bytes = cursor.getBlob(1);
                        if (bytes == null) {
                            bytes = new byte[0];
                        }
                        cacheBitmap(id, bytes, preloading, -1);
                        mPhotoIds.remove(id);
                    }
@@ -1526,8 +1531,11 @@ class ContactPhotoManagerImpl extends ContactPhotoManager implements Callback {
                                ContentUris.withAppendedId(Data.CONTENT_URI, id),
                                COLUMNS, null, null, null);
                        if (profileCursor != null && profileCursor.moveToFirst()) {
                            cacheBitmap(profileCursor.getLong(0), profileCursor.getBlob(1),
                                    preloading, -1);
                            byte[] bytes = profileCursor.getBlob(1);
                            if (bytes == null) {
                                bytes = new byte[0];
                            }
                            cacheBitmap(profileCursor.getLong(0), bytes, preloading, -1);
                        } else {
                            // Couldn't load a photo this way either.
                            cacheBitmap(id, null, preloading, -1);
@@ -1641,9 +1649,9 @@ class ContactPhotoManagerImpl extends ContactPhotoManager implements Callback {
        }

        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,
                    /* defaultRequest */ null);
                    defaultRequest);
        }

        public static Request createFromUri(Uri uri, int requestedExtent, boolean darkTheme,
+3 −10
Original line number Diff line number Diff line
@@ -3,12 +3,9 @@ package com.android.contacts.editor;
import android.app.AlertDialog;
import android.app.Dialog;
import android.app.DialogFragment;
import android.content.ContentUris;
import android.content.Context;
import android.content.DialogInterface;
import android.net.Uri;
import android.os.Bundle;
import android.provider.ContactsContract.RawContacts;
import android.text.TextUtils;
import android.view.LayoutInflater;
import android.view.View;
@@ -130,16 +127,12 @@ public class PickRawContactDialogFragment extends DialogFragment {
            final ContactPhotoManager.DefaultImageRequest
                    request = new ContactPhotoManager.DefaultImageRequest(
                    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,
                    photoUri,
            ContactPhotoManager.getInstance(mContext).loadThumbnail(holder.photo,
                    rawContact.photoId,
                    /* darkTheme = */ false,
                    /* isCircular = */ true,
                    request);

            return view;
        }

+44 −1
Original line number Diff line number Diff line
@@ -9,12 +9,16 @@ import android.os.Parcel;
import android.os.Parcelable;
import android.provider.ContactsContract;
import android.provider.ContactsContract.Contacts;
import android.provider.ContactsContract.Data;
import android.provider.ContactsContract.Profile;
import android.provider.ContactsContract.RawContacts;

import com.android.contacts.common.model.AccountTypeManager;
import com.android.contacts.common.model.account.AccountType;

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
@@ -43,6 +47,11 @@ public class PickRawContactLoader extends
    private static final int DISPLAY_NAME_PRIMARY = 4;
    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) {
        super(context);
        mContactUri = ensureIsContactUri(contactUri);
@@ -92,20 +101,51 @@ public class PickRawContactLoader extends
        }

        rawContactCursor.moveToPosition(-1);
        final StringBuilder photoSelection = new StringBuilder(PHOTO_SELECTION_PREFIX);
        final Map<Long, RawContact> rawContactMap = new HashMap<>();
        try {
            while (rawContactCursor.moveToNext()) {
                RawContact rawContact = new RawContact();
                rawContact.id = rawContactCursor.getLong(RAW_CONTACT_ID);
                photoSelection.append(rawContact.id).append(',');
                rawContact.displayName = rawContactCursor.getString(DISPLAY_NAME_PRIMARY);
                rawContact.displayNameAlt = rawContactCursor.getString(DISPLAY_NAME_ALTERNATIVE);
                rawContact.accountName = rawContactCursor.getString(ACCOUNT_NAME);
                rawContact.accountType = rawContactCursor.getString(ACCOUNT_TYPE);
                rawContact.accountDataSet = rawContactCursor.getString(DATA_SET);
                result.rawContacts.add(rawContact);
                rawContactMap.put(rawContact.id, rawContact);
            }
        } finally {
            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;
    }

@@ -225,6 +265,7 @@ public class PickRawContactLoader extends
                };

        public long id;
        public long photoId;
        public String displayName;
        public String displayNameAlt;
        public String accountName;
@@ -235,6 +276,7 @@ public class PickRawContactLoader extends

        private RawContact(Parcel in) {
            id = in.readLong();
            photoId = in.readLong();
            displayName = in.readString();
            displayNameAlt = in.readString();
            accountName = in.readString();
@@ -250,6 +292,7 @@ public class PickRawContactLoader extends
        @Override
        public void writeToParcel(Parcel dest, int flags) {
            dest.writeLong(id);
            dest.writeLong(photoId);
            dest.writeString(displayName);
            dest.writeString(displayNameAlt);
            dest.writeString(accountName);