动态选择图片修改

This commit is contained in:
wushaocheng
2022-11-21 17:10:17 +08:00
parent 67a43f6918
commit 5f8cb096b4
14 changed files with 412 additions and 235 deletions

View File

@@ -168,6 +168,7 @@ object PhotoCompressUtil {
private fun getCompressLocationPath(tag: String): String {
return "${FileHelper.getRootFilesDir(Environment.DIRECTORY_PICTURES).absolutePath}/compress/${tag}/"
}
}
interface PhotosCompressCallback {

View File

@@ -44,7 +44,6 @@ import com.yizhuan.xchat_android_core.utils.Logger
import com.yizhuan.xchat_android_library.easypermisssion.EasyPermissions
import com.yizhuan.xchat_android_library.utils.ResUtil
import com.yizhuan.xchat_android_library.utils.TimeUtils
import com.yizhuan.xchat_android_library.utils.log.MLog
import io.reactivex.Completable
import io.reactivex.SingleObserver
import io.reactivex.disposables.Disposable
@@ -303,18 +302,19 @@ class UserInfoModifyActivity : BaseViewBindingActivity<ActivityUserInfoModifyBin
}
private fun checkStoragePermission() {
if (context?.let {
EasyPermissions.hasPermissions(
it, Manifest.permission.WRITE_EXTERNAL_STORAGE,
Manifest.permission.READ_EXTERNAL_STORAGE
)
} == false) {
context?.getString(R.string.permission_storage_rationale)?.let {
EasyPermissions.requestPermissions(
this, it, PERMISSION_CODE_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE,
Manifest.permission.READ_EXTERNAL_STORAGE
)
}
if (!EasyPermissions.hasPermissions(
this,
Manifest.permission.WRITE_EXTERNAL_STORAGE,
Manifest.permission.READ_EXTERNAL_STORAGE
)
) {
EasyPermissions.requestPermissions(
this,
getString(R.string.permission_storage_rationale),
PERMISSION_CODE_STORAGE,
Manifest.permission.WRITE_EXTERNAL_STORAGE,
Manifest.permission.READ_EXTERNAL_STORAGE
)
} else {
mUri = Uri.parse("file://${FileHelper.getRootCacheDir()?.path}/${getNowTime()}.jpg")
PhotoProvider.photoProvider(
@@ -332,97 +332,108 @@ class UserInfoModifyActivity : BaseViewBindingActivity<ActivityUserInfoModifyBin
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
if (resultCode != RESULT_OK) {
MLog.info(this, "return is not ok,resultCode=%d", resultCode)
return
}
if (requestCode == Method.NICK) {
dialogManager.showProgressDialog(
this@UserInfoModifyActivity,
ResUtil.getString(R.string.ui_user_userinfomodifyactivity_01)
)
val stringExtra = data?.getStringExtra(ModifyInfoActivity.CONTENT_NICK)
binding.tvNick.text = stringExtra
val user = UserInfo()
user.uid = AuthModel.get().currentUid
user.nick = stringExtra
UserModel.get().requestUpdateUserInfo(user).subscribe(userInfoUpdateObserver)
}
if (requestCode == Method.DESC) {
dialogManager.showProgressDialog(
this@UserInfoModifyActivity,
ResUtil.getString(R.string.ui_user_userinfomodifyactivity_02)
)
val stringExtra = data?.getStringExtra(ModifyInfoActivity.CONTENT)
setTvDesc(stringExtra)
val user = UserInfo()
user.uid = AuthModel.get().currentUid
user.userDesc = stringExtra
UserModel.get().requestUpdateUserInfo(user).subscribe(userInfoUpdateObserver)
}
// 刷新声音资源
if (requestCode == Method.AUDIO) {
// 传给上个页面
setResult(RESULT_OK, data)
// 获取数据并刷新显示
audioFileUrl = data!!.getStringExtra(RecordingVoiceActivity.AUDIO_FILE)
val audioDura = data.getIntExtra(RecordingVoiceActivity.AUDIO_DURA, 0)
// 更新用户信息
val user = UserInfo()
user.uid = AuthModel.get().currentUid
user.userVoice = audioFileUrl
user.voiceDura = audioDura
UserModel.get().requestUpdateUserInfo(user).subscribe(userInfoUpdateObserver)
}
if (requestCode == Method.PHOTO && data != null) {
val isChanged = data.getBooleanExtra(UserModifyPhotosActivity.FLAG_CHANGE, false)
if (isChanged) UserModel.get().getUserInfo(userId).subscribe(userInfoUpdateObserver)
}
when (requestCode) {
REQUEST_CODE_OPEN_PHOTO_PROVIDER -> data?.let {
val photos = PhotoProvider.getResultPhotoList(data) ?: return
if (photos.isNotEmpty()) {
val photo = photos[0]
crop(photo.uri, photo.size, mUri)
if (requestCode == REQUEST_CODE_STORAGE) {
checkStoragePermission()
} else if (resultCode == RESULT_OK) {
when (requestCode) {
Method.NICK -> {
data?.let {
dialogManager.showProgressDialog(
this@UserInfoModifyActivity,
ResUtil.getString(R.string.ui_user_userinfomodifyactivity_01)
)
val stringExtra = it.getStringExtra(ModifyInfoActivity.CONTENT_NICK)
binding.tvNick.text = stringExtra
val user = UserInfo()
user.uid = AuthModel.get().currentUid
user.nick = stringExtra
UserModel.get().requestUpdateUserInfo(user)
.subscribe(userInfoUpdateObserver)
}
}
}
UCrop.REQUEST_CROP -> mUri?.path?.let {
try {
mJob?.cancel()
mJob = PhotoCompressUtil.compress(
XChatApplication.gContext,
it,
PhotoCompressUtil.getCompressCachePath(),
object : PhotoCompressCallback {
@SuppressLint("CheckResult")
override fun onSuccess(compressedImg: String) {
dialogManager.showProgressDialog(
this@UserInfoModifyActivity,
ResUtil.getString(R.string.ui_user_userinfomodifyactivity_09)
)
FileModel.get()
.uploadFile(compressedImg)
.compose(bindToLifecycle())
.subscribe { url: String?, throwable: Throwable? ->
if (throwable != null) {
onUploadFail()
} else {
onUpload(url)
}
}
}
Method.DESC -> {
data?.let {
dialogManager.showProgressDialog(
this@UserInfoModifyActivity,
ResUtil.getString(R.string.ui_user_userinfomodifyactivity_02)
)
val stringExtra = it.getStringExtra(ModifyInfoActivity.CONTENT)
setTvDesc(stringExtra)
val user = UserInfo()
user.uid = AuthModel.get().currentUid
user.userDesc = stringExtra
UserModel.get().requestUpdateUserInfo(user)
.subscribe(userInfoUpdateObserver)
}
}
Method.AUDIO -> {// 刷新声音资源
data?.let {
// 传给上个页面
setResult(RESULT_OK, it)
override fun onFail(e: Throwable) {
toast(e.message)
}
},
mostCompressSize = IMAGE_MOST_COMPRESS_SIZE
)
} catch (e: FileNotFoundException) {
Logger.error(TAG, e.message)
// 获取数据并刷新显示
audioFileUrl = it.getStringExtra(RecordingVoiceActivity.AUDIO_FILE)
val audioDuration = it.getIntExtra(RecordingVoiceActivity.AUDIO_DURA, 0)
// 更新用户信息
val user = UserInfo()
user.uid = AuthModel.get().currentUid
user.userVoice = audioFileUrl
user.voiceDura = audioDuration
UserModel.get().requestUpdateUserInfo(user)
.subscribe(userInfoUpdateObserver)
}
}
Method.PHOTO -> {
data?.let {
val isChanged =
it.getBooleanExtra(UserModifyPhotosActivity.FLAG_CHANGE, false)
if (isChanged) UserModel.get().getUserInfo(userId)
.subscribe(userInfoUpdateObserver)
}
}
REQUEST_CODE_OPEN_PHOTO_PROVIDER -> data?.let {
val photos = PhotoProvider.getResultPhotoList(it) ?: return
if (photos.isNotEmpty()) {
val photo = photos[0]
crop(photo.uri, photo.size, mUri)
}
}
UCrop.REQUEST_CROP -> mUri?.path?.let {
try {
mJob?.cancel()
mJob = PhotoCompressUtil.compress(
this,
it,
PhotoCompressUtil.getCompressCachePath(),
object : PhotoCompressCallback {
@SuppressLint("CheckResult")
override fun onSuccess(compressedImg: String) {
dialogManager.showProgressDialog(
this@UserInfoModifyActivity,
ResUtil.getString(R.string.ui_user_userinfomodifyactivity_09)
)
FileModel.get()
.uploadFile(compressedImg)
.compose(bindToLifecycle())
.subscribe { url: String?, throwable: Throwable? ->
if (throwable != null) {
onUploadFail()
} else {
onUpload(url)
}
}
}
override fun onFail(e: Throwable) {
toast(e.message)
}
},
mostCompressSize = IMAGE_MOST_COMPRESS_SIZE
)
} catch (e: FileNotFoundException) {
Logger.error(TAG, e.message)
}
}
}
}

View File

@@ -1,47 +1,40 @@
package com.yizhuan.erban.ui.user
import android.Manifest
import com.jph.takephoto.app.TakePhotoActivity
import com.yizhuan.erban.ui.user.UserModifyPhotosAdapter.PhotoItemClickListener
import android.widget.GridView
import com.yizhuan.erban.ui.user.UserModifyPhotosAdapter
import com.yizhuan.erban.ui.user.UserModifyPhotosActivity
import android.os.Bundle
import com.yizhuan.erban.R
import com.yizhuan.xchat_android_core.user.UserModel
import com.yizhuan.xchat_android_core.user.bean.UserPhoto
import com.yizhuan.xchat_android_library.utils.ResUtil
import com.yizhuan.erban.base.TitleBar
import com.yizhuan.xchat_android_library.utils.file.JXFileUtils
import com.jph.takephoto.compress.CompressConfig
import com.yizhuan.erban.common.permission.PermissionActivity.CheckPermListener
import com.yizhuan.xchat_android_core.utils.net.BeanObserver
import android.content.Intent
import com.yizhuan.erban.ui.user.ShowPhotoActivity
import android.annotation.SuppressLint
import com.jph.takephoto.model.TResult
import com.yizhuan.xchat_android_core.file.FileModel
import android.app.Activity
import android.content.Intent
import android.graphics.Bitmap
import android.net.Uri
import android.os.Bundle
import android.provider.Settings
import android.view.View
import android.widget.GridView
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.yizhuan.erban.R
import com.yizhuan.erban.application.XChatApplication
import com.yizhuan.erban.base.TitleBar
import com.yizhuan.erban.common.file.FileHelper
import com.yizhuan.erban.common.photo.PhotoProvider
import com.yizhuan.erban.common.util.BitmapUtil
import com.yizhuan.erban.common.util.PhotoCompressCallback
import com.yizhuan.erban.common.util.PhotoCompressUtil
import com.yizhuan.erban.ui.user.UserModifyPhotosActivity
import com.yizhuan.erban.ui.user.UserModifyPhotosAdapter.PhotoItemClickListener
import com.yizhuan.erban.ui.widget.dialog.CommonTipDialog
import com.yizhuan.xchat_android_core.file.FileModel
import com.yizhuan.xchat_android_core.user.UserModel
import com.yizhuan.xchat_android_core.user.bean.UserInfo
import com.yizhuan.xchat_android_core.user.bean.UserPhoto
import com.yizhuan.xchat_android_core.utils.net.BeanObserver
import com.yizhuan.xchat_android_library.easypermisssion.EasyPermissions
import com.yizhuan.xchat_android_library.utils.log.MLog
import com.yizhuan.xchat_android_library.utils.ResUtil
import kotlinx.coroutines.Job
import java.io.FileNotFoundException
import java.text.SimpleDateFormat
@@ -50,7 +43,8 @@ import java.util.*
/**
* Created by chenran on 2017/7/24.
*/
class UserModifyPhotosActivity : TakePhotoActivity(), PhotoItemClickListener, EasyPermissions.PermissionCallbacks {
class UserModifyPhotosActivity : TakePhotoActivity(), PhotoItemClickListener,
EasyPermissions.PermissionCallbacks {
private var userId: Long = 0
private var userInfo: UserInfo? = null
private var photoGridView: GridView? = null
@@ -218,18 +212,19 @@ class UserModifyPhotosActivity : TakePhotoActivity(), PhotoItemClickListener, Ea
}
private fun checkStoragePermission() {
if (context?.let {
EasyPermissions.hasPermissions(
it, Manifest.permission.WRITE_EXTERNAL_STORAGE,
Manifest.permission.READ_EXTERNAL_STORAGE
)
} == false) {
context?.getString(R.string.permission_storage_rationale)?.let {
EasyPermissions.requestPermissions(
this, it, PERMISSION_CODE_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE,
Manifest.permission.READ_EXTERNAL_STORAGE
)
}
if (!EasyPermissions.hasPermissions(
this,
Manifest.permission.WRITE_EXTERNAL_STORAGE,
Manifest.permission.READ_EXTERNAL_STORAGE
)
) {
EasyPermissions.requestPermissions(
this,
getString(R.string.permission_storage_rationale),
PERMISSION_CODE_STORAGE,
Manifest.permission.WRITE_EXTERNAL_STORAGE,
Manifest.permission.READ_EXTERNAL_STORAGE
)
} else {
mUri = Uri.parse("file://${FileHelper.getRootCacheDir()?.path}/${getNowTime()}.jpg")
PhotoProvider.photoProvider(
@@ -247,52 +242,52 @@ class UserModifyPhotosActivity : TakePhotoActivity(), PhotoItemClickListener, Ea
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
if (resultCode != RESULT_OK) {
MLog.info(this, "return is not ok,resultCode=%d", resultCode)
return
}
when (requestCode) {
REQUEST_CODE_OPEN_PHOTO_PROVIDER -> data?.let {
val photos = PhotoProvider.getResultPhotoList(data) ?: return
if (photos.isNotEmpty()) {
val photo = photos[0]
crop(photo.uri, photo.size, mUri)
if (requestCode == REQUEST_CODE_STORAGE) {
checkStoragePermission()
} else if (resultCode == RESULT_OK) {
when (requestCode) {
REQUEST_CODE_OPEN_PHOTO_PROVIDER -> data?.let {
val photos = PhotoProvider.getResultPhotoList(data) ?: return
if (photos.isNotEmpty()) {
val photo = photos[0]
crop(photo.uri, photo.size, mUri)
}
}
}
UCrop.REQUEST_CROP -> mUri?.path?.let {
try {
mJob?.cancel()
mJob = PhotoCompressUtil.compress(
XChatApplication.gContext,
it,
PhotoCompressUtil.getCompressCachePath(),
object : PhotoCompressCallback {
@SuppressLint("CheckResult")
override fun onSuccess(compressedImg: String) {
dialogManager.showProgressDialog(
this@UserModifyPhotosActivity,
ResUtil.getString(R.string.ui_user_userinfomodifyactivity_09)
)
FileModel.get()
.uploadFile(compressedImg)
.compose(bindToLifecycle())
.subscribe { url: String?, throwable: Throwable? ->
if (throwable != null) {
onUploadFail()
} else {
onUpload(url)
UCrop.REQUEST_CROP -> mUri?.path?.let {
try {
mJob?.cancel()
mJob = PhotoCompressUtil.compress(
XChatApplication.gContext,
it,
PhotoCompressUtil.getCompressCachePath(),
object : PhotoCompressCallback {
@SuppressLint("CheckResult")
override fun onSuccess(compressedImg: String) {
dialogManager.showProgressDialog(
this@UserModifyPhotosActivity,
ResUtil.getString(R.string.ui_user_userinfomodifyactivity_09)
)
FileModel.get()
.uploadFile(compressedImg)
.compose(bindToLifecycle())
.subscribe { url: String?, throwable: Throwable? ->
if (throwable != null) {
onUploadFail()
} else {
onUpload(url)
}
}
}
}
}
override fun onFail(e: Throwable) {
toast(e.message)
}
},
mostCompressSize = IMAGE_MOST_COMPRESS_SIZE
)
} catch (e: FileNotFoundException) {
com.yizhuan.xchat_android_core.utils.Logger.error(TAG, e.message)
override fun onFail(e: Throwable) {
toast(e.message)
}
},
mostCompressSize = IMAGE_MOST_COMPRESS_SIZE
)
} catch (e: FileNotFoundException) {
com.yizhuan.xchat_android_core.utils.Logger.error(TAG, e.message)
}
}
}
}
@@ -347,7 +342,7 @@ class UserModifyPhotosActivity : TakePhotoActivity(), PhotoItemClickListener, Ea
.withMaxResultSize(800, 800).start(this)
}
private fun onUpload(url: String?) {
private fun onUpload(url: String?) {
Logger.d("onUploadPhoto:$url")
UserModel.get().requestAddPhoto(url)
.compose(bindUntilEvent(ActivityEvent.DESTROY))

View File

@@ -90,7 +90,7 @@ public class UserModifyPhotosAdapter extends BaseAdapter{
UserPhoto userPhoto = photoUrls.get(position-1);
GlideApp.with(mContext)
.load(userPhoto.getPhotoUrl())
.placeholder(R.drawable.default_avatar)
.placeholder(R.drawable.default_cover)
.dontAnimate()
.into(holder.imageView);
if (isEditMode) {

View File

@@ -4960,8 +4960,8 @@
<string name="department_of_management">所屬廳</string>
<string name="give_gift">送礼物</string>
<string name="room_perform_go_update">去設置</string>
<string name="permission_storage_rationale">請您再次考慮一下授予PEKO存儲空間權限否則PEKO將無法正常加載您本地的文件內容。</string>
<string name="permission_camera_rationale">請您再次考慮一下授予PEKO攝像頭權限否則PEKO將無法取得您拍攝的內容。</string>
<string name="permission_storage_rationale">請您再次考慮授予PEKO存儲空間權限否則PEKO將無法正常加載您本地的文件內容。</string>
<string name="permission_camera_rationale">請您再次考慮授予PEKO攝像頭權限否則PEKO將無法取得您拍攝的內容。</string>
<string name="permission_storage_denied">為了能正常加載您本地的文件內容,請前往應用權限設置界面打開存儲空間權限。</string>
<string name="permission_camera_denied">為了能取得您拍攝的內容,請前往應用權限設置界面打開攝像頭權限。</string>
<string name="permission_storage_refused">您已拒絕提供存儲空間權限PEKO將無法正常加載您本地的文件內容。</string>

View File

@@ -36,6 +36,14 @@ public class CustomItem implements Parcelable, Serializable {
private String format;
public String getPath(){
return path;
}
public int getFileType(){
return fileType;
}
public boolean isImage() {
return fileType == IMAGE_NORMAL;
}

View File

@@ -3,7 +3,9 @@ package com.yizhuan.erban.community.publish.view;
import android.Manifest;
import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.provider.Settings;
import android.text.Editable;
import android.text.TextUtils;
import android.text.TextWatcher;
@@ -16,15 +18,20 @@ import android.widget.LinearLayout;
import android.widget.RelativeLayout;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.GridLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
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 com.yizhuan.erban.R;
import com.yizhuan.erban.base.BaseMvpActivity;
import com.yizhuan.erban.common.photo.PhotoProvider;
import com.yizhuan.erban.common.util.PhotoCompressUtil;
import com.yizhuan.erban.common.util.PhotosCompressCallback;
import com.yizhuan.erban.common.widget.dialog.ChooseWorldsDialog;
import com.yizhuan.erban.common.widget.dialog.DialogManager;
import com.yizhuan.erban.community.ConstantValue;
@@ -32,9 +39,8 @@ import com.yizhuan.erban.community.photo.BigPhotoActivity;
import com.yizhuan.erban.community.photo.PagerOption;
import com.yizhuan.erban.community.publish.ImageAdapter;
import com.yizhuan.erban.community.publish.presenter.PublishPresenter;
import com.yizhuan.erban.community.utils.Glide4Engine;
import com.yizhuan.erban.community.utils.ObjectTypeHelper;
import com.yizhuan.erban.ui.login.BindPhoneActivity;
import com.yizhuan.erban.ui.widget.dialog.CommonTipDialog;
import com.yizhuan.erban.ui.widget.recyclerview.decoration.GridSpacingItemDecoration;
import com.yizhuan.xchat_android_constants.XChatConstants;
import com.yizhuan.xchat_android_core.Constants;
@@ -49,15 +55,15 @@ import com.yizhuan.xchat_android_core.user.bean.UserInfo;
import com.yizhuan.xchat_android_core.utils.SharedPreferenceUtils;
import com.yizhuan.xchat_android_core.utils.net.DontWarnObserver;
import com.yizhuan.xchat_android_library.base.factory.CreatePresenter;
import com.yizhuan.xchat_android_library.easypermisssion.EasyPermissions;
import com.yizhuan.xchat_android_library.utils.ResUtil;
import com.yizhuan.xchat_android_library.utils.SingleToastUtil;
import com.yizhuan.xchat_android_library.utils.config.BasicConfig;
import com.zhihu.matisse.Matisse;
import com.zhihu.matisse.MimeType;
import com.zhihu.matisse.internal.entity.CaptureStrategy;
import com.zhihu.matisse.internal.entity.CustomItem;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.concurrent.TimeUnit;
@@ -66,14 +72,21 @@ import butterknife.ButterKnife;
import butterknife.OnClick;
import io.reactivex.Single;
import io.reactivex.android.schedulers.AndroidSchedulers;
import kotlin.Unit;
import kotlin.jvm.functions.Function1;
import kotlinx.coroutines.Job;
/**
* create by lvzebiao @2019/11/11
*/
@CreatePresenter(PublishPresenter.class)
public class PublishActivity extends BaseMvpActivity<IPublishView, PublishPresenter> implements IPublishView, WorldsChooseFrg.ChooseWorldCallback {
public class PublishActivity extends BaseMvpActivity<IPublishView, PublishPresenter>
implements IPublishView, WorldsChooseFrg.ChooseWorldCallback, EasyPermissions.PermissionCallbacks {
private final static String KEY_SP_ORIGINAL_IMAGE = "key_sp_original_image";
private final static int PERMISSION_CODE_STORAGE = 12;
private final static int REQUEST_CODE_STORAGE = 42;
private final static int REQUEST_CODE_OPEN_PHOTO_PROVIDER = 111; // 从相册中选择
@BindView(R.id.rv_images)
RecyclerView rvImages;
@@ -113,6 +126,8 @@ public class PublishActivity extends BaseMvpActivity<IPublishView, PublishPresen
// 话题客态页进入(话题进入不让修改话题标签)
private boolean fromWorld;
private Job mJob = null;
public static void start(DialogManager manager, long worldId) {
if (beforeStart(manager)) {
return;
@@ -192,26 +207,26 @@ public class PublishActivity extends BaseMvpActivity<IPublishView, PublishPresen
imageAdapter.setOnItemClickListener((adapter, view, position) -> {
PublishItem item = imageShowList.get(position);
if (item.isAddItem()) {
checkPermission(() -> {
CaptureStrategy captureStrategy = new CaptureStrategy(true, context.getPackageName()+".fileprovider",
BasicConfig.INSTANCE.getImageDir().getAbsolutePath());
int maxCanSelect = 9 - uploadList.size();
Matisse.from(PublishActivity.this)
.choose(MimeType.ofImage())
.showSingleMediaType(true)
.capture(true)
.spanCount(4)
.captureStrategy(captureStrategy)
.countable(true)
.maxSelectable(maxCanSelect)
.originalEnable(false)
.maxOriginalSize(10)
.imageEngine(new Glide4Engine())
.setType(2)
.setOriginalImagee(isOriginalImage)
.forResult(ConstantValue.CODE_CHOOSE_PHOTO);
}, R.string.ask_storage, Manifest.permission.READ_EXTERNAL_STORAGE);
// checkPermission(() -> {
// CaptureStrategy captureStrategy = new CaptureStrategy(true, context.getPackageName() + ".fileprovider",
// BasicConfig.INSTANCE.getImageDir().getAbsolutePath());
// int maxCanSelect = 9 - uploadList.size();
// Matisse.from(PublishActivity.this)
// .choose(MimeType.ofImage())
// .showSingleMediaType(true)
// .capture(true)
// .spanCount(4)
// .captureStrategy(captureStrategy)
// .countable(true)
// .maxSelectable(maxCanSelect)
// .originalEnable(false)
// .maxOriginalSize(10)
// .imageEngine(new Glide4Engine())
// .setType(2)
// .setOriginalImagee(isOriginalImage)
// .forResult(ConstantValue.CODE_CHOOSE_PHOTO);
// }, R.string.ask_storage, Manifest.permission.READ_EXTERNAL_STORAGE);
checkStoragePermission();
} else {
BigPhotoActivity.startCanDelete(PublishActivity.this, (ArrayList<CustomItem>) uploadList,
position, new PagerOption().setDelete(true));
@@ -315,7 +330,7 @@ public class PublishActivity extends BaseMvpActivity<IPublishView, PublishPresen
long worldId = getMvpPresenter().getWorldId();
if (worldId > 0) {
MiniWorldModel.getInstance().getWorldDetailInfo(String.valueOf(worldId),
String.valueOf(AuthModel.get().getCurrentUid()))
String.valueOf(AuthModel.get().getCurrentUid()))
.compose(bindUntilEvent(ActivityEvent.DESTROY))
.doOnSuccess(info -> {
if (info != null && !TextUtils.isEmpty(info.getName())) {
@@ -329,8 +344,45 @@ public class PublishActivity extends BaseMvpActivity<IPublishView, PublishPresen
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == RESULT_OK) {
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<String>, Unit>() {
@Override
public Unit invoke(List<String> list) {
List<String> paths = list;
if (paths.isEmpty()) {
return null;
} else {
if (mJob != null) {
mJob.cancel(null);
} else {
mJob = PhotoCompressUtil.compress(PublishActivity.this, paths,
PhotoCompressUtil.getCompressCachePath("publish")
, new PhotosCompressCallback() {
@Override
public void onSuccess(@NonNull ArrayList<String> compressedImgList) {
List<String> pathResult = compressedImgList;
LogUtil.print(pathResult);
}
@Override
public void onFail(@NonNull Throwable e) {
}
}, 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);
@@ -544,4 +596,75 @@ public class PublishActivity extends BaseMvpActivity<IPublishView, PublishPresen
StatusBarUtil.transparencyBar(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() {
//同意跳到应用详情页面
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() {
CommonTipDialog.OnActionListener.super.onCancel();
//取消跳到应用详情页面
ToastUtils.show(getString(R.string.permission_storage_refused));
}
});
mPrivacyDialog.show();
}
}
private void checkStoragePermission() {
if (!EasyPermissions.hasPermissions(
this,
Manifest.permission.WRITE_EXTERNAL_STORAGE,
Manifest.permission.READ_EXTERNAL_STORAGE
)
) {
EasyPermissions.requestPermissions(
this,
getString(R.string.permission_storage_rationale),
PERMISSION_CODE_STORAGE,
Manifest.permission.WRITE_EXTERNAL_STORAGE,
Manifest.permission.READ_EXTERNAL_STORAGE
);
} else {
PhotoProvider.photoProvider(
this,
9,
true,
REQUEST_CODE_OPEN_PHOTO_PROVIDER,
true
);
}
}
}

View File

@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="pic_text_publish">圖文發</string>
<string name="pic_text_publish">圖文發</string>
<string name="dy_publish">發布</string>
<string name="dy_say_something">記錄你此刻生活,分享給有趣的人看...</string>
<string name="dy_pub_comment">發表評論</string>

View File

@@ -0,0 +1,11 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<corners android:radius="100dp" />
<gradient
android:angle="180"
android:endColor="#4DFFA936"
android:startColor="#4DFFCB47"
android:type="linear"
android:useLevel="true" />
</shape>

View File

@@ -0,0 +1,13 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<gradient
android:angle="180"
android:endColor="#19EBFF"
android:startColor="#ED66FF"
android:type="linear"
android:useLevel="true" />
<corners android:radius="28dp" />
</shape>

View File

@@ -0,0 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<solid android:color="#FFFFFF" />
<corners android:radius="20dp" />
</shape>

View File

@@ -3,49 +3,51 @@
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
android:background="@drawable/shape_white_20dp_round"
android:orientation="vertical"
tools:background="@color/black_transparent_10">
<TextView
android:id="@+id/tv_rationale"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_horizontal"
android:minHeight="50dp"
android:padding="15dp"
android:textColor="#555555"
android:layout_marginTop="26dp"
android:layout_marginBottom="32dp"
android:gravity="center"
android:lineSpacingMultiplier="1.2"
android:paddingStart="20dp"
android:paddingEnd="20dp"
android:textColor="@color/color_333333"
android:textSize="14sp"
tools:text="殴打司法局案件司法局OA四季豆覅降低" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="50dp"
android:layout_marginTop="15dp"
android:layout_marginBottom="15dp"
android:layout_height="wrap_content"
android:layout_marginBottom="24dp"
android:gravity="center_horizontal"
android:orientation="horizontal">
<Button
android:id="@+id/btn_cancel"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_marginLeft="15dp"
android:layout_marginRight="15dp"
android:layout_weight="1"
android:layout_width="120dp"
android:layout_height="38dp"
android:layout_marginEnd="16dp"
android:background="@drawable/bg_common_cancel"
android:gravity="center"
android:textColor="#555555"
android:textSize="14sp"
tools:text="取消" />
android:text="@string/cancel"
android:textColor="@color/color_7154EE"
android:textSize="15sp" />
<Button
android:id="@+id/btn_ok"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_marginLeft="15dp"
android:layout_marginRight="15dp"
android:layout_weight="1"
android:layout_width="120dp"
android:layout_height="38dp"
android:background="@drawable/bg_common_confirm_normal"
android:gravity="center"
android:textColor="#555555"
android:textSize="14sp"
tools:text="确定" />
android:text="@string/sure"
android:textColor="@color/color_white"
android:textSize="15sp" />
</LinearLayout>
</LinearLayout>

View File

@@ -4,4 +4,7 @@
<color name="colorEasyPrimary">#ff212121</color>
<color name="colorEasyPrimaryDark">@android:color/black</color>
<color name="colorEasyAccent">#ff80cbc4</color>
<color name="black_transparent_10">#1A000000</color>
<color name="color_333333">#333333</color>
<color name="color_7154EE">#FFA936</color>
</resources>

View File

@@ -2,4 +2,6 @@
<string name="rationale_ask">如果沒有請求的權限,此應用程式可能無法正常工作。</string>
<string name="rationale_ask_again">如果沒有請求的權限,此應用程式可能無法正常工作,打開應用設置頁面以修改應用權限。</string>
<string name="title_settings_dialog">所需權限</string>
<string name="sure">確定</string>
<string name="cancel">取消</string>
</resources>