动态选择图片修改
This commit is contained in:
@@ -168,6 +168,7 @@ object PhotoCompressUtil {
|
||||
private fun getCompressLocationPath(tag: String): String {
|
||||
return "${FileHelper.getRootFilesDir(Environment.DIRECTORY_PICTURES).absolutePath}/compress/${tag}/"
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
interface PhotosCompressCallback {
|
||||
|
@@ -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)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -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))
|
||||
|
@@ -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) {
|
||||
|
@@ -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>
|
||||
|
@@ -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;
|
||||
}
|
||||
|
@@ -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
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
@@ -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>
|
||||
|
@@ -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>
|
@@ -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>
|
@@ -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>
|
@@ -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>
|
@@ -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>
|
||||
|
@@ -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>
|
||||
|
Reference in New Issue
Block a user