Compare commits
3 Commits
release_2.
...
release_2.
Author | SHA1 | Date | |
---|---|---|---|
![]() |
3ac10340d6 | ||
![]() |
a10471d1c2 | ||
![]() |
d47536cc13 |
119
app/build.gradle
119
app/build.gradle
@@ -3,12 +3,9 @@ apply plugin: 'com.android.application'
|
||||
apply plugin: 'com.android.application'
|
||||
apply plugin: 'kotlin-android'
|
||||
apply plugin: 'com.huawei.agconnect'
|
||||
apply plugin: 'com.tencent.vasdolly'
|
||||
apply from: '../mob.gradle'
|
||||
apply plugin: 'android-junk-code'
|
||||
|
||||
def onlyArm64 = Boolean.parseBoolean(only_arm64)
|
||||
|
||||
android {
|
||||
compileSdkVersion COMPILE_SDK_VERSION.toInteger()
|
||||
|
||||
@@ -21,20 +18,20 @@ android {
|
||||
|
||||
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
|
||||
multiDexEnabled true
|
||||
ndk {
|
||||
abiFilters 'armeabi-v7a', 'arm64-v8a', 'x86'
|
||||
}
|
||||
// ndk {
|
||||
// abiFilters 'armeabi-v7a', 'arm64-v8a', 'x86'
|
||||
// }
|
||||
flavorDimensions 'default'
|
||||
}
|
||||
|
||||
splits {
|
||||
abi {
|
||||
enable true
|
||||
reset()
|
||||
include 'armeabi-v7a', 'arm64-v8a', 'x86'
|
||||
universalApk true
|
||||
}
|
||||
}
|
||||
// splits {
|
||||
// abi {
|
||||
// enable true
|
||||
// reset()
|
||||
// include 'armeabi-v7a', 'arm64-v8a', 'x86'
|
||||
// universalApk true
|
||||
// }
|
||||
// }
|
||||
|
||||
//在apk文件后边生成版本号信息
|
||||
android.applicationVariants.configureEach { variant ->
|
||||
@@ -50,7 +47,7 @@ android {
|
||||
if (abi == null) {
|
||||
abi = "universal"
|
||||
}
|
||||
outputFileName = "yinmeng_${buildType.name}_v${defaultConfig.versionName}_${abi}_${date}.apk"
|
||||
outputFileName = "yinmeng_${variant.flavorName}_${buildType.name}_v${defaultConfig.versionName}_${defaultConfig.versionCode}_${abi}_${date}.apk"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -182,6 +179,54 @@ android {
|
||||
|
||||
buildToolsVersion = '30.0.3'
|
||||
|
||||
productFlavors {
|
||||
official {
|
||||
ndk {
|
||||
abiFilters 'armeabi-v7a', 'arm64-v8a'
|
||||
}
|
||||
}
|
||||
mlq {
|
||||
ndk {
|
||||
abiFilters 'x86'
|
||||
}
|
||||
}
|
||||
yingyongbao {
|
||||
ndk {
|
||||
abiFilters 'armeabi-v7a'
|
||||
}
|
||||
}
|
||||
vivo {
|
||||
ndk {
|
||||
abiFilters 'arm64-v8a'
|
||||
}
|
||||
}
|
||||
oppo {
|
||||
ndk {
|
||||
abiFilters 'arm64-v8a'
|
||||
}
|
||||
}
|
||||
xiaomi {
|
||||
ndk {
|
||||
abiFilters 'arm64-v8a'
|
||||
}
|
||||
}
|
||||
huawei {
|
||||
ndk {
|
||||
abiFilters 'arm64-v8a'
|
||||
}
|
||||
}
|
||||
kuaishou_01 {
|
||||
ndk {
|
||||
abiFilters 'armeabi-v7a', 'arm64-v8a'
|
||||
}
|
||||
}
|
||||
}
|
||||
productFlavors.all { flavor ->
|
||||
flavor.manifestPlaceholders = [
|
||||
// 渠道
|
||||
CHANNEL_VALUE : name,
|
||||
]
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -258,7 +303,7 @@ dependencies {
|
||||
//oppo推送需要
|
||||
implementation 'commons-codec:commons-codec:1.6'
|
||||
|
||||
api 'com.tencent.vasdolly:helper:3.0.3'
|
||||
// api 'com.tencent.vasdolly:helper:3.0.3'
|
||||
implementation "io.github.tencent:vap:2.0.24"
|
||||
|
||||
implementation 'com.github.mmin18:realtimeblurview:1.2.1'
|
||||
@@ -276,36 +321,20 @@ repositories {
|
||||
|
||||
}
|
||||
|
||||
channel {
|
||||
//多渠道包的输出目录,默认为new File(project.buildDir,"channel")
|
||||
outputDir = new File(project.buildDir, "channelapk")
|
||||
//多渠道包的命名规则,默认为:${appName}-${versionName}-${versionCode}-${flavorName}-${buildType}-${buildTime}
|
||||
def only64 = onlyArm64 ? "-only64" : ""
|
||||
apkNameFormat = 'yinmeng-${buildType}only64-${flavorName}-v${versionName}-${buildTime}'.replace("only64", only64)
|
||||
//快速模式:生成渠道包时不进行校验(速度可以提升10倍以上,默认为false)
|
||||
fastMode = false
|
||||
//buildTime的时间格式,默认格式:yyyyMMdd-HHmmss
|
||||
buildTimeDateFormat = 'MMddHHmm'
|
||||
//低内存模式(仅针对V2签名,默认为false):只把签名块、中央目录和EOCD读取到内存,不把最大头的内容块读取到内存,在手机上合成APK时,可以使用该模式
|
||||
lowMemory = false
|
||||
}
|
||||
|
||||
android.applicationVariants.all { variant ->
|
||||
print("variant.name=" + variant.name)
|
||||
switch (variant.name) {//变体名称,如果没有设置productFlavors就是buildType名称,如果有设置productFlavors就是flavor+buildType,例如(freeRelease、proRelease)
|
||||
case "release":
|
||||
androidJunkCode.configMap.put(variant.name, {
|
||||
packageBase = "com.nnbc123.plugin.ui" //生成java类根包名
|
||||
packageCount = 30 //生成包数量
|
||||
activityCountPerPackage = 30 //每个包下生成Activity类数量
|
||||
excludeActivityJavaFile = false
|
||||
//是否排除生成Activity的Java文件,默认false(layout和写入AndroidManifest.xml还会执行),主要用于处理类似神策全埋点编译过慢问题
|
||||
otherCountPerPackage = 50 //每个包下生成其它类的数量
|
||||
methodCountPerClass = 20 //每个类下生成方法数量
|
||||
resPrefix = "mango_" //生成的layout、drawable、string等资源名前缀
|
||||
drawableCount = 300 //生成drawable资源数量
|
||||
stringCount = 300 //生成string数量
|
||||
})
|
||||
break
|
||||
if (variant.name.contains("release") || variant.name.contains("Release")) {
|
||||
androidJunkCode.configMap.put(variant.name, {
|
||||
packageBase = "com.nnbc123.plugin.ui" //生成java类根包名
|
||||
packageCount = 30 //生成包数量
|
||||
activityCountPerPackage = 30 //每个包下生成Activity类数量
|
||||
excludeActivityJavaFile = false
|
||||
//是否排除生成Activity的Java文件,默认false(layout和写入AndroidManifest.xml还会执行),主要用于处理类似神策全埋点编译过慢问题
|
||||
otherCountPerPackage = 50 //每个包下生成其它类的数量
|
||||
methodCountPerClass = 20 //每个类下生成方法数量
|
||||
resPrefix = "mango_" //生成的layout、drawable、string等资源名前缀
|
||||
drawableCount = 300 //生成drawable资源数量
|
||||
stringCount = 300 //生成string数量
|
||||
})
|
||||
}
|
||||
}
|
@@ -86,6 +86,10 @@
|
||||
android:theme="@style/MyMaterialTheme"
|
||||
android:usesCleartextTraffic="true"
|
||||
tools:replace="android:name,android:allowBackup">
|
||||
<!-- 多渠道 -->
|
||||
<meta-data
|
||||
android:name="CHANNEL"
|
||||
android:value="${CHANNEL_VALUE}" />
|
||||
<!-- 刘海屏适配 begin -->
|
||||
<!-- 小米 -->
|
||||
<meta-data
|
||||
|
@@ -28,6 +28,7 @@ import androidx.multidex.MultiDex;
|
||||
|
||||
import com.bumptech.glide.request.target.ViewTarget;
|
||||
import com.bytedance.hume.readapk.HumeSDK;
|
||||
import com.chuhai.utils.MetaDataUtils;
|
||||
import com.coorchice.library.utils.LogUtils;
|
||||
import com.facebook.stetho.Stetho;
|
||||
import com.heytap.msp.push.HeytapPushManager;
|
||||
@@ -61,7 +62,6 @@ import com.scwang.smartrefresh.layout.footer.ClassicsFooter;
|
||||
import com.tencent.bugly.Bugly;
|
||||
import com.tencent.bugly.beta.Beta;
|
||||
import com.tencent.bugly.crashreport.CrashReport;
|
||||
import com.tencent.vasdolly.helper.ChannelReaderUtil;
|
||||
import com.umeng.analytics.MobclickAgent;
|
||||
import com.umeng.commonsdk.UMConfigure;
|
||||
import com.nnbc123.app.BuildConfig;
|
||||
@@ -213,12 +213,12 @@ public class XChatApplication extends BaseApp {
|
||||
// 初始化 sp
|
||||
long startTime = System.currentTimeMillis();
|
||||
|
||||
String channel = "";
|
||||
channel = ChannelReaderUtil.getChannel(instance);
|
||||
String channel;
|
||||
channel = MetaDataUtils.INSTANCE.getStringData(Constants.CHANNEL_KEY, application);
|
||||
if (TextUtils.isEmpty(channel)) {
|
||||
channel = "official";
|
||||
}
|
||||
|
||||
Log.d("XChatApplication", "channel:" + channel);
|
||||
BasicConfig.INSTANCE.setOriginalChannel(channel);
|
||||
|
||||
//头条分包渠道
|
||||
@@ -228,6 +228,7 @@ public class XChatApplication extends BaseApp {
|
||||
channel = byteDanceChannel;
|
||||
}
|
||||
}
|
||||
Log.d("XChatApplication", "channel2:" + channel);
|
||||
BasicConfig.INSTANCE.setChannel(channel);
|
||||
|
||||
initEnv();
|
||||
|
@@ -554,36 +554,20 @@ class HomePartyFragment : BaseFragment(), View.OnClickListener, OnShareDialogIte
|
||||
.compose(bindToLifecycle())
|
||||
.compose(RxHelper.handleBeanData())
|
||||
.subscribe { roomContributeDataInfo: RoomContributeDataInfo ->
|
||||
val rankings = roomContributeDataInfo.rankings
|
||||
updateRoomRanks(roomContributeDataInfo.rankings)
|
||||
var imageView: ImageView
|
||||
val avatarList = listOf(
|
||||
binding.ivRank0,
|
||||
binding.ivRank1,
|
||||
binding.ivRank2
|
||||
)
|
||||
for (i in avatarList.indices) {
|
||||
imageView = avatarList[i]
|
||||
if (rankings.size > i) {
|
||||
val info = rankings[i]
|
||||
imageView.loadAvatar(info.avatar)
|
||||
} else {
|
||||
imageView.setImageResource(R.drawable.default_avatar)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private fun updateRoomRanks(data: List<RoomContributeUserInfo>) {
|
||||
val avatarList = arrayListOf(
|
||||
binding.ivRank0,
|
||||
// binding.ivRank1,
|
||||
// binding.ivRank2
|
||||
binding.ivRank1,
|
||||
binding.ivRank2
|
||||
)
|
||||
val stvList = arrayListOf(
|
||||
binding.stvRank0,
|
||||
// binding.stvRank1,
|
||||
// binding.stvRank2
|
||||
binding.stvRank1,
|
||||
binding.stvRank2
|
||||
)
|
||||
for (i in 0 until avatarList.size) {
|
||||
avatarList[i].loadAvatar(data.getOrNull(i)?.avatar)
|
||||
|
@@ -134,7 +134,7 @@ public abstract class BaseActivity extends RxAppCompatActivity
|
||||
*/
|
||||
|
||||
protected static final String STATUS_TAG = "STATUS_TAG";
|
||||
private final RxPermissions rxPermissions = new RxPermissions(this);
|
||||
protected final RxPermissions rxPermissions = new RxPermissions(this);
|
||||
protected TitleBar mTitleBar;
|
||||
protected DefaultToolBar mToolBar;
|
||||
protected CompositeDisposable mCompositeDisposable;
|
||||
|
@@ -0,0 +1,26 @@
|
||||
package com.nnbc123.app.common.permission
|
||||
|
||||
import com.tbruyelle.rxpermissions2.RxPermissions
|
||||
|
||||
/**
|
||||
* Created by Max on 2024/1/8 10:25
|
||||
* Desc:
|
||||
**/
|
||||
object PermissionHelper {
|
||||
|
||||
/**
|
||||
* 检查权限是否都授权
|
||||
*/
|
||||
fun isAllGender(rxPermissions: RxPermissions, vararg perms: String?): Boolean {
|
||||
if (perms.firstOrNull {
|
||||
if (it == null) {
|
||||
false
|
||||
} else {
|
||||
!rxPermissions.isGranted(it)
|
||||
}
|
||||
} != null) {
|
||||
return false
|
||||
}
|
||||
return true
|
||||
}
|
||||
}
|
@@ -5,12 +5,17 @@ import android.content.Context
|
||||
import android.content.Intent
|
||||
import android.net.Uri
|
||||
import android.provider.Settings
|
||||
import androidx.fragment.app.FragmentActivity
|
||||
import com.chuhai.utils.ktx.asActivity
|
||||
import com.nnbc123.app.R
|
||||
import com.nnbc123.app.common.permission.PermissionHelper
|
||||
import com.nnbc123.app.ui.widget.dialog.CommonTipDialog
|
||||
import com.nnbc123.app.ui.widget.dialog.RequestPermissionPromptDialog
|
||||
import com.nnbc123.library.utils.ResUtil
|
||||
import com.qiyukf.unicorn.api.event.EventCallback
|
||||
import com.qiyukf.unicorn.api.event.UnicornEventBase
|
||||
import com.qiyukf.unicorn.api.event.entry.RequestPermissionEventEntry
|
||||
import com.tbruyelle.rxpermissions2.RxPermissions
|
||||
|
||||
/**
|
||||
* Created by Max on 2024/1/4 11:10
|
||||
@@ -22,18 +27,60 @@ class RequestPermissionEvent : UnicornEventBase<RequestPermissionEventEntry> {
|
||||
p1: Context?,
|
||||
p2: EventCallback<RequestPermissionEventEntry>?
|
||||
) {
|
||||
p2?.onNotPorcessEvent()
|
||||
val tips = getPermissionTips(p0?.scenesType)
|
||||
val activity = (p1?.asActivity() as? FragmentActivity)
|
||||
val perms = p0?.permissionList?.toTypedArray()
|
||||
if (RequestPermissionPromptDialog.isNeedPrompt()
|
||||
&& tips != null
|
||||
&& activity != null
|
||||
&& perms != null
|
||||
) {
|
||||
val rxPermissions = RxPermissions(activity)
|
||||
if (PermissionHelper.isAllGender(rxPermissions, * perms)) {
|
||||
p2?.onNotPorcessEvent()
|
||||
} else {
|
||||
RequestPermissionPromptDialog(p1, tips).show()
|
||||
val d = rxPermissions.request(*perms).subscribe({ aBoolean: Boolean? ->
|
||||
RequestPermissionPromptDialog.dismissCurrentDialog()
|
||||
if (aBoolean == true) {
|
||||
p2?.onProcessEventSuccess(p0)
|
||||
} else {
|
||||
showDeniedTips(p1, tips)
|
||||
p2?.onInterceptEvent()
|
||||
}
|
||||
}) { obj: Throwable ->
|
||||
RequestPermissionPromptDialog.dismissCurrentDialog()
|
||||
obj.printStackTrace()
|
||||
p2?.onNotPorcessEvent()
|
||||
}
|
||||
}
|
||||
} else {
|
||||
p2?.onNotPorcessEvent()
|
||||
}
|
||||
}
|
||||
|
||||
override fun onDenyEvent(p0: Context?, p1: RequestPermissionEventEntry?): Boolean {
|
||||
if (p0 == null) {
|
||||
return super.onDenyEvent(p0, p1)
|
||||
}
|
||||
when (p1?.scenesType) {
|
||||
val tips = getPermissionTips(p1?.scenesType)
|
||||
return if (tips != null) {
|
||||
showDeniedTips(p0, tips)
|
||||
true
|
||||
} else {
|
||||
super.onDenyEvent(p0, p1)
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取场景对应的权限提示信息(不需要提示的权限返回null)
|
||||
*/
|
||||
private fun getPermissionTips(scenesType: Int?): String? {
|
||||
when (scenesType) {
|
||||
RequestPermissionEventEntry.SCENES_TAKE_AUDIO -> {
|
||||
showDeniedTips(p0, ResUtil.getString(R.string.permission_denied_tips_mic))
|
||||
return true
|
||||
return ResUtil.getString(R.string.permission_denied_tips_mic)
|
||||
}
|
||||
|
||||
RequestPermissionEventEntry.SCENES_SELECT_MEDIA,
|
||||
RequestPermissionEventEntry.SCENES_TAKE_VIDEO,
|
||||
RequestPermissionEventEntry.SCENES_SAVE_IMAGE,
|
||||
@@ -43,12 +90,11 @@ class RequestPermissionEvent : UnicornEventBase<RequestPermissionEventEntry> {
|
||||
RequestPermissionEventEntry.SCENES_SELECT_IMAGE,
|
||||
RequestPermissionEventEntry.SCENES_TAKE_PHOTO,
|
||||
RequestPermissionEventEntry.SCENES_VIDEO_CHAT -> {
|
||||
showDeniedTips(p0, ResUtil.getString(R.string.permission_denied_tips_image))
|
||||
return true
|
||||
return ResUtil.getString(R.string.permission_denied_tips_image)
|
||||
}
|
||||
|
||||
else -> {
|
||||
return super.onDenyEvent(p0, p1)
|
||||
return null
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -2,6 +2,7 @@ package com.nnbc123.app.ui.im.fragment;
|
||||
|
||||
import android.Manifest;
|
||||
import android.annotation.SuppressLint;
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.graphics.Color;
|
||||
import android.media.AudioManager;
|
||||
@@ -54,6 +55,7 @@ import com.netease.nimlib.sdk.robot.model.NimRobotInfo;
|
||||
import com.netease.nimlib.sdk.robot.model.RobotAttachment;
|
||||
import com.netease.nimlib.sdk.robot.model.RobotMsgType;
|
||||
import com.nnbc123.app.R;
|
||||
import com.nnbc123.app.common.permission.PermissionHelper;
|
||||
import com.nnbc123.app.common.widget.OriginalDrawStatusClickSpan;
|
||||
import com.nnbc123.app.ui.im.GreetPresenter;
|
||||
import com.nnbc123.app.ui.im.MessageListPanelEx;
|
||||
@@ -61,6 +63,7 @@ import com.nnbc123.app.ui.im.chat.MVHChatterBoxStart;
|
||||
import com.nnbc123.app.ui.im.model.IMCustomModel;
|
||||
import com.nnbc123.app.ui.webview.CommonWebViewActivity;
|
||||
import com.nnbc123.app.ui.widget.dialog.CommonTipDialog;
|
||||
import com.nnbc123.app.ui.widget.dialog.RequestPermissionPromptDialog;
|
||||
import com.nnbc123.app.utils.PushMessageHandler;
|
||||
import com.nnbc123.core.UriProvider;
|
||||
import com.nnbc123.core.auth.AuthModel;
|
||||
@@ -230,7 +233,7 @@ public class MessageFragment extends TFragment implements ModuleProxy, MessageLi
|
||||
IMMessage anchor = (IMMessage) getArguments().getSerializable(Extras.EXTRA_ANCHOR);
|
||||
|
||||
customization = (SessionCustomization) getArguments().getSerializable(Extras.EXTRA_CUSTOMIZATION);
|
||||
Container container = new Container(getActivity(), sessionId, sessionType, this,this::requestPermission);
|
||||
Container container = new Container(getActivity(), sessionId, sessionType, this, this::requestPermission);
|
||||
|
||||
if (messageListPanel == null) {
|
||||
messageListPanel = new MessageListPanelEx(container, rootView, anchor, false, false);
|
||||
@@ -321,10 +324,16 @@ public class MessageFragment extends TFragment implements ModuleProxy, MessageLi
|
||||
|
||||
}
|
||||
|
||||
private void requestPermission(Consumer<Boolean> consumer, String deniedTips, String... perms) {
|
||||
private void requestPermission(Consumer<Boolean> consumer, String tips, String... perms) {
|
||||
Context context = getContext();
|
||||
if (context != null && RequestPermissionPromptDialog.Companion.isNeedPrompt()
|
||||
&& !PermissionHelper.INSTANCE.isAllGender(rxPermissions, perms)) {
|
||||
new RequestPermissionPromptDialog(context, tips).show();
|
||||
}
|
||||
Disposable disposable = rxPermissions.request(perms).subscribe(aBoolean -> {
|
||||
RequestPermissionPromptDialog.Companion.dismissCurrentDialog();
|
||||
if (!aBoolean) {
|
||||
showPermissionDeniedTipsDialog(deniedTips);
|
||||
showPermissionDeniedTipsDialog(tips);
|
||||
}
|
||||
if (consumer != null) {
|
||||
consumer.accept(aBoolean);
|
||||
@@ -616,19 +625,26 @@ public class MessageFragment extends TFragment implements ModuleProxy, MessageLi
|
||||
@Subscribe(threadMode = ThreadMode.MAIN)
|
||||
@SuppressLint("CheckResult")
|
||||
public void onNimAudioChatEvent(NimAudioChatEvent event) {
|
||||
checkPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE,
|
||||
String[] perms = new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE,
|
||||
Manifest.permission.READ_EXTERNAL_STORAGE,
|
||||
Manifest.permission.RECORD_AUDIO)
|
||||
Manifest.permission.RECORD_AUDIO};
|
||||
String tips = ResUtil.getString(R.string.permission_denied_tips_mic);
|
||||
if (RequestPermissionPromptDialog.Companion.isNeedPrompt()
|
||||
&& !PermissionHelper.INSTANCE.isAllGender(rxPermissions, perms)) {
|
||||
new RequestPermissionPromptDialog(requireContext(), tips).show();
|
||||
}
|
||||
checkPermission(perms)
|
||||
.subscribe(result -> {
|
||||
RequestPermissionPromptDialog.Companion.dismissCurrentDialog();
|
||||
if (result) {
|
||||
event.getSuccess().accept(result);
|
||||
} else {
|
||||
showPermissionDeniedTipsDialog(ResUtil.getString(R.string.permission_denied_tips_mic));
|
||||
showPermissionDeniedTipsDialog(tips);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
private void showPermissionDeniedTipsDialog(String message){
|
||||
private void showPermissionDeniedTipsDialog(String message) {
|
||||
CommonTipDialog mPrivacyDialog = new CommonTipDialog(getContext());
|
||||
mPrivacyDialog.setTipMsg(message);
|
||||
mPrivacyDialog.setOkText("去设置");
|
||||
|
@@ -28,6 +28,7 @@ import com.nnbc123.app.ui.login.ModifyInfoActivity
|
||||
import com.nnbc123.app.ui.user.UserPhotoAdapter.ImageClickListener
|
||||
import com.nnbc123.app.ui.utils.ImageLoadUtils
|
||||
import com.nnbc123.app.ui.widget.dialog.CommonTipDialog
|
||||
import com.nnbc123.app.ui.widget.dialog.RequestPermissionPromptDialog
|
||||
import com.nnbc123.app.utils.RegexUtil
|
||||
import com.nnbc123.core.auth.AuthModel
|
||||
import com.nnbc123.core.file.FileModel
|
||||
@@ -40,6 +41,7 @@ import com.nnbc123.library.common.photo.PhotoProviderNew
|
||||
import com.nnbc123.library.common.util.PhotoCompressCallback
|
||||
import com.nnbc123.library.common.util.PhotoCompressUtil
|
||||
import com.nnbc123.library.easypermisssion.EasyPermissions
|
||||
import com.nnbc123.library.utils.ResUtil
|
||||
import com.nnbc123.library.utils.TimeUtils
|
||||
import com.sleepbot.datetimepicker.time.RadialPickerLayout
|
||||
import com.sleepbot.datetimepicker.time.TimePickerDialog
|
||||
@@ -276,6 +278,7 @@ class UserInfoModifyActivity : BaseViewBindingActivity<ActivityUserInfoModifyBin
|
||||
|
||||
override fun onPermissionsDenied(requestCode: Int, perms: MutableList<String>) {
|
||||
if (requestCode == PERMISSION_CODE_STORAGE) {
|
||||
RequestPermissionPromptDialog.dismissCurrentDialog()
|
||||
val requestTip = "为了能正常加载您本地的文件内容,请前往应用权限设置界面打开存储空间权限。"
|
||||
val mPrivacyDialog = CommonTipDialog(context)
|
||||
mPrivacyDialog.setTipMsg(requestTip)
|
||||
@@ -307,12 +310,19 @@ class UserInfoModifyActivity : BaseViewBindingActivity<ActivityUserInfoModifyBin
|
||||
}
|
||||
|
||||
private fun checkStoragePermission() {
|
||||
RequestPermissionPromptDialog.dismissCurrentDialog()
|
||||
if (!EasyPermissions.hasPermissions(
|
||||
this,
|
||||
Manifest.permission.WRITE_EXTERNAL_STORAGE,
|
||||
Manifest.permission.READ_EXTERNAL_STORAGE
|
||||
)
|
||||
) {
|
||||
if (RequestPermissionPromptDialog.isNeedPrompt()) {
|
||||
RequestPermissionPromptDialog(
|
||||
this,
|
||||
ResUtil.getString(R.string.permission_denied_tips_image)
|
||||
).show()
|
||||
}
|
||||
EasyPermissions.requestPermissions(
|
||||
this,
|
||||
"请您再次考虑授予存储空间权限,否则将无法正常加载您本地的文件内容。",
|
||||
|
@@ -28,6 +28,7 @@ import com.nnbc123.app.takephoto.compress.CompressConfig
|
||||
import com.nnbc123.app.ui.user.UserModifyPhotosAdapter.PhotoItemClickListener
|
||||
import com.nnbc123.app.ui.utils.ImageLoadUtils
|
||||
import com.nnbc123.app.ui.widget.dialog.CommonTipDialog
|
||||
import com.nnbc123.app.ui.widget.dialog.RequestPermissionPromptDialog
|
||||
import com.nnbc123.app.utils.RegexUtil
|
||||
import com.nnbc123.core.file.FileModel
|
||||
import com.nnbc123.core.user.UserModel
|
||||
@@ -39,6 +40,7 @@ import com.nnbc123.library.common.photo.PhotoProviderNew
|
||||
import com.nnbc123.library.common.util.PhotoCompressCallback
|
||||
import com.nnbc123.library.common.util.PhotoCompressUtil
|
||||
import com.nnbc123.library.easypermisssion.EasyPermissions
|
||||
import com.nnbc123.library.utils.ResUtil
|
||||
import com.nnbc123.library.utils.file.JXFileUtils
|
||||
import com.orhanobut.logger.Logger
|
||||
import com.trello.rxlifecycle3.android.ActivityEvent
|
||||
@@ -225,6 +227,7 @@ class UserModifyPhotosActivity : TakePhotoActivity(), PhotoItemClickListener,
|
||||
|
||||
override fun onPermissionsDenied(requestCode: Int, perms: MutableList<String>) {
|
||||
if (requestCode == PERMISSION_CODE_STORAGE) {
|
||||
RequestPermissionPromptDialog.dismissCurrentDialog()
|
||||
val requestTip = "为了能正常加载您本地的文件内容,请前往应用权限设置界面打开存储空间权限。"
|
||||
val mPrivacyDialog = CommonTipDialog(context)
|
||||
mPrivacyDialog.setTipMsg(requestTip)
|
||||
@@ -256,12 +259,19 @@ class UserModifyPhotosActivity : TakePhotoActivity(), PhotoItemClickListener,
|
||||
}
|
||||
|
||||
private fun checkStoragePermission() {
|
||||
RequestPermissionPromptDialog.dismissCurrentDialog()
|
||||
if (!EasyPermissions.hasPermissions(
|
||||
this,
|
||||
Manifest.permission.WRITE_EXTERNAL_STORAGE,
|
||||
Manifest.permission.READ_EXTERNAL_STORAGE
|
||||
)
|
||||
) {
|
||||
if (RequestPermissionPromptDialog.isNeedPrompt()) {
|
||||
RequestPermissionPromptDialog(
|
||||
this,
|
||||
ResUtil.getString(R.string.permission_denied_tips_image)
|
||||
).show()
|
||||
}
|
||||
EasyPermissions.requestPermissions(
|
||||
this,
|
||||
"请您再次考虑授予存储空间权限,否则将无法正常加载您本地的文件内容。",
|
||||
|
@@ -7,8 +7,9 @@ import android.util.Log;
|
||||
import android.webkit.JavascriptInterface;
|
||||
|
||||
import com.alibaba.fastjson.JSONObject;
|
||||
import com.chuhai.utils.MetaDataUtils;
|
||||
import com.nnbc123.core.Constants;
|
||||
import com.orhanobut.logger.Logger;
|
||||
import com.tencent.vasdolly.helper.ChannelReaderUtil;
|
||||
import com.nnbc123.app.application.XChatApplication;
|
||||
import com.nnbc123.xchat_android_constants.XChatConstants;
|
||||
import com.nnbc123.library.utils.AppUtils;
|
||||
@@ -88,7 +89,7 @@ public class SimpleJSInterface {
|
||||
@JavascriptInterface
|
||||
public String getChannel() {
|
||||
String channel;
|
||||
channel = ChannelReaderUtil.getChannel(XChatApplication.instance());
|
||||
channel = MetaDataUtils.INSTANCE.getStringData(Constants.CHANNEL_KEY, XChatApplication.instance());
|
||||
if (TextUtils.isEmpty(channel)) {
|
||||
channel = "official";
|
||||
}
|
||||
|
@@ -0,0 +1,70 @@
|
||||
package com.nnbc123.app.ui.widget.dialog
|
||||
|
||||
import android.app.Dialog
|
||||
import android.content.Context
|
||||
import android.os.Bundle
|
||||
import android.view.Gravity
|
||||
import android.view.View
|
||||
import android.view.WindowManager
|
||||
import android.widget.TextView
|
||||
import androidx.lifecycle.Lifecycle
|
||||
import androidx.lifecycle.LifecycleEventObserver
|
||||
import androidx.lifecycle.LifecycleOwner
|
||||
import com.nnbc123.app.R
|
||||
import com.nnbc123.library.utils.config.BasicConfig
|
||||
|
||||
/**
|
||||
* Created by Max on 2024/1/8 10:06
|
||||
* Desc:申请权限提示
|
||||
**/
|
||||
class RequestPermissionPromptDialog(context: Context, private val message: String) :
|
||||
Dialog(context, R.style.dialog_full_width), LifecycleEventObserver {
|
||||
|
||||
companion object {
|
||||
private var currentDialog: RequestPermissionPromptDialog? = null
|
||||
fun dismissCurrentDialog() {
|
||||
currentDialog?.dismiss()
|
||||
currentDialog = null
|
||||
}
|
||||
|
||||
/**
|
||||
* 是否需要展示权限申请说明
|
||||
*/
|
||||
fun isNeedPrompt(): Boolean {
|
||||
return (BasicConfig.INSTANCE.channel == "huawei")
|
||||
}
|
||||
}
|
||||
|
||||
override fun onCreate(savedInstanceState: Bundle?) {
|
||||
super.onCreate(savedInstanceState)
|
||||
currentDialog = this
|
||||
val window = window
|
||||
if (window != null) {
|
||||
val lps = window.attributes
|
||||
lps.gravity = Gravity.TOP
|
||||
lps.verticalMargin = 0f
|
||||
lps.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
|
||||
window.attributes = lps
|
||||
}
|
||||
setCanceledOnTouchOutside(false)
|
||||
setContentView(R.layout.dialog_request_permission_prompt)
|
||||
val rootView = findViewById<View>(R.id.layout_root)
|
||||
// 权限已被拒时再申请权限会立即回调结果,这个弹窗看起来闪一下就没了,优化这个体验:延迟可见
|
||||
rootView?.animate()?.alpha(1f)?.setStartDelay(200)?.start()
|
||||
val messageView = findViewById<TextView>(R.id.tv_message)
|
||||
messageView?.text = message
|
||||
(ownerActivity as? LifecycleOwner)?.lifecycle?.addObserver(this)
|
||||
}
|
||||
|
||||
override fun dismiss() {
|
||||
currentDialog = null
|
||||
(ownerActivity as? LifecycleOwner)?.lifecycle?.removeObserver(this)
|
||||
super.dismiss()
|
||||
}
|
||||
|
||||
override fun onStateChanged(source: LifecycleOwner, event: Lifecycle.Event) {
|
||||
if (event == Lifecycle.Event.ON_DESTROY) {
|
||||
this@RequestPermissionPromptDialog.dismiss()
|
||||
}
|
||||
}
|
||||
}
|
35
app/src/main/res/layout/dialog_request_permission_prompt.xml
Normal file
35
app/src/main/res/layout/dialog_request_permission_prompt.xml
Normal file
@@ -0,0 +1,35 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
android:id="@+id/layout_root"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginHorizontal="8dp"
|
||||
android:layout_marginTop="5dp"
|
||||
android:alpha="0"
|
||||
android:background="@drawable/shape_white_8dp_round"
|
||||
android:paddingHorizontal="28dp"
|
||||
android:paddingVertical="14dp">
|
||||
|
||||
<TextView
|
||||
android:id="@+id/tv_title"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="权限使用说明:"
|
||||
android:textColor="#2B2D33"
|
||||
android:textSize="14sp"
|
||||
android:textStyle="bold"
|
||||
app:layout_constraintTop_toTopOf="parent" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/tv_message"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginTop="1dp"
|
||||
android:textColor="#696D7A"
|
||||
android:textSize="14sp"
|
||||
app:layout_constraintTop_toBottomOf="@id/tv_title"
|
||||
tools:text="MESSAGEMESSA" />
|
||||
|
||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
@@ -125,6 +125,19 @@
|
||||
<item name="android:backgroundDimAmount">0.5</item>
|
||||
</style>
|
||||
|
||||
<style name="dialog_full_width" parent="android:Theme.Dialog">
|
||||
<item name="android:windowFrame">@null</item>
|
||||
<item name="android:windowIsFloating">true</item>
|
||||
<item name="android:windowIsTranslucent">true</item>
|
||||
<item name="windowActionBar">false</item>
|
||||
<item name="android:windowNoTitle">true</item>
|
||||
<item name="android:background">@android:color/transparent</item>
|
||||
<item name="android:windowBackground">@android:color/transparent</item>
|
||||
<item name="android:backgroundDimEnabled">false</item>
|
||||
<item name="android:windowMinWidthMajor">100%</item>
|
||||
<item name="android:windowMinWidthMinor">100%</item>
|
||||
</style>
|
||||
|
||||
<style name="top_dialog" parent="Theme.AppCompat.Dialog">
|
||||
<item name="android:windowIsFloating">false</item>
|
||||
<item name="windowActionBar">false</item>
|
||||
|
@@ -26,7 +26,9 @@ 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.nnbc123.app.common.permission.PermissionHelper;
|
||||
import com.nnbc123.app.ui.widget.dialog.CommonTipDialog;
|
||||
import com.nnbc123.app.ui.widget.dialog.RequestPermissionPromptDialog;
|
||||
import com.nnbc123.library.utils.ResUtil;
|
||||
import com.trello.rxlifecycle3.android.ActivityEvent;
|
||||
import com.nnbc123.app.R;
|
||||
@@ -196,7 +198,14 @@ public class PublishActivity extends BaseMvpActivity<IPublishView, PublishPresen
|
||||
imageAdapter.setOnItemClickListener((adapter, view, position) -> {
|
||||
PublishItem item = imageShowList.get(position);
|
||||
if (item.isAddItem()) {
|
||||
String tips = ResUtil.getString(R.string.permission_denied_tips_image);
|
||||
String permission = Manifest.permission.READ_EXTERNAL_STORAGE;
|
||||
if (RequestPermissionPromptDialog.Companion.isNeedPrompt()
|
||||
&& !PermissionHelper.INSTANCE.isAllGender(rxPermissions, permission)) {
|
||||
new RequestPermissionPromptDialog(this, tips).show();
|
||||
}
|
||||
checkPermission((aBoolean) -> {
|
||||
RequestPermissionPromptDialog.Companion.dismissCurrentDialog();
|
||||
if (aBoolean) {
|
||||
CaptureStrategy captureStrategy = new CaptureStrategy(true, context.getPackageName() + ".fileprovider",
|
||||
BasicConfig.INSTANCE.getImageDir().getAbsolutePath());
|
||||
@@ -216,9 +225,9 @@ public class PublishActivity extends BaseMvpActivity<IPublishView, PublishPresen
|
||||
.setOriginalImagee(isOriginalImage)
|
||||
.forResult(ConstantValue.CODE_CHOOSE_PHOTO);
|
||||
} else {
|
||||
showPermissionDeniedDialog();
|
||||
showPermissionDeniedDialog(tips);
|
||||
}
|
||||
}, Manifest.permission.READ_EXTERNAL_STORAGE);
|
||||
}, permission);
|
||||
} else {
|
||||
BigPhotoActivity.startCanDelete(PublishActivity.this, (ArrayList<CustomItem>) uploadList,
|
||||
position, new PagerOption().setDelete(true));
|
||||
@@ -238,9 +247,9 @@ public class PublishActivity extends BaseMvpActivity<IPublishView, PublishPresen
|
||||
updateImagesData();
|
||||
}
|
||||
|
||||
private void showPermissionDeniedDialog(){
|
||||
private void showPermissionDeniedDialog(String tips){
|
||||
CommonTipDialog mPrivacyDialog = new CommonTipDialog(context);
|
||||
mPrivacyDialog.setTipMsg(ResUtil.getString(R.string.permission_denied_tips_image));
|
||||
mPrivacyDialog.setTipMsg(tips);
|
||||
mPrivacyDialog.setOkText("去设置");
|
||||
mPrivacyDialog.setOnActionListener(
|
||||
new CommonTipDialog.OnActionListener() {
|
||||
|
@@ -25,7 +25,7 @@ buildscript {
|
||||
// android 资源混淆插件
|
||||
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
|
||||
classpath 'com.huawei.agconnect:agcp:1.6.0.300'
|
||||
classpath 'com.tencent.vasdolly:plugin:3.0.3'
|
||||
// classpath 'com.tencent.vasdolly:plugin:3.0.3'
|
||||
classpath "com.mob.sdk:MobSDK:2018.0319.1724"
|
||||
classpath "com.github.qq549631030:android-junk-code:1.0.7"
|
||||
}
|
||||
|
@@ -13,6 +13,7 @@ import java.util.List;
|
||||
* Created by Administrator on 2017/11/9.
|
||||
*/
|
||||
public class Constants {
|
||||
public static final String CHANNEL_KEY = "CHANNEL";
|
||||
public static final String ERBAN_DIR_NAME = XChatConstants.XCHAT_DIR_NAME;
|
||||
public static final String nimAppKey = Env.isDebug() ?
|
||||
XChatConstants.NIM_KEY_DEBUG : XChatConstants.NIM_KEY_RELEASE;
|
||||
|
@@ -23,7 +23,6 @@ with_flutter_aar=true
|
||||
with_jenkins=false
|
||||
only_arm64=false
|
||||
|
||||
channel_file=channel.txt
|
||||
|
||||
COMPILE_SDK_VERSION=32
|
||||
MIN_SDK_VERSION=21
|
||||
|
@@ -0,0 +1,55 @@
|
||||
package com.chuhai.utils
|
||||
|
||||
import android.content.Context
|
||||
import android.content.pm.PackageManager
|
||||
import android.os.Bundle
|
||||
import android.text.TextUtils
|
||||
|
||||
/**
|
||||
* MetaData工具
|
||||
* @author Max
|
||||
* @date 2019-11-26.
|
||||
*/
|
||||
object MetaDataUtils {
|
||||
/**
|
||||
* 获取元数据
|
||||
* @param context 上下文
|
||||
*/
|
||||
fun getMetaData(context: Context? = AppUtils.getApp()): Bundle? {
|
||||
if (context == null) {
|
||||
return null
|
||||
}
|
||||
try {
|
||||
val packageManager = context.packageManager ?: return null
|
||||
val applicationInfo = packageManager.getApplicationInfo(
|
||||
context.packageName,
|
||||
PackageManager.GET_META_DATA
|
||||
)
|
||||
return applicationInfo.metaData
|
||||
} catch (e: Exception) {
|
||||
e.printStackTrace()
|
||||
return null
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取布尔值
|
||||
*/
|
||||
fun getBooleanData(key: String, context: Context? = AppUtils.getApp()): Boolean? {
|
||||
return getMetaData(context)?.getBoolean(key)
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取字符串
|
||||
*/
|
||||
fun getStringData(key: String, context: Context? = AppUtils.getApp()): String? {
|
||||
return getMetaData(context)?.getString(key)
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取Int
|
||||
*/
|
||||
fun getIntData(key: String, context: Context? = AppUtils.getApp()): Int? {
|
||||
return getMetaData(context)?.getInt(key)
|
||||
}
|
||||
}
|
@@ -13,5 +13,5 @@ interface PermissionProxy {
|
||||
* @param consumer
|
||||
* @param perms 权限列表
|
||||
*/
|
||||
fun requestPermission(consumer: Consumer<Boolean>, deniedTips: String, vararg perms: String)
|
||||
fun requestPermission(consumer: Consumer<Boolean>, tips: String, vararg perms: String)
|
||||
}
|
Reference in New Issue
Block a user