package com.xw.common import android.content.Context import android.graphics.Color import android.os.Handler import android.os.Looper import android.text.method.LinkMovementMethod import android.util.TypedValue import android.view.Gravity import android.widget.Button import androidx.appcompat.widget.AppCompatTextView import androidx.core.content.ContextCompat import androidx.core.view.isVisible import androidx.databinding.DataBindingUtil import com.afollestad.materialdialogs.LayoutMode import com.afollestad.materialdialogs.MaterialDialog import com.afollestad.materialdialogs.bottomsheets.BottomSheet import com.afollestad.materialdialogs.callbacks.onDismiss import com.afollestad.materialdialogs.customview.customView import com.afollestad.materialdialogs.customview.getCustomView import com.hjq.permissions.Permission import com.hjq.permissions.XXPermissions import com.xw.common.databinding.DialogShowSelectBinding import java.util.WeakHashMap object CommonDialog { fun showLocationNotGrantedTipsDialog(context: Context) { /* CommonDialog.showSingleTipsDialog( context, "您未开启gps权限,无法获取当前定位,请打开后重新操作", null ) */ // CommonDialog.showCommonTipsDialog( CommonDialog.showSingleTipsDialog( context = context, content = "您未开启gps权限,无法获取当前定位,请打开后重新操作", // "定位权限已被拒绝,将无法获取当前位置,请前往系统设置开启定位权限。", leftText = "取消", rightText = "去设置", // leftBlock = { dialog -> dialog.dismiss() }, rightBlock = { dialog -> // 跳转到当前应用的权限设置页 XXPermissions.startPermissionActivity( context, arrayOf(Permission.ACCESS_FINE_LOCATION, Permission.ACCESS_COARSE_LOCATION) ) true } ) } // 记录每个页面(Context)当前正在展示的"单例"提示弹窗,避免同一界面重复弹出相同弹窗。 // 用 WeakHashMap 以 Context 为 key,Activity 销毁后可被回收,不会内存泄漏。 private val singleTipsDialogMap = WeakHashMap() /** * 单例提示弹窗:同一个 Activity(Context) 内若已弹出且尚未取消,则不再重复弹出。 * * 适用于定位/GPS 等可能被多处回调(多次 onLocationChanged 等)同时触发、 * 导致同一界面叠加出多个相同提示弹窗的场景。 * * @param content 内容 * @param leftBlock 回调事件 返回true dismiss * @param rightBlock 回调事件 返回true dismiss */ private fun showSingleTipsDialog( context: Context, content: String, leftText: String? = null, rightText: String? = "确定", leftBlock: (MaterialDialog) -> Boolean = { true }, rightBlock: (MaterialDialog) -> Boolean = { true } ) { Handler(Looper.getMainLooper()).post { // 该界面已弹出同类弹窗且仍在显示,直接跳过,避免重复弹出 singleTipsDialogMap[context]?.let { if (it.isShowing) return@post } val dialog = MaterialDialog(context).apply { SecureScreenShot.apply(window) customView( R.layout.dialog_confirm, noVerticalPadding = true, dialogWrapContent = false ) cancelable(true) cornerRadius(15f) val tvContent = findViewById(R.id.content) val btnLeft = findViewById