diff --git a/app/src/main/java/com/gh/common/constant/Constants.java b/app/src/main/java/com/gh/common/constant/Constants.java index 431a36513e..1e95d5e427 100644 --- a/app/src/main/java/com/gh/common/constant/Constants.java +++ b/app/src/main/java/com/gh/common/constant/Constants.java @@ -171,6 +171,9 @@ public class Constants { //版规声明 public static final String FORUM_REGULATIONS_NEWS_ID = "5f4db9cc34d44d01b92fd670"; + // 权限使用场景地址 + public static final String PERMISSION_SCENARIO_ADDRESS = "https://resource.ghzs.com/page/permissions/android.html"; + //帮助内容详情 public static final String HELP_ADDRESS_DEV = "https://static-web.ghzs.com/ghzs_help_dev/help.html?content="; public static final String HELP_ADDRESS = "https://static-web.ghzs.com/ghzs_help/help.html?content="; diff --git a/app/src/main/java/com/gh/common/util/DialogHelper.kt b/app/src/main/java/com/gh/common/util/DialogHelper.kt index b95d550ca7..35e9ed4484 100644 --- a/app/src/main/java/com/gh/common/util/DialogHelper.kt +++ b/app/src/main/java/com/gh/common/util/DialogHelper.kt @@ -3,6 +3,7 @@ package com.gh.common.util import android.app.Dialog import android.content.Context import android.view.LayoutInflater +import android.view.View import android.view.Window import android.widget.TextView import com.gh.common.dialog.TrackableDialog @@ -73,6 +74,65 @@ object DialogHelper { return dialog } + fun showRoundedCornerDialog( + context: Context, + title: String, + content: CharSequence, + hint: String? = "", + confirmText: String, + cancelText: String, + confirmClickCallback: (() -> Unit)? = null, + cancelClickCallback: (() -> Unit)? = null, + hintClickCallback: (() -> Unit)? = null, + trackMtaEvent: Boolean = false, + mtaEvent: String = "", + mtaKey: String = ""): Dialog { + val solidContext = checkDialogContext(context) + + val dialog = if (trackMtaEvent) { + TrackableDialog(solidContext, R.style.GhAlertDialog, mtaEvent, mtaKey) + } else { + Dialog(solidContext, R.style.GhAlertDialog) + } + + val contentView = LayoutInflater.from(solidContext).inflate(R.layout.dialog_alert_default, null) + val contentTv = contentView.findViewById(R.id.contentTv) + val titleTv = contentView.findViewById(R.id.titleTv) + val hintTv = contentView.findViewById(R.id.hintTv) + val cancelTv = contentView.findViewById(R.id.cancelTv) + val confirmTv = contentView.findViewById(R.id.confirmTv) + contentTv.text = content + titleTv.text = title + if (!hint.isNullOrEmpty()) { + hintTv.visibility = View.VISIBLE + hintTv.text = hint + hintTv.setOnClickListener { + hintClickCallback?.invoke() + } + } + cancelTv.text = cancelText + confirmTv.text = confirmText + + cancelTv.setOnClickListener { + if (trackMtaEvent) MtaHelper.onEvent(mtaEvent, mtaKey, "点击$cancelText") + + cancelClickCallback?.invoke() + dialog.dismiss() + } + + confirmTv.setOnClickListener { + if (trackMtaEvent) MtaHelper.onEvent(mtaEvent, mtaKey, "点击$confirmText") + + confirmClickCallback?.invoke() + dialog.dismiss() + } + + dialog.requestWindowFeature(Window.FEATURE_NO_TITLE) + dialog.setContentView(contentView) + dialog.show() + return dialog + } + /** * For legacy java invocation */ diff --git a/app/src/main/java/com/gh/common/util/DialogUtils.java b/app/src/main/java/com/gh/common/util/DialogUtils.java index 869c89bc9c..f88e35939a 100644 --- a/app/src/main/java/com/gh/common/util/DialogUtils.java +++ b/app/src/main/java/com/gh/common/util/DialogUtils.java @@ -978,7 +978,7 @@ public class DialogUtils { public static void showPrivacyPolicyDialog(Context context, @NonNull PrivacyPolicyEntity entity, - EmptyCallback callback) { + SimpleCallback callback) { final Context activityContext = checkDialogContext(context); @@ -1100,13 +1100,14 @@ public class DialogUtils { allowButton.setOnClickListener(view -> { dialog.dismiss(); - callback.onCallback(); + callback.onCallback(true); // MtaHelper.onEvent("隐私政策弹窗", "隐私政策弹窗", "点击同意"); }); disallowButton.setOnClickListener(v -> { dialog.dismiss(); - showPrivacyPolicyDisallowDialog(activityContext, entity, callback); + callback.onCallback(false); +// showPrivacyPolicyDisallowDialog(activityContext, entity, callback); // MtaHelper.onEvent("隐私政策弹窗", "隐私政策弹窗", "不同意并退出App"); }); diff --git a/app/src/main/java/com/gh/common/util/PermissionHelper.kt b/app/src/main/java/com/gh/common/util/PermissionHelper.kt index e8419933cf..81646e44af 100644 --- a/app/src/main/java/com/gh/common/util/PermissionHelper.kt +++ b/app/src/main/java/com/gh/common/util/PermissionHelper.kt @@ -5,10 +5,12 @@ import android.annotation.SuppressLint import android.app.Activity import android.content.Context import android.content.Intent +import android.content.pm.PackageManager import android.net.Uri import android.os.Build import android.provider.Settings import androidx.fragment.app.FragmentActivity +import com.gh.common.constant.Constants import com.tbruyelle.rxpermissions2.RxPermissions object PermissionHelper { @@ -59,41 +61,35 @@ object PermissionHelper { @JvmStatic fun checkStoragePermissionBeforeAction(context: Context, emptyCallback: EmptyCallback) { if (context is FragmentActivity) { - val rxPermission = RxPermissions(context) + if (context.checkCallingOrSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED + && context.checkCallingOrSelfPermission(Manifest.permission.READ_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) { + emptyCallback.onCallback() + } else { + showDialogBeforeRequestingStorageDialog(context, emptyCallback) + } + } + } - tryWithDefaultCatch { - rxPermission - .requestEachCombined(Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_EXTERNAL_STORAGE) - .subscribe { permission -> - when { - permission.granted -> { - emptyCallback.onCallback() - } - permission.shouldShowRequestPermissionRationale -> { - DialogUtils.showPermissionDialog(context, - "权限申请", - "光环助手需要存储权限,以保证能正常使用相关功能", - "重试", - "放弃", - { checkStoragePermissionBeforeAction(context, emptyCallback) }, - null) - } - else -> { - DialogUtils.showPermissionDialog(context, - "权限申请", - "在设置-应用-光环助手-权限中开启存储权限,以保证能正常使用相关功能", - "去设置", - "放弃", - { - val intent = Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS) - intent.data = Uri.parse("package:" + context.getPackageName()) - context.startActivity(intent) - }, - null) - } + private fun checkStoragePermissionBeforeAction(context: FragmentActivity, emptyCallback: EmptyCallback) { + tryWithDefaultCatch { + val rxPermission = RxPermissions(context) + rxPermission + .requestEachCombined(Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_EXTERNAL_STORAGE) + .subscribe { permission -> + when { + permission.granted -> { + emptyCallback.onCallback() + } + permission.shouldShowRequestPermissionRationale -> { + // do nothing + } + else -> { + val intent = Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS) + intent.data = Uri.parse("package:" + context.packageName) + context.startActivity(intent) } } - } + } } } @@ -101,39 +97,37 @@ object PermissionHelper { @JvmStatic fun checkReadPhoneStateAndStoragePermissionBeforeAction(context: Context, emptyCallback: EmptyCallback) { if (context is FragmentActivity) { - val rxPermission = RxPermissions(context) + if (context.checkCallingOrSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED + && context.checkCallingOrSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED + && context.checkCallingOrSelfPermission(Manifest.permission.READ_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) { + emptyCallback.onCallback() + } else { + val rxPermission = RxPermissions(context) - tryWithDefaultCatch { - rxPermission - .requestEachCombined( - Manifest.permission.READ_PHONE_STATE, - Manifest.permission.WRITE_EXTERNAL_STORAGE, - Manifest.permission.READ_EXTERNAL_STORAGE) - .subscribe { permission -> - when { - permission.granted -> { - emptyCallback.onCallback() + tryWithDefaultCatch { + rxPermission + .requestEachCombined( + Manifest.permission.READ_PHONE_STATE, + Manifest.permission.WRITE_EXTERNAL_STORAGE, + Manifest.permission.READ_EXTERNAL_STORAGE) + .subscribe { permission -> + when { + permission.granted -> { + emptyCallback.onCallback() - ActivationHelper.sendActivationInfo() - } - permission.shouldShowRequestPermissionRationale -> { - DialogUtils.showPermissionDialog(context, "权限申请", - "光环助手需要获取存储权限和手机信息权限,以保证能正常使用相关功能", "重试", "放弃", - { checkStoragePermissionBeforeAction(context, emptyCallback) }, null) - } - else -> { - DialogUtils.showPermissionDialog(context, "权限申请", - "在设置-应用-光环助手-权限中开启获取存储权限和手机信息,以保证能正常使用相关功能", - "去设置", - "放弃", - { - val intent = Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS) - intent.data = Uri.parse("package:" + context.getPackageName()) - context.startActivity(intent) - }, null) + ActivationHelper.sendActivationInfo() + } + permission.shouldShowRequestPermissionRationale -> { + // do nothing + } + else -> { + val intent = Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS) + intent.data = Uri.parse("package:" + context.getPackageName()) + context.startActivity(intent) + } } } - } + } } } } @@ -142,36 +136,33 @@ object PermissionHelper { @JvmStatic fun checkReadPhoneStatePermissionBeforeAction(context: Context, emptyCallback: EmptyCallback) { if (context is FragmentActivity) { - val rxPermission = RxPermissions(context) - tryWithDefaultCatch { - rxPermission - .requestEachCombined(Manifest.permission.READ_PHONE_STATE) - .subscribe { permission -> - when { - permission.granted -> { - emptyCallback.onCallback() + if (context.checkCallingOrSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) { + emptyCallback.onCallback() + } else { + val rxPermission = RxPermissions(context) - ActivationHelper.sendActivationInfo() - } - permission.shouldShowRequestPermissionRationale -> { - DialogUtils.showPermissionDialog(context, "权限申请", - "光环助手需要获取手机信息权限,以保证能正常使用相关功能", "重试", "放弃", - { checkStoragePermissionBeforeAction(context, emptyCallback) }, null) - } - else -> { - DialogUtils.showPermissionDialog(context, "权限申请", - "在设置-应用-光环助手-权限中开启获取手机信息,以保证能正常使用相关功能", - "去设置", - "放弃", - { - val intent = Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS) - intent.data = Uri.parse("package:" + context.getPackageName()) - context.startActivity(intent) - }, null) + tryWithDefaultCatch { + rxPermission + .requestEachCombined(Manifest.permission.READ_PHONE_STATE) + .subscribe { permission -> + when { + permission.granted -> { + emptyCallback.onCallback() + + ActivationHelper.sendActivationInfo() + } + permission.shouldShowRequestPermissionRationale -> { + // do nothing + } + else -> { + val intent = Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS) + intent.data = Uri.parse("package:" + context.getPackageName()) + context.startActivity(intent) + } } } - } + } } } } @@ -220,7 +211,24 @@ object PermissionHelper { } catch (e: Exception) { e.printStackTrace() } + } + private fun showDialogBeforeRequestingStorageDialog(context: FragmentActivity, emptyCallback: EmptyCallback) { + DialogHelper.showRoundedCornerDialog( + context, + title = "权限申请", + content = "光环助手将向您申请开启设备的存储权限,以保证能正常使用相关功能。拒绝授权将无法正常使用部分功能。", + hint = "查看权限应用场景", + cancelText = "放弃", + confirmText = "去授权", + hintClickCallback = { + DirectUtils.directToWebView(context, Constants.PERMISSION_SCENARIO_ADDRESS, "(权限弹窗)") + }, + cancelClickCallback = null, + confirmClickCallback = { + checkStoragePermissionBeforeAction(context, emptyCallback) + } + ) } /** @@ -236,5 +244,4 @@ object PermissionHelper { } } - } \ No newline at end of file diff --git a/app/src/main/java/com/gh/gamecenter/SplashScreenActivity.java b/app/src/main/java/com/gh/gamecenter/SplashScreenActivity.java index 380cebd9bd..f6de31ff39 100644 --- a/app/src/main/java/com/gh/gamecenter/SplashScreenActivity.java +++ b/app/src/main/java/com/gh/gamecenter/SplashScreenActivity.java @@ -39,6 +39,7 @@ import com.gh.common.util.MtaHelper; import com.gh.common.util.PackageUtils; import com.gh.common.util.PlatformUtils; import com.gh.common.util.SPUtils; +import com.gh.common.util.SimpleCallback; import com.gh.common.util.TagUtils; import com.gh.common.util.UsageStatsHelper; import com.gh.download.DownloadManager; @@ -125,7 +126,7 @@ public class SplashScreenActivity extends BaseActivity { cancelPreviousUpdateTask(); guideLayout.setVisibility(View.VISIBLE); - requestPermission(); +// requestPermission(); } } else { launchMainActivity(); @@ -138,11 +139,15 @@ public class SplashScreenActivity extends BaseActivity { private void showPrivacyDialog(ViewPager guideLayout) { PrivacyDialogFragment.show(this, (isSuccess) -> { if (isSuccess) { - showPrivacyPolicy(() -> { + showPrivacyPolicy((shouldRequestPermission) -> { // Dialog dismiss 后的回调 guideLayout.setVisibility(View.VISIBLE); SPUtils.setBoolean(Constants.SP_BRAND_NEW_USER, false); - requestPermission(); + if (shouldRequestPermission) { + requestPermission(); + } else { + launchMainActivity(); + } }); } else { DialogUtils.showPrivacyPolicyDisallowDialog(this, PrivacyPolicyEntity.createDefaultData(), () -> { @@ -229,7 +234,7 @@ public class SplashScreenActivity extends BaseActivity { } @SuppressLint("CheckResult") - private void showPrivacyPolicy(EmptyCallback callback) { + private void showPrivacyPolicy(SimpleCallback callback) { RetrofitManager.getInstance(this).getApi() .getPrivacyPolicy() .subscribeOn(Schedulers.io()) @@ -237,17 +242,12 @@ public class SplashScreenActivity extends BaseActivity { .subscribe(new BiResponse() { @Override public void onSuccess(PrivacyPolicyEntity data) { - DialogUtils.showPrivacyPolicyDialog( - SplashScreenActivity.this, - data, callback); + DialogUtils.showPrivacyPolicyDialog(SplashScreenActivity.this, data, callback); } @Override public void onFailure(@NotNull Exception exception) { - - DialogUtils.showPrivacyPolicyDialog( - SplashScreenActivity.this, - PrivacyPolicyEntity.createDefaultData(), callback); + DialogUtils.showPrivacyPolicyDialog(SplashScreenActivity.this, PrivacyPolicyEntity.createDefaultData(), callback); } }); } @@ -380,42 +380,8 @@ public class SplashScreenActivity extends BaseActivity { @Override public void onPermissionsDenied(int requestCode, List perms) { - if (EasyPermissions.somePermissionPermanentlyDenied(this, perms)) { // 设置"不要再询问",必须手动到系统设置授权 - DialogUtils.showPermissionDialog(this, "权限申请", - "光环助手需要获取(存储空间权限)和(手机信息),以保证游戏的正常下载以及您的账号安全", "去设置", "放弃", - () -> { - Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS); - intent.setData(Uri.parse("package:" + getPackageName())); - startActivity(intent); - }, () -> { - logGrantedPermission(perms); - if (mStartMainActivityDirectly) { - launchMainActivity(); - } - }); - } else { - DialogUtils.showPermissionDialog(this, "权限申请", - "在设置-应用-光环助手-权限中开启存储和手机信息权限,以保证能正常使用相关功能", "重试", "放弃", - this::checkAndRequestPermission, - () -> { - logGrantedPermission(perms); - if (mStartMainActivityDirectly) { - launchMainActivity(); - } - }); - } - } - - private void logGrantedPermission(List perms) { - if (perms.size() == 1) { - MtaHelper.onEvent("授权情况", "启动授权", "只授权存储"); - AppExecutor.getIoExecutor().execute(this::deleteOutdatedUpdatePackage); - } else { - if (perms.contains(Manifest.permission.READ_PHONE_STATE)) { - MtaHelper.onEvent("授权情况", "启动授权", "都不授权"); - } else { - MtaHelper.onEvent("授权情况", "启动授权", "只授权IMEI"); - } + if (mStartMainActivityDirectly) { + launchMainActivity(); } } diff --git a/app/src/main/res/layout/dialog_alert_default.xml b/app/src/main/res/layout/dialog_alert_default.xml new file mode 100644 index 0000000000..1d641b88c4 --- /dev/null +++ b/app/src/main/res/layout/dialog_alert_default.xml @@ -0,0 +1,99 @@ + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/dialog_privacy_policy.xml b/app/src/main/res/layout/dialog_privacy_policy.xml index 8171d8eab2..b6f0490095 100644 --- a/app/src/main/res/layout/dialog_privacy_policy.xml +++ b/app/src/main/res/layout/dialog_privacy_policy.xml @@ -126,7 +126,7 @@ android:layout_height="wrap_content" android:layout_marginLeft="12dp" android:layout_marginRight="12dp" - android:layout_marginBottom="16dp" + android:layout_marginBottom="6dp" android:background="@drawable/dialog_privacy_button" android:gravity="center" android:paddingBottom="16dp" @@ -134,19 +134,19 @@ android:textColor="@color/white" android:textSize="14sp" android:textStyle="bold" - app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintBottom_toTopOf="@id/disallow_button" app:layout_constraintTop_toBottomOf="@id/link_content" />