From 498d06896a33fc1ee424b68ff96a952357d624c3 Mon Sep 17 00:00:00 2001 From: niushuai233 Date: Sat, 9 Dec 2023 10:57:08 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20:fire:=20=E6=B7=BB=E5=8A=A0=E6=96=B0?= =?UTF-8?q?=E9=A1=B9=E7=9B=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../3.json | 12 +- .../4.json | 114 ++++++++++++++++ .../didicheck/biz/dao/CheckProjectDao.java | 3 + .../didicheck/biz/room/DBManager.java | 2 +- .../didicheck/biz/room/DiDiCheckDataBase.java | 2 +- .../ui/main/settings/SettingsFragment.java | 126 +++++++++++++++--- .../cc/niushuai/didicheck/util/Toasts.java | 4 +- app/src/main/res/values/strings.xml | 4 +- app/src/main/res/xml/root_preferences.xml | 42 ++++-- keystore/key.jks | Bin 2596 -> 4869 bytes 10 files changed, 266 insertions(+), 43 deletions(-) create mode 100644 app/schemas/cc.niushuai.didicheck.biz.room.DiDiCheckDataBase/4.json diff --git a/app/schemas/cc.niushuai.didicheck.biz.room.DiDiCheckDataBase/3.json b/app/schemas/cc.niushuai.didicheck.biz.room.DiDiCheckDataBase/3.json index 262fcea..3b424e7 100644 --- a/app/schemas/cc.niushuai.didicheck.biz.room.DiDiCheckDataBase/3.json +++ b/app/schemas/cc.niushuai.didicheck.biz.room.DiDiCheckDataBase/3.json @@ -2,7 +2,7 @@ "formatVersion": 1, "database": { "version": 3, - "identityHash": "f2ca61f32434b82ab65889a8d915a3c6", + "identityHash": "8a123aa9c9eab77aec672727765b01ce", "entities": [ { "tableName": "t_check_record", @@ -62,7 +62,7 @@ }, { "tableName": "t_check_project", - "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER, `name` TEXT, `create_date` INTEGER, `deleted` INTEGER, PRIMARY KEY(`id`))", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER, `name` TEXT, `icon` INTEGER, `create_date` INTEGER, `deleted` INTEGER, PRIMARY KEY(`id`))", "fields": [ { "fieldPath": "id", @@ -76,6 +76,12 @@ "affinity": "TEXT", "notNull": false }, + { + "fieldPath": "icon", + "columnName": "icon", + "affinity": "INTEGER", + "notNull": false + }, { "fieldPath": "createDate", "columnName": "create_date", @@ -102,7 +108,7 @@ "views": [], "setupQueries": [ "CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)", - "INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, 'f2ca61f32434b82ab65889a8d915a3c6')" + "INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '8a123aa9c9eab77aec672727765b01ce')" ] } } \ No newline at end of file diff --git a/app/schemas/cc.niushuai.didicheck.biz.room.DiDiCheckDataBase/4.json b/app/schemas/cc.niushuai.didicheck.biz.room.DiDiCheckDataBase/4.json new file mode 100644 index 0000000..b4a0ccc --- /dev/null +++ b/app/schemas/cc.niushuai.didicheck.biz.room.DiDiCheckDataBase/4.json @@ -0,0 +1,114 @@ +{ + "formatVersion": 1, + "database": { + "version": 4, + "identityHash": "8a123aa9c9eab77aec672727765b01ce", + "entities": [ + { + "tableName": "t_check_record", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER, `check_type` TEXT, `name` TEXT, `check_date` INTEGER, `description` TEXT, `create_date` INTEGER, `deleted` INTEGER, PRIMARY KEY(`id`))", + "fields": [ + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "checkType", + "columnName": "check_type", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "name", + "columnName": "name", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "checkDate", + "columnName": "check_date", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "description", + "columnName": "description", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "createDate", + "columnName": "create_date", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "deleted", + "columnName": "deleted", + "affinity": "INTEGER", + "notNull": false + } + ], + "primaryKey": { + "autoGenerate": false, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "t_check_project", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER, `name` TEXT, `icon` INTEGER, `create_date` INTEGER, `deleted` INTEGER, PRIMARY KEY(`id`))", + "fields": [ + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "name", + "columnName": "name", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "icon", + "columnName": "icon", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "createDate", + "columnName": "create_date", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "deleted", + "columnName": "deleted", + "affinity": "INTEGER", + "notNull": false + } + ], + "primaryKey": { + "autoGenerate": false, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + } + ], + "views": [], + "setupQueries": [ + "CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)", + "INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '8a123aa9c9eab77aec672727765b01ce')" + ] + } +} \ No newline at end of file diff --git a/app/src/main/java/cc/niushuai/didicheck/biz/dao/CheckProjectDao.java b/app/src/main/java/cc/niushuai/didicheck/biz/dao/CheckProjectDao.java index 38b1749..925bd8f 100644 --- a/app/src/main/java/cc/niushuai/didicheck/biz/dao/CheckProjectDao.java +++ b/app/src/main/java/cc/niushuai/didicheck/biz/dao/CheckProjectDao.java @@ -14,6 +14,9 @@ import io.reactivex.Flowable; @Dao public interface CheckProjectDao { + @Query("SELECT * FROM t_check_project") + Flowable> testListAll(); + @Query("SELECT * FROM t_check_project where deleted = 0 order by create_date desc") Flowable> listAll(); diff --git a/app/src/main/java/cc/niushuai/didicheck/biz/room/DBManager.java b/app/src/main/java/cc/niushuai/didicheck/biz/room/DBManager.java index ac31986..49a9b18 100644 --- a/app/src/main/java/cc/niushuai/didicheck/biz/room/DBManager.java +++ b/app/src/main/java/cc/niushuai/didicheck/biz/room/DBManager.java @@ -31,7 +31,7 @@ public class DBManager { public DiDiCheckDataBase getDiDiCheckDataBase() { if (null == diDiCheckDataBase) { - diDiCheckDataBase = (DiDiCheckDataBase) buildDatabase(context, DiDiCheckDataBase.class, "didi_check"); + diDiCheckDataBase = (DiDiCheckDataBase) buildDatabase(context, DiDiCheckDataBase.class, "didi_check.db"); } return diDiCheckDataBase; } diff --git a/app/src/main/java/cc/niushuai/didicheck/biz/room/DiDiCheckDataBase.java b/app/src/main/java/cc/niushuai/didicheck/biz/room/DiDiCheckDataBase.java index 732ea5f..236f232 100644 --- a/app/src/main/java/cc/niushuai/didicheck/biz/room/DiDiCheckDataBase.java +++ b/app/src/main/java/cc/niushuai/didicheck/biz/room/DiDiCheckDataBase.java @@ -8,7 +8,7 @@ import cc.niushuai.didicheck.biz.dao.CheckRecordDao; import cc.niushuai.didicheck.biz.entity.CheckProject; import cc.niushuai.didicheck.biz.entity.CheckRecord; -@Database(entities = {CheckRecord.class, CheckProject.class}, version = 3) +@Database(entities = {CheckRecord.class, CheckProject.class}, version = 4) public abstract class DiDiCheckDataBase extends RoomDatabase { public abstract CheckRecordDao checkRecordDao(); diff --git a/app/src/main/java/cc/niushuai/didicheck/ui/main/settings/SettingsFragment.java b/app/src/main/java/cc/niushuai/didicheck/ui/main/settings/SettingsFragment.java index 23b17d2..5654cc1 100644 --- a/app/src/main/java/cc/niushuai/didicheck/ui/main/settings/SettingsFragment.java +++ b/app/src/main/java/cc/niushuai/didicheck/ui/main/settings/SettingsFragment.java @@ -2,16 +2,28 @@ package cc.niushuai.didicheck.ui.main.settings; import android.os.Bundle; import android.util.Log; -import android.widget.EditText; import androidx.annotation.NonNull; -import androidx.preference.CheckBoxPreference; import androidx.preference.EditTextPreference; import androidx.preference.Preference; import androidx.preference.PreferenceCategory; import androidx.preference.PreferenceFragmentCompat; +import java.util.List; + import cc.niushuai.didicheck.R; +import cc.niushuai.didicheck.biz.entity.CheckProject; +import cc.niushuai.didicheck.biz.room.DBManager; +import cc.niushuai.didicheck.util.Toasts; +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.StrUtil; +import io.reactivex.Completable; +import io.reactivex.CompletableObserver; +import io.reactivex.Flowable; +import io.reactivex.android.schedulers.AndroidSchedulers; +import io.reactivex.disposables.Disposable; +import io.reactivex.functions.Consumer; +import io.reactivex.schedulers.Schedulers; public class SettingsFragment extends PreferenceFragmentCompat { @@ -20,11 +32,29 @@ public class SettingsFragment extends PreferenceFragmentCompat { setPreferencesFromResource(R.xml.root_preferences, rootKey); addNewProjectListener(); + addRemoveProjectListener(); resetCheckProjectList(); } private void resetCheckProjectList() { + // 重置选项卡 + Flowable> listFlowable = DBManager.INSTANCE.checkProjectDao().listAll(); + listFlowable.subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(checkProjects -> { + Log.d("SettingsFragment", "reset... checkProject查询到" + checkProjects.size()); + + // 移除所有内容 + removeExtraProject(); + dynamicAddCheckProjects(checkProjects); + }); + + } + + private void removeExtraProject() { + PreferenceCategory preference = findPreference(getResources().getString(R.string.check_project_category_list)); + preference.removeAll(); } private void addNewProjectListener() { @@ -32,36 +62,90 @@ public class SettingsFragment extends PreferenceFragmentCompat { addNewCheckProject.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() { @Override public boolean onPreferenceChange(@NonNull Preference preference, Object newValue) { - Log.d("onPreferenceChange", newValue.toString()); + Log.d("SettingsFragment", newValue.toString()); + + CheckProject checkProject = new CheckProject(); + checkProject.setId(System.currentTimeMillis()); + checkProject.setName(newValue.toString()); + checkProject.setDeleted(0); + checkProject.setCreateDate(System.currentTimeMillis()); + Completable completable = DBManager.INSTANCE.checkProjectDao().insertAll(checkProject); + completable.subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new CompletableObserver() { + @Override + public void onSubscribe(Disposable d) { + } + + @Override + public void onComplete() { + Log.i("SettingsFragment", "新增打卡项[" + newValue.toString() + "]成功"); + Toasts.shortShow(getActivity(), "新增打卡项[{}]成功", newValue.toString()); + } + + @Override + public void onError(Throwable e) { + Log.e("SettingsFragment", "新增打卡项[" + newValue.toString() + "]失败", e); + Toasts.shortShow(getActivity(), "新增打卡项[{}]失败, {}", newValue.toString(), e.getMessage()); + } + }); + +// addOneProject(checkProject); + return true; } }); } - private void dynamicAddCheckProjects() { + private void addRemoveProjectListener() { + // 使用ListPreference + } - PreferenceCategory projectCategoryList = findPreference("check_project_category_list"); + private void dynamicAddCheckProjects(List checkProjects) { + if (CollUtil.isEmpty(checkProjects)) { + return; + } - for (int i = 0; i < 3; i++) { + for (CheckProject project : checkProjects) { + addOneProject(project); + } - CheckBoxPreference checkBoxPreference = new CheckBoxPreference(getActivity()); - checkBoxPreference.setTitle("test cb" + i); - checkBoxPreference.setSummary("都说了是测试" + i); - checkBoxPreference.setDefaultValue(true); - checkBoxPreference.setSummary(i + ""); - checkBoxPreference.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() { - @Override - public boolean onPreferenceClick(@NonNull Preference preference) { - Log.d("checkbox", "clicked" + preference.getSummary()); + } - projectCategoryList.removePreference(preference); - return true; - } - }); + private void addOneProject(CheckProject item) { + PreferenceCategory projectCategoryList = findPreference(getResources().getString(R.string.check_project_category_list)); - projectCategoryList.addPreference(checkBoxPreference); - } + EditTextPreference preference = new EditTextPreference(getActivity()); + preference.setKey(item.getId().toString()); + preference.setTitle(item.getName()); + preference.setSummary(item.getId().toString()); + preference.setDefaultValue(item.getName()); + + preference.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() { + @Override + public boolean onPreferenceChange(@NonNull Preference preference, Object newValue) { + return true; + } + }); + preference.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() { + @Override + public boolean onPreferenceClick(@NonNull Preference preference) { + Log.d("SettingsFragment", "clicked" + preference.getSummary()); + + Flowable> listFlowable = DBManager.INSTANCE.checkProjectDao().testListAll(); + listFlowable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()) + .subscribe(new Consumer>() { + @Override + public void accept(List checkProjects) throws Exception { + Log.d("SettingsFragment", ":" + checkProjects.size()); + } + }); + + return true; + } + }); + projectCategoryList.addPreference(preference); } } \ No newline at end of file diff --git a/app/src/main/java/cc/niushuai/didicheck/util/Toasts.java b/app/src/main/java/cc/niushuai/didicheck/util/Toasts.java index 3fde067..de94a63 100644 --- a/app/src/main/java/cc/niushuai/didicheck/util/Toasts.java +++ b/app/src/main/java/cc/niushuai/didicheck/util/Toasts.java @@ -8,7 +8,7 @@ import cn.hutool.core.util.StrUtil; public class Toasts { public static void shortShow(Context context, String msg) { - shortShow(context, msg); + shortShow(context, msg, null); } public static void shortShow(Context context, String msg, String... params) { @@ -16,7 +16,7 @@ public class Toasts { } public static void longShow(Context context, String msg) { - longShow(context, msg); + longShow(context, msg, null); } public static void longShow(Context context, String msg, String... params) { diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 7f2786e..c706cc9 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -6,11 +6,13 @@ Settings 设置 - 打卡项目 + 打卡项目列表 导入数据 导出数据 添加新项目 + 删除旧项目 + check_project_category_list \ No newline at end of file diff --git a/app/src/main/res/xml/root_preferences.xml b/app/src/main/res/xml/root_preferences.xml index f26c49c..89d6874 100644 --- a/app/src/main/res/xml/root_preferences.xml +++ b/app/src/main/res/xml/root_preferences.xml @@ -3,28 +3,42 @@ - + android:selectAllOnFocus="true" + android:singleLine="true" + app:title="@string/data_import" /> - + android:selectAllOnFocus="true" + android:singleLine="true" + app:title="@string/data_export" /> + + + + + + - - + > + + + + + \ No newline at end of file diff --git a/keystore/key.jks b/keystore/key.jks index 5f50cbc016ed1142ad73028ab29313f2d11c794a..1c0f71e17ef31443e9a2d5e77b069546107fdca3 100644 GIT binary patch delta 3287 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 V5o3x3c$9jfM|{oLB-sK2ClJ6d8)g6i delta 1099 zcmV-R1ho5wCZrTSFoFso0s#Xsf(gn72`Yw2hW8Bt2LYgh3A+S>3AZqU39~SQ1-b?a zDuzgg_YDCD0ic2fs|11tr!ayAqp>}u1sntM1_>&LNQU&0}(>=1GLvN5s+Sq9%)z-U}pugT+eL{EEc5?<&{!P#NPffPw>H zRa`*NB^f0b%XGvR>I^Y z;4r+9P37@7{0r;v;2)e2te*H{b@-E1=cIl~q(ug9^Jqb>CPSxpboY~Qd3Ik zJr_3oSQ_C9ylZc-`TlZX3A}GS0pnl+14wOu;<(EzIIj%xx(-_F9aOkLkr^4aUus&c ztSK9lW`BX=*D%@A0K@OU(T!q2R6)yja)eCdJJBBoWTzLAt%_^0GZ!y1S|~zx?Qg*` zHj9t>XAc0P;s6Dd*!Haoy|vRwg18Io^T7aG=~R*fapTVD?H>nTYHXDIoI04cS@?B- z_WD|EvzM$0V14sm%1=N!la(;{&A7d%9{a21s|g?SSU2w?@!mveVLmgGZDngIj=gaP zNf()60C%K!ZZ{Ufqd1xAqBTz9x0zVEk&avo5{8|bh=6yPXhdU!L9t9OI8btO-x#&X zoXGwR*4wKtK5BG3fl-F`k+$6Y3f|0r&A@>8%0y71jG&$tcjgY3CeOxI-w;{{(nvjK zg07g(jbysp*vlUmxJAvxZn?h~(Od&oh+OZe7`gSi@J*$p*&~`v{FB(_bo=S1C3+Vc z3AtRa@*+Y4&Ve^ymb!vCy;>)x3=h^KBp*yM@MCov#f*0!*!s9XYD$BzxC|J7=W7%> z^ORgHhN|Ss&jv<(zGe7%7_DF}cQ1>F8NWcY)ImUkrn?Hd<@TfHsLBL85p>~p%tv{8o?gu zu^=H+_Hw5KeeCEqP^%+cOdTG7|J`6sh67jN4DF-rRiG;~x4toS85`H>$4s@s0$&7RU6a;qE(8DlIFflMn4F(BdhDZTr z0|WvA1povf=a3NXpqt^jUR-F(KlgxwxS~Aur{cB200iK1e9S4+1Qd#)FXIb7I#CW` RKmPyG$#%j^yv_mwClJw~0`C9-