diff --git a/app/src/main/java/cc/niushuai/dididone/biz/BizGlobal.java b/app/src/main/java/cc/niushuai/dididone/biz/BizGlobal.java index 0309d8e..aaacf2a 100644 --- a/app/src/main/java/cc/niushuai/dididone/biz/BizGlobal.java +++ b/app/src/main/java/cc/niushuai/dididone/biz/BizGlobal.java @@ -45,6 +45,8 @@ public class BizGlobal { public static final String PROJECT_ICON_COLOR = "projectIconColor"; public static final Map CACHE_PROJECT = new HashMap<>(); public static final Map CACHE_PROJECT_COUNT = new HashMap<>(); + public static final Map CACHE_PROJECT_TODAY_COUNT = new HashMap<>(); + public static final Map> CACHE_RECORD_LIST = new HashMap<>(); public static final String EMPTY_PROJECT_TIPS = "先去添加打卡项吧~"; public static final String EMPTY_PROJECT_TIPS_ICON = "cmd_alert_decagram_outline"; public static final int REQUEST_CODE_GENERAL = 1; diff --git a/app/src/main/java/cc/niushuai/dididone/ui/calendar/CalendarFragment.java b/app/src/main/java/cc/niushuai/dididone/ui/calendar/CalendarFragment.java index 18a153d..5d684e8 100644 --- a/app/src/main/java/cc/niushuai/dididone/ui/calendar/CalendarFragment.java +++ b/app/src/main/java/cc/niushuai/dididone/ui/calendar/CalendarFragment.java @@ -38,6 +38,7 @@ import org.reactivestreams.Subscription; import java.util.Comparator; import java.util.List; +import java.util.Map; import java.util.stream.Collectors; import cc.niushuai.dididone.R; @@ -161,9 +162,9 @@ public class CalendarFragment extends BaseFragment { .hasShadowBg(true) .isViewMode(true) .isDestroyOnDismiss(true) - .asCustom(new ProjectPopupView(getContext(), project -> { + .asCustom(new ProjectPopupView(getContext(), (project, extraMap) -> { // item click callback - add2Top(project); + add2Top(project, extraMap); })) .show(); @@ -294,7 +295,7 @@ public class CalendarFragment extends BaseFragment { } - private void add2Top(Project project) { + private void add2Top(Project project, Map extraMap) { // 过滤掉empty选项 if (BizGlobal.EMPTY_PROJECT_TIPS.equals(project.getName())) { return; @@ -304,6 +305,8 @@ public class CalendarFragment extends BaseFragment { record.setProjectId(project.getId()); record.setName(project.getName()); record.setCheckDate(DateUtil.parseDate(lastDate).getTime()); + record.setCreateDate(DateUtil.parseDateTime(extraMap.get("time")).getTime()); + record.setDescription(extraMap.getOrDefault("note", "")); // 插入数据库 Completable completable = DBManager.INSTANCE.recordDao().insertAll(record); diff --git a/app/src/main/java/cc/niushuai/dididone/ui/component/ProjectPopupView.java b/app/src/main/java/cc/niushuai/dididone/ui/component/ProjectPopupView.java index 3717e46..9953c84 100644 --- a/app/src/main/java/cc/niushuai/dididone/ui/component/ProjectPopupView.java +++ b/app/src/main/java/cc/niushuai/dididone/ui/component/ProjectPopupView.java @@ -12,19 +12,27 @@ import androidx.recyclerview.widget.RecyclerView; import com.lxj.easyadapter.EasyAdapter; import com.lxj.easyadapter.MultiItemTypeAdapter; import com.lxj.easyadapter.ViewHolder; +import com.lxj.xpopup.XPopup; import com.lxj.xpopup.core.BottomPopupView; import com.lxj.xpopup.util.XPopupUtils; import com.lxj.xpopup.widget.VerticalRecyclerView; import com.mikepenz.iconics.IconicsDrawable; import java.util.Comparator; +import java.util.HashMap; import java.util.List; +import java.util.Map; +import java.util.function.BiConsumer; import java.util.function.Consumer; import cc.niushuai.dididone.R; import cc.niushuai.dididone.biz.BizGlobal; import cc.niushuai.dididone.biz.entity.Project; +import cc.niushuai.dididone.util.GsonUtil; +import cc.niushuai.dididone.util.XLog; import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.date.DatePattern; +import cn.hutool.core.date.DateUtil; import cn.hutool.core.util.StrUtil; public class ProjectPopupView extends BottomPopupView { @@ -33,14 +41,14 @@ public class ProjectPopupView extends BottomPopupView { private List data; private EasyAdapter commonAdapter; - private Consumer callback; + private BiConsumer> callback; public ProjectPopupView(@NonNull Context context) { super(context); } - public ProjectPopupView(@NonNull Context context, Consumer callback) { + public ProjectPopupView(@NonNull Context context, BiConsumer> callback) { super(context); this.callback = callback; } @@ -58,9 +66,23 @@ public class ProjectPopupView extends BottomPopupView { // 构建data data = CollUtil.list(false, BizGlobal.getAvailableProjectMap().values()); // data.sort(Comparator.comparing(Project::getCreateDate)); - data.sort((e1, e2) -> e2.getCreateDate().compareTo(e1.getCreateDate())); +// data.sort((e1, e2) -> e2.getCreateDate().compareTo(e1.getCreateDate())); - int projectCount = data.size(); + Map countMap = new HashMap<>(); + for (Project item : data) { + Integer val = countMap.getOrDefault(item.getName(), 0); + countMap.put(item.getName(), val + 1); + } + XLog.d("构建出打卡项目: " + GsonUtil.toJson(countMap)); + + // 排序 + data.sort((e1, e2) -> { + int diff = countMap.getOrDefault(e2.getName(), 0) - countMap.getOrDefault(e1.getName(), 0); + if (diff != 0) { + return diff; + } + return e2.getCreateDate().compareTo(e1.getCreateDate()); + }); if (data.isEmpty()) { Project e = new Project(); @@ -68,10 +90,9 @@ public class ProjectPopupView extends BottomPopupView { e.setIcon(BizGlobal.EMPTY_PROJECT_TIPS_ICON); e.setIconColor(Color.RED); data.add(e); - projectCount = 0; } - ((TextView) findViewById(R.id.ppv_title)).setText(StrUtil.format("全部{}条打卡项", projectCount)); + ((TextView) findViewById(R.id.ppv_title)).setText(StrUtil.format("全部{}条打卡项", data.size())); commonAdapter = new EasyAdapter(data, R.layout.project_popup_view_item) { @Override protected void bind(@NonNull ViewHolder holder, @NonNull Project item, final int position) { @@ -90,17 +111,32 @@ public class ProjectPopupView extends BottomPopupView { TextView descView = holder.getView(R.id.ppv_item_desc); String count = BizGlobal.CACHE_PROJECT_COUNT.getOrDefault(project.getId(), 0).toString(); - descView.setText(StrUtil.format("累计打卡{}次", count)); + Integer todayCount = BizGlobal.CACHE_PROJECT_TODAY_COUNT.getOrDefault(project.getId(), 0); + descView.setText(StrUtil.format("今日打卡{}次, 累计打卡{}次", todayCount, count)); } }; commonAdapter.setOnItemClickListener(new MultiItemTypeAdapter.OnItemClickListener() { @Override public void onItemClick(@NonNull View view, @NonNull RecyclerView.ViewHolder viewHolder, int position) { + // 打卡 - 先显示时间和备注弹窗 + Project selectedProject = data.get(position); + new XPopup.Builder(getContext()) + .asCustom(new TimeNotePopupView(getContext(), (selectedTime, note) -> { + // 处理选择的时间和输入的备注(例如保存到数据库) + // 示例: saveCheckInInfo(selectedProject, selectedTime, note); + + // 执行原回调 + Map map = new HashMap<>(); + map.put("time", DateUtil.date(selectedTime).toString(DatePattern.NORM_DATETIME_FORMAT)); + map.put("note", note); + callback.accept(selectedProject, map); + dismiss(); + })) + .show(); // 打卡 - callback.accept(data.get(position)); - - dismiss(); +// callback.accept(data.get(position)); +// dismiss(); } @Override diff --git a/app/src/main/java/cc/niushuai/dididone/ui/component/TimeNotePopupView.java b/app/src/main/java/cc/niushuai/dididone/ui/component/TimeNotePopupView.java new file mode 100644 index 0000000..86755b1 --- /dev/null +++ b/app/src/main/java/cc/niushuai/dididone/ui/component/TimeNotePopupView.java @@ -0,0 +1,64 @@ +package cc.niushuai.dididone.ui.component; + +import android.content.Context; +import android.view.View; +import android.widget.Button; +import android.widget.EditText; +import android.widget.TimePicker; +import androidx.annotation.NonNull; +import com.lxj.xpopup.core.CenterPopupView; +import cc.niushuai.dididone.R; +import java.util.Calendar; + +public class TimeNotePopupView extends CenterPopupView { + private TimePicker timePicker; + private EditText etNote; + private Button btnConfirm, btnCancel; + private TimeNoteCallback callback; + + // 回调接口传递选择的时间和备注 + public interface TimeNoteCallback { + void onConfirm(long selectedTime, String note); + } + + public TimeNotePopupView(@NonNull Context context, TimeNoteCallback callback) { + super(context); + this.callback = callback; + } + + @Override + protected int getImplLayoutId() { + return R.layout.time_note_popup_view; // 需要创建对应的布局文件 + } + + @Override + protected void onCreate() { + super.onCreate(); + timePicker = findViewById(R.id.time_picker); + etNote = findViewById(R.id.et_note); + btnConfirm = findViewById(R.id.btn_confirm); + btnCancel = findViewById(R.id.btn_cancel); + + // 初始化时间选择器为当前时间 + Calendar calendar = Calendar.getInstance(); + timePicker.setHour(calendar.get(Calendar.HOUR_OF_DAY)); + timePicker.setMinute(calendar.get(Calendar.MINUTE)); + + btnConfirm.setOnClickListener(v -> { + // 获取选择的时间(转换为毫秒时间戳) + Calendar selectedCalendar = Calendar.getInstance(); + selectedCalendar.set(Calendar.HOUR_OF_DAY, timePicker.getHour()); + selectedCalendar.set(Calendar.MINUTE, timePicker.getMinute()); + long selectedTime = selectedCalendar.getTimeInMillis(); + + // 获取输入的备注 + String note = etNote.getText().toString().trim(); + + // 调用回调传递结果 + callback.onConfirm(selectedTime, note); + dismiss(); + }); + + btnCancel.setOnClickListener(v -> dismiss()); + } +} diff --git a/app/src/main/res/layout/time_note_popup_view.xml b/app/src/main/res/layout/time_note_popup_view.xml new file mode 100644 index 0000000..6b5df5d --- /dev/null +++ b/app/src/main/res/layout/time_note_popup_view.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + +