[Modify]动态页适配安卓10.0

This commit is contained in:
wushaocheng
2022-12-02 20:55:23 +08:00
parent 62702c9650
commit 7b25dfa1ef
5 changed files with 170 additions and 27 deletions

View File

@@ -9,7 +9,7 @@
android:icon="@mipmap/app_logo" android:icon="@mipmap/app_logo"
android:label="@string/app_name" android:label="@string/app_name"
android:largeHeap="true" android:largeHeap="true"
android:requestLegacyExternalStorage="true" android:requestLegacyExternalStorage="false"
android:resizeableActivity="true" android:resizeableActivity="true"
android:supportsRtl="true" android:supportsRtl="true"
android:theme="@style/MyMaterialTheme" android:theme="@style/MyMaterialTheme"

View File

@@ -93,6 +93,7 @@ class UserInfoModifyActivity : BaseViewBindingActivity<ActivityUserInfoModifyBin
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()
} }
override fun click(position: Int, userPhoto: UserPhoto, isOwner: Boolean) { override fun click(position: Int, userPhoto: UserPhoto, isOwner: Boolean) {

View File

@@ -78,6 +78,7 @@ class UserModifyPhotosActivity : TakePhotoActivity(), PhotoItemClickListener,
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
setContentView(R.layout.activity_user_photos_modify) setContentView(R.layout.activity_user_photos_modify)
PhotoCompressUtil.clearCompressCache()
initView() initView()
mActivity = this mActivity = this
userId = intent.getLongExtra("userId", 0) userId = intent.getLongExtra("userId", 0)

View File

@@ -1,9 +1,12 @@
package com.yizhuan.erban.community.publish.view; package com.yizhuan.erban.community.publish.view;
import android.Manifest; 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.os.Bundle; import android.os.Bundle;
import android.provider.Settings;
import android.text.Editable; import android.text.Editable;
import android.text.TextUtils; import android.text.TextUtils;
import android.text.TextWatcher; import android.text.TextWatcher;
@@ -16,10 +19,12 @@ import android.widget.LinearLayout;
import android.widget.RelativeLayout; import android.widget.RelativeLayout;
import android.widget.TextView; import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.GridLayoutManager; import androidx.recyclerview.widget.GridLayoutManager;
import androidx.recyclerview.widget.RecyclerView; import androidx.recyclerview.widget.RecyclerView;
import com.google.android.flexbox.FlexboxLayout; import com.google.android.flexbox.FlexboxLayout;
import com.hjq.toast.ToastUtils;
import com.netease.nim.uikit.StatusBarUtil; import com.netease.nim.uikit.StatusBarUtil;
import com.netease.nim.uikit.common.util.log.LogUtil; import com.netease.nim.uikit.common.util.log.LogUtil;
import com.trello.rxlifecycle3.android.ActivityEvent; 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.photo.PagerOption;
import com.yizhuan.erban.community.publish.ImageAdapter; import com.yizhuan.erban.community.publish.ImageAdapter;
import com.yizhuan.erban.community.publish.presenter.PublishPresenter; 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.community.utils.ObjectTypeHelper;
import com.yizhuan.erban.ui.widget.dialog.CommonTipDialog;
import com.yizhuan.erban.ui.widget.recyclerview.decoration.GridSpacingItemDecoration; import com.yizhuan.erban.ui.widget.recyclerview.decoration.GridSpacingItemDecoration;
import com.yizhuan.xchat_android_constants.XChatConstants; import com.yizhuan.xchat_android_constants.XChatConstants;
import com.yizhuan.xchat_android_core.Constants; 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.SharedPreferenceUtils;
import com.yizhuan.xchat_android_core.utils.net.DontWarnObserver; import com.yizhuan.xchat_android_core.utils.net.DontWarnObserver;
import com.yizhuan.xchat_android_library.base.factory.CreatePresenter; 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.ResUtil;
import com.yizhuan.xchat_android_library.utils.SingleToastUtil; 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.Matisse;
import com.zhihu.matisse.MimeType;
import com.zhihu.matisse.internal.entity.CaptureStrategy;
import com.zhihu.matisse.internal.entity.CustomItem; import com.zhihu.matisse.internal.entity.CustomItem;
import java.util.ArrayList; import java.util.ArrayList;
@@ -65,15 +71,22 @@ import butterknife.ButterKnife;
import butterknife.OnClick; import butterknife.OnClick;
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;
/** /**
* create by lvzebiao @2019/11/11 * create by lvzebiao @2019/11/11
*/ */
@CreatePresenter(PublishPresenter.class) @CreatePresenter(PublishPresenter.class)
public class PublishActivity extends BaseMvpActivity<IPublishView, PublishPresenter> 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 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) @BindView(R.id.rv_images)
RecyclerView rvImages; RecyclerView rvImages;
@@ -113,6 +126,8 @@ public class PublishActivity extends BaseMvpActivity<IPublishView, PublishPresen
// 话题客态页进入(话题进入不让修改话题标签) // 话题客态页进入(话题进入不让修改话题标签)
private boolean fromWorld; private boolean fromWorld;
private Job mJob = null;
public static void start(DialogManager manager, long worldId) { public static void start(DialogManager manager, long worldId) {
if (beforeStart(manager)) { if (beforeStart(manager)) {
return; return;
@@ -192,25 +207,26 @@ public class PublishActivity extends BaseMvpActivity<IPublishView, PublishPresen
imageAdapter.setOnItemClickListener((adapter, view, position) -> { imageAdapter.setOnItemClickListener((adapter, view, position) -> {
PublishItem item = imageShowList.get(position); PublishItem item = imageShowList.get(position);
if (item.isAddItem()) { if (item.isAddItem()) {
checkPermission(() -> { // checkPermission(() -> {
CaptureStrategy captureStrategy = new CaptureStrategy(true, context.getPackageName() + ".fileprovider", // CaptureStrategy captureStrategy = new CaptureStrategy(true, context.getPackageName() + ".fileprovider",
BasicConfig.INSTANCE.getImageDir().getAbsolutePath()); // BasicConfig.INSTANCE.getImageDir().getAbsolutePath());
int maxCanSelect = 9 - uploadList.size(); // int maxCanSelect = 9 - uploadList.size();
Matisse.from(PublishActivity.this) // Matisse.from(PublishActivity.this)
.choose(MimeType.ofImage()) // .choose(MimeType.ofImage())
.showSingleMediaType(true) // .showSingleMediaType(true)
.capture(true) // .capture(true)
.spanCount(4) // .spanCount(4)
.captureStrategy(captureStrategy) // .captureStrategy(captureStrategy)
.countable(true) // .countable(true)
.maxSelectable(maxCanSelect) // .maxSelectable(maxCanSelect)
.originalEnable(false) // .originalEnable(false)
.maxOriginalSize(10) // .maxOriginalSize(10)
.imageEngine(new Glide4Engine()) // .imageEngine(new Glide4Engine())
.setType(2) // .setType(2)
.setOriginalImagee(isOriginalImage) // .setOriginalImagee(isOriginalImage)
.forResult(ConstantValue.CODE_CHOOSE_PHOTO); // .forResult(ConstantValue.CODE_CHOOSE_PHOTO);
}, R.string.ask_storage, Manifest.permission.READ_EXTERNAL_STORAGE); // }, R.string.ask_storage, Manifest.permission.READ_EXTERNAL_STORAGE);
checkStoragePermission();
} else { } else {
BigPhotoActivity.startCanDelete(PublishActivity.this, (ArrayList<CustomItem>) uploadList, BigPhotoActivity.startCanDelete(PublishActivity.this, (ArrayList<CustomItem>) uploadList,
position, new PagerOption().setDelete(true)); position, new PagerOption().setDelete(true));
@@ -328,8 +344,56 @@ public class PublishActivity extends BaseMvpActivity<IPublishView, PublishPresen
@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 (resultCode == RESULT_OK) { if (requestCode == REQUEST_CODE_STORAGE) {
checkStoragePermission();
} else if (resultCode == RESULT_OK) {
switch (requestCode) { 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: case ConstantValue.CODE_CHOOSE_PHOTO:
String mimeType = Matisse.obtainMineResult(data); String mimeType = Matisse.obtainMineResult(data);
List<CustomItem> pathResult = Matisse.obtainPathResult(data); List<CustomItem> pathResult = Matisse.obtainPathResult(data);
@@ -544,4 +608,81 @@ 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() {
//同意跳到应用详情页面
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);
}
}
} }

View File

@@ -16,7 +16,7 @@ import java.io.File;
/** /**
* Created by hzxuwen on 2015/6/12. * Created by hzxuwen on 2015/6/12.
*/ */
public class ImageAction extends PickImageAction { public class ImageAction extends PickImageActionNew {
public ImageAction() { public ImageAction() {
super(R.drawable.chat_icon_photo, R.string.input_panel_photo, true); super(R.drawable.chat_icon_photo, R.string.input_panel_photo, true);