From 24606d7b4415fedf4815f487d5278b86bad6346b Mon Sep 17 00:00:00 2001 From: wushaocheng <15876365887@163.com> Date: Fri, 8 Sep 2023 14:36:23 +0800 Subject: [PATCH] =?UTF-8?q?[Modify]=E4=BF=AE=E5=A4=8D=E5=8A=A8=E6=80=81?= =?UTF-8?q?=E7=89=B9=E6=9D=83=E5=8D=A1=E4=B8=8D=E8=83=BD=E6=98=BE=E7=A4=BA?= =?UTF-8?q?=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../app/avroom/activity/RoomBgActivity.kt | 11 -- .../dialog/CreatePrivilegeCardDialog.kt | 186 +++++++++++++++++- .../nnbc123/app/avroom/widget/GiftV2View.java | 24 +-- .../com/nnbc123/app/ui/widget/GiftDialog.java | 6 +- .../layout/dialog_create_privilege_card.xml | 4 +- gradle.properties | 4 +- .../library/common/glide/GlideUtils.kt | 94 ++++++++- 7 files changed, 288 insertions(+), 41 deletions(-) diff --git a/app/src/main/java/com/nnbc123/app/avroom/activity/RoomBgActivity.kt b/app/src/main/java/com/nnbc123/app/avroom/activity/RoomBgActivity.kt index dbb69d8dd..927fd289b 100644 --- a/app/src/main/java/com/nnbc123/app/avroom/activity/RoomBgActivity.kt +++ b/app/src/main/java/com/nnbc123/app/avroom/activity/RoomBgActivity.kt @@ -2,11 +2,6 @@ package com.nnbc123.app.avroom.activity import android.content.Context import android.content.Intent -import android.graphics.Color -import android.text.SpannableString -import android.text.Spanned -import android.text.method.LinkMovementMethod -import android.view.View import android.widget.LinearLayout import android.widget.TextView import androidx.core.content.ContextCompat @@ -15,18 +10,12 @@ import com.netease.nim.uikit.StatusBarUtil import com.netease.nim.uikit.common.util.sys.ScreenUtil import com.nnbc123.app.R import com.nnbc123.app.adapter.CommonVPAdapter -import com.nnbc123.app.avroom.dialog.CreatePrivilegeCardDialog -import com.nnbc123.app.avroom.fragment.PrivilegeCardFragment import com.nnbc123.app.avroom.fragment.RoomBgFragment import com.nnbc123.app.base.BaseViewBindingActivity -import com.nnbc123.app.common.widget.OriginalDrawStatusClickSpan -import com.nnbc123.app.databinding.ActivityPrivilegeBinding import com.nnbc123.app.databinding.ActivityRoomBgBinding import com.nnbc123.app.home.adapter.MainMagicIndicatorAdapter -import com.nnbc123.app.ui.webview.CommonWebViewActivity import com.nnbc123.app.ui.widget.magicindicator.ViewPagerHelper import com.nnbc123.app.ui.widget.magicindicator.buildins.commonnavigator.CommonNavigator -import com.nnbc123.core.UriProvider import com.nnbc123.library.annatation.ActLayoutRes /** diff --git a/app/src/main/java/com/nnbc123/app/avroom/dialog/CreatePrivilegeCardDialog.kt b/app/src/main/java/com/nnbc123/app/avroom/dialog/CreatePrivilegeCardDialog.kt index 6f92c207c..65ab369c8 100644 --- a/app/src/main/java/com/nnbc123/app/avroom/dialog/CreatePrivilegeCardDialog.kt +++ b/app/src/main/java/com/nnbc123/app/avroom/dialog/CreatePrivilegeCardDialog.kt @@ -1,19 +1,26 @@ package com.nnbc123.app.avroom.dialog import android.annotation.SuppressLint +import android.app.Activity +import android.content.Intent +import android.graphics.Bitmap +import android.net.Uri import android.os.Bundle import android.text.Editable import android.text.TextWatcher import android.view.Gravity +import androidx.core.content.ContextCompat import androidx.fragment.app.viewModels import com.hjq.toast.ToastUtils import com.netease.nim.uikit.common.util.sys.ScreenUtil -import com.nnbc123.app.ErbanTakePhotoActivity import com.nnbc123.app.ErbanTakePhotoActivity.TakePhotoCallBack import com.nnbc123.app.R +import com.nnbc123.app.application.XChatApplication import com.nnbc123.app.avroom.PrivilegeViewModel import com.nnbc123.app.avroom.event.PrivilegeCardEvent +import com.nnbc123.app.base.BaseActivity import com.nnbc123.app.base.BaseDialog +import com.nnbc123.app.common.util.BitmapUtil import com.nnbc123.app.databinding.DialogCreatePrivilegeCardBinding import com.nnbc123.app.takephoto.model.TResult import com.nnbc123.app.ui.utils.ImageLoadUtils @@ -21,9 +28,20 @@ import com.nnbc123.app.ui.utils.ImageLoadUtilsV2 import com.nnbc123.app.ui.widget.dialog.CommonTipDialog import com.nnbc123.core.file.FileModel import com.nnbc123.core.privilege.bean.PrivilegeCardInfo +import com.nnbc123.core.utils.Logger import com.nnbc123.core.utils.TextUtils +import com.nnbc123.library.common.file.FileHelper +import com.nnbc123.library.common.glide.GlideUtils +import com.nnbc123.library.common.photo.PhotoProviderNew +import com.nnbc123.library.common.util.PhotoCompressCallback +import com.nnbc123.library.common.util.PhotoCompressUtil +import com.nnbc123.library.easyphoto.constant.Type import com.nnbc123.library.utils.SingleToastUtil +import com.yalantis.ucrop.UCrop +import kotlinx.coroutines.Job import org.greenrobot.eventbus.EventBus +import java.text.SimpleDateFormat +import java.util.* import java.util.regex.Pattern /** @@ -35,6 +53,15 @@ class CreatePrivilegeCardDialog : BaseDialog() TakePhotoCallBack { companion object { + + private const val TAG = "CreatePrivilegeCardDial" + private const val REQUEST_CODE_OPEN_PHOTO_PROVIDER = 111 // 从相册中选择 + private const val MAX_BITMAP_SIZE = 100 * 1024 * 1024 // 剪切的图片最大为100 MB + private const val MIN_HEAD_PHOTO_SIZE = 20 * 1024 // 剪切的图片最小为20kb + + //压缩后的大小不能超过大小 800KB + private const val IMAGE_MOST_COMPRESS_SIZE = 800 + @JvmStatic fun newInstance(): CreatePrivilegeCardDialog { return CreatePrivilegeCardDialog() @@ -54,7 +81,10 @@ class CreatePrivilegeCardDialog : BaseDialog() private var saveTipDialog: CommonTipDialog? = null - private var url = "" + private var mUrl = "" + + private var mUri: Uri? = null + private var mJob: Job? = null private val privilegeViewModel: PrivilegeViewModel by viewModels() @@ -74,7 +104,7 @@ class CreatePrivilegeCardDialog : BaseDialog() binding.edValid.setText(it.effectDay.toString()) binding.edId.setText(it.erbanNoStr) ImageLoadUtilsV2.loadImage(binding.ivPic, it.cardUrl) - this.url = it.cardUrl + this.mUrl = it.cardUrl } binding.edName.addTextChangedListener(object : TextWatcher { @@ -153,13 +183,18 @@ class CreatePrivilegeCardDialog : BaseDialog() }) binding.ivPic.setOnClickListener { - ErbanTakePhotoActivity.startToSelectPhoto(context, this) + mUri = Uri.parse("file://${FileHelper.getRootCacheDir()?.path}/${getNowTime()}.jpg") + PhotoProviderNew.photoProvider( + this, + canChooseGif = true, + resultCode = REQUEST_CODE_OPEN_PHOTO_PROVIDER + ) } binding.tvCancel.setOnClickListener { dismissAllowingStateLoss() } binding.tvConfirm.setOnClickListener { - if(!isStringComma(binding.edId.text.toString())){ + if (!isStringComma(binding.edId.text.toString())) { SingleToastUtil.showToast("请输入以逗号分隔的id") } else if (checkEmpty()) { SingleToastUtil.showToast("请填写完整信息") @@ -175,6 +210,12 @@ class CreatePrivilegeCardDialog : BaseDialog() } } + private fun getNowTime(): String { + val date = Date(System.currentTimeMillis()) + val dateFormat = SimpleDateFormat("MMddHHmmssSS") + return dateFormat.format(date) + } + private fun showTip() { if (saveTipDialog == null) { saveTipDialog = CommonTipDialog(context) @@ -187,7 +228,7 @@ class CreatePrivilegeCardDialog : BaseDialog() binding.edExplain.text.toString(), binding.edValid.text.toString().toInt(), binding.edId.text.toString(), - url + mUrl ) saveTipDialog?.dismiss() } @@ -207,7 +248,7 @@ class CreatePrivilegeCardDialog : BaseDialog() return (TextUtils.isEmptyText(binding.edName.text.toString()) || TextUtils.isEmptyText( binding.edUseNumber.text.toString() ) || TextUtils.isEmptyText(binding.edValid.text.toString()) || TextUtils.isEmptyText(binding.edId.text.toString()) || TextUtils.isEmptyText( - url + mUrl )) } @@ -219,6 +260,130 @@ class CreatePrivilegeCardDialog : BaseDialog() return matcher.matches() || matcher1.matches() } + @SuppressLint("CheckResult") + override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { + super.onActivityResult(requestCode, resultCode, data) + if (resultCode == BaseActivity.RESULT_OK) { + when (requestCode) { + REQUEST_CODE_OPEN_PHOTO_PROVIDER -> data?.let { + val photos = PhotoProviderNew.getResultPhotoList(it) ?: return + if (photos.isNotEmpty()) { + val photo = photos[0] + if(photo.path.endsWith(Type.GIF) || photo.type.endsWith(Type.GIF)){ + FileModel.get() + .uploadFile(photo.path) + .compose(bindToLifecycle()) + .subscribe { url: String?, throwable: Throwable? -> + if (throwable != null) { + SingleToastUtil.showToast("上传失败") + } else { + url?.let { it1 -> + GlideUtils.instance().loadUriGiftAndCrossFadeRound( + it1, binding.ivPic, 10f) + } + if (url != null) { + mUrl = url + } + } + } + } else { + crop(photo.uri, photo.size, mUri) + } + } + } + UCrop.REQUEST_CROP ->{ + mUri?.path?.let { + mJob = PhotoCompressUtil.compress( + context as Activity, + it, + PhotoCompressUtil.getCompressCachePath(), + object : PhotoCompressCallback { + @SuppressLint("CheckResult") + override fun onSuccess(compressedImg: String) { + FileModel.get() + .uploadFile(compressedImg) + .compose(bindToLifecycle()) + .subscribe { url: String?, throwable: Throwable? -> + if (throwable != null) { + SingleToastUtil.showToast("上传失败") + } else { + ImageLoadUtils.loadRectImage( + context, + url, + binding.ivPic, + R.drawable.default_cover, + ScreenUtil.dip2px(10f) + ) + if (url != null) { + mUrl = url + } + } + } + } + + override fun onFail(e: Throwable) { + ToastUtils.show(e.message) + } + }, + mostCompressSize = IMAGE_MOST_COMPRESS_SIZE + ) + } + } + } + } + } + + /** + * 第三方图片裁剪框架Ucrop + */ + private fun crop(sourceUri: Uri?, sourceSize: Long, destinationUri: Uri?) { + if (sourceUri == null || destinationUri == null) { + return + } //防止too large导致oom,大于100m不处理,内存大小 + if (BitmapUtil.getSdBitmapSize(sourceUri) >= MAX_BITMAP_SIZE) { + ToastUtils.show(R.string.text_bitmap_too_large) + return + } + if (sourceSize > 0) { + //不能上传图片的最小文件大小 + Logger.debug(TAG, "sourceSize: $sourceSize") + if (sourceSize < MIN_HEAD_PHOTO_SIZE) { + ToastUtils.show(R.string.text_bitmap_too_small) + return + } + } + val options = UCrop.Options().apply { + setCompressionQuality(100) + setShowCropGrid(false) + setToolbarColor( + ContextCompat.getColor( + XChatApplication.gContext, + android.R.color.black + ) + ) + setStatusBarColor( + ContextCompat.getColor( + XChatApplication.gContext, + android.R.color.black + ) + ) + setHideBottomControls(true) + setCompressionFormat(Bitmap.CompressFormat.JPEG) + setToolbarCancelDrawable(R.drawable.user_ucrop_ic_closs) + setToolbarCropDrawable(R.drawable.user_ucrop_ic_sure) + setToolbarWidgetColor( + ContextCompat.getColor( + XChatApplication.gContext, + R.color.color_white + ) + ) + } + context?.let { + UCrop.of(sourceUri, destinationUri).withOptions(options).withAspectRatio(16f, 9f) + .withMaxResultSize(1422, 800).start(it, this) + } + } + @SuppressLint("CheckResult") override fun takeSuccess(result: TResult?) { FileModel.get() @@ -236,7 +401,7 @@ class CreatePrivilegeCardDialog : BaseDialog() ScreenUtil.dip2px(10f) ) if (url != null) { - this.url = url + mUrl = url } } } @@ -250,4 +415,9 @@ class CreatePrivilegeCardDialog : BaseDialog() } + override fun onDestroyView() { + super.onDestroyView() + mJob?.cancel() + } + } \ No newline at end of file diff --git a/app/src/main/java/com/nnbc123/app/avroom/widget/GiftV2View.java b/app/src/main/java/com/nnbc123/app/avroom/widget/GiftV2View.java index f19c253f6..069e75be8 100644 --- a/app/src/main/java/com/nnbc123/app/avroom/widget/GiftV2View.java +++ b/app/src/main/java/com/nnbc123/app/avroom/widget/GiftV2View.java @@ -26,15 +26,7 @@ import android.widget.FrameLayout; import android.widget.ImageView; import com.netease.nim.uikit.common.util.log.LogUtil; -import com.netease.nim.uikit.common.util.sys.ScreenUtil; import com.netease.nimlib.sdk.chatroom.model.ChatRoomMessage; -import com.nnbc123.app.ui.utils.ImageLoadUtilsV2; -import com.nnbc123.core.im.custom.bean.RoomPrivilegeAttachment; -import com.opensource.svgaplayer.SVGACallback; -import com.opensource.svgaplayer.SVGADrawable; -import com.opensource.svgaplayer.SVGAImageView; -import com.opensource.svgaplayer.SVGAParser; -import com.opensource.svgaplayer.SVGAVideoEntity; import com.nnbc123.app.R; import com.nnbc123.app.common.svga.SimpleSvgaParseCompletion; import com.nnbc123.app.ui.utils.ImageLoadUtils; @@ -50,6 +42,7 @@ import com.nnbc123.core.gift.bean.GiftReceiver; import com.nnbc123.core.gift.bean.LuckyBagGifts; import com.nnbc123.core.gift.bean.MultiGiftReceiveInfo; import com.nnbc123.core.im.custom.bean.FansTeamMsgAttachment; +import com.nnbc123.core.im.custom.bean.RoomPrivilegeAttachment; import com.nnbc123.core.magic.MagicModel; import com.nnbc123.core.magic.ObjectPool; import com.nnbc123.core.magic.bean.MagicInfo; @@ -60,7 +53,13 @@ import com.nnbc123.core.manager.IMNetEaseManager; import com.nnbc123.core.manager.RoomEvent; import com.nnbc123.core.monsterhunting.bean.MonsterAttackInfo; import com.nnbc123.core.room.bean.RoomInfo; +import com.nnbc123.library.common.glide.GlideUtils; import com.nnbc123.library.utils.ResolutionUtils; +import com.opensource.svgaplayer.SVGACallback; +import com.opensource.svgaplayer.SVGADrawable; +import com.opensource.svgaplayer.SVGAImageView; +import com.opensource.svgaplayer.SVGAParser; +import com.opensource.svgaplayer.SVGAVideoEntity; import java.lang.ref.WeakReference; import java.net.MalformedURLException; @@ -806,13 +805,8 @@ public class GiftV2View extends FrameLayout implements GiftEffectView.GiftEffect senderPoint = new Point(mScreenWidth / 2 - privilegeWidth / 2, UIUtil.dip2px(context, 25)); } SVGAImageView imageView = mMagicViewPool.borrowPrivilegeObject(senderPoint); - ImageLoadUtils.loadRectImage( - context, - giftUrl, - imageView, - R.drawable.default_cover, - ScreenUtil.dip2px(8f) - ); + GlideUtils.instance().loadGiftAndCrossFadeRound( + giftUrl, imageView, 8f); Keyframe keyTransX3 = (Keyframe.ofFloat(0.5f, center.x - senderPoint.x - privilegeWidth / 2)); Keyframe keyTransX4 = (Keyframe.ofFloat(0.8f, center.x - senderPoint.x - privilegeWidth / 2)); diff --git a/app/src/main/java/com/nnbc123/app/ui/widget/GiftDialog.java b/app/src/main/java/com/nnbc123/app/ui/widget/GiftDialog.java index c9dd6345a..833d927d5 100644 --- a/app/src/main/java/com/nnbc123/app/ui/widget/GiftDialog.java +++ b/app/src/main/java/com/nnbc123/app/ui/widget/GiftDialog.java @@ -96,6 +96,7 @@ import com.nnbc123.core.user.bean.UserInfo; import com.nnbc123.core.utils.net.RxHelper; import com.nnbc123.library.bindinglist.IItem; import com.nnbc123.library.bindinglist.MultiTypeAdapter; +import com.nnbc123.library.common.glide.GlideUtils; import com.nnbc123.library.utils.FormatUtils; import com.nnbc123.library.utils.ListUtils; import com.nnbc123.library.utils.SingleToastUtil; @@ -841,8 +842,11 @@ public class GiftDialog extends BottomSheetDialog implements View.OnClickListene if (item == null) { return; } + RoundedImageView imageView = helper.getView(R.id.iv_pic); - ImageLoadUtilsV2.loadImage(imageView, item.getCardUrl()); + GlideUtils.instance().loadGiftAndImage( + item.getCardUrl(), imageView); + if (item.isSelected()) { imageView.setBorderColor(ContextCompat.getColor(mContext, R.color.color_FFDA24)); imageView.setBorderWidth((float) 2); diff --git a/app/src/main/res/layout/dialog_create_privilege_card.xml b/app/src/main/res/layout/dialog_create_privilege_card.xml index 4a3066191..f4fdf1e6b 100644 --- a/app/src/main/res/layout/dialog_create_privilege_card.xml +++ b/app/src/main/res/layout/dialog_create_privilege_card.xml @@ -282,13 +282,11 @@ app:layout_constraintEnd_toEndOf="@+id/ivPicAdd" app:layout_constraintTop_toBottomOf="@+id/ivPicAdd"/> -