package com.meituan.sample.robusttest; /** * Created by mivanzhang on 16/10/24. */ import android.content.Context; import android.graphics.drawable.Drawable; import android.net.Uri; import android.os.Build; import android.text.TextUtils; import android.view.MotionEvent; import android.view.View; import android.widget.ImageView; import com.squareup.picasso.Callback; import com.squareup.picasso.NetworkPolicy; import com.squareup.picasso.Picasso; import com.squareup.picasso.RequestCreator; import java.lang.ref.WeakReference; /** * 根据网络环境获取图片质量所对应的API中的字段 * <p> * */ public class ImageQualityUtil { private static final String LARGE_SIZE = "/440.267/"; private static final String LARGE_SIZE_POI_HEADER_IMAGE = "/800.480/"; private static final String SMALL_SIZE = "/120.76/"; private static final String MIDDLE_SIZE = "/200.120/"; private static final String MEDIUM_SIZE = "/0.160/"; private static final String DEFAULT_SIZE = "/w.h/"; private static final String MORE_LARGE_SIZE = "/600.160/"; private static final String MORE_MIDDLE_SIZE = "/290.140/"; private static final String INN_POI_LIST_SIZE = "/640.0/"; public static String getQualityUrl(String oldUrl, String quality) { String url = oldUrl; if (TextUtils.isEmpty(url)) { return ""; } url = url.replace(DEFAULT_SIZE, quality); return getWebpUrl(url); } public static String getLargeUrl(String oldUrl) { return getQualityUrl(oldUrl, LARGE_SIZE); } public static String getPoiHeaderImageLargeUrl(String oldUrl) { return getQualityUrl(oldUrl, LARGE_SIZE_POI_HEADER_IMAGE); } public static String getSmallUrl(String oldUrl) { return getQualityUrl(oldUrl, SMALL_SIZE); } public static String getMiddleUrl(String oldUrl) { return getQualityUrl(oldUrl, MIDDLE_SIZE); } public static String getMediumSize(String oldUrl) { return getQualityUrl(oldUrl, MEDIUM_SIZE); } public static String getIndexDefaultSize(String oldUrl) { return getQualityUrl(oldUrl, "/"); } // 分享用的图片,去掉url中的宽高参数,避免有时候分享不成功 public static String getShareUrl(String oldUrl) { String url = oldUrl; if (TextUtils.isEmpty(url)) { return ""; } url = url.replace(DEFAULT_SIZE, "/"); return getWebpUrl(url); } public static String getDefaultSize(String url) { if (TextUtils.isEmpty(url)) { return ""; } url = url.replace(DEFAULT_SIZE, "/"); return getWebpUrl(url); } public static String getWebpUrl(String oldUrl) { /** 4.2.1以下用原图,以上用webp格式 **/ if (android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.JELLY_BEAN_MR2) { return oldUrl; } // 哎,兼容Nokia X不支持Webp格式的问题 if ("Nokia_X".equals(Build.MODEL)) { return oldUrl; } String url = oldUrl; if (TextUtils.isEmpty(url)) { return ""; } if (url.toLowerCase().endsWith(".webp")) { return oldUrl; } String host = Uri.parse(url).getHost(); // if (!TextUtils.isEmpty(host) && (host.contains(Consts.IMAGE_SERVICE_HOST_1) || host.contains(Consts.IMAGE_SERVICE_HOST_2))) { // return url + ".webp"; // } return url; } public static void loadImage(Context context, Picasso picasso, String url, int placeHolder, ImageView view) { loadImage(context, picasso, url, placeHolder, view, true); } public static void loadImage(Context context, Picasso picasso, String url, Drawable drawable, ImageView view) { loadImage(context, picasso, url, drawable, view, true); } public static void loadImage(Context context, final Picasso picasso, final String url, final int placeHolder, final ImageView view, final boolean noFade) { loadImage(context, picasso, url, placeHolder, view, noFade, false); } public static void loadImage(Context context, final Picasso picasso, final String url, final Drawable drawable, final ImageView view, final boolean noFade) { loadImage(context, picasso, url, drawable, view, noFade, false); } public static void loadImage(Context context, final Picasso picasso, final String url, final int placeHolder, final ImageView view, final int imageSize, final boolean centerCrop) { picasso.cancelRequest(view); view.setTag(1, null); if (TextUtils.isEmpty(url)) { if (placeHolder != 0) { view.setImageResource(placeHolder); } } else { final boolean displayPic = true;//true;// new ImageViewLoader(view, picasso, url, placeHolder, true, !displayPic, imageSize, centerCrop).load(); } } public static void loadImage(Context context, final Picasso picasso, final String url, final int placeHolder, final ImageView view, final int imageWidth, final int imageHeight, final boolean centerCrop) { picasso.cancelRequest(view); view.setTag(1, null); if (TextUtils.isEmpty(url)) { if (placeHolder != 0) { view.setImageResource(placeHolder); } } else { final boolean displayPic = true;//true;// new ImageViewLoader(view, picasso, url, placeHolder, true, !displayPic, imageWidth, imageHeight, centerCrop).load(); } } public static void loadImage(Context context, final Picasso picasso, final String url, final int placeHolder, final ImageView view, final boolean noFade, final boolean loadImageImmediately) { picasso.cancelRequest(view); view.setTag(1, null); if (TextUtils.isEmpty(url)) { if (placeHolder != 0) { view.setImageResource(placeHolder); } } else { final boolean displayPic = true;// new ImageViewLoader(view, picasso, url, placeHolder, noFade, false).load(); } } public static void loadImage(Context context, final Picasso picasso, final String url, final Drawable drawable, final ImageView view, final boolean noFade, final boolean loadImageImmediately) { picasso.cancelRequest(view); view.setTag(1, null); if (TextUtils.isEmpty(url)) { if (drawable != null) { view.setImageDrawable(drawable); } } else { final boolean displayPic = true;// new ImageViewLoader(view, picasso, url, drawable, noFade, false).load(); } } public static void loadImage(Context context, final Picasso picasso, final String url, final Drawable drawable, final ImageView view, final boolean noFade, final boolean loadImageImmediately, OnImageLoadFinishedListener onImageLoadFinishedListener) { picasso.cancelRequest(view); view.setTag(1, null); if (TextUtils.isEmpty(url)) { if (drawable != null) { view.setImageDrawable(drawable); } } else { final boolean displayPic = true;// new ImageViewLoader(view, picasso, url, drawable, noFade, false) .setOnImageLoadFinishedListener(onImageLoadFinishedListener).load(); } } public interface OnImageLoadFinishedListener { void onImageLoadFinished(); } private static class ImageViewLoader implements Callback, View.OnTouchListener { final WeakReference<ImageView> imageViewRef; final Picasso picasso; final String url; final int placeHolder; final boolean noFade; final boolean localOnly; boolean isForceLoading; final boolean centerCrop; final int imageSize; final Drawable drawable; int imageWith; int imageHeight; private OnImageLoadFinishedListener onImageLoadFinishedListener; public ImageViewLoader setOnImageLoadFinishedListener(OnImageLoadFinishedListener onImageLoadFinishedListener) { this.onImageLoadFinishedListener = onImageLoadFinishedListener; return this; } private ImageViewLoader(ImageView imageView, Picasso picasso, String url, int placeHolder, boolean noFade, boolean localOnly) { this(imageView, picasso, url, placeHolder, noFade, localOnly, -1, false); } private ImageViewLoader(ImageView imageView, Picasso picasso, String url, Drawable image, boolean noFade, boolean localOnly) { this(imageView, picasso, url, image, noFade, localOnly, -1, false); } public ImageViewLoader(ImageView imageView, Picasso picasso, String url, int placeHolder, boolean noFade, boolean localOnly, int imageSize, boolean centerCrop) { imageViewRef = new WeakReference<ImageView>(imageView); this.picasso = picasso; this.url = url; this.placeHolder = placeHolder; this.noFade = noFade; this.localOnly = localOnly; this.centerCrop = centerCrop; this.imageSize = imageSize; this.drawable = null; } public ImageViewLoader(ImageView imageView, Picasso picasso, String url, int placeHolder, boolean noFade, boolean localOnly, int imageWith, int imageHeight, boolean centerCrop) { imageViewRef = new WeakReference<ImageView>(imageView); this.picasso = picasso; this.url = url; this.placeHolder = placeHolder; this.noFade = noFade; this.localOnly = localOnly; this.centerCrop = centerCrop; this.imageHeight = imageHeight; this.imageWith = imageWith; this.imageSize = -1; this.drawable = null; } public ImageViewLoader(ImageView imageView, Picasso picasso, String url, Drawable drawable, boolean noFade, boolean localOnly, int imageSize, boolean centerCrop) { imageViewRef = new WeakReference<ImageView>(imageView); this.picasso = picasso; this.url = url; this.drawable = drawable; this.noFade = noFade; this.localOnly = localOnly; this.centerCrop = centerCrop; this.imageSize = imageSize; this.placeHolder = 0; } void load() { load(false); } void load(boolean forceLoad) { ImageView imageView = imageViewRef.get(); if (imageView == null) { return; } RequestCreator requestCreator = picasso.load(url); if (localOnly && !forceLoad) { requestCreator.networkPolicy(NetworkPolicy.OFFLINE); } if (centerCrop) { requestCreator.centerCrop(); } if (imageSize > 0) { requestCreator.resize(imageSize, imageSize); } if (imageWith > 0 || imageHeight > 0) { requestCreator.resize(imageWith, imageHeight); } if (noFade) { requestCreator.noFade(); } if (placeHolder != 0) { requestCreator.placeholder(placeHolder); } else { if (drawable != null) { requestCreator.placeholder(drawable); } } // requestCreator.error(R.drawable.list_thumbnail_none_m); requestCreator.into(imageView, this); } @Override public void onSuccess() { ImageView imageView = imageViewRef.get(); if (imageView != null) { imageView.setOnTouchListener(null); } isForceLoading = false; if (null != onImageLoadFinishedListener) { onImageLoadFinishedListener.onImageLoadFinished(); } } @Override public void onError() { ImageView imageView = imageViewRef.get(); if (imageView != null) { imageView.setOnTouchListener(this); } isForceLoading = false; } @Override public boolean onTouch(View view, MotionEvent event) { if (event.getAction() == MotionEvent.ACTION_DOWN) { if (!isForceLoading) { isForceLoading = true; load(true); return true; } } return false; } } public static String getMoreLargeUrl(String oldUrl) { return getQualityUrl(oldUrl, MORE_LARGE_SIZE); } public static String getMoreMiddleUrl(String oldUrl) { return getQualityUrl(oldUrl, MORE_MIDDLE_SIZE); } public static String getInnListUrl(String oldUrl) { return getQualityUrl(oldUrl, INN_POI_LIST_SIZE); } public static String getFeatureFoodUrl(String oldUrl) { return getQualityUrl(oldUrl, "/200.200/"); } public static String getPoiAlbumUrl(String oldUrl) { return getQualityUrl(oldUrl, "/300.0/"); } }