|
|
|
@@ -1,9 +1,12 @@
|
|
|
|
|
|
|
|
|
|
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,10 +19,12 @@ 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;
|
|
|
|
@@ -32,8 +37,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.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;
|
|
|
|
@@ -48,12 +53,13 @@ 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.common.photo.PhotoProvider;
|
|
|
|
|
import com.yizhuan.xchat_android_library.common.util.PhotoCompressUtil;
|
|
|
|
|
import com.yizhuan.xchat_android_library.common.util.PhotosCompressCallback;
|
|
|
|
|
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.util.ArrayList;
|
|
|
|
@@ -65,15 +71,22 @@ 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 {
|
|
|
|
|
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; // 从相册中选择
|
|
|
|
|
private final static int maxSelect = 9;
|
|
|
|
|
|
|
|
|
|
@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,25 +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));
|
|
|
|
@@ -328,8 +344,56 @@ 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) {
|
|
|
|
|
if (list.isEmpty()) {
|
|
|
|
|
return null;
|
|
|
|
|
} else {
|
|
|
|
|
if (mJob != null) {
|
|
|
|
|
mJob.cancel(null);
|
|
|
|
|
}
|
|
|
|
|
mJob = PhotoCompressUtil.compress(PublishActivity.this, list,
|
|
|
|
|
PhotoCompressUtil.getCompressCachePath("publish")
|
|
|
|
|
, new PhotosCompressCallback() {
|
|
|
|
|
@Override
|
|
|
|
|
public void onSuccess(@NonNull ArrayList<String> compressedImgList) {
|
|
|
|
|
List<CustomItem> pathResult = new ArrayList<>();
|
|
|
|
|
for (String path : compressedImgList) {
|
|
|
|
|
pathResult.add(new CustomItem(path, CustomItem.IMAGE_NORMAL, "jpeg"));
|
|
|
|
|
}
|
|
|
|
|
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);
|
|
|
|
@@ -544,4 +608,81 @@ public class PublishActivity extends BaseMvpActivity<IPublishView, PublishPresen
|
|
|
|
|
StatusBarUtil.StatusBarLightMode(this);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
|
|
|
|
|
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
|
|
|
|
|
EasyPermissions.onRequestPermissionsResult(requestCode, permissions, grantResults, this);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public void onPermissionsGranted(int requestCode, @NonNull List<String> perms) {
|
|
|
|
|
if (requestCode == PERMISSION_CODE_STORAGE) {
|
|
|
|
|
checkStoragePermission();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public void onPermissionsDenied(int requestCode, @NonNull List<String> perms) {
|
|
|
|
|
if (requestCode == PERMISSION_CODE_STORAGE) {
|
|
|
|
|
String requestTip = getString(R.string.permission_storage_denied);
|
|
|
|
|
CommonTipDialog mPrivacyDialog = new CommonTipDialog(context);
|
|
|
|
|
mPrivacyDialog.setTipMsg(requestTip);
|
|
|
|
|
mPrivacyDialog.setOkText(getString(R.string.room_perform_go_update));
|
|
|
|
|
mPrivacyDialog.setOnActionListener(new CommonTipDialog.OnActionListener() {
|
|
|
|
|
@Override
|
|
|
|
|
public void onOk() {
|
|
|
|
|
//同意跳到应用详情页面
|
|
|
|
|
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,
|
|
|
|
|
maxSelect - uploadList.size(),
|
|
|
|
|
true,
|
|
|
|
|
REQUEST_CODE_OPEN_PHOTO_PROVIDER,
|
|
|
|
|
true
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
protected void onDestroy() {
|
|
|
|
|
super.onDestroy();
|
|
|
|
|
if (mJob != null) {
|
|
|
|
|
mJob.cancel(null);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|