From 8b37a63a4ab813d00084573ab871f1f837c0fb9f Mon Sep 17 00:00:00 2001 From: renhaoting <370797079@qq.com> Date: Fri, 28 Nov 2025 14:47:21 +0800 Subject: [PATCH] =?UTF-8?q?=E6=89=93=E5=BC=80=E7=B3=BB=E7=BB=9F=E9=80=9A?= =?UTF-8?q?=E7=9F=A5=E8=AE=BE=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/AndroidManifest.xml | 1 + .../java/com/gamedog/vididin/Constants.kt | 2 + .../vididin/main/fragments/TasksFragment.kt | 21 +- .../architecture/src/main/AndroidManifest.xml | 4 + .../ama/core/architecture/util/AndroidUtil.kt | 47 ++++ .../util/permission/PermissionActivity.java | 218 ++++++++++++++++++ .../util/permission/PermissionUtil.java | 87 +++++++ .../src/main/res/values/strings.xml | 1 + 8 files changed, 378 insertions(+), 3 deletions(-) create mode 100644 core/architecture/src/main/java/com/ama/core/architecture/util/permission/PermissionActivity.java create mode 100644 core/architecture/src/main/java/com/ama/core/architecture/util/permission/PermissionUtil.java diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 7f084c4..edda3af 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -3,6 +3,7 @@ + (), OnTab override fun ViewBinding.initViews() { with(binding) { - setOnClickBatch(ivGotoDailySign, llTaskBenefit, llTaskWatchVideo, llTaskGame, llTaskZerobuy, tvWatchVideo, tvWithdraw) { + setOnClickBatch(ivGotoDailySign, llTaskBenefit, llTaskWatchVideo, llTaskGame, + llTaskZerobuy, tvWatchVideo, tvWithdraw) { when(this) { ivGotoDailySign->{ DailySignDialog(requireActivity()).show() @@ -211,11 +216,21 @@ class TasksFragment : AppViewsFragment(), OnTab } private fun gotoDiscord() { - //TODO("Not yet implemented") + AndroidUtil.openUrl(VidiConst.URL_DISCORD) } private fun gotoNotification() { - //TODO("Not yet implemented") + PermissionUtil.checkPermission(Manifest.permission.POST_NOTIFICATIONS, object : PermissionUtil.ICallback() { + override fun onAllGranted() { + AndroidUtil.openAppNotifySettings() + } + + override fun onPartialGranted() { + } + + override fun onAllRejected() { + } + }) } private fun gotoWithVideo() { diff --git a/core/architecture/src/main/AndroidManifest.xml b/core/architecture/src/main/AndroidManifest.xml index afa9220..643110e 100644 --- a/core/architecture/src/main/AndroidManifest.xml +++ b/core/architecture/src/main/AndroidManifest.xml @@ -3,6 +3,8 @@ xmlns:tools="http://schemas.android.com/tools"> + + + + \ No newline at end of file diff --git a/core/architecture/src/main/java/com/ama/core/architecture/util/AndroidUtil.kt b/core/architecture/src/main/java/com/ama/core/architecture/util/AndroidUtil.kt index 0c6c652..e8f329d 100644 --- a/core/architecture/src/main/java/com/ama/core/architecture/util/AndroidUtil.kt +++ b/core/architecture/src/main/java/com/ama/core/architecture/util/AndroidUtil.kt @@ -1,9 +1,17 @@ package com.ama.core.architecture.util +import android.app.Activity +import android.content.Intent +import android.content.Intent.FLAG_ACTIVITY_NEW_TASK +import android.net.Uri +import android.os.Build +import android.os.Bundle +import android.provider.Settings import android.widget.Toast import com.ama.core.architecture.BaseApp import kotlin.random.Random + class AndroidUtil private constructor() { companion object { @@ -22,8 +30,47 @@ class AndroidUtil private constructor() { Toast.makeText(BaseApp.appContext(), str, Toast.LENGTH_SHORT).show() } + fun openUrl(url: String) { + val appContext = BaseApp.appContext() + val intent = Intent(Intent.ACTION_VIEW, Uri.parse(url)) + intent.flags = FLAG_ACTIVITY_NEW_TASK + if (intent.resolveActivity(appContext.packageManager) != null) { + appContext.startActivity(intent) + } else { + Toast.makeText(appContext, "No available browser", Toast.LENGTH_SHORT).show() + } + } + + fun openAppNotifySettings() { + val context = BaseApp.appContext() + val intent = Intent() + intent.flags = FLAG_ACTIVITY_NEW_TASK + try { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { // Android >=8 + intent.action = Settings.ACTION_APP_NOTIFICATION_SETTINGS + intent.putExtra(Settings.EXTRA_APP_PACKAGE, context.packageName) + intent.putExtra(Settings.EXTRA_CHANNEL_ID, context.applicationInfo.uid) + + } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { // Android 5.0-7.1 + intent.action = "android.settings.APP_NOTIFICATION_SETTINGS" + intent.putExtra("app_package", context.packageName) + intent.putExtra("app_uid", context.applicationInfo.uid) + } + + context.startActivity(intent) + } catch (e: Exception) { + e.printStackTrace() + val fallbackIntent = Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS) + fallbackIntent.data = Uri.fromParts("package", context.packageName, null) + context.startActivity(fallbackIntent) + } + } + + } + + } \ No newline at end of file diff --git a/core/architecture/src/main/java/com/ama/core/architecture/util/permission/PermissionActivity.java b/core/architecture/src/main/java/com/ama/core/architecture/util/permission/PermissionActivity.java new file mode 100644 index 0000000..d87c82c --- /dev/null +++ b/core/architecture/src/main/java/com/ama/core/architecture/util/permission/PermissionActivity.java @@ -0,0 +1,218 @@ +package com.ama.core.architecture.util.permission; + + + +import static com.ama.core.architecture.util.permission.PermissionUtil.PERMISSION_BROADCAST_ACTION; +import static com.ama.core.architecture.util.permission.PermissionUtil.PERMISSION_BROADCAST_ACTION_EXTRA_RESULT; +import static com.ama.core.architecture.util.permission.PermissionUtil.PERMISSION_BROADCAST_ACTION_EXTRA_UUID; + +import android.app.Activity; +import android.content.DialogInterface; +import android.content.Intent; +import android.content.pm.PackageManager; +import android.graphics.Color; +import android.net.Uri; +import android.os.Build; +import android.os.Bundle; +import android.provider.Settings; +import android.view.View; +import android.view.Window; +import android.view.WindowManager; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.appcompat.app.AlertDialog; +import androidx.appcompat.app.AppCompatActivity; +import androidx.core.app.ActivityCompat; +import androidx.localbroadcastmanager.content.LocalBroadcastManager; +import com.ama.core.architecture.R; +import com.ama.core.architecture.util.ResUtil; +import java.util.ArrayList; + + +public class PermissionActivity extends AppCompatActivity { + public static final int PERMISSION_REQUEST_CODE = 1000; + private static final String PERMISSION_TOTAL_REJECTED_HINT = ResUtil.INSTANCE.getString(R.string.permission_hint); + + public static final String EXTRA_PERMISSION = "extra_permission"; + public static final String EXTRA_ACTION_UUID = "extra_callback"; + + private String mActionUUID; + private ArrayList mPermissionList; + + + + + + + + + + + + + + @Override + protected void onCreate(@Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setStatusBarColor(this, Color.TRANSPARENT); + setNavigationBarColor(this, Color.TRANSPARENT); + + mActionUUID = getIntent().getStringExtra(EXTRA_ACTION_UUID); + mPermissionList = getIntent().getStringArrayListExtra(EXTRA_PERMISSION); + startRequest(); + } + + + private void startRequest() { + if (mActionUUID == null || mPermissionList == null && mPermissionList.size() <= 0) { + finish(); + } + + + ActivityCompat.requestPermissions(PermissionActivity.this, + mPermissionList.toArray(new String[mPermissionList.size()]), PERMISSION_REQUEST_CODE); + + } + + + + + + @Override + public void onRequestPermissionsResult(int requestCode, + @NonNull String[] permissions, + @NonNull int[] grantResults) { + super.onRequestPermissionsResult(requestCode, permissions, grantResults); + + if (PERMISSION_REQUEST_CODE == requestCode) { + if (grantResults == null || grantResults.length <= 0) { + sendResultBroadCast(PermissionUtil.PERMISSION_RESULT_ALL_REJECTED); + } else { + int grantedCount = 0; + int unGrantedCount = 0; + for (int result : grantResults) { + if (result == PackageManager.PERMISSION_GRANTED) { + grantedCount++; + } else { + unGrantedCount++; + } + } + + if (unGrantedCount <= 0) { + sendResultBroadCast(PermissionUtil.PERMISSION_RESULT_ALL_GRANTED); + } else { + int finalGrantedCount = grantedCount; + StringBuilder unGrantedPermissionsStr = new StringBuilder(); + for (int i=0; i 0 ? PermissionUtil.PERMISSION_RESULT_PARTIAL_GRANTED : PermissionUtil.PERMISSION_RESULT_ALL_REJECTED); + } + }) + .setNegativeButton("取消", new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + sendResultBroadCast(finalGrantedCount > 0 ? PermissionUtil.PERMISSION_RESULT_PARTIAL_GRANTED : PermissionUtil.PERMISSION_RESULT_ALL_REJECTED); + } + }) + .setOnCancelListener(new DialogInterface.OnCancelListener() { + @Override + public void onCancel(DialogInterface dialog) { + sendResultBroadCast(finalGrantedCount > 0 ? PermissionUtil.PERMISSION_RESULT_PARTIAL_GRANTED : PermissionUtil.PERMISSION_RESULT_ALL_REJECTED); + } + }) + .create() + .show(); + } + } + } + } + + + /** + * 用户选择了"不再询问", 引导用户跳转系统设置 + */ + private void showJump2SystemSettingDialog() { + + + + // new + new AlertDialog.Builder(this) + .setTitle("权限已被拒绝") + .setMessage(mPermissionList + PERMISSION_TOTAL_REJECTED_HINT) + .setPositiveButton("系统设置", new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + Uri packageURI = Uri.parse("package:" + getPackageName()); + Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS, packageURI); + startActivity(intent); + } + }) + .setNegativeButton("取消", new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + } + }) + .setOnCancelListener(new DialogInterface.OnCancelListener() { + @Override + public void onCancel(DialogInterface dialog) { + } + }) + .create() + .show(); + } + + + private void sendResultBroadCast(int permissionResult) { + Intent intent = new Intent(PERMISSION_BROADCAST_ACTION); + intent.putExtra(PERMISSION_BROADCAST_ACTION_EXTRA_RESULT, permissionResult); + intent.putExtra(PERMISSION_BROADCAST_ACTION_EXTRA_UUID, mActionUUID); + LocalBroadcastManager.getInstance(getApplicationContext()).sendBroadcast(intent); + finish(); + } + + + + + //******************************** Static Methods *********************************// + private static void setStatusBarColor(Activity activity, int colorId) { + Window window = activity.getWindow(); + window.setStatusBarColor(colorId); + } + + private static void setNavigationBarColor(Activity activity, int colorId) { + Window window = activity.getWindow(); + window.setNavigationBarColor(colorId); + } + + private static void setTranslucentStatus(Window window) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { + View decorView = window.getDecorView(); + int option = View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_STABLE; + decorView.setSystemUiVisibility(option); + window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS); + window.setStatusBarColor(Color.TRANSPARENT); + } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { + WindowManager.LayoutParams attributes = window.getAttributes(); + int flagTranslucentStatus = WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS; + attributes.flags |= flagTranslucentStatus; + window.setAttributes(attributes); + } + } + +} diff --git a/core/architecture/src/main/java/com/ama/core/architecture/util/permission/PermissionUtil.java b/core/architecture/src/main/java/com/ama/core/architecture/util/permission/PermissionUtil.java new file mode 100644 index 0000000..06d4ac4 --- /dev/null +++ b/core/architecture/src/main/java/com/ama/core/architecture/util/permission/PermissionUtil.java @@ -0,0 +1,87 @@ +package com.ama.core.architecture.util.permission; + +import static android.content.Intent.FLAG_ACTIVITY_NEW_TASK; +import android.content.BroadcastReceiver; +import android.content.Context; +import android.content.Intent; +import android.content.IntentFilter; +import android.text.TextUtils; +import androidx.annotation.NonNull; +import androidx.localbroadcastmanager.content.LocalBroadcastManager; +import com.ama.core.architecture.BaseApp; +import java.io.Serializable; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.UUID; + +public class PermissionUtil { + public static final int PERMISSION_RESULT_ALL_GRANTED = 1; + public static final int PERMISSION_RESULT_PARTIAL_GRANTED = 2; + public static final int PERMISSION_RESULT_ALL_REJECTED = 3; + + + + public static final String PERMISSION_BROADCAST_ACTION = "permission_broadcast_action"; + public static final String PERMISSION_BROADCAST_ACTION_EXTRA_UUID = "permission_broadcast_action_extra_uuid"; + public static final String PERMISSION_BROADCAST_ACTION_EXTRA_RESULT = "permission_broadcast_action_extra_result"; + + + public static abstract class ICallback implements Serializable { + public abstract void onAllGranted(); + public abstract void onPartialGranted(); + public abstract void onAllRejected(); + } + + public static void checkPermission(@NonNull String permission, + @NonNull ICallback callback) { + if (!TextUtils.isEmpty(permission)) { + checkPermission(new String[]{permission}, callback); + } + } + + public static void checkPermission(@NonNull String[] permissionArr, + @NonNull ICallback callback) { + if (permissionArr == null || permissionArr.length == 0) { + callback.onAllGranted(); + return; + } + + String actionUUID = UUID.randomUUID().toString(); + regisBroadcast(actionUUID, callback); + + Intent intent = new Intent(BaseApp.Companion.appContext(), PermissionActivity.class); + intent.setFlags(FLAG_ACTIVITY_NEW_TASK); + intent.putExtra(PermissionActivity.EXTRA_ACTION_UUID, actionUUID); + intent.putStringArrayListExtra(PermissionActivity.EXTRA_PERMISSION, new ArrayList(Arrays.asList(permissionArr))); + BaseApp.Companion.appContext().startActivity(intent); + } + + private static void regisBroadcast(String actionUUID, ICallback callback) { + LocalBroadcastManager broadcastManager = LocalBroadcastManager.getInstance(BaseApp.Companion.appContext()); + broadcastManager.registerReceiver(new BroadcastReceiver() { + @Override + public void onReceive(Context context, Intent intent) { + String resultActionUUID = intent.getStringExtra(PERMISSION_BROADCAST_ACTION_EXTRA_UUID); + int permissionResult = intent.getIntExtra(PERMISSION_BROADCAST_ACTION_EXTRA_RESULT, PERMISSION_RESULT_ALL_REJECTED); + broadcastManager.unregisterReceiver(this); + + if (callback != null && actionUUID.equalsIgnoreCase(resultActionUUID)) { + switch (permissionResult) { + case PERMISSION_RESULT_ALL_GRANTED: + callback.onAllGranted(); + break; + + case PERMISSION_RESULT_PARTIAL_GRANTED: + callback.onPartialGranted(); + break; + + case PERMISSION_RESULT_ALL_REJECTED: + callback.onAllRejected(); + break; + } + } + } + }, new IntentFilter(PERMISSION_BROADCAST_ACTION)); + } + +} diff --git a/core/architecture/src/main/res/values/strings.xml b/core/architecture/src/main/res/values/strings.xml index bf90e87..e19431a 100644 --- a/core/architecture/src/main/res/values/strings.xml +++ b/core/architecture/src/main/res/values/strings.xml @@ -6,4 +6,5 @@ The request timed out. Please try again later. Unable to connect to server. Please check network connection. Unknown Exception: %1$s + You have to enable the permissions, or the system can\'t works\\n \ No newline at end of file