package com.weishitechsub.kdcxqwb.fragment.Adapter;
import android.Manifest;
import android.app.AlertDialog;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.pm.PackageManager;
import android.net.Uri;
import android.os.Build;
import android.os.Handler;
import android.os.Looper;
import android.provider.Settings;
import android.text.TextUtils;
import android.view.View;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.Toast;
import androidx.annotation.NonNull;
import androidx.core.content.ContextCompat;
import com.chad.library.adapter.base.BaseQuickAdapter;
import com.chad.library.adapter.base.viewholder.BaseViewHolder;
import com.weishitechsub.kdcxqwb.R;
import com.weishitechsub.kdcxqwb.bean.ListBean;
import com.weishitechsub.kdcxqwb.utils.PackageNotificationSender;
import com.weishitechsub.kdcxqwb.utils.ReminderManager;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
public class MyCourierAdapter extends BaseQuickAdapter<ListBean, BaseViewHolder> {
private static final String TAG = "MyCourierAdapter";
private List<ListBean> mTrackList;
private Context context;
// 存储:用户手动开启了提醒的单号
private final Set<String> remindedEnabled = ConcurrentHashMap.newKeySet();
// 存储:每个单号最后一次被提醒到的状态(用于去重)
private final Map<String, String> remindedStates = new ConcurrentHashMap<>();
private Handler mainHandler = new Handler(Looper.getMainLooper());
private static final String PREF_NAME = "courier_reminder";
int type;
// 缓存当前列表数据,用于根据单号查找最新状态
private List<ListBean> currentList;
public MyCourierAdapter(List<ListBean> list, Context context, int type) {
super(R.layout.my_courier_adapter, list);
this.context = context;
this.type = type;
ReminderManager.getInstance(context); // 初始化单例
}
@Override
protected void convert(@NonNull BaseViewHolder baseViewHolder, ListBean dataBean) {
String number = dataBean.getNum();
baseViewHolder.setText(R.id.tv_number, number);
baseViewHolder.setText(R.id.tv_address, dataBean.getContext());
if (type == 1) {
baseViewHolder.getView(R.id.tv_remind).setVisibility(View.GONE);
baseViewHolder.getView(R.id.iv_remind).setVisibility(View.GONE);
} else {
baseViewHolder.getView(R.id.tv_remind).setVisibility(View.VISIBLE);
baseViewHolder.getView(R.id.iv_remind).setVisibility(View.VISIBLE);
}
// 设置快递公司信息和图标
if (dataBean.getType() != null) {
String trackName = getTrackName(dataBean.getType());
baseViewHolder.setText(R.id.tv_type, trackName);
ImageView logo = baseViewHolder.getView(R.id.iv_logo);
LinearLayout line = baseViewHolder.getView(R.id.line);
setCompanyLogo(trackName, logo, line);
}
// ===== 获取状态文本 =====
String state = dataBean.getState();
String stateText = getStateText(state);
baseViewHolder.setText(R.id.tv_state, stateText);
ImageView ivRemind = baseViewHolder.getView(R.id.iv_remind);
// === 统一处理所有状态分支(推荐:单一入口,避免遗漏)===
if (state == null || TextUtils.isEmpty(stateText)) {
// 情况1:状态为空或无效
ivRemind.setEnabled(false);
ivRemind.setAlpha(0.4f);
refreshRemindIcon(ivRemind, false);
ivRemind.setOnClickListener(v -> {
Toast.makeText(context, "该快递状态异常,暂不支持提醒功能", Toast.LENGTH_SHORT).show();
});
} else if ("3".equals(state) || "4".equals(state) || "6".equals(state)) {
// 情况2:终止状态(签收/拒签/退回)
ivRemind.setEnabled(false);
ivRemind.setAlpha(0.5f);
refreshRemindIcon(ivRemind, false);
ivRemind.setOnClickListener(v -> {
String tip = "3".equals(state) ? "该快递已签收,无需提醒。"
: "4".equals(state) ? "该快递已拒签,订单结束。"
: "该快递已被退回。";
Toast.makeText(context, tip, Toast.LENGTH_SHORT).show();
});
// 自动关闭提醒(如果之前开启了)
remindedEnabled.remove(number);
remindedStates.put(number, state);
} else {
// 情况3:正常流转状态 → 允许开启提醒
// ===== 状态变更检测 & 发送通知 =====
if (remindedEnabled.contains(number)) {
String oldState = remindedStates.get(number);
if (oldState != null && !state.equals(oldState)) {
String company = getTrackName(dataBean.getType());
sendStatusNotification(number, company, getStateText(state), getNotifyContent(state));
}
remindedStates.put(number, state);
}
// 刷新图标
boolean isCurrentlyReminded = ReminderManager.getInstance(context).isReminded(number);
refreshRemindIcon(ivRemind, isCurrentlyReminded);
// 设置点击事件
ivRemind.setEnabled(true);
ivRemind.setAlpha(1.0f);
ivRemind.setOnClickListener(v -> {
boolean nowEnabled = ReminderManager.getInstance(context).isReminded(number);
if (nowEnabled) {
ReminderManager.getInstance(context).disableReminder(number);
Toast.makeText(context, "已关闭提醒: " + number, Toast.LENGTH_SHORT).show();
} else {
enableReminderWithPermissionCheck(dataBean);
}
refreshRemindIcon(ivRemind, !nowEnabled);
});
}
// 可选:缓存当前列表用于外部查询
if (currentList == null) {
currentList = new ArrayList<>();
}
}
// 检查权限后开启提醒,并发送“当前状态”的通知
private void enableReminderWithPermissionCheck(ListBean dataBean) {
String number = dataBean.getNum();
String state = dataBean.getState();
String type = dataBean.getType();
// 权限检查...
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
if (ContextCompat.checkSelfPermission(context, Manifest.permission.POST_NOTIFICATIONS)
!= PackageManager.PERMISSION_GRANTED) {
showNotificationPermissionDialog();
return;
}
}
// 启用提醒(自动保存到 SP)
ReminderManager.getInstance(context).enableReminder(number);
Toast.makeText(context, "已开启提醒: " + number, Toast.LENGTH_SHORT).show();
// 发送欢迎通知
String companyName = getTrackName(type);
sendStatusNotification(number, companyName, getStateText(state), getNotifyContent(state));
}
// 刷新提醒按钮图标
private void refreshRemindIcon(ImageView ivRemind, boolean isEnabled) {
if (isEnabled) {
ivRemind.setImageResource(R.mipmap.button_on); // 🔔
} else {
ivRemind.setImageResource(R.mipmap.button_off); // 🔕
}
}
// 获取状态中文文本
private String getStateText(String state) {
switch (state) {
case "0":
return "在途";
case "5":
return "派件";
case "3":
return "签收";
case "6":
return "退回";
case "4":
return "退签";
case "1":
return "揽收";
case "7":
return "转投";
case "2":
return "疑难";
case "8":
return "清关";
case "10":
return "待清关";
case "11":
return "清关中";
case "12":
return "已清关";
case "13":
return "清关异常";
default:
return null;
}
}
// 获取对应状态的通知内容
private String getNotifyContent(String state) {
switch (state) {
case "0":
return "您的快递已在运输途中,正在路上~";
case "5":
return "快递员正在为您派送,请注意查收!";
case "3":
return "您的快递已签收,感谢使用!";
case "6":
return "很遗憾,您的快递因故被退回。";
case "4":
return "您已拒签该快递,订单已完成。";
default:
return "快递因地址问题已转投其他网点。";
}
}
// 发送状态变更通知
private void sendStatusNotification(String number, String company, String titleSuffix, String content) {
PackageNotificationSender sender = new PackageNotificationSender(context);
int id = ("status_" + number).hashCode() & Integer.MAX_VALUE;
id = (id % 1_000_000) + 2000; // 控制 ID 范围,避免冲突
sender.sendCustomNotification(id, "📌 快递" + titleSuffix, content, number, company);
}
// 根据 type 查找快递公司名称
private String getTrackName(String type) {
if (mTrackList != null) {
for (ListBean item : mTrackList) {
if (item.getNum() != null && type != null && TextUtils.equals(item.getNum(), type)) {
return item.getCom();
}
}
}
return "";
}
// 设置外部数据源
public void setTrackList(List<ListBean> list) {
this.mTrackList = list;
}
// 缓存当前列表(供开启提醒时查询状态)
@Override
public void setNewInstance(List<ListBean> list) {
super.setNewInstance(list);
this.currentList = list;
}
// 可选:暴露方法供外部查询某单号是否开启提醒
public boolean isReminderEnabled(String number) {
return remindedEnabled.contains(number);
}
/**
* 根据快递公司名称设置对应的 Logo 图标
*/
private void setCompanyLogo(String name, ImageView logo, LinearLayout line) {
if (name == null || name.isEmpty()) {
logo.setVisibility(View.GONE);
line.setVisibility(View.VISIBLE);
return;
}
switch (name) {
case "邮政快递包裹":
logo.setImageResource(R.mipmap.img_yz_bg);
logo.setVisibility(View.VISIBLE);
line.setVisibility(View.GONE);
break;
case "京东物流":
logo.setImageResource(R.mipmap.img_jd_bg);
logo.setVisibility(View.VISIBLE);
line.setVisibility(View.GONE);
break;
case "圆通快递":
logo.setImageResource(R.mipmap.img_yt_bg);
logo.setVisibility(View.VISIBLE);
line.setVisibility(View.GONE);
break;
case "中通快递":
logo.setImageResource(R.mipmap.img_zt_bg);
logo.setVisibility(View.VISIBLE);
line.setVisibility(View.GONE);
break;
case "顺丰速运":
logo.setImageResource(R.mipmap.img_sf_bg);
logo.setVisibility(View.VISIBLE);
line.setVisibility(View.GONE);
break;
case "韵达快递":
logo.setImageResource(R.mipmap.img_yd_bg);
logo.setVisibility(View.VISIBLE);
line.setVisibility(View.GONE);
break;
case "申通快递":
logo.setImageResource(R.mipmap.img_st_bg);
logo.setVisibility(View.VISIBLE);
line.setVisibility(View.GONE);
break;
case "EMS":
logo.setImageResource(R.mipmap.img_ems_bg);
logo.setVisibility(View.VISIBLE);
line.setVisibility(View.GONE);
break;
default:
logo.setVisibility(View.GONE);
line.setVisibility(View.VISIBLE);
break;
}
}
public void loadSavedStates() {
// 如果 ReminderManager 已经负责加载,则不需要此方法
// 或者你可以让它触发一次同步
ReminderManager manager = ReminderManager.getInstance(context);
// manager.loadFromSP(); // 如果不是自动加载,手动调用
}
// MyCourierAdapter.java 中新增
public List<ListBean> getRemindedItems() {
List<ListBean> result = new ArrayList<>();
if (currentList == null) return result;
Set<String> remindedNumbers = ReminderManager.getInstance(context).getRemindedNumbers();
for (ListBean bean : currentList) {
if (remindedNumbers.contains(bean.getNum())) {
result.add(bean);
}
}
return result;
}
private void showNotificationPermissionDialog() {
if (context == null) return;
new AlertDialog.Builder(context)
.setTitle("需要通知权限")
.setMessage("请允许本应用发送快递状态提醒通知。\n\n进入【设置】→【通知】中开启权限。")
.setPositiveButton("去开启", (dialog, which) -> {
Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
intent.setData(Uri.fromParts("package", context.getPackageName(), null));
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); // 防止在非 Activity 上下文中启动失败
context.startActivity(intent);
})
.setNegativeButton("取消", (dialog, which) -> {
Toast.makeText(context, "未授予通知权限,无法开启提醒", Toast.LENGTH_SHORT).show();
})
.create()
.show();
}
}
这个判断 if (state == null || TextUtils.isEmpty(stateText)) {
// 情况1:状态为空或无效
ivRemind.setEnabled(false);
ivRemind.setAlpha(0.4f);
refreshRemindIcon(ivRemind, false);
ivRemind.setOnClickListener(v -> {
Toast.makeText(context, "该快递状态异常,暂不支持提醒功能", Toast.LENGTH_SHORT).show();
});
} 还是不提醒