浏览代码

Merge pull request #1633 from rhari991/image-url-in-vcards

Add support for photo urls in vCards
Andy Scherzinger 7 年之前
父节点
当前提交
900ab60a93

+ 25 - 1
src/main/java/com/owncloud/android/ui/fragment/contactsbackup/ContactListFragment.java

@@ -32,6 +32,7 @@ import android.database.Cursor;
 import android.graphics.Bitmap;
 import android.graphics.BitmapFactory;
 import android.graphics.PorterDuff;
+import android.graphics.drawable.Drawable;
 import android.os.AsyncTask;
 import android.os.Build;
 import android.os.Bundle;
@@ -60,6 +61,8 @@ import android.widget.RelativeLayout;
 import android.widget.TextView;
 import android.widget.Toast;
 
+import com.bumptech.glide.request.animation.GlideAnimation;
+import com.bumptech.glide.request.target.SimpleTarget;
 import com.evernote.android.job.JobRequest;
 import com.evernote.android.job.util.support.PersistableBundleCompat;
 import com.owncloud.android.R;
@@ -73,6 +76,7 @@ import com.owncloud.android.ui.activity.ContactsPreferenceActivity;
 import com.owncloud.android.ui.events.VCardToggleEvent;
 import com.owncloud.android.ui.fragment.FileFragment;
 import com.owncloud.android.utils.BitmapUtils;
+import com.owncloud.android.utils.DisplayUtils;
 import com.owncloud.android.utils.PermissionUtil;
 import com.owncloud.android.utils.ThemeUtils;
 
@@ -93,6 +97,7 @@ import butterknife.BindView;
 import butterknife.ButterKnife;
 import ezvcard.Ezvcard;
 import ezvcard.VCard;
+import ezvcard.property.Photo;
 
 import static com.owncloud.android.ui.fragment.contactsbackup.ContactListFragment.getDisplayName;
 
@@ -639,7 +644,9 @@ class ContactListAdapter extends RecyclerView.Adapter<ContactListFragment.Contac
 
             // photo
             if (vcard.getPhotos().size() > 0) {
-                byte[] data = vcard.getPhotos().get(0).getData();
+                Photo firstPhoto = vcard.getPhotos().get(0);
+                String url = firstPhoto.getUrl();
+                byte[] data = firstPhoto.getData();
 
                 if (data != null && data.length > 0) {
                     Bitmap thumbnail = BitmapFactory.decodeByteArray(data, 0, data.length);
@@ -647,6 +654,23 @@ class ContactListAdapter extends RecyclerView.Adapter<ContactListFragment.Contac
                             thumbnail);
 
                     holder.getBadge().setImageDrawable(drawable);
+                } else if (url != null) {
+                    ImageView badge = holder.getBadge();
+                    SimpleTarget target = new SimpleTarget<Drawable>() {
+                        @Override
+                        public void onResourceReady(Drawable resource, GlideAnimation
+                                glideAnimation) {
+                            holder.getBadge().setImageDrawable(resource);
+                        }
+
+                        @Override
+                        public void onLoadFailed(Exception e, Drawable errorDrawable) {
+                            super.onLoadFailed(e, errorDrawable);
+                            holder.getBadge().setImageDrawable(errorDrawable);
+                        }
+                    };
+                    DisplayUtils.downloadIcon(context, url, target, R.drawable.ic_user,
+                            badge.getWidth(), badge.getHeight());
                 }
             } else {
                 try {

+ 16 - 0
src/main/java/com/owncloud/android/utils/DisplayUtils.java

@@ -53,6 +53,7 @@ import com.bumptech.glide.load.engine.DiskCacheStrategy;
 import com.bumptech.glide.load.model.StreamEncoder;
 import com.bumptech.glide.load.resource.file.FileToStreamDecoder;
 import com.bumptech.glide.request.target.SimpleTarget;
+import com.bumptech.glide.request.target.Target;
 import com.caverock.androidsvg.SVG;
 import com.owncloud.android.MainApp;
 import com.owncloud.android.R;
@@ -505,6 +506,21 @@ public class DisplayUtils {
                 .into(imageView);
     }
 
+    public static Bitmap downloadImageSynchronous(Context context, String imageUrl) {
+        try {
+            return Glide.with(context)
+                    .load(imageUrl)
+                    .asBitmap()
+                    .diskCacheStrategy(DiskCacheStrategy.NONE)
+                    .skipMemoryCache(true)
+                    .into(Target.SIZE_ORIGINAL, Target.SIZE_ORIGINAL)
+                    .get();
+        } catch (Exception e) {
+            Log_OC.e(TAG, "Could not download image " + imageUrl);
+            return null;
+        }
+    }
+
     public static void setupBottomBar(BottomNavigationView view, Resources resources, final Activity activity,
                                       int checkedMenuItem) {
 

+ 20 - 0
src/main/java/third_parties/ezvcard_android/ContactOperations.java

@@ -4,9 +4,13 @@ import android.content.ContentProviderOperation;
 import android.content.ContentValues;
 import android.content.Context;
 import android.content.OperationApplicationException;
+import android.graphics.Bitmap;
 import android.os.RemoteException;
 import android.provider.ContactsContract;
 
+import com.owncloud.android.utils.DisplayUtils;
+
+import java.io.ByteArrayOutputStream;
 import java.text.DateFormat;
 import java.text.SimpleDateFormat;
 import java.util.ArrayList;
@@ -16,6 +20,7 @@ import java.util.List;
 import java.util.Map;
 
 import ezvcard.VCard;
+import ezvcard.parameter.ImageType;
 import ezvcard.property.Address;
 import ezvcard.property.Birthday;
 import ezvcard.property.Email;
@@ -511,6 +516,9 @@ public class ContactOperations {
 
     private void convertPhotos(List<NonEmptyContentValues> contentValues, VCard vcard) {
         for (Photo photo : vcard.getPhotos()) {
+            if (photo.getUrl() != null) {
+                downloadPhoto(photo);
+            }
             byte[] data = photo.getData();
 
             NonEmptyContentValues cv = new NonEmptyContentValues(ContactsContract.CommonDataKinds.Photo.CONTENT_ITEM_TYPE);
@@ -519,6 +527,18 @@ public class ContactOperations {
         }
     }
 
+    private void downloadPhoto(Photo photo) {
+        String url = photo.getUrl();
+        Bitmap bitmap = DisplayUtils.downloadImageSynchronous(context, url);
+        if (bitmap != null) {
+            ByteArrayOutputStream stream = new ByteArrayOutputStream();
+            bitmap.compress(Bitmap.CompressFormat.JPEG, 100, stream);
+            byte[] bitmapdata = stream.toByteArray();
+            photo.setData(bitmapdata, ImageType.find(null, null,
+                    url.substring(url.lastIndexOf(".") + 1)));
+        }
+    }
+
     private void convertOrganization(List<NonEmptyContentValues> contentValues, VCard vcard) {
         NonEmptyContentValues cv = new NonEmptyContentValues(ContactsContract.CommonDataKinds.Organization.CONTENT_ITEM_TYPE);