package com.gh.common.util; import android.app.Activity; import android.app.Dialog; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.content.SharedPreferences; import android.graphics.Color; import android.graphics.drawable.ColorDrawable; import android.os.CountDownTimer; import android.preference.PreferenceManager; import android.text.Html; import android.text.SpannableStringBuilder; import android.text.Spanned; import android.text.TextPaint; import android.text.TextUtils; import android.text.method.LinkMovementMethod; import android.text.style.ClickableSpan; import android.view.Gravity; import android.view.KeyEvent; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.view.Window; import android.view.WindowManager; import android.widget.Button; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.TextView; import com.facebook.drawee.generic.GenericDraweeHierarchy; import com.gh.common.AppExecutor; import com.gh.common.constant.Config; import com.gh.common.dialog.TrackableDialog; import com.gh.common.view.DrawableView; import com.gh.common.view.FixLinearLayoutManager; import com.gh.common.view.LimitHeightLinearLayout; import com.gh.common.view.MaxHeightNestedScrollView; import com.gh.gamecenter.AboutActivity; import com.gh.gamecenter.R; import com.gh.gamecenter.WebActivity; import com.gh.gamecenter.adapter.viewholder.PrivacyPolicyItemViewHolder; import com.gh.gamecenter.databinding.ImprintContentItemBinding; import com.gh.gamecenter.databinding.PrivacyItemBinding; import com.gh.gamecenter.entity.ApkEntity; import com.gh.gamecenter.entity.GameEntity; import com.gh.gamecenter.entity.PrivacyPolicyEntity; import com.gh.gamecenter.entity.SettingsEntity; import com.gh.gamecenter.entity.TrackableEntity; import com.halo.assistant.HaloApp; import com.halo.assistant.fragment.SettingsFragment; import com.lightgame.adapter.BaseRecyclerAdapter; import com.lightgame.utils.AppManager; import com.lightgame.utils.Utils; import java.util.ArrayList; import java.util.List; import java.util.concurrent.atomic.AtomicBoolean; import androidx.annotation.NonNull; import androidx.appcompat.app.AlertDialog; import androidx.core.content.ContextCompat; import androidx.databinding.DataBindingUtil; import androidx.recyclerview.widget.RecyclerView; public class DialogUtils { public static Dialog showWaitDialog(Context context, String msg) { context = checkDialogContext(context); Dialog dialog = new Dialog(context); View view = View.inflate(context, R.layout.set_wait_dialog, null); TextView message = view.findViewById(R.id.set_wait_message); message.setText(msg); dialog.requestWindowFeature(Window.FEATURE_NO_TITLE); dialog.setContentView(view); dialog.setCanceledOnTouchOutside(false); dialog.show(); return dialog; } public static void showInstallHintDialog(Context context, final ConfirmListener cmListener) { context = checkDialogContext(context); final Dialog dialog = new Dialog(context); View view = View.inflate(context, R.layout.dialog_install_hint, null); // 标题 TextView alertdialog_title = view.findViewById(R.id.installhint_title); alertdialog_title.setText("重要提示"); Spanned content = Html.fromHtml("如果您使用的是" + "华为" + "或" + "OPPO" + "手机,安装游戏时请选择“" + "继续安装" + "”(记住不要选择“官方推荐”或“软件商店安装”)"); // 内容 TextView alertdialog_content = view.findViewById(R.id.installhint_content); alertdialog_content.setText(content); // 确定按钮 TextView installhint_confirm = view.findViewById(R.id.installhint_confirm); installhint_confirm.setText("知道了"); final ImageView installhint_unselect = view.findViewById(R.id.installhint_unselect); final ImageView installhint_select = view.findViewById(R.id.installhint_select); LinearLayout installhint_unselect_ll = view.findViewById(R.id.installhint_unselect_ll); installhint_unselect_ll.setOnClickListener(v -> { if (installhint_unselect.getVisibility() == View.GONE) { installhint_unselect.setVisibility(View.VISIBLE); installhint_select.setVisibility(View.GONE); } else { installhint_unselect.setVisibility(View.GONE); installhint_select.setVisibility(View.VISIBLE); } }); installhint_confirm.setOnClickListener(v -> { dialog.dismiss(); if (installhint_select.getVisibility() == View.VISIBLE) { if (cmListener != null) { cmListener.onConfirm(); } } }); dialog.requestWindowFeature(Window.FEATURE_NO_TITLE); dialog.setContentView(view); dialog.show(); } public static void showHintDialog(Context context, String title, CharSequence msg, String confirm) { context = checkDialogContext(context); final Dialog dialog = new Dialog(context); View view = View.inflate(context, R.layout.common_hintdialog, null); TextView hintdialog_title = view.findViewById(R.id.tv_dialog_hint_title); hintdialog_title.setText(title); // 内容 TextView hintdialog_content = view.findViewById(R.id.tv_dialog_hint_content); hintdialog_content.setText(msg); TextView hintdialog_confirm = view.findViewById(R.id.tv_dialog_hint_confirm); hintdialog_confirm.setText(confirm); hintdialog_confirm.setOnClickListener(v -> dialog.cancel()); dialog.requestWindowFeature(Window.FEATURE_NO_TITLE); dialog.setContentView(view); dialog.show(); } public static void showWarningDialog(Context context, String title, CharSequence msg, final ConfirmListener listener) { if (!(context instanceof Activity)) { return; } showWarningDialog(context, title, msg, "取消", "确定", listener, null); } public static void showWarningDialog(Context context, String title, CharSequence msg, String cancel, String confirm, final ConfirmListener cmListener, final CancelListener clListener) { showAlertDialog(context, title, msg, confirm, cancel, cmListener, clListener); } // 网络劫持时 打开QQ客户端,创建临时会话 public static void showQqSessionDialog(final Context context) { String qq = ""; if (Config.getSettings() != null && Config.getSettings().getSupport() != null) { qq = Config.getSettings().getSupport().getQq(); } String finalQq = qq; showWarningDialog(context, "警告", "您当前网络环境异常,下载地址可能被运营商恶意替换(网络劫持)" + ",如多次下载失败,请联系客服获取正确的下载地址(客服QQ:" + qq + ")" , "取消", "前往QQ", () -> DirectUtils.directToQqConversation(context, finalQq), null); } public static void checkDownload(Context context, String size, CheckDownloadCallBack callBack) { SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(HaloApp.getInstance().getApplication()); if (!NetworkUtils.isNetworkConnected(context)) { showNoConnectionDownloadDialog(context, null, () -> callBack.onResponse(true)); } else if (NetworkUtils.isWifiConnected(context) || filter4GorSize(context, size)) { callBack.onResponse(false); } else if (!preferences.getBoolean(SettingsFragment.getTrafficDownloadHintKey(), true)) { AppExecutor.getUiExecutor().executeWithDelay(() -> Utils.toast(context, "当前使用移动网络下载,请注意流量消耗"), 500); callBack.onResponse(false); } else { // MtaHelper.onEvent("移动网络下载", NetworkUtils.getMobileNetworkType(context), "出现弹窗提示"); showDownloadDialog(context, () -> callBack.onResponse(false), () -> callBack.onResponse(true)); } } private static boolean filter4GorSize(Context context, String size) { try { if (TextUtils.isEmpty(size)) { return false; } String mb = size.toUpperCase().replaceAll("MB", "").trim(); Float i = Float.valueOf(mb); if (NetworkUtils.isWifiOr4GConnected(context) && i <= 50) { AppExecutor.getUiExecutor().executeWithDelay(() -> Utils.toast(context, "当前使用移动网络下载,请注意流量消耗"), 500); return true; } } catch (Exception e) { e.printStackTrace(); } return false; } public static void checkResumeDownload(Context context, CheckDownloadCallBack callBack) { if (!NetworkUtils.isNetworkConnected(context)) { showNoConnectionDownloadDialog(context, null, () -> callBack.onResponse(true)); } else if (NetworkUtils.isWifiConnected(context)) { callBack.onResponse(false); } else { showResumeDownloadDialog(context, () -> { callBack.onResponse(false); }, () -> { callBack.onResponse(true); }); } } public static void showNoConnectionDownloadDialog(Context context, ConfirmListener listener, CancelListener cancelListener) { showWarningDialog(context, "下载提示", "网络异常,请检查手机网络状态", "连上WiFi后自动下载", "关闭", listener, cancelListener); } public static void showDownloadDialog(Context context, ConfirmListener listener, CancelListener cancelListener) { context = checkDialogContext(context); final Dialog dialog = new Dialog(context, R.style.GhAlertDialog); View contentView = LayoutInflater.from(context).inflate(R.layout.dialog_download_traffic, null); View allowOnce = contentView.findViewById(R.id.allow_once); View allowAlways = contentView.findViewById(R.id.allow_always); View wifiAuto = contentView.findViewById(R.id.wifi_auto); Context finalContext = context; allowOnce.setOnClickListener(v -> { AppExecutor.getUiExecutor().executeWithDelay(() -> { Utils.toast(finalContext, "已使用移动网络下载,请注意流量消耗"); }, 500); listener.onConfirm(); dialog.dismiss(); // MtaHelper.onEvent("移动网络下载", NetworkUtils.getMobileNetworkType(finalContext), "本次允许"); }); wifiAuto.setOnClickListener(v -> { cancelListener.onCancel(); dialog.dismiss(); // MtaHelper.onEvent("移动网络下载", NetworkUtils.getMobileNetworkType(finalContext), "连上WiFi后自动下载"); }); allowAlways.setOnClickListener(v -> { PreferenceManager .getDefaultSharedPreferences(finalContext) .edit() .putBoolean(SettingsFragment.getTrafficDownloadHintKey(), false) .apply(); AppExecutor.getUiExecutor().executeWithDelay(() -> { // 显示了弹窗以后,即便下面这个 toast 放在 listener.onConfirm 后调用也是显示 listener.onConfirm 里的 toast // 喷了,延时包治疑难杂症 Utils.toast(finalContext, "已使用移动网络下载,请注意流量消耗"); }, 500); listener.onConfirm(); dialog.dismiss(); // MtaHelper.onEvent("移动网络下载", NetworkUtils.getMobileNetworkType(finalContext), "总是允许"); }); dialog.requestWindowFeature(Window.FEATURE_NO_TITLE); dialog.setContentView(contentView); dialog.show(); } public static void showResumeDownloadDialog(Context context, ConfirmListener listener, CancelListener cancelListener) { showWarningDialog(context, "下载提示", "当前正在使用移动网络,继续下载会消耗手机流量", "连上WiFi后自动下载", "继续下载", listener, cancelListener); } public static void showDownloadDialog(Context context, ConfirmListener listener) { showWarningDialog(context, "下载提示", "您当前使用的网络为2G/3G/4G,开始下载将会消耗移动流量,确定下载?", listener); } public static void showCancelDialog(Context context, final ConfirmListener listener, CancelListener cancelListener) { Spanned content = Html.fromHtml(context.getString(R.string.cancel_concern_dialog)); showCancelListenerDialog(context, "取消关注", content, "确定取消", "暂不取消", listener, cancelListener); } public static void showPluginDialog(Context context, final ConfirmListener listener) { context = checkDialogContext(context); MtaHelper.onEvent("插件化", "插件化安装弹窗", "出现弹窗提示"); final Dialog dialog = new Dialog(context, R.style.GhAlertDialog); View contentView = LayoutInflater.from(context).inflate(R.layout.dialog_plugin, null); TextView negativeTv = contentView.findViewById(R.id.dialog_negative); TextView positiveTv = contentView.findViewById(R.id.dialog_positive); negativeTv.setOnClickListener(v -> { dialog.dismiss(); MtaHelper.onEvent("插件化", "插件化安装弹窗", "取消"); }); positiveTv.setOnClickListener(view -> { if (listener != null) { listener.onConfirm(); } dialog.dismiss(); MtaHelper.onEvent("插件化", "插件化安装弹窗", "确认并开始"); }); dialog.requestWindowFeature(Window.FEATURE_NO_TITLE); dialog.setContentView(contentView); dialog.show(); } /** * Material Design 风格弹窗 * * @param context * @param title 标题 * @param message 内容 * @param positive 确认按钮文本 * @param negative 取消按钮文本 * @param cmListener 确认按钮监听 * @param clListener 取消按钮监听 */ public static Dialog showAlertDialog(Context context, String title, CharSequence message , String positive, String negative, final ConfirmListener cmListener, final CancelListener clListener) { context = checkDialogContext(context); final Dialog dialog = new Dialog(context, R.style.GhAlertDialog); View contentView = LayoutInflater.from(context).inflate(R.layout.dialog_alert, null); TextView contentTv = contentView.findViewById(R.id.dialog_content); TextView titleTv = contentView.findViewById(R.id.dialog_title); TextView negativeTv = contentView.findViewById(R.id.dialog_negative); TextView positiveTv = contentView.findViewById(R.id.dialog_positive); if (message.toString().contains("红包奖励")) {//将红包奖励四个字标红 String str = message.toString().substring(0, message.toString().indexOf("红包奖励")) + "红包奖励"; contentTv.setText(Html.fromHtml(str)); } else { contentTv.setText(message); } titleTv.setText(title); negativeTv.setText(negative); positiveTv.setText(positive); negativeTv.setOnClickListener(view -> { if (clListener != null) { clListener.onCancel(); } dialog.dismiss(); }); positiveTv.setOnClickListener(view -> { if (cmListener != null) { cmListener.onConfirm(); } dialog.dismiss(); }); dialog.requestWindowFeature(Window.FEATURE_NO_TITLE); dialog.setContentView(contentView); dialog.show(); return dialog; } public static Dialog showAlertDialog(Context context, String title, Spanned message , String positive, String negative, final ConfirmListener cmListener, final CancelListener clListener) { context = checkDialogContext(context); final Dialog dialog = new Dialog(context, R.style.GhAlertDialog); View contentView = LayoutInflater.from(context).inflate(R.layout.dialog_alert, null); TextView contentTv = contentView.findViewById(R.id.dialog_content); TextView titleTv = contentView.findViewById(R.id.dialog_title); TextView negativeTv = contentView.findViewById(R.id.dialog_negative); TextView positiveTv = contentView.findViewById(R.id.dialog_positive); contentTv.setText(message); titleTv.setText(title); negativeTv.setText(negative); positiveTv.setText(positive); negativeTv.setOnClickListener(view -> { if (clListener != null) { clListener.onCancel(); } dialog.dismiss(); }); positiveTv.setOnClickListener(view -> { if (cmListener != null) { cmListener.onConfirm(); } dialog.dismiss(); }); dialog.requestWindowFeature(Window.FEATURE_NO_TITLE); dialog.setContentView(contentView); dialog.show(); return dialog; } public static Dialog showDialogWithHtmlContent(Context context, String title, String content , String positive, String negative, final ConfirmListener cmListener, final CancelListener clListener) { context = checkDialogContext(context); final Dialog dialog = new Dialog(context, R.style.GhAlertDialog); View contentView = LayoutInflater.from(context).inflate(R.layout.dialog_alert, null); TextView contentTv = contentView.findViewById(R.id.dialog_content); TextView titleTv = contentView.findViewById(R.id.dialog_title); TextView negativeTv = contentView.findViewById(R.id.dialog_negative); TextView positiveTv = contentView.findViewById(R.id.dialog_positive); contentTv.setText(Html.fromHtml(content)); titleTv.setText(title); negativeTv.setText(negative); positiveTv.setText(positive); negativeTv.setOnClickListener(view -> { if (clListener != null) { clListener.onCancel(); } dialog.dismiss(); }); positiveTv.setOnClickListener(view -> { if (cmListener != null) { cmListener.onConfirm(); } dialog.dismiss(); }); dialog.requestWindowFeature(Window.FEATURE_NO_TITLE); dialog.setContentView(contentView); dialog.show(); return dialog; } /** * 取消按钮灰色 * * @param context * @param title * @param message * @param positive * @param negative * @param cmListener */ public static void showCancelAlertDialog(Context context, String title, CharSequence message , String positive, String negative, final ConfirmListener cmListener, final CancelListener clListener) { context = checkDialogContext(context); final Dialog dialog = new Dialog(context, R.style.GhAlertDialog); View contentView = LayoutInflater.from(context).inflate(R.layout.dialog_alert, null); TextView contentTv = contentView.findViewById(R.id.dialog_content); TextView titleTv = contentView.findViewById(R.id.dialog_title); TextView negativeTv = contentView.findViewById(R.id.dialog_negative); TextView positiveTv = contentView.findViewById(R.id.dialog_positive); contentTv.setText(message); titleTv.setText(title); negativeTv.setText(negative); negativeTv.setTextColor(ContextCompat.getColor(context, R.color.hint)); positiveTv.setText(positive); negativeTv.setOnClickListener(view -> { if (clListener != null) { clListener.onCancel(); } dialog.dismiss(); }); positiveTv.setOnClickListener(view -> { if (cmListener != null) { cmListener.onConfirm(); } dialog.dismiss(); }); dialog.requestWindowFeature(Window.FEATURE_NO_TITLE); dialog.setContentView(contentView); dialog.show(); } /** * 点击外部退出和取消监听绑定 */ public static void showCancelListenerDialog(Context context, String title, CharSequence message , String positive, String negative, final ConfirmListener cmListener, final CancelListener clListener) { context = checkDialogContext(context); final Dialog dialog = new Dialog(context, R.style.GhAlertDialog); View contentView = LayoutInflater.from(context).inflate(R.layout.dialog_alert, null); TextView contentTv = contentView.findViewById(R.id.dialog_content); TextView titleTv = contentView.findViewById(R.id.dialog_title); TextView negativeTv = contentView.findViewById(R.id.dialog_negative); TextView positiveTv = contentView.findViewById(R.id.dialog_positive); contentTv.setText(message); titleTv.setText(title); negativeTv.setText(negative); //negativeTv.setTextColor(ContextCompat.getColor(context, R.color.hint)); positiveTv.setText(positive); negativeTv.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { if (clListener != null) { clListener.onCancel(); } dialog.dismiss(); } }); positiveTv.setOnClickListener(view -> { if (cmListener != null) { cmListener.onConfirm(); } dialog.dismiss(); }); dialog.requestWindowFeature(Window.FEATURE_NO_TITLE); dialog.setContentView(contentView); dialog.setOnCancelListener(dialogInterface -> { if (clListener != null) clListener.onCancel(); }); dialog.show(); } /** * 权限弹窗 * 只能在弹窗内取消 */ public static void showPermissionDialog(Context context, String title, CharSequence message , String positive, String negative, final ConfirmListener cmListener, final CancelListener clListener) { context = checkDialogContext(context); final Dialog dialog = new Dialog(context, R.style.GhAlertDialog); View contentView = LayoutInflater.from(context).inflate(R.layout.dialog_alert, null); TextView contentTv = contentView.findViewById(R.id.dialog_content); TextView titleTv = contentView.findViewById(R.id.dialog_title); TextView negativeTv = contentView.findViewById(R.id.dialog_negative); TextView positiveTv = contentView.findViewById(R.id.dialog_positive); contentTv.setText(message); titleTv.setText(title); negativeTv.setText(negative); negativeTv.setTextColor(ContextCompat.getColor(context, R.color.hint)); positiveTv.setText(positive); negativeTv.setOnClickListener(view -> { if (clListener != null) { clListener.onCancel(); } dialog.dismiss(); }); positiveTv.setOnClickListener(view -> { if (cmListener != null) { cmListener.onConfirm(); } dialog.dismiss(); }); dialog.requestWindowFeature(Window.FEATURE_NO_TITLE); dialog.setContentView(contentView); dialog.setCancelable(false); dialog.show(); } /** * 只能在弹窗内取消 */ public static void showForceDialog(Context context, String title, CharSequence message , String positive, String negative, final ConfirmListener cmListener, final CancelListener clListener) { context = checkDialogContext(context); final Dialog dialog = new Dialog(context, R.style.GhAlertDialog); View contentView = LayoutInflater.from(context).inflate(R.layout.dialog_alert, null); TextView contentTv = contentView.findViewById(R.id.dialog_content); TextView titleTv = contentView.findViewById(R.id.dialog_title); TextView negativeTv = contentView.findViewById(R.id.dialog_negative); TextView positiveTv = contentView.findViewById(R.id.dialog_positive); contentTv.setText(message); titleTv.setText(title); negativeTv.setText(negative); positiveTv.setText(positive); negativeTv.setOnClickListener(view -> { if (clListener != null) { clListener.onCancel(); } dialog.dismiss(); }); positiveTv.setOnClickListener(view -> { if (cmListener != null) { cmListener.onConfirm(); } dialog.dismiss(); }); dialog.requestWindowFeature(Window.FEATURE_NO_TITLE); dialog.setContentView(contentView); dialog.setCancelable(false); dialog.show(); } /** * 特殊:验证手机号码 */ public static void checkPhoneNumDialog(Context context, CharSequence message, final ConfirmListener cmListener) { String s = message.toString(); String sub1 = s.substring(0, 3); String sub2 = s.substring(3, 7); String sub3 = s.substring(7, 11); String phoneNum = StringUtils.buildString(sub1, " - ", sub2, " - ", sub3); AlertDialog alertDialog = new AlertDialog.Builder(context, R.style.GhAlertDialog) .setTitle("请确定手机号:") .setMessage(phoneNum) .setPositiveButton("确认", (dialog, which) -> { if (cmListener != null) { cmListener.onConfirm(); } }) .setNegativeButton("取消", null) .create(); alertDialog.show(); TextView mesage = (TextView) alertDialog.findViewById(android.R.id.message); Button positiveBtn = alertDialog.getButton(android.app.AlertDialog.BUTTON_POSITIVE); Button negativeBtn = alertDialog.getButton(android.app.AlertDialog.BUTTON_NEGATIVE); positiveBtn.setTextSize(13); positiveBtn.setTextColor(ContextCompat.getColor(context, R.color.theme_font)); negativeBtn.setTextSize(13); negativeBtn.setTextColor(ContextCompat.getColor(context, R.color.theme_font)); if (mesage != null) { mesage.setGravity(Gravity.CENTER); mesage.setTextSize(24); mesage.setTextColor(ContextCompat.getColor(context, R.color.title)); TextPaint tp = mesage.getPaint(); tp.setFakeBoldText(true); } } public static void showSignDialog(Context context, String title, CharSequence message, CharSequence message2 , String positive, final ConfirmListener cmListener) { context = checkDialogContext(context); final Dialog dialog = new Dialog(context); View contentView = LayoutInflater.from(context).inflate(R.layout.dialog_sign, null); TextView contentTv = contentView.findViewById(R.id.dialog_content); TextView titleTv = contentView.findViewById(R.id.dialog_title); TextView negativeTv = contentView.findViewById(R.id.dialog_negative); TextView positiveTv = contentView.findViewById(R.id.dialog_positive); TextView content2Tv = contentView.findViewById(R.id.dialog_content2); contentTv.setText(Html.fromHtml(message.toString())); content2Tv.setText(Html.fromHtml(message2.toString())); titleTv.setText(title); positiveTv.setText(positive); negativeTv.setOnClickListener(view -> dialog.dismiss()); positiveTv.setOnClickListener(view -> { if (cmListener != null) { cmListener.onConfirm(); } dialog.dismiss(); }); dialog.requestWindowFeature(Window.FEATURE_NO_TITLE); dialog.setContentView(contentView); dialog.show(); } public static void showLowVersionDialog(Context context) { final Context activityContext = checkDialogContext(context); final Dialog dialog = new Dialog(activityContext, R.style.GhAlertDialog); View contentView = LayoutInflater.from(activityContext).inflate(R.layout.dialog_alert, null); TextView contentTv = contentView.findViewById(R.id.dialog_content); TextView titleTv = contentView.findViewById(R.id.dialog_title); TextView negativeTv = contentView.findViewById(R.id.dialog_negative); TextView positiveTv = contentView.findViewById(R.id.dialog_positive); contentTv.setText("链接超出范围,请检查升级至最新版本的光环助手"); titleTv.setText("提示"); negativeTv.setText("关闭"); positiveTv.setText("检查升级"); negativeTv.setOnClickListener(view -> dialog.dismiss()); positiveTv.setOnClickListener(view -> { activityContext.startActivity(AboutActivity.getIntent(activityContext, true)); dialog.dismiss(); }); dialog.requestWindowFeature(Window.FEATURE_NO_TITLE); dialog.setContentView(contentView); dialog.show(); } public static void showLowSystemVersionDialog(Context context) { final Context activityContext = checkDialogContext(context); final Dialog dialog = new Dialog(activityContext, R.style.GhAlertDialog); View contentView = LayoutInflater.from(activityContext).inflate(R.layout.dialog_alert, null); TextView contentTv = contentView.findViewById(R.id.dialog_content); TextView titleTv = contentView.findViewById(R.id.dialog_title); TextView positiveTv = contentView.findViewById(R.id.dialog_positive); titleTv.setText("提示"); contentTv.setText("抱歉,您当前系统版本过低,暂不支持视频功能"); positiveTv.setText("我知道了"); positiveTv.setOnClickListener(view -> { dialog.dismiss(); }); dialog.requestWindowFeature(Window.FEATURE_NO_TITLE); dialog.setContentView(contentView); dialog.show(); } public static void showListDialog(Context context, List selectionList, DialogInterface.OnClickListener onClickListener) { AlertDialog.Builder builder = new AlertDialog.Builder(context); String[] selectionArray = new String[selectionList.size()]; selectionArray = selectionList.toArray(selectionArray); builder.setItems(selectionArray, onClickListener); AlertDialog dialog = builder.create(); dialog.requestWindowFeature(Window.FEATURE_NO_TITLE); dialog.show(); } /** * @param options 供以显示的选项 * @param disabledOptions 显示为灰色的选项(是 options 的子集) */ public static void showListDialog(Context context, List options, List disabledOptions, OptionCallback callback) { context = checkDialogContext(context); Dialog dialog = new Dialog(context); LinearLayout container = new LinearLayout(context); container.setOrientation(LinearLayout.VERTICAL); container.setBackgroundColor(Color.WHITE); container.setPadding(0, DisplayUtils.dip2px(context, 12f), 0, DisplayUtils.dip2px(context, 12f)); for (String option : options) { TextView reportTv = new TextView(context); reportTv.setText(option); reportTv.setTextSize(17f); if (disabledOptions != null && disabledOptions.contains(option)) { reportTv.setTextColor(ContextCompat.getColor(context, R.color.btn_gray)); } else { reportTv.setTextColor(ContextCompat.getColor(context, R.color.title)); reportTv.setBackgroundResource(R.drawable.textview_white_style); } int widthPixels = context.getResources().getDisplayMetrics().widthPixels; reportTv.setLayoutParams(new LinearLayout.LayoutParams(widthPixels * 9 / 10, LinearLayout.LayoutParams.WRAP_CONTENT)); reportTv.setPadding(DisplayUtils.dip2px(context, 20f), DisplayUtils.dip2px(context, 12f), 0, DisplayUtils.dip2px(context, 12f)); container.addView(reportTv); reportTv.setOnClickListener(v -> { dialog.cancel(); callback.onClicked(reportTv.getText().toString()); }); } dialog.requestWindowFeature(Window.FEATURE_NO_TITLE); dialog.setContentView(container); dialog.show(); } /** * 特殊:目前只在提交问题错误返回时弹出 */ public static Dialog showCommunityDialog(Context context, String title, String contentTitle, String contentDes, String negative, String positive, final CancelListener clListener, final ConfirmListener cmListener) { context = checkDialogContext(context); final Dialog dialog = new Dialog(context, R.style.GhAlertDialog); View contentView = LayoutInflater.from(context).inflate(R.layout.dialog_community, null); View contentContainer = contentView.findViewById(R.id.content_container); TextView titleTv = contentView.findViewById(R.id.title); TextView contentTitleTv = contentView.findViewById(R.id.content_title); TextView contentDesTv = contentView.findViewById(R.id.content_des); TextView negativeTv = contentView.findViewById(R.id.negative); TextView positiveTv = contentView.findViewById(R.id.positive); titleTv.setText(title); contentTitleTv.setText(contentTitle); contentDesTv.setText(contentDes); if (TextUtils.isEmpty(negative)) { negativeTv.setVisibility(View.GONE); } else { negativeTv.setVisibility(View.VISIBLE); negativeTv.setText(negative); } if (TextUtils.isEmpty(positive)) { positiveTv.setVisibility(View.GONE); } else { positiveTv.setText(positive); positiveTv.setVisibility(View.VISIBLE); } negativeTv.setOnClickListener(view -> { if (clListener != null) { clListener.onCancel(); } dialog.dismiss(); }); positiveTv.setOnClickListener(view -> { if (cmListener != null) { cmListener.onConfirm(); } dialog.dismiss(); }); contentContainer.setOnClickListener(v -> { if (cmListener != null) { cmListener.onConfirm(); } dialog.dismiss(); }); dialog.requestWindowFeature(Window.FEATURE_NO_TITLE); dialog.setContentView(contentView); dialog.show(); return dialog; } public static void showPrivacyPolicyDialog(Context context, @NonNull PrivacyPolicyEntity entity, EmptyCallback callback) { final Context activityContext = checkDialogContext(context); // 区分此 dialog 是点击 dialog 外部取消的还是点击返回取消的 AtomicBoolean isCanceledByClickOutsideOfDialog = new AtomicBoolean(true); final Dialog dialog = new Dialog(activityContext, R.style.GhAlertDialog); View contentView = LayoutInflater.from(activityContext).inflate(R.layout.dialog_privacy_policy, null); dialog.requestWindowFeature(Window.FEATURE_NO_TITLE); dialog.setContentView(contentView); Window window = dialog.getWindow(); if (window != null) { window.setBackgroundDrawableResource(android.R.color.transparent); WindowManager.LayoutParams params = window.getAttributes(); params.horizontalMargin = 0; params.width = context.getResources().getDisplayMetrics().widthPixels - DisplayUtils.dip2px(40); int height = context.getResources().getDisplayMetrics().heightPixels - DisplayUtils.dip2px(120); int maxHeight = DisplayUtils.dip2px(546); if (height > maxHeight) { params.height = maxHeight; } else { params.height = height; } window.setAttributes(params); } TextView title = contentView.findViewById(R.id.title); TextView bottomContent = contentView.findViewById(R.id.bottom_content); TextView topContent = contentView.findViewById(R.id.top_content); TextView allowButton = contentView.findViewById(R.id.allow_button); TextView disallowButton = contentView.findViewById(R.id.disallow_button); TextView linkContent = contentView.findViewById(R.id.link_content); RecyclerView permissions = contentView.findViewById(R.id.permissions_content); permissions.setLayoutManager(new FixLinearLayoutManager(context)); permissions.setAdapter(new BaseRecyclerAdapter(context) { @NonNull @Override public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { View view = mLayoutInflater.inflate(R.layout.privacy_item, parent, false); return new PrivacyPolicyItemViewHolder(PrivacyItemBinding.bind(view)); } @Override public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) { if (holder instanceof PrivacyPolicyItemViewHolder) { PrivacyPolicyItemViewHolder viewHolder = (PrivacyPolicyItemViewHolder) holder; PrivacyItemBinding binding = viewHolder.getBinding(); binding.setData(entity.getPermissions().get(position)); GenericDraweeHierarchy hierarchy = binding.icon.getHierarchy(); if (hierarchy != null) { if (position == 0) { hierarchy.setPlaceholderImage(R.drawable.permission_storage); } else { hierarchy.setPlaceholderImage(R.drawable.permission_phone_state); } } } } @Override public int getItemCount() { return entity.getPermissions().size(); } }); SpannableStringBuilder skipText = new SpannableStringBuilder("查看完整版的隐私政策和用户协议"); skipText.setSpan(new ClickableSpan() { @Override public void updateDrawState(@NonNull TextPaint ds) { super.updateDrawState(ds); ds.setColor(ContextCompat.getColor(activityContext, R.color.theme_font)); ds.setUnderlineText(false); } @Override public void onClick(@NonNull View widget) { MtaHelper.onEvent("隐私政策弹窗", "隐私政策弹窗", "点击隐私政策"); Intent intent = WebActivity.getPrivacyPolicyIntent(activityContext); activityContext.startActivity(intent); } }, skipText.length() - 9, skipText.length() - 5, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); skipText.setSpan(new ClickableSpan() { @Override public void updateDrawState(@NonNull TextPaint ds) { super.updateDrawState(ds); ds.setColor(ContextCompat.getColor(activityContext, R.color.theme_font)); ds.setUnderlineText(false); } @Override public void onClick(@NonNull View widget) { MtaHelper.onEvent("隐私政策弹窗", "隐私政策弹窗", "点击用户协议"); activityContext.startActivity(WebActivity.getWebIntent(activityContext)); } }, skipText.length() - 4, skipText.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); title.setText(entity.getTitle()); linkContent.setText(skipText); linkContent.setMovementMethod(new LinkMovementMethod()); topContent.setText(entity.getTopContent()); bottomContent.setText(entity.getBottomContent()); allowButton.setOnClickListener(view -> { dialog.dismiss(); callback.onCallback(); MtaHelper.onEvent("隐私政策弹窗", "隐私政策弹窗", "点击同意"); }); disallowButton.setOnClickListener(v -> { dialog.dismiss(); showPrivacyPolicyDisallowDialog(activityContext, entity, callback); MtaHelper.onEvent("隐私政策弹窗", "隐私政策弹窗", "不同意并退出App"); }); dialog.setOnCancelListener(cd -> { if (isCanceledByClickOutsideOfDialog.get()) { MtaHelper.onEvent("隐私政策弹窗", "隐私政策弹窗", "点击空白"); } }); dialog.setOnKeyListener((dialog1, keyCode, event) -> { if (keyCode == KeyEvent.KEYCODE_BACK && event.getAction() == KeyEvent.ACTION_UP) { isCanceledByClickOutsideOfDialog.set(false); MtaHelper.onEvent("隐私政策弹窗", "隐私政策弹窗", "点击返回"); } return false; }); MtaHelper.onEvent("隐私政策弹窗", "隐私政策弹窗", "出现弹窗"); try { dialog.setCancelable(false); dialog.show(); } catch (Exception ignored) { } } public static void showPrivacyPolicyDisallowDialog(Context context, @NonNull PrivacyPolicyEntity entity, EmptyCallback callback) { final Context activityContext = checkDialogContext(context); final Dialog dialog = new Dialog(activityContext, R.style.DialogWindowTransparent); View contentView = LayoutInflater.from(activityContext).inflate(R.layout.dialog_disallow_privacy_policy, null); View backButton = contentView.findViewById(R.id.back_button); View reviewButton = contentView.findViewById(R.id.review_button); backButton.setOnClickListener(v -> { MtaHelper.onEvent("隐私政策弹窗", "退出提示弹窗", "退出应用"); dialog.dismiss(); AppManager.getInstance().appExit(activityContext); }); reviewButton.setOnClickListener(v -> { MtaHelper.onEvent("隐私政策弹窗", "退出提示弹窗", "再次查看"); dialog.dismiss(); showPrivacyPolicyDialog(activityContext, entity, callback); }); dialog.requestWindowFeature(Window.FEATURE_NO_TITLE); dialog.setCancelable(false); dialog.setContentView(contentView); try { dialog.show(); } catch (Exception ignored) { } } /** * 特殊:目前只在提交问题错误返回时弹出 */ public static Dialog showUploadDraftDialog(Context context, final CancelListener clListener, final ConfirmListener cmListener) { context = checkDialogContext(context); final Dialog dialog = new Dialog(context, R.style.GhAlertDialog); View contentView = LayoutInflater.from(context).inflate(R.layout.dialog_video_upload_draft, null); TextView negativeTv = contentView.findViewById(R.id.negative); TextView positiveTv = contentView.findViewById(R.id.positive); TextView content = contentView.findViewById(R.id.content); positiveTv.setBackground(DrawableView.getOvalDrawable(R.color.text_f5f5f5, 999)); negativeTv.setBackground(DrawableView.getOvalDrawable(R.color.theme, 999)); content.setText(Html.fromHtml(context.getString(R.string.video_upload_draft_dialog_content))); negativeTv.setOnClickListener(view -> { if (clListener != null) { clListener.onCancel(); } dialog.dismiss(); }); positiveTv.setOnClickListener(view -> { if (cmListener != null) { cmListener.onConfirm(); } dialog.dismiss(); }); dialog.requestWindowFeature(Window.FEATURE_NO_TITLE); dialog.setContentView(contentView); dialog.show(); return dialog; } public static Dialog showTrackableDialog(Context context, String title, CharSequence message, String positive, String negative, final ConfirmListener cmListener, final CancelListener clListener, TrackableEntity trackableEntity) { context = checkDialogContext(context); final TrackableDialog dialog = new TrackableDialog(context, R.style.GhAlertDialog, trackableEntity.getEvent(), trackableEntity.getKey(), trackableEntity.getValue(), trackableEntity.getCancelValue(), trackableEntity.getKeyBackValue(), trackableEntity.getLogShowEvent()); View contentView = LayoutInflater.from(context).inflate(R.layout.dialog_alert, null); TextView contentTv = contentView.findViewById(R.id.dialog_content); TextView titleTv = contentView.findViewById(R.id.dialog_title); TextView negativeTv = contentView.findViewById(R.id.dialog_negative); TextView positiveTv = contentView.findViewById(R.id.dialog_positive); if (message.toString().contains("红包奖励")) {//将红包奖励四个字标红 String str = message.toString().substring(0, message.toString().indexOf("红包奖励")) + "红包奖励"; contentTv.setText(Html.fromHtml(str)); } else { contentTv.setText(message); } titleTv.setText(title); negativeTv.setText(negative); positiveTv.setText(positive); negativeTv.setOnClickListener(view -> { if (clListener != null) { clListener.onCancel(); } dialog.dismiss(); }); positiveTv.setOnClickListener(view -> { if (cmListener != null) { cmListener.onConfirm(); } dialog.dismiss(); }); dialog.requestWindowFeature(Window.FEATURE_NO_TITLE); dialog.setContentView(contentView); dialog.show(); return dialog; } public static Dialog fixWebViewKeyboardNotWorking(Activity activity) { final Dialog dialog = new Dialog(activity, R.style.TransparentDialog); View view = new View(activity); view.setOnClickListener(v -> dialog.dismiss()); view.postDelayed(() -> { if (!activity.isFinishing()) { dialog.show(); dialog.dismiss(); } }, 500); dialog.requestWindowFeature(Window.FEATURE_NO_TITLE); dialog.setContentView(view); return dialog; } public static Dialog showUsageStatsDialog(Context context, final ConfirmListener cmListener, final CancelListener clListener) { context = checkDialogContext(context); final Dialog dialog = new Dialog(context, R.style.GhAlertDialog); View contentView = LayoutInflater.from(context).inflate(R.layout.dialog_usage_stats, null); TextView negativeTv = contentView.findViewById(R.id.dialog_negative); TextView positiveTv = contentView.findViewById(R.id.dialog_positive); Window window = dialog.getWindow(); if (window != null) { window.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT)); } negativeTv.setOnClickListener(view -> { if (clListener != null) { clListener.onCancel(); } dialog.dismiss(); }); positiveTv.setOnClickListener(view -> { if (cmListener != null) { cmListener.onConfirm(); } dialog.dismiss(); }); dialog.setOnDismissListener(dialog1 -> { if (clListener != null) { clListener.onCancel(); } }); dialog.requestWindowFeature(Window.FEATURE_NO_TITLE); dialog.setContentView(contentView); dialog.show(); return dialog; } public static void showDownloadMutexDialog(Context context) { context = checkDialogContext(context); final Dialog dialog = new Dialog(context, R.style.GhAlertDialog); View contentView = LayoutInflater.from(context).inflate(R.layout.dialog_downlaod_mutex, null); TextView positive = contentView.findViewById(R.id.dialog_positive); CountDownTimer timer = new CountDownTimer(6000, 1000) { public void onTick(long millisUntilFinished) { positive.setText(("我知道了(" + millisUntilFinished / 1000 + ")")); } public void onFinish() { dialog.dismiss(); } }; timer.start(); positive.setOnClickListener(v -> { dialog.dismiss(); }); Window window = dialog.getWindow(); if (window != null) { window.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT)); } dialog.requestWindowFeature(Window.FEATURE_NO_TITLE); dialog.setContentView(contentView); dialog.show(); } public static void showVersionNumberDialog(Context context, GameEntity gameEntity, @NonNull ConfirmListener listener) { context = checkDialogContext(context); if (!gameEntity.isShowVersionNumber()) { listener.onConfirm(); } else { final Dialog dialog = new Dialog(context, R.style.GhAlertDialog); View contentView = LayoutInflater.from(context).inflate(R.layout.dialog_version_number, null); TextView contentTv = contentView.findViewById(R.id.contentTv); TextView cancelTv = contentView.findViewById(R.id.cancelTv); TextView continueTv = contentView.findViewById(R.id.continueTv); contentTv.setText(gameEntity.getVersionNumberString()); cancelTv.setOnClickListener(v -> dialog.dismiss()); continueTv.setOnClickListener(v -> { listener.onConfirm(); dialog.dismiss(); }); Window window = dialog.getWindow(); if (window != null) { window.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT)); } dialog.requestWindowFeature(Window.FEATURE_NO_TITLE); dialog.setContentView(contentView); dialog.show(); } } public static void showImprintDialog(Context context, GameEntity gameEntity, String titleName) { context = checkDialogContext(context); Dialog dialog = new Dialog(context, R.style.full_dialog); View inflate = LayoutInflater.from(context).inflate(R.layout.imprint_dialog, null); dialog.setContentView(inflate); dialog.show(); Window window = dialog.getWindow(); WindowManager.LayoutParams params; if (window != null) { params = window.getAttributes(); params.width = (int) (context.getResources().getDisplayMetrics().widthPixels * 0.9); window.setAttributes(params); window.setBackgroundDrawableResource(R.drawable.full_dialog_background); } inflate.findViewById(R.id.imprint_close).setOnClickListener(v -> dialog.dismiss()); LinearLayout content = inflate.findViewById(R.id.imprint_content); ((TextView) inflate.findViewById(R.id.imprint_title)).setText(titleName); View head = LayoutInflater.from(context).inflate(R.layout.imprint_content_item, null); content.addView(head, LinearLayout.LayoutParams.MATCH_PARENT, DisplayUtils.dip2px(30)); LimitHeightLinearLayout imprintContainer = inflate.findViewById(R.id.imprint_container); imprintContainer.setLimitHeight((int) (context.getResources().getDisplayMetrics().heightPixels * 0.8)); ArrayList list = gameEntity.getApk(); SettingsEntity settings = Config.getSettings(); for (int i = 0; i < list.size(); i++) { ApkEntity apk = gameEntity.getApk().get(i); if (settings != null && settings.getGameDownloadBlackList().contains(apk.getPackageName())) { continue; } View item = LayoutInflater.from(context).inflate(R.layout.imprint_content_item, null); ImprintContentItemBinding bind = DataBindingUtil.bind(item); bind.setApk(apk); bind.setPlatformName(PlatformUtils.getInstance(context).getPlatformName(apk.getPlatform())); content.addView(item, LinearLayout.LayoutParams.MATCH_PARENT, DisplayUtils.dip2px(40)); } // close line View view = new View(context); view.setBackgroundColor(context.getResources().getColor(R.color.text_5d5d5d)); view.setLayoutParams(new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, DisplayUtils.dip2px(1))); content.addView(view); } public static void showKaifuRemindDialog(Context context, String content, String gameName) { context = checkDialogContext(context); final Dialog dialog = new TrackableDialog(context, R.style.GhAlertDialog, "开服说明弹窗", "弹窗", gameName, null, null, true); View contentView = LayoutInflater.from(context).inflate(R.layout.dialog_kaifu_remind, null); TextView contentTv = contentView.findViewById(R.id.contentTv); MaxHeightNestedScrollView scrollView = contentView.findViewById(R.id.scrollView); contentTv.setText(Html.fromHtml(content)); TextView ok = contentView.findViewById(R.id.dialog_ok); scrollView.setScrollChangedListener((l, t, oldl, oldt) -> { MtaHelper.onEvent("开服说明弹窗", "滑动内容", gameName); }); ok.setOnClickListener(v -> { MtaHelper.onEvent("开服说明弹窗", "弹窗", "点击我知道了"); MtaHelper.onEvent("开服说明弹窗", "点击我知道了", gameName); dialog.dismiss(); }); Window window = dialog.getWindow(); if (window != null) { window.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT)); } dialog.requestWindowFeature(Window.FEATURE_NO_TITLE); dialog.setContentView(contentView); dialog.show(); } public static void showPluggableNeverRemindDialog(Context context, String nameAndPlatform, @NonNull ConfirmListener listener) { context = checkDialogContext(context); final Dialog dialog = new Dialog(context, R.style.GhAlertDialog); View contentView = LayoutInflater.from(context).inflate(R.layout.dialog_pluggable_never_remind, null); View cancelBtn = contentView.findViewById(R.id.cancel); View confirmBtn = contentView.findViewById(R.id.confirm); TextView contentTv = contentView.findViewById(R.id.content); contentTv.setText(("助手首页将不再提示《" + nameAndPlatform + "》的所有插件化消息,确定吗?")); cancelBtn.setOnClickListener(v -> { dialog.dismiss(); }); confirmBtn.setOnClickListener(v -> { listener.onConfirm(); dialog.dismiss(); }); dialog.requestWindowFeature(Window.FEATURE_NO_TITLE); dialog.setContentView(contentView); dialog.show(); } /** * @param context may be is application context * @return activity context */ public static Context checkDialogContext(Context context) { if (context == null) { throw new NullPointerException("dialog context is null"); } if (context instanceof Activity) { return context; } // currentActivity 是否存在 isDestroyed 的情况? return AppManager.getInstance().currentActivity(); } public interface ConfirmListener { void onConfirm(); } public interface CancelListener { void onCancel(); } public interface OptionCallback { void onClicked(String text); } public interface CheckDownloadCallBack { void onResponse(boolean isSubscribe); } }