diff --git a/app/src/main/java/com/chwl/app/ErbanTakePhotoActivity.java b/app/src/main/java/com/chwl/app/ErbanTakePhotoActivity.java index 8c6e6ae1d..f6be2fa63 100644 --- a/app/src/main/java/com/chwl/app/ErbanTakePhotoActivity.java +++ b/app/src/main/java/com/chwl/app/ErbanTakePhotoActivity.java @@ -137,10 +137,6 @@ public class ErbanTakePhotoActivity extends TakePhotoActivity { getTakePhoto().onPickMultipleWithCrop(limit, options); } - private void checkPermissionAndStartCamera() { - //低版本授权检查 - checkPermission(checkPermissionListener, R.string.ask_camera, android.Manifest.permission.CAMERA); - } PermissionActivity.CheckPermListener checkPermissionListener = new PermissionActivity.CheckPermListener() { @Override diff --git a/app/src/main/java/com/chwl/app/avroom/activity/RoomSettingActivity.java b/app/src/main/java/com/chwl/app/avroom/activity/RoomSettingActivity.java index 6cbdc2486..131c2c05b 100644 --- a/app/src/main/java/com/chwl/app/avroom/activity/RoomSettingActivity.java +++ b/app/src/main/java/com/chwl/app/avroom/activity/RoomSettingActivity.java @@ -1,16 +1,12 @@ package com.chwl.app.avroom.activity; -import android.Manifest; import android.annotation.SuppressLint; -import android.app.TimePickerDialog; import android.content.Context; import android.content.Intent; import android.graphics.Bitmap; import android.net.Uri; -import android.os.Build; import android.os.Bundle; -import android.provider.Settings; import android.text.SpannableString; import android.text.TextUtils; import android.view.View; @@ -18,49 +14,21 @@ import android.widget.CompoundButton; import android.widget.ImageView; import android.widget.RelativeLayout; -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.annotation.Nullable; import androidx.core.content.ContextCompat; import androidx.databinding.DataBindingUtil; -import com.chwl.app.application.App; -import com.chwl.app.common.util.BitmapUtil; -import com.chwl.app.ui.widget.dialog.CommonTipDialog; -import com.chwl.core.file.FileModel; -import com.chwl.core.user.UserModel; -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.app.avroom.giftvalue.GiftValueDialogUiHelper; -import com.chwl.app.ui.user.adapter.UserPhotoAdapter; -import com.chwl.core.super_admin.util.SuperAdminUtil; -import com.chwl.core.utils.net.DontWarnObserver; -import com.chwl.core.utils.net.RxHelper; -import com.chwl.library.easyphoto.models.album.entity.Photo; -import com.chwl.library.utils.SingleToastUtil; -import com.hjq.toast.ToastUtils; -import com.netease.nim.uikit.StatusBarUtil; -import com.netease.nim.uikit.common.ui.dialog.EasyAlertDialogHelper; -import com.netease.nimlib.sdk.chatroom.ChatRoomMessageBuilder; -import com.netease.nimlib.sdk.chatroom.model.ChatRoomMessage; import com.chwl.app.R; +import com.chwl.app.application.App; import com.chwl.app.avroom.dialog.SelectLabelDialog; +import com.chwl.app.avroom.giftvalue.GiftValueDialogUiHelper; import com.chwl.app.avroom.presenter.RoomSettingPresenter; import com.chwl.app.avroom.view.IRoomSettingView; import com.chwl.app.avroom.widget.EditRoomTitleDialog; import com.chwl.app.base.BaseMvpActivity; +import com.chwl.app.base.PhotoPickActivity; +import com.chwl.app.common.util.BitmapUtil; import com.chwl.app.common.widget.dialog.DialogManager; import com.chwl.app.databinding.ActivityRoomSettingBinding; import com.chwl.app.ui.webview.CommonWebViewActivity; @@ -69,6 +37,7 @@ import com.chwl.core.UriProvider; import com.chwl.core.auth.AuthModel; import com.chwl.core.auth.event.KickOutEvent; import com.chwl.core.bean.RoomQueueInfo; +import com.chwl.core.file.FileModel; import com.chwl.core.im.custom.bean.CustomAttachment; import com.chwl.core.im.custom.bean.RoomNoticeAttachment; import com.chwl.core.kick.KickModel; @@ -84,21 +53,33 @@ import com.chwl.core.room.giftvalue.helper.GiftValueMrg; import com.chwl.core.room.model.AvRoomModel; import com.chwl.core.room.model.RoomSettingModel; import com.chwl.core.room.queue.bean.MicMemberInfo; +import com.chwl.core.super_admin.util.SuperAdminUtil; +import com.chwl.core.utils.LogUtils; +import com.chwl.core.utils.MyUriUtils; import com.chwl.core.utils.net.BeanObserver; +import com.chwl.core.utils.net.DontWarnObserver; +import com.chwl.core.utils.net.RxHelper; import com.chwl.library.base.factory.CreatePresenter; +import com.chwl.library.common.file.FileHelper; +import com.chwl.library.common.util.PhotoCompressCallback; +import com.chwl.library.common.util.PhotoCompressUtil; import com.chwl.library.net.rxnet.callback.CallBack; import com.chwl.library.utils.CommonUtils; import com.chwl.library.utils.JavaUtil; import com.chwl.library.utils.ListUtils; import com.chwl.library.utils.ResUtil; +import com.chwl.library.utils.SingleToastUtil; import com.chwl.library.utils.codec.DESUtils; +import com.hjq.toast.ToastUtils; +import com.netease.nim.uikit.StatusBarUtil; +import com.netease.nimlib.sdk.chatroom.ChatRoomMessageBuilder; +import com.netease.nimlib.sdk.chatroom.model.ChatRoomMessage; import com.yalantis.ucrop.UCrop; import org.greenrobot.eventbus.EventBus; import org.greenrobot.eventbus.Subscribe; import org.greenrobot.eventbus.ThreadMode; -import java.io.FileNotFoundException; import java.util.ArrayList; import java.util.List; import java.util.Objects; @@ -113,7 +94,7 @@ import kotlinx.coroutines.Job; * @date 2017/9/26 */ @CreatePresenter(RoomSettingPresenter.class) -public class RoomSettingActivity extends BaseMvpActivity implements View.OnClickListener, IRoomSettingView, EasyPermissions.PermissionCallbacks { +public class RoomSettingActivity extends BaseMvpActivity implements View.OnClickListener, IRoomSettingView { private RelativeLayout managerLayout; private RelativeLayout blackLayout; @@ -133,13 +114,12 @@ public class RoomSettingActivity extends BaseMvpActivity pickMedia; private Uri mUri; private Job mJob; - private final int PERMISSION_CODE_STORAGE = 12; - private final int REQUEST_CODE_OPEN_PHOTO_PROVIDER = 111; // 从相册中选择 - private final int REQUEST_CODE_STORAGE = 42; - private final int MAX_BITMAP_SIZE = 100 * 1024 * 1024; // 剪切的图片最大为100 MB + private final int PERMISSION_CODE_STORAGE = 12; + private final int REQUEST_CODE_OPEN_PHOTO_PROVIDER = 111; // 从相册中选择 + private final int REQUEST_CODE_STORAGE = 42; + private final int MAX_BITMAP_SIZE = 100 * 1024 * 1024; // 剪切的图片最大为100 MB public static void start(Context context) { Intent intent = new Intent(context, RoomSettingActivity.class); @@ -178,23 +158,13 @@ public class RoomSettingActivity extends BaseMvpActivity roomEvent.getEvent() == RoomEvent.ROOM_INFO_UPDATE) .subscribe(roomEvent -> updateRoomInfoView()); - //todo do photoPick - pickMedia = registerForActivityResult(new ActivityResultContracts.PickVisualMedia(), new ActivityResultCallback() { - @Override - public void onActivityResult(Uri uri) { - if (uri != null && mUri != null) { - crop(uri, 1, mUri); - } - } - }); - } @Override @@ -256,7 +226,7 @@ public class RoomSettingActivity extends BaseMvpActivity= 29){ - DialogUtil.INSTANCE.getDialog(this, new EasyAlertDialogHelper.OnDialogActionListener() { - @Override - public void doCancelAction() {} - @Override - public void doOkAction() { - mUri = Uri.parse("file://"+ FileHelper.getRootCacheDir().getPath()+"/"+System.nanoTime()+".jpg"); - 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 { - mUri = Uri.parse("file://"+ FileHelper.getRootCacheDir().getPath()+"/"+System.nanoTime()+".jpg"); - PhotoProvider.photoProvider(this, 1,false,REQUEST_CODE_OPEN_PHOTO_PROVIDER, true); - } - } - } - - @Override - public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { - super.onRequestPermissionsResult(requestCode, permissions, grantResults); - EasyPermissions.onRequestPermissionsResult(requestCode, permissions, grantResults, this); - } - - @Override - public void onPermissionsGranted(int requestCode, @NonNull List perms) { - if (requestCode == PERMISSION_CODE_STORAGE) { - checkStoragePermission(); - } - } - - @Override - public void onPermissionsDenied(int requestCode, @NonNull List perms) { - if (requestCode == PERMISSION_CODE_STORAGE) { - String requestTip = getString(R.string.permission_storage_denied); - CommonTipDialog mPrivacyDialog = new CommonTipDialog(context); - mPrivacyDialog.setTipMsg(requestTip); - mPrivacyDialog.setOkText(getString(R.string.room_perform_go_update)); - mPrivacyDialog.setOnActionListener(new CommonTipDialog.OnActionListener() { - @Override - public void onOk() { - //同意跳到应用详情页面 - Uri packageUri = Uri.parse("package:${packageName}"); - Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS, packageUri); - startActivityForResult(intent, REQUEST_CODE_STORAGE); - } - - @Override - public void onCancel() { - //取消跳到应用详情页面 - ToastUtils.show(getString(R.string.permission_storage_refused)); - } - }); - mPrivacyDialog.show(); - } + PhotoPickActivity.start(this, PhotoPickActivity.IMG); } - - - private void switchGiftValue(){ + private void switchGiftValue() { if (AvRoomDataManager.get().isCpRoom()) { return; } @@ -1024,18 +935,17 @@ public class RoomSettingActivity extends BaseMvpActivity photos = PhotoProvider.getResultPhotoList(data); - if (photos != null && !photos.isEmpty()) { - Photo photo = photos.get(0); - crop(photo.uri, photo.size, mUri); - } else { - toast(R.string.empty_data); + Uri uri = data.getData(); + mUri = Uri.parse("file://" + FileHelper.getRootCacheDir().getPath() + "/" + System.nanoTime() + ".jpg"); + if (uri != null && mUri != null) { + boolean isCopy = MyUriUtils.INSTANCE.copyFileToUrl(this, uri, mUri); + if (isCopy) { + crop(mUri, 1, mUri); + } } } break; @@ -1064,6 +974,7 @@ public class RoomSettingActivity extends BaseMvpActivity { if (AvRoomDataManager.get().isDatingMode()) { SingleToastUtil.showToast(ResUtil.getString(R.string.avroom_dialog_roomoperationdialog_01)); @@ -189,7 +189,7 @@ public class RoomOperationDialog extends BottomSheetDialog { } /** - * 跨房PK + * 跨房PK * * @param optAdapter */ @@ -215,7 +215,6 @@ public class RoomOperationDialog extends BottomSheetDialog { R.drawable.ic_room_opt_another_pk_open; - optAdapter.addData(new OptAction(icon, str, () -> { if (AvRoomDataManager.get().isDatingMode()) { SingleToastUtil.showToast(ResUtil.getString(R.string.avroom_dialog_roomoperationdialog_05)); @@ -268,7 +267,6 @@ public class RoomOperationDialog extends BottomSheetDialog { String finalStr = str; - optAdapter.addData(new OptAction(icon, str, () -> { if (pkBean != null && ResUtil.getString(R.string.avroom_dialog_roomoperationdialog_011).equals(finalStr)) { SingleRoomPKModel.INSTANCE diff --git a/app/src/main/java/com/chwl/app/avroom/room_album/RoomAlbumActivity.kt b/app/src/main/java/com/chwl/app/avroom/room_album/RoomAlbumActivity.kt index 2f646e7c6..77350c329 100644 --- a/app/src/main/java/com/chwl/app/avroom/room_album/RoomAlbumActivity.kt +++ b/app/src/main/java/com/chwl/app/avroom/room_album/RoomAlbumActivity.kt @@ -25,6 +25,7 @@ import com.chwl.app.ui.widget.magicindicator.buildins.commonnavigator.titles.Col class RoomAlbumActivity : BaseViewBindingActivity() { val viewModel: RoomAlbumViewModel by viewModels() + var loadDialog: UploadRoomAlbumDialogFragment? = null override fun init() { initTitleBar(getString(R.string.room_album)) @@ -97,13 +98,19 @@ class RoomAlbumActivity : BaseViewBindingActivity() { } binding.tvUpload.setOnClickListener { - UploadRoomAlbumDialogFragment().show( + loadDialog = UploadRoomAlbumDialogFragment() + loadDialog?.show( supportFragmentManager, UploadRoomAlbumDialogFragment::class.java.simpleName ) } } + override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { + super.onActivityResult(requestCode, resultCode, data) + loadDialog?.onActivityResult(requestCode, resultCode, data) + } + companion object { @JvmStatic fun start(context: Context) { 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 b4f83a548..69b1c4967 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 @@ -1,45 +1,33 @@ 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 import android.os.Bundle 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 import com.chad.library.adapter.base.BaseMultiItemQuickAdapter import com.chad.library.adapter.base.BaseViewHolder -import com.google.android.material.bottomsheet.BottomSheetDialogFragment -import com.hjq.toast.ToastUtils import com.chwl.app.R +import com.chwl.app.base.PhotoPickActivity import com.chwl.app.common.widget.dialog.DialogManager import com.chwl.app.databinding.DialogRoomAlbumUploadBinding 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 com.google.android.material.bottomsheet.BottomSheetDialogFragment +import com.hjq.toast.ToastUtils import kotlinx.coroutines.Job class UploadRoomAlbumDialogFragment : BottomSheetDialogFragment() { @@ -54,7 +42,6 @@ class UploadRoomAlbumDialogFragment : BottomSheetDialogFragment() { private var unlockedGift: GiftInfo? = null private var compressJob: Job? = null - var pickMedia : ActivityResultLauncher?=null val dialogManager by lazy { DialogManager(context) } @@ -64,21 +51,6 @@ class UploadRoomAlbumDialogFragment : BottomSheetDialogFragment() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setStyle(STYLE_NO_TITLE, R.style.ErbanBottomSheetDialog) - - //todo do photoPick - pickMedia = registerForActivityResult(ActivityResultContracts.PickVisualMedia()) { uri -> - uri?.let { - if (MyUriUtils.isGif(requireContext(), uri)) { - ToastUtils.show(R.string.error_file_type) - return@let - } - val file = MyUriUtils.copyFile(requireContext(),uri) - if (file != null) { - compressPhotos(mutableListOf(file.path)) - } - } - } - } override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { @@ -243,37 +215,7 @@ class UploadRoomAlbumDialogFragment : BottomSheetDialogFragment() { } private fun checkStoragePermission() { - - if (Build.VERSION.SDK_INT >= 29){ - 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 - ) - } - } - - + PhotoPickActivity.start(requireActivity(), PhotoPickActivity.IMG) } @Deprecated("Deprecated in Java") @@ -282,10 +224,17 @@ class UploadRoomAlbumDialogFragment : BottomSheetDialogFragment() { if (resultCode != Activity.RESULT_OK) { return } - if (requestCode == 200) { - PhotoProvider.getResultPathListAsync(data) { - it?.mapNotNull { it.path }?.let { paths -> - compressPhotos(paths.toMutableList()) + + if (requestCode == PhotoPickActivity.PICK_ACT_RESULT) { + val uri = data?.data + uri?.let { + if (MyUriUtils.isGif(requireContext(), uri)) { + ToastUtils.show(R.string.error_file_type) + return@let + } + val file = MyUriUtils.copyFile(requireContext(), uri) + if (file != null) { + compressPhotos(mutableListOf(file.path)) } } } diff --git a/app/src/main/java/com/chwl/app/base/BaseBindingTakePhotoActivity.java b/app/src/main/java/com/chwl/app/base/BaseBindingTakePhotoActivity.java index 6fd739ff0..376513564 100644 --- a/app/src/main/java/com/chwl/app/base/BaseBindingTakePhotoActivity.java +++ b/app/src/main/java/com/chwl/app/base/BaseBindingTakePhotoActivity.java @@ -66,10 +66,7 @@ public abstract class BaseBindingTakePhotoActivity ex getDialogManager().showCommonPopupDialog(buttonItems, ResUtil.getString(R.string.erban_base_basebindingtakephotoactivity_03), false); } - private void checkPermissionAndStartCamera() { - //低版本授权检查 - checkPermission(this::takePhoto, R.string.ask_camera, android.Manifest.permission.CAMERA); - } + private void takePhoto() { String mCameraCapturingName = CAMERA_PREFIX + System.currentTimeMillis() + ".jpg"; diff --git a/app/src/main/java/com/chwl/app/base/BaseMvpTakePhotoActivity.java b/app/src/main/java/com/chwl/app/base/BaseMvpTakePhotoActivity.java index f108d3798..a6e7e7008 100644 --- a/app/src/main/java/com/chwl/app/base/BaseMvpTakePhotoActivity.java +++ b/app/src/main/java/com/chwl/app/base/BaseMvpTakePhotoActivity.java @@ -66,10 +66,7 @@ public abstract class BaseMvpTakePhotoActivity takePhoto(); diff --git a/app/src/main/java/com/chwl/app/base/PhotoPickActivity.kt b/app/src/main/java/com/chwl/app/base/PhotoPickActivity.kt index 94cb4d66e..9041843ad 100644 --- a/app/src/main/java/com/chwl/app/base/PhotoPickActivity.kt +++ b/app/src/main/java/com/chwl/app/base/PhotoPickActivity.kt @@ -1,24 +1,169 @@ package com.chwl.app.base +import android.Manifest +import android.app.Activity +import android.content.Intent +import android.net.Uri +import android.os.Build import android.os.Bundle +import android.provider.Settings import androidx.activity.ComponentActivity import androidx.activity.result.ActivityResultLauncher import androidx.activity.result.PickVisualMediaRequest +import androidx.activity.result.contract.ActivityResultContracts import com.chwl.app.R +import com.chwl.app.ui.widget.dialog.CommonTipDialog +import com.chwl.core.utils.DialogUtil +import com.chwl.library.common.util.SPUtils +import com.chwl.library.constants.ConstantsLib +import com.chwl.library.easypermisssion.EasyPermissions +import com.hjq.toast.ToastUtils +import com.netease.nim.uikit.common.ui.dialog.EasyAlertDialogHelper -class PhotoPickActivity : ComponentActivity() { +class PhotoPickActivity : ComponentActivity(), EasyPermissions.PermissionCallbacks { + companion object { + @JvmStatic + fun start(act: Activity, mediaType: String) { + val intent = Intent(act, PhotoPickActivity::class.java) + intent.putExtra(PICK_ACT_TYPE, mediaType) + act.startActivityForResult(intent, PICK_ACT_RESULT) + } - var pickMedia : ActivityResultLauncher?=null + const val PICK_ACT_RESULT = 1234566789; + private const val PERMISSION_RESULT = 123; + private const val PICK_ACT_TYPE = "PICK_ACT_TYPE"; - - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - setContentView(R.layout.activity_photo_pick) + const val IMG = "image/*" + const val GIF = "image/gif" } + var pickMedia: ActivityResultLauncher? = null + var pickMediaForDocument: ActivityResultLauncher>? = null + var mMediaType = IMG + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) +// setContentView(R.layout.activity_photo_pick) + window?.setDimAmount(0f) + mMediaType = intent?.getStringExtra(PICK_ACT_TYPE) ?: IMG + pickMedia = registerForActivityResult(ActivityResultContracts.PickVisualMedia()) { uri -> + if (uri != null) { + val intent = Intent() + intent.setData(uri) + setResult(RESULT_OK, intent) + // 接收方 用 intent.data 来获取 + finish() + } else { + finish() + } + } + + pickMediaForDocument = registerForActivityResult(ActivityResultContracts.OpenDocument()) { + if (it != null) { + val intent = Intent() + intent.setData(it) + setResult(RESULT_OK, intent) + } + finish() + } + + + checkStoragePermission() + } + + + private fun checkStoragePermission() { + if (Build.VERSION.SDK_INT >= 29) { + DialogUtil.getDialog(this, object : EasyAlertDialogHelper.OnDialogActionListener { + override fun doCancelAction() { + finish() + } + + override fun doOkAction() { + SPUtils.putBoolean(ConstantsLib.Key.Permissions_Img, true) + pickMedia?.launch( + PickVisualMediaRequest( + ActivityResultContracts.PickVisualMedia.SingleMimeType( + mMediaType + ) + ) + ) + } + }) + } else { + if (!EasyPermissions.hasPermissions(this, Manifest.permission.READ_EXTERNAL_STORAGE)) { + EasyPermissions.requestPermissions( + this, + getString(R.string.permission_storage_rationale), + PERMISSION_RESULT, + Manifest.permission.READ_EXTERNAL_STORAGE + ) + } else { +// val intent = Intent(Intent.ACTION_OPEN_DOCUMENT) +// intent.setType("*/*") +// intent.putExtra(Intent.EXTRA_MIME_TYPES,mMediaType) + pickMediaForDocument?.launch(arrayOf(mMediaType)) + } + } + } + +// override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { +// super.onActivityResult(requestCode, resultCode, data) +// if (requestCode == PICK_ACT_RESULT && resultCode == RESULT_OK) { +// val uri = data?.data +// if (uri != null) { +// val intent = Intent() +// intent.setData(uri) +// setResult(RESULT_OK, intent) +// } +// } +// } + + override fun onRequestPermissionsResult( + requestCode: Int, + permissions: Array, + grantResults: IntArray + ) { + super.onRequestPermissionsResult(requestCode, permissions, grantResults) + EasyPermissions.onRequestPermissionsResult(requestCode, permissions, grantResults, this) + } + + override fun onPermissionsDenied(requestCode: Int, perms: MutableList) { + if (requestCode == PERMISSION_RESULT) { + val requestTip = getString(R.string.permission_storage_denied) + val mPrivacyDialog = CommonTipDialog(this) + 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:${packageName}") + val intent = + Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS, packageUri) + startActivity(intent) + finish() + } + + override fun onCancel() { + super.onCancel() + //取消跳到应用详情页面 + ToastUtils.show(getString(R.string.permission_storage_refused)) + finish() + } + } + ) + mPrivacyDialog.show() + } + } + + override fun onPermissionsGranted(requestCode: Int, perms: MutableList) { + if (requestCode == PERMISSION_RESULT) { + checkStoragePermission() + } + } } \ No newline at end of file diff --git a/app/src/main/java/com/chwl/app/home/fragment/MeFragment.kt b/app/src/main/java/com/chwl/app/home/fragment/MeFragment.kt index cb7105f4e..2329b076d 100644 --- a/app/src/main/java/com/chwl/app/home/fragment/MeFragment.kt +++ b/app/src/main/java/com/chwl/app/home/fragment/MeFragment.kt @@ -17,9 +17,9 @@ import com.chwl.app.UIHelper import com.chwl.app.application.IReportConstants import com.chwl.app.application.ReportManager import com.chwl.app.avroom.activity.AVRoomActivity -import com.chwl.app.avroom.dialog.RoomBoomRewardDialog import com.chwl.app.base.BaseActivity import com.chwl.app.base.BaseFragment +import com.chwl.app.base.PhotoPickActivity import com.chwl.app.databinding.FragmentMeBinding import com.chwl.app.home.HomeViewModel import com.chwl.app.home.MeViewModel @@ -33,18 +33,13 @@ import com.chwl.app.support.FragmentVisibleStateHelper import com.chwl.app.ui.im.RouterHandler import com.chwl.app.ui.relation.AttentionListActivity import com.chwl.app.ui.relation.FansListActivity -import com.chwl.app.ui.setting.VipSetActivity import com.chwl.app.ui.utils.ImageLoadUtils import com.chwl.app.ui.wallet.WalletActivity import com.chwl.app.ui.webview.CommonWebViewActivity -import com.chwl.app.ui.widget.UserInfoDialog import com.chwl.app.view.GenderAgeTextView import com.chwl.app.vip.VipCenterActivity -import com.chwl.app.vip.VipSettingActivity import com.chwl.app.vip.VipViewModel -import com.chwl.app.vip.dialog.VipUpgradeDialog import com.chwl.core.auth.AuthModel -import com.chwl.core.gift.bean.BoomMsgAwardBean import com.chwl.core.initial.InitialModel import com.chwl.core.level.UserLevelVo import com.chwl.core.manager.IMNetEaseManager @@ -61,13 +56,11 @@ import com.chwl.core.user.UserModel import com.chwl.core.user.bean.UserInfo import com.chwl.core.user.event.LoginUserInfoUpdateEvent import com.chwl.core.utils.CoreLogger -import com.chwl.core.utils.WLog import com.chwl.core.vip.bean.VipInfo import com.example.lib_utils.ktx.singleClick import org.greenrobot.eventbus.EventBus import org.greenrobot.eventbus.Subscribe import org.greenrobot.eventbus.ThreadMode -import java.util.* /** * @description: 我的 界面 @@ -110,7 +103,7 @@ class MeFragment : BaseFragment(), View.OnClickListener { mCenterAdapter.setOnItemClickListener { adapter, view, position -> mCenterAdapter.getItem(position)?.let { - RouterHandler.handle(mContext, it.skipType?:-1, it.centerUrl) + RouterHandler.handle(mContext, it.skipType ?: -1, it.centerUrl) } } @@ -208,7 +201,8 @@ class MeFragment : BaseFragment(), View.OnClickListener { if (diamondList?.contains(userInfo.erbanNo) == true || giftList?.contains(userInfo.erbanNo) == true || levelSep >= (initInfo?.giveDiamondExperLevel ?: 0) - || levelSep >= (initInfo?.giveGiftExperLevel ?: 0)) { + || levelSep >= (initInfo?.giveGiftExperLevel ?: 0) + ) { meViewModel.updateDonationMenuVisible(true) } else { meViewModel.updateDonationMenuVisible(false) @@ -326,7 +320,7 @@ class MeFragment : BaseFragment(), View.OnClickListener { override fun onClick(v: View) { when (v.id) { - R.id.iv_user_head, R.id.rl_user_info ->{ + R.id.iv_user_head, R.id.rl_user_info -> { mUserInfo?.let { UIHelper.showUserInfoAct(mContext, it.uid) } } // @@ -377,7 +371,7 @@ class MeFragment : BaseFragment(), View.OnClickListener { R.id.tv_user_name -> { //todo do 测试按钮 if (BuildConfig.DEBUG) { - VipSetActivity.start(requireActivity()); + PhotoPickActivity.start(requireActivity(), PhotoPickActivity.GIF) } } diff --git a/app/src/main/java/com/chwl/app/notify/views/GiftNotify.kt b/app/src/main/java/com/chwl/app/notify/views/GiftNotify.kt index a1095f1c5..33283cdbe 100644 --- a/app/src/main/java/com/chwl/app/notify/views/GiftNotify.kt +++ b/app/src/main/java/com/chwl/app/notify/views/GiftNotify.kt @@ -16,6 +16,7 @@ import com.example.lib_utils.ktx.getColorById import com.example.lib_utils.ktx.singleClick import com.example.lib_utils.spannable.SpannableTextBuilder +//todo do VIP 送礼飘屏 class GiftNotify(context: Context) : BaseFloatView(context) { private val view = TextView(context) 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 57ffbe684..b9eacc1ea 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 @@ -1,37 +1,24 @@ package com.chwl.app.ui.feedback -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 import androidx.lifecycle.repeatOnLifecycle import com.chwl.app.R import com.chwl.app.base.BaseViewBindingActivity +import com.chwl.app.base.PhotoPickActivity import com.chwl.app.databinding.FeedbackActivityBinding 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 -import com.chwl.library.utils.SingleToastUtil import com.example.lib_utils.SolveEditTextScrollClash import com.example.lib_utils.ktx.getColorById import com.example.lib_utils.ktx.setOnInputChangedListener @@ -43,13 +30,11 @@ 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 -class FeedbackActivity : BaseViewBindingActivity(), - EasyPermissions.PermissionCallbacks { +class FeedbackActivity : BaseViewBindingActivity() { private val PERMISSION_CODE_STORAGE = 12 private val REQUEST_CODE_OPEN_PHOTO_PROVIDER = 111 // 从相册中选择 @@ -61,21 +46,11 @@ 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) - - //todo do photoPick - 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() @@ -243,83 +218,29 @@ class FeedbackActivity : BaseViewBindingActivity(), } } - @SuppressLint("CheckResult") - private fun uploadImage(path: String, success: (String) -> Unit, failed: (Throwable?) -> Unit) { - FileModel.get() - .uploadFile(path) - .compose(bindToLifecycle()) - .subscribe { url: String?, throwable: Throwable? -> - if (url != null) { - success.invoke(url) - } else { - failed.invoke(throwable) - } - } + + private fun checkStoragePermission() { + PhotoPickActivity.start(this, PhotoPickActivity.IMG) } override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { super.onActivityResult(requestCode, resultCode, data) if (resultCode == RESULT_OK) { - if (requestCode == REQUEST_CODE_OPEN_PHOTO_PROVIDER) { + if (requestCode == PhotoPickActivity.PICK_ACT_RESULT) { if (data == null) { return } - PhotoProvider.getResultPathListAsync(data) { list -> - if (list.isNullOrEmpty()) { - SingleToastUtil.showToastShort(com.netease.nim.uikit.R.string.picker_image_error) - return@getResultPathListAsync + val uri = data.data + uri?.let { + val file = MyUriUtils.copyFile(this, uri) + if (file != null) { + compressPhotos(mutableListOf(file.path)) } - val paths = list.map { it.path }.toMutableList() - compressPhotos(paths) } } } } - override fun onRequestPermissionsResult( - requestCode: Int, - permissions: Array, - grantResults: IntArray - ) { - super.onRequestPermissionsResult(requestCode, permissions, grantResults) - EasyPermissions.onRequestPermissionsResult(requestCode, permissions, grantResults, this) - } - - private fun checkStoragePermission() { - - if (Build.VERSION.SDK_INT >= 29){ - 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 - ) - } - } - } - private fun compressPhotos(paths: MutableList) { compressJob?.cancel(null) compressJob = PhotoCompressUtil.compress( @@ -338,6 +259,20 @@ class FeedbackActivity : BaseViewBindingActivity(), ) } + @SuppressLint("CheckResult") + private fun uploadImage(path: String, success: (String) -> Unit, failed: (Throwable?) -> Unit) { + FileModel.get() + .uploadFile(path) + .compose(bindToLifecycle()) + .subscribe { url: String?, throwable: Throwable? -> + if (url != null) { + success.invoke(url) + } else { + failed.invoke(throwable) + } + } + } + override fun needSteepStateBar(): Boolean { return true } @@ -348,36 +283,6 @@ class FeedbackActivity : BaseViewBindingActivity(), StatusBarUtil.StatusBarLightMode(this) } - override fun onPermissionsGranted(requestCode: Int, perms: MutableList) { - if (requestCode == PERMISSION_CODE_STORAGE) { - checkStoragePermission() - } - } - - override fun onPermissionsDenied(requestCode: Int, perms: MutableList) { - if (requestCode == PERMISSION_CODE_STORAGE) { - val requestTip = getString(R.string.permission_storage_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() { - //同意跳到应用详情页面 - SettingsUtils.startMyApplicationDetailsForResult( - this@FeedbackActivity, - packageName - ) - } - - override fun onCancel() { - super.onCancel() - //取消跳到应用详情页面 - ToastUtils.show(getString(R.string.permission_storage_refused)) - } - }) - mPrivacyDialog.show() - } - } override fun onResume() { super.onResume() 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 d6007285f..b0aa19f16 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 @@ -1,25 +1,20 @@ package com.chwl.app.ui.user.activity -import android.Manifest import android.annotation.SuppressLint import android.content.Intent import android.graphics.Bitmap import android.net.Uri -import android.os.Build import android.os.Bundle -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.chwl.app.R import com.chwl.app.UIHelper import com.chwl.app.application.App import com.chwl.app.base.BaseViewBindingActivity +import com.chwl.app.base.PhotoPickActivity import com.chwl.app.common.util.BitmapUtil import com.chwl.app.constants.UserInfoConstants import com.chwl.app.databinding.ActivityUserInfoModifyBinding @@ -29,7 +24,6 @@ import com.chwl.app.ui.user.adapter.UserPhotoAdapter.ImageClickListener import com.chwl.app.ui.user.dialog.UserAreaDialog import com.chwl.app.ui.utils.ImageLoadUtils import com.chwl.app.ui.widget.ButtonItem -import com.chwl.app.ui.widget.dialog.CommonTipDialog import com.chwl.app.utils.RegexUtil import com.chwl.app.vip.util.VipHelper import com.chwl.core.auth.AuthModel @@ -39,22 +33,16 @@ import com.chwl.core.user.bean.RegionInfoBean 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.MyUriUtils 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.example.lib_utils.ktx.getString import com.fourmob.datetimepicker.date.DatePickerDialog 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.sys.TimeUtil import com.sleepbot.datetimepicker.time.RadialPickerLayout import com.sleepbot.datetimepicker.time.TimePickerDialog @@ -76,8 +64,7 @@ import java.util.concurrent.TimeUnit */ class UserInfoModifyActivity : BaseViewBindingActivity(), View.OnClickListener, - TimePickerDialog.OnTimeSetListener, DatePickerDialog.OnDateSetListener, ImageClickListener, - EasyPermissions.PermissionCallbacks { + TimePickerDialog.OnTimeSetListener, DatePickerDialog.OnDateSetListener, ImageClickListener { private var datePickerDialog: DatePickerDialog? = null private var mUserInfo: UserInfo? = null private var userId: Long = 0 @@ -108,32 +95,11 @@ class UserInfoModifyActivity : BaseViewBindingActivity?=null override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) UserModel.get().getUserInfo(userId).subscribe(userInfoUpdateObserver) PhotoCompressUtil.clearCompressCache() - - //todo do photoPick - pickMedia = registerForActivityResult(ActivityResultContracts.PickVisualMedia()) { uri -> - if (uri != null) { - mUri?.let { - if (isGif) { - if (MyUriUtils.isGif(context, uri)){ - val isCopy = MyUriUtils.copyFileToUrl(this,uri, it) - if (isCopy) { - onActivityResult(UCrop.REQUEST_CROP,RESULT_OK,null) - } - }else{ - ToastUtils.show(R.string.error_file_type) - } - } else { - crop(uri, 1, it) - } - } - } - } } override fun click(position: Int, userPhoto: UserPhoto, isOwner: Boolean) { @@ -146,7 +112,10 @@ class UserInfoModifyActivity : BaseViewBindingActivity { if (mUserInfo != null) { var year = TimeUtils.getYear( @@ -283,21 +253,25 @@ class UserInfoModifyActivity : BaseViewBindingActivity UIHelper.showModifyInfoAct( this@UserInfoModifyActivity, Method.NICK, ModifyInfoActivity.NICK_MODIFY ) + R.id.ll_desc -> UIHelper.showModifyInfoAct( this@UserInfoModifyActivity, Method.DESC, ModifyInfoActivity.CONTENT_MODIFY ) + R.id.layout_photos -> UserModifyPhotosActivity.startForResult( this@UserInfoModifyActivity, userId, Method.PHOTO ) + R.id.layout_area -> { dialogManager.showProgressDialog( this@UserInfoModifyActivity, @@ -319,7 +293,7 @@ class UserInfoModifyActivity : BaseViewBindingActivity data.name == it } if (find != null) { - reportArea(it,find.id) + reportArea(it, find.id) } } }.show(this@UserInfoModifyActivity) @@ -332,32 +306,34 @@ class UserInfoModifyActivity : BaseViewBindingActivity { - postUpDateCpSwitch(binding.swCpAnim,UserInfoConstants.CpSet.cpAnim) + postUpDateCpSwitch(binding.swCpAnim, UserInfoConstants.CpSet.cpAnim) } R.id.swCpShow -> { - postUpDateCpSwitch(binding.swCpShow,UserInfoConstants.CpSet.cpAvatar) + postUpDateCpSwitch(binding.swCpShow, UserInfoConstants.CpSet.cpAvatar) } + else -> {} } } //post update set - private fun postUpDateCpSwitch(view: ImageView,type:Int){ + private fun postUpDateCpSwitch(view: ImageView, type: Int) { val tag = view.tag - if (tag != null && tag is Boolean){ + if (tag != null && tag is Boolean) { val tagVal = !tag - UserModel.get().userCpSettingUpdate(type,tagVal) + UserModel.get().userCpSettingUpdate(type, tagVal) .compose(bindToLifecycle()) .doOnSuccess { - setSwitchView(view,tagVal,true) + setSwitchView(view, tagVal, true) }.subscribe() } } // set view - private fun setSwitchView(view: ImageView, on:Boolean,notify:Boolean=false){ + private fun setSwitchView(view: ImageView, on: Boolean, notify: Boolean = false) { view.setImageResource(if (on) R.drawable.ic_user_edit_sw_on else R.drawable.ic_user_edit_sw_off) view.tag = on if (notify) { @@ -366,7 +342,7 @@ class UserInfoModifyActivity : BaseViewBindingActivity, grantResults: IntArray - ) { - super.onRequestPermissionsResult(requestCode, permissions, grantResults) - EasyPermissions.onRequestPermissionsResult(requestCode, permissions, grantResults, this) - } - - override fun onPermissionsGranted(requestCode: Int, perms: MutableList) { - if (requestCode == PERMISSION_CODE_STORAGE) { - checkStoragePermission() - } - } - - override fun onPermissionsDenied(requestCode: Int, perms: MutableList) { - if (requestCode == PERMISSION_CODE_STORAGE) { - val requestTip = getString(R.string.permission_storage_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:${packageName}") - val intent = Intent( - Settings.ACTION_APPLICATION_DETAILS_SETTINGS, - packageUri - ) - startActivityForResult( - intent, REQUEST_CODE_STORAGE - ) - } - - override fun onCancel() { - super.onCancel() - //取消跳到应用详情页面 - ToastUtils.show(getString(R.string.permission_storage_refused)) - } - } - ) - mPrivacyDialog.show() - } - } private fun selectAvatarType() { val list = ArrayList() @@ -457,31 +389,7 @@ class UserInfoModifyActivity : BaseViewBindingActivity= 29){ - 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()}$fileWith") - val type = if (isGif) ActivityResultContracts.PickVisualMedia.SingleMimeType("image/gif") else ActivityResultContracts.PickVisualMedia.ImageOnly - pickMedia?.launch(PickVisualMediaRequest(type)) - } - }) - }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()}$fileWith") - PhotoProvider.photoProvider(this, resultCode = REQUEST_CODE_OPEN_PHOTO_PROVIDER, canChooseGif = isGif) - } - } - + PhotoPickActivity.start(this, if (isGif) PhotoPickActivity.GIF else PhotoPickActivity.IMG) } private fun getNowTime(): String { @@ -492,9 +400,7 @@ class UserInfoModifyActivity : BaseViewBindingActivity { data?.let { @@ -511,6 +417,7 @@ class UserInfoModifyActivity : BaseViewBindingActivity { data?.let { dialogManager.showProgressDialog( @@ -526,6 +433,7 @@ class UserInfoModifyActivity : BaseViewBindingActivity { data?.let { val isChanged = @@ -534,29 +442,32 @@ class UserInfoModifyActivity : BaseViewBindingActivity data?.let { - val photos = PhotoProvider.getResultPhotoList(it) - if (!photos.isNullOrEmpty()) { - val photo = photos[0] + + PhotoPickActivity.PICK_ACT_RESULT -> { + val uri = data?.data + if (uri != null) { + val fileWith = if (isGif) ".gif" else ".jpg" + mUri = + Uri.parse("file://${FileHelper.getRootCacheDir()?.path}/${getNowTime()}$fileWith") if (isGif) { - mUri?.let { - if (MyUriUtils.isGif(context,photo.uri)){ - val isCopy = MyUriUtils.copyFileToUrl(this,photo.uri, it) - if (isCopy) { - onActivityResult(UCrop.REQUEST_CROP,RESULT_OK,null) - } - }else{ - ToastUtils.show(R.string.error_file_type) + if (MyUriUtils.isGif(context, uri)) { + val isCopy = MyUriUtils.copyFileToUrl(this, uri, mUri!!) + if (isCopy) { + onActivityResult(UCrop.REQUEST_CROP, RESULT_OK, null) } + } else { + ToastUtils.show(R.string.error_file_type) } } else { - crop(photo.uri, photo.size, mUri) + val copyFileToUrl = MyUriUtils.copyFileToUrl(this, uri, mUri!!) + if (copyFileToUrl) { + crop(mUri, 1, mUri) + } } - - } else { - toast(R.string.empty_data) } + } + UCrop.REQUEST_CROP -> mUri?.path?.let { try { mJob?.cancel() 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 4bb42c440..931510e8a 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 @@ -1,59 +1,46 @@ package com.chwl.app.ui.user.activity -import android.Manifest import android.annotation.SuppressLint import android.app.Activity import android.content.Intent import android.graphics.Bitmap import android.net.Uri -import android.os.Build 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 -import com.netease.nim.uikit.StatusBarUtil -import com.orhanobut.logger.Logger -import com.trello.rxlifecycle3.android.ActivityEvent -import com.yalantis.ucrop.UCrop import com.chwl.app.R import com.chwl.app.application.App +import com.chwl.app.base.PhotoPickActivity import com.chwl.app.base.TitleBar import com.chwl.app.common.util.BitmapUtil import com.chwl.app.ui.user.adapter.UserModifyPhotosAdapter import com.chwl.app.ui.user.adapter.UserModifyPhotosAdapter.PhotoItemClickListener -import com.chwl.app.ui.widget.dialog.CommonTipDialog import com.chwl.core.file.FileModel 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.MyUriUtils 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 com.jph.takephoto.app.TakePhotoActivity +import com.netease.nim.uikit.StatusBarUtil +import com.orhanobut.logger.Logger +import com.trello.rxlifecycle3.android.ActivityEvent +import com.yalantis.ucrop.UCrop import kotlinx.coroutines.Job import java.io.FileNotFoundException import java.text.SimpleDateFormat -import java.util.* +import java.util.Date /** * Created by chenran on 2017/7/24. */ -class UserModifyPhotosActivity : TakePhotoActivity(), PhotoItemClickListener, - EasyPermissions.PermissionCallbacks { +class UserModifyPhotosActivity : TakePhotoActivity(), PhotoItemClickListener { private var userId: Long = 0 private var userInfo: UserInfo? = null private var photoGridView: GridView? = null @@ -64,7 +51,6 @@ 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" @@ -104,14 +90,6 @@ class UserModifyPhotosActivity : TakePhotoActivity(), PhotoItemClickListener, if (userInfo != null) { updateView() } - - //todo do photoPick - pickMedia = registerForActivityResult(ActivityResultContracts.PickVisualMedia()) { uri -> - uri?.let { - crop(it, 0, mUri) - } - - } } private fun initView() { @@ -190,84 +168,8 @@ class UserModifyPhotosActivity : TakePhotoActivity(), PhotoItemClickListener, } } - 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_STORAGE) { - checkStoragePermission() - } - } - - override fun onPermissionsDenied(requestCode: Int, perms: MutableList) { - if (requestCode == PERMISSION_CODE_STORAGE) { - val requestTip = getString(R.string.permission_storage_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:${packageName}") - val intent = Intent( - Settings.ACTION_APPLICATION_DETAILS_SETTINGS, - packageUri - ) - startActivityForResult( - intent, REQUEST_CODE_STORAGE - ) - } - - override fun onCancel() { - super.onCancel() - //取消跳到应用详情页面 - ToastUtils.show(getString(R.string.permission_storage_refused)) - } - } - ) - mPrivacyDialog.show() - } - } - private fun checkStoragePermission() { - - if (Build.VERSION.SDK_INT >= 29){ - 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 - ) - } - } - - + PhotoPickActivity.start(this@UserModifyPhotosActivity, PhotoPickActivity.IMG) } private fun getNowTime(): String { @@ -278,17 +180,20 @@ class UserModifyPhotosActivity : TakePhotoActivity(), PhotoItemClickListener, override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { super.onActivityResult(requestCode, resultCode, data) - if (requestCode == REQUEST_CODE_STORAGE) { - checkStoragePermission() - } else if (resultCode == RESULT_OK) { + if (resultCode == RESULT_OK) { when (requestCode) { - REQUEST_CODE_OPEN_PHOTO_PROVIDER -> data?.let { - val photos = PhotoProvider.getResultPhotoList(data) ?: return - if (photos.isNotEmpty()) { - val photo = photos[0] - crop(photo.uri, photo.size, mUri) + + PhotoPickActivity.PICK_ACT_RESULT -> data?.data?.let { uri -> + mUri = + Uri.parse("file://${FileHelper.getRootCacheDir()?.path}/${getNowTime()}.jpg") + val isCopy = + MyUriUtils.copyFileToUrl(this@UserModifyPhotosActivity, uri, mUri!!) + if (isCopy) { + crop(mUri, 0, mUri) } } + + UCrop.REQUEST_CROP -> mUri?.path?.let { try { mJob?.cancel() 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 5c38a942b..0e2905658 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,13 +1,8 @@ - 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; import android.text.TextUtils; @@ -21,37 +16,19 @@ 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; import com.chwl.app.base.BaseMvpActivity; +import com.chwl.app.base.PhotoPickActivity; import com.chwl.app.common.widget.dialog.DialogManager; -import com.chwl.app.community.ConstantValue; import com.chwl.app.community.publish.ImageAdapter; import com.chwl.app.community.publish.presenter.PublishPresenter; import com.chwl.app.community.utils.ObjectTypeHelper; -import com.chwl.app.ui.widget.dialog.CommonTipDialog; +import com.chwl.app.photo.BigPhotoActivity; +import com.chwl.app.photo.PagerOption; import com.chwl.app.ui.widget.recyclerview.decoration.GridSpacingItemDecoration; import com.chwl.core.Constants; import com.chwl.core.auth.AuthModel; @@ -60,18 +37,21 @@ import com.chwl.core.community.bean.PublishItem; import com.chwl.core.miniworld.model.MiniWorldModel; import com.chwl.core.user.UserModel; import com.chwl.core.user.bean.UserInfo; +import com.chwl.core.utils.CoreTextUtils; +import com.chwl.core.utils.MyUriUtils; import com.chwl.core.utils.SharedPreferenceUtils; import com.chwl.core.utils.net.DontWarnObserver; import com.chwl.library.base.factory.CreatePresenter; -import com.chwl.library.common.photo.PhotoProvider; import com.chwl.library.common.util.PhotoCompressUtil; import com.chwl.library.common.util.PhotosCompressCallback; -import com.chwl.library.easypermisssion.EasyPermissions; -import com.chwl.library.easyphoto.models.album.entity.Photo; -import com.chwl.library.easyphoto.utils.settings.SettingsUtils; import com.chwl.library.utils.ResUtil; import com.chwl.library.utils.SingleToastUtil; import com.example.matisse.internal.entity.CustomItem; +import com.google.android.flexbox.FlexboxLayout; +import com.hjq.toast.ToastUtils; +import com.netease.nim.uikit.StatusBarUtil; +import com.netease.nim.uikit.common.util.log.LogUtil; +import com.trello.rxlifecycle3.android.ActivityEvent; import java.io.File; import java.util.ArrayList; @@ -80,8 +60,6 @@ import java.util.concurrent.TimeUnit; import io.reactivex.Single; import io.reactivex.android.schedulers.AndroidSchedulers; -import kotlin.Unit; -import kotlin.jvm.functions.Function1; import kotlinx.coroutines.Job; /** @@ -89,7 +67,7 @@ import kotlinx.coroutines.Job; */ @CreatePresenter(PublishPresenter.class) public class PublishActivity extends BaseMvpActivity - implements IPublishView, WorldsChooseFrg.ChooseWorldCallback, EasyPermissions.PermissionCallbacks, + implements IPublishView, WorldsChooseFrg.ChooseWorldCallback, View.OnClickListener { private final static String KEY_SP_ORIGINAL_IMAGE = "key_sp_original_image"; @@ -126,8 +104,6 @@ public class PublishActivity extends BaseMvpActivity pickMedia; - public static void start(DialogManager manager, long worldId) { if (beforeStart(manager)) { return; @@ -194,70 +170,6 @@ public class PublishActivity extends BaseMvpActivity() { - @Override - public void onActivityResult(Uri uri) { - if (uri != null && uri.getPath() != null){ - - if (MyUriUtils.INSTANCE.isGif(context, uri)) { - ToastUtils.show(R.string.error_file_type); - return; - } - - 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() { @@ -395,102 +307,6 @@ public class PublishActivity extends BaseMvpActivity, Unit>() { - @Override - public Unit invoke(List list) { - if (list.isEmpty()) { - return null; - } else { - if (mJob != null) { - mJob.cancel(null); - } - ArrayList pathList = new ArrayList<>(); - for (Photo photo : list) { - pathList.add(photo.path); - } - 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 < list.size()) { - Photo photo = list.get(i); - String format = "image/jpeg"; - if (photo.type != null) { - format = photo.type; - } - pathResult.add(new CustomItem(compressedImgList.get(i), CustomItem.IMAGE_NORMAL, format, photo.width, photo.height)); - } - } - 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); - } - return null; - } - }); - break; - - case ConstantValue.CODE_CHOOSE_PHOTO: - String mimeType = Matisse.obtainMineResult(data); - List pathResult = Matisse.obtainPathResult(data); - if ("video".equals(mimeType)) { - toast(ResUtil.getString(R.string.publish_view_publishactivity_04)); - return; - } - if (pathResult == null) { - return; - } - LogUtil.print(pathResult); - - uploadList.addAll(pathResult); - updateImagesData(); - - isOriginalImage = Matisse.obtainOriginalImageResult(data); - LogUtil.print("isOriginalImage:" + isOriginalImage); - SharedPreferenceUtils.put(KEY_SP_ORIGINAL_IMAGE, isOriginalImage); - - break; - - case BigPhotoActivity.CODE_DELETE_PHOTO: - List newList = data.getParcelableArrayListExtra( - BigPhotoActivity.KEY_IMG_URL); - uploadList.clear(); - uploadList.addAll(newList); - updateImagesData(); - break; - - } - } - } @Override public void onPublishSuccess() { @@ -663,75 +479,79 @@ public class PublishActivity extends BaseMvpActivity perms) { - if (requestCode == PERMISSION_CODE_STORAGE) { - checkStoragePermission(); - } - } - - @Override - public void onPermissionsDenied(int requestCode, @NonNull List perms) { - if (requestCode == PERMISSION_CODE_STORAGE) { - String requestTip = getString(R.string.permission_storage_denied); - CommonTipDialog mPrivacyDialog = new CommonTipDialog(context); - mPrivacyDialog.setTipMsg(requestTip); - mPrivacyDialog.setOkText(getString(R.string.room_perform_go_update)); - mPrivacyDialog.setOnActionListener(new CommonTipDialog.OnActionListener() { - @Override - public void onOk() { - //同意跳到应用详情页面 - SettingsUtils.startMyApplicationDetailsForResult(PublishActivity.this, - getPackageName()); - } - - @Override - public void onCancel() { - CommonTipDialog.OnActionListener.super.onCancel(); - //取消跳到应用详情页面 - ToastUtils.show(getString(R.string.permission_storage_refused)); - } - }); - mPrivacyDialog.show(); - } - } private void checkStoragePermission() { + PhotoPickActivity.start(this, PhotoPickActivity.IMG); + } - if (Build.VERSION.SDK_INT >= 29){ - 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()); + @Override + protected void onActivityResult(int requestCode, int resultCode, Intent data) { + super.onActivityResult(requestCode, resultCode, data); + if (resultCode == RESULT_OK) { + switch (requestCode) { + case PhotoPickActivity.PICK_ACT_RESULT: + if (data == null) { + return; } - }); - } - }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 - ); + Uri uri = data.getData(); + if (uri != null && uri.getPath() != null) { + + if (MyUriUtils.INSTANCE.isGif(context, uri)) { + ToastUtils.show(R.string.error_file_type); + return; + } + + 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); + + } + + + } + break; + + } } } diff --git a/core/src/main/java/com/chwl/core/utils/MyUriUtils.kt b/core/src/main/java/com/chwl/core/utils/MyUriUtils.kt index b6e838fc9..56d6423ef 100644 --- a/core/src/main/java/com/chwl/core/utils/MyUriUtils.kt +++ b/core/src/main/java/com/chwl/core/utils/MyUriUtils.kt @@ -5,16 +5,17 @@ import android.database.Cursor import android.graphics.BitmapFactory import android.net.Uri import android.provider.MediaStore -import androidx.activity.result.ActivityResultCallback +import android.provider.OpenableColumns import java.io.File import java.io.FileOutputStream object MyUriUtils { - fun getName(context: Context, uri: Uri) : String?{ - var fileName:String?=null + + fun getName(context: Context, uri: Uri): String? { + var fileName: String? = null val projection = arrayOf(MediaStore.MediaColumns.DISPLAY_NAME) - val cursor : Cursor ? = context.contentResolver.query( + val cursor: Cursor? = context.contentResolver.query( uri, projection, null, @@ -24,7 +25,8 @@ object MyUriUtils { try { cursor?.use { if (it.moveToFirst()) { - fileName = it.getString(it.getColumnIndexOrThrow(MediaStore.MediaColumns.DISPLAY_NAME)) + fileName = + it.getString(it.getColumnIndexOrThrow(MediaStore.MediaColumns.DISPLAY_NAME)) } } } catch (e: Exception) { @@ -32,19 +34,19 @@ object MyUriUtils { return fileName } - fun copyFile(context: Context, uri: Uri) : File?{ - val fileName = getName(context, uri)?:"defName.jpg" + fun copyFile(context: Context, uri: Uri): File? { + val fileName = getName(context, uri) ?: "defName.jpg" - val outPutDir = context.getExternalFilesDir(null)?:return null + val outPutDir = context.getExternalFilesDir(null) ?: return null - val outPutFile = File(outPutDir,fileName) + val outPutFile = File(outPutDir, fileName) if (!outPutDir.exists()) { outPutDir.mkdirs() } - context.contentResolver.openInputStream(uri)?.use { inS-> - FileOutputStream(outPutFile).use{ outS-> + context.contentResolver.openInputStream(uri)?.use { inS -> + FileOutputStream(outPutFile).use { outS -> inS.copyTo(outS) } return outPutFile @@ -52,7 +54,7 @@ object MyUriUtils { } - fun getFileType(context: Context, uri: Uri) : String { + fun getFileType(context: Context, uri: Uri): String { var type = "" context.contentResolver?.let { type = it.getType(uri).toString() @@ -60,14 +62,35 @@ object MyUriUtils { return type } - fun isGif(context: Context, uri: Uri) :Boolean{ - return getFileType(context,uri) == "image/gif" + fun getFileSize(context: Context, uri: Uri): Long { + var size = -1L + try { + context.contentResolver?.let { + val pro = arrayOf(OpenableColumns.SIZE) + val cursor = it.query(uri, pro, null, null, null) + cursor?.let { c -> + if (c.moveToFirst()) { + val sizeIndex = c.getColumnIndexOrThrow(OpenableColumns.SIZE) + size = c.getLong(sizeIndex) + } + c.close() + } + + } + } catch (e: Exception) { + } + return size } - fun copyFileToUrl(context: Context, uri: Uri,outUri:Uri) : Boolean{ + + fun isGif(context: Context, uri: Uri): Boolean { + return getFileType(context, uri) == "image/gif" + } + + fun copyFileToUrl(context: Context, uri: Uri, outUri: Uri): Boolean { val contentResolver = context.contentResolver contentResolver?.openInputStream(uri)?.use { uriStream -> - contentResolver?.openOutputStream(outUri,"wt")?.use { outStream-> + contentResolver?.openOutputStream(outUri, "wt")?.use { outStream -> uriStream.copyTo(outStream) return true } @@ -75,29 +98,29 @@ object MyUriUtils { return false } - fun getFileInfo(file: File) : MutableList?{ + fun getFileInfo(file: File): MutableList? { var width = 0 var height = 0 var minType = "image/jpeg" - var data : MutableList ?= null + var data: MutableList? = null BitmapFactory.Options().apply { inJustDecodeBounds = true - BitmapFactory.decodeFile(file.absolutePath,this) + BitmapFactory.decodeFile(file.absolutePath, this) width = outWidth height = outHeight minType = outMimeType }.let { - data =mutableListOf(width.toString(),height.toString(),minType) + data = mutableListOf(width.toString(), height.toString(), minType) } return data } - fun copyFile(file:File,dir:File){ + fun copyFile(file: File, dir: File) { if (!dir.exists()) { dir.mkdirs() } - file.copyTo(dir,true) + file.copyTo(dir, true) } 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 45057ae33..d6c4e83db 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,12 +1,13 @@ package com.netease.nim.uikit.business.session.actions +import android.content.Context import android.content.Intent -import android.os.Build +import android.database.Cursor +import android.net.Uri +import android.provider.MediaStore import android.text.TextUtils -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 import com.chwl.library.common.util.PhotoCompressUtil import com.chwl.library.common.util.PhotosCompressCallback import com.chwl.library.utils.ResUtil @@ -15,20 +16,16 @@ 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 +import java.io.FileOutputStream /** * Created by zhoujianghua on 2015/7/31. */ abstract class PickImageActionNew protected constructor( - iconResId: Int, - titleId: Int, - private val multiSelect: Boolean + iconResId: Int, titleId: Int, private val multiSelect: Boolean ) : BaseAction(iconResId, titleId) { - companion object { - private const val REQUEST_CODE_OPEN_PHOTO_PROVIDER = 111 // 从相册中选择 - } protected abstract fun onPicked(file: File) @@ -37,29 +34,21 @@ abstract class PickImageActionNew protected constructor( } private fun checkStoragePermission() { - if (Build.VERSION.SDK_INT >= 29) { - 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) - ) - } + NimPhotoPickActivity.start(activity, NimPhotoPickActivity.IMG) + } override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { if (resultCode == BaseDialogFragment.RESULT_OK) { when (requestCode) { - REQUEST_CODE_OPEN_PHOTO_PROVIDER -> { + NimPhotoPickActivity.PICK_ACT_RESULT and 0xff -> { if (data == null) return - PhotoProvider.getResultPathListAsync(data) { list -> - val paths = list?.map { it.path }?.toMutableList() ?: ArrayList() - if (paths.isEmpty()) { - SingleToastUtil.showToastShort(R.string.picker_image_error) - } else { - PhotoCompressUtil.compress( - BaseApp.getContext(), + val uri = data.data + if (uri != null) { + val file = copyFile(activity, uri) + file?.path?.let { path -> + val paths = mutableListOf(path) + PhotoCompressUtil.compress(BaseApp.getContext(), paths, PhotoCompressUtil.getCompressCachePath(), object : PhotosCompressCallback { @@ -68,7 +57,11 @@ abstract class PickImageActionNew protected constructor( for (path in compressedImgList) { val file = File(path) if (TextUtils.isEmpty(path) || !file.exists()) { - SingleToastUtil.showToastShort(path + ResUtil.getString(R.string.xchat_android_core_file_filemodel_01)) + SingleToastUtil.showToastShort( + path + ResUtil.getString( + R.string.xchat_android_core_file_filemodel_01 + ) + ) return } onPicked(file) @@ -78,26 +71,62 @@ abstract class PickImageActionNew protected constructor( override fun onFail(e: Throwable) { SingleToastUtil.showToastShort(R.string.picker_image_error) } - }) } } + } } } } - /** * 发送图片 */ private fun sendImageAfterSelfImagePicker(compressedImgList: List) { SendImageHelper.sendImageAfterSelfImagePickerNew( - activity, - compressedImgList + activity, compressedImgList ) { file, isOrig -> onPicked(file) } } + + 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 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 + } } \ No newline at end of file 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 index 1e413d56d..0a4fe29cd 100644 --- a/nim_uikit/src/com/netease/nim/uikit/common/activity/NimPhotoPickActivity.kt +++ b/nim_uikit/src/com/netease/nim/uikit/common/activity/NimPhotoPickActivity.kt @@ -1,108 +1,160 @@ package com.netease.nim.uikit.common.activity +import android.Manifest +import android.app.Activity import android.content.Context import android.content.Intent import android.database.Cursor import android.net.Uri +import android.os.Build import android.os.Bundle import android.provider.MediaStore -import android.view.Window -import android.view.WindowManager +import androidx.activity.ComponentActivity 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.easypermisssion.EasyPermissions import com.chwl.library.utils.ResUtil -import com.example.lib_utils.AppUtils +import com.hjq.toast.ToastUtils 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() { +class NimPhotoPickActivity : ComponentActivity(), EasyPermissions.PermissionCallbacks { + + companion object { + @JvmStatic + fun start(act: Activity, mediaType: String) { + val intent = Intent(act, NimPhotoPickActivity::class.java) + intent.putExtra(PICK_ACT_TYPE, mediaType) + act.startActivityForResult(intent, PICK_ACT_RESULT) + } + + const val PICK_ACT_RESULT = 333; + private const val PERMISSION_RESULT = 123; + private const val PICK_ACT_TYPE = "PICK_ACT_TYPE"; + + const val IMG = "image/*" + const val GIF = "image/gif" + } - var pickMedia : ActivityResultLauncher?=null + var pickMedia: ActivityResultLauncher? = null + var pickMediaForDocument: ActivityResultLauncher>? = null + var mMediaType = IMG + var dialog: EasyAlertDialog? = 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 -// ) - - //todo do photoPick +// setContentView(R.layout.activity_photo_pick) + window?.setDimAmount(0f) + mMediaType = intent?.getStringExtra(PICK_ACT_TYPE) ?: IMG 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() - } + val intent = Intent() + intent.setData(uri) + setResult(RESULT_OK, intent) + // 接收方 用 intent.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() + pickMediaForDocument = registerForActivityResult(ActivityResultContracts.OpenDocument()) { + if (it != null) { + val intent = Intent() + intent.setData(it) + setResult(RESULT_OK, intent) } - }else{ - pickMedia?.launch(PickVisualMediaRequest(ActivityResultContracts.PickVisualMedia.ImageOnly)) + finish() } - isFirst = false + + checkStoragePermission() } - private fun getName(context: Context, uri: Uri) : String?{ - var fileName:String?=null + + private fun checkStoragePermission() { + if (Build.VERSION.SDK_INT >= 29) { + + 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) + PickVisualMediaRequest( + ActivityResultContracts.PickVisualMedia.SingleMimeType( + mMediaType + ) + ) + } + }) + if (dialog?.isShowing == false) { + dialog?.show() + } + } else { + pickMedia?.launch(PickVisualMediaRequest(ActivityResultContracts.PickVisualMedia.ImageOnly)) + } + + } else { + if (!EasyPermissions.hasPermissions(this, Manifest.permission.READ_EXTERNAL_STORAGE)) { + EasyPermissions.requestPermissions( + this, + getString(R.string.dialot_permission_tips_nim), + PERMISSION_RESULT, + Manifest.permission.READ_EXTERNAL_STORAGE + ) + } else { + pickMediaForDocument?.launch(arrayOf(mMediaType)) + } + } + } + + + override fun onRequestPermissionsResult( + requestCode: Int, + permissions: Array, + grantResults: IntArray + ) { + super.onRequestPermissionsResult(requestCode, permissions, grantResults) + EasyPermissions.onRequestPermissionsResult(requestCode, permissions, grantResults, this) + } + + override fun onPermissionsDenied(requestCode: Int, perms: MutableList) { + if (requestCode == PERMISSION_RESULT) { + ToastUtils.show(getString(R.string.no_permission)) + } + } + + override fun onPermissionsGranted(requestCode: Int, perms: MutableList) { + if (requestCode == PERMISSION_RESULT) { + checkStoragePermission() + } + } + + + 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( + val cursor: Cursor? = context.contentResolver.query( uri, projection, null, @@ -112,7 +164,8 @@ class NimPhotoPickActivity : AppCompatActivity() { try { cursor?.use { if (it.moveToFirst()) { - fileName = it.getString(it.getColumnIndexOrThrow(MediaStore.MediaColumns.DISPLAY_NAME)) + fileName = + it.getString(it.getColumnIndexOrThrow(MediaStore.MediaColumns.DISPLAY_NAME)) } } } catch (e: Exception) { @@ -120,19 +173,19 @@ class NimPhotoPickActivity : AppCompatActivity() { return fileName } - private fun copyFile(context: Context, uri: Uri) : File?{ - val fileName = getName(context, uri)?:"defName.jpg" + private fun copyFile(context: Context, uri: Uri): File? { + val fileName = getName(context, uri) ?: "defName.jpg" - val outPutDir = context.getExternalFilesDir(null)?:return null + val outPutDir = context.getExternalFilesDir(null) ?: return null - val outPutFile = File(outPutDir,fileName) + val outPutFile = File(outPutDir, fileName) if (!outPutDir.exists()) { outPutDir.mkdirs() } - context.contentResolver.openInputStream(uri)?.use { inS-> - FileOutputStream(outPutFile).use{ outS-> + context.contentResolver.openInputStream(uri)?.use { inS -> + FileOutputStream(outPutFile).use { outS -> inS.copyTo(outS) } return outPutFile