diff --git a/aes/build.properties b/aes/build.properties index 8731ba2b..27ed1fc4 100644 --- a/aes/build.properties +++ b/aes/build.properties @@ -1,8 +1,8 @@ #Created by .winboll/winboll_app_build.gradle -#Thu Nov 27 13:20:34 HKT 2025 +#Thu Nov 27 11:11:09 GMT 2025 stageCount=8 libraryProject=libaes baseVersion=15.11 publishVersion=15.11.7 -buildCount=0 +buildCount=4 baseBetaVersion=15.11.8 diff --git a/libaes/build.properties b/libaes/build.properties index 328481d2..27ed1fc4 100644 --- a/libaes/build.properties +++ b/libaes/build.properties @@ -1,8 +1,8 @@ #Created by .winboll/winboll_app_build.gradle -#Thu Nov 27 13:19:41 HKT 2025 +#Thu Nov 27 11:11:09 GMT 2025 stageCount=8 libraryProject=libaes baseVersion=15.11 publishVersion=15.11.7 -buildCount=0 +buildCount=4 baseBetaVersion=15.11.8 diff --git a/libaes/src/main/java/cc/winboll/studio/libaes/views/ADsControlView.java b/libaes/src/main/java/cc/winboll/studio/libaes/views/ADsControlView.java index 91f1dd74..8f23c57f 100644 --- a/libaes/src/main/java/cc/winboll/studio/libaes/views/ADsControlView.java +++ b/libaes/src/main/java/cc/winboll/studio/libaes/views/ADsControlView.java @@ -2,32 +2,39 @@ package cc.winboll.studio.libaes.views; import android.app.Activity; import android.content.Context; -import android.content.DialogInterface; +import android.content.Intent; import android.content.SharedPreferences; +import android.net.Uri; import android.os.Handler; import android.os.Looper; import android.os.Message; import android.text.TextUtils; +import android.text.method.LinkMovementMethod; import android.util.AttributeSet; import android.view.Display; import android.view.Gravity; import android.view.LayoutInflater; +import android.view.View; +import android.view.View.OnClickListener; import android.view.Window; import android.view.WindowManager; +import android.widget.Button; import android.widget.LinearLayout; import android.widget.RadioButton; import android.widget.RadioGroup; +import android.widget.TextView; import android.widget.Toast; import androidx.appcompat.app.AlertDialog; import cc.winboll.studio.libaes.R; import cc.winboll.studio.libaes.enums.ADsMode; +import cc.winboll.studio.libaes.enums.PrivacyAgreeStatus; import cc.winboll.studio.libaes.views.ADsControlView; import cc.winboll.studio.libappbase.LogUtils; +import cc.winboll.studio.libappbase.ToastUtils; import com.miui.zeus.mimo.sdk.MimoCustomController; import com.miui.zeus.mimo.sdk.MimoLocation; import com.miui.zeus.mimo.sdk.MimoSdk; -import cc.winboll.studio.libappbase.ToastUtils; -import cc.winboll.studio.libaes.enums.PrivacyAgreeStatus; +import android.text.Html; /** * @Author ZhanGSKen&豆包大模型 @@ -141,11 +148,13 @@ public class ADsControlView extends LinearLayout { @Override public void onAgreePrivacy() { setADsMode(ADsMode.MIMO_SDK); + setSelectedMode(ADsMode.MIMO_SDK); } @Override public void onDisagreePrivacy() { setADsMode(ADsMode.STANDALONE); + setSelectedMode(ADsMode.STANDALONE); } }); } @@ -225,32 +234,10 @@ public class ADsControlView extends LinearLayout { return; } else { LogUtils.i(TAG, "开始弹出隐私协议..."); - AlertDialog.Builder builder = new AlertDialog.Builder(activity); - builder.setTitle("用户须知"); - builder.setMessage("小米广告SDK隐私政策: https://dev.mi.com/distribute/doc/details?pId=1688, 请复制到浏览器查看"); - builder.setIcon(R.drawable.ic_launcher); - builder.setCancelable(false); // 点击对话框以外的区域不消失 - builder.setPositiveButton("同意", new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - SharedPreferences sp = getPrivacySharedPreferences(activity); - sp.edit().putString(PRIVACY_VALUE, String.valueOf(1)).apply(); - initMimoSdkStatic(activity.getApplicationContext()); - dialog.dismiss(); - onPrivacyChangeListener.onAgreePrivacy(); - } - }); - builder.setNegativeButton("拒绝", new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - SharedPreferences sp = getPrivacySharedPreferences(activity); - sp.edit().putString(PRIVACY_VALUE, String.valueOf(0)).apply(); - ADsControlView.updateAdsModeByStatic(activity.getApplicationContext(), ADsMode.STANDALONE); - dialog.dismiss(); - onPrivacyChangeListener.onDisagreePrivacy(); - } - }); - AlertDialog dialog = builder.create(); + + // 2. 替换后的XML布局对话框代码(核心逻辑) + AlertDialog dialog = createPrivacyDialog(activity, onPrivacyChangeListener); + dialog.show(); // 配置弹窗位置(底部全屏) Window window = dialog.getWindow(); @@ -477,9 +464,116 @@ public class ADsControlView extends LinearLayout { void onModeSelected(ADsMode selectedMode); } + // 1. 先定义隐私协议变更监听接口(若已定义可忽略) public interface OnPrivacyChangeListener { - void onAgreePrivacy(); - void onDisagreePrivacy(); + void onAgreePrivacy(); // 同意隐私协议回调 + void onDisagreePrivacy();// 拒绝隐私协议回调 } + + // 3. 修复:创建隐私协议对话框(XML布局版,解决inflation崩溃) + private static AlertDialog createPrivacyDialog(final Activity activity, final OnPrivacyChangeListener onPrivacyChangeListener) { + // 1. 加载自定义XML布局(修复:避免解析标签崩溃) + View dialogView = LayoutInflater.from(activity).inflate(R.layout.dialog_privacy_agreement, null); + + // 2. 初始化对话框(无标题,使用自定义布局标题) + AlertDialog.Builder builder = new AlertDialog.Builder(activity); + builder.setView(dialogView) + .setCancelable(false); // 点击外部不消失 + final AlertDialog dialog = builder.create(); + + // 3. 初始化控件(修复:绑定链接TextView,替代标签) + final TextView tvPrivacyUrl = (TextView) dialogView.findViewById(R.id.tv_privacy_url); + Button btnAgree = (Button) dialogView.findViewById(R.id.btn_agree); + Button btnDisagree = (Button) dialogView.findViewById(R.id.btn_disagree); + + // 4. 修复:设置链接TextView可点击 + 蓝色下划线样式(模拟网页链接) + // 4.1 设置下划线文本 + tvPrivacyUrl.setText(Html.fromHtml("" + tvPrivacyUrl.getText().toString() + "")); + // 4.2 设置点击事件,调用系统浏览器 + tvPrivacyUrl.setOnClickListener(new OnClickListener() { + @Override + public void onClick(View v) { + String url = tvPrivacyUrl.getText().toString().trim(); + openUrlInBrowser(activity, url); + } + }); + // 4.3 设置点击反馈(可选,提升交互) + tvPrivacyUrl.setClickable(true); + tvPrivacyUrl.setFocusable(true); + + // 5. 同意按钮点击事件(不变) + btnAgree.setOnClickListener(new OnClickListener() { + @Override + public void onClick(View v) { +// // 存储隐私协议状态(枚举+String兼容) +// SharedPreferences sp = getPrivacySharedPreferences(activity); +// sp.edit() +// .putString(PRIVACY_VALUE, String.valueOf(PrivacyAgreeStatus.AGREED.getStatusCode())) +// .apply(); +// // 初始化米盟SDK +// initMimoSdkStatic(activity.getApplicationContext()); + // 回调外部监听 + if (onPrivacyChangeListener != null) { + onPrivacyChangeListener.onAgreePrivacy(); + } + dialog.dismiss(); + } + }); + + // 6. 拒绝按钮点击事件(不变) + btnDisagree.setOnClickListener(new OnClickListener() { + @Override + public void onClick(View v) { +// // 存储隐私协议状态 +// SharedPreferences sp = getPrivacySharedPreferences(activity); +// sp.edit() +// .putString(PRIVACY_VALUE, String.valueOf(PrivacyAgreeStatus.REJECTED.getStatusCode())) +// .apply(); +// // 更新广告模式为单机模式 +// ADsControlView.updateAdsModeByStatic(activity.getApplicationContext(), AdsMode.STANDALONE); + // 回调外部监听 + if (onPrivacyChangeListener != null) { + onPrivacyChangeListener.onDisagreePrivacy(); + } + dialog.dismiss(); + } + }); + + // 7. 配置对话框样式(底部全屏,与原逻辑一致) + Window window = dialog.getWindow(); + if (window != null) { + window.setGravity(Gravity.BOTTOM); + WindowManager m = activity.getWindowManager(); + Display d = m.getDefaultDisplay(); + WindowManager.LayoutParams p = window.getAttributes(); + p.width = d.getWidth(); // 宽度全屏 + window.setAttributes(p); + } + + return dialog; + } + + // 4. 不变:调用系统默认浏览器打开链接(Java 7 兼容) + private static void openUrlInBrowser(Context context, String url) { + if (context == null || TextUtils.isEmpty(url)) { + LogUtils.e(TAG, "openUrlInBrowser: Context or Url is null"); + return; + } + try { + // 构建浏览器意图 + Intent browserIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(url)); + // 确保有应用可处理该意图(避免崩溃) + if (browserIntent.resolveActivity(context.getPackageManager()) != null) { + context.startActivity(browserIntent); + } else { + Toast.makeText(context.getApplicationContext(), "未找到可用的浏览器", Toast.LENGTH_SHORT).show(); + LogUtils.e(TAG, "openUrlInBrowser: No browser app found"); + } + } catch (Exception e) { + LogUtils.e(TAG, "openUrlInBrowser: Open url failed", e); + Toast.makeText(context.getApplicationContext(), "打开链接失败,请手动复制链接浏览", Toast.LENGTH_SHORT).show(); + } + } + } diff --git a/libaes/src/main/res/layout/dialog_privacy_agreement.xml b/libaes/src/main/res/layout/dialog_privacy_agreement.xml new file mode 100644 index 00000000..ebe6fe2d --- /dev/null +++ b/libaes/src/main/res/layout/dialog_privacy_agreement.xml @@ -0,0 +1,79 @@ + + + + + + + + + + + + + + + + + + + + +