feat : 將 圖片選擇功能, 不用第三方,純用 系統自帶的 資源選擇器來實現, 並統一到一個入口 (IM模塊 單獨 處理)

This commit is contained in:
eggmanQQQ
2024-10-29 18:03:34 +08:00
parent f465e6ad1a
commit 871c9a2b79
17 changed files with 646 additions and 1005 deletions

View File

@@ -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

View File

@@ -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<IRoomSettingView, RoomSettingPresenter> implements View.OnClickListener, IRoomSettingView, EasyPermissions.PermissionCallbacks {
public class RoomSettingActivity extends BaseMvpActivity<IRoomSettingView, RoomSettingPresenter> implements View.OnClickListener, IRoomSettingView {
private RelativeLayout managerLayout;
private RelativeLayout blackLayout;
@@ -133,7 +114,6 @@ public class RoomSettingActivity extends BaseMvpActivity<IRoomSettingView, RoomS
private ActivityRoomSettingBinding binding;
private ActivityResultLauncher<PickVisualMediaRequest> pickMedia;
private Uri mUri;
private Job mJob;
private final int PERMISSION_CODE_STORAGE = 12;
@@ -178,23 +158,13 @@ public class RoomSettingActivity extends BaseMvpActivity<IRoomSettingView, RoomS
binding.layoutSingleRoomSort.setVisibility(
AvRoomDataManager.get().isRoomOwner() && AvRoomDataManager.get().isSingleRoom()
? View.VISIBLE : View.GONE);
binding.setRoomAvatar.setVisibility(( AvRoomDataManager.get().isRoomOwner() || AvRoomDataManager.get().isRoomAdmin()) ? View.VISIBLE : View.GONE);
binding.setRoomAvatar.setVisibility((AvRoomDataManager.get().isRoomOwner() || AvRoomDataManager.get().isRoomAdmin()) ? View.VISIBLE : View.GONE);
//调用更改房间信息接口后会发消息ROOM_INFO_UPDATE在此处接收ui改动
IMNetEaseManager.get().getChatRoomEventObservable()
.compose(bindToLifecycle())
.filter(roomEvent -> roomEvent.getEvent() == RoomEvent.ROOM_INFO_UPDATE)
.subscribe(roomEvent -> updateRoomInfoView());
//todo do photoPick
pickMedia = registerForActivityResult(new ActivityResultContracts.PickVisualMedia(), new ActivityResultCallback<Uri>() {
@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<IRoomSettingView, RoomS
}
}
private void loadGiftValueState(){
private void loadGiftValueState() {
if (SuperAdminUtil.isSuperAdmin()) {
binding.layoutGiftValue.setVisibility(View.GONE);
return;
@@ -318,7 +288,7 @@ public class RoomSettingActivity extends BaseMvpActivity<IRoomSettingView, RoomS
}
private void save(final String name, final String pwd, String label) {
save(name,null, pwd, label, false, roomInfo.isHasAnimationEffect());
save(name, null, pwd, label, false, roomInfo.isHasAnimationEffect());
}
/**
@@ -330,7 +300,7 @@ public class RoomSettingActivity extends BaseMvpActivity<IRoomSettingView, RoomS
* @param isUpdateGiftEffect 是否改动了礼物特效
* @param giftEffect 是否开启礼物特效
*/
private void save(final String name,final String avatar, final String pwd, String label, boolean isUpdateGiftEffect,
private void save(final String name, final String avatar, final String pwd, String label, boolean isUpdateGiftEffect,
boolean giftEffect) {
String desc = null;
getDialogManager().showProgressDialog(this, ResUtil.getString(R.string.avroom_activity_roomsettingactivity_06));
@@ -357,7 +327,7 @@ public class RoomSettingActivity extends BaseMvpActivity<IRoomSettingView, RoomS
}
};
if (AvRoomDataManager.get().isRoomOwner()) {
model.updateRoomInfo(name, avatar,desc, roomInfo.getIntroduction(), pwd, label, id,
model.updateRoomInfo(name, avatar, desc, roomInfo.getIntroduction(), pwd, label, id,
AuthModel.get().getCurrentUid(),
AuthModel.get().getTicket(),
giftEffect,
@@ -369,7 +339,7 @@ public class RoomSettingActivity extends BaseMvpActivity<IRoomSettingView, RoomS
.compose(bindToLifecycle())
.subscribe(observer);
} else if (AvRoomDataManager.get().isRoomAdmin()) {
model.updateByAdmin(roomInfo.getUid(),name,avatar,desc, roomInfo.getIntroduction(), pwd, label, id,
model.updateByAdmin(roomInfo.getUid(), name, avatar, desc, roomInfo.getIntroduction(), pwd, label, id,
AuthModel.get().getCurrentUid(),
AuthModel.get().getTicket(),
giftEffect,
@@ -462,13 +432,13 @@ public class RoomSettingActivity extends BaseMvpActivity<IRoomSettingView, RoomS
@Override
public void onOk() {
save(null,null,null, null, true, false);
save(null, null, null, null, true, false);
}
});
return;
}
//开启礼物特效
save(null,null, null, null, true, true);
save(null, null, null, null, true, true);
break;
case R.id.switch_screen:
RoomInfo roomInfo = AvRoomDataManager.get().mCurrentRoomInfo;
@@ -618,70 +588,11 @@ public class RoomSettingActivity extends BaseMvpActivity<IRoomSettingView, RoomS
}
private void checkStoragePermission() {
if (Build.VERSION.SDK_INT >= 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<String> perms) {
if (requestCode == PERMISSION_CODE_STORAGE) {
checkStoragePermission();
}
}
@Override
public void onPermissionsDenied(int requestCode, @NonNull List<String> 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<IRoomSettingView, RoomS
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == REQUEST_CODE_STORAGE) {
checkStoragePermission();
} else if (resultCode == RESULT_OK) {
if (resultCode == RESULT_OK) {
switch (requestCode) {
case REQUEST_CODE_OPEN_PHOTO_PROVIDER:
case PhotoPickActivity.PICK_ACT_RESULT:
if (data != null) {
List<Photo> 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<IRoomSettingView, RoomS
}
});
}
@Override
public void onFail(@NonNull Throwable e) {
toast(e.getMessage());
@@ -1095,7 +1006,7 @@ public class RoomSettingActivity extends BaseMvpActivity<IRoomSettingView, RoomS
UCrop.Options options = new UCrop.Options();
options.setCompressionQuality(100);
options.setShowCropGrid(false);
options.setToolbarColor(ContextCompat.getColor(App.gContext,android.R.color.black));
options.setToolbarColor(ContextCompat.getColor(App.gContext, android.R.color.black));
options.setStatusBarColor(ContextCompat.getColor(App.gContext, android.R.color.black));
options.setHideBottomControls(true);
options.setCompressionFormat(Bitmap.CompressFormat.JPEG);
@@ -1107,12 +1018,12 @@ public class RoomSettingActivity extends BaseMvpActivity<IRoomSettingView, RoomS
}
private void onUpload(String url) {
LogUtils.d(" 请求接口 更新房间封面 url = "+url);
save(null,url,null,null,false,roomInfo.isHasAnimationEffect());
LogUtils.d(" 请求接口 更新房间封面 url = " + url);
save(null, url, null, null, false, roomInfo.isHasAnimationEffect());
}
private void onUploadFail(Throwable throwable) {
toast(ResUtil.getString(R.string.ui_user_userinfomodifyactivity_08) + ":"+throwable.getMessage());
toast(ResUtil.getString(R.string.ui_user_userinfomodifyactivity_08) + ":" + throwable.getMessage());
getDialogManager().dismissDialog();
}

View File

@@ -14,26 +14,22 @@ import androidx.recyclerview.widget.RecyclerView;
import com.chad.library.adapter.base.BaseQuickAdapter;
import com.chad.library.adapter.base.BaseViewHolder;
import com.chwl.app.avroom.activity.RoomTypeSwitchActivity;
import com.coorchice.library.utils.LogUtils;
import com.google.android.material.bottomsheet.BottomSheetDialog;
import com.hjq.toast.ToastUtils;
import com.chwl.app.sadmin.RoomSAdminManagerActivity;
import com.chwl.app.R;
import com.chwl.app.UIHelper;
import com.chwl.app.avroom.activity.CreatePKActivity;
import com.chwl.app.avroom.activity.RoomSettingActivity;
import com.chwl.app.avroom.activity.RoomTypeSwitchActivity;
import com.chwl.app.avroom.anotherroompk.RoomPKCreateActivity;
import com.chwl.app.avroom.giftvalue.GiftValueDialogUiHelper;
import com.chwl.app.avroom.room_album.RoomAlbumActivity;
import com.chwl.app.avroom.singleroompk.SingleRoomPKCreateActivity;
import com.chwl.library.common.util.Utils;
import com.chwl.app.common.widget.dialog.DialogManager;
import com.chwl.app.room_chat.activity.RoomInviteFansActivity;
import com.chwl.app.sadmin.RoomSAdminManagerActivity;
import com.chwl.app.ui.widget.ButtonItem;
import com.chwl.app.ui.widget.recyclerview.decoration.ColorDecoration;
import com.chwl.app.ui.widget.recyclerview.layoutmanager.FullyGridLayoutManager;
import com.chwl.app.vip.dialog.VipBroadcastDialog;
import com.chwl.app.room_chat.activity.RoomInviteFansActivity;
import com.chwl.core.XConstants;
import com.chwl.core.auth.AuthModel;
import com.chwl.core.im.custom.bean.RoomPkBean;
@@ -55,8 +51,12 @@ import com.chwl.core.utils.CurrentTimeUtils;
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.common.util.Utils;
import com.chwl.library.utils.ResUtil;
import com.chwl.library.utils.SingleToastUtil;
import com.coorchice.library.utils.LogUtils;
import com.google.android.material.bottomsheet.BottomSheetDialog;
import com.hjq.toast.ToastUtils;
import org.greenrobot.eventbus.EventBus;
@@ -78,11 +78,12 @@ public class RoomOperationDialog extends BottomSheetDialog {
private OptAdapter optAdapter;
private OnActionListener onActionListener;
private CallBack callBack;
public void setCallBack(CallBack callBack) {
this.callBack = callBack;
}
public interface CallBack{
public interface CallBack {
void onCLick(int Type);
}
@@ -172,7 +173,6 @@ public class RoomOperationDialog extends BottomSheetDialog {
R.drawable.ic_room_opt_in_pk;
optAdapter.addData(new OptAction(icon, str, () -> {
if (AvRoomDataManager.get().isDatingMode()) {
SingleToastUtil.showToast(ResUtil.getString(R.string.avroom_dialog_roomoperationdialog_01));
@@ -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

View File

@@ -25,6 +25,7 @@ import com.chwl.app.ui.widget.magicindicator.buildins.commonnavigator.titles.Col
class RoomAlbumActivity : BaseViewBindingActivity<ActivityRoomAlbumBinding>() {
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<ActivityRoomAlbumBinding>() {
}
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) {

View File

@@ -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<PickVisualMediaRequest>?=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))
}
}
}

View File

@@ -66,10 +66,7 @@ public abstract class BaseBindingTakePhotoActivity<V extends ViewDataBinding> 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";

View File

@@ -66,10 +66,7 @@ public abstract class BaseMvpTakePhotoActivity<V extends IMvpBaseView, P extends
getDialogManager().showCommonPopupDialog(buttonItems, ResUtil.getString(R.string.erban_base_basemvptakephotoactivity_03), false);
}
private void checkPermissionAndStartCamera() {
//低版本授权检查
checkPermission(checkPermissionListener, R.string.ask_camera, android.Manifest.permission.CAMERA);
}
PermissionActivity.CheckPermListener checkPermissionListener = () -> takePhoto();

View File

@@ -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<PickVisualMediaRequest>?=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<PickVisualMediaRequest>? = null
var pickMediaForDocument: ActivityResultLauncher<Array<String>>? = 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<out String>,
grantResults: IntArray
) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults)
EasyPermissions.onRequestPermissionsResult(requestCode, permissions, grantResults, this)
}
override fun onPermissionsDenied(requestCode: Int, perms: MutableList<String>) {
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<String>) {
if (requestCode == PERMISSION_RESULT) {
checkStoragePermission()
}
}
}

View File

@@ -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)
}
}

View File

@@ -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)

View File

@@ -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<FeedbackActivityBinding>(),
EasyPermissions.PermissionCallbacks {
class FeedbackActivity : BaseViewBindingActivity<FeedbackActivityBinding>() {
private val PERMISSION_CODE_STORAGE = 12
private val REQUEST_CODE_OPEN_PHOTO_PROVIDER = 111 // 从相册中选择
@@ -61,21 +46,11 @@ class FeedbackActivity : BaseViewBindingActivity<FeedbackActivityBinding>(),
private var imagePath: String? = null
private var imageUrl: String? = null
var pickMedia : ActivityResultLauncher<PickVisualMediaRequest>?=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,81 +218,27 @@ class FeedbackActivity : BaseViewBindingActivity<FeedbackActivityBinding>(),
}
}
@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 paths = list.map { it.path }.toMutableList()
compressPhotos(paths)
val uri = data.data
uri?.let {
val file = MyUriUtils.copyFile(this, uri)
if (file != null) {
compressPhotos(mutableListOf(file.path))
}
}
}
}
override fun onRequestPermissionsResult(
requestCode: Int,
permissions: Array<String?>,
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<String>) {
@@ -338,6 +259,20 @@ class FeedbackActivity : BaseViewBindingActivity<FeedbackActivityBinding>(),
)
}
@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<FeedbackActivityBinding>(),
StatusBarUtil.StatusBarLightMode(this)
}
override fun onPermissionsGranted(requestCode: Int, perms: MutableList<String>) {
if (requestCode == PERMISSION_CODE_STORAGE) {
checkStoragePermission()
}
}
override fun onPermissionsDenied(requestCode: Int, perms: MutableList<String>) {
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()

View File

@@ -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<ActivityUserInfoModifyBinding>(),
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<ActivityUserInfoModifyBin
userId = intent.getLongExtra("userId", 0)
}
var pickMedia : ActivityResultLauncher<PickVisualMediaRequest>?=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<ActivityUserInfoModifyBin
private fun initData(userInfo: UserInfo?) {
if (null != userInfo) {
ImageLoadUtils.loadAvatar(if (!TextUtils.isEmpty(userInfo.newAvatar)) userInfo.newAvatar else userInfo.avatar, binding.civAvatar)
ImageLoadUtils.loadAvatar(
if (!TextUtils.isEmpty(userInfo.newAvatar)) userInfo.newAvatar else userInfo.avatar,
binding.civAvatar
)
binding.tvAvatarAuditing.visibility = if (userInfo.isReview) View.VISIBLE else View.GONE
binding.ivAvatarAuditing.visibility = if (userInfo.isReview) View.VISIBLE else View.GONE
val birth = TimeUtil.getChinaDateTimeString(userInfo.birth, "yyyy-MM-dd")
@@ -170,8 +139,8 @@ class UserInfoModifyActivity : BaseViewBindingActivity<ActivityUserInfoModifyBin
//cp 设置获取
UserModel.get().getUserInfoDetail(userId).compose(bindToLifecycle()).doOnSuccess {
setSwitchView(binding.swCpShow,it?.data?.relationUserVO?.showCpAvatar?:false)
setSwitchView(binding.swCpAnim,it?.data?.relationUserVO?.showCpAnim?:false)
setSwitchView(binding.swCpShow, it?.data?.relationUserVO?.showCpAvatar ?: false)
setSwitchView(binding.swCpAnim, it?.data?.relationUserVO?.showCpAnim ?: false)
}.subscribe()
}
}
@@ -259,6 +228,7 @@ class UserInfoModifyActivity : BaseViewBindingActivity<ActivityUserInfoModifyBin
}
selectAvatarType()
}
R.id.tv_birth -> {
if (mUserInfo != null) {
var year = TimeUtils.getYear(
@@ -283,21 +253,25 @@ class UserInfoModifyActivity : BaseViewBindingActivity<ActivityUserInfoModifyBin
show(supportFragmentManager, "DATEPICKER_TAG_1")
}
}
R.id.tv_nick -> 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<ActivityUserInfoModifyBin
setAction {
val find = areaList.find { data -> data.name == it }
if (find != null) {
reportArea(it,find.id)
reportArea(it, find.id)
}
}
}.show(this@UserInfoModifyActivity)
@@ -332,32 +306,34 @@ class UserInfoModifyActivity : BaseViewBindingActivity<ActivityUserInfoModifyBin
}
})
}
R.id.swCpAnim -> {
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<ActivityUserInfoModifyBin
}
}
private fun reportArea(area: String, id:Long) {
private fun reportArea(area: String, id: Long) {
binding.tvArea.text = area
dialogManager.showProgressDialog(
this@UserInfoModifyActivity,
@@ -389,50 +365,6 @@ class UserInfoModifyActivity : BaseViewBindingActivity<ActivityUserInfoModifyBin
})
}
override fun onRequestPermissionsResult(
requestCode: Int, permissions: Array<out String>, grantResults: IntArray
) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults)
EasyPermissions.onRequestPermissionsResult(requestCode, permissions, grantResults, this)
}
override fun onPermissionsGranted(requestCode: Int, perms: MutableList<String>) {
if (requestCode == PERMISSION_CODE_STORAGE) {
checkStoragePermission()
}
}
override fun onPermissionsDenied(requestCode: Int, perms: MutableList<String>) {
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<ButtonItem>()
@@ -457,31 +389,7 @@ class UserInfoModifyActivity : BaseViewBindingActivity<ActivityUserInfoModifyBin
}
private fun checkStoragePermission() {
val fileWith = if (isGif)".gif" else ".jpg"
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()}$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<ActivityUserInfoModifyBin
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) {
Method.NICK -> {
data?.let {
@@ -511,6 +417,7 @@ class UserInfoModifyActivity : BaseViewBindingActivity<ActivityUserInfoModifyBin
.subscribe(userInfoUpdateObserver)
}
}
Method.DESC -> {
data?.let {
dialogManager.showProgressDialog(
@@ -526,6 +433,7 @@ class UserInfoModifyActivity : BaseViewBindingActivity<ActivityUserInfoModifyBin
.subscribe(userInfoUpdateObserver)
}
}
Method.PHOTO -> {
data?.let {
val isChanged =
@@ -534,29 +442,32 @@ class UserInfoModifyActivity : BaseViewBindingActivity<ActivityUserInfoModifyBin
.subscribe(userInfoUpdateObserver)
}
}
REQUEST_CODE_OPEN_PHOTO_PROVIDER -> 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 (MyUriUtils.isGif(context, uri)) {
val isCopy = MyUriUtils.copyFileToUrl(this, uri, mUri!!)
if (isCopy) {
onActivityResult(UCrop.REQUEST_CROP,RESULT_OK,null)
onActivityResult(UCrop.REQUEST_CROP, RESULT_OK, null)
}
}else{
} 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()

View File

@@ -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<PickVisualMediaRequest>?=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<out String>, grantResults: IntArray
) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults)
EasyPermissions.onRequestPermissionsResult(requestCode, permissions, grantResults, this)
}
override fun onPermissionsGranted(requestCode: Int, perms: MutableList<String>) {
if (requestCode == PERMISSION_CODE_STORAGE) {
checkStoragePermission()
}
}
override fun onPermissionsDenied(requestCode: Int, perms: MutableList<String>) {
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()

View File

@@ -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<IPublishView, PublishPresenter>
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<IPublishView, PublishPresen
private Job mJob = null;
private ActivityResultLauncher<PickVisualMediaRequest> pickMedia;
public static void start(DialogManager manager, long worldId) {
if (beforeStart(manager)) {
return;
@@ -194,70 +170,6 @@ public class PublishActivity extends BaseMvpActivity<IPublishView, PublishPresen
// }
rlChooseGroup.setVisibility(View.GONE);
flGroup.setVisibility(View.GONE);
//todo do photoPick
pickMedia = registerForActivityResult(new ActivityResultContracts.PickVisualMedia(), new ActivityResultCallback<Uri>() {
@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<String> pathList = new ArrayList<>();
pathList.add(file.getPath());
mJob = PhotoCompressUtil.compress(PublishActivity.this, pathList,
PhotoCompressUtil.getCompressCachePath("publish")
, new PhotosCompressCallback() {
@Override
public void onSuccess(@NonNull ArrayList<String> compressedImgList) {
List<CustomItem> pathResult = new ArrayList<>();
for (int i = 0; i < compressedImgList.size(); i++) {
if (i < pathList.size()) {
List<String> 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<IPublishView, PublishPresen
}
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == REQUEST_CODE_STORAGE) {
checkStoragePermission();
} else if (resultCode == RESULT_OK) {
switch (requestCode) {
case REQUEST_CODE_OPEN_PHOTO_PROVIDER:
if (data == null) {
return;
}
PhotoProvider.getResultPathListAsync(data, new Function1<List<? extends Photo>, Unit>() {
@Override
public Unit invoke(List<? extends Photo> list) {
if (list.isEmpty()) {
return null;
} else {
if (mJob != null) {
mJob.cancel(null);
}
ArrayList<String> 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<String> compressedImgList) {
List<CustomItem> 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<CustomItem> 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<CustomItem> 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<IPublishView, PublishPresen
StatusBarUtil.StatusBarLightMode(this);
}
@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<String> perms) {
if (requestCode == PERMISSION_CODE_STORAGE) {
checkStoragePermission();
}
}
@Override
public void onPermissionsDenied(int requestCode, @NonNull List<String> 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() {}
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;
}
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<String> pathList = new ArrayList<>();
pathList.add(file.getPath());
mJob = PhotoCompressUtil.compress(PublishActivity.this, pathList,
PhotoCompressUtil.getCompressCachePath("publish")
, new PhotosCompressCallback() {
@Override
public void doOkAction() {
SPUtils.putBoolean(ConstantsLib.Key.Permissions_Img,true);
pickMedia.launch(new PickVisualMediaRequest.Builder().setMediaType(ActivityResultContracts.PickVisualMedia.ImageOnly.INSTANCE).build());
public void onSuccess(@NonNull ArrayList<String> compressedImgList) {
List<CustomItem> pathResult = new ArrayList<>();
for (int i = 0; i < compressedImgList.size(); i++) {
if (i < pathList.size()) {
List<String> 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))));
}
});
}
}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
);
}
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;
}
}
}

View File

@@ -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()
}
fun copyFileToUrl(context: Context, uri: Uri,outUri:Uri) : Boolean{
}
} catch (e: Exception) {
}
return size
}
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<String>?{
fun getFileInfo(file: File): MutableList<String>? {
var width = 0
var height = 0
var minType = "image/jpeg"
var data : MutableList<String> ?= null
var data: MutableList<String>? = 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)
}

View File

@@ -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,15 +71,14 @@ abstract class PickImageActionNew protected constructor(
override fun onFail(e: Throwable) {
SingleToastUtil.showToastShort(R.string.picker_image_error)
}
})
}
}
}
}
}
}
}
}
}
}
/**
@@ -94,10 +86,47 @@ abstract class PickImageActionNew protected constructor(
*/
private fun sendImageAfterSelfImagePicker(compressedImgList: List<String>) {
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
}
}

View File

@@ -1,74 +1,88 @@
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<PickVisualMediaRequest>?=null
var pickMedia: ActivityResultLauncher<PickVisualMediaRequest>? = null
var pickMediaForDocument: ActivityResultLauncher<Array<String>>? = 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<Photo>()
val data = Intent()
resultList.add(Photo(file.path))
data.putParcelableArrayListExtra(EasyPhotos.RESULT_PHOTOS, resultList)
setResult(RESULT_OK, data)
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)
}
var isFirst = true
var dialog : EasyAlertDialog ?=null
override fun onResume() {
super.onResume()
if (!isFirst) {
finish()
return
}
if (!SPUtils.getBoolean(ConstantsLib.Key.Permissions_Img,false)){
checkStoragePermission()
}
private fun checkStoragePermission() {
if (Build.VERSION.SDK_INT >= 29) {
if (!SPUtils.getBoolean(ConstantsLib.Key.Permissions_Img, false)) {
dialog = EasyAlertDialogHelper.createOkCancelDiolag(
this,
null,
@@ -85,24 +99,62 @@ class NimPhotoPickActivity : AppCompatActivity() {
}
override fun doOkAction() {
SPUtils.putBoolean(ConstantsLib.Key.Permissions_Img,true)
pickMedia?.launch(PickVisualMediaRequest(ActivityResultContracts.PickVisualMedia.ImageOnly))
SPUtils.putBoolean(ConstantsLib.Key.Permissions_Img, true)
PickVisualMediaRequest(
ActivityResultContracts.PickVisualMedia.SingleMimeType(
mMediaType
)
)
}
})
if (dialog?.isShowing == false) {
dialog?.show()
}
}else{
} else {
pickMedia?.launch(PickVisualMediaRequest(ActivityResultContracts.PickVisualMedia.ImageOnly))
}
isFirst = false
} 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))
}
}
}
private fun getName(context: Context, uri: Uri) : String?{
var fileName:String?=null
override fun onRequestPermissionsResult(
requestCode: Int,
permissions: Array<out String>,
grantResults: IntArray
) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults)
EasyPermissions.onRequestPermissionsResult(requestCode, permissions, grantResults, this)
}
override fun onPermissionsDenied(requestCode: Int, perms: MutableList<String>) {
if (requestCode == PERMISSION_RESULT) {
ToastUtils.show(getString(R.string.no_permission))
}
}
override fun onPermissionsGranted(requestCode: Int, perms: MutableList<String>) {
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