diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index a6d884e5f..d77568b1a 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -51,9 +51,9 @@ tools:node="remove" /> - + - + diff --git a/app/src/main/java/com/chwl/app/avroom/room_album/UploadRoomAlbumDialogFragment.kt b/app/src/main/java/com/chwl/app/avroom/room_album/UploadRoomAlbumDialogFragment.kt index c5f6748cb..9aa342615 100644 --- a/app/src/main/java/com/chwl/app/avroom/room_album/UploadRoomAlbumDialogFragment.kt +++ b/app/src/main/java/com/chwl/app/avroom/room_album/UploadRoomAlbumDialogFragment.kt @@ -3,6 +3,7 @@ package com.chwl.app.avroom.room_album import android.Manifest import android.annotation.SuppressLint import android.app.Activity +import android.app.AlertDialog import android.app.Dialog import android.content.Intent import android.os.Build @@ -11,6 +12,9 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import android.view.WindowManager +import androidx.activity.result.ActivityResultLauncher +import androidx.activity.result.PickVisualMediaRequest +import androidx.activity.result.contract.ActivityResultContracts import androidx.core.content.ContextCompat import androidx.fragment.app.activityViewModels import androidx.recyclerview.widget.GridLayoutManager @@ -25,12 +29,17 @@ import com.chwl.app.ui.utils.ImageLoadUtilsV2 import com.chwl.app.ui.widget.recyclerview.decoration.GridSpacingItemNewDecoration import com.chwl.core.Constants import com.chwl.core.gift.bean.GiftInfo +import com.chwl.core.utils.DialogUtil +import com.chwl.core.utils.MyUriUtils import com.chwl.library.common.photo.PhotoProvider import com.chwl.library.common.photo.PhotoProvider.photoProvider import com.chwl.library.common.util.PhotoCompressUtil.compress import com.chwl.library.common.util.PhotoCompressUtil.getCompressCachePath import com.chwl.library.common.util.PhotosCompressCallback +import com.chwl.library.common.util.SPUtils +import com.chwl.library.constants.ConstantsLib import com.chwl.library.easypermisssion.EasyPermissions +import com.netease.nim.uikit.common.ui.dialog.EasyAlertDialogHelper import kotlinx.coroutines.Job class UploadRoomAlbumDialogFragment : BottomSheetDialogFragment() { @@ -45,7 +54,7 @@ class UploadRoomAlbumDialogFragment : BottomSheetDialogFragment() { private var unlockedGift: GiftInfo? = null private var compressJob: Job? = null - + var pickMedia : ActivityResultLauncher?=null val dialogManager by lazy { DialogManager(context) } @@ -55,6 +64,17 @@ class UploadRoomAlbumDialogFragment : BottomSheetDialogFragment() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setStyle(STYLE_NO_TITLE, R.style.ErbanBottomSheetDialog) + if (ActivityResultContracts.PickVisualMedia.isPhotoPickerAvailable(requireContext())) { + pickMedia = registerForActivityResult(ActivityResultContracts.PickVisualMedia()) { uri -> + uri?.let { + val file = MyUriUtils.copyFile(requireContext(),uri) + if (file != null) { + compressPhotos(mutableListOf(file.path)) + } + } + } + } + } override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { @@ -194,7 +214,7 @@ class UploadRoomAlbumDialogFragment : BottomSheetDialogFragment() { return@setOnClickListener } - dialogManager.showProgressDialog(context) +// dialogManager.showProgressDialog(context) viewModel.upload( list, type, @@ -204,7 +224,7 @@ class UploadRoomAlbumDialogFragment : BottomSheetDialogFragment() { viewModel.uploadLiveData.observe(this) { it?.getContentIfNotHandled()?.let { success -> - dialogManager.hideProgressDialog() +// dialogManager.hideProgressDialog() if (success) { dismiss() @@ -219,28 +239,37 @@ class UploadRoomAlbumDialogFragment : BottomSheetDialogFragment() { } private fun checkStoragePermission() { - if (!EasyPermissions.hasPermissions( - requireContext(), - if (Build.VERSION.SDK_INT >= 33) Manifest.permission.READ_MEDIA_IMAGES - else Manifest.permission.READ_EXTERNAL_STORAGE - ) - ) { - EasyPermissions.requestPermissions( - this, - getString(R.string.permission_storage_rationale), - 100, - if (Build.VERSION.SDK_INT >= 33) Manifest.permission.READ_MEDIA_IMAGES - else Manifest.permission.READ_EXTERNAL_STORAGE - ) - } else { - photoProvider( - this, - 7 - photoAdapter.data.size, - true, - 200, - true - ) + + if (Build.VERSION.SDK_INT >= 33){ + DialogUtil.getDialog(requireActivity(),object : EasyAlertDialogHelper.OnDialogActionListener { + override fun doCancelAction() { + + } + override fun doOkAction() { + SPUtils.putBoolean(ConstantsLib.Key.Permissions_Img,true) + pickMedia?.launch(PickVisualMediaRequest(ActivityResultContracts.PickVisualMedia.ImageOnly)) + } + }) + }else{ + if (!EasyPermissions.hasPermissions(requireContext(),Manifest.permission.READ_EXTERNAL_STORAGE)) { + EasyPermissions.requestPermissions( + this, + getString(R.string.permission_storage_rationale), + 100, + Manifest.permission.READ_EXTERNAL_STORAGE + ) + } else { + photoProvider( + this, + 7 - photoAdapter.data.size, + true, + 200, + true + ) + } } + + } @Deprecated("Deprecated in Java") diff --git a/app/src/main/java/com/chwl/app/common/dialog/PhotoDialog.kt b/app/src/main/java/com/chwl/app/common/dialog/PhotoDialog.kt deleted file mode 100644 index 4148147cb..000000000 --- a/app/src/main/java/com/chwl/app/common/dialog/PhotoDialog.kt +++ /dev/null @@ -1,279 +0,0 @@ -package com.chwl.app.common.dialog - -import android.Manifest -import android.content.Intent -import android.net.Uri -import android.os.Build -import android.os.Bundle -import android.provider.Settings -import android.text.TextUtils -import android.view.Gravity -import android.view.Window -import android.view.WindowManager -import com.hjq.toast.ToastUtils -import com.chwl.app.R -import com.chwl.app.application.App -import com.chwl.app.databinding.PhotoDialogBinding -import com.chwl.app.ui.widget.dialog.CommonTipDialog -import com.chwl.library.common.base.BaseDialogFragment -import com.chwl.library.common.photo.PhotoProvider -import com.chwl.library.common.util.PhotoCompressCallback -import com.chwl.library.common.util.PhotoCompressUtil -import com.chwl.library.common.util.PhotosCompressCallback -import com.chwl.library.easypermisssion.EasyPermissions -import kotlinx.coroutines.Job - -/** - * 该对话框的功能提供拍摄和选择图片 - */ -class PhotoDialog : BaseDialogFragment(), EasyPermissions.PermissionCallbacks { - private var mOnResultCallBack: OnResultCallBack? = null - private var mJob: Job? = null - - companion object { - private const val PERMISSION_CODE_CAMERA = 100 - private const val REQUEST_CODE_CAMERA = 101 - private const val PERMISSION_CODE_STORAGE_1 = 200 - private const val REQUEST_CODE_STORAGE_1 = 201 - private const val PERMISSION_CODE_STORAGE_2 = 202 - private const val REQUEST_CODE_STORAGE_2 = 203 - private const val REQUEST_CODE_OPEN_PHOTO_PROVIDER = 103 - private const val REQUEST_CODE_OPEN_CAMERA_PROVIDER = 104 - } - - override fun initBefore(savedInstanceState: Bundle?) { - super.initBefore(savedInstanceState) - dialog?.requestWindowFeature(Window.FEATURE_NO_TITLE) - } - - override fun setListener() { - binding?.tvTakePhoto?.setOnClickListener { - checkCameraPermission() - } - binding?.tvChoicePicture?.setOnClickListener { - checkStoragePermission1() - } - } - - private fun initDialog() { - dialog?.window?.also { - it.decorView.setPadding(0, 0, 0, 0) - it.attributes = it.attributes.apply { - gravity = Gravity.BOTTOM - width = WindowManager.LayoutParams.MATCH_PARENT - } - it.setBackgroundDrawableResource(R.drawable.photo_dialog_bg) - } - } - - override fun onStart() { - super.onStart() - initDialog() - } - - private fun checkStoragePermission1() { - if (!EasyPermissions.hasPermissions( - App.gContext, if (Build.VERSION.SDK_INT >= 33) Manifest.permission.READ_MEDIA_IMAGES else Manifest.permission.READ_EXTERNAL_STORAGE - ) - ) { - EasyPermissions.requestPermissions( - this, - getString(R.string.permission_storage_rationale), - PERMISSION_CODE_STORAGE_1, - if (Build.VERSION.SDK_INT >= 33) Manifest.permission.READ_MEDIA_IMAGES else Manifest.permission.READ_EXTERNAL_STORAGE - ) - } else { - PhotoProvider.photoProvider(this, resultCode = REQUEST_CODE_OPEN_PHOTO_PROVIDER) - } - } - - private fun checkCameraPermission() { - if (!EasyPermissions.hasPermissions( - App.gContext, - Manifest.permission.CAMERA - ) - ) { - EasyPermissions.requestPermissions( - this, - getString(R.string.permission_camera_rationale), - PERMISSION_CODE_CAMERA, - Manifest.permission.CAMERA - ) - } else { - checkStoragePermission2() - } - } - - private fun checkStoragePermission2() { - if (!EasyPermissions.hasPermissions( - App.gContext, if (Build.VERSION.SDK_INT >= 33) - Manifest.permission.READ_MEDIA_IMAGES else Manifest.permission.READ_EXTERNAL_STORAGE - ) - ) { - EasyPermissions.requestPermissions( - this, - getString(R.string.permission_storage_rationale), - PERMISSION_CODE_STORAGE_2, - if (Build.VERSION.SDK_INT >= 33) Manifest.permission.READ_MEDIA_IMAGES else Manifest.permission.READ_EXTERNAL_STORAGE - ) - } else { - PhotoProvider.photoCamera(this, REQUEST_CODE_OPEN_CAMERA_PROVIDER) - } - } - - override fun onRequestPermissionsResult( - requestCode: Int, - permissions: Array, - grantResults: IntArray - ) { - super.onRequestPermissionsResult(requestCode, permissions, grantResults) - EasyPermissions.onRequestPermissionsResult(requestCode, permissions, grantResults, this) - } - - override fun onPermissionsGranted(requestCode: Int, perms: MutableList) { - if (requestCode == PERMISSION_CODE_CAMERA) { - checkCameraPermission() - } else if (requestCode == PERMISSION_CODE_STORAGE_1) { - checkStoragePermission1() - } else if (requestCode == PERMISSION_CODE_STORAGE_2) { - checkStoragePermission2() - } - } - - override fun onPermissionsDenied(requestCode: Int, perms: MutableList) { - if (requestCode == PERMISSION_CODE_STORAGE_1 || requestCode == PERMISSION_CODE_STORAGE_2 || requestCode == PERMISSION_CODE_CAMERA) { - val requestTip: String = - if (requestCode == PERMISSION_CODE_STORAGE_1 || requestCode == PERMISSION_CODE_STORAGE_2) { - getString(R.string.permission_storage_denied) - } else { - getString(R.string.permission_camera_denied) - } - val mPrivacyDialog = CommonTipDialog(context) - mPrivacyDialog.setTipMsg(requestTip) - mPrivacyDialog.setOkText(getString(R.string.room_perform_go_update)) - mPrivacyDialog.setOnActionListener( - object : CommonTipDialog.OnActionListener { - override fun onOk() { - //同意跳到应用详情页面 - val packageUri = - Uri.parse("package:${activity?.packageName}") - val intent = Intent( - Settings.ACTION_APPLICATION_DETAILS_SETTINGS, - packageUri - ) - if (requestCode == PERMISSION_CODE_STORAGE_1) { - startActivityForResult( - intent, REQUEST_CODE_STORAGE_1 - ) - } else if (requestCode == PERMISSION_CODE_STORAGE_2) { - startActivityForResult( - intent, - REQUEST_CODE_STORAGE_2 - ) - } else { - startActivityForResult( - intent, REQUEST_CODE_CAMERA - ) - } - } - - override fun onCancel() { - super.onCancel() - //取消跳到应用详情页面 - if (requestCode == PERMISSION_CODE_STORAGE_1 || requestCode == PERMISSION_CODE_STORAGE_2) { - ToastUtils.show(getString(R.string.permission_storage_refused)) - } else { - ToastUtils.show(getString(R.string.permission_camera_refused)) - } - } - } - ) - mPrivacyDialog.show() - } - } - - override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { - super.onActivityResult(requestCode, resultCode, data) - if (requestCode == REQUEST_CODE_STORAGE_1) { - checkStoragePermission1() - } else if (requestCode == REQUEST_CODE_STORAGE_2) { - checkStoragePermission2() - } else if (requestCode == REQUEST_CODE_CAMERA) { - checkCameraPermission() - } else - if (resultCode == RESULT_OK) { - when (requestCode) { - REQUEST_CODE_OPEN_CAMERA_PROVIDER -> { - if (mOnResultCallBack == null || data == null) return - PhotoProvider.getResultPathListAsync(data) { paths -> - val list = paths?.mapNotNull { it.path }?.toMutableList() ?: ArrayList() - val path = list[0] - if (!TextUtils.isEmpty(path)) { - mJob?.cancel() - mJob = PhotoCompressUtil.compress( - App.gContext, - path, - PhotoCompressUtil.getCompressCachePath(), - object : PhotoCompressCallback { - override fun onSuccess(compressedImg: String) { - mOnResultCallBack?.takePhotoCallBack(compressedImg) - } - - override fun onFail(e: Throwable) { - mOnResultCallBack?.takePhotoCallBack(path) - } - }) - - } else { - mOnResultCallBack?.takePhotoCallBack(path) - } - } - } - REQUEST_CODE_OPEN_PHOTO_PROVIDER -> { - if (mOnResultCallBack == null || data == null) return - PhotoProvider.getResultPathListAsync(data) { list -> - val paths = list?.mapNotNull { it.path }?.toMutableList() ?: ArrayList() - if (paths.isEmpty()) { - mOnResultCallBack?.choicePhotoCallBack(paths) - } else { - mJob?.cancel() - mJob = PhotoCompressUtil.compress( - App.gContext, - paths, - PhotoCompressUtil.getCompressCachePath(), - object : PhotosCompressCallback { - override fun onSuccess(compressedImgList: ArrayList) { - mOnResultCallBack?.choicePhotoCallBack(compressedImgList) - } - - override fun onFail(e: Throwable) { - mOnResultCallBack?.choicePhotoCallBack(paths) - } - - }) - } - } - } - } - dismissAllowingStateLoss() - } - } - - fun setOnResultCallBack(onResultCallBack: OnResultCallBack) { - mOnResultCallBack = onResultCallBack - } - - override fun onWillDestroy() { - mJob?.cancel() - super.onWillDestroy() - } - - interface OnResultCallBack { - - fun takePhotoCallBack(path: String?) - - fun choicePhotoCallBack(paths: List?) - - } - -} \ No newline at end of file diff --git a/app/src/main/java/com/chwl/app/common/util/AppLifeCycleHelper.java b/app/src/main/java/com/chwl/app/common/util/AppLifeCycleHelper.java index 8b3f80571..185269555 100644 --- a/app/src/main/java/com/chwl/app/common/util/AppLifeCycleHelper.java +++ b/app/src/main/java/com/chwl/app/common/util/AppLifeCycleHelper.java @@ -6,10 +6,13 @@ import android.os.Bundle; import androidx.annotation.NonNull; import androidx.annotation.Nullable; +import com.chwl.app.BuildConfig; import com.chwl.app.application.App; import com.chwl.core.auth.AuthModel; +import com.chwl.core.utils.LogUtils; import com.chwl.library.common.util.CoreUtils; +import com.netease.nim.uikit.common.util.log.LogUtil; /** * Activity生命周期工具类 @@ -27,6 +30,9 @@ public class AppLifeCycleHelper implements Application.ActivityLifecycleCallback @Override public void onActivityStarted(@NonNull Activity activity) { + if (BuildConfig.DEBUG) { + LogUtils.d("当前Activity : "+ activity.getClass().getSimpleName()); + } if (++AppLifeCycleHelper.sActivityReferences == 1 && !AppLifeCycleHelper.sIsActivityChangingConfigurations) { AppLifeCycleHelper.onForeground(); diff --git a/app/src/main/java/com/chwl/app/ui/feedback/FeedbackActivity.kt b/app/src/main/java/com/chwl/app/ui/feedback/FeedbackActivity.kt index e6927dea1..1902975fb 100644 --- a/app/src/main/java/com/chwl/app/ui/feedback/FeedbackActivity.kt +++ b/app/src/main/java/com/chwl/app/ui/feedback/FeedbackActivity.kt @@ -4,7 +4,11 @@ import android.Manifest import android.annotation.SuppressLint import android.content.Intent import android.os.Build +import android.os.Bundle import android.widget.ImageView.ScaleType +import androidx.activity.result.ActivityResultLauncher +import androidx.activity.result.PickVisualMediaRequest +import androidx.activity.result.contract.ActivityResultContracts import androidx.activity.viewModels import androidx.lifecycle.Lifecycle import androidx.lifecycle.lifecycleScope @@ -16,10 +20,14 @@ import com.chwl.app.ui.utils.load import com.chwl.app.ui.widget.dialog.CommonTipDialog import com.chwl.core.file.FileModel import com.chwl.core.home.bean.FeedbackTypeBean +import com.chwl.core.utils.DialogUtil +import com.chwl.core.utils.MyUriUtils import com.chwl.library.common.photo.PhotoProvider import com.chwl.library.common.photo.PhotoProvider.photoProvider import com.chwl.library.common.util.PhotoCompressUtil import com.chwl.library.common.util.PhotosCompressCallback +import com.chwl.library.common.util.SPUtils +import com.chwl.library.constants.ConstantsLib import com.chwl.library.easypermisssion.EasyPermissions import com.chwl.library.easyphoto.utils.settings.SettingsUtils import com.chwl.library.utils.ResUtil @@ -35,6 +43,7 @@ import com.google.android.flexbox.FlexboxLayoutManager import com.google.android.flexbox.JustifyContent import com.hjq.toast.ToastUtils import com.netease.nim.uikit.StatusBarUtil +import com.netease.nim.uikit.common.ui.dialog.EasyAlertDialogHelper import kotlinx.coroutines.Job import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.launch @@ -52,6 +61,21 @@ class FeedbackActivity : BaseViewBindingActivity(), private var imagePath: String? = null private var imageUrl: String? = null + var pickMedia : ActivityResultLauncher?=null + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + if (ActivityResultContracts.PickVisualMedia.isPhotoPickerAvailable(this)) { + pickMedia = registerForActivityResult(ActivityResultContracts.PickVisualMedia()) { uri -> + uri?.let { + val file = MyUriUtils.copyFile(this,uri) + if (file != null) { + compressPhotos(mutableListOf(file.path)) + } + } + } + } + } override fun init() { initWhiteTitleBar(ResUtil.getString(R.string.feedback_title)) initView() @@ -262,26 +286,37 @@ class FeedbackActivity : BaseViewBindingActivity(), } private fun checkStoragePermission() { - if (!EasyPermissions.hasPermissions( - this, - if (Build.VERSION.SDK_INT >= 33) Manifest.permission.READ_MEDIA_IMAGES else Manifest.permission.READ_EXTERNAL_STORAGE - ) - ) { - EasyPermissions.requestPermissions( - this, - getString(R.string.permission_storage_rationale), - PERMISSION_CODE_STORAGE, - if (Build.VERSION.SDK_INT >= 33) Manifest.permission.READ_MEDIA_IMAGES else Manifest.permission.READ_EXTERNAL_STORAGE - ) - } else { - photoProvider( - this, - 1, - true, - REQUEST_CODE_OPEN_PHOTO_PROVIDER, - true, - true - ) + + if (Build.VERSION.SDK_INT >= 33){ + DialogUtil.getDialog(this,object : EasyAlertDialogHelper.OnDialogActionListener { + override fun doCancelAction() { + } + + override fun doOkAction() { + SPUtils.putBoolean(ConstantsLib.Key.Permissions_Img,true) + pickMedia?.launch(PickVisualMediaRequest(ActivityResultContracts.PickVisualMedia.ImageOnly)) + } + }) + }else{ + if (!EasyPermissions.hasPermissions( + this,Manifest.permission.READ_EXTERNAL_STORAGE + ) + ) { + EasyPermissions.requestPermissions( + this, + getString(R.string.permission_storage_rationale), + PERMISSION_CODE_STORAGE,Manifest.permission.READ_EXTERNAL_STORAGE + ) + } else { + photoProvider( + this, + 1, + true, + REQUEST_CODE_OPEN_PHOTO_PROVIDER, + true, + true + ) + } } } diff --git a/app/src/main/java/com/chwl/app/ui/setting/bean/PermissionEntity.kt b/app/src/main/java/com/chwl/app/ui/setting/bean/PermissionEntity.kt index b88ed0e45..18bda4a73 100644 --- a/app/src/main/java/com/chwl/app/ui/setting/bean/PermissionEntity.kt +++ b/app/src/main/java/com/chwl/app/ui/setting/bean/PermissionEntity.kt @@ -37,10 +37,12 @@ enum class PermissionEntity( STORAGE( ResUtil.getString(R.string.setting_bean_permissionentity_011), ResUtil.getString(R.string.setting_bean_permissionentity_012), R.drawable.icon_permission_storage, arrayOf( - if (Build.VERSION.SDK_INT >= 33) Manifest.permission.READ_MEDIA_IMAGES else Manifest.permission.READ_EXTERNAL_STORAGE + Manifest.permission.READ_EXTERNAL_STORAGE ) ); + + companion object { fun fetchPermission(name: String): PermissionEntity? { if (CoreTextUtils.isEmptyText(name)) return null diff --git a/app/src/main/java/com/chwl/app/ui/user/activity/UserInfoModifyActivity.kt b/app/src/main/java/com/chwl/app/ui/user/activity/UserInfoModifyActivity.kt index 69d480788..745683960 100644 --- a/app/src/main/java/com/chwl/app/ui/user/activity/UserInfoModifyActivity.kt +++ b/app/src/main/java/com/chwl/app/ui/user/activity/UserInfoModifyActivity.kt @@ -11,6 +11,9 @@ import android.provider.Settings import android.text.TextUtils import android.view.View import android.widget.ImageView +import androidx.activity.result.ActivityResultLauncher +import androidx.activity.result.PickVisualMediaRequest +import androidx.activity.result.contract.ActivityResultContracts import androidx.core.content.ContextCompat import androidx.recyclerview.widget.LinearLayoutManager import com.fourmob.datetimepicker.date.DatePickerDialog @@ -42,13 +45,18 @@ import com.chwl.core.user.bean.UserDetailInfo import com.chwl.core.user.bean.UserInfo import com.chwl.core.user.bean.UserPhoto import com.chwl.core.utils.CoreLogger +import com.chwl.core.utils.DialogUtil +import com.chwl.core.utils.LogUtils import com.chwl.library.common.file.FileHelper import com.chwl.library.common.photo.PhotoProvider import com.chwl.library.common.util.PhotoCompressCallback import com.chwl.library.common.util.PhotoCompressUtil +import com.chwl.library.common.util.SPUtils +import com.chwl.library.constants.ConstantsLib import com.chwl.library.easypermisssion.EasyPermissions import com.chwl.library.utils.ResUtil import com.chwl.library.utils.TimeUtils +import com.netease.nim.uikit.common.ui.dialog.EasyAlertDialogHelper import io.reactivex.Completable import io.reactivex.SingleObserver import io.reactivex.disposables.Disposable @@ -95,10 +103,18 @@ class UserInfoModifyActivity : BaseViewBindingActivity?=null + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) UserModel.get().getUserInfo(userId).subscribe(userInfoUpdateObserver) PhotoCompressUtil.clearCompressCache() + + if (ActivityResultContracts.PickVisualMedia.isPhotoPickerAvailable(this)) { + pickMedia = registerForActivityResult(ActivityResultContracts.PickVisualMedia()) { uri -> + crop(uri, 1, mUri) + } + } } override fun click(position: Int, userPhoto: UserPhoto, isOwner: Boolean) { @@ -426,24 +442,30 @@ class UserInfoModifyActivity : BaseViewBindingActivity= 33) Manifest.permission.READ_MEDIA_IMAGES else Manifest.permission.READ_EXTERNAL_STORAGE - ) - ) { - EasyPermissions.requestPermissions( - this, - getString(R.string.permission_storage_rationale), - PERMISSION_CODE_STORAGE, - if (Build.VERSION.SDK_INT >= 33) Manifest.permission.READ_MEDIA_IMAGES else Manifest.permission.READ_EXTERNAL_STORAGE - ) - } else { - mUri = Uri.parse("file://${FileHelper.getRootCacheDir()?.path}/${getNowTime()}.jpg") - PhotoProvider.photoProvider( - this, - resultCode = REQUEST_CODE_OPEN_PHOTO_PROVIDER - ) + + if (Build.VERSION.SDK_INT >= 33){ + DialogUtil.getDialog(this,object : EasyAlertDialogHelper.OnDialogActionListener { + override fun doCancelAction() { + } + + override fun doOkAction() { + SPUtils.putBoolean(ConstantsLib.Key.Permissions_Img,true) + mUri = Uri.parse("file://${FileHelper.getRootCacheDir()?.path}/${getNowTime()}.jpg") + pickMedia?.launch(PickVisualMediaRequest(ActivityResultContracts.PickVisualMedia.ImageOnly)) + } + }) + + + }else{ + if (!EasyPermissions.hasPermissions(this,Manifest.permission.READ_EXTERNAL_STORAGE)) { + EasyPermissions.requestPermissions(this, getString(R.string.permission_storage_rationale), PERMISSION_CODE_STORAGE,Manifest.permission.READ_EXTERNAL_STORAGE + ) + } else { + mUri = Uri.parse("file://${FileHelper.getRootCacheDir()?.path}/${getNowTime()}.jpg") + PhotoProvider.photoProvider(this, resultCode = REQUEST_CODE_OPEN_PHOTO_PROVIDER) + } } + } private fun getNowTime(): String { @@ -556,14 +578,16 @@ class UserInfoModifyActivity : BaseViewBindingActivity 0) { - //不能上传图片的最小文件大小 - CoreLogger.debug(TAG, "sourceSize: $sourceSize") - if (sourceSize < MIN_HEAD_PHOTO_SIZE) { - toast(R.string.text_bitmap_too_small) - return - } - } + +// if (sourceSize > 0) { +// //不能上传图片的最小文件大小 +// CoreLogger.debug(TAG, "sourceSize: $sourceSize") +// if (sourceSize < MIN_HEAD_PHOTO_SIZE) { +// toast(R.string.text_bitmap_too_small) +// return +// } +// } + val options = UCrop.Options().apply { setCompressionQuality(100) setShowCropGrid(false) diff --git a/app/src/main/java/com/chwl/app/ui/user/activity/UserModifyPhotosActivity.kt b/app/src/main/java/com/chwl/app/ui/user/activity/UserModifyPhotosActivity.kt index e99f6a9b1..6578dc423 100644 --- a/app/src/main/java/com/chwl/app/ui/user/activity/UserModifyPhotosActivity.kt +++ b/app/src/main/java/com/chwl/app/ui/user/activity/UserModifyPhotosActivity.kt @@ -11,6 +11,9 @@ import android.os.Bundle import android.provider.Settings import android.view.View import android.widget.GridView +import androidx.activity.result.ActivityResultLauncher +import androidx.activity.result.PickVisualMediaRequest +import androidx.activity.result.contract.ActivityResultContracts import androidx.core.content.ContextCompat import com.hjq.toast.ToastUtils import com.jph.takephoto.app.TakePhotoActivity @@ -30,13 +33,17 @@ import com.chwl.core.user.UserModel import com.chwl.core.user.bean.UserInfo import com.chwl.core.user.bean.UserPhoto import com.chwl.core.utils.CoreLogger +import com.chwl.core.utils.DialogUtil import com.chwl.core.utils.net.BeanObserver import com.chwl.library.common.file.FileHelper import com.chwl.library.common.photo.PhotoProvider import com.chwl.library.common.util.PhotoCompressCallback import com.chwl.library.common.util.PhotoCompressUtil +import com.chwl.library.common.util.SPUtils +import com.chwl.library.constants.ConstantsLib import com.chwl.library.easypermisssion.EasyPermissions import com.chwl.library.utils.ResUtil +import com.netease.nim.uikit.common.ui.dialog.EasyAlertDialogHelper import kotlinx.coroutines.Job import java.io.FileNotFoundException import java.text.SimpleDateFormat @@ -57,6 +64,8 @@ class UserModifyPhotosActivity : TakePhotoActivity(), PhotoItemClickListener, private var mUri: Uri? = null private var mJob: Job? = null + var pickMedia : ActivityResultLauncher?=null + companion object { const val FLAG_CHANGE = "isChanged" private const val TAG = "UserModifyPhotosActivit" @@ -95,6 +104,14 @@ class UserModifyPhotosActivity : TakePhotoActivity(), PhotoItemClickListener, if (userInfo != null) { updateView() } + if (ActivityResultContracts.PickVisualMedia.isPhotoPickerAvailable(this)) { + pickMedia = registerForActivityResult(ActivityResultContracts.PickVisualMedia()) { uri -> + uri?.let { + crop(it, 0, mUri) + } + + } + } } private fun initView() { @@ -219,24 +236,38 @@ class UserModifyPhotosActivity : TakePhotoActivity(), PhotoItemClickListener, } private fun checkStoragePermission() { - if (!EasyPermissions.hasPermissions( - this, - if (Build.VERSION.SDK_INT >= 33) Manifest.permission.READ_MEDIA_IMAGES else Manifest.permission.READ_EXTERNAL_STORAGE - ) - ) { - EasyPermissions.requestPermissions( - this, - getString(R.string.permission_storage_rationale), - PERMISSION_CODE_STORAGE, - if (Build.VERSION.SDK_INT >= 33) Manifest.permission.READ_MEDIA_IMAGES else Manifest.permission.READ_EXTERNAL_STORAGE - ) - } else { - mUri = Uri.parse("file://${FileHelper.getRootCacheDir()?.path}/${getNowTime()}.jpg") - PhotoProvider.photoProvider( - this, - resultCode = REQUEST_CODE_OPEN_PHOTO_PROVIDER - ) + + if (Build.VERSION.SDK_INT >= 33){ + DialogUtil.getDialog(this,object : EasyAlertDialogHelper.OnDialogActionListener { + override fun doCancelAction() { + } + + override fun doOkAction() { + SPUtils.putBoolean(ConstantsLib.Key.Permissions_Img,true) + mUri = Uri.parse("file://${FileHelper.getRootCacheDir()?.path}/${getNowTime()}.jpg") + pickMedia?.launch(PickVisualMediaRequest(ActivityResultContracts.PickVisualMedia.ImageOnly)) + } + }) + }else{ + if (!EasyPermissions.hasPermissions( + this, Manifest.permission.READ_EXTERNAL_STORAGE + ) + ) { + EasyPermissions.requestPermissions( + this, + getString(R.string.permission_storage_rationale), + PERMISSION_CODE_STORAGE,Manifest.permission.READ_EXTERNAL_STORAGE + ) + } else { + mUri = Uri.parse("file://${FileHelper.getRootCacheDir()?.path}/${getNowTime()}.jpg") + PhotoProvider.photoProvider( + this, + resultCode = REQUEST_CODE_OPEN_PHOTO_PROVIDER + ) + } } + + } private fun getNowTime(): String { @@ -309,14 +340,14 @@ class UserModifyPhotosActivity : TakePhotoActivity(), PhotoItemClickListener, toast(R.string.text_bitmap_too_large) return } - if (sourceSize > 0) { - //不能上传图片的最小文件大小 - CoreLogger.debug(TAG, "sourceSize: $sourceSize") - if (sourceSize < MIN_HEAD_PHOTO_SIZE) { - toast(R.string.text_bitmap_too_small) - return - } - } +// if (sourceSize > 0) { +// //不能上传图片的最小文件大小 +// CoreLogger.debug(TAG, "sourceSize: $sourceSize") +// if (sourceSize < MIN_HEAD_PHOTO_SIZE) { +// toast(R.string.text_bitmap_too_small) +// return +// } +// } val options = UCrop.Options().apply { setCompressionQuality(100) setShowCropGrid(false) diff --git a/app/src/main/java/com/chwl/app/ui/widget/GiftDialog.java b/app/src/main/java/com/chwl/app/ui/widget/GiftDialog.java index 0bc0ddc8d..9e02866e7 100644 --- a/app/src/main/java/com/chwl/app/ui/widget/GiftDialog.java +++ b/app/src/main/java/com/chwl/app/ui/widget/GiftDialog.java @@ -2,6 +2,7 @@ package com.chwl.app.ui.widget; import static com.chwl.app.ui.widget.magicindicator.GiftIndicator.TYPE_COUNTRY; import static com.chwl.app.ui.widget.magicindicator.GiftIndicator.TYPE_CP; +import static com.chwl.app.ui.widget.magicindicator.GiftIndicator.TYPE_CUSTOM; import static com.chwl.app.ui.widget.magicindicator.GiftIndicator.TYPE_LUCKY; import static com.chwl.app.ui.widget.magicindicator.GiftIndicator.TYPE_NOBLE; import static com.chwl.app.ui.widget.magicindicator.GiftIndicator.TYPE_NORMAL; @@ -632,6 +633,8 @@ public class GiftDialog extends BottomSheetDialog implements View.OnClickListene return TYPE_SUPER_LUCKY_24; case GiftType.GIFT_TYPE_CP: return TYPE_CP; + case GiftType.GIFT_TYPE_CUSTOM: + return TYPE_CUSTOM; } return TYPE_NORMAL; } @@ -729,6 +732,8 @@ public class GiftDialog extends BottomSheetDialog implements View.OnClickListene currentGiftInfoList = getCountryGiftInfos(); }else if (position == TYPE_CP) { currentGiftInfoList = getCpGiftInfos(); + }else if (position == TYPE_CUSTOM) { + currentGiftInfoList = getCustomGiftInfos(); } // 有贵族礼物才显示贵族礼物的tab if (ListUtils.isListEmpty(nobleGiftInfos)) { @@ -1240,6 +1245,12 @@ public class GiftDialog extends BottomSheetDialog implements View.OnClickListene GiftType.GIFT_TYPE_CP); } + private List getCustomGiftInfos() { + return GiftModel.get().getGiftInfosByType( + String.valueOf(AvRoomDataManager.get().getRoomUid()), + GiftType.GIFT_TYPE_CUSTOM); + } + private List getNobleGiftInfos() { return GiftModel.get().getGiftInfoList(GiftType.GIFT_TYPE_VIP); } diff --git a/app/src/main/java/com/chwl/app/ui/widget/magicindicator/GiftIndicator.java b/app/src/main/java/com/chwl/app/ui/widget/magicindicator/GiftIndicator.java index 3a249db70..1d23ec9e7 100644 --- a/app/src/main/java/com/chwl/app/ui/widget/magicindicator/GiftIndicator.java +++ b/app/src/main/java/com/chwl/app/ui/widget/magicindicator/GiftIndicator.java @@ -84,6 +84,10 @@ public class GiftIndicator extends LinearLayout { * cp礼物 */ public static final int TYPE_CP = 10; + /** + * 定制礼物 + */ + public static final int TYPE_CUSTOM = 11; private List tabList = new ArrayList<>(); diff --git a/app/src/main/res/xml/network_security_config.xml b/app/src/main/res/xml/network_security_config.xml index a1c7218fe..613ff624e 100644 --- a/app/src/main/res/xml/network_security_config.xml +++ b/app/src/main/res/xml/network_security_config.xml @@ -1,7 +1,7 @@ - + @@ -10,6 +10,7 @@ fengkongcloud.com + beta.api.molistar.xyz \ No newline at end of file diff --git a/app/src/module_community/java/com/chwl/app/community/publish/view/PublishActivity.java b/app/src/module_community/java/com/chwl/app/community/publish/view/PublishActivity.java index d1d2c2b53..b5cca72ee 100644 --- a/app/src/module_community/java/com/chwl/app/community/publish/view/PublishActivity.java +++ b/app/src/module_community/java/com/chwl/app/community/publish/view/PublishActivity.java @@ -1,9 +1,12 @@ package com.chwl.app.community.publish.view; +import static androidx.core.content.ContentProviderCompat.requireContext; + import android.Manifest; import android.content.Context; import android.content.Intent; +import android.net.Uri; import android.os.Build; import android.os.Bundle; import android.text.Editable; @@ -18,17 +21,27 @@ import android.widget.LinearLayout; import android.widget.RelativeLayout; import android.widget.TextView; +import androidx.activity.result.ActivityResultCallback; +import androidx.activity.result.ActivityResultLauncher; +import androidx.activity.result.PickVisualMediaRequest; +import androidx.activity.result.contract.ActivityResultContracts; import androidx.annotation.NonNull; +import androidx.core.app.ActivityOptionsCompat; import androidx.recyclerview.widget.GridLayoutManager; import androidx.recyclerview.widget.RecyclerView; import com.chwl.app.photo.BigPhotoActivity; import com.chwl.app.photo.PagerOption; import com.chwl.core.utils.CoreTextUtils; +import com.chwl.core.utils.DialogUtil; +import com.chwl.core.utils.MyUriUtils; +import com.chwl.library.common.util.SPUtils; +import com.chwl.library.constants.ConstantsLib; import com.example.matisse.Matisse; import com.google.android.flexbox.FlexboxLayout; import com.hjq.toast.ToastUtils; import com.netease.nim.uikit.StatusBarUtil; +import com.netease.nim.uikit.common.ui.dialog.EasyAlertDialogHelper; import com.netease.nim.uikit.common.util.log.LogUtil; import com.trello.rxlifecycle3.android.ActivityEvent; import com.chwl.app.R; @@ -60,6 +73,7 @@ import com.chwl.library.utils.ResUtil; import com.chwl.library.utils.SingleToastUtil; import com.example.matisse.internal.entity.CustomItem; +import java.io.File; import java.util.ArrayList; import java.util.List; import java.util.concurrent.TimeUnit; @@ -111,6 +125,9 @@ public class PublishActivity extends BaseMvpActivity pickMedia; + public static void start(DialogManager manager, long worldId) { if (beforeStart(manager)) { return; @@ -177,6 +194,66 @@ public class PublishActivity extends BaseMvpActivity() { + @Override + public void onActivityResult(Uri uri) { + if (uri != null && uri.getPath() != null){ + + File file = MyUriUtils.INSTANCE.copyFile(PublishActivity.this, uri); + if (file != null) { + LogUtil.e("选择 file = "+file.getName()); + LogUtil.e("选择 file = "+file.getPath()); + + if (mJob != null) { + mJob.cancel(null); + } + ArrayList pathList = new ArrayList<>(); + pathList.add(file.getPath()); + + mJob = PhotoCompressUtil.compress(PublishActivity.this, pathList, + PhotoCompressUtil.getCompressCachePath("publish") + , new PhotosCompressCallback() { + @Override + public void onSuccess(@NonNull ArrayList compressedImgList) { + List pathResult = new ArrayList<>(); + for (int i = 0; i < compressedImgList.size(); i++) { + if (i < pathList.size()) { + List fileInfo = MyUriUtils.INSTANCE.getFileInfo(file); + if (fileInfo != null) { + pathResult.add(new CustomItem(compressedImgList.get(i), CustomItem.IMAGE_NORMAL, fileInfo.get(2), Integer.parseInt(fileInfo.get(0)), Integer.parseInt(fileInfo.get(1)))); + } + } + } + if (pathResult.size() == 0) { + return; + } + LogUtil.print(pathResult); + + uploadList.addAll(pathResult); + updateImagesData(); + + isOriginalImage = false; + LogUtil.print("isOriginalImage:" + isOriginalImage); + SharedPreferenceUtils.put(KEY_SP_ORIGINAL_IMAGE, isOriginalImage); + } + + @Override + public void onFail(@NonNull Throwable e) { + toast(getString(R.string.picker_image_error)); + } + }, 200, false, Constants.UPLOAD_IMAGE_MAX_SIZE, Constants.UPLOAD_IMAGE_MAX_FILE_LENGTH); + + } + + + + } + } + }); + } + } private void findView() { @@ -622,26 +699,36 @@ public class PublishActivity extends BaseMvpActivity= 33 ? Manifest.permission.READ_MEDIA_IMAGES : Manifest.permission.READ_EXTERNAL_STORAGE - ) - ) { - EasyPermissions.requestPermissions( - this, - getString(R.string.permission_storage_rationale), - PERMISSION_CODE_STORAGE, - Build.VERSION.SDK_INT >= 33 ? Manifest.permission.READ_MEDIA_IMAGES : Manifest.permission.READ_EXTERNAL_STORAGE - ); - } else { - PhotoProvider.photoProvider( - this, - maxSelect - uploadList.size(), - true, - REQUEST_CODE_OPEN_PHOTO_PROVIDER, - true, - true - ); + + if (Build.VERSION.SDK_INT >= 33){ + if (pickMedia != null){ + DialogUtil.INSTANCE.getDialog(this,new EasyAlertDialogHelper.OnDialogActionListener() { + @Override + public void doCancelAction() {} + @Override + public void doOkAction() { + SPUtils.putBoolean(ConstantsLib.Key.Permissions_Img,true); + pickMedia.launch(new PickVisualMediaRequest.Builder().setMediaType(ActivityResultContracts.PickVisualMedia.ImageOnly.INSTANCE).build()); + } + }); + } + }else{ + if (!EasyPermissions.hasPermissions(this, Manifest.permission.READ_EXTERNAL_STORAGE)) { + EasyPermissions.requestPermissions( + this, + getString(R.string.permission_storage_rationale), + PERMISSION_CODE_STORAGE, Manifest.permission.READ_EXTERNAL_STORAGE + ); + } else { + PhotoProvider.photoProvider( + this, + maxSelect - uploadList.size(), + true, + REQUEST_CODE_OPEN_PHOTO_PROVIDER, + true, + true + ); + } } } diff --git a/app/src/module_treasure_box/java/com/chwl/app/treasure_box/widget/dialog/TreasureBoxDialog.kt b/app/src/module_treasure_box/java/com/chwl/app/treasure_box/widget/dialog/TreasureBoxDialog.kt index 32e46830e..4a959e170 100644 --- a/app/src/module_treasure_box/java/com/chwl/app/treasure_box/widget/dialog/TreasureBoxDialog.kt +++ b/app/src/module_treasure_box/java/com/chwl/app/treasure_box/widget/dialog/TreasureBoxDialog.kt @@ -3,11 +3,6 @@ package com.chwl.app.treasure_box.widget.dialog import com.chwl.app.base.BaseDialogFragment import com.chwl.app.databinding.DialogTreasureBoxBinding import com.chwl.app.ui.pay.ChargeActivity -import com.chwl.app.ui.webview.CommonWebViewActivity -import com.chwl.core.Constants -import com.chwl.core.UriProvider -import com.chwl.library.common.util.DeviceUtil.getDeviceId -import com.chwl.library.utils.AppMetaDataUtil /** * author: wushaocheng diff --git a/core/build.gradle b/core/build.gradle index 5e901ed91..5820b3be7 100644 --- a/core/build.gradle +++ b/core/build.gradle @@ -47,7 +47,7 @@ android { 'src/model_treasure_box/java', 'src/model_sud_wrapper/java' ] - jniLibs.srcDirs = ['libs', 'umeng-app-libs/jniLibs'] +// jniLibs.srcDirs = ['libs', 'umeng-app-libs/jniLibs'] } } diff --git a/core/src/main/java/com/chwl/core/gift/GiftModel.java b/core/src/main/java/com/chwl/core/gift/GiftModel.java index 0e9e0b461..ace1a6758 100644 --- a/core/src/main/java/com/chwl/core/gift/GiftModel.java +++ b/core/src/main/java/com/chwl/core/gift/GiftModel.java @@ -260,6 +260,9 @@ public class GiftModel extends BaseModel implements IGiftModel { case GiftType.GIFT_TYPE_CP: giftInfos = allGiftListInfo.getCpGift(); break; + case GiftType.GIFT_TYPE_CUSTOM: + giftInfos = allGiftListInfo.getCustomGift(); + break; } return giftInfos == null ? new ArrayList<>() : giftInfos; } diff --git a/core/src/main/java/com/chwl/core/gift/bean/GiftListInfo.java b/core/src/main/java/com/chwl/core/gift/bean/GiftListInfo.java index 576276e66..0693cb500 100644 --- a/core/src/main/java/com/chwl/core/gift/bean/GiftListInfo.java +++ b/core/src/main/java/com/chwl/core/gift/bean/GiftListInfo.java @@ -22,5 +22,6 @@ public class GiftListInfo implements Serializable { private List drawGift; private List singlePopularGift; private List cpGift; + private List customGift; private String giftVersion; } diff --git a/core/src/main/java/com/chwl/core/gift/bean/GiftType.java b/core/src/main/java/com/chwl/core/gift/bean/GiftType.java index 648813f78..1dc4b5b38 100644 --- a/core/src/main/java/com/chwl/core/gift/bean/GiftType.java +++ b/core/src/main/java/com/chwl/core/gift/bean/GiftType.java @@ -56,4 +56,9 @@ public class GiftType { * cp礼物 - 支持连击 */ public static final int GIFT_TYPE_CP = 19; + + /** + * 定制礼物 - 支持连击 + */ + public static final int GIFT_TYPE_CUSTOM = 20; } diff --git a/core/src/main/java/com/chwl/core/gift/bean/TagsInfo.java b/core/src/main/java/com/chwl/core/gift/bean/TagsInfo.java index c00cae01d..0000bd672 100644 --- a/core/src/main/java/com/chwl/core/gift/bean/TagsInfo.java +++ b/core/src/main/java/com/chwl/core/gift/bean/TagsInfo.java @@ -35,6 +35,8 @@ public class TagsInfo implements Serializable { return GiftType.GIFT_TYPE_SINGLE_ROOM; } else if ("cpGift".equals(key)) { return GiftType.GIFT_TYPE_CP; + }else if ("customGift".equals(key)) { + return GiftType.GIFT_TYPE_CUSTOM; } return 0; } diff --git a/core/src/main/java/com/chwl/core/utils/DialogUtil.kt b/core/src/main/java/com/chwl/core/utils/DialogUtil.kt new file mode 100644 index 000000000..6db8f93ca --- /dev/null +++ b/core/src/main/java/com/chwl/core/utils/DialogUtil.kt @@ -0,0 +1,32 @@ +package com.chwl.core.utils + +import android.app.Activity +import com.chwl.core.R +import com.chwl.library.common.util.SPUtils +import com.chwl.library.constants.ConstantsLib +import com.chwl.library.utils.ResUtil +import com.example.lib_utils.AppUtils +import com.netease.nim.uikit.common.ui.dialog.EasyAlertDialogHelper + +object DialogUtil { + + fun getDialog(activity: Activity, listener:EasyAlertDialogHelper.OnDialogActionListener){ + if (!SPUtils.getBoolean(ConstantsLib.Key.Permissions_Img, false)) { + val dialog = EasyAlertDialogHelper.createOkCancelDiolag( + activity, + null, + ResUtil.getString( + R.string.dialot_permission_tips, + ResUtil.getString(R.string.app_name) + ), + ResUtil.getString(R.string.Allow), + ResUtil.getString(R.string.No), + true, + listener + ) + dialog.show() + } else { + listener.doOkAction() + } + } +} \ No newline at end of file diff --git a/core/src/main/java/com/chwl/core/utils/MyUriUtils.kt b/core/src/main/java/com/chwl/core/utils/MyUriUtils.kt new file mode 100644 index 000000000..67a0e5dd0 --- /dev/null +++ b/core/src/main/java/com/chwl/core/utils/MyUriUtils.kt @@ -0,0 +1,74 @@ +package com.chwl.core.utils + +import android.content.Context +import android.database.Cursor +import android.graphics.BitmapFactory +import android.net.Uri +import android.provider.MediaStore +import androidx.activity.result.ActivityResultCallback +import java.io.File +import java.io.FileOutputStream + +object MyUriUtils { + + fun getName(context: Context, uri: Uri) : String?{ + var fileName:String?=null + val projection = arrayOf(MediaStore.MediaColumns.DISPLAY_NAME) + val cursor : Cursor ? = context.contentResolver.query( + uri, + projection, + null, + null, + null + ) + try { + cursor?.use { + if (it.moveToFirst()) { + fileName = it.getString(it.getColumnIndexOrThrow(MediaStore.MediaColumns.DISPLAY_NAME)) + } + } + } catch (e: Exception) { + } + return fileName + } + + fun copyFile(context: Context, uri: Uri) : File?{ + val fileName = getName(context, uri)?:"defName.jpg" + + val outPutDir = context.getExternalFilesDir(null)?:return null + + val outPutFile = File(outPutDir,fileName) + + if (!outPutDir.exists()) { + outPutDir.mkdirs() + } + + context.contentResolver.openInputStream(uri)?.use { inS-> + FileOutputStream(outPutFile).use{ outS-> + inS.copyTo(outS) + } + return outPutFile + } ?: return null + + } + + fun getFileInfo(file: File) : MutableList?{ + var width = 0 + var height = 0 + var minType = "image/jpeg" + var data : MutableList ?= null + + BitmapFactory.Options().apply { + inJustDecodeBounds = true + BitmapFactory.decodeFile(file.absolutePath,this) + width = outWidth + height = outHeight + minType = outMimeType + }.let { + data =mutableListOf(width.toString(),height.toString(),minType) + } + return data + } + + +} \ No newline at end of file diff --git a/core/src/main/res/values-ar/strings.xml b/core/src/main/res/values-ar/strings.xml index c75c88dbf..9830ddd55 100644 --- a/core/src/main/res/values-ar/strings.xml +++ b/core/src/main/res/values-ar/strings.xml @@ -684,4 +684,8 @@ رفض الطرف الآخر طلب الـ PK (%s)فشلت العملية + " السماح لـ %s بالوصول إلى الصور على جهازك؟ ا" + السماح + لا + مخصص diff --git a/core/src/main/res/values-zh-rTW/strings.xml b/core/src/main/res/values-zh-rTW/strings.xml index e13da3260..9995c5eb2 100644 --- a/core/src/main/res/values-zh-rTW/strings.xml +++ b/core/src/main/res/values-zh-rTW/strings.xml @@ -672,4 +672,8 @@ 對方拒絕你的PK請求 操作失敗 (%s) + 允許 %s 存取裝置上的相片? + 允許 + 不允許 + 定制 diff --git a/core/src/main/res/values/strings.xml b/core/src/main/res/values/strings.xml index bd6215bbf..d7d6125b3 100644 --- a/core/src/main/res/values/strings.xml +++ b/core/src/main/res/values/strings.xml @@ -666,5 +666,12 @@ The opponent rejected your PK request operation failed (%s) + + Allow %s to access photos on your device? + Allow + No + + Custom + diff --git a/library/build.gradle b/library/build.gradle index 70be71d36..eb3e7410f 100644 --- a/library/build.gradle +++ b/library/build.gradle @@ -105,7 +105,7 @@ dependencies { api 'io.github.razerdp:BasePopup:3.2.1' - api 'com.umeng.sdk:utdid:1.1.5.3' +// api 'com.umeng.sdk:utdid:1.1.5.3' // api 'com.facebook.android:facebook-android-sdk:16.2.0' // api 'com.facebook.android:facebook-login:16.2.0' diff --git a/library/src/main/AndroidManifest.xml b/library/src/main/AndroidManifest.xml index 561130d6e..6cd757ab4 100644 --- a/library/src/main/AndroidManifest.xml +++ b/library/src/main/AndroidManifest.xml @@ -3,9 +3,9 @@ xmlns:android="http://schemas.android.com/apk/res/android"> - + - + MMKV.delegate( + key: String? = null, + defaultValue: T, + crossinline getter: MMKV.(String?, T) -> T?, + crossinline setter: MMKV.(String, T) -> Boolean +): ReadWriteProperty = + object : ReadWriteProperty { + override fun getValue(thisRef: Any, property: KProperty<*>): T = + getter(key ?: property.name, defaultValue) ?: defaultValue + + override fun setValue(thisRef: Any, property: KProperty<*>, value: T) { + setter(key ?: property.name, value) + } + } + +fun MMKV.boolean( + key: String? = null, + defaultValue: Boolean = false +): ReadWriteProperty = + delegate(key, defaultValue, MMKV::decodeBool, MMKV::encode) + +fun MMKV.int(key: String? = null, defaultValue: Int = 0): ReadWriteProperty = + delegate(key, defaultValue, MMKV::decodeInt, MMKV::encode) + +fun MMKV.long(key: String? = null, defaultValue: Long = 0L): ReadWriteProperty = + delegate(key, defaultValue, MMKV::decodeLong, MMKV::encode) + +fun MMKV.float(key: String? = null, defaultValue: Float = 0.0F): ReadWriteProperty = + delegate(key, defaultValue, MMKV::decodeFloat, MMKV::encode) + +fun MMKV.double(key: String? = null, defaultValue: Double = 0.0): ReadWriteProperty = + delegate(key, defaultValue, MMKV::decodeDouble, MMKV::encode) + +fun MMKV.notNullString(key: String? = null): ReadWriteProperty = + string(key, "") + +fun MMKV.string(key: String? = null, defaultValue: String): ReadWriteProperty = + delegate(key, defaultValue, MMKV::decodeString, MMKV::encode) + +fun MMKV.byteArray( + key: String? = null, + defaultValue: ByteArray +): ReadWriteProperty = + delegate(key, defaultValue, MMKV::decodeBytes, MMKV::encode) + +fun MMKV.stringSet( + key: String? = null, + defaultValue: Set +): ReadWriteProperty> = + delegate(key, defaultValue, MMKV::decodeStringSet, MMKV::encode) + +private inline fun MMKV.nullableDelegate( + key: String? = null, + crossinline getter: MMKV.(String?, T?) -> T?, + crossinline setter: MMKV.(String, T?) -> Boolean +): ReadWriteProperty = + object : ReadWriteProperty { + override fun getValue(thisRef: Any, property: KProperty<*>): T? = + getter(key ?: property.name, null) + + override fun setValue(thisRef: Any, property: KProperty<*>, value: T?) { + setter(key ?: property.name, value) + } + } + +fun MMKV.byteArray( + key: String? = null, +): ReadWriteProperty = + nullableDelegate(key, MMKV::decodeBytes, MMKV::encode) + +fun MMKV.string( + key: String? = null, +): ReadWriteProperty = + nullableDelegate(key, MMKV::decodeString, MMKV::encode) + +fun MMKV.stringSet( + key: String? = null, +): ReadWriteProperty?> = + nullableDelegate(key, MMKV::decodeStringSet, MMKV::encode) + +inline fun MMKV.parcelable( + key: String? = null, + defaultValue: T +): ReadWriteProperty = + object : ReadWriteProperty { + override fun getValue(thisRef: Any, property: KProperty<*>): T = + decodeParcelable(key ?: property.name, T::class.java, defaultValue)?:defaultValue + + override fun setValue(thisRef: Any, property: KProperty<*>, value: T) { + encode(key ?: property.name, value) + } + } + +inline fun MMKV.parcelable( + key: String? = null, +): ReadWriteProperty = + object : ReadWriteProperty { + override fun getValue(thisRef: Any, property: KProperty<*>): T? = + decodeParcelable(key ?: property.name, T::class.java) + + override fun setValue(thisRef: Any, property: KProperty<*>, value: T?) { + encode(key ?: property.name, value) + } + } \ No newline at end of file diff --git a/library/src/module_easyphoto/java/com/chwl/library/easyphoto/models/album/AlbumModel.java b/library/src/module_easyphoto/java/com/chwl/library/easyphoto/models/album/AlbumModel.java index 55b5350a9..cf7a1c29f 100644 --- a/library/src/module_easyphoto/java/com/chwl/library/easyphoto/models/album/AlbumModel.java +++ b/library/src/module_easyphoto/java/com/chwl/library/easyphoto/models/album/AlbumModel.java @@ -60,8 +60,7 @@ public class AlbumModel { public void query(Context context, final CallBack callBack) { final Context appCxt = context.getApplicationContext(); - if (PermissionChecker.checkSelfPermission(context, - Build.VERSION.SDK_INT >= 33 ? Manifest.permission.READ_MEDIA_IMAGES : Manifest.permission.READ_EXTERNAL_STORAGE) != PermissionChecker.PERMISSION_GRANTED) { + if (PermissionChecker.checkSelfPermission(context,Manifest.permission.READ_EXTERNAL_STORAGE) != PermissionChecker.PERMISSION_GRANTED) { if (null != callBack) callBack.onAlbumWorkedCallBack(); return; } diff --git a/library/src/module_easyphoto/java/com/chwl/library/easyphoto/models/album/entity/Photo.java b/library/src/module_easyphoto/java/com/chwl/library/easyphoto/models/album/entity/Photo.java index 3b17cd240..d218ad7a9 100644 --- a/library/src/module_easyphoto/java/com/chwl/library/easyphoto/models/album/entity/Photo.java +++ b/library/src/module_easyphoto/java/com/chwl/library/easyphoto/models/album/entity/Photo.java @@ -40,6 +40,10 @@ public class Photo implements Parcelable { this.selectedOriginal = false; } + public Photo(String path) { + this.path = path; + } + @Override public boolean equals(Object o) { try { diff --git a/library/src/module_easyphoto/java/com/chwl/library/easyphoto/ui/EasyPhotosActivity.java b/library/src/module_easyphoto/java/com/chwl/library/easyphoto/ui/EasyPhotosActivity.java index 7a289c312..979c7040c 100644 --- a/library/src/module_easyphoto/java/com/chwl/library/easyphoto/ui/EasyPhotosActivity.java +++ b/library/src/module_easyphoto/java/com/chwl/library/easyphoto/ui/EasyPhotosActivity.java @@ -209,10 +209,9 @@ public class EasyPhotosActivity extends AppCompatActivity implements AlbumItemsA protected String[] getNeedPermissions() { if (Setting.isShowCamera) { - return new String[]{Manifest.permission.CAMERA, - Build.VERSION.SDK_INT >= 33 ? Manifest.permission.READ_MEDIA_IMAGES : Manifest.permission.READ_EXTERNAL_STORAGE}; + return new String[]{Manifest.permission.CAMERA,Manifest.permission.READ_EXTERNAL_STORAGE}; } else { - return new String[]{Build.VERSION.SDK_INT >= 33 ? Manifest.permission.READ_MEDIA_IMAGES : Manifest.permission.READ_EXTERNAL_STORAGE}; + return new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}; } } diff --git a/library/src/module_easyphoto/java/com/chwl/library/easyphoto/ui/PuzzleActivity.java b/library/src/module_easyphoto/java/com/chwl/library/easyphoto/ui/PuzzleActivity.java index 479f3879e..78873b419 100644 --- a/library/src/module_easyphoto/java/com/chwl/library/easyphoto/ui/PuzzleActivity.java +++ b/library/src/module_easyphoto/java/com/chwl/library/easyphoto/ui/PuzzleActivity.java @@ -581,8 +581,7 @@ public class PuzzleActivity extends AppCompatActivity implements View.OnClickLis } protected String[] getNeedPermissions() { - return new String[]{Manifest.permission.CAMERA, - Build.VERSION.SDK_INT >= 33 ? Manifest.permission.READ_MEDIA_IMAGES : Manifest.permission.READ_EXTERNAL_STORAGE}; + return new String[]{Manifest.permission.CAMERA, Manifest.permission.READ_EXTERNAL_STORAGE}; } @Override diff --git a/library/src/module_easyphoto/res/layout/activity_puzzle_easy_photos.xml b/library/src/module_easyphoto/res/layout/activity_puzzle_easy_photos.xml index 372a9f0b5..916e4ef23 100644 --- a/library/src/module_easyphoto/res/layout/activity_puzzle_easy_photos.xml +++ b/library/src/module_easyphoto/res/layout/activity_puzzle_easy_photos.xml @@ -2,6 +2,7 @@ xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent" + xmlns:tools="http://schemas.android.com/tools" android:background="@color/easy_photos_bg_primary" android:fitsSystemWindows="true"> @@ -39,7 +40,8 @@ android:paddingTop="8dp" android:layout_below="@+id/degree_seek_bar" android:orientation="horizontal" - android:visibility="gone"> + android:visibility="gone" + tools:visibility="visible"> + + + + + + \ No newline at end of file diff --git a/nim_uikit/res/values-ar/strings.xml b/nim_uikit/res/values-ar/strings.xml index 580101d77..bd6a6201a 100644 --- a/nim_uikit/res/values-ar/strings.xml +++ b/nim_uikit/res/values-ar/strings.xml @@ -444,4 +444,9 @@ [رسالة مخصصة] الملف فارغ أو لا يوجد! + + " السماح لـ %s بالوصول إلى الصور على جهازك؟ ا" + السماح + لا + diff --git a/nim_uikit/res/values-zh-rTW/strings.xml b/nim_uikit/res/values-zh-rTW/strings.xml index 0395320c5..6a8656fd7 100644 --- a/nim_uikit/res/values-zh-rTW/strings.xml +++ b/nim_uikit/res/values-zh-rTW/strings.xml @@ -431,4 +431,10 @@ [自定義消息] 為空或者該文件不存在! + + 允許 %s 存取裝置上的相片? + 允許 + 不允許 + + diff --git a/nim_uikit/res/values/strings.xml b/nim_uikit/res/values/strings.xml index 1bd79c214..5e027d3f4 100644 --- a/nim_uikit/res/values/strings.xml +++ b/nim_uikit/res/values/strings.xml @@ -432,4 +432,10 @@ [Custom Message] is empty or the file does not exist! +Allow %s to access photos on your device? +Allow +No + + + \ No newline at end of file diff --git a/nim_uikit/res/values/styles-activity.xml b/nim_uikit/res/values/styles-activity.xml index 396c3e356..7039f8e66 100644 --- a/nim_uikit/res/values/styles-activity.xml +++ b/nim_uikit/res/values/styles-activity.xml @@ -49,4 +49,24 @@ false true + + \ No newline at end of file diff --git a/nim_uikit/src/com/netease/nim/uikit/business/session/actions/PickImageActionNew.kt b/nim_uikit/src/com/netease/nim/uikit/business/session/actions/PickImageActionNew.kt index 0939653bf..07aecf3e4 100644 --- a/nim_uikit/src/com/netease/nim/uikit/business/session/actions/PickImageActionNew.kt +++ b/nim_uikit/src/com/netease/nim/uikit/business/session/actions/PickImageActionNew.kt @@ -1,9 +1,9 @@ package com.netease.nim.uikit.business.session.actions import android.content.Intent +import android.os.Build import android.text.TextUtils -import com.netease.nim.uikit.R -import com.netease.nim.uikit.business.session.helper.SendImageHelper +import androidx.activity.result.contract.ActivityResultContracts import com.chwl.library.common.application.BaseApp import com.chwl.library.common.base.BaseDialogFragment import com.chwl.library.common.photo.PhotoProvider @@ -11,8 +11,12 @@ import com.chwl.library.common.util.PhotoCompressUtil import com.chwl.library.common.util.PhotosCompressCallback import com.chwl.library.utils.ResUtil import com.chwl.library.utils.SingleToastUtil +import com.netease.nim.uikit.R +import com.netease.nim.uikit.business.session.helper.SendImageHelper +import com.netease.nim.uikit.common.activity.NimPhotoPickActivity import java.io.File + /** * Created by zhoujianghua on 2015/7/31. */ @@ -33,11 +37,15 @@ abstract class PickImageActionNew protected constructor( } private fun checkStoragePermission() { - PhotoProvider.photoProvider( - activity, - maxSelect = 9, - resultCode = makeRequestCode(REQUEST_CODE_OPEN_PHOTO_PROVIDER) - ) + if (Build.VERSION.SDK_INT >= 33) { + activity.startActivityForResult(Intent(activity,NimPhotoPickActivity::class.java),makeRequestCode(REQUEST_CODE_OPEN_PHOTO_PROVIDER)) + } else { + PhotoProvider.photoProvider( + activity, + maxSelect = 9, + resultCode = makeRequestCode(REQUEST_CODE_OPEN_PHOTO_PROVIDER) + ) + } } override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { @@ -79,6 +87,8 @@ abstract class PickImageActionNew protected constructor( } } + + /** * 发送图片 */ diff --git a/nim_uikit/src/com/netease/nim/uikit/common/activity/NimPhotoPickActivity.kt b/nim_uikit/src/com/netease/nim/uikit/common/activity/NimPhotoPickActivity.kt new file mode 100644 index 000000000..9aa019f15 --- /dev/null +++ b/nim_uikit/src/com/netease/nim/uikit/common/activity/NimPhotoPickActivity.kt @@ -0,0 +1,144 @@ +package com.netease.nim.uikit.common.activity + +import android.content.Context +import android.content.Intent +import android.database.Cursor +import android.net.Uri +import android.os.Bundle +import android.provider.MediaStore +import android.view.Window +import android.view.WindowManager +import androidx.activity.result.ActivityResultLauncher +import androidx.activity.result.PickVisualMediaRequest +import androidx.activity.result.contract.ActivityResultContracts +import androidx.appcompat.app.AppCompatActivity +import com.chwl.library.common.util.SPUtils +import com.chwl.library.constants.ConstantsLib +import com.chwl.library.easyphoto.EasyPhotos +import com.chwl.library.easyphoto.models.album.entity.Photo +import com.chwl.library.easyphoto.setting.Setting +import com.chwl.library.utils.ResUtil +import com.example.lib_utils.AppUtils +import com.netease.nim.uikit.R +import com.netease.nim.uikit.common.ui.dialog.EasyAlertDialog +import com.netease.nim.uikit.common.ui.dialog.EasyAlertDialogHelper +import java.io.File +import java.io.FileOutputStream + +class NimPhotoPickActivity : AppCompatActivity() { + + + var pickMedia : ActivityResultLauncher?=null + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setContentView(R.layout.nim_photo_pick_activity) + +// requestWindowFeature(Window.FEATURE_NO_TITLE) +// window.setFlags( +// WindowManager.LayoutParams.FLAG_FULLSCREEN, +// WindowManager.LayoutParams.FLAG_FULLSCREEN +// ) + + if (ActivityResultContracts.PickVisualMedia.isPhotoPickerAvailable(this)) { + pickMedia = registerForActivityResult(ActivityResultContracts.PickVisualMedia()) { uri -> + if (uri != null) { + val file = copyFile(this@NimPhotoPickActivity, uri) + if (file != null) { + val resultList = ArrayList() + val data = Intent() + resultList.add(Photo(file.path)) + data.putParcelableArrayListExtra(EasyPhotos.RESULT_PHOTOS, resultList) + setResult(RESULT_OK, data) + finish() + } + } else { + finish() + } + } + } + } + + var isFirst = true + var dialog : EasyAlertDialog ?=null + override fun onResume() { + super.onResume() + + if (!isFirst) { + finish() + return + } + + if (!SPUtils.getBoolean(ConstantsLib.Key.Permissions_Img,false)){ + dialog = EasyAlertDialogHelper.createOkCancelDiolag( + this, + null, + ResUtil.getString( + R.string.dialot_permission_tips_nim, + ResUtil.getString(R.string.app_name) + ), + ResUtil.getString(R.string.Allow_nim), + ResUtil.getString(R.string.No_nim), + false, + object : EasyAlertDialogHelper.OnDialogActionListener { + override fun doCancelAction() { + finish() + } + + override fun doOkAction() { + SPUtils.putBoolean(ConstantsLib.Key.Permissions_Img,true) + pickMedia?.launch(PickVisualMediaRequest(ActivityResultContracts.PickVisualMedia.ImageOnly)) + } + }) + if (dialog?.isShowing == false) { + dialog?.show() + } + }else{ + pickMedia?.launch(PickVisualMediaRequest(ActivityResultContracts.PickVisualMedia.ImageOnly)) + } + isFirst = false + + } + + private fun getName(context: Context, uri: Uri) : String?{ + var fileName:String?=null + val projection = arrayOf(MediaStore.MediaColumns.DISPLAY_NAME) + val cursor : Cursor? = context.contentResolver.query( + uri, + projection, + null, + null, + null + ) + try { + cursor?.use { + if (it.moveToFirst()) { + fileName = it.getString(it.getColumnIndexOrThrow(MediaStore.MediaColumns.DISPLAY_NAME)) + } + } + } catch (e: Exception) { + } + return fileName + } + + private fun copyFile(context: Context, uri: Uri) : File?{ + val fileName = getName(context, uri)?:"defName.jpg" + + val outPutDir = context.getExternalFilesDir(null)?:return null + + val outPutFile = File(outPutDir,fileName) + + if (!outPutDir.exists()) { + outPutDir.mkdirs() + } + + context.contentResolver.openInputStream(uri)?.use { inS-> + FileOutputStream(outPutFile).use{ outS-> + inS.copyTo(outS) + } + return outPutFile + } ?: return null + + } + +} \ No newline at end of file