From 2270c82c340e89b40291efa144dd5dd73710ff51 Mon Sep 17 00:00:00 2001
From: nilupeng <qingingrunt2010@qq.com>
Date: Wed, 10 Aug 2022 11:53:27 +0000
Subject: [PATCH] 登录信息,头像上传

---
 app/src/main/java/com/runt/open/mvvm/util/GlideEngine.kt                              |  212 ++++++++++++++++++++++++++++++
 app/src/main/java/com/runt/open/mvvm/ui/main/mine/MineViewModel.java                  |   14 +-
 app/src/main/java/com/runt/open/mvvm/ui/splash/SplashActivity.java                    |    9 +
 app/src/main/java/com/runt/open/mvvm/config/Configuration.java                        |    1 
 build.gradle                                                                          |    2 
 app/src/main/AndroidManifest.xml                                                      |   11 -
 app/src/main/java/com/runt/open/mvvm/retrofit/api/CommonApiCenter.java                |   20 --
 app/src/main/java/com/runt/open/mvvm/ui/loadpage/PageViewModels.java                  |    2 
 app/src/main/java/com/runt/open/mvvm/retrofit/Interceptor/HttpLoggingInterceptor.java |   31 ++--
 app/build.gradle                                                                      |    7 
 app/src/main/java/com/runt/open/mvvm/ui/login/RegisterLoginActivity.java              |    9 
 app/src/main/java/com/runt/open/mvvm/ui/main/mine/MineFragment.java                   |   81 +++++------
 12 files changed, 299 insertions(+), 100 deletions(-)

diff --git a/app/build.gradle b/app/build.gradle
index 085af32..b6fdb56 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -1,5 +1,6 @@
 plugins {
     id 'com.android.application'
+    id 'kotlin-android'
 }
 
 android {
@@ -32,6 +33,9 @@
     compileOptions {
         sourceCompatibility JavaVersion.VERSION_1_8
         targetCompatibility JavaVersion.VERSION_1_8
+    }
+    kotlinOptions {
+        jvmTarget = '1.8'
     }
     buildFeatures {
         viewBinding true
@@ -71,6 +75,5 @@
     annotationProcessor 'com.github.bumptech.glide:compiler:4.12.0'
     implementation 'com.facebook.rebound:rebound:0.3.6'//Rebound  “弹簧”动画效果的第三方工具包,由FaceBook
     implementation 'com.github.zhaolei9527:BottomMenu:v1.0.1'//底部菜单弹框
-    implementation 'com.github.LuckSiege.PictureSelector:picture_library:v2.2.3'//图片选择
-    implementation 'com.github.wildma:PictureSelector:1.1.1'//图片选择裁切工具
+    implementation 'com.github.LuckSiege.PictureSelector:picture_library:v2.6.0'//图片选择
 }
\ No newline at end of file
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 8b509b3..0056ae6 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -42,16 +42,7 @@
                 <category android:name="android.intent.category.LAUNCHER" />
             </intent-filter>
         </activity>
-        <activity android:name=".ui.main.MainActivity"
-            android:launchMode="singleTask"
-            tools:ignore="WrongManifestParent"
-            android:exported="true">
-            <intent-filter>
-                <action android:name="android.intent.action.VIEW" />
-                <category android:name="android.intent.category.DEFAULT" />
-                <action android:name="com.zfwl.merchant.activities.MainActivity" />
-            </intent-filter>
-        </activity>
+        <activity android:name=".ui.main.MainActivity" />
         <activity android:name=".ui.login.RegisterLoginActivity" />
         <activity android:name=".ui.web.WebViewActivity" />
     </application>
diff --git a/app/src/main/java/com/runt/open/mvvm/config/Configuration.java b/app/src/main/java/com/runt/open/mvvm/config/Configuration.java
index e865ba8..4cd44e4 100644
--- a/app/src/main/java/com/runt/open/mvvm/config/Configuration.java
+++ b/app/src/main/java/com/runt/open/mvvm/config/Configuration.java
@@ -9,6 +9,7 @@
 
     public final static String KEY_CODE= "code";
     public static final String KEY_TOKEN = "token";
+    public static final String KEY_USERINFO = "userinfo";
     public static final String KEY_USERNAME = "username";
     public static final String KEY_PHONE = "phone";
     public static final String KEY_USERPASS = "userpass";
diff --git a/app/src/main/java/com/runt/open/mvvm/retrofit/Interceptor/HttpLoggingInterceptor.java b/app/src/main/java/com/runt/open/mvvm/retrofit/Interceptor/HttpLoggingInterceptor.java
index eb7c890..59cb698 100644
--- a/app/src/main/java/com/runt/open/mvvm/retrofit/Interceptor/HttpLoggingInterceptor.java
+++ b/app/src/main/java/com/runt/open/mvvm/retrofit/Interceptor/HttpLoggingInterceptor.java
@@ -1,15 +1,18 @@
 package com.runt.open.mvvm.retrofit.Interceptor;
 
 import android.util.Log;
-
 import com.google.gson.Gson;
 import com.runt.open.mvvm.MyApplication;
 import com.runt.open.mvvm.data.PhoneDevice;
 import com.runt.open.mvvm.retrofit.net.NetWorkCost;
 import com.runt.open.mvvm.retrofit.net.NetWorkListenear;
 import com.runt.open.mvvm.retrofit.utils.HttpPrintUtils;
+import com.runt.open.mvvm.ui.login.UserBean;
 import com.runt.open.mvvm.util.DeviceUtil;
-
+import okhttp3.*;
+import okhttp3.internal.http.HttpHeaders;
+import okio.Buffer;
+import okio.BufferedSource;
 import org.json.JSONArray;
 import org.json.JSONException;
 import org.json.JSONObject;
@@ -21,18 +24,6 @@
 import java.util.ArrayList;
 import java.util.Date;
 import java.util.HashMap;
-
-import okhttp3.FormBody;
-import okhttp3.Headers;
-import okhttp3.MediaType;
-import okhttp3.MultipartBody;
-import okhttp3.Request;
-import okhttp3.RequestBody;
-import okhttp3.Response;
-import okhttp3.ResponseBody;
-import okhttp3.internal.http.HttpHeaders;
-import okio.Buffer;
-import okio.BufferedSource;
 
 /**
  * My father is Object, ites purpose of     log打印
@@ -65,6 +56,9 @@
                 .addHeader("device", new Gson().toJson(PhoneDevice.getDevice()))
                 .addHeader("appVersion", DeviceUtil.getAppVersionName(MyApplication.getApplication()))
                 .addHeader("os", DeviceUtil.isHarmonyOS()? "harmony" : "android");
+        if(UserBean.getUser() != null){
+            requestBuild.addHeader("token",UserBean.getUser().getToken());
+        }
         Request request = requestBuild.build().newBuilder().build();
         ArrayList<String> logArrays = new ArrayList<>();
         Response response = null;
@@ -208,7 +202,14 @@
             if (isPlaintext(buffer)) {
                 logArrays.add("---------->RESPONSE BODY<----------");
                 if (contentLength != 0) {
-                    logArrays.add(new JSONObject(buffer.clone().readString((charset))).toString(4));
+                    String str = buffer.clone().readString(charset);
+                    if(str.trim().indexOf("{") == 0) {
+                        logArrays.add(new JSONObject(str).toString(4));
+                    }else if(str.trim().indexOf("[") == 0) {
+                        logArrays.add(new JSONArray(str).toString(4));
+                    }else{
+                        logArrays.add(str);
+                    }
                 }
 
                 logArrays.add("<-- END HTTP (" + buffer.size() + "-byte body)");
diff --git a/app/src/main/java/com/runt/open/mvvm/retrofit/api/CommonApiCenter.java b/app/src/main/java/com/runt/open/mvvm/retrofit/api/CommonApiCenter.java
index 0922a46..9c7e832 100644
--- a/app/src/main/java/com/runt/open/mvvm/retrofit/api/CommonApiCenter.java
+++ b/app/src/main/java/com/runt/open/mvvm/retrofit/api/CommonApiCenter.java
@@ -5,23 +5,11 @@
 import com.runt.open.mvvm.data.HttpApiResult;
 import com.runt.open.mvvm.data.PageResult;
 import com.runt.open.mvvm.data.Results;
-
-import java.util.Map;
-
 import io.reactivex.Observable;
 import okhttp3.MultipartBody;
-import okhttp3.ResponseBody;
-import retrofit2.Call;
-import retrofit2.http.Field;
-import retrofit2.http.FieldMap;
-import retrofit2.http.FormUrlEncoded;
-import retrofit2.http.GET;
-import retrofit2.http.Multipart;
-import retrofit2.http.POST;
-import retrofit2.http.Part;
-import retrofit2.http.Query;
-import retrofit2.http.QueryMap;
-import retrofit2.http.Url;
+import retrofit2.http.*;
+
+import java.util.Map;
 
 /**
  * My father is Object, ites purpose of     常用接口
@@ -74,7 +62,7 @@
 
     @Multipart
     @POST("updatehead")
-    Call<ResponseBody> updateHead(@Part MultipartBody.Part file);
+    Observable<Results.StringApiResult> updateHead(@Part MultipartBody.Part file);
 
 
     /**
diff --git a/app/src/main/java/com/runt/open/mvvm/ui/loadpage/PageViewModels.java b/app/src/main/java/com/runt/open/mvvm/ui/loadpage/PageViewModels.java
index dba8b38..8d76586 100644
--- a/app/src/main/java/com/runt/open/mvvm/ui/loadpage/PageViewModels.java
+++ b/app/src/main/java/com/runt/open/mvvm/ui/loadpage/PageViewModels.java
@@ -11,7 +11,7 @@
  * @purpose Created by Runt (qingingrunt2010@qq.com) on 2022/8/9.
  */
 public class PageViewModels {
-    public class HomeViewModel extends LoadPageViewModel<Results.Message> {
+    public static class HomeViewModel extends LoadPageViewModel<Results.Message> {
         @Override
         public Observable<HttpApiResult<PageResult<Results.Message>>> request(int page, Object... objects) {
             return commonApi.getMsgList(page,SIZE);
diff --git a/app/src/main/java/com/runt/open/mvvm/ui/login/RegisterLoginActivity.java b/app/src/main/java/com/runt/open/mvvm/ui/login/RegisterLoginActivity.java
index eb3eb99..7c100fe 100644
--- a/app/src/main/java/com/runt/open/mvvm/ui/login/RegisterLoginActivity.java
+++ b/app/src/main/java/com/runt/open/mvvm/ui/login/RegisterLoginActivity.java
@@ -46,13 +46,10 @@
            }
         });
         mViewModel.getLoginResult().observe(this, loggedInUser -> {
-            putBooleanProjectPrefrence(Configuration.IS_LOGIN,true);
             putStringProjectPrefrence(Configuration.KEY_USERNAME, mBinding.editPhone.getText().toString());
-
-            UserBean user = new Gson().fromJson(new Gson().toJson(loggedInUser) ,UserBean.class);
-            UserBean.setUser(user);
-            putStringProjectPrefrence(Configuration.KEY_TOKEN, user.getToken());
-            MyLog.i("registerlogin",user.toString());
+            UserBean.setUser(loggedInUser);
+            putStringProjectPrefrence(Configuration.KEY_USERINFO, new Gson().toJson(loggedInUser));
+            MyLog.i("registerlogin",loggedInUser.toString());
             showToast(R.string.login_success);
             setResult(RESULT_CODE_SUCESS);
             finish();
diff --git a/app/src/main/java/com/runt/open/mvvm/ui/main/mine/MineFragment.java b/app/src/main/java/com/runt/open/mvvm/ui/main/mine/MineFragment.java
index d06e356..3be5ae5 100644
--- a/app/src/main/java/com/runt/open/mvvm/ui/main/mine/MineFragment.java
+++ b/app/src/main/java/com/runt/open/mvvm/ui/main/mine/MineFragment.java
@@ -2,27 +2,32 @@
 
 import android.app.Activity;
 import android.content.Intent;
+import android.content.pm.ActivityInfo;
+import android.util.Log;
 import android.view.View;
-
 import com.bumptech.glide.Glide;
 import com.bumptech.glide.request.RequestOptions;
-import com.permissionx.guolindev.PermissionX;
+import com.luck.picture.lib.PictureSelector;
+import com.luck.picture.lib.config.PictureConfig;
+import com.luck.picture.lib.config.PictureMimeType;
+import com.luck.picture.lib.entity.LocalMedia;
 import com.runt.open.mvvm.BuildConfig;
 import com.runt.open.mvvm.R;
 import com.runt.open.mvvm.base.fragments.BaseFragment;
+import com.runt.open.mvvm.data.HttpApiResult;
+import com.runt.open.mvvm.data.Results;
 import com.runt.open.mvvm.databinding.FragmentMineBinding;
-import com.runt.open.mvvm.listener.ResPonse;
 import com.runt.open.mvvm.retrofit.observable.HttpObserver;
 import com.runt.open.mvvm.ui.login.UserBean;
+import com.runt.open.mvvm.util.GlideEngine;
 import com.runt.open.mvvm.util.MyLog;
-import com.wildma.pictureselector.PictureSelector;
-
-import java.io.File;
-
 import okhttp3.ResponseBody;
 import retrofit2.Call;
 import retrofit2.Callback;
 import retrofit2.Response;
+
+import java.io.File;
+import java.util.List;
 
 /**
  * My father is Object, ites purpose of
@@ -118,27 +123,25 @@
      * 打开相册
      */
     public void openAlthum(){
-        PermissionX.init(this)
-                .permissions(mActivity.CAMERA_PERMISSIONS)
-                .request((allGranted, grantedList, deniedList) -> {
-                    if(allGranted){
-                        PictureSelector
-                                .create(this, PictureSelector.SELECT_REQUEST_CODE)
-                                .selectPicture(true, 300, 300, 20, 20);
-                    }else{
-                        mActivity.showDialog("警告", "软件需要权限才能运行", "申请权限", "取消", new ResPonse() {
-                            @Override
-                            public void doSuccess(Object obj) {
-                                openAlthum();
-                            }
-
-                            @Override
-                            public void doError(Object obj) {
-                            }
-                        });
-                    }
-
-                });
+        PictureSelector.create(this)
+                .openGallery(PictureMimeType.ofImage()) // 全部.PictureMimeType.ofAll()、图片.ofImage()、视频.ofVideo()、音频.ofAudio()
+                .imageEngine(GlideEngine.Companion.getInstance()) // 外部传入图片加载引擎,必传项
+                .maxSelectNum(1) // 最大图片选择数量
+                .minSelectNum(1) // 最小选择数量
+                .imageSpanCount(3) // 每行显示个数
+                .isReturnEmpty(true) // 未选择数据时点击按钮是否可以返回
+                .isAndroidQTransform(false) // 是否需要处理Android Q 拷贝至应用沙盒的操作,只针对compress(false); && .isEnableCrop(false);有效,默认处理
+                .setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT) // 设置相册Activity方向,不设置默认使用系统
+                .isSingleDirectReturn(true) // 单选模式下是否直接返回,PictureConfig.SINGLE模式下有效
+                .isPreviewImage(true) // 是否可预览图片
+                .isCamera(true) // 是否显示拍照按钮
+                .isZoomAnim(false) // 图片列表点击 缩放效果 默认true
+                .isEnableCrop(true) // 是否裁剪
+                .withAspectRatio(1, 1) // 裁剪比例 如16:9 3:2 3:4 1:1 可自定义
+                .isCompress(false) // 是否压缩
+                .cutOutQuality(100) // 裁剪输出质量 默认100
+                .selectionMode(PictureConfig.SINGLE)
+                .forResult(PictureConfig.CHOOSE_REQUEST);//结果回调onActivityResult code
     }
 
 
@@ -147,24 +150,18 @@
     public void onActivityResult(int requestCode, int resultCode, Intent data) {
         super.onActivityResult(requestCode, resultCode, data);
         /*结果回调*/
-        if (requestCode == PictureSelector.SELECT_REQUEST_CODE) {
+        if (requestCode == PictureConfig.CHOOSE_REQUEST) {
             if (data != null) {
-                String picturePath = data.getStringExtra(PictureSelector.PICTURE_PATH);
-                MyLog.i("mineActivity","picturePath:"+picturePath);
-                final  File file = new File(picturePath);
-                mViewModel.updateHead(file).enqueue(new Callback<ResponseBody>() {
+                List<LocalMedia> selectList = PictureSelector.obtainMultipleResult(data);
+                final  File file = new File(selectList.get(0).getCutPath());
+                MyLog.i("mineActivity","picturePath:"+selectList.get(0).getCutPath()+" exists:"+file.exists());
+                mViewModel.updateHead(file, new HttpObserver<String>() {
                     @Override
-                    public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
-                        /*UserBean.getUser().setHead(obj.toString());
-                        file.delete();
-                        Glide.with(getContext()).load(BuildConfig.HOST_IP_ADDR+UserBean.getUser().getHead()) .into(mBinding.img); //获取选取的图片*/
-
+                    protected void onSuccess(String data) {
+                        UserBean.getUser().setHead(data);
+                        Glide.with(getContext()).load(BuildConfig.HOST_IP_ADDR+UserBean.getUser().getHead()) .into(mBinding.img); //获取选取的图片
                     }
 
-                    @Override
-                    public void onFailure(Call<ResponseBody> call, Throwable t) {
-                        file.delete();
-                    }
                 });
             }
         }else if(requestCode == REQUEST_CODE_SIGN && resultCode == Activity.RESULT_OK){
diff --git a/app/src/main/java/com/runt/open/mvvm/ui/main/mine/MineViewModel.java b/app/src/main/java/com/runt/open/mvvm/ui/main/mine/MineViewModel.java
index 0dfb04b..8f12bbe 100644
--- a/app/src/main/java/com/runt/open/mvvm/ui/main/mine/MineViewModel.java
+++ b/app/src/main/java/com/runt/open/mvvm/ui/main/mine/MineViewModel.java
@@ -1,17 +1,16 @@
 package com.runt.open.mvvm.ui.main.mine;
 
 import com.runt.open.mvvm.base.model.BaseViewModel;
+import com.runt.open.mvvm.data.Results;
 import com.runt.open.mvvm.listener.ResPonse;
 import com.runt.open.mvvm.retrofit.observable.HttpObserver;
 import com.runt.open.mvvm.ui.login.UserBean;
-
-import java.io.File;
-
+import io.reactivex.Observable;
 import okhttp3.MediaType;
 import okhttp3.MultipartBody;
 import okhttp3.RequestBody;
-import okhttp3.ResponseBody;
-import retrofit2.Call;
+
+import java.io.File;
 
 /**
  * @purpose Created by Runt (qingingrunt2010@qq.com) on 2022/7/27.
@@ -29,8 +28,9 @@
         }
     }
 
-    public Call<ResponseBody> updateHead(File file){
-        return commonApi.updateHead(MultipartBody.Part.createFormData("head",file.getName(), RequestBody.create(MediaType.parse("text/plain"), file)));
+    public void updateHead(File file, HttpObserver<String> observer){
+        Observable<Results.StringApiResult> observable = commonApi.updateHead(MultipartBody.Part.createFormData("head", file.getName(), RequestBody.create(MediaType.parse("text/plain"), file)));
+        httpObserverOnLoading(observable,observer);
     }
 
 }
diff --git a/app/src/main/java/com/runt/open/mvvm/ui/splash/SplashActivity.java b/app/src/main/java/com/runt/open/mvvm/ui/splash/SplashActivity.java
index f422ab8..fbdd839 100644
--- a/app/src/main/java/com/runt/open/mvvm/ui/splash/SplashActivity.java
+++ b/app/src/main/java/com/runt/open/mvvm/ui/splash/SplashActivity.java
@@ -5,10 +5,12 @@
 import android.os.Handler;
 import android.view.View;
 import android.view.WindowManager;
-
+import com.google.gson.Gson;
 import com.runt.open.mvvm.base.activities.BaseActivity;
 import com.runt.open.mvvm.base.model.ImpViewModel;
+import com.runt.open.mvvm.config.Configuration;
 import com.runt.open.mvvm.databinding.ActivitySplashBinding;
+import com.runt.open.mvvm.ui.login.UserBean;
 import com.runt.open.mvvm.ui.main.MainActivity;
 
 
@@ -36,6 +38,11 @@
 
     @Override
     public void loadData() {
+        String json = getStringProjectPrefrence(Configuration.KEY_USERINFO);
+        if(!isNull(json)){
+            UserBean user = new Gson().fromJson(json ,UserBean.class);
+            UserBean.setUser(user);
+        }
         new Handler().postDelayed(new Runnable() {
             @Override
             public void run() {
diff --git a/app/src/main/java/com/runt/open/mvvm/util/GlideEngine.kt b/app/src/main/java/com/runt/open/mvvm/util/GlideEngine.kt
new file mode 100644
index 0000000..b6265c9
--- /dev/null
+++ b/app/src/main/java/com/runt/open/mvvm/util/GlideEngine.kt
@@ -0,0 +1,212 @@
+package com.runt.open.mvvm.util
+
+import android.content.Context
+import android.graphics.Bitmap
+import android.graphics.PointF
+import android.graphics.drawable.Drawable
+import android.view.View
+import android.widget.ImageView
+import androidx.core.graphics.drawable.RoundedBitmapDrawableFactory
+import com.bumptech.glide.Glide
+import com.bumptech.glide.request.RequestOptions
+import com.bumptech.glide.request.target.BitmapImageViewTarget
+import com.bumptech.glide.request.target.ImageViewTarget
+import com.luck.picture.lib.engine.ImageEngine
+import com.luck.picture.lib.listener.OnImageCompleteCallback
+import com.luck.picture.lib.tools.MediaUtils
+import com.luck.picture.lib.widget.longimage.ImageSource
+import com.luck.picture.lib.widget.longimage.ImageViewState
+import com.luck.picture.lib.widget.longimage.SubsamplingScaleImageView
+import com.runt.open.mvvm.R
+
+
+class GlideEngine : ImageEngine {
+    private constructor()
+
+    companion object {
+        val instance = GlideEngineInit.init
+    }
+
+    private object GlideEngineInit {
+        val init = GlideEngine()
+    }
+
+    /**
+     * 加载图片
+     *
+     * @param context
+     * @param url
+     * @param imageView
+     */
+    override fun loadImage(context: Context, url: String, imageView: ImageView) {
+        Glide.with(context)
+            .load(url)
+            .into(imageView)
+    }
+
+    /**
+     * 加载网络图片适配长图方案
+     * # 注意:此方法只有加载网络图片才会回调
+     *
+     * @param context
+     * @param url
+     * @param imageView
+     * @param longImageView
+     * @param callback      网络图片加载回调监听 {link after version 2.5.1 Please use the #OnImageCompleteCallback#}
+     */
+    override fun loadImage(
+        context: Context, url: String,
+        imageView: ImageView,
+        longImageView: SubsamplingScaleImageView, callback: OnImageCompleteCallback?
+    ) {
+        Glide.with(context)
+            .asBitmap()
+            .load(url)
+            .into(object : ImageViewTarget<Bitmap?>(imageView) {
+                override fun onLoadStarted(placeholder: Drawable?) {
+                    super.onLoadStarted(placeholder)
+                    callback?.onShowLoading()
+                }
+
+                override fun onLoadFailed(errorDrawable: Drawable?) {
+                    super.onLoadFailed(errorDrawable)
+                    callback?.onHideLoading()
+                }
+
+                override fun setResource(resource: Bitmap?) {
+                    callback?.onHideLoading()
+                    if (resource != null) {
+                        val eqLongImage = MediaUtils.isLongImg(
+                            resource.width,
+                            resource.height
+                        )
+                        longImageView.visibility = if (eqLongImage) View.VISIBLE else View.GONE
+                        imageView.visibility = if (eqLongImage) View.GONE else View.VISIBLE
+                        if (eqLongImage) {
+                            // 加载长图
+                            longImageView.isQuickScaleEnabled = true
+                            longImageView.isZoomEnabled = true
+                            longImageView.setDoubleTapZoomDuration(100)
+                            longImageView.setMinimumScaleType(SubsamplingScaleImageView.SCALE_TYPE_CENTER_CROP)
+                            longImageView.setDoubleTapZoomDpi(SubsamplingScaleImageView.ZOOM_FOCUS_CENTER)
+                            longImageView.setImage(
+                                ImageSource.bitmap(resource),
+                                ImageViewState(0f, PointF(0f, 0f), 0)
+                            )
+                        } else {
+                            // 普通图片
+                            imageView.setImageBitmap(resource)
+                        }
+                    }
+                }
+            })
+    }
+
+    /**
+     * 加载网络图片适配长图方案
+     * # 注意:此方法只有加载网络图片才会回调
+     *
+     * @param context
+     * @param url
+     * @param imageView
+     * @param longImageView
+     * @ 已废弃
+     */
+    override fun loadImage(
+        context: Context, url: String,
+        imageView: ImageView,
+        longImageView: SubsamplingScaleImageView
+    ) {
+        Glide.with(context)
+            .asBitmap()
+            .load(url)
+            .into(object : ImageViewTarget<Bitmap?>(imageView) {
+                override fun setResource(resource: Bitmap?) {
+                    if (resource != null) {
+                        val eqLongImage = MediaUtils.isLongImg(
+                            resource.width,
+                            resource.height
+                        )
+                        longImageView.visibility = if (eqLongImage) View.VISIBLE else View.GONE
+                        imageView.visibility = if (eqLongImage) View.GONE else View.VISIBLE
+                        if (eqLongImage) {
+                            // 加载长图
+                            longImageView.isQuickScaleEnabled = true
+                            longImageView.isZoomEnabled = true
+                            longImageView.setDoubleTapZoomDuration(100)
+                            longImageView.setMinimumScaleType(SubsamplingScaleImageView.SCALE_TYPE_CENTER_CROP)
+                            longImageView.setDoubleTapZoomDpi(SubsamplingScaleImageView.ZOOM_FOCUS_CENTER)
+                            longImageView.setImage(
+                                ImageSource.bitmap(resource),
+                                ImageViewState(0f, PointF(0f, 0f), 0)
+                            )
+                        } else {
+                            // 普通图片
+                            imageView.setImageBitmap(resource)
+                        }
+                    }
+                }
+            })
+    }
+
+    /**
+     * 加载相册目录
+     *
+     * @param context   上下文
+     * @param url       图片路径
+     * @param imageView 承载图片ImageView
+     */
+    override fun loadFolderImage(context: Context, url: String, imageView: ImageView) {
+        Glide.with(context)
+            .asBitmap()
+            .load(url)
+            .override(180, 180)
+            .centerCrop()
+            .sizeMultiplier(0.5f)
+            .apply(RequestOptions().placeholder(R.drawable.picture_image_placeholder))
+            .into(object : BitmapImageViewTarget(imageView) {
+                override fun setResource(resource: Bitmap?) {
+                    val circularBitmapDrawable =
+                        RoundedBitmapDrawableFactory.create(context.resources, resource)
+                    circularBitmapDrawable.cornerRadius = 8f
+                    imageView.setImageDrawable(circularBitmapDrawable)
+                }
+            })
+    }
+
+
+    /**
+     * 加载gif
+     *
+     * @param context   上下文
+     * @param url       图片路径
+     * @param imageView 承载图片ImageView
+     */
+    override fun loadAsGifImage(
+        context: Context, url: String,
+        imageView: ImageView
+    ) {
+        Glide.with(context)
+            .asGif()
+            .load(url)
+            .into(imageView)
+    }
+
+    /**
+     * 加载图片列表图片
+     *
+     * @param context   上下文
+     * @param url       图片路径
+     * @param imageView 承载图片ImageView
+     */
+    override fun loadGridImage(context: Context, url: String, imageView: ImageView) {
+        Glide.with(context)
+            .load(url)
+            .override(200, 200)
+            .centerCrop()
+            .apply(RequestOptions().placeholder(R.drawable.picture_image_placeholder))
+            .into(imageView)
+    }
+
+
+}
\ No newline at end of file
diff --git a/build.gradle b/build.gradle
index 7cbb664..efa40c2 100644
--- a/build.gradle
+++ b/build.gradle
@@ -1,11 +1,13 @@
 // Top-level build file where you can add configuration options common to all sub-projects/modules.
 buildscript {
+    ext.kotlin_version = "1.4.31"
     repositories {
         google()
         mavenCentral()
     }
     dependencies {
         classpath "com.android.tools.build:gradle:7.0.3"
+        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:1.5.20"
 
         // NOTE: Do not place your application dependencies here; they belong
         // in the individual module build.gradle files

--
Gitblit v1.9.1