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); getTakePhoto().onPickMultipleWithCrop(limit, options);
} }
private void checkPermissionAndStartCamera() {
//低版本授权检查
checkPermission(checkPermissionListener, R.string.ask_camera, android.Manifest.permission.CAMERA);
}
PermissionActivity.CheckPermListener checkPermissionListener = new PermissionActivity.CheckPermListener() { PermissionActivity.CheckPermListener checkPermissionListener = new PermissionActivity.CheckPermListener() {
@Override @Override

View File

@@ -1,16 +1,12 @@
package com.chwl.app.avroom.activity; package com.chwl.app.avroom.activity;
import android.Manifest;
import android.annotation.SuppressLint; import android.annotation.SuppressLint;
import android.app.TimePickerDialog;
import android.content.Context; import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.graphics.Bitmap; import android.graphics.Bitmap;
import android.net.Uri; import android.net.Uri;
import android.os.Build;
import android.os.Bundle; import android.os.Bundle;
import android.provider.Settings;
import android.text.SpannableString; import android.text.SpannableString;
import android.text.TextUtils; import android.text.TextUtils;
import android.view.View; import android.view.View;
@@ -18,49 +14,21 @@ import android.widget.CompoundButton;
import android.widget.ImageView; import android.widget.ImageView;
import android.widget.RelativeLayout; 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.NonNull;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
import androidx.core.content.ContextCompat; import androidx.core.content.ContextCompat;
import androidx.databinding.DataBindingUtil; 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.R;
import com.chwl.app.application.App;
import com.chwl.app.avroom.dialog.SelectLabelDialog; 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.presenter.RoomSettingPresenter;
import com.chwl.app.avroom.view.IRoomSettingView; import com.chwl.app.avroom.view.IRoomSettingView;
import com.chwl.app.avroom.widget.EditRoomTitleDialog; import com.chwl.app.avroom.widget.EditRoomTitleDialog;
import com.chwl.app.base.BaseMvpActivity; 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.common.widget.dialog.DialogManager;
import com.chwl.app.databinding.ActivityRoomSettingBinding; import com.chwl.app.databinding.ActivityRoomSettingBinding;
import com.chwl.app.ui.webview.CommonWebViewActivity; 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.AuthModel;
import com.chwl.core.auth.event.KickOutEvent; import com.chwl.core.auth.event.KickOutEvent;
import com.chwl.core.bean.RoomQueueInfo; 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.CustomAttachment;
import com.chwl.core.im.custom.bean.RoomNoticeAttachment; import com.chwl.core.im.custom.bean.RoomNoticeAttachment;
import com.chwl.core.kick.KickModel; 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.AvRoomModel;
import com.chwl.core.room.model.RoomSettingModel; import com.chwl.core.room.model.RoomSettingModel;
import com.chwl.core.room.queue.bean.MicMemberInfo; 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.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.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.net.rxnet.callback.CallBack;
import com.chwl.library.utils.CommonUtils; import com.chwl.library.utils.CommonUtils;
import com.chwl.library.utils.JavaUtil; import com.chwl.library.utils.JavaUtil;
import com.chwl.library.utils.ListUtils; import com.chwl.library.utils.ListUtils;
import com.chwl.library.utils.ResUtil; import com.chwl.library.utils.ResUtil;
import com.chwl.library.utils.SingleToastUtil;
import com.chwl.library.utils.codec.DESUtils; 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 com.yalantis.ucrop.UCrop;
import org.greenrobot.eventbus.EventBus; import org.greenrobot.eventbus.EventBus;
import org.greenrobot.eventbus.Subscribe; import org.greenrobot.eventbus.Subscribe;
import org.greenrobot.eventbus.ThreadMode; import org.greenrobot.eventbus.ThreadMode;
import java.io.FileNotFoundException;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Objects; import java.util.Objects;
@@ -113,7 +94,7 @@ import kotlinx.coroutines.Job;
* @date 2017/9/26 * @date 2017/9/26
*/ */
@CreatePresenter(RoomSettingPresenter.class) @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 managerLayout;
private RelativeLayout blackLayout; private RelativeLayout blackLayout;
@@ -133,13 +114,12 @@ public class RoomSettingActivity extends BaseMvpActivity<IRoomSettingView, RoomS
private ActivityRoomSettingBinding binding; private ActivityRoomSettingBinding binding;
private ActivityResultLauncher<PickVisualMediaRequest> pickMedia;
private Uri mUri; private Uri mUri;
private Job mJob; private Job mJob;
private final int PERMISSION_CODE_STORAGE = 12; private final int PERMISSION_CODE_STORAGE = 12;
private final int REQUEST_CODE_OPEN_PHOTO_PROVIDER = 111; // 从相册中选择 private final int REQUEST_CODE_OPEN_PHOTO_PROVIDER = 111; // 从相册中选择
private final int REQUEST_CODE_STORAGE = 42; private final int REQUEST_CODE_STORAGE = 42;
private final int MAX_BITMAP_SIZE = 100 * 1024 * 1024; // 剪切的图片最大为100 MB private final int MAX_BITMAP_SIZE = 100 * 1024 * 1024; // 剪切的图片最大为100 MB
public static void start(Context context) { public static void start(Context context) {
Intent intent = new Intent(context, RoomSettingActivity.class); Intent intent = new Intent(context, RoomSettingActivity.class);
@@ -178,23 +158,13 @@ public class RoomSettingActivity extends BaseMvpActivity<IRoomSettingView, RoomS
binding.layoutSingleRoomSort.setVisibility( binding.layoutSingleRoomSort.setVisibility(
AvRoomDataManager.get().isRoomOwner() && AvRoomDataManager.get().isSingleRoom() AvRoomDataManager.get().isRoomOwner() && AvRoomDataManager.get().isSingleRoom()
? View.VISIBLE : View.GONE); ? 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改动 //调用更改房间信息接口后会发消息ROOM_INFO_UPDATE在此处接收ui改动
IMNetEaseManager.get().getChatRoomEventObservable() IMNetEaseManager.get().getChatRoomEventObservable()
.compose(bindToLifecycle()) .compose(bindToLifecycle())
.filter(roomEvent -> roomEvent.getEvent() == RoomEvent.ROOM_INFO_UPDATE) .filter(roomEvent -> roomEvent.getEvent() == RoomEvent.ROOM_INFO_UPDATE)
.subscribe(roomEvent -> updateRoomInfoView()); .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 @Override
@@ -256,7 +226,7 @@ public class RoomSettingActivity extends BaseMvpActivity<IRoomSettingView, RoomS
} }
} }
private void loadGiftValueState(){ private void loadGiftValueState() {
if (SuperAdminUtil.isSuperAdmin()) { if (SuperAdminUtil.isSuperAdmin()) {
binding.layoutGiftValue.setVisibility(View.GONE); binding.layoutGiftValue.setVisibility(View.GONE);
return; return;
@@ -318,7 +288,7 @@ public class RoomSettingActivity extends BaseMvpActivity<IRoomSettingView, RoomS
} }
private void save(final String name, final String pwd, String label) { 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 isUpdateGiftEffect 是否改动了礼物特效
* @param giftEffect 是否开启礼物特效 * @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) { boolean giftEffect) {
String desc = null; String desc = null;
getDialogManager().showProgressDialog(this, ResUtil.getString(R.string.avroom_activity_roomsettingactivity_06)); 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()) { 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().getCurrentUid(),
AuthModel.get().getTicket(), AuthModel.get().getTicket(),
giftEffect, giftEffect,
@@ -369,7 +339,7 @@ public class RoomSettingActivity extends BaseMvpActivity<IRoomSettingView, RoomS
.compose(bindToLifecycle()) .compose(bindToLifecycle())
.subscribe(observer); .subscribe(observer);
} else if (AvRoomDataManager.get().isRoomAdmin()) { } 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().getCurrentUid(),
AuthModel.get().getTicket(), AuthModel.get().getTicket(),
giftEffect, giftEffect,
@@ -462,13 +432,13 @@ public class RoomSettingActivity extends BaseMvpActivity<IRoomSettingView, RoomS
@Override @Override
public void onOk() { public void onOk() {
save(null,null,null, null, true, false); save(null, null, null, null, true, false);
} }
}); });
return; return;
} }
//开启礼物特效 //开启礼物特效
save(null,null, null, null, true, true); save(null, null, null, null, true, true);
break; break;
case R.id.switch_screen: case R.id.switch_screen:
RoomInfo roomInfo = AvRoomDataManager.get().mCurrentRoomInfo; RoomInfo roomInfo = AvRoomDataManager.get().mCurrentRoomInfo;
@@ -618,70 +588,11 @@ public class RoomSettingActivity extends BaseMvpActivity<IRoomSettingView, RoomS
} }
private void checkStoragePermission() { private void checkStoragePermission() {
if (Build.VERSION.SDK_INT >= 29){ PhotoPickActivity.start(this, PhotoPickActivity.IMG);
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();
}
} }
private void switchGiftValue() {
private void switchGiftValue(){
if (AvRoomDataManager.get().isCpRoom()) { if (AvRoomDataManager.get().isCpRoom()) {
return; return;
} }
@@ -1024,18 +935,17 @@ public class RoomSettingActivity extends BaseMvpActivity<IRoomSettingView, RoomS
@Override @Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) { protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data); super.onActivityResult(requestCode, resultCode, data);
if (requestCode == REQUEST_CODE_STORAGE) { if (resultCode == RESULT_OK) {
checkStoragePermission();
} else if (resultCode == RESULT_OK) {
switch (requestCode) { switch (requestCode) {
case REQUEST_CODE_OPEN_PHOTO_PROVIDER: case PhotoPickActivity.PICK_ACT_RESULT:
if (data != null) { if (data != null) {
List<Photo> photos = PhotoProvider.getResultPhotoList(data); Uri uri = data.getData();
if (photos != null && !photos.isEmpty()) { mUri = Uri.parse("file://" + FileHelper.getRootCacheDir().getPath() + "/" + System.nanoTime() + ".jpg");
Photo photo = photos.get(0); if (uri != null && mUri != null) {
crop(photo.uri, photo.size, mUri); boolean isCopy = MyUriUtils.INSTANCE.copyFileToUrl(this, uri, mUri);
} else { if (isCopy) {
toast(R.string.empty_data); crop(mUri, 1, mUri);
}
} }
} }
break; break;
@@ -1064,6 +974,7 @@ public class RoomSettingActivity extends BaseMvpActivity<IRoomSettingView, RoomS
} }
}); });
} }
@Override @Override
public void onFail(@NonNull Throwable e) { public void onFail(@NonNull Throwable e) {
toast(e.getMessage()); toast(e.getMessage());
@@ -1095,7 +1006,7 @@ public class RoomSettingActivity extends BaseMvpActivity<IRoomSettingView, RoomS
UCrop.Options options = new UCrop.Options(); UCrop.Options options = new UCrop.Options();
options.setCompressionQuality(100); options.setCompressionQuality(100);
options.setShowCropGrid(false); 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.setStatusBarColor(ContextCompat.getColor(App.gContext, android.R.color.black));
options.setHideBottomControls(true); options.setHideBottomControls(true);
options.setCompressionFormat(Bitmap.CompressFormat.JPEG); options.setCompressionFormat(Bitmap.CompressFormat.JPEG);
@@ -1107,12 +1018,12 @@ public class RoomSettingActivity extends BaseMvpActivity<IRoomSettingView, RoomS
} }
private void onUpload(String url) { private void onUpload(String url) {
LogUtils.d(" 请求接口 更新房间封面 url = "+url); LogUtils.d(" 请求接口 更新房间封面 url = " + url);
save(null,url,null,null,false,roomInfo.isHasAnimationEffect()); save(null, url, null, null, false, roomInfo.isHasAnimationEffect());
} }
private void onUploadFail(Throwable throwable) { 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(); 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.BaseQuickAdapter;
import com.chad.library.adapter.base.BaseViewHolder; 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.R;
import com.chwl.app.UIHelper; import com.chwl.app.UIHelper;
import com.chwl.app.avroom.activity.CreatePKActivity; import com.chwl.app.avroom.activity.CreatePKActivity;
import com.chwl.app.avroom.activity.RoomSettingActivity; 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.anotherroompk.RoomPKCreateActivity;
import com.chwl.app.avroom.giftvalue.GiftValueDialogUiHelper; import com.chwl.app.avroom.giftvalue.GiftValueDialogUiHelper;
import com.chwl.app.avroom.room_album.RoomAlbumActivity; import com.chwl.app.avroom.room_album.RoomAlbumActivity;
import com.chwl.app.avroom.singleroompk.SingleRoomPKCreateActivity; 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.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.ButtonItem;
import com.chwl.app.ui.widget.recyclerview.decoration.ColorDecoration; import com.chwl.app.ui.widget.recyclerview.decoration.ColorDecoration;
import com.chwl.app.ui.widget.recyclerview.layoutmanager.FullyGridLayoutManager; import com.chwl.app.ui.widget.recyclerview.layoutmanager.FullyGridLayoutManager;
import com.chwl.app.vip.dialog.VipBroadcastDialog; import com.chwl.app.vip.dialog.VipBroadcastDialog;
import com.chwl.app.room_chat.activity.RoomInviteFansActivity;
import com.chwl.core.XConstants; import com.chwl.core.XConstants;
import com.chwl.core.auth.AuthModel; import com.chwl.core.auth.AuthModel;
import com.chwl.core.im.custom.bean.RoomPkBean; 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.BeanObserver;
import com.chwl.core.utils.net.DontWarnObserver; import com.chwl.core.utils.net.DontWarnObserver;
import com.chwl.core.utils.net.RxHelper; 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.ResUtil;
import com.chwl.library.utils.SingleToastUtil; 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; import org.greenrobot.eventbus.EventBus;
@@ -78,11 +78,12 @@ public class RoomOperationDialog extends BottomSheetDialog {
private OptAdapter optAdapter; private OptAdapter optAdapter;
private OnActionListener onActionListener; private OnActionListener onActionListener;
private CallBack callBack; private CallBack callBack;
public void setCallBack(CallBack callBack) { public void setCallBack(CallBack callBack) {
this.callBack = callBack; this.callBack = callBack;
} }
public interface CallBack{ public interface CallBack {
void onCLick(int Type); void onCLick(int Type);
} }
@@ -172,7 +173,6 @@ public class RoomOperationDialog extends BottomSheetDialog {
R.drawable.ic_room_opt_in_pk; R.drawable.ic_room_opt_in_pk;
optAdapter.addData(new OptAction(icon, str, () -> { optAdapter.addData(new OptAction(icon, str, () -> {
if (AvRoomDataManager.get().isDatingMode()) { if (AvRoomDataManager.get().isDatingMode()) {
SingleToastUtil.showToast(ResUtil.getString(R.string.avroom_dialog_roomoperationdialog_01)); SingleToastUtil.showToast(ResUtil.getString(R.string.avroom_dialog_roomoperationdialog_01));
@@ -189,7 +189,7 @@ public class RoomOperationDialog extends BottomSheetDialog {
} }
/** /**
* 跨房PK * 跨房PK
* *
* @param optAdapter * @param optAdapter
*/ */
@@ -215,7 +215,6 @@ public class RoomOperationDialog extends BottomSheetDialog {
R.drawable.ic_room_opt_another_pk_open; R.drawable.ic_room_opt_another_pk_open;
optAdapter.addData(new OptAction(icon, str, () -> { optAdapter.addData(new OptAction(icon, str, () -> {
if (AvRoomDataManager.get().isDatingMode()) { if (AvRoomDataManager.get().isDatingMode()) {
SingleToastUtil.showToast(ResUtil.getString(R.string.avroom_dialog_roomoperationdialog_05)); SingleToastUtil.showToast(ResUtil.getString(R.string.avroom_dialog_roomoperationdialog_05));
@@ -268,7 +267,6 @@ public class RoomOperationDialog extends BottomSheetDialog {
String finalStr = str; String finalStr = str;
optAdapter.addData(new OptAction(icon, str, () -> { optAdapter.addData(new OptAction(icon, str, () -> {
if (pkBean != null && ResUtil.getString(R.string.avroom_dialog_roomoperationdialog_011).equals(finalStr)) { if (pkBean != null && ResUtil.getString(R.string.avroom_dialog_roomoperationdialog_011).equals(finalStr)) {
SingleRoomPKModel.INSTANCE SingleRoomPKModel.INSTANCE

View File

@@ -25,6 +25,7 @@ import com.chwl.app.ui.widget.magicindicator.buildins.commonnavigator.titles.Col
class RoomAlbumActivity : BaseViewBindingActivity<ActivityRoomAlbumBinding>() { class RoomAlbumActivity : BaseViewBindingActivity<ActivityRoomAlbumBinding>() {
val viewModel: RoomAlbumViewModel by viewModels() val viewModel: RoomAlbumViewModel by viewModels()
var loadDialog: UploadRoomAlbumDialogFragment? = null
override fun init() { override fun init() {
initTitleBar(getString(R.string.room_album)) initTitleBar(getString(R.string.room_album))
@@ -97,13 +98,19 @@ class RoomAlbumActivity : BaseViewBindingActivity<ActivityRoomAlbumBinding>() {
} }
binding.tvUpload.setOnClickListener { binding.tvUpload.setOnClickListener {
UploadRoomAlbumDialogFragment().show( loadDialog = UploadRoomAlbumDialogFragment()
loadDialog?.show(
supportFragmentManager, supportFragmentManager,
UploadRoomAlbumDialogFragment::class.java.simpleName 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 { companion object {
@JvmStatic @JvmStatic
fun start(context: Context) { fun start(context: Context) {

View File

@@ -1,45 +1,33 @@
package com.chwl.app.avroom.room_album package com.chwl.app.avroom.room_album
import android.Manifest
import android.annotation.SuppressLint import android.annotation.SuppressLint
import android.app.Activity import android.app.Activity
import android.app.AlertDialog
import android.app.Dialog import android.app.Dialog
import android.content.Intent import android.content.Intent
import android.os.Build
import android.os.Bundle import android.os.Bundle
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.View import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import android.view.WindowManager 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.core.content.ContextCompat
import androidx.fragment.app.activityViewModels import androidx.fragment.app.activityViewModels
import androidx.recyclerview.widget.GridLayoutManager import androidx.recyclerview.widget.GridLayoutManager
import com.chad.library.adapter.base.BaseMultiItemQuickAdapter import com.chad.library.adapter.base.BaseMultiItemQuickAdapter
import com.chad.library.adapter.base.BaseViewHolder 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.R
import com.chwl.app.base.PhotoPickActivity
import com.chwl.app.common.widget.dialog.DialogManager import com.chwl.app.common.widget.dialog.DialogManager
import com.chwl.app.databinding.DialogRoomAlbumUploadBinding import com.chwl.app.databinding.DialogRoomAlbumUploadBinding
import com.chwl.app.ui.utils.ImageLoadUtilsV2 import com.chwl.app.ui.utils.ImageLoadUtilsV2
import com.chwl.app.ui.widget.recyclerview.decoration.GridSpacingItemNewDecoration import com.chwl.app.ui.widget.recyclerview.decoration.GridSpacingItemNewDecoration
import com.chwl.core.Constants import com.chwl.core.Constants
import com.chwl.core.gift.bean.GiftInfo import com.chwl.core.gift.bean.GiftInfo
import com.chwl.core.utils.DialogUtil
import com.chwl.core.utils.MyUriUtils 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.compress
import com.chwl.library.common.util.PhotoCompressUtil.getCompressCachePath import com.chwl.library.common.util.PhotoCompressUtil.getCompressCachePath
import com.chwl.library.common.util.PhotosCompressCallback import com.chwl.library.common.util.PhotosCompressCallback
import com.chwl.library.common.util.SPUtils import com.google.android.material.bottomsheet.BottomSheetDialogFragment
import com.chwl.library.constants.ConstantsLib import com.hjq.toast.ToastUtils
import com.chwl.library.easypermisssion.EasyPermissions
import com.netease.nim.uikit.common.ui.dialog.EasyAlertDialogHelper
import kotlinx.coroutines.Job import kotlinx.coroutines.Job
class UploadRoomAlbumDialogFragment : BottomSheetDialogFragment() { class UploadRoomAlbumDialogFragment : BottomSheetDialogFragment() {
@@ -54,7 +42,6 @@ class UploadRoomAlbumDialogFragment : BottomSheetDialogFragment() {
private var unlockedGift: GiftInfo? = null private var unlockedGift: GiftInfo? = null
private var compressJob: Job? = null private var compressJob: Job? = null
var pickMedia : ActivityResultLauncher<PickVisualMediaRequest>?=null
val dialogManager by lazy { val dialogManager by lazy {
DialogManager(context) DialogManager(context)
} }
@@ -64,21 +51,6 @@ class UploadRoomAlbumDialogFragment : BottomSheetDialogFragment() {
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
setStyle(STYLE_NO_TITLE, R.style.ErbanBottomSheetDialog) 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 { override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
@@ -243,37 +215,7 @@ class UploadRoomAlbumDialogFragment : BottomSheetDialogFragment() {
} }
private fun checkStoragePermission() { private fun checkStoragePermission() {
PhotoPickActivity.start(requireActivity(), PhotoPickActivity.IMG)
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
)
}
}
} }
@Deprecated("Deprecated in Java") @Deprecated("Deprecated in Java")
@@ -282,10 +224,17 @@ class UploadRoomAlbumDialogFragment : BottomSheetDialogFragment() {
if (resultCode != Activity.RESULT_OK) { if (resultCode != Activity.RESULT_OK) {
return return
} }
if (requestCode == 200) {
PhotoProvider.getResultPathListAsync(data) { if (requestCode == PhotoPickActivity.PICK_ACT_RESULT) {
it?.mapNotNull { it.path }?.let { paths -> val uri = data?.data
compressPhotos(paths.toMutableList()) 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); 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() { private void takePhoto() {
String mCameraCapturingName = CAMERA_PREFIX + System.currentTimeMillis() + ".jpg"; 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); 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(); PermissionActivity.CheckPermListener checkPermissionListener = () -> takePhoto();

View File

@@ -1,24 +1,169 @@
package com.chwl.app.base 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.os.Bundle
import android.provider.Settings
import androidx.activity.ComponentActivity import androidx.activity.ComponentActivity
import androidx.activity.result.ActivityResultLauncher import androidx.activity.result.ActivityResultLauncher
import androidx.activity.result.PickVisualMediaRequest import androidx.activity.result.PickVisualMediaRequest
import androidx.activity.result.contract.ActivityResultContracts
import com.chwl.app.R 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";
const val IMG = "image/*"
override fun onCreate(savedInstanceState: Bundle?) { const val GIF = "image/gif"
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_photo_pick)
} }
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.IReportConstants
import com.chwl.app.application.ReportManager import com.chwl.app.application.ReportManager
import com.chwl.app.avroom.activity.AVRoomActivity 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.BaseActivity
import com.chwl.app.base.BaseFragment import com.chwl.app.base.BaseFragment
import com.chwl.app.base.PhotoPickActivity
import com.chwl.app.databinding.FragmentMeBinding import com.chwl.app.databinding.FragmentMeBinding
import com.chwl.app.home.HomeViewModel import com.chwl.app.home.HomeViewModel
import com.chwl.app.home.MeViewModel 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.im.RouterHandler
import com.chwl.app.ui.relation.AttentionListActivity import com.chwl.app.ui.relation.AttentionListActivity
import com.chwl.app.ui.relation.FansListActivity 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.utils.ImageLoadUtils
import com.chwl.app.ui.wallet.WalletActivity import com.chwl.app.ui.wallet.WalletActivity
import com.chwl.app.ui.webview.CommonWebViewActivity import com.chwl.app.ui.webview.CommonWebViewActivity
import com.chwl.app.ui.widget.UserInfoDialog
import com.chwl.app.view.GenderAgeTextView import com.chwl.app.view.GenderAgeTextView
import com.chwl.app.vip.VipCenterActivity import com.chwl.app.vip.VipCenterActivity
import com.chwl.app.vip.VipSettingActivity
import com.chwl.app.vip.VipViewModel import com.chwl.app.vip.VipViewModel
import com.chwl.app.vip.dialog.VipUpgradeDialog
import com.chwl.core.auth.AuthModel import com.chwl.core.auth.AuthModel
import com.chwl.core.gift.bean.BoomMsgAwardBean
import com.chwl.core.initial.InitialModel import com.chwl.core.initial.InitialModel
import com.chwl.core.level.UserLevelVo import com.chwl.core.level.UserLevelVo
import com.chwl.core.manager.IMNetEaseManager 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.bean.UserInfo
import com.chwl.core.user.event.LoginUserInfoUpdateEvent import com.chwl.core.user.event.LoginUserInfoUpdateEvent
import com.chwl.core.utils.CoreLogger import com.chwl.core.utils.CoreLogger
import com.chwl.core.utils.WLog
import com.chwl.core.vip.bean.VipInfo import com.chwl.core.vip.bean.VipInfo
import com.example.lib_utils.ktx.singleClick import com.example.lib_utils.ktx.singleClick
import org.greenrobot.eventbus.EventBus import org.greenrobot.eventbus.EventBus
import org.greenrobot.eventbus.Subscribe import org.greenrobot.eventbus.Subscribe
import org.greenrobot.eventbus.ThreadMode import org.greenrobot.eventbus.ThreadMode
import java.util.*
/** /**
* @description: 我的 界面 * @description: 我的 界面
@@ -110,7 +103,7 @@ class MeFragment : BaseFragment(), View.OnClickListener {
mCenterAdapter.setOnItemClickListener { adapter, view, position -> mCenterAdapter.setOnItemClickListener { adapter, view, position ->
mCenterAdapter.getItem(position)?.let { 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 if (diamondList?.contains(userInfo.erbanNo) == true
|| giftList?.contains(userInfo.erbanNo) == true || giftList?.contains(userInfo.erbanNo) == true
|| levelSep >= (initInfo?.giveDiamondExperLevel ?: 0) || levelSep >= (initInfo?.giveDiamondExperLevel ?: 0)
|| levelSep >= (initInfo?.giveGiftExperLevel ?: 0)) { || levelSep >= (initInfo?.giveGiftExperLevel ?: 0)
) {
meViewModel.updateDonationMenuVisible(true) meViewModel.updateDonationMenuVisible(true)
} else { } else {
meViewModel.updateDonationMenuVisible(false) meViewModel.updateDonationMenuVisible(false)
@@ -326,7 +320,7 @@ class MeFragment : BaseFragment(), View.OnClickListener {
override fun onClick(v: View) { override fun onClick(v: View) {
when (v.id) { 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) } mUserInfo?.let { UIHelper.showUserInfoAct(mContext, it.uid) }
} }
// //
@@ -377,7 +371,7 @@ class MeFragment : BaseFragment(), View.OnClickListener {
R.id.tv_user_name -> { R.id.tv_user_name -> {
//todo do 测试按钮 //todo do 测试按钮
if (BuildConfig.DEBUG) { 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.ktx.singleClick
import com.example.lib_utils.spannable.SpannableTextBuilder import com.example.lib_utils.spannable.SpannableTextBuilder
//todo do VIP 送礼飘屏
class GiftNotify(context: Context) : BaseFloatView(context) { class GiftNotify(context: Context) : BaseFloatView(context) {
private val view = TextView(context) private val view = TextView(context)

View File

@@ -1,37 +1,24 @@
package com.chwl.app.ui.feedback package com.chwl.app.ui.feedback
import android.Manifest
import android.annotation.SuppressLint import android.annotation.SuppressLint
import android.content.Intent import android.content.Intent
import android.os.Build
import android.os.Bundle import android.os.Bundle
import android.widget.ImageView.ScaleType 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.activity.viewModels
import androidx.lifecycle.Lifecycle import androidx.lifecycle.Lifecycle
import androidx.lifecycle.lifecycleScope import androidx.lifecycle.lifecycleScope
import androidx.lifecycle.repeatOnLifecycle import androidx.lifecycle.repeatOnLifecycle
import com.chwl.app.R import com.chwl.app.R
import com.chwl.app.base.BaseViewBindingActivity import com.chwl.app.base.BaseViewBindingActivity
import com.chwl.app.base.PhotoPickActivity
import com.chwl.app.databinding.FeedbackActivityBinding import com.chwl.app.databinding.FeedbackActivityBinding
import com.chwl.app.ui.utils.load 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.file.FileModel
import com.chwl.core.home.bean.FeedbackTypeBean import com.chwl.core.home.bean.FeedbackTypeBean
import com.chwl.core.utils.DialogUtil
import com.chwl.core.utils.MyUriUtils 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.PhotoCompressUtil
import com.chwl.library.common.util.PhotosCompressCallback 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.ResUtil
import com.chwl.library.utils.SingleToastUtil
import com.example.lib_utils.SolveEditTextScrollClash import com.example.lib_utils.SolveEditTextScrollClash
import com.example.lib_utils.ktx.getColorById import com.example.lib_utils.ktx.getColorById
import com.example.lib_utils.ktx.setOnInputChangedListener 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.google.android.flexbox.JustifyContent
import com.hjq.toast.ToastUtils import com.hjq.toast.ToastUtils
import com.netease.nim.uikit.StatusBarUtil import com.netease.nim.uikit.StatusBarUtil
import com.netease.nim.uikit.common.ui.dialog.EasyAlertDialogHelper
import kotlinx.coroutines.Job import kotlinx.coroutines.Job
import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.flow.collectLatest
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
class FeedbackActivity : BaseViewBindingActivity<FeedbackActivityBinding>(), class FeedbackActivity : BaseViewBindingActivity<FeedbackActivityBinding>() {
EasyPermissions.PermissionCallbacks {
private val PERMISSION_CODE_STORAGE = 12 private val PERMISSION_CODE_STORAGE = 12
private val REQUEST_CODE_OPEN_PHOTO_PROVIDER = 111 // 从相册中选择 private val REQUEST_CODE_OPEN_PHOTO_PROVIDER = 111 // 从相册中选择
@@ -61,21 +46,11 @@ class FeedbackActivity : BaseViewBindingActivity<FeedbackActivityBinding>(),
private var imagePath: String? = null private var imagePath: String? = null
private var imageUrl: String? = null private var imageUrl: String? = null
var pickMedia : ActivityResultLauncher<PickVisualMediaRequest>?=null
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) 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() { override fun init() {
initWhiteTitleBar(ResUtil.getString(R.string.feedback_title)) initWhiteTitleBar(ResUtil.getString(R.string.feedback_title))
initView() initView()
@@ -243,83 +218,29 @@ class FeedbackActivity : BaseViewBindingActivity<FeedbackActivityBinding>(),
} }
} }
@SuppressLint("CheckResult")
private fun uploadImage(path: String, success: (String) -> Unit, failed: (Throwable?) -> Unit) { private fun checkStoragePermission() {
FileModel.get() PhotoPickActivity.start(this, PhotoPickActivity.IMG)
.uploadFile(path)
.compose(bindToLifecycle())
.subscribe { url: String?, throwable: Throwable? ->
if (url != null) {
success.invoke(url)
} else {
failed.invoke(throwable)
}
}
} }
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data) super.onActivityResult(requestCode, resultCode, data)
if (resultCode == RESULT_OK) { if (resultCode == RESULT_OK) {
if (requestCode == REQUEST_CODE_OPEN_PHOTO_PROVIDER) { if (requestCode == PhotoPickActivity.PICK_ACT_RESULT) {
if (data == null) { if (data == null) {
return return
} }
PhotoProvider.getResultPathListAsync(data) { list -> val uri = data.data
if (list.isNullOrEmpty()) { uri?.let {
SingleToastUtil.showToastShort(com.netease.nim.uikit.R.string.picker_image_error) val file = MyUriUtils.copyFile(this, uri)
return@getResultPathListAsync if (file != null) {
compressPhotos(mutableListOf(file.path))
} }
val paths = list.map { it.path }.toMutableList()
compressPhotos(paths)
} }
} }
} }
} }
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>) { private fun compressPhotos(paths: MutableList<String>) {
compressJob?.cancel(null) compressJob?.cancel(null)
compressJob = PhotoCompressUtil.compress( compressJob = PhotoCompressUtil.compress(
@@ -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 { override fun needSteepStateBar(): Boolean {
return true return true
} }
@@ -348,36 +283,6 @@ class FeedbackActivity : BaseViewBindingActivity<FeedbackActivityBinding>(),
StatusBarUtil.StatusBarLightMode(this) 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() { override fun onResume() {
super.onResume() super.onResume()

View File

@@ -1,25 +1,20 @@
package com.chwl.app.ui.user.activity package com.chwl.app.ui.user.activity
import android.Manifest
import android.annotation.SuppressLint import android.annotation.SuppressLint
import android.content.Intent import android.content.Intent
import android.graphics.Bitmap import android.graphics.Bitmap
import android.net.Uri import android.net.Uri
import android.os.Build
import android.os.Bundle import android.os.Bundle
import android.provider.Settings
import android.text.TextUtils import android.text.TextUtils
import android.view.View import android.view.View
import android.widget.ImageView 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.core.content.ContextCompat
import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.LinearLayoutManager
import com.chwl.app.R import com.chwl.app.R
import com.chwl.app.UIHelper import com.chwl.app.UIHelper
import com.chwl.app.application.App import com.chwl.app.application.App
import com.chwl.app.base.BaseViewBindingActivity import com.chwl.app.base.BaseViewBindingActivity
import com.chwl.app.base.PhotoPickActivity
import com.chwl.app.common.util.BitmapUtil import com.chwl.app.common.util.BitmapUtil
import com.chwl.app.constants.UserInfoConstants import com.chwl.app.constants.UserInfoConstants
import com.chwl.app.databinding.ActivityUserInfoModifyBinding 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.user.dialog.UserAreaDialog
import com.chwl.app.ui.utils.ImageLoadUtils import com.chwl.app.ui.utils.ImageLoadUtils
import com.chwl.app.ui.widget.ButtonItem 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.utils.RegexUtil
import com.chwl.app.vip.util.VipHelper import com.chwl.app.vip.util.VipHelper
import com.chwl.core.auth.AuthModel 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.UserInfo
import com.chwl.core.user.bean.UserPhoto import com.chwl.core.user.bean.UserPhoto
import com.chwl.core.utils.CoreLogger import com.chwl.core.utils.CoreLogger
import com.chwl.core.utils.DialogUtil
import com.chwl.core.utils.MyUriUtils import com.chwl.core.utils.MyUriUtils
import com.chwl.library.common.file.FileHelper 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.PhotoCompressCallback
import com.chwl.library.common.util.PhotoCompressUtil 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.ResUtil
import com.chwl.library.utils.TimeUtils import com.chwl.library.utils.TimeUtils
import com.example.lib_utils.ktx.getString import com.example.lib_utils.ktx.getString
import com.fourmob.datetimepicker.date.DatePickerDialog import com.fourmob.datetimepicker.date.DatePickerDialog
import com.hjq.toast.ToastUtils import com.hjq.toast.ToastUtils
import com.netease.nim.uikit.StatusBarUtil 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.netease.nim.uikit.common.util.sys.TimeUtil
import com.sleepbot.datetimepicker.time.RadialPickerLayout import com.sleepbot.datetimepicker.time.RadialPickerLayout
import com.sleepbot.datetimepicker.time.TimePickerDialog import com.sleepbot.datetimepicker.time.TimePickerDialog
@@ -76,8 +64,7 @@ import java.util.concurrent.TimeUnit
*/ */
class UserInfoModifyActivity : BaseViewBindingActivity<ActivityUserInfoModifyBinding>(), class UserInfoModifyActivity : BaseViewBindingActivity<ActivityUserInfoModifyBinding>(),
View.OnClickListener, View.OnClickListener,
TimePickerDialog.OnTimeSetListener, DatePickerDialog.OnDateSetListener, ImageClickListener, TimePickerDialog.OnTimeSetListener, DatePickerDialog.OnDateSetListener, ImageClickListener {
EasyPermissions.PermissionCallbacks {
private var datePickerDialog: DatePickerDialog? = null private var datePickerDialog: DatePickerDialog? = null
private var mUserInfo: UserInfo? = null private var mUserInfo: UserInfo? = null
private var userId: Long = 0 private var userId: Long = 0
@@ -108,32 +95,11 @@ class UserInfoModifyActivity : BaseViewBindingActivity<ActivityUserInfoModifyBin
userId = intent.getLongExtra("userId", 0) userId = intent.getLongExtra("userId", 0)
} }
var pickMedia : ActivityResultLauncher<PickVisualMediaRequest>?=null
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
UserModel.get().getUserInfo(userId).subscribe(userInfoUpdateObserver) UserModel.get().getUserInfo(userId).subscribe(userInfoUpdateObserver)
PhotoCompressUtil.clearCompressCache() 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) { override fun click(position: Int, userPhoto: UserPhoto, isOwner: Boolean) {
@@ -146,7 +112,10 @@ class UserInfoModifyActivity : BaseViewBindingActivity<ActivityUserInfoModifyBin
private fun initData(userInfo: UserInfo?) { private fun initData(userInfo: UserInfo?) {
if (null != 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.tvAvatarAuditing.visibility = if (userInfo.isReview) View.VISIBLE else View.GONE
binding.ivAvatarAuditing.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") val birth = TimeUtil.getChinaDateTimeString(userInfo.birth, "yyyy-MM-dd")
@@ -170,8 +139,8 @@ class UserInfoModifyActivity : BaseViewBindingActivity<ActivityUserInfoModifyBin
//cp 设置获取 //cp 设置获取
UserModel.get().getUserInfoDetail(userId).compose(bindToLifecycle()).doOnSuccess { UserModel.get().getUserInfoDetail(userId).compose(bindToLifecycle()).doOnSuccess {
setSwitchView(binding.swCpShow,it?.data?.relationUserVO?.showCpAvatar?:false) setSwitchView(binding.swCpShow, it?.data?.relationUserVO?.showCpAvatar ?: false)
setSwitchView(binding.swCpAnim,it?.data?.relationUserVO?.showCpAnim?:false) setSwitchView(binding.swCpAnim, it?.data?.relationUserVO?.showCpAnim ?: false)
}.subscribe() }.subscribe()
} }
} }
@@ -259,6 +228,7 @@ class UserInfoModifyActivity : BaseViewBindingActivity<ActivityUserInfoModifyBin
} }
selectAvatarType() selectAvatarType()
} }
R.id.tv_birth -> { R.id.tv_birth -> {
if (mUserInfo != null) { if (mUserInfo != null) {
var year = TimeUtils.getYear( var year = TimeUtils.getYear(
@@ -283,21 +253,25 @@ class UserInfoModifyActivity : BaseViewBindingActivity<ActivityUserInfoModifyBin
show(supportFragmentManager, "DATEPICKER_TAG_1") show(supportFragmentManager, "DATEPICKER_TAG_1")
} }
} }
R.id.tv_nick -> UIHelper.showModifyInfoAct( R.id.tv_nick -> UIHelper.showModifyInfoAct(
this@UserInfoModifyActivity, this@UserInfoModifyActivity,
Method.NICK, Method.NICK,
ModifyInfoActivity.NICK_MODIFY ModifyInfoActivity.NICK_MODIFY
) )
R.id.ll_desc -> UIHelper.showModifyInfoAct( R.id.ll_desc -> UIHelper.showModifyInfoAct(
this@UserInfoModifyActivity, this@UserInfoModifyActivity,
Method.DESC, Method.DESC,
ModifyInfoActivity.CONTENT_MODIFY ModifyInfoActivity.CONTENT_MODIFY
) )
R.id.layout_photos -> UserModifyPhotosActivity.startForResult( R.id.layout_photos -> UserModifyPhotosActivity.startForResult(
this@UserInfoModifyActivity, this@UserInfoModifyActivity,
userId, userId,
Method.PHOTO Method.PHOTO
) )
R.id.layout_area -> { R.id.layout_area -> {
dialogManager.showProgressDialog( dialogManager.showProgressDialog(
this@UserInfoModifyActivity, this@UserInfoModifyActivity,
@@ -319,7 +293,7 @@ class UserInfoModifyActivity : BaseViewBindingActivity<ActivityUserInfoModifyBin
setAction { setAction {
val find = areaList.find { data -> data.name == it } val find = areaList.find { data -> data.name == it }
if (find != null) { if (find != null) {
reportArea(it,find.id) reportArea(it, find.id)
} }
} }
}.show(this@UserInfoModifyActivity) }.show(this@UserInfoModifyActivity)
@@ -332,32 +306,34 @@ class UserInfoModifyActivity : BaseViewBindingActivity<ActivityUserInfoModifyBin
} }
}) })
} }
R.id.swCpAnim -> { R.id.swCpAnim -> {
postUpDateCpSwitch(binding.swCpAnim,UserInfoConstants.CpSet.cpAnim) postUpDateCpSwitch(binding.swCpAnim, UserInfoConstants.CpSet.cpAnim)
} }
R.id.swCpShow -> { R.id.swCpShow -> {
postUpDateCpSwitch(binding.swCpShow,UserInfoConstants.CpSet.cpAvatar) postUpDateCpSwitch(binding.swCpShow, UserInfoConstants.CpSet.cpAvatar)
} }
else -> {} else -> {}
} }
} }
//post update set //post update set
private fun postUpDateCpSwitch(view: ImageView,type:Int){ private fun postUpDateCpSwitch(view: ImageView, type: Int) {
val tag = view.tag val tag = view.tag
if (tag != null && tag is Boolean){ if (tag != null && tag is Boolean) {
val tagVal = !tag val tagVal = !tag
UserModel.get().userCpSettingUpdate(type,tagVal) UserModel.get().userCpSettingUpdate(type, tagVal)
.compose(bindToLifecycle()) .compose(bindToLifecycle())
.doOnSuccess { .doOnSuccess {
setSwitchView(view,tagVal,true) setSwitchView(view, tagVal, true)
}.subscribe() }.subscribe()
} }
} }
// set view // 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.setImageResource(if (on) R.drawable.ic_user_edit_sw_on else R.drawable.ic_user_edit_sw_off)
view.tag = on view.tag = on
if (notify) { 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 binding.tvArea.text = area
dialogManager.showProgressDialog( dialogManager.showProgressDialog(
this@UserInfoModifyActivity, 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() { private fun selectAvatarType() {
val list = ArrayList<ButtonItem>() val list = ArrayList<ButtonItem>()
@@ -457,31 +389,7 @@ class UserInfoModifyActivity : BaseViewBindingActivity<ActivityUserInfoModifyBin
} }
private fun checkStoragePermission() { private fun checkStoragePermission() {
PhotoPickActivity.start(this, if (isGif) PhotoPickActivity.GIF else PhotoPickActivity.IMG)
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)
}
}
} }
private fun getNowTime(): String { private fun getNowTime(): String {
@@ -492,9 +400,7 @@ class UserInfoModifyActivity : BaseViewBindingActivity<ActivityUserInfoModifyBin
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data) super.onActivityResult(requestCode, resultCode, data)
if (requestCode == REQUEST_CODE_STORAGE) { if (resultCode == RESULT_OK) {
checkStoragePermission()
} else if (resultCode == RESULT_OK) {
when (requestCode) { when (requestCode) {
Method.NICK -> { Method.NICK -> {
data?.let { data?.let {
@@ -511,6 +417,7 @@ class UserInfoModifyActivity : BaseViewBindingActivity<ActivityUserInfoModifyBin
.subscribe(userInfoUpdateObserver) .subscribe(userInfoUpdateObserver)
} }
} }
Method.DESC -> { Method.DESC -> {
data?.let { data?.let {
dialogManager.showProgressDialog( dialogManager.showProgressDialog(
@@ -526,6 +433,7 @@ class UserInfoModifyActivity : BaseViewBindingActivity<ActivityUserInfoModifyBin
.subscribe(userInfoUpdateObserver) .subscribe(userInfoUpdateObserver)
} }
} }
Method.PHOTO -> { Method.PHOTO -> {
data?.let { data?.let {
val isChanged = val isChanged =
@@ -534,29 +442,32 @@ class UserInfoModifyActivity : BaseViewBindingActivity<ActivityUserInfoModifyBin
.subscribe(userInfoUpdateObserver) .subscribe(userInfoUpdateObserver)
} }
} }
REQUEST_CODE_OPEN_PHOTO_PROVIDER -> data?.let {
val photos = PhotoProvider.getResultPhotoList(it) PhotoPickActivity.PICK_ACT_RESULT -> {
if (!photos.isNullOrEmpty()) { val uri = data?.data
val photo = photos[0] if (uri != null) {
val fileWith = if (isGif) ".gif" else ".jpg"
mUri =
Uri.parse("file://${FileHelper.getRootCacheDir()?.path}/${getNowTime()}$fileWith")
if (isGif) { if (isGif) {
mUri?.let { if (MyUriUtils.isGif(context, uri)) {
if (MyUriUtils.isGif(context,photo.uri)){ val isCopy = MyUriUtils.copyFileToUrl(this, uri, mUri!!)
val isCopy = MyUriUtils.copyFileToUrl(this,photo.uri, it) if (isCopy) {
if (isCopy) { onActivityResult(UCrop.REQUEST_CROP, RESULT_OK, null)
onActivityResult(UCrop.REQUEST_CROP,RESULT_OK,null)
}
}else{
ToastUtils.show(R.string.error_file_type)
} }
} else {
ToastUtils.show(R.string.error_file_type)
} }
} else { } 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 { UCrop.REQUEST_CROP -> mUri?.path?.let {
try { try {
mJob?.cancel() mJob?.cancel()

View File

@@ -1,59 +1,46 @@
package com.chwl.app.ui.user.activity package com.chwl.app.ui.user.activity
import android.Manifest
import android.annotation.SuppressLint import android.annotation.SuppressLint
import android.app.Activity import android.app.Activity
import android.content.Intent import android.content.Intent
import android.graphics.Bitmap import android.graphics.Bitmap
import android.net.Uri import android.net.Uri
import android.os.Build
import android.os.Bundle import android.os.Bundle
import android.provider.Settings
import android.view.View import android.view.View
import android.widget.GridView 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 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.R
import com.chwl.app.application.App import com.chwl.app.application.App
import com.chwl.app.base.PhotoPickActivity
import com.chwl.app.base.TitleBar import com.chwl.app.base.TitleBar
import com.chwl.app.common.util.BitmapUtil import com.chwl.app.common.util.BitmapUtil
import com.chwl.app.ui.user.adapter.UserModifyPhotosAdapter import com.chwl.app.ui.user.adapter.UserModifyPhotosAdapter
import com.chwl.app.ui.user.adapter.UserModifyPhotosAdapter.PhotoItemClickListener 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.file.FileModel
import com.chwl.core.user.UserModel import com.chwl.core.user.UserModel
import com.chwl.core.user.bean.UserInfo import com.chwl.core.user.bean.UserInfo
import com.chwl.core.user.bean.UserPhoto import com.chwl.core.user.bean.UserPhoto
import com.chwl.core.utils.CoreLogger 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.core.utils.net.BeanObserver
import com.chwl.library.common.file.FileHelper 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.PhotoCompressCallback
import com.chwl.library.common.util.PhotoCompressUtil 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.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 kotlinx.coroutines.Job
import java.io.FileNotFoundException import java.io.FileNotFoundException
import java.text.SimpleDateFormat import java.text.SimpleDateFormat
import java.util.* import java.util.Date
/** /**
* Created by chenran on 2017/7/24. * Created by chenran on 2017/7/24.
*/ */
class UserModifyPhotosActivity : TakePhotoActivity(), PhotoItemClickListener, class UserModifyPhotosActivity : TakePhotoActivity(), PhotoItemClickListener {
EasyPermissions.PermissionCallbacks {
private var userId: Long = 0 private var userId: Long = 0
private var userInfo: UserInfo? = null private var userInfo: UserInfo? = null
private var photoGridView: GridView? = null private var photoGridView: GridView? = null
@@ -64,7 +51,6 @@ class UserModifyPhotosActivity : TakePhotoActivity(), PhotoItemClickListener,
private var mUri: Uri? = null private var mUri: Uri? = null
private var mJob: Job? = null private var mJob: Job? = null
var pickMedia : ActivityResultLauncher<PickVisualMediaRequest>?=null
companion object { companion object {
const val FLAG_CHANGE = "isChanged" const val FLAG_CHANGE = "isChanged"
@@ -104,14 +90,6 @@ class UserModifyPhotosActivity : TakePhotoActivity(), PhotoItemClickListener,
if (userInfo != null) { if (userInfo != null) {
updateView() updateView()
} }
//todo do photoPick
pickMedia = registerForActivityResult(ActivityResultContracts.PickVisualMedia()) { uri ->
uri?.let {
crop(it, 0, mUri)
}
}
} }
private fun initView() { 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() { private fun checkStoragePermission() {
PhotoPickActivity.start(this@UserModifyPhotosActivity, PhotoPickActivity.IMG)
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
)
}
}
} }
private fun getNowTime(): String { private fun getNowTime(): String {
@@ -278,17 +180,20 @@ class UserModifyPhotosActivity : TakePhotoActivity(), PhotoItemClickListener,
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data) super.onActivityResult(requestCode, resultCode, data)
if (requestCode == REQUEST_CODE_STORAGE) { if (resultCode == RESULT_OK) {
checkStoragePermission()
} else if (resultCode == RESULT_OK) {
when (requestCode) { when (requestCode) {
REQUEST_CODE_OPEN_PHOTO_PROVIDER -> data?.let {
val photos = PhotoProvider.getResultPhotoList(data) ?: return PhotoPickActivity.PICK_ACT_RESULT -> data?.data?.let { uri ->
if (photos.isNotEmpty()) { mUri =
val photo = photos[0] Uri.parse("file://${FileHelper.getRootCacheDir()?.path}/${getNowTime()}.jpg")
crop(photo.uri, photo.size, mUri) val isCopy =
MyUriUtils.copyFileToUrl(this@UserModifyPhotosActivity, uri, mUri!!)
if (isCopy) {
crop(mUri, 0, mUri)
} }
} }
UCrop.REQUEST_CROP -> mUri?.path?.let { UCrop.REQUEST_CROP -> mUri?.path?.let {
try { try {
mJob?.cancel() mJob?.cancel()

View File

@@ -1,13 +1,8 @@
package com.chwl.app.community.publish.view; package com.chwl.app.community.publish.view;
import static androidx.core.content.ContentProviderCompat.requireContext;
import android.Manifest;
import android.content.Context; import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.net.Uri; import android.net.Uri;
import android.os.Build;
import android.os.Bundle; import android.os.Bundle;
import android.text.Editable; import android.text.Editable;
import android.text.TextUtils; import android.text.TextUtils;
@@ -21,37 +16,19 @@ import android.widget.LinearLayout;
import android.widget.RelativeLayout; import android.widget.RelativeLayout;
import android.widget.TextView; 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.annotation.NonNull;
import androidx.core.app.ActivityOptionsCompat;
import androidx.recyclerview.widget.GridLayoutManager; import androidx.recyclerview.widget.GridLayoutManager;
import androidx.recyclerview.widget.RecyclerView; 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.R;
import com.chwl.app.base.BaseMvpActivity; import com.chwl.app.base.BaseMvpActivity;
import com.chwl.app.base.PhotoPickActivity;
import com.chwl.app.common.widget.dialog.DialogManager; 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.ImageAdapter;
import com.chwl.app.community.publish.presenter.PublishPresenter; import com.chwl.app.community.publish.presenter.PublishPresenter;
import com.chwl.app.community.utils.ObjectTypeHelper; 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.app.ui.widget.recyclerview.decoration.GridSpacingItemDecoration;
import com.chwl.core.Constants; import com.chwl.core.Constants;
import com.chwl.core.auth.AuthModel; 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.miniworld.model.MiniWorldModel;
import com.chwl.core.user.UserModel; import com.chwl.core.user.UserModel;
import com.chwl.core.user.bean.UserInfo; 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.SharedPreferenceUtils;
import com.chwl.core.utils.net.DontWarnObserver; import com.chwl.core.utils.net.DontWarnObserver;
import com.chwl.library.base.factory.CreatePresenter; 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.PhotoCompressUtil;
import com.chwl.library.common.util.PhotosCompressCallback; 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.ResUtil;
import com.chwl.library.utils.SingleToastUtil; import com.chwl.library.utils.SingleToastUtil;
import com.example.matisse.internal.entity.CustomItem; 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.io.File;
import java.util.ArrayList; import java.util.ArrayList;
@@ -80,8 +60,6 @@ import java.util.concurrent.TimeUnit;
import io.reactivex.Single; import io.reactivex.Single;
import io.reactivex.android.schedulers.AndroidSchedulers; import io.reactivex.android.schedulers.AndroidSchedulers;
import kotlin.Unit;
import kotlin.jvm.functions.Function1;
import kotlinx.coroutines.Job; import kotlinx.coroutines.Job;
/** /**
@@ -89,7 +67,7 @@ import kotlinx.coroutines.Job;
*/ */
@CreatePresenter(PublishPresenter.class) @CreatePresenter(PublishPresenter.class)
public class PublishActivity extends BaseMvpActivity<IPublishView, PublishPresenter> public class PublishActivity extends BaseMvpActivity<IPublishView, PublishPresenter>
implements IPublishView, WorldsChooseFrg.ChooseWorldCallback, EasyPermissions.PermissionCallbacks, implements IPublishView, WorldsChooseFrg.ChooseWorldCallback,
View.OnClickListener { View.OnClickListener {
private final static String KEY_SP_ORIGINAL_IMAGE = "key_sp_original_image"; 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 Job mJob = null;
private ActivityResultLauncher<PickVisualMediaRequest> pickMedia;
public static void start(DialogManager manager, long worldId) { public static void start(DialogManager manager, long worldId) {
if (beforeStart(manager)) { if (beforeStart(manager)) {
return; return;
@@ -194,70 +170,6 @@ public class PublishActivity extends BaseMvpActivity<IPublishView, PublishPresen
// } // }
rlChooseGroup.setVisibility(View.GONE); rlChooseGroup.setVisibility(View.GONE);
flGroup.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() { 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 @Override
public void onPublishSuccess() { public void onPublishSuccess() {
@@ -663,75 +479,79 @@ public class PublishActivity extends BaseMvpActivity<IPublishView, PublishPresen
StatusBarUtil.StatusBarLightMode(this); 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() { private void checkStoragePermission() {
PhotoPickActivity.start(this, PhotoPickActivity.IMG);
}
if (Build.VERSION.SDK_INT >= 29){ @Override
if (pickMedia != null){ protected void onActivityResult(int requestCode, int resultCode, Intent data) {
DialogUtil.INSTANCE.getDialog(this,new EasyAlertDialogHelper.OnDialogActionListener() { super.onActivityResult(requestCode, resultCode, data);
@Override if (resultCode == RESULT_OK) {
public void doCancelAction() {} switch (requestCode) {
@Override case PhotoPickActivity.PICK_ACT_RESULT:
public void doOkAction() { if (data == null) {
SPUtils.putBoolean(ConstantsLib.Key.Permissions_Img,true); return;
pickMedia.launch(new PickVisualMediaRequest.Builder().setMediaType(ActivityResultContracts.PickVisualMedia.ImageOnly.INSTANCE).build());
} }
}); Uri uri = data.getData();
} if (uri != null && uri.getPath() != null) {
}else{
if (!EasyPermissions.hasPermissions(this, Manifest.permission.READ_EXTERNAL_STORAGE)) { if (MyUriUtils.INSTANCE.isGif(context, uri)) {
EasyPermissions.requestPermissions( ToastUtils.show(R.string.error_file_type);
this, return;
getString(R.string.permission_storage_rationale), }
PERMISSION_CODE_STORAGE, Manifest.permission.READ_EXTERNAL_STORAGE
); File file = MyUriUtils.INSTANCE.copyFile(PublishActivity.this, uri);
} else { if (file != null) {
PhotoProvider.photoProvider( LogUtil.e("选择 file = " + file.getName());
this, LogUtil.e("选择 file = " + file.getPath());
maxSelect - uploadList.size(),
true, if (mJob != null) {
REQUEST_CODE_OPEN_PHOTO_PROVIDER, mJob.cancel(null);
true, }
true 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);
}
}
break;
} }
} }
} }

View File

@@ -5,16 +5,17 @@ import android.database.Cursor
import android.graphics.BitmapFactory import android.graphics.BitmapFactory
import android.net.Uri import android.net.Uri
import android.provider.MediaStore import android.provider.MediaStore
import androidx.activity.result.ActivityResultCallback import android.provider.OpenableColumns
import java.io.File import java.io.File
import java.io.FileOutputStream import java.io.FileOutputStream
object MyUriUtils { 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 projection = arrayOf(MediaStore.MediaColumns.DISPLAY_NAME)
val cursor : Cursor ? = context.contentResolver.query( val cursor: Cursor? = context.contentResolver.query(
uri, uri,
projection, projection,
null, null,
@@ -24,7 +25,8 @@ object MyUriUtils {
try { try {
cursor?.use { cursor?.use {
if (it.moveToFirst()) { if (it.moveToFirst()) {
fileName = it.getString(it.getColumnIndexOrThrow(MediaStore.MediaColumns.DISPLAY_NAME)) fileName =
it.getString(it.getColumnIndexOrThrow(MediaStore.MediaColumns.DISPLAY_NAME))
} }
} }
} catch (e: Exception) { } catch (e: Exception) {
@@ -32,19 +34,19 @@ object MyUriUtils {
return fileName return fileName
} }
fun copyFile(context: Context, uri: Uri) : File?{ fun copyFile(context: Context, uri: Uri): File? {
val fileName = getName(context, uri)?:"defName.jpg" 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()) { if (!outPutDir.exists()) {
outPutDir.mkdirs() outPutDir.mkdirs()
} }
context.contentResolver.openInputStream(uri)?.use { inS-> context.contentResolver.openInputStream(uri)?.use { inS ->
FileOutputStream(outPutFile).use{ outS-> FileOutputStream(outPutFile).use { outS ->
inS.copyTo(outS) inS.copyTo(outS)
} }
return outPutFile return outPutFile
@@ -52,7 +54,7 @@ object MyUriUtils {
} }
fun getFileType(context: Context, uri: Uri) : String { fun getFileType(context: Context, uri: Uri): String {
var type = "" var type = ""
context.contentResolver?.let { context.contentResolver?.let {
type = it.getType(uri).toString() type = it.getType(uri).toString()
@@ -60,14 +62,35 @@ object MyUriUtils {
return type return type
} }
fun isGif(context: Context, uri: Uri) :Boolean{ fun getFileSize(context: Context, uri: Uri): Long {
return getFileType(context,uri) == "image/gif" 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 val contentResolver = context.contentResolver
contentResolver?.openInputStream(uri)?.use { uriStream -> contentResolver?.openInputStream(uri)?.use { uriStream ->
contentResolver?.openOutputStream(outUri,"wt")?.use { outStream-> contentResolver?.openOutputStream(outUri, "wt")?.use { outStream ->
uriStream.copyTo(outStream) uriStream.copyTo(outStream)
return true return true
} }
@@ -75,29 +98,29 @@ object MyUriUtils {
return false return false
} }
fun getFileInfo(file: File) : MutableList<String>?{ fun getFileInfo(file: File): MutableList<String>? {
var width = 0 var width = 0
var height = 0 var height = 0
var minType = "image/jpeg" var minType = "image/jpeg"
var data : MutableList<String> ?= null var data: MutableList<String>? = null
BitmapFactory.Options().apply { BitmapFactory.Options().apply {
inJustDecodeBounds = true inJustDecodeBounds = true
BitmapFactory.decodeFile(file.absolutePath,this) BitmapFactory.decodeFile(file.absolutePath, this)
width = outWidth width = outWidth
height = outHeight height = outHeight
minType = outMimeType minType = outMimeType
}.let { }.let {
data =mutableListOf(width.toString(),height.toString(),minType) data = mutableListOf(width.toString(), height.toString(), minType)
} }
return data return data
} }
fun copyFile(file:File,dir:File){ fun copyFile(file: File, dir: File) {
if (!dir.exists()) { if (!dir.exists()) {
dir.mkdirs() dir.mkdirs()
} }
file.copyTo(dir,true) file.copyTo(dir, true)
} }

View File

@@ -1,12 +1,13 @@
package com.netease.nim.uikit.business.session.actions package com.netease.nim.uikit.business.session.actions
import android.content.Context
import android.content.Intent 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 android.text.TextUtils
import androidx.activity.result.contract.ActivityResultContracts
import com.chwl.library.common.application.BaseApp import com.chwl.library.common.application.BaseApp
import com.chwl.library.common.base.BaseDialogFragment 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.PhotoCompressUtil
import com.chwl.library.common.util.PhotosCompressCallback import com.chwl.library.common.util.PhotosCompressCallback
import com.chwl.library.utils.ResUtil 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.business.session.helper.SendImageHelper
import com.netease.nim.uikit.common.activity.NimPhotoPickActivity import com.netease.nim.uikit.common.activity.NimPhotoPickActivity
import java.io.File import java.io.File
import java.io.FileOutputStream
/** /**
* Created by zhoujianghua on 2015/7/31. * Created by zhoujianghua on 2015/7/31.
*/ */
abstract class PickImageActionNew protected constructor( abstract class PickImageActionNew protected constructor(
iconResId: Int, iconResId: Int, titleId: Int, private val multiSelect: Boolean
titleId: Int,
private val multiSelect: Boolean
) : BaseAction(iconResId, titleId) { ) : BaseAction(iconResId, titleId) {
companion object {
private const val REQUEST_CODE_OPEN_PHOTO_PROVIDER = 111 // 从相册中选择
}
protected abstract fun onPicked(file: File) protected abstract fun onPicked(file: File)
@@ -37,29 +34,21 @@ abstract class PickImageActionNew protected constructor(
} }
private fun checkStoragePermission() { private fun checkStoragePermission() {
if (Build.VERSION.SDK_INT >= 29) { NimPhotoPickActivity.start(activity, NimPhotoPickActivity.IMG)
activity.startActivityForResult(Intent(activity,NimPhotoPickActivity::class.java),makeRequestCode(REQUEST_CODE_OPEN_PHOTO_PROVIDER))
} else {
PhotoProvider.photoProvider(
activity,
maxSelect = 9,
resultCode = makeRequestCode(REQUEST_CODE_OPEN_PHOTO_PROVIDER)
)
}
} }
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
if (resultCode == BaseDialogFragment.RESULT_OK) { if (resultCode == BaseDialogFragment.RESULT_OK) {
when (requestCode) { when (requestCode) {
REQUEST_CODE_OPEN_PHOTO_PROVIDER -> { NimPhotoPickActivity.PICK_ACT_RESULT and 0xff -> {
if (data == null) return if (data == null) return
PhotoProvider.getResultPathListAsync(data) { list -> val uri = data.data
val paths = list?.map { it.path }?.toMutableList() ?: ArrayList() if (uri != null) {
if (paths.isEmpty()) { val file = copyFile(activity, uri)
SingleToastUtil.showToastShort(R.string.picker_image_error) file?.path?.let { path ->
} else { val paths = mutableListOf(path)
PhotoCompressUtil.compress( PhotoCompressUtil.compress(BaseApp.getContext(),
BaseApp.getContext(),
paths, paths,
PhotoCompressUtil.getCompressCachePath(), PhotoCompressUtil.getCompressCachePath(),
object : PhotosCompressCallback { object : PhotosCompressCallback {
@@ -68,7 +57,11 @@ abstract class PickImageActionNew protected constructor(
for (path in compressedImgList) { for (path in compressedImgList) {
val file = File(path) val file = File(path)
if (TextUtils.isEmpty(path) || !file.exists()) { 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 return
} }
onPicked(file) onPicked(file)
@@ -78,26 +71,62 @@ abstract class PickImageActionNew protected constructor(
override fun onFail(e: Throwable) { override fun onFail(e: Throwable) {
SingleToastUtil.showToastShort(R.string.picker_image_error) SingleToastUtil.showToastShort(R.string.picker_image_error)
} }
}) })
} }
} }
} }
} }
} }
} }
/** /**
* 发送图片 * 发送图片
*/ */
private fun sendImageAfterSelfImagePicker(compressedImgList: List<String>) { private fun sendImageAfterSelfImagePicker(compressedImgList: List<String>) {
SendImageHelper.sendImageAfterSelfImagePickerNew( SendImageHelper.sendImageAfterSelfImagePickerNew(
activity, activity, compressedImgList
compressedImgList
) { file, isOrig -> ) { file, isOrig ->
onPicked(file) 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,108 +1,160 @@
package com.netease.nim.uikit.common.activity package com.netease.nim.uikit.common.activity
import android.Manifest
import android.app.Activity
import android.content.Context import android.content.Context
import android.content.Intent import android.content.Intent
import android.database.Cursor import android.database.Cursor
import android.net.Uri import android.net.Uri
import android.os.Build
import android.os.Bundle import android.os.Bundle
import android.provider.MediaStore import android.provider.MediaStore
import android.view.Window import androidx.activity.ComponentActivity
import android.view.WindowManager
import androidx.activity.result.ActivityResultLauncher import androidx.activity.result.ActivityResultLauncher
import androidx.activity.result.PickVisualMediaRequest import androidx.activity.result.PickVisualMediaRequest
import androidx.activity.result.contract.ActivityResultContracts import androidx.activity.result.contract.ActivityResultContracts
import androidx.appcompat.app.AppCompatActivity
import com.chwl.library.common.util.SPUtils import com.chwl.library.common.util.SPUtils
import com.chwl.library.constants.ConstantsLib import com.chwl.library.constants.ConstantsLib
import com.chwl.library.easyphoto.EasyPhotos import com.chwl.library.easypermisssion.EasyPermissions
import com.chwl.library.easyphoto.models.album.entity.Photo
import com.chwl.library.easyphoto.setting.Setting
import com.chwl.library.utils.ResUtil 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.R
import com.netease.nim.uikit.common.ui.dialog.EasyAlertDialog import com.netease.nim.uikit.common.ui.dialog.EasyAlertDialog
import com.netease.nim.uikit.common.ui.dialog.EasyAlertDialogHelper import com.netease.nim.uikit.common.ui.dialog.EasyAlertDialogHelper
import java.io.File import java.io.File
import java.io.FileOutputStream 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?) { override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
setContentView(R.layout.nim_photo_pick_activity) // setContentView(R.layout.activity_photo_pick)
window?.setDimAmount(0f)
// requestWindowFeature(Window.FEATURE_NO_TITLE) mMediaType = intent?.getStringExtra(PICK_ACT_TYPE) ?: IMG
// window.setFlags(
// WindowManager.LayoutParams.FLAG_FULLSCREEN,
// WindowManager.LayoutParams.FLAG_FULLSCREEN
// )
//todo do photoPick
pickMedia = registerForActivityResult(ActivityResultContracts.PickVisualMedia()) { uri -> pickMedia = registerForActivityResult(ActivityResultContracts.PickVisualMedia()) { uri ->
if (uri != null) { if (uri != null) {
val file = copyFile(this@NimPhotoPickActivity, uri) val intent = Intent()
if (file != null) { intent.setData(uri)
val resultList = ArrayList<Photo>() setResult(RESULT_OK, intent)
val data = Intent() // 接收方 用 intent.data 来获取
resultList.add(Photo(file.path)) finish()
data.putParcelableArrayListExtra(EasyPhotos.RESULT_PHOTOS, resultList)
setResult(RESULT_OK, data)
finish()
}
} else { } else {
finish() finish()
} }
} }
}
var isFirst = true pickMediaForDocument = registerForActivityResult(ActivityResultContracts.OpenDocument()) {
var dialog : EasyAlertDialog ?=null if (it != null) {
override fun onResume() { val intent = Intent()
super.onResume() intent.setData(it)
setResult(RESULT_OK, intent)
if (!isFirst) {
finish()
return
}
if (!SPUtils.getBoolean(ConstantsLib.Key.Permissions_Img,false)){
dialog = EasyAlertDialogHelper.createOkCancelDiolag(
this,
null,
ResUtil.getString(
R.string.dialot_permission_tips_nim,
ResUtil.getString(R.string.app_name)
),
ResUtil.getString(R.string.Allow_nim),
ResUtil.getString(R.string.No_nim),
false,
object : EasyAlertDialogHelper.OnDialogActionListener {
override fun doCancelAction() {
finish()
}
override fun doOkAction() {
SPUtils.putBoolean(ConstantsLib.Key.Permissions_Img,true)
pickMedia?.launch(PickVisualMediaRequest(ActivityResultContracts.PickVisualMedia.ImageOnly))
}
})
if (dialog?.isShowing == false) {
dialog?.show()
} }
}else{ finish()
pickMedia?.launch(PickVisualMediaRequest(ActivityResultContracts.PickVisualMedia.ImageOnly))
} }
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<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 projection = arrayOf(MediaStore.MediaColumns.DISPLAY_NAME)
val cursor : Cursor? = context.contentResolver.query( val cursor: Cursor? = context.contentResolver.query(
uri, uri,
projection, projection,
null, null,
@@ -112,7 +164,8 @@ class NimPhotoPickActivity : AppCompatActivity() {
try { try {
cursor?.use { cursor?.use {
if (it.moveToFirst()) { if (it.moveToFirst()) {
fileName = it.getString(it.getColumnIndexOrThrow(MediaStore.MediaColumns.DISPLAY_NAME)) fileName =
it.getString(it.getColumnIndexOrThrow(MediaStore.MediaColumns.DISPLAY_NAME))
} }
} }
} catch (e: Exception) { } catch (e: Exception) {
@@ -120,19 +173,19 @@ class NimPhotoPickActivity : AppCompatActivity() {
return fileName return fileName
} }
private fun copyFile(context: Context, uri: Uri) : File?{ private fun copyFile(context: Context, uri: Uri): File? {
val fileName = getName(context, uri)?:"defName.jpg" 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()) { if (!outPutDir.exists()) {
outPutDir.mkdirs() outPutDir.mkdirs()
} }
context.contentResolver.openInputStream(uri)?.use { inS-> context.contentResolver.openInputStream(uri)?.use { inS ->
FileOutputStream(outPutFile).use{ outS-> FileOutputStream(outPutFile).use { outS ->
inS.copyTo(outS) inS.copyTo(outS)
} }
return outPutFile return outPutFile