diff --git a/app/build.gradle b/app/build.gradle index 298f687..e142ec1 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -3,6 +3,7 @@ apply plugin: 'com.android.application' apply plugin: 'kotlin-android' apply plugin: 'kotlin-android-extensions' +apply plugin: 'org.greenrobot.greendao' android { signingConfigs { @@ -57,6 +58,12 @@ outputFileName = "XZJL_" + getBuildDate() + "_Beta.apk" } } + + greendao { + schemaVersion 1//数据库版本号 + targetGenDir 'src/main/java'//设置DaoMaster、DaoSession、Dao目录 + daoPackage 'com.casic.xz.meterage.greendao'//设置DaoMaster、DaoSession、Dao包名 + } } static def getBuildDate() { @@ -67,7 +74,7 @@ dependencies { //基础依赖库 implementation 'com.github.AndroidCoderPeng:Kotlin-lite-lib:1.0.4' - implementation 'androidx.appcompat:appcompat:1.5.1' + implementation 'androidx.appcompat:appcompat:1.6.1' implementation 'androidx.core:core-ktx:1.9.0' //Google官方授权框架 implementation 'pub.devrel:easypermissions:3.0.0' @@ -113,4 +120,6 @@ implementation 'com.github.tiann:FreeReflection:3.1.0' //单项/数字、二三级联动、日期/时间等滚轮选择器 implementation 'com.github.gzu-liyujiang.AndroidPicker:WheelPicker:4.1.8' + //数据库框架 + implementation 'org.greenrobot:greendao:3.3.0' } \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index 298f687..e142ec1 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -3,6 +3,7 @@ apply plugin: 'com.android.application' apply plugin: 'kotlin-android' apply plugin: 'kotlin-android-extensions' +apply plugin: 'org.greenrobot.greendao' android { signingConfigs { @@ -57,6 +58,12 @@ outputFileName = "XZJL_" + getBuildDate() + "_Beta.apk" } } + + greendao { + schemaVersion 1//数据库版本号 + targetGenDir 'src/main/java'//设置DaoMaster、DaoSession、Dao目录 + daoPackage 'com.casic.xz.meterage.greendao'//设置DaoMaster、DaoSession、Dao包名 + } } static def getBuildDate() { @@ -67,7 +74,7 @@ dependencies { //基础依赖库 implementation 'com.github.AndroidCoderPeng:Kotlin-lite-lib:1.0.4' - implementation 'androidx.appcompat:appcompat:1.5.1' + implementation 'androidx.appcompat:appcompat:1.6.1' implementation 'androidx.core:core-ktx:1.9.0' //Google官方授权框架 implementation 'pub.devrel:easypermissions:3.0.0' @@ -113,4 +120,6 @@ implementation 'com.github.tiann:FreeReflection:3.1.0' //单项/数字、二三级联动、日期/时间等滚轮选择器 implementation 'com.github.gzu-liyujiang.AndroidPicker:WheelPicker:4.1.8' + //数据库框架 + implementation 'org.greenrobot:greendao:3.3.0' } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 972eff9..5b6f9b2 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -69,6 +69,8 @@ + + diff --git a/app/build.gradle b/app/build.gradle index 298f687..e142ec1 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -3,6 +3,7 @@ apply plugin: 'com.android.application' apply plugin: 'kotlin-android' apply plugin: 'kotlin-android-extensions' +apply plugin: 'org.greenrobot.greendao' android { signingConfigs { @@ -57,6 +58,12 @@ outputFileName = "XZJL_" + getBuildDate() + "_Beta.apk" } } + + greendao { + schemaVersion 1//数据库版本号 + targetGenDir 'src/main/java'//设置DaoMaster、DaoSession、Dao目录 + daoPackage 'com.casic.xz.meterage.greendao'//设置DaoMaster、DaoSession、Dao包名 + } } static def getBuildDate() { @@ -67,7 +74,7 @@ dependencies { //基础依赖库 implementation 'com.github.AndroidCoderPeng:Kotlin-lite-lib:1.0.4' - implementation 'androidx.appcompat:appcompat:1.5.1' + implementation 'androidx.appcompat:appcompat:1.6.1' implementation 'androidx.core:core-ktx:1.9.0' //Google官方授权框架 implementation 'pub.devrel:easypermissions:3.0.0' @@ -113,4 +120,6 @@ implementation 'com.github.tiann:FreeReflection:3.1.0' //单项/数字、二三级联动、日期/时间等滚轮选择器 implementation 'com.github.gzu-liyujiang.AndroidPicker:WheelPicker:4.1.8' + //数据库框架 + implementation 'org.greenrobot:greendao:3.3.0' } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 972eff9..5b6f9b2 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -69,6 +69,8 @@ + + diff --git a/app/src/main/java/com/casic/xz/meterage/base/BaseApplication.kt b/app/src/main/java/com/casic/xz/meterage/base/BaseApplication.kt index 14a604d..1684c23 100644 --- a/app/src/main/java/com/casic/xz/meterage/base/BaseApplication.kt +++ b/app/src/main/java/com/casic/xz/meterage/base/BaseApplication.kt @@ -2,6 +2,8 @@ import android.app.Application import android.content.Context +import com.casic.xz.meterage.greendao.DaoMaster +import com.casic.xz.meterage.greendao.DaoSession import com.pengxh.kt.lite.utils.SaveKeyValues import me.weishu.reflection.Reflection import kotlin.properties.Delegates @@ -12,12 +14,22 @@ private var application: BaseApplication by Delegates.notNull() fun get() = application + + private lateinit var daoSession: DaoSession } override fun onCreate() { super.onCreate() application = this SaveKeyValues.initSharedPreferences(this) + + val devOpenHelper = DaoMaster.DevOpenHelper(this, "Meterage.db", null) + val daoMaster = DaoMaster(devOpenHelper.writableDatabase) + daoSession = daoMaster.newSession() + } + + fun getDaoSession(): DaoSession { + return daoSession } //绕过Android 11以上反射限制 diff --git a/app/build.gradle b/app/build.gradle index 298f687..e142ec1 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -3,6 +3,7 @@ apply plugin: 'com.android.application' apply plugin: 'kotlin-android' apply plugin: 'kotlin-android-extensions' +apply plugin: 'org.greenrobot.greendao' android { signingConfigs { @@ -57,6 +58,12 @@ outputFileName = "XZJL_" + getBuildDate() + "_Beta.apk" } } + + greendao { + schemaVersion 1//数据库版本号 + targetGenDir 'src/main/java'//设置DaoMaster、DaoSession、Dao目录 + daoPackage 'com.casic.xz.meterage.greendao'//设置DaoMaster、DaoSession、Dao包名 + } } static def getBuildDate() { @@ -67,7 +74,7 @@ dependencies { //基础依赖库 implementation 'com.github.AndroidCoderPeng:Kotlin-lite-lib:1.0.4' - implementation 'androidx.appcompat:appcompat:1.5.1' + implementation 'androidx.appcompat:appcompat:1.6.1' implementation 'androidx.core:core-ktx:1.9.0' //Google官方授权框架 implementation 'pub.devrel:easypermissions:3.0.0' @@ -113,4 +120,6 @@ implementation 'com.github.tiann:FreeReflection:3.1.0' //单项/数字、二三级联动、日期/时间等滚轮选择器 implementation 'com.github.gzu-liyujiang.AndroidPicker:WheelPicker:4.1.8' + //数据库框架 + implementation 'org.greenrobot:greendao:3.3.0' } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 972eff9..5b6f9b2 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -69,6 +69,8 @@ + + diff --git a/app/src/main/java/com/casic/xz/meterage/base/BaseApplication.kt b/app/src/main/java/com/casic/xz/meterage/base/BaseApplication.kt index 14a604d..1684c23 100644 --- a/app/src/main/java/com/casic/xz/meterage/base/BaseApplication.kt +++ b/app/src/main/java/com/casic/xz/meterage/base/BaseApplication.kt @@ -2,6 +2,8 @@ import android.app.Application import android.content.Context +import com.casic.xz.meterage.greendao.DaoMaster +import com.casic.xz.meterage.greendao.DaoSession import com.pengxh.kt.lite.utils.SaveKeyValues import me.weishu.reflection.Reflection import kotlin.properties.Delegates @@ -12,12 +14,22 @@ private var application: BaseApplication by Delegates.notNull() fun get() = application + + private lateinit var daoSession: DaoSession } override fun onCreate() { super.onCreate() application = this SaveKeyValues.initSharedPreferences(this) + + val devOpenHelper = DaoMaster.DevOpenHelper(this, "Meterage.db", null) + val daoMaster = DaoMaster(devOpenHelper.writableDatabase) + daoSession = daoMaster.newSession() + } + + fun getDaoSession(): DaoSession { + return daoSession } //绕过Android 11以上反射限制 diff --git a/app/src/main/java/com/casic/xz/meterage/bean/SearchHistoryBean.java b/app/src/main/java/com/casic/xz/meterage/bean/SearchHistoryBean.java new file mode 100644 index 0000000..6a46a3a --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/bean/SearchHistoryBean.java @@ -0,0 +1,82 @@ +package com.casic.xz.meterage.bean; + +import org.greenrobot.greendao.annotation.Entity; +import org.greenrobot.greendao.annotation.Generated; +import org.greenrobot.greendao.annotation.Id; +import org.greenrobot.greendao.annotation.Unique; + +@Entity +public class SearchHistoryBean { + @Id(autoincrement = true) + private Long id;//主键自增 + + @Unique + private String uuid; + private String keywords;//查询条件-关键字 + private String searchType;//查询类型 + private String userId;//用户Id + private String searchTime;//查询的时间 + + @Generated(hash = 2130561778) + public SearchHistoryBean(Long id, String uuid, String keywords, + String searchType, String userId, String searchTime) { + this.id = id; + this.uuid = uuid; + this.keywords = keywords; + this.searchType = searchType; + this.userId = userId; + this.searchTime = searchTime; + } + + @Generated(hash = 1570282321) + public SearchHistoryBean() { + } + + public Long getId() { + return this.id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getUuid() { + return this.uuid; + } + + public void setUuid(String uuid) { + this.uuid = uuid; + } + + public String getKeywords() { + return this.keywords; + } + + public void setKeywords(String keywords) { + this.keywords = keywords; + } + + public String getSearchType() { + return this.searchType; + } + + public void setSearchType(String searchType) { + this.searchType = searchType; + } + + public String getUserId() { + return this.userId; + } + + public void setUserId(String userId) { + this.userId = userId; + } + + public String getSearchTime() { + return this.searchTime; + } + + public void setSearchTime(String searchTime) { + this.searchTime = searchTime; + } +} diff --git a/app/build.gradle b/app/build.gradle index 298f687..e142ec1 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -3,6 +3,7 @@ apply plugin: 'com.android.application' apply plugin: 'kotlin-android' apply plugin: 'kotlin-android-extensions' +apply plugin: 'org.greenrobot.greendao' android { signingConfigs { @@ -57,6 +58,12 @@ outputFileName = "XZJL_" + getBuildDate() + "_Beta.apk" } } + + greendao { + schemaVersion 1//数据库版本号 + targetGenDir 'src/main/java'//设置DaoMaster、DaoSession、Dao目录 + daoPackage 'com.casic.xz.meterage.greendao'//设置DaoMaster、DaoSession、Dao包名 + } } static def getBuildDate() { @@ -67,7 +74,7 @@ dependencies { //基础依赖库 implementation 'com.github.AndroidCoderPeng:Kotlin-lite-lib:1.0.4' - implementation 'androidx.appcompat:appcompat:1.5.1' + implementation 'androidx.appcompat:appcompat:1.6.1' implementation 'androidx.core:core-ktx:1.9.0' //Google官方授权框架 implementation 'pub.devrel:easypermissions:3.0.0' @@ -113,4 +120,6 @@ implementation 'com.github.tiann:FreeReflection:3.1.0' //单项/数字、二三级联动、日期/时间等滚轮选择器 implementation 'com.github.gzu-liyujiang.AndroidPicker:WheelPicker:4.1.8' + //数据库框架 + implementation 'org.greenrobot:greendao:3.3.0' } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 972eff9..5b6f9b2 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -69,6 +69,8 @@ + + diff --git a/app/src/main/java/com/casic/xz/meterage/base/BaseApplication.kt b/app/src/main/java/com/casic/xz/meterage/base/BaseApplication.kt index 14a604d..1684c23 100644 --- a/app/src/main/java/com/casic/xz/meterage/base/BaseApplication.kt +++ b/app/src/main/java/com/casic/xz/meterage/base/BaseApplication.kt @@ -2,6 +2,8 @@ import android.app.Application import android.content.Context +import com.casic.xz.meterage.greendao.DaoMaster +import com.casic.xz.meterage.greendao.DaoSession import com.pengxh.kt.lite.utils.SaveKeyValues import me.weishu.reflection.Reflection import kotlin.properties.Delegates @@ -12,12 +14,22 @@ private var application: BaseApplication by Delegates.notNull() fun get() = application + + private lateinit var daoSession: DaoSession } override fun onCreate() { super.onCreate() application = this SaveKeyValues.initSharedPreferences(this) + + val devOpenHelper = DaoMaster.DevOpenHelper(this, "Meterage.db", null) + val daoMaster = DaoMaster(devOpenHelper.writableDatabase) + daoSession = daoMaster.newSession() + } + + fun getDaoSession(): DaoSession { + return daoSession } //绕过Android 11以上反射限制 diff --git a/app/src/main/java/com/casic/xz/meterage/bean/SearchHistoryBean.java b/app/src/main/java/com/casic/xz/meterage/bean/SearchHistoryBean.java new file mode 100644 index 0000000..6a46a3a --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/bean/SearchHistoryBean.java @@ -0,0 +1,82 @@ +package com.casic.xz.meterage.bean; + +import org.greenrobot.greendao.annotation.Entity; +import org.greenrobot.greendao.annotation.Generated; +import org.greenrobot.greendao.annotation.Id; +import org.greenrobot.greendao.annotation.Unique; + +@Entity +public class SearchHistoryBean { + @Id(autoincrement = true) + private Long id;//主键自增 + + @Unique + private String uuid; + private String keywords;//查询条件-关键字 + private String searchType;//查询类型 + private String userId;//用户Id + private String searchTime;//查询的时间 + + @Generated(hash = 2130561778) + public SearchHistoryBean(Long id, String uuid, String keywords, + String searchType, String userId, String searchTime) { + this.id = id; + this.uuid = uuid; + this.keywords = keywords; + this.searchType = searchType; + this.userId = userId; + this.searchTime = searchTime; + } + + @Generated(hash = 1570282321) + public SearchHistoryBean() { + } + + public Long getId() { + return this.id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getUuid() { + return this.uuid; + } + + public void setUuid(String uuid) { + this.uuid = uuid; + } + + public String getKeywords() { + return this.keywords; + } + + public void setKeywords(String keywords) { + this.keywords = keywords; + } + + public String getSearchType() { + return this.searchType; + } + + public void setSearchType(String searchType) { + this.searchType = searchType; + } + + public String getUserId() { + return this.userId; + } + + public void setUserId(String userId) { + this.userId = userId; + } + + public String getSearchTime() { + return this.searchTime; + } + + public void setSearchTime(String searchTime) { + this.searchTime = searchTime; + } +} diff --git a/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt index 151f951..ae7f5e4 100644 --- a/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt +++ b/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt @@ -15,22 +15,20 @@ import com.casic.xz.meterage.extensions.showEmptyPage import com.casic.xz.meterage.model.NoticeListModel import com.casic.xz.meterage.model.RemindListModel -import com.casic.xz.meterage.model.UserInfoModel import com.casic.xz.meterage.utils.LoadingDialogHub import com.casic.xz.meterage.utils.LocaleConstant import com.casic.xz.meterage.utils.QrConfigCreator import com.casic.xz.meterage.view.home.* import com.casic.xz.meterage.view.notice.NoticeListActivity +import com.casic.xz.meterage.view.search.SearchAllActivity import com.casic.xz.meterage.vm.MeterageTrainViewModel import com.casic.xz.meterage.vm.NoticeViewModel -import com.casic.xz.meterage.vm.UserViewModel import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter import com.pengxh.kt.lite.adapter.ViewHolder import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.convertColor import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show -import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.utils.WeakReferenceHandler import com.pengxh.kt.lite.vm.LoadState import com.pengxh.kt.lite.widget.dialog.AlertControlDialog @@ -39,13 +37,12 @@ import kotlinx.android.synthetic.main.include_empty_view.* import java.util.* -class HomePageFragment : KotlinBaseFragment() { +class HomePageFragment(private val userId: String) : KotlinBaseFragment() { private val timer = object : Timer() {} private lateinit var weakReferenceHandler: WeakReferenceHandler private lateinit var meterageTrainViewModel: MeterageTrainViewModel private lateinit var noticeViewModel: NoticeViewModel - private lateinit var userData: UserInfoModel.DataModel private lateinit var remindAdapter: NormalRecyclerAdapter private var dataBeans: MutableList = ArrayList() private var noticeBeans: MutableList = ArrayList() @@ -170,14 +167,6 @@ true } - val userViewModel = ViewModelProvider(this)[UserViewModel::class.java] - userViewModel.getUserInfo(SaveKeyValues.getValue(LocaleConstant.ACCOUNT, "") as String) - userViewModel.userInfo.observe(this) { - if (it.code == 200) { - userData = it.data - } - } - meterageTrainViewModel = ViewModelProvider(this)[MeterageTrainViewModel::class.java] meterageTrainViewModel.signInResult.observe(this) { if (it.code == 200) { @@ -296,10 +285,14 @@ } override fun initEvent() { + searchBar.setOnClickListener { + requireContext().navigatePageTo() + } + scanCodeView.setOnClickListener { qrManager.startScan(requireActivity()) { result -> if (result.content.isDigitsOnly()) { - meterageTrainViewModel.signIn(userData.id, result.content) + meterageTrainViewModel.signIn(userId, result.content) } else { "签到二维码错误,请重新扫描".show(requireContext()) } diff --git a/app/build.gradle b/app/build.gradle index 298f687..e142ec1 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -3,6 +3,7 @@ apply plugin: 'com.android.application' apply plugin: 'kotlin-android' apply plugin: 'kotlin-android-extensions' +apply plugin: 'org.greenrobot.greendao' android { signingConfigs { @@ -57,6 +58,12 @@ outputFileName = "XZJL_" + getBuildDate() + "_Beta.apk" } } + + greendao { + schemaVersion 1//数据库版本号 + targetGenDir 'src/main/java'//设置DaoMaster、DaoSession、Dao目录 + daoPackage 'com.casic.xz.meterage.greendao'//设置DaoMaster、DaoSession、Dao包名 + } } static def getBuildDate() { @@ -67,7 +74,7 @@ dependencies { //基础依赖库 implementation 'com.github.AndroidCoderPeng:Kotlin-lite-lib:1.0.4' - implementation 'androidx.appcompat:appcompat:1.5.1' + implementation 'androidx.appcompat:appcompat:1.6.1' implementation 'androidx.core:core-ktx:1.9.0' //Google官方授权框架 implementation 'pub.devrel:easypermissions:3.0.0' @@ -113,4 +120,6 @@ implementation 'com.github.tiann:FreeReflection:3.1.0' //单项/数字、二三级联动、日期/时间等滚轮选择器 implementation 'com.github.gzu-liyujiang.AndroidPicker:WheelPicker:4.1.8' + //数据库框架 + implementation 'org.greenrobot:greendao:3.3.0' } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 972eff9..5b6f9b2 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -69,6 +69,8 @@ + + diff --git a/app/src/main/java/com/casic/xz/meterage/base/BaseApplication.kt b/app/src/main/java/com/casic/xz/meterage/base/BaseApplication.kt index 14a604d..1684c23 100644 --- a/app/src/main/java/com/casic/xz/meterage/base/BaseApplication.kt +++ b/app/src/main/java/com/casic/xz/meterage/base/BaseApplication.kt @@ -2,6 +2,8 @@ import android.app.Application import android.content.Context +import com.casic.xz.meterage.greendao.DaoMaster +import com.casic.xz.meterage.greendao.DaoSession import com.pengxh.kt.lite.utils.SaveKeyValues import me.weishu.reflection.Reflection import kotlin.properties.Delegates @@ -12,12 +14,22 @@ private var application: BaseApplication by Delegates.notNull() fun get() = application + + private lateinit var daoSession: DaoSession } override fun onCreate() { super.onCreate() application = this SaveKeyValues.initSharedPreferences(this) + + val devOpenHelper = DaoMaster.DevOpenHelper(this, "Meterage.db", null) + val daoMaster = DaoMaster(devOpenHelper.writableDatabase) + daoSession = daoMaster.newSession() + } + + fun getDaoSession(): DaoSession { + return daoSession } //绕过Android 11以上反射限制 diff --git a/app/src/main/java/com/casic/xz/meterage/bean/SearchHistoryBean.java b/app/src/main/java/com/casic/xz/meterage/bean/SearchHistoryBean.java new file mode 100644 index 0000000..6a46a3a --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/bean/SearchHistoryBean.java @@ -0,0 +1,82 @@ +package com.casic.xz.meterage.bean; + +import org.greenrobot.greendao.annotation.Entity; +import org.greenrobot.greendao.annotation.Generated; +import org.greenrobot.greendao.annotation.Id; +import org.greenrobot.greendao.annotation.Unique; + +@Entity +public class SearchHistoryBean { + @Id(autoincrement = true) + private Long id;//主键自增 + + @Unique + private String uuid; + private String keywords;//查询条件-关键字 + private String searchType;//查询类型 + private String userId;//用户Id + private String searchTime;//查询的时间 + + @Generated(hash = 2130561778) + public SearchHistoryBean(Long id, String uuid, String keywords, + String searchType, String userId, String searchTime) { + this.id = id; + this.uuid = uuid; + this.keywords = keywords; + this.searchType = searchType; + this.userId = userId; + this.searchTime = searchTime; + } + + @Generated(hash = 1570282321) + public SearchHistoryBean() { + } + + public Long getId() { + return this.id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getUuid() { + return this.uuid; + } + + public void setUuid(String uuid) { + this.uuid = uuid; + } + + public String getKeywords() { + return this.keywords; + } + + public void setKeywords(String keywords) { + this.keywords = keywords; + } + + public String getSearchType() { + return this.searchType; + } + + public void setSearchType(String searchType) { + this.searchType = searchType; + } + + public String getUserId() { + return this.userId; + } + + public void setUserId(String userId) { + this.userId = userId; + } + + public String getSearchTime() { + return this.searchTime; + } + + public void setSearchTime(String searchTime) { + this.searchTime = searchTime; + } +} diff --git a/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt index 151f951..ae7f5e4 100644 --- a/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt +++ b/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt @@ -15,22 +15,20 @@ import com.casic.xz.meterage.extensions.showEmptyPage import com.casic.xz.meterage.model.NoticeListModel import com.casic.xz.meterage.model.RemindListModel -import com.casic.xz.meterage.model.UserInfoModel import com.casic.xz.meterage.utils.LoadingDialogHub import com.casic.xz.meterage.utils.LocaleConstant import com.casic.xz.meterage.utils.QrConfigCreator import com.casic.xz.meterage.view.home.* import com.casic.xz.meterage.view.notice.NoticeListActivity +import com.casic.xz.meterage.view.search.SearchAllActivity import com.casic.xz.meterage.vm.MeterageTrainViewModel import com.casic.xz.meterage.vm.NoticeViewModel -import com.casic.xz.meterage.vm.UserViewModel import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter import com.pengxh.kt.lite.adapter.ViewHolder import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.convertColor import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show -import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.utils.WeakReferenceHandler import com.pengxh.kt.lite.vm.LoadState import com.pengxh.kt.lite.widget.dialog.AlertControlDialog @@ -39,13 +37,12 @@ import kotlinx.android.synthetic.main.include_empty_view.* import java.util.* -class HomePageFragment : KotlinBaseFragment() { +class HomePageFragment(private val userId: String) : KotlinBaseFragment() { private val timer = object : Timer() {} private lateinit var weakReferenceHandler: WeakReferenceHandler private lateinit var meterageTrainViewModel: MeterageTrainViewModel private lateinit var noticeViewModel: NoticeViewModel - private lateinit var userData: UserInfoModel.DataModel private lateinit var remindAdapter: NormalRecyclerAdapter private var dataBeans: MutableList = ArrayList() private var noticeBeans: MutableList = ArrayList() @@ -170,14 +167,6 @@ true } - val userViewModel = ViewModelProvider(this)[UserViewModel::class.java] - userViewModel.getUserInfo(SaveKeyValues.getValue(LocaleConstant.ACCOUNT, "") as String) - userViewModel.userInfo.observe(this) { - if (it.code == 200) { - userData = it.data - } - } - meterageTrainViewModel = ViewModelProvider(this)[MeterageTrainViewModel::class.java] meterageTrainViewModel.signInResult.observe(this) { if (it.code == 200) { @@ -296,10 +285,14 @@ } override fun initEvent() { + searchBar.setOnClickListener { + requireContext().navigatePageTo() + } + scanCodeView.setOnClickListener { qrManager.startScan(requireActivity()) { result -> if (result.content.isDigitsOnly()) { - meterageTrainViewModel.signIn(userData.id, result.content) + meterageTrainViewModel.signIn(userId, result.content) } else { "签到二维码错误,请重新扫描".show(requireContext()) } diff --git a/app/src/main/java/com/casic/xz/meterage/greendao/DaoMaster.java b/app/src/main/java/com/casic/xz/meterage/greendao/DaoMaster.java new file mode 100644 index 0000000..d714ce2 --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/greendao/DaoMaster.java @@ -0,0 +1,96 @@ +package com.casic.xz.meterage.greendao; + +import android.content.Context; +import android.database.sqlite.SQLiteDatabase; +import android.database.sqlite.SQLiteDatabase.CursorFactory; +import android.util.Log; + +import org.greenrobot.greendao.AbstractDaoMaster; +import org.greenrobot.greendao.database.Database; +import org.greenrobot.greendao.database.DatabaseOpenHelper; +import org.greenrobot.greendao.database.StandardDatabase; +import org.greenrobot.greendao.identityscope.IdentityScopeType; + + +// THIS CODE IS GENERATED BY greenDAO, DO NOT EDIT. +/** + * Master of DAO (schema version 1): knows all DAOs. + */ +public class DaoMaster extends AbstractDaoMaster { + public static final int SCHEMA_VERSION = 1; + + /** Creates underlying database table using DAOs. */ + public static void createAllTables(Database db, boolean ifNotExists) { + SearchHistoryBeanDao.createTable(db, ifNotExists); + } + + /** Drops underlying database table using DAOs. */ + public static void dropAllTables(Database db, boolean ifExists) { + SearchHistoryBeanDao.dropTable(db, ifExists); + } + + /** + * WARNING: Drops all table on Upgrade! Use only during development. + * Convenience method using a {@link DevOpenHelper}. + */ + public static DaoSession newDevSession(Context context, String name) { + Database db = new DevOpenHelper(context, name).getWritableDb(); + DaoMaster daoMaster = new DaoMaster(db); + return daoMaster.newSession(); + } + + public DaoMaster(SQLiteDatabase db) { + this(new StandardDatabase(db)); + } + + public DaoMaster(Database db) { + super(db, SCHEMA_VERSION); + registerDaoClass(SearchHistoryBeanDao.class); + } + + public DaoSession newSession() { + return new DaoSession(db, IdentityScopeType.Session, daoConfigMap); + } + + public DaoSession newSession(IdentityScopeType type) { + return new DaoSession(db, type, daoConfigMap); + } + + /** + * Calls {@link #createAllTables(Database, boolean)} in {@link #onCreate(Database)} - + */ + public static abstract class OpenHelper extends DatabaseOpenHelper { + public OpenHelper(Context context, String name) { + super(context, name, SCHEMA_VERSION); + } + + public OpenHelper(Context context, String name, CursorFactory factory) { + super(context, name, factory, SCHEMA_VERSION); + } + + @Override + public void onCreate(Database db) { + Log.i("greenDAO", "Creating tables for schema version " + SCHEMA_VERSION); + createAllTables(db, false); + } + } + + /** WARNING: Drops all table on Upgrade! Use only during development. */ + public static class DevOpenHelper extends OpenHelper { + public DevOpenHelper(Context context, String name) { + super(context, name); + } + + public DevOpenHelper(Context context, String name, CursorFactory factory) { + super(context, name, factory); + } + + @Override + public void onUpgrade(Database db, int oldVersion, int newVersion) { + Log.i("greenDAO", "Upgrading schema from version " + oldVersion + " to " + newVersion + " by dropping all tables"); + dropAllTables(db, true); + onCreate(db); + } + } + +} diff --git a/app/build.gradle b/app/build.gradle index 298f687..e142ec1 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -3,6 +3,7 @@ apply plugin: 'com.android.application' apply plugin: 'kotlin-android' apply plugin: 'kotlin-android-extensions' +apply plugin: 'org.greenrobot.greendao' android { signingConfigs { @@ -57,6 +58,12 @@ outputFileName = "XZJL_" + getBuildDate() + "_Beta.apk" } } + + greendao { + schemaVersion 1//数据库版本号 + targetGenDir 'src/main/java'//设置DaoMaster、DaoSession、Dao目录 + daoPackage 'com.casic.xz.meterage.greendao'//设置DaoMaster、DaoSession、Dao包名 + } } static def getBuildDate() { @@ -67,7 +74,7 @@ dependencies { //基础依赖库 implementation 'com.github.AndroidCoderPeng:Kotlin-lite-lib:1.0.4' - implementation 'androidx.appcompat:appcompat:1.5.1' + implementation 'androidx.appcompat:appcompat:1.6.1' implementation 'androidx.core:core-ktx:1.9.0' //Google官方授权框架 implementation 'pub.devrel:easypermissions:3.0.0' @@ -113,4 +120,6 @@ implementation 'com.github.tiann:FreeReflection:3.1.0' //单项/数字、二三级联动、日期/时间等滚轮选择器 implementation 'com.github.gzu-liyujiang.AndroidPicker:WheelPicker:4.1.8' + //数据库框架 + implementation 'org.greenrobot:greendao:3.3.0' } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 972eff9..5b6f9b2 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -69,6 +69,8 @@ + + diff --git a/app/src/main/java/com/casic/xz/meterage/base/BaseApplication.kt b/app/src/main/java/com/casic/xz/meterage/base/BaseApplication.kt index 14a604d..1684c23 100644 --- a/app/src/main/java/com/casic/xz/meterage/base/BaseApplication.kt +++ b/app/src/main/java/com/casic/xz/meterage/base/BaseApplication.kt @@ -2,6 +2,8 @@ import android.app.Application import android.content.Context +import com.casic.xz.meterage.greendao.DaoMaster +import com.casic.xz.meterage.greendao.DaoSession import com.pengxh.kt.lite.utils.SaveKeyValues import me.weishu.reflection.Reflection import kotlin.properties.Delegates @@ -12,12 +14,22 @@ private var application: BaseApplication by Delegates.notNull() fun get() = application + + private lateinit var daoSession: DaoSession } override fun onCreate() { super.onCreate() application = this SaveKeyValues.initSharedPreferences(this) + + val devOpenHelper = DaoMaster.DevOpenHelper(this, "Meterage.db", null) + val daoMaster = DaoMaster(devOpenHelper.writableDatabase) + daoSession = daoMaster.newSession() + } + + fun getDaoSession(): DaoSession { + return daoSession } //绕过Android 11以上反射限制 diff --git a/app/src/main/java/com/casic/xz/meterage/bean/SearchHistoryBean.java b/app/src/main/java/com/casic/xz/meterage/bean/SearchHistoryBean.java new file mode 100644 index 0000000..6a46a3a --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/bean/SearchHistoryBean.java @@ -0,0 +1,82 @@ +package com.casic.xz.meterage.bean; + +import org.greenrobot.greendao.annotation.Entity; +import org.greenrobot.greendao.annotation.Generated; +import org.greenrobot.greendao.annotation.Id; +import org.greenrobot.greendao.annotation.Unique; + +@Entity +public class SearchHistoryBean { + @Id(autoincrement = true) + private Long id;//主键自增 + + @Unique + private String uuid; + private String keywords;//查询条件-关键字 + private String searchType;//查询类型 + private String userId;//用户Id + private String searchTime;//查询的时间 + + @Generated(hash = 2130561778) + public SearchHistoryBean(Long id, String uuid, String keywords, + String searchType, String userId, String searchTime) { + this.id = id; + this.uuid = uuid; + this.keywords = keywords; + this.searchType = searchType; + this.userId = userId; + this.searchTime = searchTime; + } + + @Generated(hash = 1570282321) + public SearchHistoryBean() { + } + + public Long getId() { + return this.id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getUuid() { + return this.uuid; + } + + public void setUuid(String uuid) { + this.uuid = uuid; + } + + public String getKeywords() { + return this.keywords; + } + + public void setKeywords(String keywords) { + this.keywords = keywords; + } + + public String getSearchType() { + return this.searchType; + } + + public void setSearchType(String searchType) { + this.searchType = searchType; + } + + public String getUserId() { + return this.userId; + } + + public void setUserId(String userId) { + this.userId = userId; + } + + public String getSearchTime() { + return this.searchTime; + } + + public void setSearchTime(String searchTime) { + this.searchTime = searchTime; + } +} diff --git a/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt index 151f951..ae7f5e4 100644 --- a/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt +++ b/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt @@ -15,22 +15,20 @@ import com.casic.xz.meterage.extensions.showEmptyPage import com.casic.xz.meterage.model.NoticeListModel import com.casic.xz.meterage.model.RemindListModel -import com.casic.xz.meterage.model.UserInfoModel import com.casic.xz.meterage.utils.LoadingDialogHub import com.casic.xz.meterage.utils.LocaleConstant import com.casic.xz.meterage.utils.QrConfigCreator import com.casic.xz.meterage.view.home.* import com.casic.xz.meterage.view.notice.NoticeListActivity +import com.casic.xz.meterage.view.search.SearchAllActivity import com.casic.xz.meterage.vm.MeterageTrainViewModel import com.casic.xz.meterage.vm.NoticeViewModel -import com.casic.xz.meterage.vm.UserViewModel import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter import com.pengxh.kt.lite.adapter.ViewHolder import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.convertColor import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show -import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.utils.WeakReferenceHandler import com.pengxh.kt.lite.vm.LoadState import com.pengxh.kt.lite.widget.dialog.AlertControlDialog @@ -39,13 +37,12 @@ import kotlinx.android.synthetic.main.include_empty_view.* import java.util.* -class HomePageFragment : KotlinBaseFragment() { +class HomePageFragment(private val userId: String) : KotlinBaseFragment() { private val timer = object : Timer() {} private lateinit var weakReferenceHandler: WeakReferenceHandler private lateinit var meterageTrainViewModel: MeterageTrainViewModel private lateinit var noticeViewModel: NoticeViewModel - private lateinit var userData: UserInfoModel.DataModel private lateinit var remindAdapter: NormalRecyclerAdapter private var dataBeans: MutableList = ArrayList() private var noticeBeans: MutableList = ArrayList() @@ -170,14 +167,6 @@ true } - val userViewModel = ViewModelProvider(this)[UserViewModel::class.java] - userViewModel.getUserInfo(SaveKeyValues.getValue(LocaleConstant.ACCOUNT, "") as String) - userViewModel.userInfo.observe(this) { - if (it.code == 200) { - userData = it.data - } - } - meterageTrainViewModel = ViewModelProvider(this)[MeterageTrainViewModel::class.java] meterageTrainViewModel.signInResult.observe(this) { if (it.code == 200) { @@ -296,10 +285,14 @@ } override fun initEvent() { + searchBar.setOnClickListener { + requireContext().navigatePageTo() + } + scanCodeView.setOnClickListener { qrManager.startScan(requireActivity()) { result -> if (result.content.isDigitsOnly()) { - meterageTrainViewModel.signIn(userData.id, result.content) + meterageTrainViewModel.signIn(userId, result.content) } else { "签到二维码错误,请重新扫描".show(requireContext()) } diff --git a/app/src/main/java/com/casic/xz/meterage/greendao/DaoMaster.java b/app/src/main/java/com/casic/xz/meterage/greendao/DaoMaster.java new file mode 100644 index 0000000..d714ce2 --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/greendao/DaoMaster.java @@ -0,0 +1,96 @@ +package com.casic.xz.meterage.greendao; + +import android.content.Context; +import android.database.sqlite.SQLiteDatabase; +import android.database.sqlite.SQLiteDatabase.CursorFactory; +import android.util.Log; + +import org.greenrobot.greendao.AbstractDaoMaster; +import org.greenrobot.greendao.database.Database; +import org.greenrobot.greendao.database.DatabaseOpenHelper; +import org.greenrobot.greendao.database.StandardDatabase; +import org.greenrobot.greendao.identityscope.IdentityScopeType; + + +// THIS CODE IS GENERATED BY greenDAO, DO NOT EDIT. +/** + * Master of DAO (schema version 1): knows all DAOs. + */ +public class DaoMaster extends AbstractDaoMaster { + public static final int SCHEMA_VERSION = 1; + + /** Creates underlying database table using DAOs. */ + public static void createAllTables(Database db, boolean ifNotExists) { + SearchHistoryBeanDao.createTable(db, ifNotExists); + } + + /** Drops underlying database table using DAOs. */ + public static void dropAllTables(Database db, boolean ifExists) { + SearchHistoryBeanDao.dropTable(db, ifExists); + } + + /** + * WARNING: Drops all table on Upgrade! Use only during development. + * Convenience method using a {@link DevOpenHelper}. + */ + public static DaoSession newDevSession(Context context, String name) { + Database db = new DevOpenHelper(context, name).getWritableDb(); + DaoMaster daoMaster = new DaoMaster(db); + return daoMaster.newSession(); + } + + public DaoMaster(SQLiteDatabase db) { + this(new StandardDatabase(db)); + } + + public DaoMaster(Database db) { + super(db, SCHEMA_VERSION); + registerDaoClass(SearchHistoryBeanDao.class); + } + + public DaoSession newSession() { + return new DaoSession(db, IdentityScopeType.Session, daoConfigMap); + } + + public DaoSession newSession(IdentityScopeType type) { + return new DaoSession(db, type, daoConfigMap); + } + + /** + * Calls {@link #createAllTables(Database, boolean)} in {@link #onCreate(Database)} - + */ + public static abstract class OpenHelper extends DatabaseOpenHelper { + public OpenHelper(Context context, String name) { + super(context, name, SCHEMA_VERSION); + } + + public OpenHelper(Context context, String name, CursorFactory factory) { + super(context, name, factory, SCHEMA_VERSION); + } + + @Override + public void onCreate(Database db) { + Log.i("greenDAO", "Creating tables for schema version " + SCHEMA_VERSION); + createAllTables(db, false); + } + } + + /** WARNING: Drops all table on Upgrade! Use only during development. */ + public static class DevOpenHelper extends OpenHelper { + public DevOpenHelper(Context context, String name) { + super(context, name); + } + + public DevOpenHelper(Context context, String name, CursorFactory factory) { + super(context, name, factory); + } + + @Override + public void onUpgrade(Database db, int oldVersion, int newVersion) { + Log.i("greenDAO", "Upgrading schema from version " + oldVersion + " to " + newVersion + " by dropping all tables"); + dropAllTables(db, true); + onCreate(db); + } + } + +} diff --git a/app/src/main/java/com/casic/xz/meterage/greendao/DaoSession.java b/app/src/main/java/com/casic/xz/meterage/greendao/DaoSession.java new file mode 100644 index 0000000..0e80024 --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/greendao/DaoSession.java @@ -0,0 +1,46 @@ +package com.casic.xz.meterage.greendao; + +import com.casic.xz.meterage.bean.SearchHistoryBean; + +import org.greenrobot.greendao.AbstractDao; +import org.greenrobot.greendao.AbstractDaoSession; +import org.greenrobot.greendao.database.Database; +import org.greenrobot.greendao.identityscope.IdentityScopeType; +import org.greenrobot.greendao.internal.DaoConfig; + +import java.util.Map; + +// THIS CODE IS GENERATED BY greenDAO, DO NOT EDIT. + +/** + * {@inheritDoc} + * + * @see org.greenrobot.greendao.AbstractDaoSession + */ +public class DaoSession extends AbstractDaoSession { + + private final DaoConfig searchHistoryBeanDaoConfig; + + private final SearchHistoryBeanDao searchHistoryBeanDao; + + public DaoSession(Database db, IdentityScopeType type, Map>, DaoConfig> + daoConfigMap) { + super(db); + + searchHistoryBeanDaoConfig = daoConfigMap.get(SearchHistoryBeanDao.class).clone(); + searchHistoryBeanDaoConfig.initIdentityScope(type); + + searchHistoryBeanDao = new SearchHistoryBeanDao(searchHistoryBeanDaoConfig, this); + + registerDao(SearchHistoryBean.class, searchHistoryBeanDao); + } + + public void clear() { + searchHistoryBeanDaoConfig.clearIdentityScope(); + } + + public SearchHistoryBeanDao getSearchHistoryBeanDao() { + return searchHistoryBeanDao; + } + +} diff --git a/app/build.gradle b/app/build.gradle index 298f687..e142ec1 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -3,6 +3,7 @@ apply plugin: 'com.android.application' apply plugin: 'kotlin-android' apply plugin: 'kotlin-android-extensions' +apply plugin: 'org.greenrobot.greendao' android { signingConfigs { @@ -57,6 +58,12 @@ outputFileName = "XZJL_" + getBuildDate() + "_Beta.apk" } } + + greendao { + schemaVersion 1//数据库版本号 + targetGenDir 'src/main/java'//设置DaoMaster、DaoSession、Dao目录 + daoPackage 'com.casic.xz.meterage.greendao'//设置DaoMaster、DaoSession、Dao包名 + } } static def getBuildDate() { @@ -67,7 +74,7 @@ dependencies { //基础依赖库 implementation 'com.github.AndroidCoderPeng:Kotlin-lite-lib:1.0.4' - implementation 'androidx.appcompat:appcompat:1.5.1' + implementation 'androidx.appcompat:appcompat:1.6.1' implementation 'androidx.core:core-ktx:1.9.0' //Google官方授权框架 implementation 'pub.devrel:easypermissions:3.0.0' @@ -113,4 +120,6 @@ implementation 'com.github.tiann:FreeReflection:3.1.0' //单项/数字、二三级联动、日期/时间等滚轮选择器 implementation 'com.github.gzu-liyujiang.AndroidPicker:WheelPicker:4.1.8' + //数据库框架 + implementation 'org.greenrobot:greendao:3.3.0' } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 972eff9..5b6f9b2 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -69,6 +69,8 @@ + + diff --git a/app/src/main/java/com/casic/xz/meterage/base/BaseApplication.kt b/app/src/main/java/com/casic/xz/meterage/base/BaseApplication.kt index 14a604d..1684c23 100644 --- a/app/src/main/java/com/casic/xz/meterage/base/BaseApplication.kt +++ b/app/src/main/java/com/casic/xz/meterage/base/BaseApplication.kt @@ -2,6 +2,8 @@ import android.app.Application import android.content.Context +import com.casic.xz.meterage.greendao.DaoMaster +import com.casic.xz.meterage.greendao.DaoSession import com.pengxh.kt.lite.utils.SaveKeyValues import me.weishu.reflection.Reflection import kotlin.properties.Delegates @@ -12,12 +14,22 @@ private var application: BaseApplication by Delegates.notNull() fun get() = application + + private lateinit var daoSession: DaoSession } override fun onCreate() { super.onCreate() application = this SaveKeyValues.initSharedPreferences(this) + + val devOpenHelper = DaoMaster.DevOpenHelper(this, "Meterage.db", null) + val daoMaster = DaoMaster(devOpenHelper.writableDatabase) + daoSession = daoMaster.newSession() + } + + fun getDaoSession(): DaoSession { + return daoSession } //绕过Android 11以上反射限制 diff --git a/app/src/main/java/com/casic/xz/meterage/bean/SearchHistoryBean.java b/app/src/main/java/com/casic/xz/meterage/bean/SearchHistoryBean.java new file mode 100644 index 0000000..6a46a3a --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/bean/SearchHistoryBean.java @@ -0,0 +1,82 @@ +package com.casic.xz.meterage.bean; + +import org.greenrobot.greendao.annotation.Entity; +import org.greenrobot.greendao.annotation.Generated; +import org.greenrobot.greendao.annotation.Id; +import org.greenrobot.greendao.annotation.Unique; + +@Entity +public class SearchHistoryBean { + @Id(autoincrement = true) + private Long id;//主键自增 + + @Unique + private String uuid; + private String keywords;//查询条件-关键字 + private String searchType;//查询类型 + private String userId;//用户Id + private String searchTime;//查询的时间 + + @Generated(hash = 2130561778) + public SearchHistoryBean(Long id, String uuid, String keywords, + String searchType, String userId, String searchTime) { + this.id = id; + this.uuid = uuid; + this.keywords = keywords; + this.searchType = searchType; + this.userId = userId; + this.searchTime = searchTime; + } + + @Generated(hash = 1570282321) + public SearchHistoryBean() { + } + + public Long getId() { + return this.id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getUuid() { + return this.uuid; + } + + public void setUuid(String uuid) { + this.uuid = uuid; + } + + public String getKeywords() { + return this.keywords; + } + + public void setKeywords(String keywords) { + this.keywords = keywords; + } + + public String getSearchType() { + return this.searchType; + } + + public void setSearchType(String searchType) { + this.searchType = searchType; + } + + public String getUserId() { + return this.userId; + } + + public void setUserId(String userId) { + this.userId = userId; + } + + public String getSearchTime() { + return this.searchTime; + } + + public void setSearchTime(String searchTime) { + this.searchTime = searchTime; + } +} diff --git a/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt index 151f951..ae7f5e4 100644 --- a/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt +++ b/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt @@ -15,22 +15,20 @@ import com.casic.xz.meterage.extensions.showEmptyPage import com.casic.xz.meterage.model.NoticeListModel import com.casic.xz.meterage.model.RemindListModel -import com.casic.xz.meterage.model.UserInfoModel import com.casic.xz.meterage.utils.LoadingDialogHub import com.casic.xz.meterage.utils.LocaleConstant import com.casic.xz.meterage.utils.QrConfigCreator import com.casic.xz.meterage.view.home.* import com.casic.xz.meterage.view.notice.NoticeListActivity +import com.casic.xz.meterage.view.search.SearchAllActivity import com.casic.xz.meterage.vm.MeterageTrainViewModel import com.casic.xz.meterage.vm.NoticeViewModel -import com.casic.xz.meterage.vm.UserViewModel import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter import com.pengxh.kt.lite.adapter.ViewHolder import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.convertColor import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show -import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.utils.WeakReferenceHandler import com.pengxh.kt.lite.vm.LoadState import com.pengxh.kt.lite.widget.dialog.AlertControlDialog @@ -39,13 +37,12 @@ import kotlinx.android.synthetic.main.include_empty_view.* import java.util.* -class HomePageFragment : KotlinBaseFragment() { +class HomePageFragment(private val userId: String) : KotlinBaseFragment() { private val timer = object : Timer() {} private lateinit var weakReferenceHandler: WeakReferenceHandler private lateinit var meterageTrainViewModel: MeterageTrainViewModel private lateinit var noticeViewModel: NoticeViewModel - private lateinit var userData: UserInfoModel.DataModel private lateinit var remindAdapter: NormalRecyclerAdapter private var dataBeans: MutableList = ArrayList() private var noticeBeans: MutableList = ArrayList() @@ -170,14 +167,6 @@ true } - val userViewModel = ViewModelProvider(this)[UserViewModel::class.java] - userViewModel.getUserInfo(SaveKeyValues.getValue(LocaleConstant.ACCOUNT, "") as String) - userViewModel.userInfo.observe(this) { - if (it.code == 200) { - userData = it.data - } - } - meterageTrainViewModel = ViewModelProvider(this)[MeterageTrainViewModel::class.java] meterageTrainViewModel.signInResult.observe(this) { if (it.code == 200) { @@ -296,10 +285,14 @@ } override fun initEvent() { + searchBar.setOnClickListener { + requireContext().navigatePageTo() + } + scanCodeView.setOnClickListener { qrManager.startScan(requireActivity()) { result -> if (result.content.isDigitsOnly()) { - meterageTrainViewModel.signIn(userData.id, result.content) + meterageTrainViewModel.signIn(userId, result.content) } else { "签到二维码错误,请重新扫描".show(requireContext()) } diff --git a/app/src/main/java/com/casic/xz/meterage/greendao/DaoMaster.java b/app/src/main/java/com/casic/xz/meterage/greendao/DaoMaster.java new file mode 100644 index 0000000..d714ce2 --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/greendao/DaoMaster.java @@ -0,0 +1,96 @@ +package com.casic.xz.meterage.greendao; + +import android.content.Context; +import android.database.sqlite.SQLiteDatabase; +import android.database.sqlite.SQLiteDatabase.CursorFactory; +import android.util.Log; + +import org.greenrobot.greendao.AbstractDaoMaster; +import org.greenrobot.greendao.database.Database; +import org.greenrobot.greendao.database.DatabaseOpenHelper; +import org.greenrobot.greendao.database.StandardDatabase; +import org.greenrobot.greendao.identityscope.IdentityScopeType; + + +// THIS CODE IS GENERATED BY greenDAO, DO NOT EDIT. +/** + * Master of DAO (schema version 1): knows all DAOs. + */ +public class DaoMaster extends AbstractDaoMaster { + public static final int SCHEMA_VERSION = 1; + + /** Creates underlying database table using DAOs. */ + public static void createAllTables(Database db, boolean ifNotExists) { + SearchHistoryBeanDao.createTable(db, ifNotExists); + } + + /** Drops underlying database table using DAOs. */ + public static void dropAllTables(Database db, boolean ifExists) { + SearchHistoryBeanDao.dropTable(db, ifExists); + } + + /** + * WARNING: Drops all table on Upgrade! Use only during development. + * Convenience method using a {@link DevOpenHelper}. + */ + public static DaoSession newDevSession(Context context, String name) { + Database db = new DevOpenHelper(context, name).getWritableDb(); + DaoMaster daoMaster = new DaoMaster(db); + return daoMaster.newSession(); + } + + public DaoMaster(SQLiteDatabase db) { + this(new StandardDatabase(db)); + } + + public DaoMaster(Database db) { + super(db, SCHEMA_VERSION); + registerDaoClass(SearchHistoryBeanDao.class); + } + + public DaoSession newSession() { + return new DaoSession(db, IdentityScopeType.Session, daoConfigMap); + } + + public DaoSession newSession(IdentityScopeType type) { + return new DaoSession(db, type, daoConfigMap); + } + + /** + * Calls {@link #createAllTables(Database, boolean)} in {@link #onCreate(Database)} - + */ + public static abstract class OpenHelper extends DatabaseOpenHelper { + public OpenHelper(Context context, String name) { + super(context, name, SCHEMA_VERSION); + } + + public OpenHelper(Context context, String name, CursorFactory factory) { + super(context, name, factory, SCHEMA_VERSION); + } + + @Override + public void onCreate(Database db) { + Log.i("greenDAO", "Creating tables for schema version " + SCHEMA_VERSION); + createAllTables(db, false); + } + } + + /** WARNING: Drops all table on Upgrade! Use only during development. */ + public static class DevOpenHelper extends OpenHelper { + public DevOpenHelper(Context context, String name) { + super(context, name); + } + + public DevOpenHelper(Context context, String name, CursorFactory factory) { + super(context, name, factory); + } + + @Override + public void onUpgrade(Database db, int oldVersion, int newVersion) { + Log.i("greenDAO", "Upgrading schema from version " + oldVersion + " to " + newVersion + " by dropping all tables"); + dropAllTables(db, true); + onCreate(db); + } + } + +} diff --git a/app/src/main/java/com/casic/xz/meterage/greendao/DaoSession.java b/app/src/main/java/com/casic/xz/meterage/greendao/DaoSession.java new file mode 100644 index 0000000..0e80024 --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/greendao/DaoSession.java @@ -0,0 +1,46 @@ +package com.casic.xz.meterage.greendao; + +import com.casic.xz.meterage.bean.SearchHistoryBean; + +import org.greenrobot.greendao.AbstractDao; +import org.greenrobot.greendao.AbstractDaoSession; +import org.greenrobot.greendao.database.Database; +import org.greenrobot.greendao.identityscope.IdentityScopeType; +import org.greenrobot.greendao.internal.DaoConfig; + +import java.util.Map; + +// THIS CODE IS GENERATED BY greenDAO, DO NOT EDIT. + +/** + * {@inheritDoc} + * + * @see org.greenrobot.greendao.AbstractDaoSession + */ +public class DaoSession extends AbstractDaoSession { + + private final DaoConfig searchHistoryBeanDaoConfig; + + private final SearchHistoryBeanDao searchHistoryBeanDao; + + public DaoSession(Database db, IdentityScopeType type, Map>, DaoConfig> + daoConfigMap) { + super(db); + + searchHistoryBeanDaoConfig = daoConfigMap.get(SearchHistoryBeanDao.class).clone(); + searchHistoryBeanDaoConfig.initIdentityScope(type); + + searchHistoryBeanDao = new SearchHistoryBeanDao(searchHistoryBeanDaoConfig, this); + + registerDao(SearchHistoryBean.class, searchHistoryBeanDao); + } + + public void clear() { + searchHistoryBeanDaoConfig.clearIdentityScope(); + } + + public SearchHistoryBeanDao getSearchHistoryBeanDao() { + return searchHistoryBeanDao; + } + +} diff --git a/app/src/main/java/com/casic/xz/meterage/greendao/SearchHistoryBeanDao.java b/app/src/main/java/com/casic/xz/meterage/greendao/SearchHistoryBeanDao.java new file mode 100644 index 0000000..5923d02 --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/greendao/SearchHistoryBeanDao.java @@ -0,0 +1,185 @@ +package com.casic.xz.meterage.greendao; + +import android.database.Cursor; +import android.database.sqlite.SQLiteStatement; + +import com.casic.xz.meterage.bean.SearchHistoryBean; + +import org.greenrobot.greendao.AbstractDao; +import org.greenrobot.greendao.Property; +import org.greenrobot.greendao.database.Database; +import org.greenrobot.greendao.database.DatabaseStatement; +import org.greenrobot.greendao.internal.DaoConfig; + +// THIS CODE IS GENERATED BY greenDAO, DO NOT EDIT. +/** + * DAO for table "SEARCH_HISTORY_BEAN". +*/ +public class SearchHistoryBeanDao extends AbstractDao { + + public static final String TABLENAME = "SEARCH_HISTORY_BEAN"; + + /** + * Properties of entity SearchHistoryBean.
+ * Can be used for QueryBuilder and for referencing column names. + */ + public static class Properties { + public final static Property Id = new Property(0, Long.class, "id", true, "_id"); + public final static Property Uuid = new Property(1, String.class, "uuid", false, "UUID"); + public final static Property Keywords = new Property(2, String.class, "keywords", false, "KEYWORDS"); + public final static Property SearchType = new Property(3, String.class, "searchType", false, "SEARCH_TYPE"); + public final static Property UserId = new Property(4, String.class, "userId", false, "USER_ID"); + public final static Property SearchTime = new Property(5, String.class, "searchTime", false, "SEARCH_TIME"); + } + + + public SearchHistoryBeanDao(DaoConfig config) { + super(config); + } + + public SearchHistoryBeanDao(DaoConfig config, DaoSession daoSession) { + super(config, daoSession); + } + + /** Creates the underlying database table. */ + public static void createTable(Database db, boolean ifNotExists) { + String constraint = ifNotExists? "IF NOT EXISTS ": ""; + db.execSQL("CREATE TABLE " + constraint + "\"SEARCH_HISTORY_BEAN\" (" + // + "\"_id\" INTEGER PRIMARY KEY AUTOINCREMENT ," + // 0: id + "\"UUID\" TEXT UNIQUE ," + // 1: uuid + "\"KEYWORDS\" TEXT," + // 2: keywords + "\"SEARCH_TYPE\" TEXT," + // 3: searchType + "\"USER_ID\" TEXT," + // 4: userId + "\"SEARCH_TIME\" TEXT);"); // 5: searchTime + } + + /** Drops the underlying database table. */ + public static void dropTable(Database db, boolean ifExists) { + String sql = "DROP TABLE " + (ifExists ? "IF EXISTS " : "") + "\"SEARCH_HISTORY_BEAN\""; + db.execSQL(sql); + } + + @Override + protected final void bindValues(DatabaseStatement stmt, SearchHistoryBean entity) { + stmt.clearBindings(); + + Long id = entity.getId(); + if (id != null) { + stmt.bindLong(1, id); + } + + String uuid = entity.getUuid(); + if (uuid != null) { + stmt.bindString(2, uuid); + } + + String keywords = entity.getKeywords(); + if (keywords != null) { + stmt.bindString(3, keywords); + } + + String searchType = entity.getSearchType(); + if (searchType != null) { + stmt.bindString(4, searchType); + } + + String userId = entity.getUserId(); + if (userId != null) { + stmt.bindString(5, userId); + } + + String searchTime = entity.getSearchTime(); + if (searchTime != null) { + stmt.bindString(6, searchTime); + } + } + + @Override + protected final void bindValues(SQLiteStatement stmt, SearchHistoryBean entity) { + stmt.clearBindings(); + + Long id = entity.getId(); + if (id != null) { + stmt.bindLong(1, id); + } + + String uuid = entity.getUuid(); + if (uuid != null) { + stmt.bindString(2, uuid); + } + + String keywords = entity.getKeywords(); + if (keywords != null) { + stmt.bindString(3, keywords); + } + + String searchType = entity.getSearchType(); + if (searchType != null) { + stmt.bindString(4, searchType); + } + + String userId = entity.getUserId(); + if (userId != null) { + stmt.bindString(5, userId); + } + + String searchTime = entity.getSearchTime(); + if (searchTime != null) { + stmt.bindString(6, searchTime); + } + } + + @Override + public Long readKey(Cursor cursor, int offset) { + return cursor.isNull(offset + 0) ? null : cursor.getLong(offset + 0); + } + + @Override + public SearchHistoryBean readEntity(Cursor cursor, int offset) { + SearchHistoryBean entity = new SearchHistoryBean( // + cursor.isNull(offset + 0) ? null : cursor.getLong(offset + 0), // id + cursor.isNull(offset + 1) ? null : cursor.getString(offset + 1), // uuid + cursor.isNull(offset + 2) ? null : cursor.getString(offset + 2), // keywords + cursor.isNull(offset + 3) ? null : cursor.getString(offset + 3), // searchType + cursor.isNull(offset + 4) ? null : cursor.getString(offset + 4), // userId + cursor.isNull(offset + 5) ? null : cursor.getString(offset + 5) // searchTime + ); + return entity; + } + + @Override + public void readEntity(Cursor cursor, SearchHistoryBean entity, int offset) { + entity.setId(cursor.isNull(offset + 0) ? null : cursor.getLong(offset + 0)); + entity.setUuid(cursor.isNull(offset + 1) ? null : cursor.getString(offset + 1)); + entity.setKeywords(cursor.isNull(offset + 2) ? null : cursor.getString(offset + 2)); + entity.setSearchType(cursor.isNull(offset + 3) ? null : cursor.getString(offset + 3)); + entity.setUserId(cursor.isNull(offset + 4) ? null : cursor.getString(offset + 4)); + entity.setSearchTime(cursor.isNull(offset + 5) ? null : cursor.getString(offset + 5)); + } + + @Override + protected final Long updateKeyAfterInsert(SearchHistoryBean entity, long rowId) { + entity.setId(rowId); + return rowId; + } + + @Override + public Long getKey(SearchHistoryBean entity) { + if(entity != null) { + return entity.getId(); + } else { + return null; + } + } + + @Override + public boolean hasKey(SearchHistoryBean entity) { + return entity.getId() != null; + } + + @Override + protected final boolean isEntityUpdateable() { + return true; + } + +} diff --git a/app/build.gradle b/app/build.gradle index 298f687..e142ec1 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -3,6 +3,7 @@ apply plugin: 'com.android.application' apply plugin: 'kotlin-android' apply plugin: 'kotlin-android-extensions' +apply plugin: 'org.greenrobot.greendao' android { signingConfigs { @@ -57,6 +58,12 @@ outputFileName = "XZJL_" + getBuildDate() + "_Beta.apk" } } + + greendao { + schemaVersion 1//数据库版本号 + targetGenDir 'src/main/java'//设置DaoMaster、DaoSession、Dao目录 + daoPackage 'com.casic.xz.meterage.greendao'//设置DaoMaster、DaoSession、Dao包名 + } } static def getBuildDate() { @@ -67,7 +74,7 @@ dependencies { //基础依赖库 implementation 'com.github.AndroidCoderPeng:Kotlin-lite-lib:1.0.4' - implementation 'androidx.appcompat:appcompat:1.5.1' + implementation 'androidx.appcompat:appcompat:1.6.1' implementation 'androidx.core:core-ktx:1.9.0' //Google官方授权框架 implementation 'pub.devrel:easypermissions:3.0.0' @@ -113,4 +120,6 @@ implementation 'com.github.tiann:FreeReflection:3.1.0' //单项/数字、二三级联动、日期/时间等滚轮选择器 implementation 'com.github.gzu-liyujiang.AndroidPicker:WheelPicker:4.1.8' + //数据库框架 + implementation 'org.greenrobot:greendao:3.3.0' } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 972eff9..5b6f9b2 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -69,6 +69,8 @@ + + diff --git a/app/src/main/java/com/casic/xz/meterage/base/BaseApplication.kt b/app/src/main/java/com/casic/xz/meterage/base/BaseApplication.kt index 14a604d..1684c23 100644 --- a/app/src/main/java/com/casic/xz/meterage/base/BaseApplication.kt +++ b/app/src/main/java/com/casic/xz/meterage/base/BaseApplication.kt @@ -2,6 +2,8 @@ import android.app.Application import android.content.Context +import com.casic.xz.meterage.greendao.DaoMaster +import com.casic.xz.meterage.greendao.DaoSession import com.pengxh.kt.lite.utils.SaveKeyValues import me.weishu.reflection.Reflection import kotlin.properties.Delegates @@ -12,12 +14,22 @@ private var application: BaseApplication by Delegates.notNull() fun get() = application + + private lateinit var daoSession: DaoSession } override fun onCreate() { super.onCreate() application = this SaveKeyValues.initSharedPreferences(this) + + val devOpenHelper = DaoMaster.DevOpenHelper(this, "Meterage.db", null) + val daoMaster = DaoMaster(devOpenHelper.writableDatabase) + daoSession = daoMaster.newSession() + } + + fun getDaoSession(): DaoSession { + return daoSession } //绕过Android 11以上反射限制 diff --git a/app/src/main/java/com/casic/xz/meterage/bean/SearchHistoryBean.java b/app/src/main/java/com/casic/xz/meterage/bean/SearchHistoryBean.java new file mode 100644 index 0000000..6a46a3a --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/bean/SearchHistoryBean.java @@ -0,0 +1,82 @@ +package com.casic.xz.meterage.bean; + +import org.greenrobot.greendao.annotation.Entity; +import org.greenrobot.greendao.annotation.Generated; +import org.greenrobot.greendao.annotation.Id; +import org.greenrobot.greendao.annotation.Unique; + +@Entity +public class SearchHistoryBean { + @Id(autoincrement = true) + private Long id;//主键自增 + + @Unique + private String uuid; + private String keywords;//查询条件-关键字 + private String searchType;//查询类型 + private String userId;//用户Id + private String searchTime;//查询的时间 + + @Generated(hash = 2130561778) + public SearchHistoryBean(Long id, String uuid, String keywords, + String searchType, String userId, String searchTime) { + this.id = id; + this.uuid = uuid; + this.keywords = keywords; + this.searchType = searchType; + this.userId = userId; + this.searchTime = searchTime; + } + + @Generated(hash = 1570282321) + public SearchHistoryBean() { + } + + public Long getId() { + return this.id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getUuid() { + return this.uuid; + } + + public void setUuid(String uuid) { + this.uuid = uuid; + } + + public String getKeywords() { + return this.keywords; + } + + public void setKeywords(String keywords) { + this.keywords = keywords; + } + + public String getSearchType() { + return this.searchType; + } + + public void setSearchType(String searchType) { + this.searchType = searchType; + } + + public String getUserId() { + return this.userId; + } + + public void setUserId(String userId) { + this.userId = userId; + } + + public String getSearchTime() { + return this.searchTime; + } + + public void setSearchTime(String searchTime) { + this.searchTime = searchTime; + } +} diff --git a/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt index 151f951..ae7f5e4 100644 --- a/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt +++ b/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt @@ -15,22 +15,20 @@ import com.casic.xz.meterage.extensions.showEmptyPage import com.casic.xz.meterage.model.NoticeListModel import com.casic.xz.meterage.model.RemindListModel -import com.casic.xz.meterage.model.UserInfoModel import com.casic.xz.meterage.utils.LoadingDialogHub import com.casic.xz.meterage.utils.LocaleConstant import com.casic.xz.meterage.utils.QrConfigCreator import com.casic.xz.meterage.view.home.* import com.casic.xz.meterage.view.notice.NoticeListActivity +import com.casic.xz.meterage.view.search.SearchAllActivity import com.casic.xz.meterage.vm.MeterageTrainViewModel import com.casic.xz.meterage.vm.NoticeViewModel -import com.casic.xz.meterage.vm.UserViewModel import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter import com.pengxh.kt.lite.adapter.ViewHolder import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.convertColor import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show -import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.utils.WeakReferenceHandler import com.pengxh.kt.lite.vm.LoadState import com.pengxh.kt.lite.widget.dialog.AlertControlDialog @@ -39,13 +37,12 @@ import kotlinx.android.synthetic.main.include_empty_view.* import java.util.* -class HomePageFragment : KotlinBaseFragment() { +class HomePageFragment(private val userId: String) : KotlinBaseFragment() { private val timer = object : Timer() {} private lateinit var weakReferenceHandler: WeakReferenceHandler private lateinit var meterageTrainViewModel: MeterageTrainViewModel private lateinit var noticeViewModel: NoticeViewModel - private lateinit var userData: UserInfoModel.DataModel private lateinit var remindAdapter: NormalRecyclerAdapter private var dataBeans: MutableList = ArrayList() private var noticeBeans: MutableList = ArrayList() @@ -170,14 +167,6 @@ true } - val userViewModel = ViewModelProvider(this)[UserViewModel::class.java] - userViewModel.getUserInfo(SaveKeyValues.getValue(LocaleConstant.ACCOUNT, "") as String) - userViewModel.userInfo.observe(this) { - if (it.code == 200) { - userData = it.data - } - } - meterageTrainViewModel = ViewModelProvider(this)[MeterageTrainViewModel::class.java] meterageTrainViewModel.signInResult.observe(this) { if (it.code == 200) { @@ -296,10 +285,14 @@ } override fun initEvent() { + searchBar.setOnClickListener { + requireContext().navigatePageTo() + } + scanCodeView.setOnClickListener { qrManager.startScan(requireActivity()) { result -> if (result.content.isDigitsOnly()) { - meterageTrainViewModel.signIn(userData.id, result.content) + meterageTrainViewModel.signIn(userId, result.content) } else { "签到二维码错误,请重新扫描".show(requireContext()) } diff --git a/app/src/main/java/com/casic/xz/meterage/greendao/DaoMaster.java b/app/src/main/java/com/casic/xz/meterage/greendao/DaoMaster.java new file mode 100644 index 0000000..d714ce2 --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/greendao/DaoMaster.java @@ -0,0 +1,96 @@ +package com.casic.xz.meterage.greendao; + +import android.content.Context; +import android.database.sqlite.SQLiteDatabase; +import android.database.sqlite.SQLiteDatabase.CursorFactory; +import android.util.Log; + +import org.greenrobot.greendao.AbstractDaoMaster; +import org.greenrobot.greendao.database.Database; +import org.greenrobot.greendao.database.DatabaseOpenHelper; +import org.greenrobot.greendao.database.StandardDatabase; +import org.greenrobot.greendao.identityscope.IdentityScopeType; + + +// THIS CODE IS GENERATED BY greenDAO, DO NOT EDIT. +/** + * Master of DAO (schema version 1): knows all DAOs. + */ +public class DaoMaster extends AbstractDaoMaster { + public static final int SCHEMA_VERSION = 1; + + /** Creates underlying database table using DAOs. */ + public static void createAllTables(Database db, boolean ifNotExists) { + SearchHistoryBeanDao.createTable(db, ifNotExists); + } + + /** Drops underlying database table using DAOs. */ + public static void dropAllTables(Database db, boolean ifExists) { + SearchHistoryBeanDao.dropTable(db, ifExists); + } + + /** + * WARNING: Drops all table on Upgrade! Use only during development. + * Convenience method using a {@link DevOpenHelper}. + */ + public static DaoSession newDevSession(Context context, String name) { + Database db = new DevOpenHelper(context, name).getWritableDb(); + DaoMaster daoMaster = new DaoMaster(db); + return daoMaster.newSession(); + } + + public DaoMaster(SQLiteDatabase db) { + this(new StandardDatabase(db)); + } + + public DaoMaster(Database db) { + super(db, SCHEMA_VERSION); + registerDaoClass(SearchHistoryBeanDao.class); + } + + public DaoSession newSession() { + return new DaoSession(db, IdentityScopeType.Session, daoConfigMap); + } + + public DaoSession newSession(IdentityScopeType type) { + return new DaoSession(db, type, daoConfigMap); + } + + /** + * Calls {@link #createAllTables(Database, boolean)} in {@link #onCreate(Database)} - + */ + public static abstract class OpenHelper extends DatabaseOpenHelper { + public OpenHelper(Context context, String name) { + super(context, name, SCHEMA_VERSION); + } + + public OpenHelper(Context context, String name, CursorFactory factory) { + super(context, name, factory, SCHEMA_VERSION); + } + + @Override + public void onCreate(Database db) { + Log.i("greenDAO", "Creating tables for schema version " + SCHEMA_VERSION); + createAllTables(db, false); + } + } + + /** WARNING: Drops all table on Upgrade! Use only during development. */ + public static class DevOpenHelper extends OpenHelper { + public DevOpenHelper(Context context, String name) { + super(context, name); + } + + public DevOpenHelper(Context context, String name, CursorFactory factory) { + super(context, name, factory); + } + + @Override + public void onUpgrade(Database db, int oldVersion, int newVersion) { + Log.i("greenDAO", "Upgrading schema from version " + oldVersion + " to " + newVersion + " by dropping all tables"); + dropAllTables(db, true); + onCreate(db); + } + } + +} diff --git a/app/src/main/java/com/casic/xz/meterage/greendao/DaoSession.java b/app/src/main/java/com/casic/xz/meterage/greendao/DaoSession.java new file mode 100644 index 0000000..0e80024 --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/greendao/DaoSession.java @@ -0,0 +1,46 @@ +package com.casic.xz.meterage.greendao; + +import com.casic.xz.meterage.bean.SearchHistoryBean; + +import org.greenrobot.greendao.AbstractDao; +import org.greenrobot.greendao.AbstractDaoSession; +import org.greenrobot.greendao.database.Database; +import org.greenrobot.greendao.identityscope.IdentityScopeType; +import org.greenrobot.greendao.internal.DaoConfig; + +import java.util.Map; + +// THIS CODE IS GENERATED BY greenDAO, DO NOT EDIT. + +/** + * {@inheritDoc} + * + * @see org.greenrobot.greendao.AbstractDaoSession + */ +public class DaoSession extends AbstractDaoSession { + + private final DaoConfig searchHistoryBeanDaoConfig; + + private final SearchHistoryBeanDao searchHistoryBeanDao; + + public DaoSession(Database db, IdentityScopeType type, Map>, DaoConfig> + daoConfigMap) { + super(db); + + searchHistoryBeanDaoConfig = daoConfigMap.get(SearchHistoryBeanDao.class).clone(); + searchHistoryBeanDaoConfig.initIdentityScope(type); + + searchHistoryBeanDao = new SearchHistoryBeanDao(searchHistoryBeanDaoConfig, this); + + registerDao(SearchHistoryBean.class, searchHistoryBeanDao); + } + + public void clear() { + searchHistoryBeanDaoConfig.clearIdentityScope(); + } + + public SearchHistoryBeanDao getSearchHistoryBeanDao() { + return searchHistoryBeanDao; + } + +} diff --git a/app/src/main/java/com/casic/xz/meterage/greendao/SearchHistoryBeanDao.java b/app/src/main/java/com/casic/xz/meterage/greendao/SearchHistoryBeanDao.java new file mode 100644 index 0000000..5923d02 --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/greendao/SearchHistoryBeanDao.java @@ -0,0 +1,185 @@ +package com.casic.xz.meterage.greendao; + +import android.database.Cursor; +import android.database.sqlite.SQLiteStatement; + +import com.casic.xz.meterage.bean.SearchHistoryBean; + +import org.greenrobot.greendao.AbstractDao; +import org.greenrobot.greendao.Property; +import org.greenrobot.greendao.database.Database; +import org.greenrobot.greendao.database.DatabaseStatement; +import org.greenrobot.greendao.internal.DaoConfig; + +// THIS CODE IS GENERATED BY greenDAO, DO NOT EDIT. +/** + * DAO for table "SEARCH_HISTORY_BEAN". +*/ +public class SearchHistoryBeanDao extends AbstractDao { + + public static final String TABLENAME = "SEARCH_HISTORY_BEAN"; + + /** + * Properties of entity SearchHistoryBean.
+ * Can be used for QueryBuilder and for referencing column names. + */ + public static class Properties { + public final static Property Id = new Property(0, Long.class, "id", true, "_id"); + public final static Property Uuid = new Property(1, String.class, "uuid", false, "UUID"); + public final static Property Keywords = new Property(2, String.class, "keywords", false, "KEYWORDS"); + public final static Property SearchType = new Property(3, String.class, "searchType", false, "SEARCH_TYPE"); + public final static Property UserId = new Property(4, String.class, "userId", false, "USER_ID"); + public final static Property SearchTime = new Property(5, String.class, "searchTime", false, "SEARCH_TIME"); + } + + + public SearchHistoryBeanDao(DaoConfig config) { + super(config); + } + + public SearchHistoryBeanDao(DaoConfig config, DaoSession daoSession) { + super(config, daoSession); + } + + /** Creates the underlying database table. */ + public static void createTable(Database db, boolean ifNotExists) { + String constraint = ifNotExists? "IF NOT EXISTS ": ""; + db.execSQL("CREATE TABLE " + constraint + "\"SEARCH_HISTORY_BEAN\" (" + // + "\"_id\" INTEGER PRIMARY KEY AUTOINCREMENT ," + // 0: id + "\"UUID\" TEXT UNIQUE ," + // 1: uuid + "\"KEYWORDS\" TEXT," + // 2: keywords + "\"SEARCH_TYPE\" TEXT," + // 3: searchType + "\"USER_ID\" TEXT," + // 4: userId + "\"SEARCH_TIME\" TEXT);"); // 5: searchTime + } + + /** Drops the underlying database table. */ + public static void dropTable(Database db, boolean ifExists) { + String sql = "DROP TABLE " + (ifExists ? "IF EXISTS " : "") + "\"SEARCH_HISTORY_BEAN\""; + db.execSQL(sql); + } + + @Override + protected final void bindValues(DatabaseStatement stmt, SearchHistoryBean entity) { + stmt.clearBindings(); + + Long id = entity.getId(); + if (id != null) { + stmt.bindLong(1, id); + } + + String uuid = entity.getUuid(); + if (uuid != null) { + stmt.bindString(2, uuid); + } + + String keywords = entity.getKeywords(); + if (keywords != null) { + stmt.bindString(3, keywords); + } + + String searchType = entity.getSearchType(); + if (searchType != null) { + stmt.bindString(4, searchType); + } + + String userId = entity.getUserId(); + if (userId != null) { + stmt.bindString(5, userId); + } + + String searchTime = entity.getSearchTime(); + if (searchTime != null) { + stmt.bindString(6, searchTime); + } + } + + @Override + protected final void bindValues(SQLiteStatement stmt, SearchHistoryBean entity) { + stmt.clearBindings(); + + Long id = entity.getId(); + if (id != null) { + stmt.bindLong(1, id); + } + + String uuid = entity.getUuid(); + if (uuid != null) { + stmt.bindString(2, uuid); + } + + String keywords = entity.getKeywords(); + if (keywords != null) { + stmt.bindString(3, keywords); + } + + String searchType = entity.getSearchType(); + if (searchType != null) { + stmt.bindString(4, searchType); + } + + String userId = entity.getUserId(); + if (userId != null) { + stmt.bindString(5, userId); + } + + String searchTime = entity.getSearchTime(); + if (searchTime != null) { + stmt.bindString(6, searchTime); + } + } + + @Override + public Long readKey(Cursor cursor, int offset) { + return cursor.isNull(offset + 0) ? null : cursor.getLong(offset + 0); + } + + @Override + public SearchHistoryBean readEntity(Cursor cursor, int offset) { + SearchHistoryBean entity = new SearchHistoryBean( // + cursor.isNull(offset + 0) ? null : cursor.getLong(offset + 0), // id + cursor.isNull(offset + 1) ? null : cursor.getString(offset + 1), // uuid + cursor.isNull(offset + 2) ? null : cursor.getString(offset + 2), // keywords + cursor.isNull(offset + 3) ? null : cursor.getString(offset + 3), // searchType + cursor.isNull(offset + 4) ? null : cursor.getString(offset + 4), // userId + cursor.isNull(offset + 5) ? null : cursor.getString(offset + 5) // searchTime + ); + return entity; + } + + @Override + public void readEntity(Cursor cursor, SearchHistoryBean entity, int offset) { + entity.setId(cursor.isNull(offset + 0) ? null : cursor.getLong(offset + 0)); + entity.setUuid(cursor.isNull(offset + 1) ? null : cursor.getString(offset + 1)); + entity.setKeywords(cursor.isNull(offset + 2) ? null : cursor.getString(offset + 2)); + entity.setSearchType(cursor.isNull(offset + 3) ? null : cursor.getString(offset + 3)); + entity.setUserId(cursor.isNull(offset + 4) ? null : cursor.getString(offset + 4)); + entity.setSearchTime(cursor.isNull(offset + 5) ? null : cursor.getString(offset + 5)); + } + + @Override + protected final Long updateKeyAfterInsert(SearchHistoryBean entity, long rowId) { + entity.setId(rowId); + return rowId; + } + + @Override + public Long getKey(SearchHistoryBean entity) { + if(entity != null) { + return entity.getId(); + } else { + return null; + } + } + + @Override + public boolean hasKey(SearchHistoryBean entity) { + return entity.getId() != null; + } + + @Override + protected final boolean isEntityUpdateable() { + return true; + } + +} diff --git a/app/src/main/java/com/casic/xz/meterage/utils/DataBaseManager.kt b/app/src/main/java/com/casic/xz/meterage/utils/DataBaseManager.kt new file mode 100644 index 0000000..52fe032 --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/utils/DataBaseManager.kt @@ -0,0 +1,45 @@ +package com.casic.xz.meterage.utils + +import com.casic.xz.meterage.base.BaseApplication +import com.casic.xz.meterage.bean.SearchHistoryBean +import com.casic.xz.meterage.greendao.SearchHistoryBeanDao +import com.pengxh.kt.lite.extensions.timestampToCompleteDate +import com.pengxh.kt.lite.utils.SaveKeyValues +import java.util.* + +class DataBaseManager private constructor() { + + companion object { + //Kotlin委托模式双重锁单例 + val get: DataBaseManager by lazy(mode = LazyThreadSafetyMode.SYNCHRONIZED) { + DataBaseManager() + } + } + + private val searchBeanDao by lazy { BaseApplication.get().getDaoSession().searchHistoryBeanDao } + private val userId by lazy { SaveKeyValues.getValue(LocaleConstant.USER_ID, "") } + + fun addSearchHistory(keywords: String, searchType: String) { + val bean = SearchHistoryBean() + bean.uuid = UUID.randomUUID().toString() + bean.keywords = keywords + bean.searchType = searchType + bean.userId = userId.toString() + bean.searchTime = System.currentTimeMillis().timestampToCompleteDate() + searchBeanDao.insert(bean) + } + + fun queryHistoryByType(searchType: String): MutableList { + return searchBeanDao.queryBuilder().where( + SearchHistoryBeanDao.Properties.UserId.eq(userId), + SearchHistoryBeanDao.Properties.SearchType.eq(searchType) + ).list() + } + + fun deleteHistoryByType(searchType: String) { + val list = queryHistoryByType(searchType) + list.forEach { + searchBeanDao.delete(it) + } + } +} \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index 298f687..e142ec1 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -3,6 +3,7 @@ apply plugin: 'com.android.application' apply plugin: 'kotlin-android' apply plugin: 'kotlin-android-extensions' +apply plugin: 'org.greenrobot.greendao' android { signingConfigs { @@ -57,6 +58,12 @@ outputFileName = "XZJL_" + getBuildDate() + "_Beta.apk" } } + + greendao { + schemaVersion 1//数据库版本号 + targetGenDir 'src/main/java'//设置DaoMaster、DaoSession、Dao目录 + daoPackage 'com.casic.xz.meterage.greendao'//设置DaoMaster、DaoSession、Dao包名 + } } static def getBuildDate() { @@ -67,7 +74,7 @@ dependencies { //基础依赖库 implementation 'com.github.AndroidCoderPeng:Kotlin-lite-lib:1.0.4' - implementation 'androidx.appcompat:appcompat:1.5.1' + implementation 'androidx.appcompat:appcompat:1.6.1' implementation 'androidx.core:core-ktx:1.9.0' //Google官方授权框架 implementation 'pub.devrel:easypermissions:3.0.0' @@ -113,4 +120,6 @@ implementation 'com.github.tiann:FreeReflection:3.1.0' //单项/数字、二三级联动、日期/时间等滚轮选择器 implementation 'com.github.gzu-liyujiang.AndroidPicker:WheelPicker:4.1.8' + //数据库框架 + implementation 'org.greenrobot:greendao:3.3.0' } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 972eff9..5b6f9b2 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -69,6 +69,8 @@ + + diff --git a/app/src/main/java/com/casic/xz/meterage/base/BaseApplication.kt b/app/src/main/java/com/casic/xz/meterage/base/BaseApplication.kt index 14a604d..1684c23 100644 --- a/app/src/main/java/com/casic/xz/meterage/base/BaseApplication.kt +++ b/app/src/main/java/com/casic/xz/meterage/base/BaseApplication.kt @@ -2,6 +2,8 @@ import android.app.Application import android.content.Context +import com.casic.xz.meterage.greendao.DaoMaster +import com.casic.xz.meterage.greendao.DaoSession import com.pengxh.kt.lite.utils.SaveKeyValues import me.weishu.reflection.Reflection import kotlin.properties.Delegates @@ -12,12 +14,22 @@ private var application: BaseApplication by Delegates.notNull() fun get() = application + + private lateinit var daoSession: DaoSession } override fun onCreate() { super.onCreate() application = this SaveKeyValues.initSharedPreferences(this) + + val devOpenHelper = DaoMaster.DevOpenHelper(this, "Meterage.db", null) + val daoMaster = DaoMaster(devOpenHelper.writableDatabase) + daoSession = daoMaster.newSession() + } + + fun getDaoSession(): DaoSession { + return daoSession } //绕过Android 11以上反射限制 diff --git a/app/src/main/java/com/casic/xz/meterage/bean/SearchHistoryBean.java b/app/src/main/java/com/casic/xz/meterage/bean/SearchHistoryBean.java new file mode 100644 index 0000000..6a46a3a --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/bean/SearchHistoryBean.java @@ -0,0 +1,82 @@ +package com.casic.xz.meterage.bean; + +import org.greenrobot.greendao.annotation.Entity; +import org.greenrobot.greendao.annotation.Generated; +import org.greenrobot.greendao.annotation.Id; +import org.greenrobot.greendao.annotation.Unique; + +@Entity +public class SearchHistoryBean { + @Id(autoincrement = true) + private Long id;//主键自增 + + @Unique + private String uuid; + private String keywords;//查询条件-关键字 + private String searchType;//查询类型 + private String userId;//用户Id + private String searchTime;//查询的时间 + + @Generated(hash = 2130561778) + public SearchHistoryBean(Long id, String uuid, String keywords, + String searchType, String userId, String searchTime) { + this.id = id; + this.uuid = uuid; + this.keywords = keywords; + this.searchType = searchType; + this.userId = userId; + this.searchTime = searchTime; + } + + @Generated(hash = 1570282321) + public SearchHistoryBean() { + } + + public Long getId() { + return this.id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getUuid() { + return this.uuid; + } + + public void setUuid(String uuid) { + this.uuid = uuid; + } + + public String getKeywords() { + return this.keywords; + } + + public void setKeywords(String keywords) { + this.keywords = keywords; + } + + public String getSearchType() { + return this.searchType; + } + + public void setSearchType(String searchType) { + this.searchType = searchType; + } + + public String getUserId() { + return this.userId; + } + + public void setUserId(String userId) { + this.userId = userId; + } + + public String getSearchTime() { + return this.searchTime; + } + + public void setSearchTime(String searchTime) { + this.searchTime = searchTime; + } +} diff --git a/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt index 151f951..ae7f5e4 100644 --- a/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt +++ b/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt @@ -15,22 +15,20 @@ import com.casic.xz.meterage.extensions.showEmptyPage import com.casic.xz.meterage.model.NoticeListModel import com.casic.xz.meterage.model.RemindListModel -import com.casic.xz.meterage.model.UserInfoModel import com.casic.xz.meterage.utils.LoadingDialogHub import com.casic.xz.meterage.utils.LocaleConstant import com.casic.xz.meterage.utils.QrConfigCreator import com.casic.xz.meterage.view.home.* import com.casic.xz.meterage.view.notice.NoticeListActivity +import com.casic.xz.meterage.view.search.SearchAllActivity import com.casic.xz.meterage.vm.MeterageTrainViewModel import com.casic.xz.meterage.vm.NoticeViewModel -import com.casic.xz.meterage.vm.UserViewModel import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter import com.pengxh.kt.lite.adapter.ViewHolder import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.convertColor import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show -import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.utils.WeakReferenceHandler import com.pengxh.kt.lite.vm.LoadState import com.pengxh.kt.lite.widget.dialog.AlertControlDialog @@ -39,13 +37,12 @@ import kotlinx.android.synthetic.main.include_empty_view.* import java.util.* -class HomePageFragment : KotlinBaseFragment() { +class HomePageFragment(private val userId: String) : KotlinBaseFragment() { private val timer = object : Timer() {} private lateinit var weakReferenceHandler: WeakReferenceHandler private lateinit var meterageTrainViewModel: MeterageTrainViewModel private lateinit var noticeViewModel: NoticeViewModel - private lateinit var userData: UserInfoModel.DataModel private lateinit var remindAdapter: NormalRecyclerAdapter private var dataBeans: MutableList = ArrayList() private var noticeBeans: MutableList = ArrayList() @@ -170,14 +167,6 @@ true } - val userViewModel = ViewModelProvider(this)[UserViewModel::class.java] - userViewModel.getUserInfo(SaveKeyValues.getValue(LocaleConstant.ACCOUNT, "") as String) - userViewModel.userInfo.observe(this) { - if (it.code == 200) { - userData = it.data - } - } - meterageTrainViewModel = ViewModelProvider(this)[MeterageTrainViewModel::class.java] meterageTrainViewModel.signInResult.observe(this) { if (it.code == 200) { @@ -296,10 +285,14 @@ } override fun initEvent() { + searchBar.setOnClickListener { + requireContext().navigatePageTo() + } + scanCodeView.setOnClickListener { qrManager.startScan(requireActivity()) { result -> if (result.content.isDigitsOnly()) { - meterageTrainViewModel.signIn(userData.id, result.content) + meterageTrainViewModel.signIn(userId, result.content) } else { "签到二维码错误,请重新扫描".show(requireContext()) } diff --git a/app/src/main/java/com/casic/xz/meterage/greendao/DaoMaster.java b/app/src/main/java/com/casic/xz/meterage/greendao/DaoMaster.java new file mode 100644 index 0000000..d714ce2 --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/greendao/DaoMaster.java @@ -0,0 +1,96 @@ +package com.casic.xz.meterage.greendao; + +import android.content.Context; +import android.database.sqlite.SQLiteDatabase; +import android.database.sqlite.SQLiteDatabase.CursorFactory; +import android.util.Log; + +import org.greenrobot.greendao.AbstractDaoMaster; +import org.greenrobot.greendao.database.Database; +import org.greenrobot.greendao.database.DatabaseOpenHelper; +import org.greenrobot.greendao.database.StandardDatabase; +import org.greenrobot.greendao.identityscope.IdentityScopeType; + + +// THIS CODE IS GENERATED BY greenDAO, DO NOT EDIT. +/** + * Master of DAO (schema version 1): knows all DAOs. + */ +public class DaoMaster extends AbstractDaoMaster { + public static final int SCHEMA_VERSION = 1; + + /** Creates underlying database table using DAOs. */ + public static void createAllTables(Database db, boolean ifNotExists) { + SearchHistoryBeanDao.createTable(db, ifNotExists); + } + + /** Drops underlying database table using DAOs. */ + public static void dropAllTables(Database db, boolean ifExists) { + SearchHistoryBeanDao.dropTable(db, ifExists); + } + + /** + * WARNING: Drops all table on Upgrade! Use only during development. + * Convenience method using a {@link DevOpenHelper}. + */ + public static DaoSession newDevSession(Context context, String name) { + Database db = new DevOpenHelper(context, name).getWritableDb(); + DaoMaster daoMaster = new DaoMaster(db); + return daoMaster.newSession(); + } + + public DaoMaster(SQLiteDatabase db) { + this(new StandardDatabase(db)); + } + + public DaoMaster(Database db) { + super(db, SCHEMA_VERSION); + registerDaoClass(SearchHistoryBeanDao.class); + } + + public DaoSession newSession() { + return new DaoSession(db, IdentityScopeType.Session, daoConfigMap); + } + + public DaoSession newSession(IdentityScopeType type) { + return new DaoSession(db, type, daoConfigMap); + } + + /** + * Calls {@link #createAllTables(Database, boolean)} in {@link #onCreate(Database)} - + */ + public static abstract class OpenHelper extends DatabaseOpenHelper { + public OpenHelper(Context context, String name) { + super(context, name, SCHEMA_VERSION); + } + + public OpenHelper(Context context, String name, CursorFactory factory) { + super(context, name, factory, SCHEMA_VERSION); + } + + @Override + public void onCreate(Database db) { + Log.i("greenDAO", "Creating tables for schema version " + SCHEMA_VERSION); + createAllTables(db, false); + } + } + + /** WARNING: Drops all table on Upgrade! Use only during development. */ + public static class DevOpenHelper extends OpenHelper { + public DevOpenHelper(Context context, String name) { + super(context, name); + } + + public DevOpenHelper(Context context, String name, CursorFactory factory) { + super(context, name, factory); + } + + @Override + public void onUpgrade(Database db, int oldVersion, int newVersion) { + Log.i("greenDAO", "Upgrading schema from version " + oldVersion + " to " + newVersion + " by dropping all tables"); + dropAllTables(db, true); + onCreate(db); + } + } + +} diff --git a/app/src/main/java/com/casic/xz/meterage/greendao/DaoSession.java b/app/src/main/java/com/casic/xz/meterage/greendao/DaoSession.java new file mode 100644 index 0000000..0e80024 --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/greendao/DaoSession.java @@ -0,0 +1,46 @@ +package com.casic.xz.meterage.greendao; + +import com.casic.xz.meterage.bean.SearchHistoryBean; + +import org.greenrobot.greendao.AbstractDao; +import org.greenrobot.greendao.AbstractDaoSession; +import org.greenrobot.greendao.database.Database; +import org.greenrobot.greendao.identityscope.IdentityScopeType; +import org.greenrobot.greendao.internal.DaoConfig; + +import java.util.Map; + +// THIS CODE IS GENERATED BY greenDAO, DO NOT EDIT. + +/** + * {@inheritDoc} + * + * @see org.greenrobot.greendao.AbstractDaoSession + */ +public class DaoSession extends AbstractDaoSession { + + private final DaoConfig searchHistoryBeanDaoConfig; + + private final SearchHistoryBeanDao searchHistoryBeanDao; + + public DaoSession(Database db, IdentityScopeType type, Map>, DaoConfig> + daoConfigMap) { + super(db); + + searchHistoryBeanDaoConfig = daoConfigMap.get(SearchHistoryBeanDao.class).clone(); + searchHistoryBeanDaoConfig.initIdentityScope(type); + + searchHistoryBeanDao = new SearchHistoryBeanDao(searchHistoryBeanDaoConfig, this); + + registerDao(SearchHistoryBean.class, searchHistoryBeanDao); + } + + public void clear() { + searchHistoryBeanDaoConfig.clearIdentityScope(); + } + + public SearchHistoryBeanDao getSearchHistoryBeanDao() { + return searchHistoryBeanDao; + } + +} diff --git a/app/src/main/java/com/casic/xz/meterage/greendao/SearchHistoryBeanDao.java b/app/src/main/java/com/casic/xz/meterage/greendao/SearchHistoryBeanDao.java new file mode 100644 index 0000000..5923d02 --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/greendao/SearchHistoryBeanDao.java @@ -0,0 +1,185 @@ +package com.casic.xz.meterage.greendao; + +import android.database.Cursor; +import android.database.sqlite.SQLiteStatement; + +import com.casic.xz.meterage.bean.SearchHistoryBean; + +import org.greenrobot.greendao.AbstractDao; +import org.greenrobot.greendao.Property; +import org.greenrobot.greendao.database.Database; +import org.greenrobot.greendao.database.DatabaseStatement; +import org.greenrobot.greendao.internal.DaoConfig; + +// THIS CODE IS GENERATED BY greenDAO, DO NOT EDIT. +/** + * DAO for table "SEARCH_HISTORY_BEAN". +*/ +public class SearchHistoryBeanDao extends AbstractDao { + + public static final String TABLENAME = "SEARCH_HISTORY_BEAN"; + + /** + * Properties of entity SearchHistoryBean.
+ * Can be used for QueryBuilder and for referencing column names. + */ + public static class Properties { + public final static Property Id = new Property(0, Long.class, "id", true, "_id"); + public final static Property Uuid = new Property(1, String.class, "uuid", false, "UUID"); + public final static Property Keywords = new Property(2, String.class, "keywords", false, "KEYWORDS"); + public final static Property SearchType = new Property(3, String.class, "searchType", false, "SEARCH_TYPE"); + public final static Property UserId = new Property(4, String.class, "userId", false, "USER_ID"); + public final static Property SearchTime = new Property(5, String.class, "searchTime", false, "SEARCH_TIME"); + } + + + public SearchHistoryBeanDao(DaoConfig config) { + super(config); + } + + public SearchHistoryBeanDao(DaoConfig config, DaoSession daoSession) { + super(config, daoSession); + } + + /** Creates the underlying database table. */ + public static void createTable(Database db, boolean ifNotExists) { + String constraint = ifNotExists? "IF NOT EXISTS ": ""; + db.execSQL("CREATE TABLE " + constraint + "\"SEARCH_HISTORY_BEAN\" (" + // + "\"_id\" INTEGER PRIMARY KEY AUTOINCREMENT ," + // 0: id + "\"UUID\" TEXT UNIQUE ," + // 1: uuid + "\"KEYWORDS\" TEXT," + // 2: keywords + "\"SEARCH_TYPE\" TEXT," + // 3: searchType + "\"USER_ID\" TEXT," + // 4: userId + "\"SEARCH_TIME\" TEXT);"); // 5: searchTime + } + + /** Drops the underlying database table. */ + public static void dropTable(Database db, boolean ifExists) { + String sql = "DROP TABLE " + (ifExists ? "IF EXISTS " : "") + "\"SEARCH_HISTORY_BEAN\""; + db.execSQL(sql); + } + + @Override + protected final void bindValues(DatabaseStatement stmt, SearchHistoryBean entity) { + stmt.clearBindings(); + + Long id = entity.getId(); + if (id != null) { + stmt.bindLong(1, id); + } + + String uuid = entity.getUuid(); + if (uuid != null) { + stmt.bindString(2, uuid); + } + + String keywords = entity.getKeywords(); + if (keywords != null) { + stmt.bindString(3, keywords); + } + + String searchType = entity.getSearchType(); + if (searchType != null) { + stmt.bindString(4, searchType); + } + + String userId = entity.getUserId(); + if (userId != null) { + stmt.bindString(5, userId); + } + + String searchTime = entity.getSearchTime(); + if (searchTime != null) { + stmt.bindString(6, searchTime); + } + } + + @Override + protected final void bindValues(SQLiteStatement stmt, SearchHistoryBean entity) { + stmt.clearBindings(); + + Long id = entity.getId(); + if (id != null) { + stmt.bindLong(1, id); + } + + String uuid = entity.getUuid(); + if (uuid != null) { + stmt.bindString(2, uuid); + } + + String keywords = entity.getKeywords(); + if (keywords != null) { + stmt.bindString(3, keywords); + } + + String searchType = entity.getSearchType(); + if (searchType != null) { + stmt.bindString(4, searchType); + } + + String userId = entity.getUserId(); + if (userId != null) { + stmt.bindString(5, userId); + } + + String searchTime = entity.getSearchTime(); + if (searchTime != null) { + stmt.bindString(6, searchTime); + } + } + + @Override + public Long readKey(Cursor cursor, int offset) { + return cursor.isNull(offset + 0) ? null : cursor.getLong(offset + 0); + } + + @Override + public SearchHistoryBean readEntity(Cursor cursor, int offset) { + SearchHistoryBean entity = new SearchHistoryBean( // + cursor.isNull(offset + 0) ? null : cursor.getLong(offset + 0), // id + cursor.isNull(offset + 1) ? null : cursor.getString(offset + 1), // uuid + cursor.isNull(offset + 2) ? null : cursor.getString(offset + 2), // keywords + cursor.isNull(offset + 3) ? null : cursor.getString(offset + 3), // searchType + cursor.isNull(offset + 4) ? null : cursor.getString(offset + 4), // userId + cursor.isNull(offset + 5) ? null : cursor.getString(offset + 5) // searchTime + ); + return entity; + } + + @Override + public void readEntity(Cursor cursor, SearchHistoryBean entity, int offset) { + entity.setId(cursor.isNull(offset + 0) ? null : cursor.getLong(offset + 0)); + entity.setUuid(cursor.isNull(offset + 1) ? null : cursor.getString(offset + 1)); + entity.setKeywords(cursor.isNull(offset + 2) ? null : cursor.getString(offset + 2)); + entity.setSearchType(cursor.isNull(offset + 3) ? null : cursor.getString(offset + 3)); + entity.setUserId(cursor.isNull(offset + 4) ? null : cursor.getString(offset + 4)); + entity.setSearchTime(cursor.isNull(offset + 5) ? null : cursor.getString(offset + 5)); + } + + @Override + protected final Long updateKeyAfterInsert(SearchHistoryBean entity, long rowId) { + entity.setId(rowId); + return rowId; + } + + @Override + public Long getKey(SearchHistoryBean entity) { + if(entity != null) { + return entity.getId(); + } else { + return null; + } + } + + @Override + public boolean hasKey(SearchHistoryBean entity) { + return entity.getId() != null; + } + + @Override + protected final boolean isEntityUpdateable() { + return true; + } + +} diff --git a/app/src/main/java/com/casic/xz/meterage/utils/DataBaseManager.kt b/app/src/main/java/com/casic/xz/meterage/utils/DataBaseManager.kt new file mode 100644 index 0000000..52fe032 --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/utils/DataBaseManager.kt @@ -0,0 +1,45 @@ +package com.casic.xz.meterage.utils + +import com.casic.xz.meterage.base.BaseApplication +import com.casic.xz.meterage.bean.SearchHistoryBean +import com.casic.xz.meterage.greendao.SearchHistoryBeanDao +import com.pengxh.kt.lite.extensions.timestampToCompleteDate +import com.pengxh.kt.lite.utils.SaveKeyValues +import java.util.* + +class DataBaseManager private constructor() { + + companion object { + //Kotlin委托模式双重锁单例 + val get: DataBaseManager by lazy(mode = LazyThreadSafetyMode.SYNCHRONIZED) { + DataBaseManager() + } + } + + private val searchBeanDao by lazy { BaseApplication.get().getDaoSession().searchHistoryBeanDao } + private val userId by lazy { SaveKeyValues.getValue(LocaleConstant.USER_ID, "") } + + fun addSearchHistory(keywords: String, searchType: String) { + val bean = SearchHistoryBean() + bean.uuid = UUID.randomUUID().toString() + bean.keywords = keywords + bean.searchType = searchType + bean.userId = userId.toString() + bean.searchTime = System.currentTimeMillis().timestampToCompleteDate() + searchBeanDao.insert(bean) + } + + fun queryHistoryByType(searchType: String): MutableList { + return searchBeanDao.queryBuilder().where( + SearchHistoryBeanDao.Properties.UserId.eq(userId), + SearchHistoryBeanDao.Properties.SearchType.eq(searchType) + ).list() + } + + fun deleteHistoryByType(searchType: String) { + val list = queryHistoryByType(searchType) + list.forEach { + searchBeanDao.delete(it) + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/utils/LocaleConstant.kt b/app/src/main/java/com/casic/xz/meterage/utils/LocaleConstant.kt index cc2848b..2ea47a0 100644 --- a/app/src/main/java/com/casic/xz/meterage/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/xz/meterage/utils/LocaleConstant.kt @@ -62,4 +62,5 @@ const val File_SERVER_URL = "http://111.198.10.15:21408" const val ACCOUNT = "account" const val PASSWORD = "password" + const val USER_ID = "userId" } \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index 298f687..e142ec1 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -3,6 +3,7 @@ apply plugin: 'com.android.application' apply plugin: 'kotlin-android' apply plugin: 'kotlin-android-extensions' +apply plugin: 'org.greenrobot.greendao' android { signingConfigs { @@ -57,6 +58,12 @@ outputFileName = "XZJL_" + getBuildDate() + "_Beta.apk" } } + + greendao { + schemaVersion 1//数据库版本号 + targetGenDir 'src/main/java'//设置DaoMaster、DaoSession、Dao目录 + daoPackage 'com.casic.xz.meterage.greendao'//设置DaoMaster、DaoSession、Dao包名 + } } static def getBuildDate() { @@ -67,7 +74,7 @@ dependencies { //基础依赖库 implementation 'com.github.AndroidCoderPeng:Kotlin-lite-lib:1.0.4' - implementation 'androidx.appcompat:appcompat:1.5.1' + implementation 'androidx.appcompat:appcompat:1.6.1' implementation 'androidx.core:core-ktx:1.9.0' //Google官方授权框架 implementation 'pub.devrel:easypermissions:3.0.0' @@ -113,4 +120,6 @@ implementation 'com.github.tiann:FreeReflection:3.1.0' //单项/数字、二三级联动、日期/时间等滚轮选择器 implementation 'com.github.gzu-liyujiang.AndroidPicker:WheelPicker:4.1.8' + //数据库框架 + implementation 'org.greenrobot:greendao:3.3.0' } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 972eff9..5b6f9b2 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -69,6 +69,8 @@ + + diff --git a/app/src/main/java/com/casic/xz/meterage/base/BaseApplication.kt b/app/src/main/java/com/casic/xz/meterage/base/BaseApplication.kt index 14a604d..1684c23 100644 --- a/app/src/main/java/com/casic/xz/meterage/base/BaseApplication.kt +++ b/app/src/main/java/com/casic/xz/meterage/base/BaseApplication.kt @@ -2,6 +2,8 @@ import android.app.Application import android.content.Context +import com.casic.xz.meterage.greendao.DaoMaster +import com.casic.xz.meterage.greendao.DaoSession import com.pengxh.kt.lite.utils.SaveKeyValues import me.weishu.reflection.Reflection import kotlin.properties.Delegates @@ -12,12 +14,22 @@ private var application: BaseApplication by Delegates.notNull() fun get() = application + + private lateinit var daoSession: DaoSession } override fun onCreate() { super.onCreate() application = this SaveKeyValues.initSharedPreferences(this) + + val devOpenHelper = DaoMaster.DevOpenHelper(this, "Meterage.db", null) + val daoMaster = DaoMaster(devOpenHelper.writableDatabase) + daoSession = daoMaster.newSession() + } + + fun getDaoSession(): DaoSession { + return daoSession } //绕过Android 11以上反射限制 diff --git a/app/src/main/java/com/casic/xz/meterage/bean/SearchHistoryBean.java b/app/src/main/java/com/casic/xz/meterage/bean/SearchHistoryBean.java new file mode 100644 index 0000000..6a46a3a --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/bean/SearchHistoryBean.java @@ -0,0 +1,82 @@ +package com.casic.xz.meterage.bean; + +import org.greenrobot.greendao.annotation.Entity; +import org.greenrobot.greendao.annotation.Generated; +import org.greenrobot.greendao.annotation.Id; +import org.greenrobot.greendao.annotation.Unique; + +@Entity +public class SearchHistoryBean { + @Id(autoincrement = true) + private Long id;//主键自增 + + @Unique + private String uuid; + private String keywords;//查询条件-关键字 + private String searchType;//查询类型 + private String userId;//用户Id + private String searchTime;//查询的时间 + + @Generated(hash = 2130561778) + public SearchHistoryBean(Long id, String uuid, String keywords, + String searchType, String userId, String searchTime) { + this.id = id; + this.uuid = uuid; + this.keywords = keywords; + this.searchType = searchType; + this.userId = userId; + this.searchTime = searchTime; + } + + @Generated(hash = 1570282321) + public SearchHistoryBean() { + } + + public Long getId() { + return this.id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getUuid() { + return this.uuid; + } + + public void setUuid(String uuid) { + this.uuid = uuid; + } + + public String getKeywords() { + return this.keywords; + } + + public void setKeywords(String keywords) { + this.keywords = keywords; + } + + public String getSearchType() { + return this.searchType; + } + + public void setSearchType(String searchType) { + this.searchType = searchType; + } + + public String getUserId() { + return this.userId; + } + + public void setUserId(String userId) { + this.userId = userId; + } + + public String getSearchTime() { + return this.searchTime; + } + + public void setSearchTime(String searchTime) { + this.searchTime = searchTime; + } +} diff --git a/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt index 151f951..ae7f5e4 100644 --- a/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt +++ b/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt @@ -15,22 +15,20 @@ import com.casic.xz.meterage.extensions.showEmptyPage import com.casic.xz.meterage.model.NoticeListModel import com.casic.xz.meterage.model.RemindListModel -import com.casic.xz.meterage.model.UserInfoModel import com.casic.xz.meterage.utils.LoadingDialogHub import com.casic.xz.meterage.utils.LocaleConstant import com.casic.xz.meterage.utils.QrConfigCreator import com.casic.xz.meterage.view.home.* import com.casic.xz.meterage.view.notice.NoticeListActivity +import com.casic.xz.meterage.view.search.SearchAllActivity import com.casic.xz.meterage.vm.MeterageTrainViewModel import com.casic.xz.meterage.vm.NoticeViewModel -import com.casic.xz.meterage.vm.UserViewModel import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter import com.pengxh.kt.lite.adapter.ViewHolder import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.convertColor import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show -import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.utils.WeakReferenceHandler import com.pengxh.kt.lite.vm.LoadState import com.pengxh.kt.lite.widget.dialog.AlertControlDialog @@ -39,13 +37,12 @@ import kotlinx.android.synthetic.main.include_empty_view.* import java.util.* -class HomePageFragment : KotlinBaseFragment() { +class HomePageFragment(private val userId: String) : KotlinBaseFragment() { private val timer = object : Timer() {} private lateinit var weakReferenceHandler: WeakReferenceHandler private lateinit var meterageTrainViewModel: MeterageTrainViewModel private lateinit var noticeViewModel: NoticeViewModel - private lateinit var userData: UserInfoModel.DataModel private lateinit var remindAdapter: NormalRecyclerAdapter private var dataBeans: MutableList = ArrayList() private var noticeBeans: MutableList = ArrayList() @@ -170,14 +167,6 @@ true } - val userViewModel = ViewModelProvider(this)[UserViewModel::class.java] - userViewModel.getUserInfo(SaveKeyValues.getValue(LocaleConstant.ACCOUNT, "") as String) - userViewModel.userInfo.observe(this) { - if (it.code == 200) { - userData = it.data - } - } - meterageTrainViewModel = ViewModelProvider(this)[MeterageTrainViewModel::class.java] meterageTrainViewModel.signInResult.observe(this) { if (it.code == 200) { @@ -296,10 +285,14 @@ } override fun initEvent() { + searchBar.setOnClickListener { + requireContext().navigatePageTo() + } + scanCodeView.setOnClickListener { qrManager.startScan(requireActivity()) { result -> if (result.content.isDigitsOnly()) { - meterageTrainViewModel.signIn(userData.id, result.content) + meterageTrainViewModel.signIn(userId, result.content) } else { "签到二维码错误,请重新扫描".show(requireContext()) } diff --git a/app/src/main/java/com/casic/xz/meterage/greendao/DaoMaster.java b/app/src/main/java/com/casic/xz/meterage/greendao/DaoMaster.java new file mode 100644 index 0000000..d714ce2 --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/greendao/DaoMaster.java @@ -0,0 +1,96 @@ +package com.casic.xz.meterage.greendao; + +import android.content.Context; +import android.database.sqlite.SQLiteDatabase; +import android.database.sqlite.SQLiteDatabase.CursorFactory; +import android.util.Log; + +import org.greenrobot.greendao.AbstractDaoMaster; +import org.greenrobot.greendao.database.Database; +import org.greenrobot.greendao.database.DatabaseOpenHelper; +import org.greenrobot.greendao.database.StandardDatabase; +import org.greenrobot.greendao.identityscope.IdentityScopeType; + + +// THIS CODE IS GENERATED BY greenDAO, DO NOT EDIT. +/** + * Master of DAO (schema version 1): knows all DAOs. + */ +public class DaoMaster extends AbstractDaoMaster { + public static final int SCHEMA_VERSION = 1; + + /** Creates underlying database table using DAOs. */ + public static void createAllTables(Database db, boolean ifNotExists) { + SearchHistoryBeanDao.createTable(db, ifNotExists); + } + + /** Drops underlying database table using DAOs. */ + public static void dropAllTables(Database db, boolean ifExists) { + SearchHistoryBeanDao.dropTable(db, ifExists); + } + + /** + * WARNING: Drops all table on Upgrade! Use only during development. + * Convenience method using a {@link DevOpenHelper}. + */ + public static DaoSession newDevSession(Context context, String name) { + Database db = new DevOpenHelper(context, name).getWritableDb(); + DaoMaster daoMaster = new DaoMaster(db); + return daoMaster.newSession(); + } + + public DaoMaster(SQLiteDatabase db) { + this(new StandardDatabase(db)); + } + + public DaoMaster(Database db) { + super(db, SCHEMA_VERSION); + registerDaoClass(SearchHistoryBeanDao.class); + } + + public DaoSession newSession() { + return new DaoSession(db, IdentityScopeType.Session, daoConfigMap); + } + + public DaoSession newSession(IdentityScopeType type) { + return new DaoSession(db, type, daoConfigMap); + } + + /** + * Calls {@link #createAllTables(Database, boolean)} in {@link #onCreate(Database)} - + */ + public static abstract class OpenHelper extends DatabaseOpenHelper { + public OpenHelper(Context context, String name) { + super(context, name, SCHEMA_VERSION); + } + + public OpenHelper(Context context, String name, CursorFactory factory) { + super(context, name, factory, SCHEMA_VERSION); + } + + @Override + public void onCreate(Database db) { + Log.i("greenDAO", "Creating tables for schema version " + SCHEMA_VERSION); + createAllTables(db, false); + } + } + + /** WARNING: Drops all table on Upgrade! Use only during development. */ + public static class DevOpenHelper extends OpenHelper { + public DevOpenHelper(Context context, String name) { + super(context, name); + } + + public DevOpenHelper(Context context, String name, CursorFactory factory) { + super(context, name, factory); + } + + @Override + public void onUpgrade(Database db, int oldVersion, int newVersion) { + Log.i("greenDAO", "Upgrading schema from version " + oldVersion + " to " + newVersion + " by dropping all tables"); + dropAllTables(db, true); + onCreate(db); + } + } + +} diff --git a/app/src/main/java/com/casic/xz/meterage/greendao/DaoSession.java b/app/src/main/java/com/casic/xz/meterage/greendao/DaoSession.java new file mode 100644 index 0000000..0e80024 --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/greendao/DaoSession.java @@ -0,0 +1,46 @@ +package com.casic.xz.meterage.greendao; + +import com.casic.xz.meterage.bean.SearchHistoryBean; + +import org.greenrobot.greendao.AbstractDao; +import org.greenrobot.greendao.AbstractDaoSession; +import org.greenrobot.greendao.database.Database; +import org.greenrobot.greendao.identityscope.IdentityScopeType; +import org.greenrobot.greendao.internal.DaoConfig; + +import java.util.Map; + +// THIS CODE IS GENERATED BY greenDAO, DO NOT EDIT. + +/** + * {@inheritDoc} + * + * @see org.greenrobot.greendao.AbstractDaoSession + */ +public class DaoSession extends AbstractDaoSession { + + private final DaoConfig searchHistoryBeanDaoConfig; + + private final SearchHistoryBeanDao searchHistoryBeanDao; + + public DaoSession(Database db, IdentityScopeType type, Map>, DaoConfig> + daoConfigMap) { + super(db); + + searchHistoryBeanDaoConfig = daoConfigMap.get(SearchHistoryBeanDao.class).clone(); + searchHistoryBeanDaoConfig.initIdentityScope(type); + + searchHistoryBeanDao = new SearchHistoryBeanDao(searchHistoryBeanDaoConfig, this); + + registerDao(SearchHistoryBean.class, searchHistoryBeanDao); + } + + public void clear() { + searchHistoryBeanDaoConfig.clearIdentityScope(); + } + + public SearchHistoryBeanDao getSearchHistoryBeanDao() { + return searchHistoryBeanDao; + } + +} diff --git a/app/src/main/java/com/casic/xz/meterage/greendao/SearchHistoryBeanDao.java b/app/src/main/java/com/casic/xz/meterage/greendao/SearchHistoryBeanDao.java new file mode 100644 index 0000000..5923d02 --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/greendao/SearchHistoryBeanDao.java @@ -0,0 +1,185 @@ +package com.casic.xz.meterage.greendao; + +import android.database.Cursor; +import android.database.sqlite.SQLiteStatement; + +import com.casic.xz.meterage.bean.SearchHistoryBean; + +import org.greenrobot.greendao.AbstractDao; +import org.greenrobot.greendao.Property; +import org.greenrobot.greendao.database.Database; +import org.greenrobot.greendao.database.DatabaseStatement; +import org.greenrobot.greendao.internal.DaoConfig; + +// THIS CODE IS GENERATED BY greenDAO, DO NOT EDIT. +/** + * DAO for table "SEARCH_HISTORY_BEAN". +*/ +public class SearchHistoryBeanDao extends AbstractDao { + + public static final String TABLENAME = "SEARCH_HISTORY_BEAN"; + + /** + * Properties of entity SearchHistoryBean.
+ * Can be used for QueryBuilder and for referencing column names. + */ + public static class Properties { + public final static Property Id = new Property(0, Long.class, "id", true, "_id"); + public final static Property Uuid = new Property(1, String.class, "uuid", false, "UUID"); + public final static Property Keywords = new Property(2, String.class, "keywords", false, "KEYWORDS"); + public final static Property SearchType = new Property(3, String.class, "searchType", false, "SEARCH_TYPE"); + public final static Property UserId = new Property(4, String.class, "userId", false, "USER_ID"); + public final static Property SearchTime = new Property(5, String.class, "searchTime", false, "SEARCH_TIME"); + } + + + public SearchHistoryBeanDao(DaoConfig config) { + super(config); + } + + public SearchHistoryBeanDao(DaoConfig config, DaoSession daoSession) { + super(config, daoSession); + } + + /** Creates the underlying database table. */ + public static void createTable(Database db, boolean ifNotExists) { + String constraint = ifNotExists? "IF NOT EXISTS ": ""; + db.execSQL("CREATE TABLE " + constraint + "\"SEARCH_HISTORY_BEAN\" (" + // + "\"_id\" INTEGER PRIMARY KEY AUTOINCREMENT ," + // 0: id + "\"UUID\" TEXT UNIQUE ," + // 1: uuid + "\"KEYWORDS\" TEXT," + // 2: keywords + "\"SEARCH_TYPE\" TEXT," + // 3: searchType + "\"USER_ID\" TEXT," + // 4: userId + "\"SEARCH_TIME\" TEXT);"); // 5: searchTime + } + + /** Drops the underlying database table. */ + public static void dropTable(Database db, boolean ifExists) { + String sql = "DROP TABLE " + (ifExists ? "IF EXISTS " : "") + "\"SEARCH_HISTORY_BEAN\""; + db.execSQL(sql); + } + + @Override + protected final void bindValues(DatabaseStatement stmt, SearchHistoryBean entity) { + stmt.clearBindings(); + + Long id = entity.getId(); + if (id != null) { + stmt.bindLong(1, id); + } + + String uuid = entity.getUuid(); + if (uuid != null) { + stmt.bindString(2, uuid); + } + + String keywords = entity.getKeywords(); + if (keywords != null) { + stmt.bindString(3, keywords); + } + + String searchType = entity.getSearchType(); + if (searchType != null) { + stmt.bindString(4, searchType); + } + + String userId = entity.getUserId(); + if (userId != null) { + stmt.bindString(5, userId); + } + + String searchTime = entity.getSearchTime(); + if (searchTime != null) { + stmt.bindString(6, searchTime); + } + } + + @Override + protected final void bindValues(SQLiteStatement stmt, SearchHistoryBean entity) { + stmt.clearBindings(); + + Long id = entity.getId(); + if (id != null) { + stmt.bindLong(1, id); + } + + String uuid = entity.getUuid(); + if (uuid != null) { + stmt.bindString(2, uuid); + } + + String keywords = entity.getKeywords(); + if (keywords != null) { + stmt.bindString(3, keywords); + } + + String searchType = entity.getSearchType(); + if (searchType != null) { + stmt.bindString(4, searchType); + } + + String userId = entity.getUserId(); + if (userId != null) { + stmt.bindString(5, userId); + } + + String searchTime = entity.getSearchTime(); + if (searchTime != null) { + stmt.bindString(6, searchTime); + } + } + + @Override + public Long readKey(Cursor cursor, int offset) { + return cursor.isNull(offset + 0) ? null : cursor.getLong(offset + 0); + } + + @Override + public SearchHistoryBean readEntity(Cursor cursor, int offset) { + SearchHistoryBean entity = new SearchHistoryBean( // + cursor.isNull(offset + 0) ? null : cursor.getLong(offset + 0), // id + cursor.isNull(offset + 1) ? null : cursor.getString(offset + 1), // uuid + cursor.isNull(offset + 2) ? null : cursor.getString(offset + 2), // keywords + cursor.isNull(offset + 3) ? null : cursor.getString(offset + 3), // searchType + cursor.isNull(offset + 4) ? null : cursor.getString(offset + 4), // userId + cursor.isNull(offset + 5) ? null : cursor.getString(offset + 5) // searchTime + ); + return entity; + } + + @Override + public void readEntity(Cursor cursor, SearchHistoryBean entity, int offset) { + entity.setId(cursor.isNull(offset + 0) ? null : cursor.getLong(offset + 0)); + entity.setUuid(cursor.isNull(offset + 1) ? null : cursor.getString(offset + 1)); + entity.setKeywords(cursor.isNull(offset + 2) ? null : cursor.getString(offset + 2)); + entity.setSearchType(cursor.isNull(offset + 3) ? null : cursor.getString(offset + 3)); + entity.setUserId(cursor.isNull(offset + 4) ? null : cursor.getString(offset + 4)); + entity.setSearchTime(cursor.isNull(offset + 5) ? null : cursor.getString(offset + 5)); + } + + @Override + protected final Long updateKeyAfterInsert(SearchHistoryBean entity, long rowId) { + entity.setId(rowId); + return rowId; + } + + @Override + public Long getKey(SearchHistoryBean entity) { + if(entity != null) { + return entity.getId(); + } else { + return null; + } + } + + @Override + public boolean hasKey(SearchHistoryBean entity) { + return entity.getId() != null; + } + + @Override + protected final boolean isEntityUpdateable() { + return true; + } + +} diff --git a/app/src/main/java/com/casic/xz/meterage/utils/DataBaseManager.kt b/app/src/main/java/com/casic/xz/meterage/utils/DataBaseManager.kt new file mode 100644 index 0000000..52fe032 --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/utils/DataBaseManager.kt @@ -0,0 +1,45 @@ +package com.casic.xz.meterage.utils + +import com.casic.xz.meterage.base.BaseApplication +import com.casic.xz.meterage.bean.SearchHistoryBean +import com.casic.xz.meterage.greendao.SearchHistoryBeanDao +import com.pengxh.kt.lite.extensions.timestampToCompleteDate +import com.pengxh.kt.lite.utils.SaveKeyValues +import java.util.* + +class DataBaseManager private constructor() { + + companion object { + //Kotlin委托模式双重锁单例 + val get: DataBaseManager by lazy(mode = LazyThreadSafetyMode.SYNCHRONIZED) { + DataBaseManager() + } + } + + private val searchBeanDao by lazy { BaseApplication.get().getDaoSession().searchHistoryBeanDao } + private val userId by lazy { SaveKeyValues.getValue(LocaleConstant.USER_ID, "") } + + fun addSearchHistory(keywords: String, searchType: String) { + val bean = SearchHistoryBean() + bean.uuid = UUID.randomUUID().toString() + bean.keywords = keywords + bean.searchType = searchType + bean.userId = userId.toString() + bean.searchTime = System.currentTimeMillis().timestampToCompleteDate() + searchBeanDao.insert(bean) + } + + fun queryHistoryByType(searchType: String): MutableList { + return searchBeanDao.queryBuilder().where( + SearchHistoryBeanDao.Properties.UserId.eq(userId), + SearchHistoryBeanDao.Properties.SearchType.eq(searchType) + ).list() + } + + fun deleteHistoryByType(searchType: String) { + val list = queryHistoryByType(searchType) + list.forEach { + searchBeanDao.delete(it) + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/utils/LocaleConstant.kt b/app/src/main/java/com/casic/xz/meterage/utils/LocaleConstant.kt index cc2848b..2ea47a0 100644 --- a/app/src/main/java/com/casic/xz/meterage/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/xz/meterage/utils/LocaleConstant.kt @@ -62,4 +62,5 @@ const val File_SERVER_URL = "http://111.198.10.15:21408" const val ACCOUNT = "account" const val PASSWORD = "password" + const val USER_ID = "userId" } \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/utils/SearchType.kt b/app/src/main/java/com/casic/xz/meterage/utils/SearchType.kt new file mode 100644 index 0000000..5f5253e --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/utils/SearchType.kt @@ -0,0 +1,8 @@ +package com.casic.xz.meterage.utils + +object SearchType { + /** + * 搜索仪器设备 + * */ + const val Equipment = "0" +} diff --git a/app/build.gradle b/app/build.gradle index 298f687..e142ec1 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -3,6 +3,7 @@ apply plugin: 'com.android.application' apply plugin: 'kotlin-android' apply plugin: 'kotlin-android-extensions' +apply plugin: 'org.greenrobot.greendao' android { signingConfigs { @@ -57,6 +58,12 @@ outputFileName = "XZJL_" + getBuildDate() + "_Beta.apk" } } + + greendao { + schemaVersion 1//数据库版本号 + targetGenDir 'src/main/java'//设置DaoMaster、DaoSession、Dao目录 + daoPackage 'com.casic.xz.meterage.greendao'//设置DaoMaster、DaoSession、Dao包名 + } } static def getBuildDate() { @@ -67,7 +74,7 @@ dependencies { //基础依赖库 implementation 'com.github.AndroidCoderPeng:Kotlin-lite-lib:1.0.4' - implementation 'androidx.appcompat:appcompat:1.5.1' + implementation 'androidx.appcompat:appcompat:1.6.1' implementation 'androidx.core:core-ktx:1.9.0' //Google官方授权框架 implementation 'pub.devrel:easypermissions:3.0.0' @@ -113,4 +120,6 @@ implementation 'com.github.tiann:FreeReflection:3.1.0' //单项/数字、二三级联动、日期/时间等滚轮选择器 implementation 'com.github.gzu-liyujiang.AndroidPicker:WheelPicker:4.1.8' + //数据库框架 + implementation 'org.greenrobot:greendao:3.3.0' } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 972eff9..5b6f9b2 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -69,6 +69,8 @@ + + diff --git a/app/src/main/java/com/casic/xz/meterage/base/BaseApplication.kt b/app/src/main/java/com/casic/xz/meterage/base/BaseApplication.kt index 14a604d..1684c23 100644 --- a/app/src/main/java/com/casic/xz/meterage/base/BaseApplication.kt +++ b/app/src/main/java/com/casic/xz/meterage/base/BaseApplication.kt @@ -2,6 +2,8 @@ import android.app.Application import android.content.Context +import com.casic.xz.meterage.greendao.DaoMaster +import com.casic.xz.meterage.greendao.DaoSession import com.pengxh.kt.lite.utils.SaveKeyValues import me.weishu.reflection.Reflection import kotlin.properties.Delegates @@ -12,12 +14,22 @@ private var application: BaseApplication by Delegates.notNull() fun get() = application + + private lateinit var daoSession: DaoSession } override fun onCreate() { super.onCreate() application = this SaveKeyValues.initSharedPreferences(this) + + val devOpenHelper = DaoMaster.DevOpenHelper(this, "Meterage.db", null) + val daoMaster = DaoMaster(devOpenHelper.writableDatabase) + daoSession = daoMaster.newSession() + } + + fun getDaoSession(): DaoSession { + return daoSession } //绕过Android 11以上反射限制 diff --git a/app/src/main/java/com/casic/xz/meterage/bean/SearchHistoryBean.java b/app/src/main/java/com/casic/xz/meterage/bean/SearchHistoryBean.java new file mode 100644 index 0000000..6a46a3a --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/bean/SearchHistoryBean.java @@ -0,0 +1,82 @@ +package com.casic.xz.meterage.bean; + +import org.greenrobot.greendao.annotation.Entity; +import org.greenrobot.greendao.annotation.Generated; +import org.greenrobot.greendao.annotation.Id; +import org.greenrobot.greendao.annotation.Unique; + +@Entity +public class SearchHistoryBean { + @Id(autoincrement = true) + private Long id;//主键自增 + + @Unique + private String uuid; + private String keywords;//查询条件-关键字 + private String searchType;//查询类型 + private String userId;//用户Id + private String searchTime;//查询的时间 + + @Generated(hash = 2130561778) + public SearchHistoryBean(Long id, String uuid, String keywords, + String searchType, String userId, String searchTime) { + this.id = id; + this.uuid = uuid; + this.keywords = keywords; + this.searchType = searchType; + this.userId = userId; + this.searchTime = searchTime; + } + + @Generated(hash = 1570282321) + public SearchHistoryBean() { + } + + public Long getId() { + return this.id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getUuid() { + return this.uuid; + } + + public void setUuid(String uuid) { + this.uuid = uuid; + } + + public String getKeywords() { + return this.keywords; + } + + public void setKeywords(String keywords) { + this.keywords = keywords; + } + + public String getSearchType() { + return this.searchType; + } + + public void setSearchType(String searchType) { + this.searchType = searchType; + } + + public String getUserId() { + return this.userId; + } + + public void setUserId(String userId) { + this.userId = userId; + } + + public String getSearchTime() { + return this.searchTime; + } + + public void setSearchTime(String searchTime) { + this.searchTime = searchTime; + } +} diff --git a/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt index 151f951..ae7f5e4 100644 --- a/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt +++ b/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt @@ -15,22 +15,20 @@ import com.casic.xz.meterage.extensions.showEmptyPage import com.casic.xz.meterage.model.NoticeListModel import com.casic.xz.meterage.model.RemindListModel -import com.casic.xz.meterage.model.UserInfoModel import com.casic.xz.meterage.utils.LoadingDialogHub import com.casic.xz.meterage.utils.LocaleConstant import com.casic.xz.meterage.utils.QrConfigCreator import com.casic.xz.meterage.view.home.* import com.casic.xz.meterage.view.notice.NoticeListActivity +import com.casic.xz.meterage.view.search.SearchAllActivity import com.casic.xz.meterage.vm.MeterageTrainViewModel import com.casic.xz.meterage.vm.NoticeViewModel -import com.casic.xz.meterage.vm.UserViewModel import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter import com.pengxh.kt.lite.adapter.ViewHolder import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.convertColor import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show -import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.utils.WeakReferenceHandler import com.pengxh.kt.lite.vm.LoadState import com.pengxh.kt.lite.widget.dialog.AlertControlDialog @@ -39,13 +37,12 @@ import kotlinx.android.synthetic.main.include_empty_view.* import java.util.* -class HomePageFragment : KotlinBaseFragment() { +class HomePageFragment(private val userId: String) : KotlinBaseFragment() { private val timer = object : Timer() {} private lateinit var weakReferenceHandler: WeakReferenceHandler private lateinit var meterageTrainViewModel: MeterageTrainViewModel private lateinit var noticeViewModel: NoticeViewModel - private lateinit var userData: UserInfoModel.DataModel private lateinit var remindAdapter: NormalRecyclerAdapter private var dataBeans: MutableList = ArrayList() private var noticeBeans: MutableList = ArrayList() @@ -170,14 +167,6 @@ true } - val userViewModel = ViewModelProvider(this)[UserViewModel::class.java] - userViewModel.getUserInfo(SaveKeyValues.getValue(LocaleConstant.ACCOUNT, "") as String) - userViewModel.userInfo.observe(this) { - if (it.code == 200) { - userData = it.data - } - } - meterageTrainViewModel = ViewModelProvider(this)[MeterageTrainViewModel::class.java] meterageTrainViewModel.signInResult.observe(this) { if (it.code == 200) { @@ -296,10 +285,14 @@ } override fun initEvent() { + searchBar.setOnClickListener { + requireContext().navigatePageTo() + } + scanCodeView.setOnClickListener { qrManager.startScan(requireActivity()) { result -> if (result.content.isDigitsOnly()) { - meterageTrainViewModel.signIn(userData.id, result.content) + meterageTrainViewModel.signIn(userId, result.content) } else { "签到二维码错误,请重新扫描".show(requireContext()) } diff --git a/app/src/main/java/com/casic/xz/meterage/greendao/DaoMaster.java b/app/src/main/java/com/casic/xz/meterage/greendao/DaoMaster.java new file mode 100644 index 0000000..d714ce2 --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/greendao/DaoMaster.java @@ -0,0 +1,96 @@ +package com.casic.xz.meterage.greendao; + +import android.content.Context; +import android.database.sqlite.SQLiteDatabase; +import android.database.sqlite.SQLiteDatabase.CursorFactory; +import android.util.Log; + +import org.greenrobot.greendao.AbstractDaoMaster; +import org.greenrobot.greendao.database.Database; +import org.greenrobot.greendao.database.DatabaseOpenHelper; +import org.greenrobot.greendao.database.StandardDatabase; +import org.greenrobot.greendao.identityscope.IdentityScopeType; + + +// THIS CODE IS GENERATED BY greenDAO, DO NOT EDIT. +/** + * Master of DAO (schema version 1): knows all DAOs. + */ +public class DaoMaster extends AbstractDaoMaster { + public static final int SCHEMA_VERSION = 1; + + /** Creates underlying database table using DAOs. */ + public static void createAllTables(Database db, boolean ifNotExists) { + SearchHistoryBeanDao.createTable(db, ifNotExists); + } + + /** Drops underlying database table using DAOs. */ + public static void dropAllTables(Database db, boolean ifExists) { + SearchHistoryBeanDao.dropTable(db, ifExists); + } + + /** + * WARNING: Drops all table on Upgrade! Use only during development. + * Convenience method using a {@link DevOpenHelper}. + */ + public static DaoSession newDevSession(Context context, String name) { + Database db = new DevOpenHelper(context, name).getWritableDb(); + DaoMaster daoMaster = new DaoMaster(db); + return daoMaster.newSession(); + } + + public DaoMaster(SQLiteDatabase db) { + this(new StandardDatabase(db)); + } + + public DaoMaster(Database db) { + super(db, SCHEMA_VERSION); + registerDaoClass(SearchHistoryBeanDao.class); + } + + public DaoSession newSession() { + return new DaoSession(db, IdentityScopeType.Session, daoConfigMap); + } + + public DaoSession newSession(IdentityScopeType type) { + return new DaoSession(db, type, daoConfigMap); + } + + /** + * Calls {@link #createAllTables(Database, boolean)} in {@link #onCreate(Database)} - + */ + public static abstract class OpenHelper extends DatabaseOpenHelper { + public OpenHelper(Context context, String name) { + super(context, name, SCHEMA_VERSION); + } + + public OpenHelper(Context context, String name, CursorFactory factory) { + super(context, name, factory, SCHEMA_VERSION); + } + + @Override + public void onCreate(Database db) { + Log.i("greenDAO", "Creating tables for schema version " + SCHEMA_VERSION); + createAllTables(db, false); + } + } + + /** WARNING: Drops all table on Upgrade! Use only during development. */ + public static class DevOpenHelper extends OpenHelper { + public DevOpenHelper(Context context, String name) { + super(context, name); + } + + public DevOpenHelper(Context context, String name, CursorFactory factory) { + super(context, name, factory); + } + + @Override + public void onUpgrade(Database db, int oldVersion, int newVersion) { + Log.i("greenDAO", "Upgrading schema from version " + oldVersion + " to " + newVersion + " by dropping all tables"); + dropAllTables(db, true); + onCreate(db); + } + } + +} diff --git a/app/src/main/java/com/casic/xz/meterage/greendao/DaoSession.java b/app/src/main/java/com/casic/xz/meterage/greendao/DaoSession.java new file mode 100644 index 0000000..0e80024 --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/greendao/DaoSession.java @@ -0,0 +1,46 @@ +package com.casic.xz.meterage.greendao; + +import com.casic.xz.meterage.bean.SearchHistoryBean; + +import org.greenrobot.greendao.AbstractDao; +import org.greenrobot.greendao.AbstractDaoSession; +import org.greenrobot.greendao.database.Database; +import org.greenrobot.greendao.identityscope.IdentityScopeType; +import org.greenrobot.greendao.internal.DaoConfig; + +import java.util.Map; + +// THIS CODE IS GENERATED BY greenDAO, DO NOT EDIT. + +/** + * {@inheritDoc} + * + * @see org.greenrobot.greendao.AbstractDaoSession + */ +public class DaoSession extends AbstractDaoSession { + + private final DaoConfig searchHistoryBeanDaoConfig; + + private final SearchHistoryBeanDao searchHistoryBeanDao; + + public DaoSession(Database db, IdentityScopeType type, Map>, DaoConfig> + daoConfigMap) { + super(db); + + searchHistoryBeanDaoConfig = daoConfigMap.get(SearchHistoryBeanDao.class).clone(); + searchHistoryBeanDaoConfig.initIdentityScope(type); + + searchHistoryBeanDao = new SearchHistoryBeanDao(searchHistoryBeanDaoConfig, this); + + registerDao(SearchHistoryBean.class, searchHistoryBeanDao); + } + + public void clear() { + searchHistoryBeanDaoConfig.clearIdentityScope(); + } + + public SearchHistoryBeanDao getSearchHistoryBeanDao() { + return searchHistoryBeanDao; + } + +} diff --git a/app/src/main/java/com/casic/xz/meterage/greendao/SearchHistoryBeanDao.java b/app/src/main/java/com/casic/xz/meterage/greendao/SearchHistoryBeanDao.java new file mode 100644 index 0000000..5923d02 --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/greendao/SearchHistoryBeanDao.java @@ -0,0 +1,185 @@ +package com.casic.xz.meterage.greendao; + +import android.database.Cursor; +import android.database.sqlite.SQLiteStatement; + +import com.casic.xz.meterage.bean.SearchHistoryBean; + +import org.greenrobot.greendao.AbstractDao; +import org.greenrobot.greendao.Property; +import org.greenrobot.greendao.database.Database; +import org.greenrobot.greendao.database.DatabaseStatement; +import org.greenrobot.greendao.internal.DaoConfig; + +// THIS CODE IS GENERATED BY greenDAO, DO NOT EDIT. +/** + * DAO for table "SEARCH_HISTORY_BEAN". +*/ +public class SearchHistoryBeanDao extends AbstractDao { + + public static final String TABLENAME = "SEARCH_HISTORY_BEAN"; + + /** + * Properties of entity SearchHistoryBean.
+ * Can be used for QueryBuilder and for referencing column names. + */ + public static class Properties { + public final static Property Id = new Property(0, Long.class, "id", true, "_id"); + public final static Property Uuid = new Property(1, String.class, "uuid", false, "UUID"); + public final static Property Keywords = new Property(2, String.class, "keywords", false, "KEYWORDS"); + public final static Property SearchType = new Property(3, String.class, "searchType", false, "SEARCH_TYPE"); + public final static Property UserId = new Property(4, String.class, "userId", false, "USER_ID"); + public final static Property SearchTime = new Property(5, String.class, "searchTime", false, "SEARCH_TIME"); + } + + + public SearchHistoryBeanDao(DaoConfig config) { + super(config); + } + + public SearchHistoryBeanDao(DaoConfig config, DaoSession daoSession) { + super(config, daoSession); + } + + /** Creates the underlying database table. */ + public static void createTable(Database db, boolean ifNotExists) { + String constraint = ifNotExists? "IF NOT EXISTS ": ""; + db.execSQL("CREATE TABLE " + constraint + "\"SEARCH_HISTORY_BEAN\" (" + // + "\"_id\" INTEGER PRIMARY KEY AUTOINCREMENT ," + // 0: id + "\"UUID\" TEXT UNIQUE ," + // 1: uuid + "\"KEYWORDS\" TEXT," + // 2: keywords + "\"SEARCH_TYPE\" TEXT," + // 3: searchType + "\"USER_ID\" TEXT," + // 4: userId + "\"SEARCH_TIME\" TEXT);"); // 5: searchTime + } + + /** Drops the underlying database table. */ + public static void dropTable(Database db, boolean ifExists) { + String sql = "DROP TABLE " + (ifExists ? "IF EXISTS " : "") + "\"SEARCH_HISTORY_BEAN\""; + db.execSQL(sql); + } + + @Override + protected final void bindValues(DatabaseStatement stmt, SearchHistoryBean entity) { + stmt.clearBindings(); + + Long id = entity.getId(); + if (id != null) { + stmt.bindLong(1, id); + } + + String uuid = entity.getUuid(); + if (uuid != null) { + stmt.bindString(2, uuid); + } + + String keywords = entity.getKeywords(); + if (keywords != null) { + stmt.bindString(3, keywords); + } + + String searchType = entity.getSearchType(); + if (searchType != null) { + stmt.bindString(4, searchType); + } + + String userId = entity.getUserId(); + if (userId != null) { + stmt.bindString(5, userId); + } + + String searchTime = entity.getSearchTime(); + if (searchTime != null) { + stmt.bindString(6, searchTime); + } + } + + @Override + protected final void bindValues(SQLiteStatement stmt, SearchHistoryBean entity) { + stmt.clearBindings(); + + Long id = entity.getId(); + if (id != null) { + stmt.bindLong(1, id); + } + + String uuid = entity.getUuid(); + if (uuid != null) { + stmt.bindString(2, uuid); + } + + String keywords = entity.getKeywords(); + if (keywords != null) { + stmt.bindString(3, keywords); + } + + String searchType = entity.getSearchType(); + if (searchType != null) { + stmt.bindString(4, searchType); + } + + String userId = entity.getUserId(); + if (userId != null) { + stmt.bindString(5, userId); + } + + String searchTime = entity.getSearchTime(); + if (searchTime != null) { + stmt.bindString(6, searchTime); + } + } + + @Override + public Long readKey(Cursor cursor, int offset) { + return cursor.isNull(offset + 0) ? null : cursor.getLong(offset + 0); + } + + @Override + public SearchHistoryBean readEntity(Cursor cursor, int offset) { + SearchHistoryBean entity = new SearchHistoryBean( // + cursor.isNull(offset + 0) ? null : cursor.getLong(offset + 0), // id + cursor.isNull(offset + 1) ? null : cursor.getString(offset + 1), // uuid + cursor.isNull(offset + 2) ? null : cursor.getString(offset + 2), // keywords + cursor.isNull(offset + 3) ? null : cursor.getString(offset + 3), // searchType + cursor.isNull(offset + 4) ? null : cursor.getString(offset + 4), // userId + cursor.isNull(offset + 5) ? null : cursor.getString(offset + 5) // searchTime + ); + return entity; + } + + @Override + public void readEntity(Cursor cursor, SearchHistoryBean entity, int offset) { + entity.setId(cursor.isNull(offset + 0) ? null : cursor.getLong(offset + 0)); + entity.setUuid(cursor.isNull(offset + 1) ? null : cursor.getString(offset + 1)); + entity.setKeywords(cursor.isNull(offset + 2) ? null : cursor.getString(offset + 2)); + entity.setSearchType(cursor.isNull(offset + 3) ? null : cursor.getString(offset + 3)); + entity.setUserId(cursor.isNull(offset + 4) ? null : cursor.getString(offset + 4)); + entity.setSearchTime(cursor.isNull(offset + 5) ? null : cursor.getString(offset + 5)); + } + + @Override + protected final Long updateKeyAfterInsert(SearchHistoryBean entity, long rowId) { + entity.setId(rowId); + return rowId; + } + + @Override + public Long getKey(SearchHistoryBean entity) { + if(entity != null) { + return entity.getId(); + } else { + return null; + } + } + + @Override + public boolean hasKey(SearchHistoryBean entity) { + return entity.getId() != null; + } + + @Override + protected final boolean isEntityUpdateable() { + return true; + } + +} diff --git a/app/src/main/java/com/casic/xz/meterage/utils/DataBaseManager.kt b/app/src/main/java/com/casic/xz/meterage/utils/DataBaseManager.kt new file mode 100644 index 0000000..52fe032 --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/utils/DataBaseManager.kt @@ -0,0 +1,45 @@ +package com.casic.xz.meterage.utils + +import com.casic.xz.meterage.base.BaseApplication +import com.casic.xz.meterage.bean.SearchHistoryBean +import com.casic.xz.meterage.greendao.SearchHistoryBeanDao +import com.pengxh.kt.lite.extensions.timestampToCompleteDate +import com.pengxh.kt.lite.utils.SaveKeyValues +import java.util.* + +class DataBaseManager private constructor() { + + companion object { + //Kotlin委托模式双重锁单例 + val get: DataBaseManager by lazy(mode = LazyThreadSafetyMode.SYNCHRONIZED) { + DataBaseManager() + } + } + + private val searchBeanDao by lazy { BaseApplication.get().getDaoSession().searchHistoryBeanDao } + private val userId by lazy { SaveKeyValues.getValue(LocaleConstant.USER_ID, "") } + + fun addSearchHistory(keywords: String, searchType: String) { + val bean = SearchHistoryBean() + bean.uuid = UUID.randomUUID().toString() + bean.keywords = keywords + bean.searchType = searchType + bean.userId = userId.toString() + bean.searchTime = System.currentTimeMillis().timestampToCompleteDate() + searchBeanDao.insert(bean) + } + + fun queryHistoryByType(searchType: String): MutableList { + return searchBeanDao.queryBuilder().where( + SearchHistoryBeanDao.Properties.UserId.eq(userId), + SearchHistoryBeanDao.Properties.SearchType.eq(searchType) + ).list() + } + + fun deleteHistoryByType(searchType: String) { + val list = queryHistoryByType(searchType) + list.forEach { + searchBeanDao.delete(it) + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/utils/LocaleConstant.kt b/app/src/main/java/com/casic/xz/meterage/utils/LocaleConstant.kt index cc2848b..2ea47a0 100644 --- a/app/src/main/java/com/casic/xz/meterage/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/xz/meterage/utils/LocaleConstant.kt @@ -62,4 +62,5 @@ const val File_SERVER_URL = "http://111.198.10.15:21408" const val ACCOUNT = "account" const val PASSWORD = "password" + const val USER_ID = "userId" } \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/utils/SearchType.kt b/app/src/main/java/com/casic/xz/meterage/utils/SearchType.kt new file mode 100644 index 0000000..5f5253e --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/utils/SearchType.kt @@ -0,0 +1,8 @@ +package com.casic.xz.meterage.utils + +object SearchType { + /** + * 搜索仪器设备 + * */ + const val Equipment = "0" +} diff --git a/app/src/main/java/com/casic/xz/meterage/view/MainActivity.kt b/app/src/main/java/com/casic/xz/meterage/view/MainActivity.kt index 28836e0..8fb0793 100644 --- a/app/src/main/java/com/casic/xz/meterage/view/MainActivity.kt +++ b/app/src/main/java/com/casic/xz/meterage/view/MainActivity.kt @@ -3,15 +3,19 @@ import android.view.KeyEvent import android.view.MenuItem import androidx.fragment.app.Fragment +import androidx.lifecycle.ViewModelProvider import androidx.viewpager.widget.ViewPager import com.casic.xz.meterage.R import com.casic.xz.meterage.adapter.ViewPagerAdapter import com.casic.xz.meterage.fragment.HomePageFragment import com.casic.xz.meterage.fragment.MinePageFragment import com.casic.xz.meterage.fragment.SamplePageFragment +import com.casic.xz.meterage.utils.LocaleConstant +import com.casic.xz.meterage.vm.UserViewModel import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.SaveKeyValues import kotlinx.android.synthetic.main.activity_main.* class MainActivity : KotlinBaseActivity() { @@ -20,53 +24,59 @@ private var fragmentPages: ArrayList = ArrayList() private var clickTime: Long = 0 - init { - fragmentPages.add(HomePageFragment()) - fragmentPages.add(SamplePageFragment()) - fragmentPages.add(MinePageFragment()) - } - override fun initData() { - bottomNavigation.itemIconTintList = null - bottomNavigation.setOnNavigationItemSelectedListener { menuItem -> - when (menuItem.itemId) { - R.id.nav_home -> { - mainViewPager.currentItem = 0 + val userViewModel = ViewModelProvider(this)[UserViewModel::class.java] + userViewModel.getUserInfo(SaveKeyValues.getValue(LocaleConstant.ACCOUNT, "") as String) + userViewModel.userInfo.observe(this) { + if (it.code == 200) { + SaveKeyValues.putValue(LocaleConstant.USER_ID, it.data.id) + + fragmentPages.add(HomePageFragment(it.data.id)) + fragmentPages.add(SamplePageFragment()) + fragmentPages.add(MinePageFragment()) + + bottomNavigation.itemIconTintList = null + bottomNavigation.setOnNavigationItemSelectedListener { menuItem -> + when (menuItem.itemId) { + R.id.nav_home -> { + mainViewPager.currentItem = 0 + } + R.id.nav_sample -> { + mainViewPager.currentItem = 1 + } + R.id.nav_mine -> { + mainViewPager.currentItem = 2 + } + } + false } - R.id.nav_sample -> { - mainViewPager.currentItem = 1 - } - R.id.nav_mine -> { - mainViewPager.currentItem = 2 - } + mainViewPager.adapter = ViewPagerAdapter(fragmentPages, supportFragmentManager) + mainViewPager.offscreenPageLimit = fragmentPages.size //缓存页数 + mainViewPager.addOnPageChangeListener(object : ViewPager.OnPageChangeListener { + override fun onPageScrollStateChanged(state: Int) { + + } + + override fun onPageScrolled( + position: Int, + positionOffset: Float, + positionOffsetPixels: Int + ) { + + } + + override fun onPageSelected(position: Int) { + if (menuItem != null) { + menuItem!!.isChecked = false + } else { + bottomNavigation.menu.getItem(0).isChecked = false + } + menuItem = bottomNavigation.menu.getItem(position) + menuItem!!.isChecked = true + } + }) } - false } - mainViewPager.adapter = ViewPagerAdapter(fragmentPages, supportFragmentManager) - mainViewPager.offscreenPageLimit = fragmentPages.size //缓存页数 - mainViewPager.addOnPageChangeListener(object : ViewPager.OnPageChangeListener { - override fun onPageScrollStateChanged(state: Int) { - - } - - override fun onPageScrolled( - position: Int, - positionOffset: Float, - positionOffsetPixels: Int - ) { - - } - - override fun onPageSelected(position: Int) { - if (menuItem != null) { - menuItem!!.isChecked = false - } else { - bottomNavigation.menu.getItem(0).isChecked = false - } - menuItem = bottomNavigation.menu.getItem(position) - menuItem!!.isChecked = true - } - }) } override fun initEvent() { diff --git a/app/build.gradle b/app/build.gradle index 298f687..e142ec1 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -3,6 +3,7 @@ apply plugin: 'com.android.application' apply plugin: 'kotlin-android' apply plugin: 'kotlin-android-extensions' +apply plugin: 'org.greenrobot.greendao' android { signingConfigs { @@ -57,6 +58,12 @@ outputFileName = "XZJL_" + getBuildDate() + "_Beta.apk" } } + + greendao { + schemaVersion 1//数据库版本号 + targetGenDir 'src/main/java'//设置DaoMaster、DaoSession、Dao目录 + daoPackage 'com.casic.xz.meterage.greendao'//设置DaoMaster、DaoSession、Dao包名 + } } static def getBuildDate() { @@ -67,7 +74,7 @@ dependencies { //基础依赖库 implementation 'com.github.AndroidCoderPeng:Kotlin-lite-lib:1.0.4' - implementation 'androidx.appcompat:appcompat:1.5.1' + implementation 'androidx.appcompat:appcompat:1.6.1' implementation 'androidx.core:core-ktx:1.9.0' //Google官方授权框架 implementation 'pub.devrel:easypermissions:3.0.0' @@ -113,4 +120,6 @@ implementation 'com.github.tiann:FreeReflection:3.1.0' //单项/数字、二三级联动、日期/时间等滚轮选择器 implementation 'com.github.gzu-liyujiang.AndroidPicker:WheelPicker:4.1.8' + //数据库框架 + implementation 'org.greenrobot:greendao:3.3.0' } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 972eff9..5b6f9b2 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -69,6 +69,8 @@ + + diff --git a/app/src/main/java/com/casic/xz/meterage/base/BaseApplication.kt b/app/src/main/java/com/casic/xz/meterage/base/BaseApplication.kt index 14a604d..1684c23 100644 --- a/app/src/main/java/com/casic/xz/meterage/base/BaseApplication.kt +++ b/app/src/main/java/com/casic/xz/meterage/base/BaseApplication.kt @@ -2,6 +2,8 @@ import android.app.Application import android.content.Context +import com.casic.xz.meterage.greendao.DaoMaster +import com.casic.xz.meterage.greendao.DaoSession import com.pengxh.kt.lite.utils.SaveKeyValues import me.weishu.reflection.Reflection import kotlin.properties.Delegates @@ -12,12 +14,22 @@ private var application: BaseApplication by Delegates.notNull() fun get() = application + + private lateinit var daoSession: DaoSession } override fun onCreate() { super.onCreate() application = this SaveKeyValues.initSharedPreferences(this) + + val devOpenHelper = DaoMaster.DevOpenHelper(this, "Meterage.db", null) + val daoMaster = DaoMaster(devOpenHelper.writableDatabase) + daoSession = daoMaster.newSession() + } + + fun getDaoSession(): DaoSession { + return daoSession } //绕过Android 11以上反射限制 diff --git a/app/src/main/java/com/casic/xz/meterage/bean/SearchHistoryBean.java b/app/src/main/java/com/casic/xz/meterage/bean/SearchHistoryBean.java new file mode 100644 index 0000000..6a46a3a --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/bean/SearchHistoryBean.java @@ -0,0 +1,82 @@ +package com.casic.xz.meterage.bean; + +import org.greenrobot.greendao.annotation.Entity; +import org.greenrobot.greendao.annotation.Generated; +import org.greenrobot.greendao.annotation.Id; +import org.greenrobot.greendao.annotation.Unique; + +@Entity +public class SearchHistoryBean { + @Id(autoincrement = true) + private Long id;//主键自增 + + @Unique + private String uuid; + private String keywords;//查询条件-关键字 + private String searchType;//查询类型 + private String userId;//用户Id + private String searchTime;//查询的时间 + + @Generated(hash = 2130561778) + public SearchHistoryBean(Long id, String uuid, String keywords, + String searchType, String userId, String searchTime) { + this.id = id; + this.uuid = uuid; + this.keywords = keywords; + this.searchType = searchType; + this.userId = userId; + this.searchTime = searchTime; + } + + @Generated(hash = 1570282321) + public SearchHistoryBean() { + } + + public Long getId() { + return this.id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getUuid() { + return this.uuid; + } + + public void setUuid(String uuid) { + this.uuid = uuid; + } + + public String getKeywords() { + return this.keywords; + } + + public void setKeywords(String keywords) { + this.keywords = keywords; + } + + public String getSearchType() { + return this.searchType; + } + + public void setSearchType(String searchType) { + this.searchType = searchType; + } + + public String getUserId() { + return this.userId; + } + + public void setUserId(String userId) { + this.userId = userId; + } + + public String getSearchTime() { + return this.searchTime; + } + + public void setSearchTime(String searchTime) { + this.searchTime = searchTime; + } +} diff --git a/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt index 151f951..ae7f5e4 100644 --- a/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt +++ b/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt @@ -15,22 +15,20 @@ import com.casic.xz.meterage.extensions.showEmptyPage import com.casic.xz.meterage.model.NoticeListModel import com.casic.xz.meterage.model.RemindListModel -import com.casic.xz.meterage.model.UserInfoModel import com.casic.xz.meterage.utils.LoadingDialogHub import com.casic.xz.meterage.utils.LocaleConstant import com.casic.xz.meterage.utils.QrConfigCreator import com.casic.xz.meterage.view.home.* import com.casic.xz.meterage.view.notice.NoticeListActivity +import com.casic.xz.meterage.view.search.SearchAllActivity import com.casic.xz.meterage.vm.MeterageTrainViewModel import com.casic.xz.meterage.vm.NoticeViewModel -import com.casic.xz.meterage.vm.UserViewModel import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter import com.pengxh.kt.lite.adapter.ViewHolder import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.convertColor import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show -import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.utils.WeakReferenceHandler import com.pengxh.kt.lite.vm.LoadState import com.pengxh.kt.lite.widget.dialog.AlertControlDialog @@ -39,13 +37,12 @@ import kotlinx.android.synthetic.main.include_empty_view.* import java.util.* -class HomePageFragment : KotlinBaseFragment() { +class HomePageFragment(private val userId: String) : KotlinBaseFragment() { private val timer = object : Timer() {} private lateinit var weakReferenceHandler: WeakReferenceHandler private lateinit var meterageTrainViewModel: MeterageTrainViewModel private lateinit var noticeViewModel: NoticeViewModel - private lateinit var userData: UserInfoModel.DataModel private lateinit var remindAdapter: NormalRecyclerAdapter private var dataBeans: MutableList = ArrayList() private var noticeBeans: MutableList = ArrayList() @@ -170,14 +167,6 @@ true } - val userViewModel = ViewModelProvider(this)[UserViewModel::class.java] - userViewModel.getUserInfo(SaveKeyValues.getValue(LocaleConstant.ACCOUNT, "") as String) - userViewModel.userInfo.observe(this) { - if (it.code == 200) { - userData = it.data - } - } - meterageTrainViewModel = ViewModelProvider(this)[MeterageTrainViewModel::class.java] meterageTrainViewModel.signInResult.observe(this) { if (it.code == 200) { @@ -296,10 +285,14 @@ } override fun initEvent() { + searchBar.setOnClickListener { + requireContext().navigatePageTo() + } + scanCodeView.setOnClickListener { qrManager.startScan(requireActivity()) { result -> if (result.content.isDigitsOnly()) { - meterageTrainViewModel.signIn(userData.id, result.content) + meterageTrainViewModel.signIn(userId, result.content) } else { "签到二维码错误,请重新扫描".show(requireContext()) } diff --git a/app/src/main/java/com/casic/xz/meterage/greendao/DaoMaster.java b/app/src/main/java/com/casic/xz/meterage/greendao/DaoMaster.java new file mode 100644 index 0000000..d714ce2 --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/greendao/DaoMaster.java @@ -0,0 +1,96 @@ +package com.casic.xz.meterage.greendao; + +import android.content.Context; +import android.database.sqlite.SQLiteDatabase; +import android.database.sqlite.SQLiteDatabase.CursorFactory; +import android.util.Log; + +import org.greenrobot.greendao.AbstractDaoMaster; +import org.greenrobot.greendao.database.Database; +import org.greenrobot.greendao.database.DatabaseOpenHelper; +import org.greenrobot.greendao.database.StandardDatabase; +import org.greenrobot.greendao.identityscope.IdentityScopeType; + + +// THIS CODE IS GENERATED BY greenDAO, DO NOT EDIT. +/** + * Master of DAO (schema version 1): knows all DAOs. + */ +public class DaoMaster extends AbstractDaoMaster { + public static final int SCHEMA_VERSION = 1; + + /** Creates underlying database table using DAOs. */ + public static void createAllTables(Database db, boolean ifNotExists) { + SearchHistoryBeanDao.createTable(db, ifNotExists); + } + + /** Drops underlying database table using DAOs. */ + public static void dropAllTables(Database db, boolean ifExists) { + SearchHistoryBeanDao.dropTable(db, ifExists); + } + + /** + * WARNING: Drops all table on Upgrade! Use only during development. + * Convenience method using a {@link DevOpenHelper}. + */ + public static DaoSession newDevSession(Context context, String name) { + Database db = new DevOpenHelper(context, name).getWritableDb(); + DaoMaster daoMaster = new DaoMaster(db); + return daoMaster.newSession(); + } + + public DaoMaster(SQLiteDatabase db) { + this(new StandardDatabase(db)); + } + + public DaoMaster(Database db) { + super(db, SCHEMA_VERSION); + registerDaoClass(SearchHistoryBeanDao.class); + } + + public DaoSession newSession() { + return new DaoSession(db, IdentityScopeType.Session, daoConfigMap); + } + + public DaoSession newSession(IdentityScopeType type) { + return new DaoSession(db, type, daoConfigMap); + } + + /** + * Calls {@link #createAllTables(Database, boolean)} in {@link #onCreate(Database)} - + */ + public static abstract class OpenHelper extends DatabaseOpenHelper { + public OpenHelper(Context context, String name) { + super(context, name, SCHEMA_VERSION); + } + + public OpenHelper(Context context, String name, CursorFactory factory) { + super(context, name, factory, SCHEMA_VERSION); + } + + @Override + public void onCreate(Database db) { + Log.i("greenDAO", "Creating tables for schema version " + SCHEMA_VERSION); + createAllTables(db, false); + } + } + + /** WARNING: Drops all table on Upgrade! Use only during development. */ + public static class DevOpenHelper extends OpenHelper { + public DevOpenHelper(Context context, String name) { + super(context, name); + } + + public DevOpenHelper(Context context, String name, CursorFactory factory) { + super(context, name, factory); + } + + @Override + public void onUpgrade(Database db, int oldVersion, int newVersion) { + Log.i("greenDAO", "Upgrading schema from version " + oldVersion + " to " + newVersion + " by dropping all tables"); + dropAllTables(db, true); + onCreate(db); + } + } + +} diff --git a/app/src/main/java/com/casic/xz/meterage/greendao/DaoSession.java b/app/src/main/java/com/casic/xz/meterage/greendao/DaoSession.java new file mode 100644 index 0000000..0e80024 --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/greendao/DaoSession.java @@ -0,0 +1,46 @@ +package com.casic.xz.meterage.greendao; + +import com.casic.xz.meterage.bean.SearchHistoryBean; + +import org.greenrobot.greendao.AbstractDao; +import org.greenrobot.greendao.AbstractDaoSession; +import org.greenrobot.greendao.database.Database; +import org.greenrobot.greendao.identityscope.IdentityScopeType; +import org.greenrobot.greendao.internal.DaoConfig; + +import java.util.Map; + +// THIS CODE IS GENERATED BY greenDAO, DO NOT EDIT. + +/** + * {@inheritDoc} + * + * @see org.greenrobot.greendao.AbstractDaoSession + */ +public class DaoSession extends AbstractDaoSession { + + private final DaoConfig searchHistoryBeanDaoConfig; + + private final SearchHistoryBeanDao searchHistoryBeanDao; + + public DaoSession(Database db, IdentityScopeType type, Map>, DaoConfig> + daoConfigMap) { + super(db); + + searchHistoryBeanDaoConfig = daoConfigMap.get(SearchHistoryBeanDao.class).clone(); + searchHistoryBeanDaoConfig.initIdentityScope(type); + + searchHistoryBeanDao = new SearchHistoryBeanDao(searchHistoryBeanDaoConfig, this); + + registerDao(SearchHistoryBean.class, searchHistoryBeanDao); + } + + public void clear() { + searchHistoryBeanDaoConfig.clearIdentityScope(); + } + + public SearchHistoryBeanDao getSearchHistoryBeanDao() { + return searchHistoryBeanDao; + } + +} diff --git a/app/src/main/java/com/casic/xz/meterage/greendao/SearchHistoryBeanDao.java b/app/src/main/java/com/casic/xz/meterage/greendao/SearchHistoryBeanDao.java new file mode 100644 index 0000000..5923d02 --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/greendao/SearchHistoryBeanDao.java @@ -0,0 +1,185 @@ +package com.casic.xz.meterage.greendao; + +import android.database.Cursor; +import android.database.sqlite.SQLiteStatement; + +import com.casic.xz.meterage.bean.SearchHistoryBean; + +import org.greenrobot.greendao.AbstractDao; +import org.greenrobot.greendao.Property; +import org.greenrobot.greendao.database.Database; +import org.greenrobot.greendao.database.DatabaseStatement; +import org.greenrobot.greendao.internal.DaoConfig; + +// THIS CODE IS GENERATED BY greenDAO, DO NOT EDIT. +/** + * DAO for table "SEARCH_HISTORY_BEAN". +*/ +public class SearchHistoryBeanDao extends AbstractDao { + + public static final String TABLENAME = "SEARCH_HISTORY_BEAN"; + + /** + * Properties of entity SearchHistoryBean.
+ * Can be used for QueryBuilder and for referencing column names. + */ + public static class Properties { + public final static Property Id = new Property(0, Long.class, "id", true, "_id"); + public final static Property Uuid = new Property(1, String.class, "uuid", false, "UUID"); + public final static Property Keywords = new Property(2, String.class, "keywords", false, "KEYWORDS"); + public final static Property SearchType = new Property(3, String.class, "searchType", false, "SEARCH_TYPE"); + public final static Property UserId = new Property(4, String.class, "userId", false, "USER_ID"); + public final static Property SearchTime = new Property(5, String.class, "searchTime", false, "SEARCH_TIME"); + } + + + public SearchHistoryBeanDao(DaoConfig config) { + super(config); + } + + public SearchHistoryBeanDao(DaoConfig config, DaoSession daoSession) { + super(config, daoSession); + } + + /** Creates the underlying database table. */ + public static void createTable(Database db, boolean ifNotExists) { + String constraint = ifNotExists? "IF NOT EXISTS ": ""; + db.execSQL("CREATE TABLE " + constraint + "\"SEARCH_HISTORY_BEAN\" (" + // + "\"_id\" INTEGER PRIMARY KEY AUTOINCREMENT ," + // 0: id + "\"UUID\" TEXT UNIQUE ," + // 1: uuid + "\"KEYWORDS\" TEXT," + // 2: keywords + "\"SEARCH_TYPE\" TEXT," + // 3: searchType + "\"USER_ID\" TEXT," + // 4: userId + "\"SEARCH_TIME\" TEXT);"); // 5: searchTime + } + + /** Drops the underlying database table. */ + public static void dropTable(Database db, boolean ifExists) { + String sql = "DROP TABLE " + (ifExists ? "IF EXISTS " : "") + "\"SEARCH_HISTORY_BEAN\""; + db.execSQL(sql); + } + + @Override + protected final void bindValues(DatabaseStatement stmt, SearchHistoryBean entity) { + stmt.clearBindings(); + + Long id = entity.getId(); + if (id != null) { + stmt.bindLong(1, id); + } + + String uuid = entity.getUuid(); + if (uuid != null) { + stmt.bindString(2, uuid); + } + + String keywords = entity.getKeywords(); + if (keywords != null) { + stmt.bindString(3, keywords); + } + + String searchType = entity.getSearchType(); + if (searchType != null) { + stmt.bindString(4, searchType); + } + + String userId = entity.getUserId(); + if (userId != null) { + stmt.bindString(5, userId); + } + + String searchTime = entity.getSearchTime(); + if (searchTime != null) { + stmt.bindString(6, searchTime); + } + } + + @Override + protected final void bindValues(SQLiteStatement stmt, SearchHistoryBean entity) { + stmt.clearBindings(); + + Long id = entity.getId(); + if (id != null) { + stmt.bindLong(1, id); + } + + String uuid = entity.getUuid(); + if (uuid != null) { + stmt.bindString(2, uuid); + } + + String keywords = entity.getKeywords(); + if (keywords != null) { + stmt.bindString(3, keywords); + } + + String searchType = entity.getSearchType(); + if (searchType != null) { + stmt.bindString(4, searchType); + } + + String userId = entity.getUserId(); + if (userId != null) { + stmt.bindString(5, userId); + } + + String searchTime = entity.getSearchTime(); + if (searchTime != null) { + stmt.bindString(6, searchTime); + } + } + + @Override + public Long readKey(Cursor cursor, int offset) { + return cursor.isNull(offset + 0) ? null : cursor.getLong(offset + 0); + } + + @Override + public SearchHistoryBean readEntity(Cursor cursor, int offset) { + SearchHistoryBean entity = new SearchHistoryBean( // + cursor.isNull(offset + 0) ? null : cursor.getLong(offset + 0), // id + cursor.isNull(offset + 1) ? null : cursor.getString(offset + 1), // uuid + cursor.isNull(offset + 2) ? null : cursor.getString(offset + 2), // keywords + cursor.isNull(offset + 3) ? null : cursor.getString(offset + 3), // searchType + cursor.isNull(offset + 4) ? null : cursor.getString(offset + 4), // userId + cursor.isNull(offset + 5) ? null : cursor.getString(offset + 5) // searchTime + ); + return entity; + } + + @Override + public void readEntity(Cursor cursor, SearchHistoryBean entity, int offset) { + entity.setId(cursor.isNull(offset + 0) ? null : cursor.getLong(offset + 0)); + entity.setUuid(cursor.isNull(offset + 1) ? null : cursor.getString(offset + 1)); + entity.setKeywords(cursor.isNull(offset + 2) ? null : cursor.getString(offset + 2)); + entity.setSearchType(cursor.isNull(offset + 3) ? null : cursor.getString(offset + 3)); + entity.setUserId(cursor.isNull(offset + 4) ? null : cursor.getString(offset + 4)); + entity.setSearchTime(cursor.isNull(offset + 5) ? null : cursor.getString(offset + 5)); + } + + @Override + protected final Long updateKeyAfterInsert(SearchHistoryBean entity, long rowId) { + entity.setId(rowId); + return rowId; + } + + @Override + public Long getKey(SearchHistoryBean entity) { + if(entity != null) { + return entity.getId(); + } else { + return null; + } + } + + @Override + public boolean hasKey(SearchHistoryBean entity) { + return entity.getId() != null; + } + + @Override + protected final boolean isEntityUpdateable() { + return true; + } + +} diff --git a/app/src/main/java/com/casic/xz/meterage/utils/DataBaseManager.kt b/app/src/main/java/com/casic/xz/meterage/utils/DataBaseManager.kt new file mode 100644 index 0000000..52fe032 --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/utils/DataBaseManager.kt @@ -0,0 +1,45 @@ +package com.casic.xz.meterage.utils + +import com.casic.xz.meterage.base.BaseApplication +import com.casic.xz.meterage.bean.SearchHistoryBean +import com.casic.xz.meterage.greendao.SearchHistoryBeanDao +import com.pengxh.kt.lite.extensions.timestampToCompleteDate +import com.pengxh.kt.lite.utils.SaveKeyValues +import java.util.* + +class DataBaseManager private constructor() { + + companion object { + //Kotlin委托模式双重锁单例 + val get: DataBaseManager by lazy(mode = LazyThreadSafetyMode.SYNCHRONIZED) { + DataBaseManager() + } + } + + private val searchBeanDao by lazy { BaseApplication.get().getDaoSession().searchHistoryBeanDao } + private val userId by lazy { SaveKeyValues.getValue(LocaleConstant.USER_ID, "") } + + fun addSearchHistory(keywords: String, searchType: String) { + val bean = SearchHistoryBean() + bean.uuid = UUID.randomUUID().toString() + bean.keywords = keywords + bean.searchType = searchType + bean.userId = userId.toString() + bean.searchTime = System.currentTimeMillis().timestampToCompleteDate() + searchBeanDao.insert(bean) + } + + fun queryHistoryByType(searchType: String): MutableList { + return searchBeanDao.queryBuilder().where( + SearchHistoryBeanDao.Properties.UserId.eq(userId), + SearchHistoryBeanDao.Properties.SearchType.eq(searchType) + ).list() + } + + fun deleteHistoryByType(searchType: String) { + val list = queryHistoryByType(searchType) + list.forEach { + searchBeanDao.delete(it) + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/utils/LocaleConstant.kt b/app/src/main/java/com/casic/xz/meterage/utils/LocaleConstant.kt index cc2848b..2ea47a0 100644 --- a/app/src/main/java/com/casic/xz/meterage/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/xz/meterage/utils/LocaleConstant.kt @@ -62,4 +62,5 @@ const val File_SERVER_URL = "http://111.198.10.15:21408" const val ACCOUNT = "account" const val PASSWORD = "password" + const val USER_ID = "userId" } \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/utils/SearchType.kt b/app/src/main/java/com/casic/xz/meterage/utils/SearchType.kt new file mode 100644 index 0000000..5f5253e --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/utils/SearchType.kt @@ -0,0 +1,8 @@ +package com.casic.xz.meterage.utils + +object SearchType { + /** + * 搜索仪器设备 + * */ + const val Equipment = "0" +} diff --git a/app/src/main/java/com/casic/xz/meterage/view/MainActivity.kt b/app/src/main/java/com/casic/xz/meterage/view/MainActivity.kt index 28836e0..8fb0793 100644 --- a/app/src/main/java/com/casic/xz/meterage/view/MainActivity.kt +++ b/app/src/main/java/com/casic/xz/meterage/view/MainActivity.kt @@ -3,15 +3,19 @@ import android.view.KeyEvent import android.view.MenuItem import androidx.fragment.app.Fragment +import androidx.lifecycle.ViewModelProvider import androidx.viewpager.widget.ViewPager import com.casic.xz.meterage.R import com.casic.xz.meterage.adapter.ViewPagerAdapter import com.casic.xz.meterage.fragment.HomePageFragment import com.casic.xz.meterage.fragment.MinePageFragment import com.casic.xz.meterage.fragment.SamplePageFragment +import com.casic.xz.meterage.utils.LocaleConstant +import com.casic.xz.meterage.vm.UserViewModel import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.SaveKeyValues import kotlinx.android.synthetic.main.activity_main.* class MainActivity : KotlinBaseActivity() { @@ -20,53 +24,59 @@ private var fragmentPages: ArrayList = ArrayList() private var clickTime: Long = 0 - init { - fragmentPages.add(HomePageFragment()) - fragmentPages.add(SamplePageFragment()) - fragmentPages.add(MinePageFragment()) - } - override fun initData() { - bottomNavigation.itemIconTintList = null - bottomNavigation.setOnNavigationItemSelectedListener { menuItem -> - when (menuItem.itemId) { - R.id.nav_home -> { - mainViewPager.currentItem = 0 + val userViewModel = ViewModelProvider(this)[UserViewModel::class.java] + userViewModel.getUserInfo(SaveKeyValues.getValue(LocaleConstant.ACCOUNT, "") as String) + userViewModel.userInfo.observe(this) { + if (it.code == 200) { + SaveKeyValues.putValue(LocaleConstant.USER_ID, it.data.id) + + fragmentPages.add(HomePageFragment(it.data.id)) + fragmentPages.add(SamplePageFragment()) + fragmentPages.add(MinePageFragment()) + + bottomNavigation.itemIconTintList = null + bottomNavigation.setOnNavigationItemSelectedListener { menuItem -> + when (menuItem.itemId) { + R.id.nav_home -> { + mainViewPager.currentItem = 0 + } + R.id.nav_sample -> { + mainViewPager.currentItem = 1 + } + R.id.nav_mine -> { + mainViewPager.currentItem = 2 + } + } + false } - R.id.nav_sample -> { - mainViewPager.currentItem = 1 - } - R.id.nav_mine -> { - mainViewPager.currentItem = 2 - } + mainViewPager.adapter = ViewPagerAdapter(fragmentPages, supportFragmentManager) + mainViewPager.offscreenPageLimit = fragmentPages.size //缓存页数 + mainViewPager.addOnPageChangeListener(object : ViewPager.OnPageChangeListener { + override fun onPageScrollStateChanged(state: Int) { + + } + + override fun onPageScrolled( + position: Int, + positionOffset: Float, + positionOffsetPixels: Int + ) { + + } + + override fun onPageSelected(position: Int) { + if (menuItem != null) { + menuItem!!.isChecked = false + } else { + bottomNavigation.menu.getItem(0).isChecked = false + } + menuItem = bottomNavigation.menu.getItem(position) + menuItem!!.isChecked = true + } + }) } - false } - mainViewPager.adapter = ViewPagerAdapter(fragmentPages, supportFragmentManager) - mainViewPager.offscreenPageLimit = fragmentPages.size //缓存页数 - mainViewPager.addOnPageChangeListener(object : ViewPager.OnPageChangeListener { - override fun onPageScrollStateChanged(state: Int) { - - } - - override fun onPageScrolled( - position: Int, - positionOffset: Float, - positionOffsetPixels: Int - ) { - - } - - override fun onPageSelected(position: Int) { - if (menuItem != null) { - menuItem!!.isChecked = false - } else { - bottomNavigation.menu.getItem(0).isChecked = false - } - menuItem = bottomNavigation.menu.getItem(position) - menuItem!!.isChecked = true - } - }) } override fun initEvent() { diff --git a/app/src/main/java/com/casic/xz/meterage/view/search/SearchAllActivity.kt b/app/src/main/java/com/casic/xz/meterage/view/search/SearchAllActivity.kt new file mode 100644 index 0000000..ecc8fd7 --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/view/search/SearchAllActivity.kt @@ -0,0 +1,40 @@ +package com.casic.xz.meterage.view.search + +import com.casic.xz.meterage.R +import com.casic.xz.meterage.extensions.initLayoutImmersionBar +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.navigatePageTo +import kotlinx.android.synthetic.main.activity_search_all.* +import kotlinx.android.synthetic.main.include_search_input_title.* + +class SearchAllActivity : KotlinBaseActivity() { + + override fun initData() { + + } + + override fun initEvent() { + leftBackView.setOnClickListener { finish() } + searchTextView.setOnClickListener { + navigatePageTo(inputView.text.toString()) + } + } + + override fun initLayoutView(): Int = R.layout.activity_search_all + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + initLayoutImmersionBar(rootView) + inputView.hint = "查询样品、业务" + } + + override fun onResume() { + super.onResume() + //TODO 流式布局显示查询记录Tag? + } +} \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index 298f687..e142ec1 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -3,6 +3,7 @@ apply plugin: 'com.android.application' apply plugin: 'kotlin-android' apply plugin: 'kotlin-android-extensions' +apply plugin: 'org.greenrobot.greendao' android { signingConfigs { @@ -57,6 +58,12 @@ outputFileName = "XZJL_" + getBuildDate() + "_Beta.apk" } } + + greendao { + schemaVersion 1//数据库版本号 + targetGenDir 'src/main/java'//设置DaoMaster、DaoSession、Dao目录 + daoPackage 'com.casic.xz.meterage.greendao'//设置DaoMaster、DaoSession、Dao包名 + } } static def getBuildDate() { @@ -67,7 +74,7 @@ dependencies { //基础依赖库 implementation 'com.github.AndroidCoderPeng:Kotlin-lite-lib:1.0.4' - implementation 'androidx.appcompat:appcompat:1.5.1' + implementation 'androidx.appcompat:appcompat:1.6.1' implementation 'androidx.core:core-ktx:1.9.0' //Google官方授权框架 implementation 'pub.devrel:easypermissions:3.0.0' @@ -113,4 +120,6 @@ implementation 'com.github.tiann:FreeReflection:3.1.0' //单项/数字、二三级联动、日期/时间等滚轮选择器 implementation 'com.github.gzu-liyujiang.AndroidPicker:WheelPicker:4.1.8' + //数据库框架 + implementation 'org.greenrobot:greendao:3.3.0' } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 972eff9..5b6f9b2 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -69,6 +69,8 @@ + + diff --git a/app/src/main/java/com/casic/xz/meterage/base/BaseApplication.kt b/app/src/main/java/com/casic/xz/meterage/base/BaseApplication.kt index 14a604d..1684c23 100644 --- a/app/src/main/java/com/casic/xz/meterage/base/BaseApplication.kt +++ b/app/src/main/java/com/casic/xz/meterage/base/BaseApplication.kt @@ -2,6 +2,8 @@ import android.app.Application import android.content.Context +import com.casic.xz.meterage.greendao.DaoMaster +import com.casic.xz.meterage.greendao.DaoSession import com.pengxh.kt.lite.utils.SaveKeyValues import me.weishu.reflection.Reflection import kotlin.properties.Delegates @@ -12,12 +14,22 @@ private var application: BaseApplication by Delegates.notNull() fun get() = application + + private lateinit var daoSession: DaoSession } override fun onCreate() { super.onCreate() application = this SaveKeyValues.initSharedPreferences(this) + + val devOpenHelper = DaoMaster.DevOpenHelper(this, "Meterage.db", null) + val daoMaster = DaoMaster(devOpenHelper.writableDatabase) + daoSession = daoMaster.newSession() + } + + fun getDaoSession(): DaoSession { + return daoSession } //绕过Android 11以上反射限制 diff --git a/app/src/main/java/com/casic/xz/meterage/bean/SearchHistoryBean.java b/app/src/main/java/com/casic/xz/meterage/bean/SearchHistoryBean.java new file mode 100644 index 0000000..6a46a3a --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/bean/SearchHistoryBean.java @@ -0,0 +1,82 @@ +package com.casic.xz.meterage.bean; + +import org.greenrobot.greendao.annotation.Entity; +import org.greenrobot.greendao.annotation.Generated; +import org.greenrobot.greendao.annotation.Id; +import org.greenrobot.greendao.annotation.Unique; + +@Entity +public class SearchHistoryBean { + @Id(autoincrement = true) + private Long id;//主键自增 + + @Unique + private String uuid; + private String keywords;//查询条件-关键字 + private String searchType;//查询类型 + private String userId;//用户Id + private String searchTime;//查询的时间 + + @Generated(hash = 2130561778) + public SearchHistoryBean(Long id, String uuid, String keywords, + String searchType, String userId, String searchTime) { + this.id = id; + this.uuid = uuid; + this.keywords = keywords; + this.searchType = searchType; + this.userId = userId; + this.searchTime = searchTime; + } + + @Generated(hash = 1570282321) + public SearchHistoryBean() { + } + + public Long getId() { + return this.id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getUuid() { + return this.uuid; + } + + public void setUuid(String uuid) { + this.uuid = uuid; + } + + public String getKeywords() { + return this.keywords; + } + + public void setKeywords(String keywords) { + this.keywords = keywords; + } + + public String getSearchType() { + return this.searchType; + } + + public void setSearchType(String searchType) { + this.searchType = searchType; + } + + public String getUserId() { + return this.userId; + } + + public void setUserId(String userId) { + this.userId = userId; + } + + public String getSearchTime() { + return this.searchTime; + } + + public void setSearchTime(String searchTime) { + this.searchTime = searchTime; + } +} diff --git a/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt index 151f951..ae7f5e4 100644 --- a/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt +++ b/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt @@ -15,22 +15,20 @@ import com.casic.xz.meterage.extensions.showEmptyPage import com.casic.xz.meterage.model.NoticeListModel import com.casic.xz.meterage.model.RemindListModel -import com.casic.xz.meterage.model.UserInfoModel import com.casic.xz.meterage.utils.LoadingDialogHub import com.casic.xz.meterage.utils.LocaleConstant import com.casic.xz.meterage.utils.QrConfigCreator import com.casic.xz.meterage.view.home.* import com.casic.xz.meterage.view.notice.NoticeListActivity +import com.casic.xz.meterage.view.search.SearchAllActivity import com.casic.xz.meterage.vm.MeterageTrainViewModel import com.casic.xz.meterage.vm.NoticeViewModel -import com.casic.xz.meterage.vm.UserViewModel import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter import com.pengxh.kt.lite.adapter.ViewHolder import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.convertColor import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show -import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.utils.WeakReferenceHandler import com.pengxh.kt.lite.vm.LoadState import com.pengxh.kt.lite.widget.dialog.AlertControlDialog @@ -39,13 +37,12 @@ import kotlinx.android.synthetic.main.include_empty_view.* import java.util.* -class HomePageFragment : KotlinBaseFragment() { +class HomePageFragment(private val userId: String) : KotlinBaseFragment() { private val timer = object : Timer() {} private lateinit var weakReferenceHandler: WeakReferenceHandler private lateinit var meterageTrainViewModel: MeterageTrainViewModel private lateinit var noticeViewModel: NoticeViewModel - private lateinit var userData: UserInfoModel.DataModel private lateinit var remindAdapter: NormalRecyclerAdapter private var dataBeans: MutableList = ArrayList() private var noticeBeans: MutableList = ArrayList() @@ -170,14 +167,6 @@ true } - val userViewModel = ViewModelProvider(this)[UserViewModel::class.java] - userViewModel.getUserInfo(SaveKeyValues.getValue(LocaleConstant.ACCOUNT, "") as String) - userViewModel.userInfo.observe(this) { - if (it.code == 200) { - userData = it.data - } - } - meterageTrainViewModel = ViewModelProvider(this)[MeterageTrainViewModel::class.java] meterageTrainViewModel.signInResult.observe(this) { if (it.code == 200) { @@ -296,10 +285,14 @@ } override fun initEvent() { + searchBar.setOnClickListener { + requireContext().navigatePageTo() + } + scanCodeView.setOnClickListener { qrManager.startScan(requireActivity()) { result -> if (result.content.isDigitsOnly()) { - meterageTrainViewModel.signIn(userData.id, result.content) + meterageTrainViewModel.signIn(userId, result.content) } else { "签到二维码错误,请重新扫描".show(requireContext()) } diff --git a/app/src/main/java/com/casic/xz/meterage/greendao/DaoMaster.java b/app/src/main/java/com/casic/xz/meterage/greendao/DaoMaster.java new file mode 100644 index 0000000..d714ce2 --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/greendao/DaoMaster.java @@ -0,0 +1,96 @@ +package com.casic.xz.meterage.greendao; + +import android.content.Context; +import android.database.sqlite.SQLiteDatabase; +import android.database.sqlite.SQLiteDatabase.CursorFactory; +import android.util.Log; + +import org.greenrobot.greendao.AbstractDaoMaster; +import org.greenrobot.greendao.database.Database; +import org.greenrobot.greendao.database.DatabaseOpenHelper; +import org.greenrobot.greendao.database.StandardDatabase; +import org.greenrobot.greendao.identityscope.IdentityScopeType; + + +// THIS CODE IS GENERATED BY greenDAO, DO NOT EDIT. +/** + * Master of DAO (schema version 1): knows all DAOs. + */ +public class DaoMaster extends AbstractDaoMaster { + public static final int SCHEMA_VERSION = 1; + + /** Creates underlying database table using DAOs. */ + public static void createAllTables(Database db, boolean ifNotExists) { + SearchHistoryBeanDao.createTable(db, ifNotExists); + } + + /** Drops underlying database table using DAOs. */ + public static void dropAllTables(Database db, boolean ifExists) { + SearchHistoryBeanDao.dropTable(db, ifExists); + } + + /** + * WARNING: Drops all table on Upgrade! Use only during development. + * Convenience method using a {@link DevOpenHelper}. + */ + public static DaoSession newDevSession(Context context, String name) { + Database db = new DevOpenHelper(context, name).getWritableDb(); + DaoMaster daoMaster = new DaoMaster(db); + return daoMaster.newSession(); + } + + public DaoMaster(SQLiteDatabase db) { + this(new StandardDatabase(db)); + } + + public DaoMaster(Database db) { + super(db, SCHEMA_VERSION); + registerDaoClass(SearchHistoryBeanDao.class); + } + + public DaoSession newSession() { + return new DaoSession(db, IdentityScopeType.Session, daoConfigMap); + } + + public DaoSession newSession(IdentityScopeType type) { + return new DaoSession(db, type, daoConfigMap); + } + + /** + * Calls {@link #createAllTables(Database, boolean)} in {@link #onCreate(Database)} - + */ + public static abstract class OpenHelper extends DatabaseOpenHelper { + public OpenHelper(Context context, String name) { + super(context, name, SCHEMA_VERSION); + } + + public OpenHelper(Context context, String name, CursorFactory factory) { + super(context, name, factory, SCHEMA_VERSION); + } + + @Override + public void onCreate(Database db) { + Log.i("greenDAO", "Creating tables for schema version " + SCHEMA_VERSION); + createAllTables(db, false); + } + } + + /** WARNING: Drops all table on Upgrade! Use only during development. */ + public static class DevOpenHelper extends OpenHelper { + public DevOpenHelper(Context context, String name) { + super(context, name); + } + + public DevOpenHelper(Context context, String name, CursorFactory factory) { + super(context, name, factory); + } + + @Override + public void onUpgrade(Database db, int oldVersion, int newVersion) { + Log.i("greenDAO", "Upgrading schema from version " + oldVersion + " to " + newVersion + " by dropping all tables"); + dropAllTables(db, true); + onCreate(db); + } + } + +} diff --git a/app/src/main/java/com/casic/xz/meterage/greendao/DaoSession.java b/app/src/main/java/com/casic/xz/meterage/greendao/DaoSession.java new file mode 100644 index 0000000..0e80024 --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/greendao/DaoSession.java @@ -0,0 +1,46 @@ +package com.casic.xz.meterage.greendao; + +import com.casic.xz.meterage.bean.SearchHistoryBean; + +import org.greenrobot.greendao.AbstractDao; +import org.greenrobot.greendao.AbstractDaoSession; +import org.greenrobot.greendao.database.Database; +import org.greenrobot.greendao.identityscope.IdentityScopeType; +import org.greenrobot.greendao.internal.DaoConfig; + +import java.util.Map; + +// THIS CODE IS GENERATED BY greenDAO, DO NOT EDIT. + +/** + * {@inheritDoc} + * + * @see org.greenrobot.greendao.AbstractDaoSession + */ +public class DaoSession extends AbstractDaoSession { + + private final DaoConfig searchHistoryBeanDaoConfig; + + private final SearchHistoryBeanDao searchHistoryBeanDao; + + public DaoSession(Database db, IdentityScopeType type, Map>, DaoConfig> + daoConfigMap) { + super(db); + + searchHistoryBeanDaoConfig = daoConfigMap.get(SearchHistoryBeanDao.class).clone(); + searchHistoryBeanDaoConfig.initIdentityScope(type); + + searchHistoryBeanDao = new SearchHistoryBeanDao(searchHistoryBeanDaoConfig, this); + + registerDao(SearchHistoryBean.class, searchHistoryBeanDao); + } + + public void clear() { + searchHistoryBeanDaoConfig.clearIdentityScope(); + } + + public SearchHistoryBeanDao getSearchHistoryBeanDao() { + return searchHistoryBeanDao; + } + +} diff --git a/app/src/main/java/com/casic/xz/meterage/greendao/SearchHistoryBeanDao.java b/app/src/main/java/com/casic/xz/meterage/greendao/SearchHistoryBeanDao.java new file mode 100644 index 0000000..5923d02 --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/greendao/SearchHistoryBeanDao.java @@ -0,0 +1,185 @@ +package com.casic.xz.meterage.greendao; + +import android.database.Cursor; +import android.database.sqlite.SQLiteStatement; + +import com.casic.xz.meterage.bean.SearchHistoryBean; + +import org.greenrobot.greendao.AbstractDao; +import org.greenrobot.greendao.Property; +import org.greenrobot.greendao.database.Database; +import org.greenrobot.greendao.database.DatabaseStatement; +import org.greenrobot.greendao.internal.DaoConfig; + +// THIS CODE IS GENERATED BY greenDAO, DO NOT EDIT. +/** + * DAO for table "SEARCH_HISTORY_BEAN". +*/ +public class SearchHistoryBeanDao extends AbstractDao { + + public static final String TABLENAME = "SEARCH_HISTORY_BEAN"; + + /** + * Properties of entity SearchHistoryBean.
+ * Can be used for QueryBuilder and for referencing column names. + */ + public static class Properties { + public final static Property Id = new Property(0, Long.class, "id", true, "_id"); + public final static Property Uuid = new Property(1, String.class, "uuid", false, "UUID"); + public final static Property Keywords = new Property(2, String.class, "keywords", false, "KEYWORDS"); + public final static Property SearchType = new Property(3, String.class, "searchType", false, "SEARCH_TYPE"); + public final static Property UserId = new Property(4, String.class, "userId", false, "USER_ID"); + public final static Property SearchTime = new Property(5, String.class, "searchTime", false, "SEARCH_TIME"); + } + + + public SearchHistoryBeanDao(DaoConfig config) { + super(config); + } + + public SearchHistoryBeanDao(DaoConfig config, DaoSession daoSession) { + super(config, daoSession); + } + + /** Creates the underlying database table. */ + public static void createTable(Database db, boolean ifNotExists) { + String constraint = ifNotExists? "IF NOT EXISTS ": ""; + db.execSQL("CREATE TABLE " + constraint + "\"SEARCH_HISTORY_BEAN\" (" + // + "\"_id\" INTEGER PRIMARY KEY AUTOINCREMENT ," + // 0: id + "\"UUID\" TEXT UNIQUE ," + // 1: uuid + "\"KEYWORDS\" TEXT," + // 2: keywords + "\"SEARCH_TYPE\" TEXT," + // 3: searchType + "\"USER_ID\" TEXT," + // 4: userId + "\"SEARCH_TIME\" TEXT);"); // 5: searchTime + } + + /** Drops the underlying database table. */ + public static void dropTable(Database db, boolean ifExists) { + String sql = "DROP TABLE " + (ifExists ? "IF EXISTS " : "") + "\"SEARCH_HISTORY_BEAN\""; + db.execSQL(sql); + } + + @Override + protected final void bindValues(DatabaseStatement stmt, SearchHistoryBean entity) { + stmt.clearBindings(); + + Long id = entity.getId(); + if (id != null) { + stmt.bindLong(1, id); + } + + String uuid = entity.getUuid(); + if (uuid != null) { + stmt.bindString(2, uuid); + } + + String keywords = entity.getKeywords(); + if (keywords != null) { + stmt.bindString(3, keywords); + } + + String searchType = entity.getSearchType(); + if (searchType != null) { + stmt.bindString(4, searchType); + } + + String userId = entity.getUserId(); + if (userId != null) { + stmt.bindString(5, userId); + } + + String searchTime = entity.getSearchTime(); + if (searchTime != null) { + stmt.bindString(6, searchTime); + } + } + + @Override + protected final void bindValues(SQLiteStatement stmt, SearchHistoryBean entity) { + stmt.clearBindings(); + + Long id = entity.getId(); + if (id != null) { + stmt.bindLong(1, id); + } + + String uuid = entity.getUuid(); + if (uuid != null) { + stmt.bindString(2, uuid); + } + + String keywords = entity.getKeywords(); + if (keywords != null) { + stmt.bindString(3, keywords); + } + + String searchType = entity.getSearchType(); + if (searchType != null) { + stmt.bindString(4, searchType); + } + + String userId = entity.getUserId(); + if (userId != null) { + stmt.bindString(5, userId); + } + + String searchTime = entity.getSearchTime(); + if (searchTime != null) { + stmt.bindString(6, searchTime); + } + } + + @Override + public Long readKey(Cursor cursor, int offset) { + return cursor.isNull(offset + 0) ? null : cursor.getLong(offset + 0); + } + + @Override + public SearchHistoryBean readEntity(Cursor cursor, int offset) { + SearchHistoryBean entity = new SearchHistoryBean( // + cursor.isNull(offset + 0) ? null : cursor.getLong(offset + 0), // id + cursor.isNull(offset + 1) ? null : cursor.getString(offset + 1), // uuid + cursor.isNull(offset + 2) ? null : cursor.getString(offset + 2), // keywords + cursor.isNull(offset + 3) ? null : cursor.getString(offset + 3), // searchType + cursor.isNull(offset + 4) ? null : cursor.getString(offset + 4), // userId + cursor.isNull(offset + 5) ? null : cursor.getString(offset + 5) // searchTime + ); + return entity; + } + + @Override + public void readEntity(Cursor cursor, SearchHistoryBean entity, int offset) { + entity.setId(cursor.isNull(offset + 0) ? null : cursor.getLong(offset + 0)); + entity.setUuid(cursor.isNull(offset + 1) ? null : cursor.getString(offset + 1)); + entity.setKeywords(cursor.isNull(offset + 2) ? null : cursor.getString(offset + 2)); + entity.setSearchType(cursor.isNull(offset + 3) ? null : cursor.getString(offset + 3)); + entity.setUserId(cursor.isNull(offset + 4) ? null : cursor.getString(offset + 4)); + entity.setSearchTime(cursor.isNull(offset + 5) ? null : cursor.getString(offset + 5)); + } + + @Override + protected final Long updateKeyAfterInsert(SearchHistoryBean entity, long rowId) { + entity.setId(rowId); + return rowId; + } + + @Override + public Long getKey(SearchHistoryBean entity) { + if(entity != null) { + return entity.getId(); + } else { + return null; + } + } + + @Override + public boolean hasKey(SearchHistoryBean entity) { + return entity.getId() != null; + } + + @Override + protected final boolean isEntityUpdateable() { + return true; + } + +} diff --git a/app/src/main/java/com/casic/xz/meterage/utils/DataBaseManager.kt b/app/src/main/java/com/casic/xz/meterage/utils/DataBaseManager.kt new file mode 100644 index 0000000..52fe032 --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/utils/DataBaseManager.kt @@ -0,0 +1,45 @@ +package com.casic.xz.meterage.utils + +import com.casic.xz.meterage.base.BaseApplication +import com.casic.xz.meterage.bean.SearchHistoryBean +import com.casic.xz.meterage.greendao.SearchHistoryBeanDao +import com.pengxh.kt.lite.extensions.timestampToCompleteDate +import com.pengxh.kt.lite.utils.SaveKeyValues +import java.util.* + +class DataBaseManager private constructor() { + + companion object { + //Kotlin委托模式双重锁单例 + val get: DataBaseManager by lazy(mode = LazyThreadSafetyMode.SYNCHRONIZED) { + DataBaseManager() + } + } + + private val searchBeanDao by lazy { BaseApplication.get().getDaoSession().searchHistoryBeanDao } + private val userId by lazy { SaveKeyValues.getValue(LocaleConstant.USER_ID, "") } + + fun addSearchHistory(keywords: String, searchType: String) { + val bean = SearchHistoryBean() + bean.uuid = UUID.randomUUID().toString() + bean.keywords = keywords + bean.searchType = searchType + bean.userId = userId.toString() + bean.searchTime = System.currentTimeMillis().timestampToCompleteDate() + searchBeanDao.insert(bean) + } + + fun queryHistoryByType(searchType: String): MutableList { + return searchBeanDao.queryBuilder().where( + SearchHistoryBeanDao.Properties.UserId.eq(userId), + SearchHistoryBeanDao.Properties.SearchType.eq(searchType) + ).list() + } + + fun deleteHistoryByType(searchType: String) { + val list = queryHistoryByType(searchType) + list.forEach { + searchBeanDao.delete(it) + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/utils/LocaleConstant.kt b/app/src/main/java/com/casic/xz/meterage/utils/LocaleConstant.kt index cc2848b..2ea47a0 100644 --- a/app/src/main/java/com/casic/xz/meterage/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/xz/meterage/utils/LocaleConstant.kt @@ -62,4 +62,5 @@ const val File_SERVER_URL = "http://111.198.10.15:21408" const val ACCOUNT = "account" const val PASSWORD = "password" + const val USER_ID = "userId" } \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/utils/SearchType.kt b/app/src/main/java/com/casic/xz/meterage/utils/SearchType.kt new file mode 100644 index 0000000..5f5253e --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/utils/SearchType.kt @@ -0,0 +1,8 @@ +package com.casic.xz.meterage.utils + +object SearchType { + /** + * 搜索仪器设备 + * */ + const val Equipment = "0" +} diff --git a/app/src/main/java/com/casic/xz/meterage/view/MainActivity.kt b/app/src/main/java/com/casic/xz/meterage/view/MainActivity.kt index 28836e0..8fb0793 100644 --- a/app/src/main/java/com/casic/xz/meterage/view/MainActivity.kt +++ b/app/src/main/java/com/casic/xz/meterage/view/MainActivity.kt @@ -3,15 +3,19 @@ import android.view.KeyEvent import android.view.MenuItem import androidx.fragment.app.Fragment +import androidx.lifecycle.ViewModelProvider import androidx.viewpager.widget.ViewPager import com.casic.xz.meterage.R import com.casic.xz.meterage.adapter.ViewPagerAdapter import com.casic.xz.meterage.fragment.HomePageFragment import com.casic.xz.meterage.fragment.MinePageFragment import com.casic.xz.meterage.fragment.SamplePageFragment +import com.casic.xz.meterage.utils.LocaleConstant +import com.casic.xz.meterage.vm.UserViewModel import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.SaveKeyValues import kotlinx.android.synthetic.main.activity_main.* class MainActivity : KotlinBaseActivity() { @@ -20,53 +24,59 @@ private var fragmentPages: ArrayList = ArrayList() private var clickTime: Long = 0 - init { - fragmentPages.add(HomePageFragment()) - fragmentPages.add(SamplePageFragment()) - fragmentPages.add(MinePageFragment()) - } - override fun initData() { - bottomNavigation.itemIconTintList = null - bottomNavigation.setOnNavigationItemSelectedListener { menuItem -> - when (menuItem.itemId) { - R.id.nav_home -> { - mainViewPager.currentItem = 0 + val userViewModel = ViewModelProvider(this)[UserViewModel::class.java] + userViewModel.getUserInfo(SaveKeyValues.getValue(LocaleConstant.ACCOUNT, "") as String) + userViewModel.userInfo.observe(this) { + if (it.code == 200) { + SaveKeyValues.putValue(LocaleConstant.USER_ID, it.data.id) + + fragmentPages.add(HomePageFragment(it.data.id)) + fragmentPages.add(SamplePageFragment()) + fragmentPages.add(MinePageFragment()) + + bottomNavigation.itemIconTintList = null + bottomNavigation.setOnNavigationItemSelectedListener { menuItem -> + when (menuItem.itemId) { + R.id.nav_home -> { + mainViewPager.currentItem = 0 + } + R.id.nav_sample -> { + mainViewPager.currentItem = 1 + } + R.id.nav_mine -> { + mainViewPager.currentItem = 2 + } + } + false } - R.id.nav_sample -> { - mainViewPager.currentItem = 1 - } - R.id.nav_mine -> { - mainViewPager.currentItem = 2 - } + mainViewPager.adapter = ViewPagerAdapter(fragmentPages, supportFragmentManager) + mainViewPager.offscreenPageLimit = fragmentPages.size //缓存页数 + mainViewPager.addOnPageChangeListener(object : ViewPager.OnPageChangeListener { + override fun onPageScrollStateChanged(state: Int) { + + } + + override fun onPageScrolled( + position: Int, + positionOffset: Float, + positionOffsetPixels: Int + ) { + + } + + override fun onPageSelected(position: Int) { + if (menuItem != null) { + menuItem!!.isChecked = false + } else { + bottomNavigation.menu.getItem(0).isChecked = false + } + menuItem = bottomNavigation.menu.getItem(position) + menuItem!!.isChecked = true + } + }) } - false } - mainViewPager.adapter = ViewPagerAdapter(fragmentPages, supportFragmentManager) - mainViewPager.offscreenPageLimit = fragmentPages.size //缓存页数 - mainViewPager.addOnPageChangeListener(object : ViewPager.OnPageChangeListener { - override fun onPageScrollStateChanged(state: Int) { - - } - - override fun onPageScrolled( - position: Int, - positionOffset: Float, - positionOffsetPixels: Int - ) { - - } - - override fun onPageSelected(position: Int) { - if (menuItem != null) { - menuItem!!.isChecked = false - } else { - bottomNavigation.menu.getItem(0).isChecked = false - } - menuItem = bottomNavigation.menu.getItem(position) - menuItem!!.isChecked = true - } - }) } override fun initEvent() { diff --git a/app/src/main/java/com/casic/xz/meterage/view/search/SearchAllActivity.kt b/app/src/main/java/com/casic/xz/meterage/view/search/SearchAllActivity.kt new file mode 100644 index 0000000..ecc8fd7 --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/view/search/SearchAllActivity.kt @@ -0,0 +1,40 @@ +package com.casic.xz.meterage.view.search + +import com.casic.xz.meterage.R +import com.casic.xz.meterage.extensions.initLayoutImmersionBar +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.navigatePageTo +import kotlinx.android.synthetic.main.activity_search_all.* +import kotlinx.android.synthetic.main.include_search_input_title.* + +class SearchAllActivity : KotlinBaseActivity() { + + override fun initData() { + + } + + override fun initEvent() { + leftBackView.setOnClickListener { finish() } + searchTextView.setOnClickListener { + navigatePageTo(inputView.text.toString()) + } + } + + override fun initLayoutView(): Int = R.layout.activity_search_all + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + initLayoutImmersionBar(rootView) + inputView.hint = "查询样品、业务" + } + + override fun onResume() { + super.onResume() + //TODO 流式布局显示查询记录Tag? + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/view/search/SearchAllResultActivity.kt b/app/src/main/java/com/casic/xz/meterage/view/search/SearchAllResultActivity.kt new file mode 100644 index 0000000..adbb570 --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/view/search/SearchAllResultActivity.kt @@ -0,0 +1,34 @@ +package com.casic.xz.meterage.view.search + +import com.casic.xz.meterage.R +import com.casic.xz.meterage.extensions.initLayoutImmersionBar +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.utils.Constant +import kotlinx.android.synthetic.main.activity_search_all_reasult.* +import kotlinx.android.synthetic.main.include_search_title.* + +class SearchAllResultActivity : KotlinBaseActivity() { + + private lateinit var param: String + + override fun initData() { + param = intent.getStringExtra(Constant.INTENT_PARAM)!! + } + + override fun initEvent() { + leftBackView.setOnClickListener { finish() } + } + + override fun initLayoutView(): Int = R.layout.activity_search_all_reasult + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + initLayoutImmersionBar(rootView) + titleView.text = "查询结果" + } +} \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index 298f687..e142ec1 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -3,6 +3,7 @@ apply plugin: 'com.android.application' apply plugin: 'kotlin-android' apply plugin: 'kotlin-android-extensions' +apply plugin: 'org.greenrobot.greendao' android { signingConfigs { @@ -57,6 +58,12 @@ outputFileName = "XZJL_" + getBuildDate() + "_Beta.apk" } } + + greendao { + schemaVersion 1//数据库版本号 + targetGenDir 'src/main/java'//设置DaoMaster、DaoSession、Dao目录 + daoPackage 'com.casic.xz.meterage.greendao'//设置DaoMaster、DaoSession、Dao包名 + } } static def getBuildDate() { @@ -67,7 +74,7 @@ dependencies { //基础依赖库 implementation 'com.github.AndroidCoderPeng:Kotlin-lite-lib:1.0.4' - implementation 'androidx.appcompat:appcompat:1.5.1' + implementation 'androidx.appcompat:appcompat:1.6.1' implementation 'androidx.core:core-ktx:1.9.0' //Google官方授权框架 implementation 'pub.devrel:easypermissions:3.0.0' @@ -113,4 +120,6 @@ implementation 'com.github.tiann:FreeReflection:3.1.0' //单项/数字、二三级联动、日期/时间等滚轮选择器 implementation 'com.github.gzu-liyujiang.AndroidPicker:WheelPicker:4.1.8' + //数据库框架 + implementation 'org.greenrobot:greendao:3.3.0' } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 972eff9..5b6f9b2 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -69,6 +69,8 @@ + + diff --git a/app/src/main/java/com/casic/xz/meterage/base/BaseApplication.kt b/app/src/main/java/com/casic/xz/meterage/base/BaseApplication.kt index 14a604d..1684c23 100644 --- a/app/src/main/java/com/casic/xz/meterage/base/BaseApplication.kt +++ b/app/src/main/java/com/casic/xz/meterage/base/BaseApplication.kt @@ -2,6 +2,8 @@ import android.app.Application import android.content.Context +import com.casic.xz.meterage.greendao.DaoMaster +import com.casic.xz.meterage.greendao.DaoSession import com.pengxh.kt.lite.utils.SaveKeyValues import me.weishu.reflection.Reflection import kotlin.properties.Delegates @@ -12,12 +14,22 @@ private var application: BaseApplication by Delegates.notNull() fun get() = application + + private lateinit var daoSession: DaoSession } override fun onCreate() { super.onCreate() application = this SaveKeyValues.initSharedPreferences(this) + + val devOpenHelper = DaoMaster.DevOpenHelper(this, "Meterage.db", null) + val daoMaster = DaoMaster(devOpenHelper.writableDatabase) + daoSession = daoMaster.newSession() + } + + fun getDaoSession(): DaoSession { + return daoSession } //绕过Android 11以上反射限制 diff --git a/app/src/main/java/com/casic/xz/meterage/bean/SearchHistoryBean.java b/app/src/main/java/com/casic/xz/meterage/bean/SearchHistoryBean.java new file mode 100644 index 0000000..6a46a3a --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/bean/SearchHistoryBean.java @@ -0,0 +1,82 @@ +package com.casic.xz.meterage.bean; + +import org.greenrobot.greendao.annotation.Entity; +import org.greenrobot.greendao.annotation.Generated; +import org.greenrobot.greendao.annotation.Id; +import org.greenrobot.greendao.annotation.Unique; + +@Entity +public class SearchHistoryBean { + @Id(autoincrement = true) + private Long id;//主键自增 + + @Unique + private String uuid; + private String keywords;//查询条件-关键字 + private String searchType;//查询类型 + private String userId;//用户Id + private String searchTime;//查询的时间 + + @Generated(hash = 2130561778) + public SearchHistoryBean(Long id, String uuid, String keywords, + String searchType, String userId, String searchTime) { + this.id = id; + this.uuid = uuid; + this.keywords = keywords; + this.searchType = searchType; + this.userId = userId; + this.searchTime = searchTime; + } + + @Generated(hash = 1570282321) + public SearchHistoryBean() { + } + + public Long getId() { + return this.id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getUuid() { + return this.uuid; + } + + public void setUuid(String uuid) { + this.uuid = uuid; + } + + public String getKeywords() { + return this.keywords; + } + + public void setKeywords(String keywords) { + this.keywords = keywords; + } + + public String getSearchType() { + return this.searchType; + } + + public void setSearchType(String searchType) { + this.searchType = searchType; + } + + public String getUserId() { + return this.userId; + } + + public void setUserId(String userId) { + this.userId = userId; + } + + public String getSearchTime() { + return this.searchTime; + } + + public void setSearchTime(String searchTime) { + this.searchTime = searchTime; + } +} diff --git a/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt index 151f951..ae7f5e4 100644 --- a/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt +++ b/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt @@ -15,22 +15,20 @@ import com.casic.xz.meterage.extensions.showEmptyPage import com.casic.xz.meterage.model.NoticeListModel import com.casic.xz.meterage.model.RemindListModel -import com.casic.xz.meterage.model.UserInfoModel import com.casic.xz.meterage.utils.LoadingDialogHub import com.casic.xz.meterage.utils.LocaleConstant import com.casic.xz.meterage.utils.QrConfigCreator import com.casic.xz.meterage.view.home.* import com.casic.xz.meterage.view.notice.NoticeListActivity +import com.casic.xz.meterage.view.search.SearchAllActivity import com.casic.xz.meterage.vm.MeterageTrainViewModel import com.casic.xz.meterage.vm.NoticeViewModel -import com.casic.xz.meterage.vm.UserViewModel import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter import com.pengxh.kt.lite.adapter.ViewHolder import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.convertColor import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show -import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.utils.WeakReferenceHandler import com.pengxh.kt.lite.vm.LoadState import com.pengxh.kt.lite.widget.dialog.AlertControlDialog @@ -39,13 +37,12 @@ import kotlinx.android.synthetic.main.include_empty_view.* import java.util.* -class HomePageFragment : KotlinBaseFragment() { +class HomePageFragment(private val userId: String) : KotlinBaseFragment() { private val timer = object : Timer() {} private lateinit var weakReferenceHandler: WeakReferenceHandler private lateinit var meterageTrainViewModel: MeterageTrainViewModel private lateinit var noticeViewModel: NoticeViewModel - private lateinit var userData: UserInfoModel.DataModel private lateinit var remindAdapter: NormalRecyclerAdapter private var dataBeans: MutableList = ArrayList() private var noticeBeans: MutableList = ArrayList() @@ -170,14 +167,6 @@ true } - val userViewModel = ViewModelProvider(this)[UserViewModel::class.java] - userViewModel.getUserInfo(SaveKeyValues.getValue(LocaleConstant.ACCOUNT, "") as String) - userViewModel.userInfo.observe(this) { - if (it.code == 200) { - userData = it.data - } - } - meterageTrainViewModel = ViewModelProvider(this)[MeterageTrainViewModel::class.java] meterageTrainViewModel.signInResult.observe(this) { if (it.code == 200) { @@ -296,10 +285,14 @@ } override fun initEvent() { + searchBar.setOnClickListener { + requireContext().navigatePageTo() + } + scanCodeView.setOnClickListener { qrManager.startScan(requireActivity()) { result -> if (result.content.isDigitsOnly()) { - meterageTrainViewModel.signIn(userData.id, result.content) + meterageTrainViewModel.signIn(userId, result.content) } else { "签到二维码错误,请重新扫描".show(requireContext()) } diff --git a/app/src/main/java/com/casic/xz/meterage/greendao/DaoMaster.java b/app/src/main/java/com/casic/xz/meterage/greendao/DaoMaster.java new file mode 100644 index 0000000..d714ce2 --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/greendao/DaoMaster.java @@ -0,0 +1,96 @@ +package com.casic.xz.meterage.greendao; + +import android.content.Context; +import android.database.sqlite.SQLiteDatabase; +import android.database.sqlite.SQLiteDatabase.CursorFactory; +import android.util.Log; + +import org.greenrobot.greendao.AbstractDaoMaster; +import org.greenrobot.greendao.database.Database; +import org.greenrobot.greendao.database.DatabaseOpenHelper; +import org.greenrobot.greendao.database.StandardDatabase; +import org.greenrobot.greendao.identityscope.IdentityScopeType; + + +// THIS CODE IS GENERATED BY greenDAO, DO NOT EDIT. +/** + * Master of DAO (schema version 1): knows all DAOs. + */ +public class DaoMaster extends AbstractDaoMaster { + public static final int SCHEMA_VERSION = 1; + + /** Creates underlying database table using DAOs. */ + public static void createAllTables(Database db, boolean ifNotExists) { + SearchHistoryBeanDao.createTable(db, ifNotExists); + } + + /** Drops underlying database table using DAOs. */ + public static void dropAllTables(Database db, boolean ifExists) { + SearchHistoryBeanDao.dropTable(db, ifExists); + } + + /** + * WARNING: Drops all table on Upgrade! Use only during development. + * Convenience method using a {@link DevOpenHelper}. + */ + public static DaoSession newDevSession(Context context, String name) { + Database db = new DevOpenHelper(context, name).getWritableDb(); + DaoMaster daoMaster = new DaoMaster(db); + return daoMaster.newSession(); + } + + public DaoMaster(SQLiteDatabase db) { + this(new StandardDatabase(db)); + } + + public DaoMaster(Database db) { + super(db, SCHEMA_VERSION); + registerDaoClass(SearchHistoryBeanDao.class); + } + + public DaoSession newSession() { + return new DaoSession(db, IdentityScopeType.Session, daoConfigMap); + } + + public DaoSession newSession(IdentityScopeType type) { + return new DaoSession(db, type, daoConfigMap); + } + + /** + * Calls {@link #createAllTables(Database, boolean)} in {@link #onCreate(Database)} - + */ + public static abstract class OpenHelper extends DatabaseOpenHelper { + public OpenHelper(Context context, String name) { + super(context, name, SCHEMA_VERSION); + } + + public OpenHelper(Context context, String name, CursorFactory factory) { + super(context, name, factory, SCHEMA_VERSION); + } + + @Override + public void onCreate(Database db) { + Log.i("greenDAO", "Creating tables for schema version " + SCHEMA_VERSION); + createAllTables(db, false); + } + } + + /** WARNING: Drops all table on Upgrade! Use only during development. */ + public static class DevOpenHelper extends OpenHelper { + public DevOpenHelper(Context context, String name) { + super(context, name); + } + + public DevOpenHelper(Context context, String name, CursorFactory factory) { + super(context, name, factory); + } + + @Override + public void onUpgrade(Database db, int oldVersion, int newVersion) { + Log.i("greenDAO", "Upgrading schema from version " + oldVersion + " to " + newVersion + " by dropping all tables"); + dropAllTables(db, true); + onCreate(db); + } + } + +} diff --git a/app/src/main/java/com/casic/xz/meterage/greendao/DaoSession.java b/app/src/main/java/com/casic/xz/meterage/greendao/DaoSession.java new file mode 100644 index 0000000..0e80024 --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/greendao/DaoSession.java @@ -0,0 +1,46 @@ +package com.casic.xz.meterage.greendao; + +import com.casic.xz.meterage.bean.SearchHistoryBean; + +import org.greenrobot.greendao.AbstractDao; +import org.greenrobot.greendao.AbstractDaoSession; +import org.greenrobot.greendao.database.Database; +import org.greenrobot.greendao.identityscope.IdentityScopeType; +import org.greenrobot.greendao.internal.DaoConfig; + +import java.util.Map; + +// THIS CODE IS GENERATED BY greenDAO, DO NOT EDIT. + +/** + * {@inheritDoc} + * + * @see org.greenrobot.greendao.AbstractDaoSession + */ +public class DaoSession extends AbstractDaoSession { + + private final DaoConfig searchHistoryBeanDaoConfig; + + private final SearchHistoryBeanDao searchHistoryBeanDao; + + public DaoSession(Database db, IdentityScopeType type, Map>, DaoConfig> + daoConfigMap) { + super(db); + + searchHistoryBeanDaoConfig = daoConfigMap.get(SearchHistoryBeanDao.class).clone(); + searchHistoryBeanDaoConfig.initIdentityScope(type); + + searchHistoryBeanDao = new SearchHistoryBeanDao(searchHistoryBeanDaoConfig, this); + + registerDao(SearchHistoryBean.class, searchHistoryBeanDao); + } + + public void clear() { + searchHistoryBeanDaoConfig.clearIdentityScope(); + } + + public SearchHistoryBeanDao getSearchHistoryBeanDao() { + return searchHistoryBeanDao; + } + +} diff --git a/app/src/main/java/com/casic/xz/meterage/greendao/SearchHistoryBeanDao.java b/app/src/main/java/com/casic/xz/meterage/greendao/SearchHistoryBeanDao.java new file mode 100644 index 0000000..5923d02 --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/greendao/SearchHistoryBeanDao.java @@ -0,0 +1,185 @@ +package com.casic.xz.meterage.greendao; + +import android.database.Cursor; +import android.database.sqlite.SQLiteStatement; + +import com.casic.xz.meterage.bean.SearchHistoryBean; + +import org.greenrobot.greendao.AbstractDao; +import org.greenrobot.greendao.Property; +import org.greenrobot.greendao.database.Database; +import org.greenrobot.greendao.database.DatabaseStatement; +import org.greenrobot.greendao.internal.DaoConfig; + +// THIS CODE IS GENERATED BY greenDAO, DO NOT EDIT. +/** + * DAO for table "SEARCH_HISTORY_BEAN". +*/ +public class SearchHistoryBeanDao extends AbstractDao { + + public static final String TABLENAME = "SEARCH_HISTORY_BEAN"; + + /** + * Properties of entity SearchHistoryBean.
+ * Can be used for QueryBuilder and for referencing column names. + */ + public static class Properties { + public final static Property Id = new Property(0, Long.class, "id", true, "_id"); + public final static Property Uuid = new Property(1, String.class, "uuid", false, "UUID"); + public final static Property Keywords = new Property(2, String.class, "keywords", false, "KEYWORDS"); + public final static Property SearchType = new Property(3, String.class, "searchType", false, "SEARCH_TYPE"); + public final static Property UserId = new Property(4, String.class, "userId", false, "USER_ID"); + public final static Property SearchTime = new Property(5, String.class, "searchTime", false, "SEARCH_TIME"); + } + + + public SearchHistoryBeanDao(DaoConfig config) { + super(config); + } + + public SearchHistoryBeanDao(DaoConfig config, DaoSession daoSession) { + super(config, daoSession); + } + + /** Creates the underlying database table. */ + public static void createTable(Database db, boolean ifNotExists) { + String constraint = ifNotExists? "IF NOT EXISTS ": ""; + db.execSQL("CREATE TABLE " + constraint + "\"SEARCH_HISTORY_BEAN\" (" + // + "\"_id\" INTEGER PRIMARY KEY AUTOINCREMENT ," + // 0: id + "\"UUID\" TEXT UNIQUE ," + // 1: uuid + "\"KEYWORDS\" TEXT," + // 2: keywords + "\"SEARCH_TYPE\" TEXT," + // 3: searchType + "\"USER_ID\" TEXT," + // 4: userId + "\"SEARCH_TIME\" TEXT);"); // 5: searchTime + } + + /** Drops the underlying database table. */ + public static void dropTable(Database db, boolean ifExists) { + String sql = "DROP TABLE " + (ifExists ? "IF EXISTS " : "") + "\"SEARCH_HISTORY_BEAN\""; + db.execSQL(sql); + } + + @Override + protected final void bindValues(DatabaseStatement stmt, SearchHistoryBean entity) { + stmt.clearBindings(); + + Long id = entity.getId(); + if (id != null) { + stmt.bindLong(1, id); + } + + String uuid = entity.getUuid(); + if (uuid != null) { + stmt.bindString(2, uuid); + } + + String keywords = entity.getKeywords(); + if (keywords != null) { + stmt.bindString(3, keywords); + } + + String searchType = entity.getSearchType(); + if (searchType != null) { + stmt.bindString(4, searchType); + } + + String userId = entity.getUserId(); + if (userId != null) { + stmt.bindString(5, userId); + } + + String searchTime = entity.getSearchTime(); + if (searchTime != null) { + stmt.bindString(6, searchTime); + } + } + + @Override + protected final void bindValues(SQLiteStatement stmt, SearchHistoryBean entity) { + stmt.clearBindings(); + + Long id = entity.getId(); + if (id != null) { + stmt.bindLong(1, id); + } + + String uuid = entity.getUuid(); + if (uuid != null) { + stmt.bindString(2, uuid); + } + + String keywords = entity.getKeywords(); + if (keywords != null) { + stmt.bindString(3, keywords); + } + + String searchType = entity.getSearchType(); + if (searchType != null) { + stmt.bindString(4, searchType); + } + + String userId = entity.getUserId(); + if (userId != null) { + stmt.bindString(5, userId); + } + + String searchTime = entity.getSearchTime(); + if (searchTime != null) { + stmt.bindString(6, searchTime); + } + } + + @Override + public Long readKey(Cursor cursor, int offset) { + return cursor.isNull(offset + 0) ? null : cursor.getLong(offset + 0); + } + + @Override + public SearchHistoryBean readEntity(Cursor cursor, int offset) { + SearchHistoryBean entity = new SearchHistoryBean( // + cursor.isNull(offset + 0) ? null : cursor.getLong(offset + 0), // id + cursor.isNull(offset + 1) ? null : cursor.getString(offset + 1), // uuid + cursor.isNull(offset + 2) ? null : cursor.getString(offset + 2), // keywords + cursor.isNull(offset + 3) ? null : cursor.getString(offset + 3), // searchType + cursor.isNull(offset + 4) ? null : cursor.getString(offset + 4), // userId + cursor.isNull(offset + 5) ? null : cursor.getString(offset + 5) // searchTime + ); + return entity; + } + + @Override + public void readEntity(Cursor cursor, SearchHistoryBean entity, int offset) { + entity.setId(cursor.isNull(offset + 0) ? null : cursor.getLong(offset + 0)); + entity.setUuid(cursor.isNull(offset + 1) ? null : cursor.getString(offset + 1)); + entity.setKeywords(cursor.isNull(offset + 2) ? null : cursor.getString(offset + 2)); + entity.setSearchType(cursor.isNull(offset + 3) ? null : cursor.getString(offset + 3)); + entity.setUserId(cursor.isNull(offset + 4) ? null : cursor.getString(offset + 4)); + entity.setSearchTime(cursor.isNull(offset + 5) ? null : cursor.getString(offset + 5)); + } + + @Override + protected final Long updateKeyAfterInsert(SearchHistoryBean entity, long rowId) { + entity.setId(rowId); + return rowId; + } + + @Override + public Long getKey(SearchHistoryBean entity) { + if(entity != null) { + return entity.getId(); + } else { + return null; + } + } + + @Override + public boolean hasKey(SearchHistoryBean entity) { + return entity.getId() != null; + } + + @Override + protected final boolean isEntityUpdateable() { + return true; + } + +} diff --git a/app/src/main/java/com/casic/xz/meterage/utils/DataBaseManager.kt b/app/src/main/java/com/casic/xz/meterage/utils/DataBaseManager.kt new file mode 100644 index 0000000..52fe032 --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/utils/DataBaseManager.kt @@ -0,0 +1,45 @@ +package com.casic.xz.meterage.utils + +import com.casic.xz.meterage.base.BaseApplication +import com.casic.xz.meterage.bean.SearchHistoryBean +import com.casic.xz.meterage.greendao.SearchHistoryBeanDao +import com.pengxh.kt.lite.extensions.timestampToCompleteDate +import com.pengxh.kt.lite.utils.SaveKeyValues +import java.util.* + +class DataBaseManager private constructor() { + + companion object { + //Kotlin委托模式双重锁单例 + val get: DataBaseManager by lazy(mode = LazyThreadSafetyMode.SYNCHRONIZED) { + DataBaseManager() + } + } + + private val searchBeanDao by lazy { BaseApplication.get().getDaoSession().searchHistoryBeanDao } + private val userId by lazy { SaveKeyValues.getValue(LocaleConstant.USER_ID, "") } + + fun addSearchHistory(keywords: String, searchType: String) { + val bean = SearchHistoryBean() + bean.uuid = UUID.randomUUID().toString() + bean.keywords = keywords + bean.searchType = searchType + bean.userId = userId.toString() + bean.searchTime = System.currentTimeMillis().timestampToCompleteDate() + searchBeanDao.insert(bean) + } + + fun queryHistoryByType(searchType: String): MutableList { + return searchBeanDao.queryBuilder().where( + SearchHistoryBeanDao.Properties.UserId.eq(userId), + SearchHistoryBeanDao.Properties.SearchType.eq(searchType) + ).list() + } + + fun deleteHistoryByType(searchType: String) { + val list = queryHistoryByType(searchType) + list.forEach { + searchBeanDao.delete(it) + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/utils/LocaleConstant.kt b/app/src/main/java/com/casic/xz/meterage/utils/LocaleConstant.kt index cc2848b..2ea47a0 100644 --- a/app/src/main/java/com/casic/xz/meterage/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/xz/meterage/utils/LocaleConstant.kt @@ -62,4 +62,5 @@ const val File_SERVER_URL = "http://111.198.10.15:21408" const val ACCOUNT = "account" const val PASSWORD = "password" + const val USER_ID = "userId" } \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/utils/SearchType.kt b/app/src/main/java/com/casic/xz/meterage/utils/SearchType.kt new file mode 100644 index 0000000..5f5253e --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/utils/SearchType.kt @@ -0,0 +1,8 @@ +package com.casic.xz.meterage.utils + +object SearchType { + /** + * 搜索仪器设备 + * */ + const val Equipment = "0" +} diff --git a/app/src/main/java/com/casic/xz/meterage/view/MainActivity.kt b/app/src/main/java/com/casic/xz/meterage/view/MainActivity.kt index 28836e0..8fb0793 100644 --- a/app/src/main/java/com/casic/xz/meterage/view/MainActivity.kt +++ b/app/src/main/java/com/casic/xz/meterage/view/MainActivity.kt @@ -3,15 +3,19 @@ import android.view.KeyEvent import android.view.MenuItem import androidx.fragment.app.Fragment +import androidx.lifecycle.ViewModelProvider import androidx.viewpager.widget.ViewPager import com.casic.xz.meterage.R import com.casic.xz.meterage.adapter.ViewPagerAdapter import com.casic.xz.meterage.fragment.HomePageFragment import com.casic.xz.meterage.fragment.MinePageFragment import com.casic.xz.meterage.fragment.SamplePageFragment +import com.casic.xz.meterage.utils.LocaleConstant +import com.casic.xz.meterage.vm.UserViewModel import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.SaveKeyValues import kotlinx.android.synthetic.main.activity_main.* class MainActivity : KotlinBaseActivity() { @@ -20,53 +24,59 @@ private var fragmentPages: ArrayList = ArrayList() private var clickTime: Long = 0 - init { - fragmentPages.add(HomePageFragment()) - fragmentPages.add(SamplePageFragment()) - fragmentPages.add(MinePageFragment()) - } - override fun initData() { - bottomNavigation.itemIconTintList = null - bottomNavigation.setOnNavigationItemSelectedListener { menuItem -> - when (menuItem.itemId) { - R.id.nav_home -> { - mainViewPager.currentItem = 0 + val userViewModel = ViewModelProvider(this)[UserViewModel::class.java] + userViewModel.getUserInfo(SaveKeyValues.getValue(LocaleConstant.ACCOUNT, "") as String) + userViewModel.userInfo.observe(this) { + if (it.code == 200) { + SaveKeyValues.putValue(LocaleConstant.USER_ID, it.data.id) + + fragmentPages.add(HomePageFragment(it.data.id)) + fragmentPages.add(SamplePageFragment()) + fragmentPages.add(MinePageFragment()) + + bottomNavigation.itemIconTintList = null + bottomNavigation.setOnNavigationItemSelectedListener { menuItem -> + when (menuItem.itemId) { + R.id.nav_home -> { + mainViewPager.currentItem = 0 + } + R.id.nav_sample -> { + mainViewPager.currentItem = 1 + } + R.id.nav_mine -> { + mainViewPager.currentItem = 2 + } + } + false } - R.id.nav_sample -> { - mainViewPager.currentItem = 1 - } - R.id.nav_mine -> { - mainViewPager.currentItem = 2 - } + mainViewPager.adapter = ViewPagerAdapter(fragmentPages, supportFragmentManager) + mainViewPager.offscreenPageLimit = fragmentPages.size //缓存页数 + mainViewPager.addOnPageChangeListener(object : ViewPager.OnPageChangeListener { + override fun onPageScrollStateChanged(state: Int) { + + } + + override fun onPageScrolled( + position: Int, + positionOffset: Float, + positionOffsetPixels: Int + ) { + + } + + override fun onPageSelected(position: Int) { + if (menuItem != null) { + menuItem!!.isChecked = false + } else { + bottomNavigation.menu.getItem(0).isChecked = false + } + menuItem = bottomNavigation.menu.getItem(position) + menuItem!!.isChecked = true + } + }) } - false } - mainViewPager.adapter = ViewPagerAdapter(fragmentPages, supportFragmentManager) - mainViewPager.offscreenPageLimit = fragmentPages.size //缓存页数 - mainViewPager.addOnPageChangeListener(object : ViewPager.OnPageChangeListener { - override fun onPageScrollStateChanged(state: Int) { - - } - - override fun onPageScrolled( - position: Int, - positionOffset: Float, - positionOffsetPixels: Int - ) { - - } - - override fun onPageSelected(position: Int) { - if (menuItem != null) { - menuItem!!.isChecked = false - } else { - bottomNavigation.menu.getItem(0).isChecked = false - } - menuItem = bottomNavigation.menu.getItem(position) - menuItem!!.isChecked = true - } - }) } override fun initEvent() { diff --git a/app/src/main/java/com/casic/xz/meterage/view/search/SearchAllActivity.kt b/app/src/main/java/com/casic/xz/meterage/view/search/SearchAllActivity.kt new file mode 100644 index 0000000..ecc8fd7 --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/view/search/SearchAllActivity.kt @@ -0,0 +1,40 @@ +package com.casic.xz.meterage.view.search + +import com.casic.xz.meterage.R +import com.casic.xz.meterage.extensions.initLayoutImmersionBar +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.navigatePageTo +import kotlinx.android.synthetic.main.activity_search_all.* +import kotlinx.android.synthetic.main.include_search_input_title.* + +class SearchAllActivity : KotlinBaseActivity() { + + override fun initData() { + + } + + override fun initEvent() { + leftBackView.setOnClickListener { finish() } + searchTextView.setOnClickListener { + navigatePageTo(inputView.text.toString()) + } + } + + override fun initLayoutView(): Int = R.layout.activity_search_all + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + initLayoutImmersionBar(rootView) + inputView.hint = "查询样品、业务" + } + + override fun onResume() { + super.onResume() + //TODO 流式布局显示查询记录Tag? + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/view/search/SearchAllResultActivity.kt b/app/src/main/java/com/casic/xz/meterage/view/search/SearchAllResultActivity.kt new file mode 100644 index 0000000..adbb570 --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/view/search/SearchAllResultActivity.kt @@ -0,0 +1,34 @@ +package com.casic.xz.meterage.view.search + +import com.casic.xz.meterage.R +import com.casic.xz.meterage.extensions.initLayoutImmersionBar +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.utils.Constant +import kotlinx.android.synthetic.main.activity_search_all_reasult.* +import kotlinx.android.synthetic.main.include_search_title.* + +class SearchAllResultActivity : KotlinBaseActivity() { + + private lateinit var param: String + + override fun initData() { + param = intent.getStringExtra(Constant.INTENT_PARAM)!! + } + + override fun initEvent() { + leftBackView.setOnClickListener { finish() } + } + + override fun initLayoutView(): Int = R.layout.activity_search_all_reasult + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + initLayoutImmersionBar(rootView) + titleView.text = "查询结果" + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/view/search/SearchEquipmentActivity.kt b/app/src/main/java/com/casic/xz/meterage/view/search/SearchEquipmentActivity.kt index f5c98d6..3551790 100644 --- a/app/src/main/java/com/casic/xz/meterage/view/search/SearchEquipmentActivity.kt +++ b/app/src/main/java/com/casic/xz/meterage/view/search/SearchEquipmentActivity.kt @@ -1,27 +1,98 @@ package com.casic.xz.meterage.view.search import com.casic.xz.meterage.R +import com.casic.xz.meterage.bean.SearchHistoryBean import com.casic.xz.meterage.extensions.initLayoutImmersionBar +import com.casic.xz.meterage.utils.DataBaseManager +import com.casic.xz.meterage.utils.SearchType import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter +import com.pengxh.kt.lite.adapter.ViewHolder import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.utils.WeakReferenceHandler +import com.pengxh.kt.lite.widget.dialog.AlertControlDialog import kotlinx.android.synthetic.main.activity_search_equipment.* import kotlinx.android.synthetic.main.include_search_input_title.* + /** * 搜索仪器设备 * */ class SearchEquipmentActivity : KotlinBaseActivity() { - override fun initData() { + private lateinit var weakReferenceHandler: WeakReferenceHandler + private lateinit var historyAdapter: NormalRecyclerAdapter + private var dataBeans: MutableList = ArrayList() + private var isRefresh = false + override fun initData() { + weakReferenceHandler = WeakReferenceHandler { + if (it.what == 2023031001) { + if (isRefresh) { + historyAdapter.notifyDataSetChanged() + } else { + historyAdapter = object : + NormalRecyclerAdapter( + R.layout.item_search_rv_l, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, position: Int, item: SearchHistoryBean + ) { + viewHolder.setText(R.id.searchTagView, item.keywords) + } + } + historyRecyclerView.adapter = historyAdapter + historyAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked(position: Int, t: SearchHistoryBean) { + navigatePageTo(t.keywords) + } + }) + } + } + true + } + } + + override fun onResume() { + super.onResume() + dataBeans = DataBaseManager.get.queryHistoryByType(SearchType.Equipment) + weakReferenceHandler.sendEmptyMessage(2023031001) } override fun initEvent() { leftBackView.setOnClickListener { finish() } searchTextView.setOnClickListener { + if (!inputView.text.isNullOrBlank()) { + DataBaseManager.get.addSearchHistory( + inputView.text.toString(), SearchType.Equipment + ) + } + navigatePageTo(inputView.text.toString()) } + + deleteHistoryView.setOnClickListener { + AlertControlDialog.Builder() + .setContext(this) + .setTitle("提示") + .setMessage("确定将所有搜索记录删除?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + + } + + override fun onConfirmClick() { + DataBaseManager.get.deleteHistoryByType(SearchType.Equipment) + dataBeans.clear() + historyAdapter.notifyDataSetChanged() + } + }).build().show() + } } override fun initLayoutView(): Int = R.layout.activity_search_equipment @@ -35,9 +106,4 @@ initLayoutImmersionBar(rootView) inputView.hint = "查询设备名称、编号" } - - override fun onResume() { - super.onResume() - //TODO 流式布局显示查询记录Tag? - } } \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index 298f687..e142ec1 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -3,6 +3,7 @@ apply plugin: 'com.android.application' apply plugin: 'kotlin-android' apply plugin: 'kotlin-android-extensions' +apply plugin: 'org.greenrobot.greendao' android { signingConfigs { @@ -57,6 +58,12 @@ outputFileName = "XZJL_" + getBuildDate() + "_Beta.apk" } } + + greendao { + schemaVersion 1//数据库版本号 + targetGenDir 'src/main/java'//设置DaoMaster、DaoSession、Dao目录 + daoPackage 'com.casic.xz.meterage.greendao'//设置DaoMaster、DaoSession、Dao包名 + } } static def getBuildDate() { @@ -67,7 +74,7 @@ dependencies { //基础依赖库 implementation 'com.github.AndroidCoderPeng:Kotlin-lite-lib:1.0.4' - implementation 'androidx.appcompat:appcompat:1.5.1' + implementation 'androidx.appcompat:appcompat:1.6.1' implementation 'androidx.core:core-ktx:1.9.0' //Google官方授权框架 implementation 'pub.devrel:easypermissions:3.0.0' @@ -113,4 +120,6 @@ implementation 'com.github.tiann:FreeReflection:3.1.0' //单项/数字、二三级联动、日期/时间等滚轮选择器 implementation 'com.github.gzu-liyujiang.AndroidPicker:WheelPicker:4.1.8' + //数据库框架 + implementation 'org.greenrobot:greendao:3.3.0' } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 972eff9..5b6f9b2 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -69,6 +69,8 @@ + + diff --git a/app/src/main/java/com/casic/xz/meterage/base/BaseApplication.kt b/app/src/main/java/com/casic/xz/meterage/base/BaseApplication.kt index 14a604d..1684c23 100644 --- a/app/src/main/java/com/casic/xz/meterage/base/BaseApplication.kt +++ b/app/src/main/java/com/casic/xz/meterage/base/BaseApplication.kt @@ -2,6 +2,8 @@ import android.app.Application import android.content.Context +import com.casic.xz.meterage.greendao.DaoMaster +import com.casic.xz.meterage.greendao.DaoSession import com.pengxh.kt.lite.utils.SaveKeyValues import me.weishu.reflection.Reflection import kotlin.properties.Delegates @@ -12,12 +14,22 @@ private var application: BaseApplication by Delegates.notNull() fun get() = application + + private lateinit var daoSession: DaoSession } override fun onCreate() { super.onCreate() application = this SaveKeyValues.initSharedPreferences(this) + + val devOpenHelper = DaoMaster.DevOpenHelper(this, "Meterage.db", null) + val daoMaster = DaoMaster(devOpenHelper.writableDatabase) + daoSession = daoMaster.newSession() + } + + fun getDaoSession(): DaoSession { + return daoSession } //绕过Android 11以上反射限制 diff --git a/app/src/main/java/com/casic/xz/meterage/bean/SearchHistoryBean.java b/app/src/main/java/com/casic/xz/meterage/bean/SearchHistoryBean.java new file mode 100644 index 0000000..6a46a3a --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/bean/SearchHistoryBean.java @@ -0,0 +1,82 @@ +package com.casic.xz.meterage.bean; + +import org.greenrobot.greendao.annotation.Entity; +import org.greenrobot.greendao.annotation.Generated; +import org.greenrobot.greendao.annotation.Id; +import org.greenrobot.greendao.annotation.Unique; + +@Entity +public class SearchHistoryBean { + @Id(autoincrement = true) + private Long id;//主键自增 + + @Unique + private String uuid; + private String keywords;//查询条件-关键字 + private String searchType;//查询类型 + private String userId;//用户Id + private String searchTime;//查询的时间 + + @Generated(hash = 2130561778) + public SearchHistoryBean(Long id, String uuid, String keywords, + String searchType, String userId, String searchTime) { + this.id = id; + this.uuid = uuid; + this.keywords = keywords; + this.searchType = searchType; + this.userId = userId; + this.searchTime = searchTime; + } + + @Generated(hash = 1570282321) + public SearchHistoryBean() { + } + + public Long getId() { + return this.id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getUuid() { + return this.uuid; + } + + public void setUuid(String uuid) { + this.uuid = uuid; + } + + public String getKeywords() { + return this.keywords; + } + + public void setKeywords(String keywords) { + this.keywords = keywords; + } + + public String getSearchType() { + return this.searchType; + } + + public void setSearchType(String searchType) { + this.searchType = searchType; + } + + public String getUserId() { + return this.userId; + } + + public void setUserId(String userId) { + this.userId = userId; + } + + public String getSearchTime() { + return this.searchTime; + } + + public void setSearchTime(String searchTime) { + this.searchTime = searchTime; + } +} diff --git a/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt index 151f951..ae7f5e4 100644 --- a/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt +++ b/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt @@ -15,22 +15,20 @@ import com.casic.xz.meterage.extensions.showEmptyPage import com.casic.xz.meterage.model.NoticeListModel import com.casic.xz.meterage.model.RemindListModel -import com.casic.xz.meterage.model.UserInfoModel import com.casic.xz.meterage.utils.LoadingDialogHub import com.casic.xz.meterage.utils.LocaleConstant import com.casic.xz.meterage.utils.QrConfigCreator import com.casic.xz.meterage.view.home.* import com.casic.xz.meterage.view.notice.NoticeListActivity +import com.casic.xz.meterage.view.search.SearchAllActivity import com.casic.xz.meterage.vm.MeterageTrainViewModel import com.casic.xz.meterage.vm.NoticeViewModel -import com.casic.xz.meterage.vm.UserViewModel import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter import com.pengxh.kt.lite.adapter.ViewHolder import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.convertColor import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show -import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.utils.WeakReferenceHandler import com.pengxh.kt.lite.vm.LoadState import com.pengxh.kt.lite.widget.dialog.AlertControlDialog @@ -39,13 +37,12 @@ import kotlinx.android.synthetic.main.include_empty_view.* import java.util.* -class HomePageFragment : KotlinBaseFragment() { +class HomePageFragment(private val userId: String) : KotlinBaseFragment() { private val timer = object : Timer() {} private lateinit var weakReferenceHandler: WeakReferenceHandler private lateinit var meterageTrainViewModel: MeterageTrainViewModel private lateinit var noticeViewModel: NoticeViewModel - private lateinit var userData: UserInfoModel.DataModel private lateinit var remindAdapter: NormalRecyclerAdapter private var dataBeans: MutableList = ArrayList() private var noticeBeans: MutableList = ArrayList() @@ -170,14 +167,6 @@ true } - val userViewModel = ViewModelProvider(this)[UserViewModel::class.java] - userViewModel.getUserInfo(SaveKeyValues.getValue(LocaleConstant.ACCOUNT, "") as String) - userViewModel.userInfo.observe(this) { - if (it.code == 200) { - userData = it.data - } - } - meterageTrainViewModel = ViewModelProvider(this)[MeterageTrainViewModel::class.java] meterageTrainViewModel.signInResult.observe(this) { if (it.code == 200) { @@ -296,10 +285,14 @@ } override fun initEvent() { + searchBar.setOnClickListener { + requireContext().navigatePageTo() + } + scanCodeView.setOnClickListener { qrManager.startScan(requireActivity()) { result -> if (result.content.isDigitsOnly()) { - meterageTrainViewModel.signIn(userData.id, result.content) + meterageTrainViewModel.signIn(userId, result.content) } else { "签到二维码错误,请重新扫描".show(requireContext()) } diff --git a/app/src/main/java/com/casic/xz/meterage/greendao/DaoMaster.java b/app/src/main/java/com/casic/xz/meterage/greendao/DaoMaster.java new file mode 100644 index 0000000..d714ce2 --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/greendao/DaoMaster.java @@ -0,0 +1,96 @@ +package com.casic.xz.meterage.greendao; + +import android.content.Context; +import android.database.sqlite.SQLiteDatabase; +import android.database.sqlite.SQLiteDatabase.CursorFactory; +import android.util.Log; + +import org.greenrobot.greendao.AbstractDaoMaster; +import org.greenrobot.greendao.database.Database; +import org.greenrobot.greendao.database.DatabaseOpenHelper; +import org.greenrobot.greendao.database.StandardDatabase; +import org.greenrobot.greendao.identityscope.IdentityScopeType; + + +// THIS CODE IS GENERATED BY greenDAO, DO NOT EDIT. +/** + * Master of DAO (schema version 1): knows all DAOs. + */ +public class DaoMaster extends AbstractDaoMaster { + public static final int SCHEMA_VERSION = 1; + + /** Creates underlying database table using DAOs. */ + public static void createAllTables(Database db, boolean ifNotExists) { + SearchHistoryBeanDao.createTable(db, ifNotExists); + } + + /** Drops underlying database table using DAOs. */ + public static void dropAllTables(Database db, boolean ifExists) { + SearchHistoryBeanDao.dropTable(db, ifExists); + } + + /** + * WARNING: Drops all table on Upgrade! Use only during development. + * Convenience method using a {@link DevOpenHelper}. + */ + public static DaoSession newDevSession(Context context, String name) { + Database db = new DevOpenHelper(context, name).getWritableDb(); + DaoMaster daoMaster = new DaoMaster(db); + return daoMaster.newSession(); + } + + public DaoMaster(SQLiteDatabase db) { + this(new StandardDatabase(db)); + } + + public DaoMaster(Database db) { + super(db, SCHEMA_VERSION); + registerDaoClass(SearchHistoryBeanDao.class); + } + + public DaoSession newSession() { + return new DaoSession(db, IdentityScopeType.Session, daoConfigMap); + } + + public DaoSession newSession(IdentityScopeType type) { + return new DaoSession(db, type, daoConfigMap); + } + + /** + * Calls {@link #createAllTables(Database, boolean)} in {@link #onCreate(Database)} - + */ + public static abstract class OpenHelper extends DatabaseOpenHelper { + public OpenHelper(Context context, String name) { + super(context, name, SCHEMA_VERSION); + } + + public OpenHelper(Context context, String name, CursorFactory factory) { + super(context, name, factory, SCHEMA_VERSION); + } + + @Override + public void onCreate(Database db) { + Log.i("greenDAO", "Creating tables for schema version " + SCHEMA_VERSION); + createAllTables(db, false); + } + } + + /** WARNING: Drops all table on Upgrade! Use only during development. */ + public static class DevOpenHelper extends OpenHelper { + public DevOpenHelper(Context context, String name) { + super(context, name); + } + + public DevOpenHelper(Context context, String name, CursorFactory factory) { + super(context, name, factory); + } + + @Override + public void onUpgrade(Database db, int oldVersion, int newVersion) { + Log.i("greenDAO", "Upgrading schema from version " + oldVersion + " to " + newVersion + " by dropping all tables"); + dropAllTables(db, true); + onCreate(db); + } + } + +} diff --git a/app/src/main/java/com/casic/xz/meterage/greendao/DaoSession.java b/app/src/main/java/com/casic/xz/meterage/greendao/DaoSession.java new file mode 100644 index 0000000..0e80024 --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/greendao/DaoSession.java @@ -0,0 +1,46 @@ +package com.casic.xz.meterage.greendao; + +import com.casic.xz.meterage.bean.SearchHistoryBean; + +import org.greenrobot.greendao.AbstractDao; +import org.greenrobot.greendao.AbstractDaoSession; +import org.greenrobot.greendao.database.Database; +import org.greenrobot.greendao.identityscope.IdentityScopeType; +import org.greenrobot.greendao.internal.DaoConfig; + +import java.util.Map; + +// THIS CODE IS GENERATED BY greenDAO, DO NOT EDIT. + +/** + * {@inheritDoc} + * + * @see org.greenrobot.greendao.AbstractDaoSession + */ +public class DaoSession extends AbstractDaoSession { + + private final DaoConfig searchHistoryBeanDaoConfig; + + private final SearchHistoryBeanDao searchHistoryBeanDao; + + public DaoSession(Database db, IdentityScopeType type, Map>, DaoConfig> + daoConfigMap) { + super(db); + + searchHistoryBeanDaoConfig = daoConfigMap.get(SearchHistoryBeanDao.class).clone(); + searchHistoryBeanDaoConfig.initIdentityScope(type); + + searchHistoryBeanDao = new SearchHistoryBeanDao(searchHistoryBeanDaoConfig, this); + + registerDao(SearchHistoryBean.class, searchHistoryBeanDao); + } + + public void clear() { + searchHistoryBeanDaoConfig.clearIdentityScope(); + } + + public SearchHistoryBeanDao getSearchHistoryBeanDao() { + return searchHistoryBeanDao; + } + +} diff --git a/app/src/main/java/com/casic/xz/meterage/greendao/SearchHistoryBeanDao.java b/app/src/main/java/com/casic/xz/meterage/greendao/SearchHistoryBeanDao.java new file mode 100644 index 0000000..5923d02 --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/greendao/SearchHistoryBeanDao.java @@ -0,0 +1,185 @@ +package com.casic.xz.meterage.greendao; + +import android.database.Cursor; +import android.database.sqlite.SQLiteStatement; + +import com.casic.xz.meterage.bean.SearchHistoryBean; + +import org.greenrobot.greendao.AbstractDao; +import org.greenrobot.greendao.Property; +import org.greenrobot.greendao.database.Database; +import org.greenrobot.greendao.database.DatabaseStatement; +import org.greenrobot.greendao.internal.DaoConfig; + +// THIS CODE IS GENERATED BY greenDAO, DO NOT EDIT. +/** + * DAO for table "SEARCH_HISTORY_BEAN". +*/ +public class SearchHistoryBeanDao extends AbstractDao { + + public static final String TABLENAME = "SEARCH_HISTORY_BEAN"; + + /** + * Properties of entity SearchHistoryBean.
+ * Can be used for QueryBuilder and for referencing column names. + */ + public static class Properties { + public final static Property Id = new Property(0, Long.class, "id", true, "_id"); + public final static Property Uuid = new Property(1, String.class, "uuid", false, "UUID"); + public final static Property Keywords = new Property(2, String.class, "keywords", false, "KEYWORDS"); + public final static Property SearchType = new Property(3, String.class, "searchType", false, "SEARCH_TYPE"); + public final static Property UserId = new Property(4, String.class, "userId", false, "USER_ID"); + public final static Property SearchTime = new Property(5, String.class, "searchTime", false, "SEARCH_TIME"); + } + + + public SearchHistoryBeanDao(DaoConfig config) { + super(config); + } + + public SearchHistoryBeanDao(DaoConfig config, DaoSession daoSession) { + super(config, daoSession); + } + + /** Creates the underlying database table. */ + public static void createTable(Database db, boolean ifNotExists) { + String constraint = ifNotExists? "IF NOT EXISTS ": ""; + db.execSQL("CREATE TABLE " + constraint + "\"SEARCH_HISTORY_BEAN\" (" + // + "\"_id\" INTEGER PRIMARY KEY AUTOINCREMENT ," + // 0: id + "\"UUID\" TEXT UNIQUE ," + // 1: uuid + "\"KEYWORDS\" TEXT," + // 2: keywords + "\"SEARCH_TYPE\" TEXT," + // 3: searchType + "\"USER_ID\" TEXT," + // 4: userId + "\"SEARCH_TIME\" TEXT);"); // 5: searchTime + } + + /** Drops the underlying database table. */ + public static void dropTable(Database db, boolean ifExists) { + String sql = "DROP TABLE " + (ifExists ? "IF EXISTS " : "") + "\"SEARCH_HISTORY_BEAN\""; + db.execSQL(sql); + } + + @Override + protected final void bindValues(DatabaseStatement stmt, SearchHistoryBean entity) { + stmt.clearBindings(); + + Long id = entity.getId(); + if (id != null) { + stmt.bindLong(1, id); + } + + String uuid = entity.getUuid(); + if (uuid != null) { + stmt.bindString(2, uuid); + } + + String keywords = entity.getKeywords(); + if (keywords != null) { + stmt.bindString(3, keywords); + } + + String searchType = entity.getSearchType(); + if (searchType != null) { + stmt.bindString(4, searchType); + } + + String userId = entity.getUserId(); + if (userId != null) { + stmt.bindString(5, userId); + } + + String searchTime = entity.getSearchTime(); + if (searchTime != null) { + stmt.bindString(6, searchTime); + } + } + + @Override + protected final void bindValues(SQLiteStatement stmt, SearchHistoryBean entity) { + stmt.clearBindings(); + + Long id = entity.getId(); + if (id != null) { + stmt.bindLong(1, id); + } + + String uuid = entity.getUuid(); + if (uuid != null) { + stmt.bindString(2, uuid); + } + + String keywords = entity.getKeywords(); + if (keywords != null) { + stmt.bindString(3, keywords); + } + + String searchType = entity.getSearchType(); + if (searchType != null) { + stmt.bindString(4, searchType); + } + + String userId = entity.getUserId(); + if (userId != null) { + stmt.bindString(5, userId); + } + + String searchTime = entity.getSearchTime(); + if (searchTime != null) { + stmt.bindString(6, searchTime); + } + } + + @Override + public Long readKey(Cursor cursor, int offset) { + return cursor.isNull(offset + 0) ? null : cursor.getLong(offset + 0); + } + + @Override + public SearchHistoryBean readEntity(Cursor cursor, int offset) { + SearchHistoryBean entity = new SearchHistoryBean( // + cursor.isNull(offset + 0) ? null : cursor.getLong(offset + 0), // id + cursor.isNull(offset + 1) ? null : cursor.getString(offset + 1), // uuid + cursor.isNull(offset + 2) ? null : cursor.getString(offset + 2), // keywords + cursor.isNull(offset + 3) ? null : cursor.getString(offset + 3), // searchType + cursor.isNull(offset + 4) ? null : cursor.getString(offset + 4), // userId + cursor.isNull(offset + 5) ? null : cursor.getString(offset + 5) // searchTime + ); + return entity; + } + + @Override + public void readEntity(Cursor cursor, SearchHistoryBean entity, int offset) { + entity.setId(cursor.isNull(offset + 0) ? null : cursor.getLong(offset + 0)); + entity.setUuid(cursor.isNull(offset + 1) ? null : cursor.getString(offset + 1)); + entity.setKeywords(cursor.isNull(offset + 2) ? null : cursor.getString(offset + 2)); + entity.setSearchType(cursor.isNull(offset + 3) ? null : cursor.getString(offset + 3)); + entity.setUserId(cursor.isNull(offset + 4) ? null : cursor.getString(offset + 4)); + entity.setSearchTime(cursor.isNull(offset + 5) ? null : cursor.getString(offset + 5)); + } + + @Override + protected final Long updateKeyAfterInsert(SearchHistoryBean entity, long rowId) { + entity.setId(rowId); + return rowId; + } + + @Override + public Long getKey(SearchHistoryBean entity) { + if(entity != null) { + return entity.getId(); + } else { + return null; + } + } + + @Override + public boolean hasKey(SearchHistoryBean entity) { + return entity.getId() != null; + } + + @Override + protected final boolean isEntityUpdateable() { + return true; + } + +} diff --git a/app/src/main/java/com/casic/xz/meterage/utils/DataBaseManager.kt b/app/src/main/java/com/casic/xz/meterage/utils/DataBaseManager.kt new file mode 100644 index 0000000..52fe032 --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/utils/DataBaseManager.kt @@ -0,0 +1,45 @@ +package com.casic.xz.meterage.utils + +import com.casic.xz.meterage.base.BaseApplication +import com.casic.xz.meterage.bean.SearchHistoryBean +import com.casic.xz.meterage.greendao.SearchHistoryBeanDao +import com.pengxh.kt.lite.extensions.timestampToCompleteDate +import com.pengxh.kt.lite.utils.SaveKeyValues +import java.util.* + +class DataBaseManager private constructor() { + + companion object { + //Kotlin委托模式双重锁单例 + val get: DataBaseManager by lazy(mode = LazyThreadSafetyMode.SYNCHRONIZED) { + DataBaseManager() + } + } + + private val searchBeanDao by lazy { BaseApplication.get().getDaoSession().searchHistoryBeanDao } + private val userId by lazy { SaveKeyValues.getValue(LocaleConstant.USER_ID, "") } + + fun addSearchHistory(keywords: String, searchType: String) { + val bean = SearchHistoryBean() + bean.uuid = UUID.randomUUID().toString() + bean.keywords = keywords + bean.searchType = searchType + bean.userId = userId.toString() + bean.searchTime = System.currentTimeMillis().timestampToCompleteDate() + searchBeanDao.insert(bean) + } + + fun queryHistoryByType(searchType: String): MutableList { + return searchBeanDao.queryBuilder().where( + SearchHistoryBeanDao.Properties.UserId.eq(userId), + SearchHistoryBeanDao.Properties.SearchType.eq(searchType) + ).list() + } + + fun deleteHistoryByType(searchType: String) { + val list = queryHistoryByType(searchType) + list.forEach { + searchBeanDao.delete(it) + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/utils/LocaleConstant.kt b/app/src/main/java/com/casic/xz/meterage/utils/LocaleConstant.kt index cc2848b..2ea47a0 100644 --- a/app/src/main/java/com/casic/xz/meterage/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/xz/meterage/utils/LocaleConstant.kt @@ -62,4 +62,5 @@ const val File_SERVER_URL = "http://111.198.10.15:21408" const val ACCOUNT = "account" const val PASSWORD = "password" + const val USER_ID = "userId" } \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/utils/SearchType.kt b/app/src/main/java/com/casic/xz/meterage/utils/SearchType.kt new file mode 100644 index 0000000..5f5253e --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/utils/SearchType.kt @@ -0,0 +1,8 @@ +package com.casic.xz.meterage.utils + +object SearchType { + /** + * 搜索仪器设备 + * */ + const val Equipment = "0" +} diff --git a/app/src/main/java/com/casic/xz/meterage/view/MainActivity.kt b/app/src/main/java/com/casic/xz/meterage/view/MainActivity.kt index 28836e0..8fb0793 100644 --- a/app/src/main/java/com/casic/xz/meterage/view/MainActivity.kt +++ b/app/src/main/java/com/casic/xz/meterage/view/MainActivity.kt @@ -3,15 +3,19 @@ import android.view.KeyEvent import android.view.MenuItem import androidx.fragment.app.Fragment +import androidx.lifecycle.ViewModelProvider import androidx.viewpager.widget.ViewPager import com.casic.xz.meterage.R import com.casic.xz.meterage.adapter.ViewPagerAdapter import com.casic.xz.meterage.fragment.HomePageFragment import com.casic.xz.meterage.fragment.MinePageFragment import com.casic.xz.meterage.fragment.SamplePageFragment +import com.casic.xz.meterage.utils.LocaleConstant +import com.casic.xz.meterage.vm.UserViewModel import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.SaveKeyValues import kotlinx.android.synthetic.main.activity_main.* class MainActivity : KotlinBaseActivity() { @@ -20,53 +24,59 @@ private var fragmentPages: ArrayList = ArrayList() private var clickTime: Long = 0 - init { - fragmentPages.add(HomePageFragment()) - fragmentPages.add(SamplePageFragment()) - fragmentPages.add(MinePageFragment()) - } - override fun initData() { - bottomNavigation.itemIconTintList = null - bottomNavigation.setOnNavigationItemSelectedListener { menuItem -> - when (menuItem.itemId) { - R.id.nav_home -> { - mainViewPager.currentItem = 0 + val userViewModel = ViewModelProvider(this)[UserViewModel::class.java] + userViewModel.getUserInfo(SaveKeyValues.getValue(LocaleConstant.ACCOUNT, "") as String) + userViewModel.userInfo.observe(this) { + if (it.code == 200) { + SaveKeyValues.putValue(LocaleConstant.USER_ID, it.data.id) + + fragmentPages.add(HomePageFragment(it.data.id)) + fragmentPages.add(SamplePageFragment()) + fragmentPages.add(MinePageFragment()) + + bottomNavigation.itemIconTintList = null + bottomNavigation.setOnNavigationItemSelectedListener { menuItem -> + when (menuItem.itemId) { + R.id.nav_home -> { + mainViewPager.currentItem = 0 + } + R.id.nav_sample -> { + mainViewPager.currentItem = 1 + } + R.id.nav_mine -> { + mainViewPager.currentItem = 2 + } + } + false } - R.id.nav_sample -> { - mainViewPager.currentItem = 1 - } - R.id.nav_mine -> { - mainViewPager.currentItem = 2 - } + mainViewPager.adapter = ViewPagerAdapter(fragmentPages, supportFragmentManager) + mainViewPager.offscreenPageLimit = fragmentPages.size //缓存页数 + mainViewPager.addOnPageChangeListener(object : ViewPager.OnPageChangeListener { + override fun onPageScrollStateChanged(state: Int) { + + } + + override fun onPageScrolled( + position: Int, + positionOffset: Float, + positionOffsetPixels: Int + ) { + + } + + override fun onPageSelected(position: Int) { + if (menuItem != null) { + menuItem!!.isChecked = false + } else { + bottomNavigation.menu.getItem(0).isChecked = false + } + menuItem = bottomNavigation.menu.getItem(position) + menuItem!!.isChecked = true + } + }) } - false } - mainViewPager.adapter = ViewPagerAdapter(fragmentPages, supportFragmentManager) - mainViewPager.offscreenPageLimit = fragmentPages.size //缓存页数 - mainViewPager.addOnPageChangeListener(object : ViewPager.OnPageChangeListener { - override fun onPageScrollStateChanged(state: Int) { - - } - - override fun onPageScrolled( - position: Int, - positionOffset: Float, - positionOffsetPixels: Int - ) { - - } - - override fun onPageSelected(position: Int) { - if (menuItem != null) { - menuItem!!.isChecked = false - } else { - bottomNavigation.menu.getItem(0).isChecked = false - } - menuItem = bottomNavigation.menu.getItem(position) - menuItem!!.isChecked = true - } - }) } override fun initEvent() { diff --git a/app/src/main/java/com/casic/xz/meterage/view/search/SearchAllActivity.kt b/app/src/main/java/com/casic/xz/meterage/view/search/SearchAllActivity.kt new file mode 100644 index 0000000..ecc8fd7 --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/view/search/SearchAllActivity.kt @@ -0,0 +1,40 @@ +package com.casic.xz.meterage.view.search + +import com.casic.xz.meterage.R +import com.casic.xz.meterage.extensions.initLayoutImmersionBar +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.navigatePageTo +import kotlinx.android.synthetic.main.activity_search_all.* +import kotlinx.android.synthetic.main.include_search_input_title.* + +class SearchAllActivity : KotlinBaseActivity() { + + override fun initData() { + + } + + override fun initEvent() { + leftBackView.setOnClickListener { finish() } + searchTextView.setOnClickListener { + navigatePageTo(inputView.text.toString()) + } + } + + override fun initLayoutView(): Int = R.layout.activity_search_all + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + initLayoutImmersionBar(rootView) + inputView.hint = "查询样品、业务" + } + + override fun onResume() { + super.onResume() + //TODO 流式布局显示查询记录Tag? + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/view/search/SearchAllResultActivity.kt b/app/src/main/java/com/casic/xz/meterage/view/search/SearchAllResultActivity.kt new file mode 100644 index 0000000..adbb570 --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/view/search/SearchAllResultActivity.kt @@ -0,0 +1,34 @@ +package com.casic.xz.meterage.view.search + +import com.casic.xz.meterage.R +import com.casic.xz.meterage.extensions.initLayoutImmersionBar +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.utils.Constant +import kotlinx.android.synthetic.main.activity_search_all_reasult.* +import kotlinx.android.synthetic.main.include_search_title.* + +class SearchAllResultActivity : KotlinBaseActivity() { + + private lateinit var param: String + + override fun initData() { + param = intent.getStringExtra(Constant.INTENT_PARAM)!! + } + + override fun initEvent() { + leftBackView.setOnClickListener { finish() } + } + + override fun initLayoutView(): Int = R.layout.activity_search_all_reasult + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + initLayoutImmersionBar(rootView) + titleView.text = "查询结果" + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/view/search/SearchEquipmentActivity.kt b/app/src/main/java/com/casic/xz/meterage/view/search/SearchEquipmentActivity.kt index f5c98d6..3551790 100644 --- a/app/src/main/java/com/casic/xz/meterage/view/search/SearchEquipmentActivity.kt +++ b/app/src/main/java/com/casic/xz/meterage/view/search/SearchEquipmentActivity.kt @@ -1,27 +1,98 @@ package com.casic.xz.meterage.view.search import com.casic.xz.meterage.R +import com.casic.xz.meterage.bean.SearchHistoryBean import com.casic.xz.meterage.extensions.initLayoutImmersionBar +import com.casic.xz.meterage.utils.DataBaseManager +import com.casic.xz.meterage.utils.SearchType import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter +import com.pengxh.kt.lite.adapter.ViewHolder import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.utils.WeakReferenceHandler +import com.pengxh.kt.lite.widget.dialog.AlertControlDialog import kotlinx.android.synthetic.main.activity_search_equipment.* import kotlinx.android.synthetic.main.include_search_input_title.* + /** * 搜索仪器设备 * */ class SearchEquipmentActivity : KotlinBaseActivity() { - override fun initData() { + private lateinit var weakReferenceHandler: WeakReferenceHandler + private lateinit var historyAdapter: NormalRecyclerAdapter + private var dataBeans: MutableList = ArrayList() + private var isRefresh = false + override fun initData() { + weakReferenceHandler = WeakReferenceHandler { + if (it.what == 2023031001) { + if (isRefresh) { + historyAdapter.notifyDataSetChanged() + } else { + historyAdapter = object : + NormalRecyclerAdapter( + R.layout.item_search_rv_l, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, position: Int, item: SearchHistoryBean + ) { + viewHolder.setText(R.id.searchTagView, item.keywords) + } + } + historyRecyclerView.adapter = historyAdapter + historyAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked(position: Int, t: SearchHistoryBean) { + navigatePageTo(t.keywords) + } + }) + } + } + true + } + } + + override fun onResume() { + super.onResume() + dataBeans = DataBaseManager.get.queryHistoryByType(SearchType.Equipment) + weakReferenceHandler.sendEmptyMessage(2023031001) } override fun initEvent() { leftBackView.setOnClickListener { finish() } searchTextView.setOnClickListener { + if (!inputView.text.isNullOrBlank()) { + DataBaseManager.get.addSearchHistory( + inputView.text.toString(), SearchType.Equipment + ) + } + navigatePageTo(inputView.text.toString()) } + + deleteHistoryView.setOnClickListener { + AlertControlDialog.Builder() + .setContext(this) + .setTitle("提示") + .setMessage("确定将所有搜索记录删除?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + + } + + override fun onConfirmClick() { + DataBaseManager.get.deleteHistoryByType(SearchType.Equipment) + dataBeans.clear() + historyAdapter.notifyDataSetChanged() + } + }).build().show() + } } override fun initLayoutView(): Int = R.layout.activity_search_equipment @@ -35,9 +106,4 @@ initLayoutImmersionBar(rootView) inputView.hint = "查询设备名称、编号" } - - override fun onResume() { - super.onResume() - //TODO 流式布局显示查询记录Tag? - } } \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_delete.xml b/app/src/main/res/drawable/ic_delete.xml new file mode 100644 index 0000000..1810342 --- /dev/null +++ b/app/src/main/res/drawable/ic_delete.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/build.gradle b/app/build.gradle index 298f687..e142ec1 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -3,6 +3,7 @@ apply plugin: 'com.android.application' apply plugin: 'kotlin-android' apply plugin: 'kotlin-android-extensions' +apply plugin: 'org.greenrobot.greendao' android { signingConfigs { @@ -57,6 +58,12 @@ outputFileName = "XZJL_" + getBuildDate() + "_Beta.apk" } } + + greendao { + schemaVersion 1//数据库版本号 + targetGenDir 'src/main/java'//设置DaoMaster、DaoSession、Dao目录 + daoPackage 'com.casic.xz.meterage.greendao'//设置DaoMaster、DaoSession、Dao包名 + } } static def getBuildDate() { @@ -67,7 +74,7 @@ dependencies { //基础依赖库 implementation 'com.github.AndroidCoderPeng:Kotlin-lite-lib:1.0.4' - implementation 'androidx.appcompat:appcompat:1.5.1' + implementation 'androidx.appcompat:appcompat:1.6.1' implementation 'androidx.core:core-ktx:1.9.0' //Google官方授权框架 implementation 'pub.devrel:easypermissions:3.0.0' @@ -113,4 +120,6 @@ implementation 'com.github.tiann:FreeReflection:3.1.0' //单项/数字、二三级联动、日期/时间等滚轮选择器 implementation 'com.github.gzu-liyujiang.AndroidPicker:WheelPicker:4.1.8' + //数据库框架 + implementation 'org.greenrobot:greendao:3.3.0' } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 972eff9..5b6f9b2 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -69,6 +69,8 @@ + + diff --git a/app/src/main/java/com/casic/xz/meterage/base/BaseApplication.kt b/app/src/main/java/com/casic/xz/meterage/base/BaseApplication.kt index 14a604d..1684c23 100644 --- a/app/src/main/java/com/casic/xz/meterage/base/BaseApplication.kt +++ b/app/src/main/java/com/casic/xz/meterage/base/BaseApplication.kt @@ -2,6 +2,8 @@ import android.app.Application import android.content.Context +import com.casic.xz.meterage.greendao.DaoMaster +import com.casic.xz.meterage.greendao.DaoSession import com.pengxh.kt.lite.utils.SaveKeyValues import me.weishu.reflection.Reflection import kotlin.properties.Delegates @@ -12,12 +14,22 @@ private var application: BaseApplication by Delegates.notNull() fun get() = application + + private lateinit var daoSession: DaoSession } override fun onCreate() { super.onCreate() application = this SaveKeyValues.initSharedPreferences(this) + + val devOpenHelper = DaoMaster.DevOpenHelper(this, "Meterage.db", null) + val daoMaster = DaoMaster(devOpenHelper.writableDatabase) + daoSession = daoMaster.newSession() + } + + fun getDaoSession(): DaoSession { + return daoSession } //绕过Android 11以上反射限制 diff --git a/app/src/main/java/com/casic/xz/meterage/bean/SearchHistoryBean.java b/app/src/main/java/com/casic/xz/meterage/bean/SearchHistoryBean.java new file mode 100644 index 0000000..6a46a3a --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/bean/SearchHistoryBean.java @@ -0,0 +1,82 @@ +package com.casic.xz.meterage.bean; + +import org.greenrobot.greendao.annotation.Entity; +import org.greenrobot.greendao.annotation.Generated; +import org.greenrobot.greendao.annotation.Id; +import org.greenrobot.greendao.annotation.Unique; + +@Entity +public class SearchHistoryBean { + @Id(autoincrement = true) + private Long id;//主键自增 + + @Unique + private String uuid; + private String keywords;//查询条件-关键字 + private String searchType;//查询类型 + private String userId;//用户Id + private String searchTime;//查询的时间 + + @Generated(hash = 2130561778) + public SearchHistoryBean(Long id, String uuid, String keywords, + String searchType, String userId, String searchTime) { + this.id = id; + this.uuid = uuid; + this.keywords = keywords; + this.searchType = searchType; + this.userId = userId; + this.searchTime = searchTime; + } + + @Generated(hash = 1570282321) + public SearchHistoryBean() { + } + + public Long getId() { + return this.id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getUuid() { + return this.uuid; + } + + public void setUuid(String uuid) { + this.uuid = uuid; + } + + public String getKeywords() { + return this.keywords; + } + + public void setKeywords(String keywords) { + this.keywords = keywords; + } + + public String getSearchType() { + return this.searchType; + } + + public void setSearchType(String searchType) { + this.searchType = searchType; + } + + public String getUserId() { + return this.userId; + } + + public void setUserId(String userId) { + this.userId = userId; + } + + public String getSearchTime() { + return this.searchTime; + } + + public void setSearchTime(String searchTime) { + this.searchTime = searchTime; + } +} diff --git a/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt index 151f951..ae7f5e4 100644 --- a/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt +++ b/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt @@ -15,22 +15,20 @@ import com.casic.xz.meterage.extensions.showEmptyPage import com.casic.xz.meterage.model.NoticeListModel import com.casic.xz.meterage.model.RemindListModel -import com.casic.xz.meterage.model.UserInfoModel import com.casic.xz.meterage.utils.LoadingDialogHub import com.casic.xz.meterage.utils.LocaleConstant import com.casic.xz.meterage.utils.QrConfigCreator import com.casic.xz.meterage.view.home.* import com.casic.xz.meterage.view.notice.NoticeListActivity +import com.casic.xz.meterage.view.search.SearchAllActivity import com.casic.xz.meterage.vm.MeterageTrainViewModel import com.casic.xz.meterage.vm.NoticeViewModel -import com.casic.xz.meterage.vm.UserViewModel import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter import com.pengxh.kt.lite.adapter.ViewHolder import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.convertColor import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show -import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.utils.WeakReferenceHandler import com.pengxh.kt.lite.vm.LoadState import com.pengxh.kt.lite.widget.dialog.AlertControlDialog @@ -39,13 +37,12 @@ import kotlinx.android.synthetic.main.include_empty_view.* import java.util.* -class HomePageFragment : KotlinBaseFragment() { +class HomePageFragment(private val userId: String) : KotlinBaseFragment() { private val timer = object : Timer() {} private lateinit var weakReferenceHandler: WeakReferenceHandler private lateinit var meterageTrainViewModel: MeterageTrainViewModel private lateinit var noticeViewModel: NoticeViewModel - private lateinit var userData: UserInfoModel.DataModel private lateinit var remindAdapter: NormalRecyclerAdapter private var dataBeans: MutableList = ArrayList() private var noticeBeans: MutableList = ArrayList() @@ -170,14 +167,6 @@ true } - val userViewModel = ViewModelProvider(this)[UserViewModel::class.java] - userViewModel.getUserInfo(SaveKeyValues.getValue(LocaleConstant.ACCOUNT, "") as String) - userViewModel.userInfo.observe(this) { - if (it.code == 200) { - userData = it.data - } - } - meterageTrainViewModel = ViewModelProvider(this)[MeterageTrainViewModel::class.java] meterageTrainViewModel.signInResult.observe(this) { if (it.code == 200) { @@ -296,10 +285,14 @@ } override fun initEvent() { + searchBar.setOnClickListener { + requireContext().navigatePageTo() + } + scanCodeView.setOnClickListener { qrManager.startScan(requireActivity()) { result -> if (result.content.isDigitsOnly()) { - meterageTrainViewModel.signIn(userData.id, result.content) + meterageTrainViewModel.signIn(userId, result.content) } else { "签到二维码错误,请重新扫描".show(requireContext()) } diff --git a/app/src/main/java/com/casic/xz/meterage/greendao/DaoMaster.java b/app/src/main/java/com/casic/xz/meterage/greendao/DaoMaster.java new file mode 100644 index 0000000..d714ce2 --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/greendao/DaoMaster.java @@ -0,0 +1,96 @@ +package com.casic.xz.meterage.greendao; + +import android.content.Context; +import android.database.sqlite.SQLiteDatabase; +import android.database.sqlite.SQLiteDatabase.CursorFactory; +import android.util.Log; + +import org.greenrobot.greendao.AbstractDaoMaster; +import org.greenrobot.greendao.database.Database; +import org.greenrobot.greendao.database.DatabaseOpenHelper; +import org.greenrobot.greendao.database.StandardDatabase; +import org.greenrobot.greendao.identityscope.IdentityScopeType; + + +// THIS CODE IS GENERATED BY greenDAO, DO NOT EDIT. +/** + * Master of DAO (schema version 1): knows all DAOs. + */ +public class DaoMaster extends AbstractDaoMaster { + public static final int SCHEMA_VERSION = 1; + + /** Creates underlying database table using DAOs. */ + public static void createAllTables(Database db, boolean ifNotExists) { + SearchHistoryBeanDao.createTable(db, ifNotExists); + } + + /** Drops underlying database table using DAOs. */ + public static void dropAllTables(Database db, boolean ifExists) { + SearchHistoryBeanDao.dropTable(db, ifExists); + } + + /** + * WARNING: Drops all table on Upgrade! Use only during development. + * Convenience method using a {@link DevOpenHelper}. + */ + public static DaoSession newDevSession(Context context, String name) { + Database db = new DevOpenHelper(context, name).getWritableDb(); + DaoMaster daoMaster = new DaoMaster(db); + return daoMaster.newSession(); + } + + public DaoMaster(SQLiteDatabase db) { + this(new StandardDatabase(db)); + } + + public DaoMaster(Database db) { + super(db, SCHEMA_VERSION); + registerDaoClass(SearchHistoryBeanDao.class); + } + + public DaoSession newSession() { + return new DaoSession(db, IdentityScopeType.Session, daoConfigMap); + } + + public DaoSession newSession(IdentityScopeType type) { + return new DaoSession(db, type, daoConfigMap); + } + + /** + * Calls {@link #createAllTables(Database, boolean)} in {@link #onCreate(Database)} - + */ + public static abstract class OpenHelper extends DatabaseOpenHelper { + public OpenHelper(Context context, String name) { + super(context, name, SCHEMA_VERSION); + } + + public OpenHelper(Context context, String name, CursorFactory factory) { + super(context, name, factory, SCHEMA_VERSION); + } + + @Override + public void onCreate(Database db) { + Log.i("greenDAO", "Creating tables for schema version " + SCHEMA_VERSION); + createAllTables(db, false); + } + } + + /** WARNING: Drops all table on Upgrade! Use only during development. */ + public static class DevOpenHelper extends OpenHelper { + public DevOpenHelper(Context context, String name) { + super(context, name); + } + + public DevOpenHelper(Context context, String name, CursorFactory factory) { + super(context, name, factory); + } + + @Override + public void onUpgrade(Database db, int oldVersion, int newVersion) { + Log.i("greenDAO", "Upgrading schema from version " + oldVersion + " to " + newVersion + " by dropping all tables"); + dropAllTables(db, true); + onCreate(db); + } + } + +} diff --git a/app/src/main/java/com/casic/xz/meterage/greendao/DaoSession.java b/app/src/main/java/com/casic/xz/meterage/greendao/DaoSession.java new file mode 100644 index 0000000..0e80024 --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/greendao/DaoSession.java @@ -0,0 +1,46 @@ +package com.casic.xz.meterage.greendao; + +import com.casic.xz.meterage.bean.SearchHistoryBean; + +import org.greenrobot.greendao.AbstractDao; +import org.greenrobot.greendao.AbstractDaoSession; +import org.greenrobot.greendao.database.Database; +import org.greenrobot.greendao.identityscope.IdentityScopeType; +import org.greenrobot.greendao.internal.DaoConfig; + +import java.util.Map; + +// THIS CODE IS GENERATED BY greenDAO, DO NOT EDIT. + +/** + * {@inheritDoc} + * + * @see org.greenrobot.greendao.AbstractDaoSession + */ +public class DaoSession extends AbstractDaoSession { + + private final DaoConfig searchHistoryBeanDaoConfig; + + private final SearchHistoryBeanDao searchHistoryBeanDao; + + public DaoSession(Database db, IdentityScopeType type, Map>, DaoConfig> + daoConfigMap) { + super(db); + + searchHistoryBeanDaoConfig = daoConfigMap.get(SearchHistoryBeanDao.class).clone(); + searchHistoryBeanDaoConfig.initIdentityScope(type); + + searchHistoryBeanDao = new SearchHistoryBeanDao(searchHistoryBeanDaoConfig, this); + + registerDao(SearchHistoryBean.class, searchHistoryBeanDao); + } + + public void clear() { + searchHistoryBeanDaoConfig.clearIdentityScope(); + } + + public SearchHistoryBeanDao getSearchHistoryBeanDao() { + return searchHistoryBeanDao; + } + +} diff --git a/app/src/main/java/com/casic/xz/meterage/greendao/SearchHistoryBeanDao.java b/app/src/main/java/com/casic/xz/meterage/greendao/SearchHistoryBeanDao.java new file mode 100644 index 0000000..5923d02 --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/greendao/SearchHistoryBeanDao.java @@ -0,0 +1,185 @@ +package com.casic.xz.meterage.greendao; + +import android.database.Cursor; +import android.database.sqlite.SQLiteStatement; + +import com.casic.xz.meterage.bean.SearchHistoryBean; + +import org.greenrobot.greendao.AbstractDao; +import org.greenrobot.greendao.Property; +import org.greenrobot.greendao.database.Database; +import org.greenrobot.greendao.database.DatabaseStatement; +import org.greenrobot.greendao.internal.DaoConfig; + +// THIS CODE IS GENERATED BY greenDAO, DO NOT EDIT. +/** + * DAO for table "SEARCH_HISTORY_BEAN". +*/ +public class SearchHistoryBeanDao extends AbstractDao { + + public static final String TABLENAME = "SEARCH_HISTORY_BEAN"; + + /** + * Properties of entity SearchHistoryBean.
+ * Can be used for QueryBuilder and for referencing column names. + */ + public static class Properties { + public final static Property Id = new Property(0, Long.class, "id", true, "_id"); + public final static Property Uuid = new Property(1, String.class, "uuid", false, "UUID"); + public final static Property Keywords = new Property(2, String.class, "keywords", false, "KEYWORDS"); + public final static Property SearchType = new Property(3, String.class, "searchType", false, "SEARCH_TYPE"); + public final static Property UserId = new Property(4, String.class, "userId", false, "USER_ID"); + public final static Property SearchTime = new Property(5, String.class, "searchTime", false, "SEARCH_TIME"); + } + + + public SearchHistoryBeanDao(DaoConfig config) { + super(config); + } + + public SearchHistoryBeanDao(DaoConfig config, DaoSession daoSession) { + super(config, daoSession); + } + + /** Creates the underlying database table. */ + public static void createTable(Database db, boolean ifNotExists) { + String constraint = ifNotExists? "IF NOT EXISTS ": ""; + db.execSQL("CREATE TABLE " + constraint + "\"SEARCH_HISTORY_BEAN\" (" + // + "\"_id\" INTEGER PRIMARY KEY AUTOINCREMENT ," + // 0: id + "\"UUID\" TEXT UNIQUE ," + // 1: uuid + "\"KEYWORDS\" TEXT," + // 2: keywords + "\"SEARCH_TYPE\" TEXT," + // 3: searchType + "\"USER_ID\" TEXT," + // 4: userId + "\"SEARCH_TIME\" TEXT);"); // 5: searchTime + } + + /** Drops the underlying database table. */ + public static void dropTable(Database db, boolean ifExists) { + String sql = "DROP TABLE " + (ifExists ? "IF EXISTS " : "") + "\"SEARCH_HISTORY_BEAN\""; + db.execSQL(sql); + } + + @Override + protected final void bindValues(DatabaseStatement stmt, SearchHistoryBean entity) { + stmt.clearBindings(); + + Long id = entity.getId(); + if (id != null) { + stmt.bindLong(1, id); + } + + String uuid = entity.getUuid(); + if (uuid != null) { + stmt.bindString(2, uuid); + } + + String keywords = entity.getKeywords(); + if (keywords != null) { + stmt.bindString(3, keywords); + } + + String searchType = entity.getSearchType(); + if (searchType != null) { + stmt.bindString(4, searchType); + } + + String userId = entity.getUserId(); + if (userId != null) { + stmt.bindString(5, userId); + } + + String searchTime = entity.getSearchTime(); + if (searchTime != null) { + stmt.bindString(6, searchTime); + } + } + + @Override + protected final void bindValues(SQLiteStatement stmt, SearchHistoryBean entity) { + stmt.clearBindings(); + + Long id = entity.getId(); + if (id != null) { + stmt.bindLong(1, id); + } + + String uuid = entity.getUuid(); + if (uuid != null) { + stmt.bindString(2, uuid); + } + + String keywords = entity.getKeywords(); + if (keywords != null) { + stmt.bindString(3, keywords); + } + + String searchType = entity.getSearchType(); + if (searchType != null) { + stmt.bindString(4, searchType); + } + + String userId = entity.getUserId(); + if (userId != null) { + stmt.bindString(5, userId); + } + + String searchTime = entity.getSearchTime(); + if (searchTime != null) { + stmt.bindString(6, searchTime); + } + } + + @Override + public Long readKey(Cursor cursor, int offset) { + return cursor.isNull(offset + 0) ? null : cursor.getLong(offset + 0); + } + + @Override + public SearchHistoryBean readEntity(Cursor cursor, int offset) { + SearchHistoryBean entity = new SearchHistoryBean( // + cursor.isNull(offset + 0) ? null : cursor.getLong(offset + 0), // id + cursor.isNull(offset + 1) ? null : cursor.getString(offset + 1), // uuid + cursor.isNull(offset + 2) ? null : cursor.getString(offset + 2), // keywords + cursor.isNull(offset + 3) ? null : cursor.getString(offset + 3), // searchType + cursor.isNull(offset + 4) ? null : cursor.getString(offset + 4), // userId + cursor.isNull(offset + 5) ? null : cursor.getString(offset + 5) // searchTime + ); + return entity; + } + + @Override + public void readEntity(Cursor cursor, SearchHistoryBean entity, int offset) { + entity.setId(cursor.isNull(offset + 0) ? null : cursor.getLong(offset + 0)); + entity.setUuid(cursor.isNull(offset + 1) ? null : cursor.getString(offset + 1)); + entity.setKeywords(cursor.isNull(offset + 2) ? null : cursor.getString(offset + 2)); + entity.setSearchType(cursor.isNull(offset + 3) ? null : cursor.getString(offset + 3)); + entity.setUserId(cursor.isNull(offset + 4) ? null : cursor.getString(offset + 4)); + entity.setSearchTime(cursor.isNull(offset + 5) ? null : cursor.getString(offset + 5)); + } + + @Override + protected final Long updateKeyAfterInsert(SearchHistoryBean entity, long rowId) { + entity.setId(rowId); + return rowId; + } + + @Override + public Long getKey(SearchHistoryBean entity) { + if(entity != null) { + return entity.getId(); + } else { + return null; + } + } + + @Override + public boolean hasKey(SearchHistoryBean entity) { + return entity.getId() != null; + } + + @Override + protected final boolean isEntityUpdateable() { + return true; + } + +} diff --git a/app/src/main/java/com/casic/xz/meterage/utils/DataBaseManager.kt b/app/src/main/java/com/casic/xz/meterage/utils/DataBaseManager.kt new file mode 100644 index 0000000..52fe032 --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/utils/DataBaseManager.kt @@ -0,0 +1,45 @@ +package com.casic.xz.meterage.utils + +import com.casic.xz.meterage.base.BaseApplication +import com.casic.xz.meterage.bean.SearchHistoryBean +import com.casic.xz.meterage.greendao.SearchHistoryBeanDao +import com.pengxh.kt.lite.extensions.timestampToCompleteDate +import com.pengxh.kt.lite.utils.SaveKeyValues +import java.util.* + +class DataBaseManager private constructor() { + + companion object { + //Kotlin委托模式双重锁单例 + val get: DataBaseManager by lazy(mode = LazyThreadSafetyMode.SYNCHRONIZED) { + DataBaseManager() + } + } + + private val searchBeanDao by lazy { BaseApplication.get().getDaoSession().searchHistoryBeanDao } + private val userId by lazy { SaveKeyValues.getValue(LocaleConstant.USER_ID, "") } + + fun addSearchHistory(keywords: String, searchType: String) { + val bean = SearchHistoryBean() + bean.uuid = UUID.randomUUID().toString() + bean.keywords = keywords + bean.searchType = searchType + bean.userId = userId.toString() + bean.searchTime = System.currentTimeMillis().timestampToCompleteDate() + searchBeanDao.insert(bean) + } + + fun queryHistoryByType(searchType: String): MutableList { + return searchBeanDao.queryBuilder().where( + SearchHistoryBeanDao.Properties.UserId.eq(userId), + SearchHistoryBeanDao.Properties.SearchType.eq(searchType) + ).list() + } + + fun deleteHistoryByType(searchType: String) { + val list = queryHistoryByType(searchType) + list.forEach { + searchBeanDao.delete(it) + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/utils/LocaleConstant.kt b/app/src/main/java/com/casic/xz/meterage/utils/LocaleConstant.kt index cc2848b..2ea47a0 100644 --- a/app/src/main/java/com/casic/xz/meterage/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/xz/meterage/utils/LocaleConstant.kt @@ -62,4 +62,5 @@ const val File_SERVER_URL = "http://111.198.10.15:21408" const val ACCOUNT = "account" const val PASSWORD = "password" + const val USER_ID = "userId" } \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/utils/SearchType.kt b/app/src/main/java/com/casic/xz/meterage/utils/SearchType.kt new file mode 100644 index 0000000..5f5253e --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/utils/SearchType.kt @@ -0,0 +1,8 @@ +package com.casic.xz.meterage.utils + +object SearchType { + /** + * 搜索仪器设备 + * */ + const val Equipment = "0" +} diff --git a/app/src/main/java/com/casic/xz/meterage/view/MainActivity.kt b/app/src/main/java/com/casic/xz/meterage/view/MainActivity.kt index 28836e0..8fb0793 100644 --- a/app/src/main/java/com/casic/xz/meterage/view/MainActivity.kt +++ b/app/src/main/java/com/casic/xz/meterage/view/MainActivity.kt @@ -3,15 +3,19 @@ import android.view.KeyEvent import android.view.MenuItem import androidx.fragment.app.Fragment +import androidx.lifecycle.ViewModelProvider import androidx.viewpager.widget.ViewPager import com.casic.xz.meterage.R import com.casic.xz.meterage.adapter.ViewPagerAdapter import com.casic.xz.meterage.fragment.HomePageFragment import com.casic.xz.meterage.fragment.MinePageFragment import com.casic.xz.meterage.fragment.SamplePageFragment +import com.casic.xz.meterage.utils.LocaleConstant +import com.casic.xz.meterage.vm.UserViewModel import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.SaveKeyValues import kotlinx.android.synthetic.main.activity_main.* class MainActivity : KotlinBaseActivity() { @@ -20,53 +24,59 @@ private var fragmentPages: ArrayList = ArrayList() private var clickTime: Long = 0 - init { - fragmentPages.add(HomePageFragment()) - fragmentPages.add(SamplePageFragment()) - fragmentPages.add(MinePageFragment()) - } - override fun initData() { - bottomNavigation.itemIconTintList = null - bottomNavigation.setOnNavigationItemSelectedListener { menuItem -> - when (menuItem.itemId) { - R.id.nav_home -> { - mainViewPager.currentItem = 0 + val userViewModel = ViewModelProvider(this)[UserViewModel::class.java] + userViewModel.getUserInfo(SaveKeyValues.getValue(LocaleConstant.ACCOUNT, "") as String) + userViewModel.userInfo.observe(this) { + if (it.code == 200) { + SaveKeyValues.putValue(LocaleConstant.USER_ID, it.data.id) + + fragmentPages.add(HomePageFragment(it.data.id)) + fragmentPages.add(SamplePageFragment()) + fragmentPages.add(MinePageFragment()) + + bottomNavigation.itemIconTintList = null + bottomNavigation.setOnNavigationItemSelectedListener { menuItem -> + when (menuItem.itemId) { + R.id.nav_home -> { + mainViewPager.currentItem = 0 + } + R.id.nav_sample -> { + mainViewPager.currentItem = 1 + } + R.id.nav_mine -> { + mainViewPager.currentItem = 2 + } + } + false } - R.id.nav_sample -> { - mainViewPager.currentItem = 1 - } - R.id.nav_mine -> { - mainViewPager.currentItem = 2 - } + mainViewPager.adapter = ViewPagerAdapter(fragmentPages, supportFragmentManager) + mainViewPager.offscreenPageLimit = fragmentPages.size //缓存页数 + mainViewPager.addOnPageChangeListener(object : ViewPager.OnPageChangeListener { + override fun onPageScrollStateChanged(state: Int) { + + } + + override fun onPageScrolled( + position: Int, + positionOffset: Float, + positionOffsetPixels: Int + ) { + + } + + override fun onPageSelected(position: Int) { + if (menuItem != null) { + menuItem!!.isChecked = false + } else { + bottomNavigation.menu.getItem(0).isChecked = false + } + menuItem = bottomNavigation.menu.getItem(position) + menuItem!!.isChecked = true + } + }) } - false } - mainViewPager.adapter = ViewPagerAdapter(fragmentPages, supportFragmentManager) - mainViewPager.offscreenPageLimit = fragmentPages.size //缓存页数 - mainViewPager.addOnPageChangeListener(object : ViewPager.OnPageChangeListener { - override fun onPageScrollStateChanged(state: Int) { - - } - - override fun onPageScrolled( - position: Int, - positionOffset: Float, - positionOffsetPixels: Int - ) { - - } - - override fun onPageSelected(position: Int) { - if (menuItem != null) { - menuItem!!.isChecked = false - } else { - bottomNavigation.menu.getItem(0).isChecked = false - } - menuItem = bottomNavigation.menu.getItem(position) - menuItem!!.isChecked = true - } - }) } override fun initEvent() { diff --git a/app/src/main/java/com/casic/xz/meterage/view/search/SearchAllActivity.kt b/app/src/main/java/com/casic/xz/meterage/view/search/SearchAllActivity.kt new file mode 100644 index 0000000..ecc8fd7 --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/view/search/SearchAllActivity.kt @@ -0,0 +1,40 @@ +package com.casic.xz.meterage.view.search + +import com.casic.xz.meterage.R +import com.casic.xz.meterage.extensions.initLayoutImmersionBar +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.navigatePageTo +import kotlinx.android.synthetic.main.activity_search_all.* +import kotlinx.android.synthetic.main.include_search_input_title.* + +class SearchAllActivity : KotlinBaseActivity() { + + override fun initData() { + + } + + override fun initEvent() { + leftBackView.setOnClickListener { finish() } + searchTextView.setOnClickListener { + navigatePageTo(inputView.text.toString()) + } + } + + override fun initLayoutView(): Int = R.layout.activity_search_all + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + initLayoutImmersionBar(rootView) + inputView.hint = "查询样品、业务" + } + + override fun onResume() { + super.onResume() + //TODO 流式布局显示查询记录Tag? + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/view/search/SearchAllResultActivity.kt b/app/src/main/java/com/casic/xz/meterage/view/search/SearchAllResultActivity.kt new file mode 100644 index 0000000..adbb570 --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/view/search/SearchAllResultActivity.kt @@ -0,0 +1,34 @@ +package com.casic.xz.meterage.view.search + +import com.casic.xz.meterage.R +import com.casic.xz.meterage.extensions.initLayoutImmersionBar +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.utils.Constant +import kotlinx.android.synthetic.main.activity_search_all_reasult.* +import kotlinx.android.synthetic.main.include_search_title.* + +class SearchAllResultActivity : KotlinBaseActivity() { + + private lateinit var param: String + + override fun initData() { + param = intent.getStringExtra(Constant.INTENT_PARAM)!! + } + + override fun initEvent() { + leftBackView.setOnClickListener { finish() } + } + + override fun initLayoutView(): Int = R.layout.activity_search_all_reasult + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + initLayoutImmersionBar(rootView) + titleView.text = "查询结果" + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/view/search/SearchEquipmentActivity.kt b/app/src/main/java/com/casic/xz/meterage/view/search/SearchEquipmentActivity.kt index f5c98d6..3551790 100644 --- a/app/src/main/java/com/casic/xz/meterage/view/search/SearchEquipmentActivity.kt +++ b/app/src/main/java/com/casic/xz/meterage/view/search/SearchEquipmentActivity.kt @@ -1,27 +1,98 @@ package com.casic.xz.meterage.view.search import com.casic.xz.meterage.R +import com.casic.xz.meterage.bean.SearchHistoryBean import com.casic.xz.meterage.extensions.initLayoutImmersionBar +import com.casic.xz.meterage.utils.DataBaseManager +import com.casic.xz.meterage.utils.SearchType import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter +import com.pengxh.kt.lite.adapter.ViewHolder import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.utils.WeakReferenceHandler +import com.pengxh.kt.lite.widget.dialog.AlertControlDialog import kotlinx.android.synthetic.main.activity_search_equipment.* import kotlinx.android.synthetic.main.include_search_input_title.* + /** * 搜索仪器设备 * */ class SearchEquipmentActivity : KotlinBaseActivity() { - override fun initData() { + private lateinit var weakReferenceHandler: WeakReferenceHandler + private lateinit var historyAdapter: NormalRecyclerAdapter + private var dataBeans: MutableList = ArrayList() + private var isRefresh = false + override fun initData() { + weakReferenceHandler = WeakReferenceHandler { + if (it.what == 2023031001) { + if (isRefresh) { + historyAdapter.notifyDataSetChanged() + } else { + historyAdapter = object : + NormalRecyclerAdapter( + R.layout.item_search_rv_l, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, position: Int, item: SearchHistoryBean + ) { + viewHolder.setText(R.id.searchTagView, item.keywords) + } + } + historyRecyclerView.adapter = historyAdapter + historyAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked(position: Int, t: SearchHistoryBean) { + navigatePageTo(t.keywords) + } + }) + } + } + true + } + } + + override fun onResume() { + super.onResume() + dataBeans = DataBaseManager.get.queryHistoryByType(SearchType.Equipment) + weakReferenceHandler.sendEmptyMessage(2023031001) } override fun initEvent() { leftBackView.setOnClickListener { finish() } searchTextView.setOnClickListener { + if (!inputView.text.isNullOrBlank()) { + DataBaseManager.get.addSearchHistory( + inputView.text.toString(), SearchType.Equipment + ) + } + navigatePageTo(inputView.text.toString()) } + + deleteHistoryView.setOnClickListener { + AlertControlDialog.Builder() + .setContext(this) + .setTitle("提示") + .setMessage("确定将所有搜索记录删除?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + + } + + override fun onConfirmClick() { + DataBaseManager.get.deleteHistoryByType(SearchType.Equipment) + dataBeans.clear() + historyAdapter.notifyDataSetChanged() + } + }).build().show() + } } override fun initLayoutView(): Int = R.layout.activity_search_equipment @@ -35,9 +106,4 @@ initLayoutImmersionBar(rootView) inputView.hint = "查询设备名称、编号" } - - override fun onResume() { - super.onResume() - //TODO 流式布局显示查询记录Tag? - } } \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_delete.xml b/app/src/main/res/drawable/ic_delete.xml new file mode 100644 index 0000000..1810342 --- /dev/null +++ b/app/src/main/res/drawable/ic_delete.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/layout/activity_search_all.xml b/app/src/main/res/layout/activity_search_all.xml new file mode 100644 index 0000000..45694fb --- /dev/null +++ b/app/src/main/res/layout/activity_search_all.xml @@ -0,0 +1,17 @@ + + + + + + + + + \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index 298f687..e142ec1 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -3,6 +3,7 @@ apply plugin: 'com.android.application' apply plugin: 'kotlin-android' apply plugin: 'kotlin-android-extensions' +apply plugin: 'org.greenrobot.greendao' android { signingConfigs { @@ -57,6 +58,12 @@ outputFileName = "XZJL_" + getBuildDate() + "_Beta.apk" } } + + greendao { + schemaVersion 1//数据库版本号 + targetGenDir 'src/main/java'//设置DaoMaster、DaoSession、Dao目录 + daoPackage 'com.casic.xz.meterage.greendao'//设置DaoMaster、DaoSession、Dao包名 + } } static def getBuildDate() { @@ -67,7 +74,7 @@ dependencies { //基础依赖库 implementation 'com.github.AndroidCoderPeng:Kotlin-lite-lib:1.0.4' - implementation 'androidx.appcompat:appcompat:1.5.1' + implementation 'androidx.appcompat:appcompat:1.6.1' implementation 'androidx.core:core-ktx:1.9.0' //Google官方授权框架 implementation 'pub.devrel:easypermissions:3.0.0' @@ -113,4 +120,6 @@ implementation 'com.github.tiann:FreeReflection:3.1.0' //单项/数字、二三级联动、日期/时间等滚轮选择器 implementation 'com.github.gzu-liyujiang.AndroidPicker:WheelPicker:4.1.8' + //数据库框架 + implementation 'org.greenrobot:greendao:3.3.0' } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 972eff9..5b6f9b2 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -69,6 +69,8 @@ + + diff --git a/app/src/main/java/com/casic/xz/meterage/base/BaseApplication.kt b/app/src/main/java/com/casic/xz/meterage/base/BaseApplication.kt index 14a604d..1684c23 100644 --- a/app/src/main/java/com/casic/xz/meterage/base/BaseApplication.kt +++ b/app/src/main/java/com/casic/xz/meterage/base/BaseApplication.kt @@ -2,6 +2,8 @@ import android.app.Application import android.content.Context +import com.casic.xz.meterage.greendao.DaoMaster +import com.casic.xz.meterage.greendao.DaoSession import com.pengxh.kt.lite.utils.SaveKeyValues import me.weishu.reflection.Reflection import kotlin.properties.Delegates @@ -12,12 +14,22 @@ private var application: BaseApplication by Delegates.notNull() fun get() = application + + private lateinit var daoSession: DaoSession } override fun onCreate() { super.onCreate() application = this SaveKeyValues.initSharedPreferences(this) + + val devOpenHelper = DaoMaster.DevOpenHelper(this, "Meterage.db", null) + val daoMaster = DaoMaster(devOpenHelper.writableDatabase) + daoSession = daoMaster.newSession() + } + + fun getDaoSession(): DaoSession { + return daoSession } //绕过Android 11以上反射限制 diff --git a/app/src/main/java/com/casic/xz/meterage/bean/SearchHistoryBean.java b/app/src/main/java/com/casic/xz/meterage/bean/SearchHistoryBean.java new file mode 100644 index 0000000..6a46a3a --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/bean/SearchHistoryBean.java @@ -0,0 +1,82 @@ +package com.casic.xz.meterage.bean; + +import org.greenrobot.greendao.annotation.Entity; +import org.greenrobot.greendao.annotation.Generated; +import org.greenrobot.greendao.annotation.Id; +import org.greenrobot.greendao.annotation.Unique; + +@Entity +public class SearchHistoryBean { + @Id(autoincrement = true) + private Long id;//主键自增 + + @Unique + private String uuid; + private String keywords;//查询条件-关键字 + private String searchType;//查询类型 + private String userId;//用户Id + private String searchTime;//查询的时间 + + @Generated(hash = 2130561778) + public SearchHistoryBean(Long id, String uuid, String keywords, + String searchType, String userId, String searchTime) { + this.id = id; + this.uuid = uuid; + this.keywords = keywords; + this.searchType = searchType; + this.userId = userId; + this.searchTime = searchTime; + } + + @Generated(hash = 1570282321) + public SearchHistoryBean() { + } + + public Long getId() { + return this.id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getUuid() { + return this.uuid; + } + + public void setUuid(String uuid) { + this.uuid = uuid; + } + + public String getKeywords() { + return this.keywords; + } + + public void setKeywords(String keywords) { + this.keywords = keywords; + } + + public String getSearchType() { + return this.searchType; + } + + public void setSearchType(String searchType) { + this.searchType = searchType; + } + + public String getUserId() { + return this.userId; + } + + public void setUserId(String userId) { + this.userId = userId; + } + + public String getSearchTime() { + return this.searchTime; + } + + public void setSearchTime(String searchTime) { + this.searchTime = searchTime; + } +} diff --git a/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt index 151f951..ae7f5e4 100644 --- a/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt +++ b/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt @@ -15,22 +15,20 @@ import com.casic.xz.meterage.extensions.showEmptyPage import com.casic.xz.meterage.model.NoticeListModel import com.casic.xz.meterage.model.RemindListModel -import com.casic.xz.meterage.model.UserInfoModel import com.casic.xz.meterage.utils.LoadingDialogHub import com.casic.xz.meterage.utils.LocaleConstant import com.casic.xz.meterage.utils.QrConfigCreator import com.casic.xz.meterage.view.home.* import com.casic.xz.meterage.view.notice.NoticeListActivity +import com.casic.xz.meterage.view.search.SearchAllActivity import com.casic.xz.meterage.vm.MeterageTrainViewModel import com.casic.xz.meterage.vm.NoticeViewModel -import com.casic.xz.meterage.vm.UserViewModel import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter import com.pengxh.kt.lite.adapter.ViewHolder import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.convertColor import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show -import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.utils.WeakReferenceHandler import com.pengxh.kt.lite.vm.LoadState import com.pengxh.kt.lite.widget.dialog.AlertControlDialog @@ -39,13 +37,12 @@ import kotlinx.android.synthetic.main.include_empty_view.* import java.util.* -class HomePageFragment : KotlinBaseFragment() { +class HomePageFragment(private val userId: String) : KotlinBaseFragment() { private val timer = object : Timer() {} private lateinit var weakReferenceHandler: WeakReferenceHandler private lateinit var meterageTrainViewModel: MeterageTrainViewModel private lateinit var noticeViewModel: NoticeViewModel - private lateinit var userData: UserInfoModel.DataModel private lateinit var remindAdapter: NormalRecyclerAdapter private var dataBeans: MutableList = ArrayList() private var noticeBeans: MutableList = ArrayList() @@ -170,14 +167,6 @@ true } - val userViewModel = ViewModelProvider(this)[UserViewModel::class.java] - userViewModel.getUserInfo(SaveKeyValues.getValue(LocaleConstant.ACCOUNT, "") as String) - userViewModel.userInfo.observe(this) { - if (it.code == 200) { - userData = it.data - } - } - meterageTrainViewModel = ViewModelProvider(this)[MeterageTrainViewModel::class.java] meterageTrainViewModel.signInResult.observe(this) { if (it.code == 200) { @@ -296,10 +285,14 @@ } override fun initEvent() { + searchBar.setOnClickListener { + requireContext().navigatePageTo() + } + scanCodeView.setOnClickListener { qrManager.startScan(requireActivity()) { result -> if (result.content.isDigitsOnly()) { - meterageTrainViewModel.signIn(userData.id, result.content) + meterageTrainViewModel.signIn(userId, result.content) } else { "签到二维码错误,请重新扫描".show(requireContext()) } diff --git a/app/src/main/java/com/casic/xz/meterage/greendao/DaoMaster.java b/app/src/main/java/com/casic/xz/meterage/greendao/DaoMaster.java new file mode 100644 index 0000000..d714ce2 --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/greendao/DaoMaster.java @@ -0,0 +1,96 @@ +package com.casic.xz.meterage.greendao; + +import android.content.Context; +import android.database.sqlite.SQLiteDatabase; +import android.database.sqlite.SQLiteDatabase.CursorFactory; +import android.util.Log; + +import org.greenrobot.greendao.AbstractDaoMaster; +import org.greenrobot.greendao.database.Database; +import org.greenrobot.greendao.database.DatabaseOpenHelper; +import org.greenrobot.greendao.database.StandardDatabase; +import org.greenrobot.greendao.identityscope.IdentityScopeType; + + +// THIS CODE IS GENERATED BY greenDAO, DO NOT EDIT. +/** + * Master of DAO (schema version 1): knows all DAOs. + */ +public class DaoMaster extends AbstractDaoMaster { + public static final int SCHEMA_VERSION = 1; + + /** Creates underlying database table using DAOs. */ + public static void createAllTables(Database db, boolean ifNotExists) { + SearchHistoryBeanDao.createTable(db, ifNotExists); + } + + /** Drops underlying database table using DAOs. */ + public static void dropAllTables(Database db, boolean ifExists) { + SearchHistoryBeanDao.dropTable(db, ifExists); + } + + /** + * WARNING: Drops all table on Upgrade! Use only during development. + * Convenience method using a {@link DevOpenHelper}. + */ + public static DaoSession newDevSession(Context context, String name) { + Database db = new DevOpenHelper(context, name).getWritableDb(); + DaoMaster daoMaster = new DaoMaster(db); + return daoMaster.newSession(); + } + + public DaoMaster(SQLiteDatabase db) { + this(new StandardDatabase(db)); + } + + public DaoMaster(Database db) { + super(db, SCHEMA_VERSION); + registerDaoClass(SearchHistoryBeanDao.class); + } + + public DaoSession newSession() { + return new DaoSession(db, IdentityScopeType.Session, daoConfigMap); + } + + public DaoSession newSession(IdentityScopeType type) { + return new DaoSession(db, type, daoConfigMap); + } + + /** + * Calls {@link #createAllTables(Database, boolean)} in {@link #onCreate(Database)} - + */ + public static abstract class OpenHelper extends DatabaseOpenHelper { + public OpenHelper(Context context, String name) { + super(context, name, SCHEMA_VERSION); + } + + public OpenHelper(Context context, String name, CursorFactory factory) { + super(context, name, factory, SCHEMA_VERSION); + } + + @Override + public void onCreate(Database db) { + Log.i("greenDAO", "Creating tables for schema version " + SCHEMA_VERSION); + createAllTables(db, false); + } + } + + /** WARNING: Drops all table on Upgrade! Use only during development. */ + public static class DevOpenHelper extends OpenHelper { + public DevOpenHelper(Context context, String name) { + super(context, name); + } + + public DevOpenHelper(Context context, String name, CursorFactory factory) { + super(context, name, factory); + } + + @Override + public void onUpgrade(Database db, int oldVersion, int newVersion) { + Log.i("greenDAO", "Upgrading schema from version " + oldVersion + " to " + newVersion + " by dropping all tables"); + dropAllTables(db, true); + onCreate(db); + } + } + +} diff --git a/app/src/main/java/com/casic/xz/meterage/greendao/DaoSession.java b/app/src/main/java/com/casic/xz/meterage/greendao/DaoSession.java new file mode 100644 index 0000000..0e80024 --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/greendao/DaoSession.java @@ -0,0 +1,46 @@ +package com.casic.xz.meterage.greendao; + +import com.casic.xz.meterage.bean.SearchHistoryBean; + +import org.greenrobot.greendao.AbstractDao; +import org.greenrobot.greendao.AbstractDaoSession; +import org.greenrobot.greendao.database.Database; +import org.greenrobot.greendao.identityscope.IdentityScopeType; +import org.greenrobot.greendao.internal.DaoConfig; + +import java.util.Map; + +// THIS CODE IS GENERATED BY greenDAO, DO NOT EDIT. + +/** + * {@inheritDoc} + * + * @see org.greenrobot.greendao.AbstractDaoSession + */ +public class DaoSession extends AbstractDaoSession { + + private final DaoConfig searchHistoryBeanDaoConfig; + + private final SearchHistoryBeanDao searchHistoryBeanDao; + + public DaoSession(Database db, IdentityScopeType type, Map>, DaoConfig> + daoConfigMap) { + super(db); + + searchHistoryBeanDaoConfig = daoConfigMap.get(SearchHistoryBeanDao.class).clone(); + searchHistoryBeanDaoConfig.initIdentityScope(type); + + searchHistoryBeanDao = new SearchHistoryBeanDao(searchHistoryBeanDaoConfig, this); + + registerDao(SearchHistoryBean.class, searchHistoryBeanDao); + } + + public void clear() { + searchHistoryBeanDaoConfig.clearIdentityScope(); + } + + public SearchHistoryBeanDao getSearchHistoryBeanDao() { + return searchHistoryBeanDao; + } + +} diff --git a/app/src/main/java/com/casic/xz/meterage/greendao/SearchHistoryBeanDao.java b/app/src/main/java/com/casic/xz/meterage/greendao/SearchHistoryBeanDao.java new file mode 100644 index 0000000..5923d02 --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/greendao/SearchHistoryBeanDao.java @@ -0,0 +1,185 @@ +package com.casic.xz.meterage.greendao; + +import android.database.Cursor; +import android.database.sqlite.SQLiteStatement; + +import com.casic.xz.meterage.bean.SearchHistoryBean; + +import org.greenrobot.greendao.AbstractDao; +import org.greenrobot.greendao.Property; +import org.greenrobot.greendao.database.Database; +import org.greenrobot.greendao.database.DatabaseStatement; +import org.greenrobot.greendao.internal.DaoConfig; + +// THIS CODE IS GENERATED BY greenDAO, DO NOT EDIT. +/** + * DAO for table "SEARCH_HISTORY_BEAN". +*/ +public class SearchHistoryBeanDao extends AbstractDao { + + public static final String TABLENAME = "SEARCH_HISTORY_BEAN"; + + /** + * Properties of entity SearchHistoryBean.
+ * Can be used for QueryBuilder and for referencing column names. + */ + public static class Properties { + public final static Property Id = new Property(0, Long.class, "id", true, "_id"); + public final static Property Uuid = new Property(1, String.class, "uuid", false, "UUID"); + public final static Property Keywords = new Property(2, String.class, "keywords", false, "KEYWORDS"); + public final static Property SearchType = new Property(3, String.class, "searchType", false, "SEARCH_TYPE"); + public final static Property UserId = new Property(4, String.class, "userId", false, "USER_ID"); + public final static Property SearchTime = new Property(5, String.class, "searchTime", false, "SEARCH_TIME"); + } + + + public SearchHistoryBeanDao(DaoConfig config) { + super(config); + } + + public SearchHistoryBeanDao(DaoConfig config, DaoSession daoSession) { + super(config, daoSession); + } + + /** Creates the underlying database table. */ + public static void createTable(Database db, boolean ifNotExists) { + String constraint = ifNotExists? "IF NOT EXISTS ": ""; + db.execSQL("CREATE TABLE " + constraint + "\"SEARCH_HISTORY_BEAN\" (" + // + "\"_id\" INTEGER PRIMARY KEY AUTOINCREMENT ," + // 0: id + "\"UUID\" TEXT UNIQUE ," + // 1: uuid + "\"KEYWORDS\" TEXT," + // 2: keywords + "\"SEARCH_TYPE\" TEXT," + // 3: searchType + "\"USER_ID\" TEXT," + // 4: userId + "\"SEARCH_TIME\" TEXT);"); // 5: searchTime + } + + /** Drops the underlying database table. */ + public static void dropTable(Database db, boolean ifExists) { + String sql = "DROP TABLE " + (ifExists ? "IF EXISTS " : "") + "\"SEARCH_HISTORY_BEAN\""; + db.execSQL(sql); + } + + @Override + protected final void bindValues(DatabaseStatement stmt, SearchHistoryBean entity) { + stmt.clearBindings(); + + Long id = entity.getId(); + if (id != null) { + stmt.bindLong(1, id); + } + + String uuid = entity.getUuid(); + if (uuid != null) { + stmt.bindString(2, uuid); + } + + String keywords = entity.getKeywords(); + if (keywords != null) { + stmt.bindString(3, keywords); + } + + String searchType = entity.getSearchType(); + if (searchType != null) { + stmt.bindString(4, searchType); + } + + String userId = entity.getUserId(); + if (userId != null) { + stmt.bindString(5, userId); + } + + String searchTime = entity.getSearchTime(); + if (searchTime != null) { + stmt.bindString(6, searchTime); + } + } + + @Override + protected final void bindValues(SQLiteStatement stmt, SearchHistoryBean entity) { + stmt.clearBindings(); + + Long id = entity.getId(); + if (id != null) { + stmt.bindLong(1, id); + } + + String uuid = entity.getUuid(); + if (uuid != null) { + stmt.bindString(2, uuid); + } + + String keywords = entity.getKeywords(); + if (keywords != null) { + stmt.bindString(3, keywords); + } + + String searchType = entity.getSearchType(); + if (searchType != null) { + stmt.bindString(4, searchType); + } + + String userId = entity.getUserId(); + if (userId != null) { + stmt.bindString(5, userId); + } + + String searchTime = entity.getSearchTime(); + if (searchTime != null) { + stmt.bindString(6, searchTime); + } + } + + @Override + public Long readKey(Cursor cursor, int offset) { + return cursor.isNull(offset + 0) ? null : cursor.getLong(offset + 0); + } + + @Override + public SearchHistoryBean readEntity(Cursor cursor, int offset) { + SearchHistoryBean entity = new SearchHistoryBean( // + cursor.isNull(offset + 0) ? null : cursor.getLong(offset + 0), // id + cursor.isNull(offset + 1) ? null : cursor.getString(offset + 1), // uuid + cursor.isNull(offset + 2) ? null : cursor.getString(offset + 2), // keywords + cursor.isNull(offset + 3) ? null : cursor.getString(offset + 3), // searchType + cursor.isNull(offset + 4) ? null : cursor.getString(offset + 4), // userId + cursor.isNull(offset + 5) ? null : cursor.getString(offset + 5) // searchTime + ); + return entity; + } + + @Override + public void readEntity(Cursor cursor, SearchHistoryBean entity, int offset) { + entity.setId(cursor.isNull(offset + 0) ? null : cursor.getLong(offset + 0)); + entity.setUuid(cursor.isNull(offset + 1) ? null : cursor.getString(offset + 1)); + entity.setKeywords(cursor.isNull(offset + 2) ? null : cursor.getString(offset + 2)); + entity.setSearchType(cursor.isNull(offset + 3) ? null : cursor.getString(offset + 3)); + entity.setUserId(cursor.isNull(offset + 4) ? null : cursor.getString(offset + 4)); + entity.setSearchTime(cursor.isNull(offset + 5) ? null : cursor.getString(offset + 5)); + } + + @Override + protected final Long updateKeyAfterInsert(SearchHistoryBean entity, long rowId) { + entity.setId(rowId); + return rowId; + } + + @Override + public Long getKey(SearchHistoryBean entity) { + if(entity != null) { + return entity.getId(); + } else { + return null; + } + } + + @Override + public boolean hasKey(SearchHistoryBean entity) { + return entity.getId() != null; + } + + @Override + protected final boolean isEntityUpdateable() { + return true; + } + +} diff --git a/app/src/main/java/com/casic/xz/meterage/utils/DataBaseManager.kt b/app/src/main/java/com/casic/xz/meterage/utils/DataBaseManager.kt new file mode 100644 index 0000000..52fe032 --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/utils/DataBaseManager.kt @@ -0,0 +1,45 @@ +package com.casic.xz.meterage.utils + +import com.casic.xz.meterage.base.BaseApplication +import com.casic.xz.meterage.bean.SearchHistoryBean +import com.casic.xz.meterage.greendao.SearchHistoryBeanDao +import com.pengxh.kt.lite.extensions.timestampToCompleteDate +import com.pengxh.kt.lite.utils.SaveKeyValues +import java.util.* + +class DataBaseManager private constructor() { + + companion object { + //Kotlin委托模式双重锁单例 + val get: DataBaseManager by lazy(mode = LazyThreadSafetyMode.SYNCHRONIZED) { + DataBaseManager() + } + } + + private val searchBeanDao by lazy { BaseApplication.get().getDaoSession().searchHistoryBeanDao } + private val userId by lazy { SaveKeyValues.getValue(LocaleConstant.USER_ID, "") } + + fun addSearchHistory(keywords: String, searchType: String) { + val bean = SearchHistoryBean() + bean.uuid = UUID.randomUUID().toString() + bean.keywords = keywords + bean.searchType = searchType + bean.userId = userId.toString() + bean.searchTime = System.currentTimeMillis().timestampToCompleteDate() + searchBeanDao.insert(bean) + } + + fun queryHistoryByType(searchType: String): MutableList { + return searchBeanDao.queryBuilder().where( + SearchHistoryBeanDao.Properties.UserId.eq(userId), + SearchHistoryBeanDao.Properties.SearchType.eq(searchType) + ).list() + } + + fun deleteHistoryByType(searchType: String) { + val list = queryHistoryByType(searchType) + list.forEach { + searchBeanDao.delete(it) + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/utils/LocaleConstant.kt b/app/src/main/java/com/casic/xz/meterage/utils/LocaleConstant.kt index cc2848b..2ea47a0 100644 --- a/app/src/main/java/com/casic/xz/meterage/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/xz/meterage/utils/LocaleConstant.kt @@ -62,4 +62,5 @@ const val File_SERVER_URL = "http://111.198.10.15:21408" const val ACCOUNT = "account" const val PASSWORD = "password" + const val USER_ID = "userId" } \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/utils/SearchType.kt b/app/src/main/java/com/casic/xz/meterage/utils/SearchType.kt new file mode 100644 index 0000000..5f5253e --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/utils/SearchType.kt @@ -0,0 +1,8 @@ +package com.casic.xz.meterage.utils + +object SearchType { + /** + * 搜索仪器设备 + * */ + const val Equipment = "0" +} diff --git a/app/src/main/java/com/casic/xz/meterage/view/MainActivity.kt b/app/src/main/java/com/casic/xz/meterage/view/MainActivity.kt index 28836e0..8fb0793 100644 --- a/app/src/main/java/com/casic/xz/meterage/view/MainActivity.kt +++ b/app/src/main/java/com/casic/xz/meterage/view/MainActivity.kt @@ -3,15 +3,19 @@ import android.view.KeyEvent import android.view.MenuItem import androidx.fragment.app.Fragment +import androidx.lifecycle.ViewModelProvider import androidx.viewpager.widget.ViewPager import com.casic.xz.meterage.R import com.casic.xz.meterage.adapter.ViewPagerAdapter import com.casic.xz.meterage.fragment.HomePageFragment import com.casic.xz.meterage.fragment.MinePageFragment import com.casic.xz.meterage.fragment.SamplePageFragment +import com.casic.xz.meterage.utils.LocaleConstant +import com.casic.xz.meterage.vm.UserViewModel import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.SaveKeyValues import kotlinx.android.synthetic.main.activity_main.* class MainActivity : KotlinBaseActivity() { @@ -20,53 +24,59 @@ private var fragmentPages: ArrayList = ArrayList() private var clickTime: Long = 0 - init { - fragmentPages.add(HomePageFragment()) - fragmentPages.add(SamplePageFragment()) - fragmentPages.add(MinePageFragment()) - } - override fun initData() { - bottomNavigation.itemIconTintList = null - bottomNavigation.setOnNavigationItemSelectedListener { menuItem -> - when (menuItem.itemId) { - R.id.nav_home -> { - mainViewPager.currentItem = 0 + val userViewModel = ViewModelProvider(this)[UserViewModel::class.java] + userViewModel.getUserInfo(SaveKeyValues.getValue(LocaleConstant.ACCOUNT, "") as String) + userViewModel.userInfo.observe(this) { + if (it.code == 200) { + SaveKeyValues.putValue(LocaleConstant.USER_ID, it.data.id) + + fragmentPages.add(HomePageFragment(it.data.id)) + fragmentPages.add(SamplePageFragment()) + fragmentPages.add(MinePageFragment()) + + bottomNavigation.itemIconTintList = null + bottomNavigation.setOnNavigationItemSelectedListener { menuItem -> + when (menuItem.itemId) { + R.id.nav_home -> { + mainViewPager.currentItem = 0 + } + R.id.nav_sample -> { + mainViewPager.currentItem = 1 + } + R.id.nav_mine -> { + mainViewPager.currentItem = 2 + } + } + false } - R.id.nav_sample -> { - mainViewPager.currentItem = 1 - } - R.id.nav_mine -> { - mainViewPager.currentItem = 2 - } + mainViewPager.adapter = ViewPagerAdapter(fragmentPages, supportFragmentManager) + mainViewPager.offscreenPageLimit = fragmentPages.size //缓存页数 + mainViewPager.addOnPageChangeListener(object : ViewPager.OnPageChangeListener { + override fun onPageScrollStateChanged(state: Int) { + + } + + override fun onPageScrolled( + position: Int, + positionOffset: Float, + positionOffsetPixels: Int + ) { + + } + + override fun onPageSelected(position: Int) { + if (menuItem != null) { + menuItem!!.isChecked = false + } else { + bottomNavigation.menu.getItem(0).isChecked = false + } + menuItem = bottomNavigation.menu.getItem(position) + menuItem!!.isChecked = true + } + }) } - false } - mainViewPager.adapter = ViewPagerAdapter(fragmentPages, supportFragmentManager) - mainViewPager.offscreenPageLimit = fragmentPages.size //缓存页数 - mainViewPager.addOnPageChangeListener(object : ViewPager.OnPageChangeListener { - override fun onPageScrollStateChanged(state: Int) { - - } - - override fun onPageScrolled( - position: Int, - positionOffset: Float, - positionOffsetPixels: Int - ) { - - } - - override fun onPageSelected(position: Int) { - if (menuItem != null) { - menuItem!!.isChecked = false - } else { - bottomNavigation.menu.getItem(0).isChecked = false - } - menuItem = bottomNavigation.menu.getItem(position) - menuItem!!.isChecked = true - } - }) } override fun initEvent() { diff --git a/app/src/main/java/com/casic/xz/meterage/view/search/SearchAllActivity.kt b/app/src/main/java/com/casic/xz/meterage/view/search/SearchAllActivity.kt new file mode 100644 index 0000000..ecc8fd7 --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/view/search/SearchAllActivity.kt @@ -0,0 +1,40 @@ +package com.casic.xz.meterage.view.search + +import com.casic.xz.meterage.R +import com.casic.xz.meterage.extensions.initLayoutImmersionBar +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.navigatePageTo +import kotlinx.android.synthetic.main.activity_search_all.* +import kotlinx.android.synthetic.main.include_search_input_title.* + +class SearchAllActivity : KotlinBaseActivity() { + + override fun initData() { + + } + + override fun initEvent() { + leftBackView.setOnClickListener { finish() } + searchTextView.setOnClickListener { + navigatePageTo(inputView.text.toString()) + } + } + + override fun initLayoutView(): Int = R.layout.activity_search_all + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + initLayoutImmersionBar(rootView) + inputView.hint = "查询样品、业务" + } + + override fun onResume() { + super.onResume() + //TODO 流式布局显示查询记录Tag? + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/view/search/SearchAllResultActivity.kt b/app/src/main/java/com/casic/xz/meterage/view/search/SearchAllResultActivity.kt new file mode 100644 index 0000000..adbb570 --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/view/search/SearchAllResultActivity.kt @@ -0,0 +1,34 @@ +package com.casic.xz.meterage.view.search + +import com.casic.xz.meterage.R +import com.casic.xz.meterage.extensions.initLayoutImmersionBar +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.utils.Constant +import kotlinx.android.synthetic.main.activity_search_all_reasult.* +import kotlinx.android.synthetic.main.include_search_title.* + +class SearchAllResultActivity : KotlinBaseActivity() { + + private lateinit var param: String + + override fun initData() { + param = intent.getStringExtra(Constant.INTENT_PARAM)!! + } + + override fun initEvent() { + leftBackView.setOnClickListener { finish() } + } + + override fun initLayoutView(): Int = R.layout.activity_search_all_reasult + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + initLayoutImmersionBar(rootView) + titleView.text = "查询结果" + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/view/search/SearchEquipmentActivity.kt b/app/src/main/java/com/casic/xz/meterage/view/search/SearchEquipmentActivity.kt index f5c98d6..3551790 100644 --- a/app/src/main/java/com/casic/xz/meterage/view/search/SearchEquipmentActivity.kt +++ b/app/src/main/java/com/casic/xz/meterage/view/search/SearchEquipmentActivity.kt @@ -1,27 +1,98 @@ package com.casic.xz.meterage.view.search import com.casic.xz.meterage.R +import com.casic.xz.meterage.bean.SearchHistoryBean import com.casic.xz.meterage.extensions.initLayoutImmersionBar +import com.casic.xz.meterage.utils.DataBaseManager +import com.casic.xz.meterage.utils.SearchType import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter +import com.pengxh.kt.lite.adapter.ViewHolder import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.utils.WeakReferenceHandler +import com.pengxh.kt.lite.widget.dialog.AlertControlDialog import kotlinx.android.synthetic.main.activity_search_equipment.* import kotlinx.android.synthetic.main.include_search_input_title.* + /** * 搜索仪器设备 * */ class SearchEquipmentActivity : KotlinBaseActivity() { - override fun initData() { + private lateinit var weakReferenceHandler: WeakReferenceHandler + private lateinit var historyAdapter: NormalRecyclerAdapter + private var dataBeans: MutableList = ArrayList() + private var isRefresh = false + override fun initData() { + weakReferenceHandler = WeakReferenceHandler { + if (it.what == 2023031001) { + if (isRefresh) { + historyAdapter.notifyDataSetChanged() + } else { + historyAdapter = object : + NormalRecyclerAdapter( + R.layout.item_search_rv_l, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, position: Int, item: SearchHistoryBean + ) { + viewHolder.setText(R.id.searchTagView, item.keywords) + } + } + historyRecyclerView.adapter = historyAdapter + historyAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked(position: Int, t: SearchHistoryBean) { + navigatePageTo(t.keywords) + } + }) + } + } + true + } + } + + override fun onResume() { + super.onResume() + dataBeans = DataBaseManager.get.queryHistoryByType(SearchType.Equipment) + weakReferenceHandler.sendEmptyMessage(2023031001) } override fun initEvent() { leftBackView.setOnClickListener { finish() } searchTextView.setOnClickListener { + if (!inputView.text.isNullOrBlank()) { + DataBaseManager.get.addSearchHistory( + inputView.text.toString(), SearchType.Equipment + ) + } + navigatePageTo(inputView.text.toString()) } + + deleteHistoryView.setOnClickListener { + AlertControlDialog.Builder() + .setContext(this) + .setTitle("提示") + .setMessage("确定将所有搜索记录删除?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + + } + + override fun onConfirmClick() { + DataBaseManager.get.deleteHistoryByType(SearchType.Equipment) + dataBeans.clear() + historyAdapter.notifyDataSetChanged() + } + }).build().show() + } } override fun initLayoutView(): Int = R.layout.activity_search_equipment @@ -35,9 +106,4 @@ initLayoutImmersionBar(rootView) inputView.hint = "查询设备名称、编号" } - - override fun onResume() { - super.onResume() - //TODO 流式布局显示查询记录Tag? - } } \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_delete.xml b/app/src/main/res/drawable/ic_delete.xml new file mode 100644 index 0000000..1810342 --- /dev/null +++ b/app/src/main/res/drawable/ic_delete.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/layout/activity_search_all.xml b/app/src/main/res/layout/activity_search_all.xml new file mode 100644 index 0000000..45694fb --- /dev/null +++ b/app/src/main/res/layout/activity_search_all.xml @@ -0,0 +1,17 @@ + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_search_all_reasult.xml b/app/src/main/res/layout/activity_search_all_reasult.xml new file mode 100644 index 0000000..7e90433 --- /dev/null +++ b/app/src/main/res/layout/activity_search_all_reasult.xml @@ -0,0 +1,51 @@ + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index 298f687..e142ec1 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -3,6 +3,7 @@ apply plugin: 'com.android.application' apply plugin: 'kotlin-android' apply plugin: 'kotlin-android-extensions' +apply plugin: 'org.greenrobot.greendao' android { signingConfigs { @@ -57,6 +58,12 @@ outputFileName = "XZJL_" + getBuildDate() + "_Beta.apk" } } + + greendao { + schemaVersion 1//数据库版本号 + targetGenDir 'src/main/java'//设置DaoMaster、DaoSession、Dao目录 + daoPackage 'com.casic.xz.meterage.greendao'//设置DaoMaster、DaoSession、Dao包名 + } } static def getBuildDate() { @@ -67,7 +74,7 @@ dependencies { //基础依赖库 implementation 'com.github.AndroidCoderPeng:Kotlin-lite-lib:1.0.4' - implementation 'androidx.appcompat:appcompat:1.5.1' + implementation 'androidx.appcompat:appcompat:1.6.1' implementation 'androidx.core:core-ktx:1.9.0' //Google官方授权框架 implementation 'pub.devrel:easypermissions:3.0.0' @@ -113,4 +120,6 @@ implementation 'com.github.tiann:FreeReflection:3.1.0' //单项/数字、二三级联动、日期/时间等滚轮选择器 implementation 'com.github.gzu-liyujiang.AndroidPicker:WheelPicker:4.1.8' + //数据库框架 + implementation 'org.greenrobot:greendao:3.3.0' } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 972eff9..5b6f9b2 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -69,6 +69,8 @@ + + diff --git a/app/src/main/java/com/casic/xz/meterage/base/BaseApplication.kt b/app/src/main/java/com/casic/xz/meterage/base/BaseApplication.kt index 14a604d..1684c23 100644 --- a/app/src/main/java/com/casic/xz/meterage/base/BaseApplication.kt +++ b/app/src/main/java/com/casic/xz/meterage/base/BaseApplication.kt @@ -2,6 +2,8 @@ import android.app.Application import android.content.Context +import com.casic.xz.meterage.greendao.DaoMaster +import com.casic.xz.meterage.greendao.DaoSession import com.pengxh.kt.lite.utils.SaveKeyValues import me.weishu.reflection.Reflection import kotlin.properties.Delegates @@ -12,12 +14,22 @@ private var application: BaseApplication by Delegates.notNull() fun get() = application + + private lateinit var daoSession: DaoSession } override fun onCreate() { super.onCreate() application = this SaveKeyValues.initSharedPreferences(this) + + val devOpenHelper = DaoMaster.DevOpenHelper(this, "Meterage.db", null) + val daoMaster = DaoMaster(devOpenHelper.writableDatabase) + daoSession = daoMaster.newSession() + } + + fun getDaoSession(): DaoSession { + return daoSession } //绕过Android 11以上反射限制 diff --git a/app/src/main/java/com/casic/xz/meterage/bean/SearchHistoryBean.java b/app/src/main/java/com/casic/xz/meterage/bean/SearchHistoryBean.java new file mode 100644 index 0000000..6a46a3a --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/bean/SearchHistoryBean.java @@ -0,0 +1,82 @@ +package com.casic.xz.meterage.bean; + +import org.greenrobot.greendao.annotation.Entity; +import org.greenrobot.greendao.annotation.Generated; +import org.greenrobot.greendao.annotation.Id; +import org.greenrobot.greendao.annotation.Unique; + +@Entity +public class SearchHistoryBean { + @Id(autoincrement = true) + private Long id;//主键自增 + + @Unique + private String uuid; + private String keywords;//查询条件-关键字 + private String searchType;//查询类型 + private String userId;//用户Id + private String searchTime;//查询的时间 + + @Generated(hash = 2130561778) + public SearchHistoryBean(Long id, String uuid, String keywords, + String searchType, String userId, String searchTime) { + this.id = id; + this.uuid = uuid; + this.keywords = keywords; + this.searchType = searchType; + this.userId = userId; + this.searchTime = searchTime; + } + + @Generated(hash = 1570282321) + public SearchHistoryBean() { + } + + public Long getId() { + return this.id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getUuid() { + return this.uuid; + } + + public void setUuid(String uuid) { + this.uuid = uuid; + } + + public String getKeywords() { + return this.keywords; + } + + public void setKeywords(String keywords) { + this.keywords = keywords; + } + + public String getSearchType() { + return this.searchType; + } + + public void setSearchType(String searchType) { + this.searchType = searchType; + } + + public String getUserId() { + return this.userId; + } + + public void setUserId(String userId) { + this.userId = userId; + } + + public String getSearchTime() { + return this.searchTime; + } + + public void setSearchTime(String searchTime) { + this.searchTime = searchTime; + } +} diff --git a/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt index 151f951..ae7f5e4 100644 --- a/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt +++ b/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt @@ -15,22 +15,20 @@ import com.casic.xz.meterage.extensions.showEmptyPage import com.casic.xz.meterage.model.NoticeListModel import com.casic.xz.meterage.model.RemindListModel -import com.casic.xz.meterage.model.UserInfoModel import com.casic.xz.meterage.utils.LoadingDialogHub import com.casic.xz.meterage.utils.LocaleConstant import com.casic.xz.meterage.utils.QrConfigCreator import com.casic.xz.meterage.view.home.* import com.casic.xz.meterage.view.notice.NoticeListActivity +import com.casic.xz.meterage.view.search.SearchAllActivity import com.casic.xz.meterage.vm.MeterageTrainViewModel import com.casic.xz.meterage.vm.NoticeViewModel -import com.casic.xz.meterage.vm.UserViewModel import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter import com.pengxh.kt.lite.adapter.ViewHolder import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.convertColor import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show -import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.utils.WeakReferenceHandler import com.pengxh.kt.lite.vm.LoadState import com.pengxh.kt.lite.widget.dialog.AlertControlDialog @@ -39,13 +37,12 @@ import kotlinx.android.synthetic.main.include_empty_view.* import java.util.* -class HomePageFragment : KotlinBaseFragment() { +class HomePageFragment(private val userId: String) : KotlinBaseFragment() { private val timer = object : Timer() {} private lateinit var weakReferenceHandler: WeakReferenceHandler private lateinit var meterageTrainViewModel: MeterageTrainViewModel private lateinit var noticeViewModel: NoticeViewModel - private lateinit var userData: UserInfoModel.DataModel private lateinit var remindAdapter: NormalRecyclerAdapter private var dataBeans: MutableList = ArrayList() private var noticeBeans: MutableList = ArrayList() @@ -170,14 +167,6 @@ true } - val userViewModel = ViewModelProvider(this)[UserViewModel::class.java] - userViewModel.getUserInfo(SaveKeyValues.getValue(LocaleConstant.ACCOUNT, "") as String) - userViewModel.userInfo.observe(this) { - if (it.code == 200) { - userData = it.data - } - } - meterageTrainViewModel = ViewModelProvider(this)[MeterageTrainViewModel::class.java] meterageTrainViewModel.signInResult.observe(this) { if (it.code == 200) { @@ -296,10 +285,14 @@ } override fun initEvent() { + searchBar.setOnClickListener { + requireContext().navigatePageTo() + } + scanCodeView.setOnClickListener { qrManager.startScan(requireActivity()) { result -> if (result.content.isDigitsOnly()) { - meterageTrainViewModel.signIn(userData.id, result.content) + meterageTrainViewModel.signIn(userId, result.content) } else { "签到二维码错误,请重新扫描".show(requireContext()) } diff --git a/app/src/main/java/com/casic/xz/meterage/greendao/DaoMaster.java b/app/src/main/java/com/casic/xz/meterage/greendao/DaoMaster.java new file mode 100644 index 0000000..d714ce2 --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/greendao/DaoMaster.java @@ -0,0 +1,96 @@ +package com.casic.xz.meterage.greendao; + +import android.content.Context; +import android.database.sqlite.SQLiteDatabase; +import android.database.sqlite.SQLiteDatabase.CursorFactory; +import android.util.Log; + +import org.greenrobot.greendao.AbstractDaoMaster; +import org.greenrobot.greendao.database.Database; +import org.greenrobot.greendao.database.DatabaseOpenHelper; +import org.greenrobot.greendao.database.StandardDatabase; +import org.greenrobot.greendao.identityscope.IdentityScopeType; + + +// THIS CODE IS GENERATED BY greenDAO, DO NOT EDIT. +/** + * Master of DAO (schema version 1): knows all DAOs. + */ +public class DaoMaster extends AbstractDaoMaster { + public static final int SCHEMA_VERSION = 1; + + /** Creates underlying database table using DAOs. */ + public static void createAllTables(Database db, boolean ifNotExists) { + SearchHistoryBeanDao.createTable(db, ifNotExists); + } + + /** Drops underlying database table using DAOs. */ + public static void dropAllTables(Database db, boolean ifExists) { + SearchHistoryBeanDao.dropTable(db, ifExists); + } + + /** + * WARNING: Drops all table on Upgrade! Use only during development. + * Convenience method using a {@link DevOpenHelper}. + */ + public static DaoSession newDevSession(Context context, String name) { + Database db = new DevOpenHelper(context, name).getWritableDb(); + DaoMaster daoMaster = new DaoMaster(db); + return daoMaster.newSession(); + } + + public DaoMaster(SQLiteDatabase db) { + this(new StandardDatabase(db)); + } + + public DaoMaster(Database db) { + super(db, SCHEMA_VERSION); + registerDaoClass(SearchHistoryBeanDao.class); + } + + public DaoSession newSession() { + return new DaoSession(db, IdentityScopeType.Session, daoConfigMap); + } + + public DaoSession newSession(IdentityScopeType type) { + return new DaoSession(db, type, daoConfigMap); + } + + /** + * Calls {@link #createAllTables(Database, boolean)} in {@link #onCreate(Database)} - + */ + public static abstract class OpenHelper extends DatabaseOpenHelper { + public OpenHelper(Context context, String name) { + super(context, name, SCHEMA_VERSION); + } + + public OpenHelper(Context context, String name, CursorFactory factory) { + super(context, name, factory, SCHEMA_VERSION); + } + + @Override + public void onCreate(Database db) { + Log.i("greenDAO", "Creating tables for schema version " + SCHEMA_VERSION); + createAllTables(db, false); + } + } + + /** WARNING: Drops all table on Upgrade! Use only during development. */ + public static class DevOpenHelper extends OpenHelper { + public DevOpenHelper(Context context, String name) { + super(context, name); + } + + public DevOpenHelper(Context context, String name, CursorFactory factory) { + super(context, name, factory); + } + + @Override + public void onUpgrade(Database db, int oldVersion, int newVersion) { + Log.i("greenDAO", "Upgrading schema from version " + oldVersion + " to " + newVersion + " by dropping all tables"); + dropAllTables(db, true); + onCreate(db); + } + } + +} diff --git a/app/src/main/java/com/casic/xz/meterage/greendao/DaoSession.java b/app/src/main/java/com/casic/xz/meterage/greendao/DaoSession.java new file mode 100644 index 0000000..0e80024 --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/greendao/DaoSession.java @@ -0,0 +1,46 @@ +package com.casic.xz.meterage.greendao; + +import com.casic.xz.meterage.bean.SearchHistoryBean; + +import org.greenrobot.greendao.AbstractDao; +import org.greenrobot.greendao.AbstractDaoSession; +import org.greenrobot.greendao.database.Database; +import org.greenrobot.greendao.identityscope.IdentityScopeType; +import org.greenrobot.greendao.internal.DaoConfig; + +import java.util.Map; + +// THIS CODE IS GENERATED BY greenDAO, DO NOT EDIT. + +/** + * {@inheritDoc} + * + * @see org.greenrobot.greendao.AbstractDaoSession + */ +public class DaoSession extends AbstractDaoSession { + + private final DaoConfig searchHistoryBeanDaoConfig; + + private final SearchHistoryBeanDao searchHistoryBeanDao; + + public DaoSession(Database db, IdentityScopeType type, Map>, DaoConfig> + daoConfigMap) { + super(db); + + searchHistoryBeanDaoConfig = daoConfigMap.get(SearchHistoryBeanDao.class).clone(); + searchHistoryBeanDaoConfig.initIdentityScope(type); + + searchHistoryBeanDao = new SearchHistoryBeanDao(searchHistoryBeanDaoConfig, this); + + registerDao(SearchHistoryBean.class, searchHistoryBeanDao); + } + + public void clear() { + searchHistoryBeanDaoConfig.clearIdentityScope(); + } + + public SearchHistoryBeanDao getSearchHistoryBeanDao() { + return searchHistoryBeanDao; + } + +} diff --git a/app/src/main/java/com/casic/xz/meterage/greendao/SearchHistoryBeanDao.java b/app/src/main/java/com/casic/xz/meterage/greendao/SearchHistoryBeanDao.java new file mode 100644 index 0000000..5923d02 --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/greendao/SearchHistoryBeanDao.java @@ -0,0 +1,185 @@ +package com.casic.xz.meterage.greendao; + +import android.database.Cursor; +import android.database.sqlite.SQLiteStatement; + +import com.casic.xz.meterage.bean.SearchHistoryBean; + +import org.greenrobot.greendao.AbstractDao; +import org.greenrobot.greendao.Property; +import org.greenrobot.greendao.database.Database; +import org.greenrobot.greendao.database.DatabaseStatement; +import org.greenrobot.greendao.internal.DaoConfig; + +// THIS CODE IS GENERATED BY greenDAO, DO NOT EDIT. +/** + * DAO for table "SEARCH_HISTORY_BEAN". +*/ +public class SearchHistoryBeanDao extends AbstractDao { + + public static final String TABLENAME = "SEARCH_HISTORY_BEAN"; + + /** + * Properties of entity SearchHistoryBean.
+ * Can be used for QueryBuilder and for referencing column names. + */ + public static class Properties { + public final static Property Id = new Property(0, Long.class, "id", true, "_id"); + public final static Property Uuid = new Property(1, String.class, "uuid", false, "UUID"); + public final static Property Keywords = new Property(2, String.class, "keywords", false, "KEYWORDS"); + public final static Property SearchType = new Property(3, String.class, "searchType", false, "SEARCH_TYPE"); + public final static Property UserId = new Property(4, String.class, "userId", false, "USER_ID"); + public final static Property SearchTime = new Property(5, String.class, "searchTime", false, "SEARCH_TIME"); + } + + + public SearchHistoryBeanDao(DaoConfig config) { + super(config); + } + + public SearchHistoryBeanDao(DaoConfig config, DaoSession daoSession) { + super(config, daoSession); + } + + /** Creates the underlying database table. */ + public static void createTable(Database db, boolean ifNotExists) { + String constraint = ifNotExists? "IF NOT EXISTS ": ""; + db.execSQL("CREATE TABLE " + constraint + "\"SEARCH_HISTORY_BEAN\" (" + // + "\"_id\" INTEGER PRIMARY KEY AUTOINCREMENT ," + // 0: id + "\"UUID\" TEXT UNIQUE ," + // 1: uuid + "\"KEYWORDS\" TEXT," + // 2: keywords + "\"SEARCH_TYPE\" TEXT," + // 3: searchType + "\"USER_ID\" TEXT," + // 4: userId + "\"SEARCH_TIME\" TEXT);"); // 5: searchTime + } + + /** Drops the underlying database table. */ + public static void dropTable(Database db, boolean ifExists) { + String sql = "DROP TABLE " + (ifExists ? "IF EXISTS " : "") + "\"SEARCH_HISTORY_BEAN\""; + db.execSQL(sql); + } + + @Override + protected final void bindValues(DatabaseStatement stmt, SearchHistoryBean entity) { + stmt.clearBindings(); + + Long id = entity.getId(); + if (id != null) { + stmt.bindLong(1, id); + } + + String uuid = entity.getUuid(); + if (uuid != null) { + stmt.bindString(2, uuid); + } + + String keywords = entity.getKeywords(); + if (keywords != null) { + stmt.bindString(3, keywords); + } + + String searchType = entity.getSearchType(); + if (searchType != null) { + stmt.bindString(4, searchType); + } + + String userId = entity.getUserId(); + if (userId != null) { + stmt.bindString(5, userId); + } + + String searchTime = entity.getSearchTime(); + if (searchTime != null) { + stmt.bindString(6, searchTime); + } + } + + @Override + protected final void bindValues(SQLiteStatement stmt, SearchHistoryBean entity) { + stmt.clearBindings(); + + Long id = entity.getId(); + if (id != null) { + stmt.bindLong(1, id); + } + + String uuid = entity.getUuid(); + if (uuid != null) { + stmt.bindString(2, uuid); + } + + String keywords = entity.getKeywords(); + if (keywords != null) { + stmt.bindString(3, keywords); + } + + String searchType = entity.getSearchType(); + if (searchType != null) { + stmt.bindString(4, searchType); + } + + String userId = entity.getUserId(); + if (userId != null) { + stmt.bindString(5, userId); + } + + String searchTime = entity.getSearchTime(); + if (searchTime != null) { + stmt.bindString(6, searchTime); + } + } + + @Override + public Long readKey(Cursor cursor, int offset) { + return cursor.isNull(offset + 0) ? null : cursor.getLong(offset + 0); + } + + @Override + public SearchHistoryBean readEntity(Cursor cursor, int offset) { + SearchHistoryBean entity = new SearchHistoryBean( // + cursor.isNull(offset + 0) ? null : cursor.getLong(offset + 0), // id + cursor.isNull(offset + 1) ? null : cursor.getString(offset + 1), // uuid + cursor.isNull(offset + 2) ? null : cursor.getString(offset + 2), // keywords + cursor.isNull(offset + 3) ? null : cursor.getString(offset + 3), // searchType + cursor.isNull(offset + 4) ? null : cursor.getString(offset + 4), // userId + cursor.isNull(offset + 5) ? null : cursor.getString(offset + 5) // searchTime + ); + return entity; + } + + @Override + public void readEntity(Cursor cursor, SearchHistoryBean entity, int offset) { + entity.setId(cursor.isNull(offset + 0) ? null : cursor.getLong(offset + 0)); + entity.setUuid(cursor.isNull(offset + 1) ? null : cursor.getString(offset + 1)); + entity.setKeywords(cursor.isNull(offset + 2) ? null : cursor.getString(offset + 2)); + entity.setSearchType(cursor.isNull(offset + 3) ? null : cursor.getString(offset + 3)); + entity.setUserId(cursor.isNull(offset + 4) ? null : cursor.getString(offset + 4)); + entity.setSearchTime(cursor.isNull(offset + 5) ? null : cursor.getString(offset + 5)); + } + + @Override + protected final Long updateKeyAfterInsert(SearchHistoryBean entity, long rowId) { + entity.setId(rowId); + return rowId; + } + + @Override + public Long getKey(SearchHistoryBean entity) { + if(entity != null) { + return entity.getId(); + } else { + return null; + } + } + + @Override + public boolean hasKey(SearchHistoryBean entity) { + return entity.getId() != null; + } + + @Override + protected final boolean isEntityUpdateable() { + return true; + } + +} diff --git a/app/src/main/java/com/casic/xz/meterage/utils/DataBaseManager.kt b/app/src/main/java/com/casic/xz/meterage/utils/DataBaseManager.kt new file mode 100644 index 0000000..52fe032 --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/utils/DataBaseManager.kt @@ -0,0 +1,45 @@ +package com.casic.xz.meterage.utils + +import com.casic.xz.meterage.base.BaseApplication +import com.casic.xz.meterage.bean.SearchHistoryBean +import com.casic.xz.meterage.greendao.SearchHistoryBeanDao +import com.pengxh.kt.lite.extensions.timestampToCompleteDate +import com.pengxh.kt.lite.utils.SaveKeyValues +import java.util.* + +class DataBaseManager private constructor() { + + companion object { + //Kotlin委托模式双重锁单例 + val get: DataBaseManager by lazy(mode = LazyThreadSafetyMode.SYNCHRONIZED) { + DataBaseManager() + } + } + + private val searchBeanDao by lazy { BaseApplication.get().getDaoSession().searchHistoryBeanDao } + private val userId by lazy { SaveKeyValues.getValue(LocaleConstant.USER_ID, "") } + + fun addSearchHistory(keywords: String, searchType: String) { + val bean = SearchHistoryBean() + bean.uuid = UUID.randomUUID().toString() + bean.keywords = keywords + bean.searchType = searchType + bean.userId = userId.toString() + bean.searchTime = System.currentTimeMillis().timestampToCompleteDate() + searchBeanDao.insert(bean) + } + + fun queryHistoryByType(searchType: String): MutableList { + return searchBeanDao.queryBuilder().where( + SearchHistoryBeanDao.Properties.UserId.eq(userId), + SearchHistoryBeanDao.Properties.SearchType.eq(searchType) + ).list() + } + + fun deleteHistoryByType(searchType: String) { + val list = queryHistoryByType(searchType) + list.forEach { + searchBeanDao.delete(it) + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/utils/LocaleConstant.kt b/app/src/main/java/com/casic/xz/meterage/utils/LocaleConstant.kt index cc2848b..2ea47a0 100644 --- a/app/src/main/java/com/casic/xz/meterage/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/xz/meterage/utils/LocaleConstant.kt @@ -62,4 +62,5 @@ const val File_SERVER_URL = "http://111.198.10.15:21408" const val ACCOUNT = "account" const val PASSWORD = "password" + const val USER_ID = "userId" } \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/utils/SearchType.kt b/app/src/main/java/com/casic/xz/meterage/utils/SearchType.kt new file mode 100644 index 0000000..5f5253e --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/utils/SearchType.kt @@ -0,0 +1,8 @@ +package com.casic.xz.meterage.utils + +object SearchType { + /** + * 搜索仪器设备 + * */ + const val Equipment = "0" +} diff --git a/app/src/main/java/com/casic/xz/meterage/view/MainActivity.kt b/app/src/main/java/com/casic/xz/meterage/view/MainActivity.kt index 28836e0..8fb0793 100644 --- a/app/src/main/java/com/casic/xz/meterage/view/MainActivity.kt +++ b/app/src/main/java/com/casic/xz/meterage/view/MainActivity.kt @@ -3,15 +3,19 @@ import android.view.KeyEvent import android.view.MenuItem import androidx.fragment.app.Fragment +import androidx.lifecycle.ViewModelProvider import androidx.viewpager.widget.ViewPager import com.casic.xz.meterage.R import com.casic.xz.meterage.adapter.ViewPagerAdapter import com.casic.xz.meterage.fragment.HomePageFragment import com.casic.xz.meterage.fragment.MinePageFragment import com.casic.xz.meterage.fragment.SamplePageFragment +import com.casic.xz.meterage.utils.LocaleConstant +import com.casic.xz.meterage.vm.UserViewModel import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.SaveKeyValues import kotlinx.android.synthetic.main.activity_main.* class MainActivity : KotlinBaseActivity() { @@ -20,53 +24,59 @@ private var fragmentPages: ArrayList = ArrayList() private var clickTime: Long = 0 - init { - fragmentPages.add(HomePageFragment()) - fragmentPages.add(SamplePageFragment()) - fragmentPages.add(MinePageFragment()) - } - override fun initData() { - bottomNavigation.itemIconTintList = null - bottomNavigation.setOnNavigationItemSelectedListener { menuItem -> - when (menuItem.itemId) { - R.id.nav_home -> { - mainViewPager.currentItem = 0 + val userViewModel = ViewModelProvider(this)[UserViewModel::class.java] + userViewModel.getUserInfo(SaveKeyValues.getValue(LocaleConstant.ACCOUNT, "") as String) + userViewModel.userInfo.observe(this) { + if (it.code == 200) { + SaveKeyValues.putValue(LocaleConstant.USER_ID, it.data.id) + + fragmentPages.add(HomePageFragment(it.data.id)) + fragmentPages.add(SamplePageFragment()) + fragmentPages.add(MinePageFragment()) + + bottomNavigation.itemIconTintList = null + bottomNavigation.setOnNavigationItemSelectedListener { menuItem -> + when (menuItem.itemId) { + R.id.nav_home -> { + mainViewPager.currentItem = 0 + } + R.id.nav_sample -> { + mainViewPager.currentItem = 1 + } + R.id.nav_mine -> { + mainViewPager.currentItem = 2 + } + } + false } - R.id.nav_sample -> { - mainViewPager.currentItem = 1 - } - R.id.nav_mine -> { - mainViewPager.currentItem = 2 - } + mainViewPager.adapter = ViewPagerAdapter(fragmentPages, supportFragmentManager) + mainViewPager.offscreenPageLimit = fragmentPages.size //缓存页数 + mainViewPager.addOnPageChangeListener(object : ViewPager.OnPageChangeListener { + override fun onPageScrollStateChanged(state: Int) { + + } + + override fun onPageScrolled( + position: Int, + positionOffset: Float, + positionOffsetPixels: Int + ) { + + } + + override fun onPageSelected(position: Int) { + if (menuItem != null) { + menuItem!!.isChecked = false + } else { + bottomNavigation.menu.getItem(0).isChecked = false + } + menuItem = bottomNavigation.menu.getItem(position) + menuItem!!.isChecked = true + } + }) } - false } - mainViewPager.adapter = ViewPagerAdapter(fragmentPages, supportFragmentManager) - mainViewPager.offscreenPageLimit = fragmentPages.size //缓存页数 - mainViewPager.addOnPageChangeListener(object : ViewPager.OnPageChangeListener { - override fun onPageScrollStateChanged(state: Int) { - - } - - override fun onPageScrolled( - position: Int, - positionOffset: Float, - positionOffsetPixels: Int - ) { - - } - - override fun onPageSelected(position: Int) { - if (menuItem != null) { - menuItem!!.isChecked = false - } else { - bottomNavigation.menu.getItem(0).isChecked = false - } - menuItem = bottomNavigation.menu.getItem(position) - menuItem!!.isChecked = true - } - }) } override fun initEvent() { diff --git a/app/src/main/java/com/casic/xz/meterage/view/search/SearchAllActivity.kt b/app/src/main/java/com/casic/xz/meterage/view/search/SearchAllActivity.kt new file mode 100644 index 0000000..ecc8fd7 --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/view/search/SearchAllActivity.kt @@ -0,0 +1,40 @@ +package com.casic.xz.meterage.view.search + +import com.casic.xz.meterage.R +import com.casic.xz.meterage.extensions.initLayoutImmersionBar +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.navigatePageTo +import kotlinx.android.synthetic.main.activity_search_all.* +import kotlinx.android.synthetic.main.include_search_input_title.* + +class SearchAllActivity : KotlinBaseActivity() { + + override fun initData() { + + } + + override fun initEvent() { + leftBackView.setOnClickListener { finish() } + searchTextView.setOnClickListener { + navigatePageTo(inputView.text.toString()) + } + } + + override fun initLayoutView(): Int = R.layout.activity_search_all + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + initLayoutImmersionBar(rootView) + inputView.hint = "查询样品、业务" + } + + override fun onResume() { + super.onResume() + //TODO 流式布局显示查询记录Tag? + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/view/search/SearchAllResultActivity.kt b/app/src/main/java/com/casic/xz/meterage/view/search/SearchAllResultActivity.kt new file mode 100644 index 0000000..adbb570 --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/view/search/SearchAllResultActivity.kt @@ -0,0 +1,34 @@ +package com.casic.xz.meterage.view.search + +import com.casic.xz.meterage.R +import com.casic.xz.meterage.extensions.initLayoutImmersionBar +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.utils.Constant +import kotlinx.android.synthetic.main.activity_search_all_reasult.* +import kotlinx.android.synthetic.main.include_search_title.* + +class SearchAllResultActivity : KotlinBaseActivity() { + + private lateinit var param: String + + override fun initData() { + param = intent.getStringExtra(Constant.INTENT_PARAM)!! + } + + override fun initEvent() { + leftBackView.setOnClickListener { finish() } + } + + override fun initLayoutView(): Int = R.layout.activity_search_all_reasult + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + initLayoutImmersionBar(rootView) + titleView.text = "查询结果" + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/view/search/SearchEquipmentActivity.kt b/app/src/main/java/com/casic/xz/meterage/view/search/SearchEquipmentActivity.kt index f5c98d6..3551790 100644 --- a/app/src/main/java/com/casic/xz/meterage/view/search/SearchEquipmentActivity.kt +++ b/app/src/main/java/com/casic/xz/meterage/view/search/SearchEquipmentActivity.kt @@ -1,27 +1,98 @@ package com.casic.xz.meterage.view.search import com.casic.xz.meterage.R +import com.casic.xz.meterage.bean.SearchHistoryBean import com.casic.xz.meterage.extensions.initLayoutImmersionBar +import com.casic.xz.meterage.utils.DataBaseManager +import com.casic.xz.meterage.utils.SearchType import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter +import com.pengxh.kt.lite.adapter.ViewHolder import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.utils.WeakReferenceHandler +import com.pengxh.kt.lite.widget.dialog.AlertControlDialog import kotlinx.android.synthetic.main.activity_search_equipment.* import kotlinx.android.synthetic.main.include_search_input_title.* + /** * 搜索仪器设备 * */ class SearchEquipmentActivity : KotlinBaseActivity() { - override fun initData() { + private lateinit var weakReferenceHandler: WeakReferenceHandler + private lateinit var historyAdapter: NormalRecyclerAdapter + private var dataBeans: MutableList = ArrayList() + private var isRefresh = false + override fun initData() { + weakReferenceHandler = WeakReferenceHandler { + if (it.what == 2023031001) { + if (isRefresh) { + historyAdapter.notifyDataSetChanged() + } else { + historyAdapter = object : + NormalRecyclerAdapter( + R.layout.item_search_rv_l, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, position: Int, item: SearchHistoryBean + ) { + viewHolder.setText(R.id.searchTagView, item.keywords) + } + } + historyRecyclerView.adapter = historyAdapter + historyAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked(position: Int, t: SearchHistoryBean) { + navigatePageTo(t.keywords) + } + }) + } + } + true + } + } + + override fun onResume() { + super.onResume() + dataBeans = DataBaseManager.get.queryHistoryByType(SearchType.Equipment) + weakReferenceHandler.sendEmptyMessage(2023031001) } override fun initEvent() { leftBackView.setOnClickListener { finish() } searchTextView.setOnClickListener { + if (!inputView.text.isNullOrBlank()) { + DataBaseManager.get.addSearchHistory( + inputView.text.toString(), SearchType.Equipment + ) + } + navigatePageTo(inputView.text.toString()) } + + deleteHistoryView.setOnClickListener { + AlertControlDialog.Builder() + .setContext(this) + .setTitle("提示") + .setMessage("确定将所有搜索记录删除?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + + } + + override fun onConfirmClick() { + DataBaseManager.get.deleteHistoryByType(SearchType.Equipment) + dataBeans.clear() + historyAdapter.notifyDataSetChanged() + } + }).build().show() + } } override fun initLayoutView(): Int = R.layout.activity_search_equipment @@ -35,9 +106,4 @@ initLayoutImmersionBar(rootView) inputView.hint = "查询设备名称、编号" } - - override fun onResume() { - super.onResume() - //TODO 流式布局显示查询记录Tag? - } } \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_delete.xml b/app/src/main/res/drawable/ic_delete.xml new file mode 100644 index 0000000..1810342 --- /dev/null +++ b/app/src/main/res/drawable/ic_delete.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/layout/activity_search_all.xml b/app/src/main/res/layout/activity_search_all.xml new file mode 100644 index 0000000..45694fb --- /dev/null +++ b/app/src/main/res/layout/activity_search_all.xml @@ -0,0 +1,17 @@ + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_search_all_reasult.xml b/app/src/main/res/layout/activity_search_all_reasult.xml new file mode 100644 index 0000000..7e90433 --- /dev/null +++ b/app/src/main/res/layout/activity_search_all_reasult.xml @@ -0,0 +1,51 @@ + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_search_equipment.xml b/app/src/main/res/layout/activity_search_equipment.xml index 45694fb..f637b70 100644 --- a/app/src/main/res/layout/activity_search_equipment.xml +++ b/app/src/main/res/layout/activity_search_equipment.xml @@ -1,5 +1,6 @@ + + + + + + + + \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index 298f687..e142ec1 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -3,6 +3,7 @@ apply plugin: 'com.android.application' apply plugin: 'kotlin-android' apply plugin: 'kotlin-android-extensions' +apply plugin: 'org.greenrobot.greendao' android { signingConfigs { @@ -57,6 +58,12 @@ outputFileName = "XZJL_" + getBuildDate() + "_Beta.apk" } } + + greendao { + schemaVersion 1//数据库版本号 + targetGenDir 'src/main/java'//设置DaoMaster、DaoSession、Dao目录 + daoPackage 'com.casic.xz.meterage.greendao'//设置DaoMaster、DaoSession、Dao包名 + } } static def getBuildDate() { @@ -67,7 +74,7 @@ dependencies { //基础依赖库 implementation 'com.github.AndroidCoderPeng:Kotlin-lite-lib:1.0.4' - implementation 'androidx.appcompat:appcompat:1.5.1' + implementation 'androidx.appcompat:appcompat:1.6.1' implementation 'androidx.core:core-ktx:1.9.0' //Google官方授权框架 implementation 'pub.devrel:easypermissions:3.0.0' @@ -113,4 +120,6 @@ implementation 'com.github.tiann:FreeReflection:3.1.0' //单项/数字、二三级联动、日期/时间等滚轮选择器 implementation 'com.github.gzu-liyujiang.AndroidPicker:WheelPicker:4.1.8' + //数据库框架 + implementation 'org.greenrobot:greendao:3.3.0' } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 972eff9..5b6f9b2 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -69,6 +69,8 @@ + + diff --git a/app/src/main/java/com/casic/xz/meterage/base/BaseApplication.kt b/app/src/main/java/com/casic/xz/meterage/base/BaseApplication.kt index 14a604d..1684c23 100644 --- a/app/src/main/java/com/casic/xz/meterage/base/BaseApplication.kt +++ b/app/src/main/java/com/casic/xz/meterage/base/BaseApplication.kt @@ -2,6 +2,8 @@ import android.app.Application import android.content.Context +import com.casic.xz.meterage.greendao.DaoMaster +import com.casic.xz.meterage.greendao.DaoSession import com.pengxh.kt.lite.utils.SaveKeyValues import me.weishu.reflection.Reflection import kotlin.properties.Delegates @@ -12,12 +14,22 @@ private var application: BaseApplication by Delegates.notNull() fun get() = application + + private lateinit var daoSession: DaoSession } override fun onCreate() { super.onCreate() application = this SaveKeyValues.initSharedPreferences(this) + + val devOpenHelper = DaoMaster.DevOpenHelper(this, "Meterage.db", null) + val daoMaster = DaoMaster(devOpenHelper.writableDatabase) + daoSession = daoMaster.newSession() + } + + fun getDaoSession(): DaoSession { + return daoSession } //绕过Android 11以上反射限制 diff --git a/app/src/main/java/com/casic/xz/meterage/bean/SearchHistoryBean.java b/app/src/main/java/com/casic/xz/meterage/bean/SearchHistoryBean.java new file mode 100644 index 0000000..6a46a3a --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/bean/SearchHistoryBean.java @@ -0,0 +1,82 @@ +package com.casic.xz.meterage.bean; + +import org.greenrobot.greendao.annotation.Entity; +import org.greenrobot.greendao.annotation.Generated; +import org.greenrobot.greendao.annotation.Id; +import org.greenrobot.greendao.annotation.Unique; + +@Entity +public class SearchHistoryBean { + @Id(autoincrement = true) + private Long id;//主键自增 + + @Unique + private String uuid; + private String keywords;//查询条件-关键字 + private String searchType;//查询类型 + private String userId;//用户Id + private String searchTime;//查询的时间 + + @Generated(hash = 2130561778) + public SearchHistoryBean(Long id, String uuid, String keywords, + String searchType, String userId, String searchTime) { + this.id = id; + this.uuid = uuid; + this.keywords = keywords; + this.searchType = searchType; + this.userId = userId; + this.searchTime = searchTime; + } + + @Generated(hash = 1570282321) + public SearchHistoryBean() { + } + + public Long getId() { + return this.id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getUuid() { + return this.uuid; + } + + public void setUuid(String uuid) { + this.uuid = uuid; + } + + public String getKeywords() { + return this.keywords; + } + + public void setKeywords(String keywords) { + this.keywords = keywords; + } + + public String getSearchType() { + return this.searchType; + } + + public void setSearchType(String searchType) { + this.searchType = searchType; + } + + public String getUserId() { + return this.userId; + } + + public void setUserId(String userId) { + this.userId = userId; + } + + public String getSearchTime() { + return this.searchTime; + } + + public void setSearchTime(String searchTime) { + this.searchTime = searchTime; + } +} diff --git a/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt index 151f951..ae7f5e4 100644 --- a/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt +++ b/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt @@ -15,22 +15,20 @@ import com.casic.xz.meterage.extensions.showEmptyPage import com.casic.xz.meterage.model.NoticeListModel import com.casic.xz.meterage.model.RemindListModel -import com.casic.xz.meterage.model.UserInfoModel import com.casic.xz.meterage.utils.LoadingDialogHub import com.casic.xz.meterage.utils.LocaleConstant import com.casic.xz.meterage.utils.QrConfigCreator import com.casic.xz.meterage.view.home.* import com.casic.xz.meterage.view.notice.NoticeListActivity +import com.casic.xz.meterage.view.search.SearchAllActivity import com.casic.xz.meterage.vm.MeterageTrainViewModel import com.casic.xz.meterage.vm.NoticeViewModel -import com.casic.xz.meterage.vm.UserViewModel import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter import com.pengxh.kt.lite.adapter.ViewHolder import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.convertColor import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show -import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.utils.WeakReferenceHandler import com.pengxh.kt.lite.vm.LoadState import com.pengxh.kt.lite.widget.dialog.AlertControlDialog @@ -39,13 +37,12 @@ import kotlinx.android.synthetic.main.include_empty_view.* import java.util.* -class HomePageFragment : KotlinBaseFragment() { +class HomePageFragment(private val userId: String) : KotlinBaseFragment() { private val timer = object : Timer() {} private lateinit var weakReferenceHandler: WeakReferenceHandler private lateinit var meterageTrainViewModel: MeterageTrainViewModel private lateinit var noticeViewModel: NoticeViewModel - private lateinit var userData: UserInfoModel.DataModel private lateinit var remindAdapter: NormalRecyclerAdapter private var dataBeans: MutableList = ArrayList() private var noticeBeans: MutableList = ArrayList() @@ -170,14 +167,6 @@ true } - val userViewModel = ViewModelProvider(this)[UserViewModel::class.java] - userViewModel.getUserInfo(SaveKeyValues.getValue(LocaleConstant.ACCOUNT, "") as String) - userViewModel.userInfo.observe(this) { - if (it.code == 200) { - userData = it.data - } - } - meterageTrainViewModel = ViewModelProvider(this)[MeterageTrainViewModel::class.java] meterageTrainViewModel.signInResult.observe(this) { if (it.code == 200) { @@ -296,10 +285,14 @@ } override fun initEvent() { + searchBar.setOnClickListener { + requireContext().navigatePageTo() + } + scanCodeView.setOnClickListener { qrManager.startScan(requireActivity()) { result -> if (result.content.isDigitsOnly()) { - meterageTrainViewModel.signIn(userData.id, result.content) + meterageTrainViewModel.signIn(userId, result.content) } else { "签到二维码错误,请重新扫描".show(requireContext()) } diff --git a/app/src/main/java/com/casic/xz/meterage/greendao/DaoMaster.java b/app/src/main/java/com/casic/xz/meterage/greendao/DaoMaster.java new file mode 100644 index 0000000..d714ce2 --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/greendao/DaoMaster.java @@ -0,0 +1,96 @@ +package com.casic.xz.meterage.greendao; + +import android.content.Context; +import android.database.sqlite.SQLiteDatabase; +import android.database.sqlite.SQLiteDatabase.CursorFactory; +import android.util.Log; + +import org.greenrobot.greendao.AbstractDaoMaster; +import org.greenrobot.greendao.database.Database; +import org.greenrobot.greendao.database.DatabaseOpenHelper; +import org.greenrobot.greendao.database.StandardDatabase; +import org.greenrobot.greendao.identityscope.IdentityScopeType; + + +// THIS CODE IS GENERATED BY greenDAO, DO NOT EDIT. +/** + * Master of DAO (schema version 1): knows all DAOs. + */ +public class DaoMaster extends AbstractDaoMaster { + public static final int SCHEMA_VERSION = 1; + + /** Creates underlying database table using DAOs. */ + public static void createAllTables(Database db, boolean ifNotExists) { + SearchHistoryBeanDao.createTable(db, ifNotExists); + } + + /** Drops underlying database table using DAOs. */ + public static void dropAllTables(Database db, boolean ifExists) { + SearchHistoryBeanDao.dropTable(db, ifExists); + } + + /** + * WARNING: Drops all table on Upgrade! Use only during development. + * Convenience method using a {@link DevOpenHelper}. + */ + public static DaoSession newDevSession(Context context, String name) { + Database db = new DevOpenHelper(context, name).getWritableDb(); + DaoMaster daoMaster = new DaoMaster(db); + return daoMaster.newSession(); + } + + public DaoMaster(SQLiteDatabase db) { + this(new StandardDatabase(db)); + } + + public DaoMaster(Database db) { + super(db, SCHEMA_VERSION); + registerDaoClass(SearchHistoryBeanDao.class); + } + + public DaoSession newSession() { + return new DaoSession(db, IdentityScopeType.Session, daoConfigMap); + } + + public DaoSession newSession(IdentityScopeType type) { + return new DaoSession(db, type, daoConfigMap); + } + + /** + * Calls {@link #createAllTables(Database, boolean)} in {@link #onCreate(Database)} - + */ + public static abstract class OpenHelper extends DatabaseOpenHelper { + public OpenHelper(Context context, String name) { + super(context, name, SCHEMA_VERSION); + } + + public OpenHelper(Context context, String name, CursorFactory factory) { + super(context, name, factory, SCHEMA_VERSION); + } + + @Override + public void onCreate(Database db) { + Log.i("greenDAO", "Creating tables for schema version " + SCHEMA_VERSION); + createAllTables(db, false); + } + } + + /** WARNING: Drops all table on Upgrade! Use only during development. */ + public static class DevOpenHelper extends OpenHelper { + public DevOpenHelper(Context context, String name) { + super(context, name); + } + + public DevOpenHelper(Context context, String name, CursorFactory factory) { + super(context, name, factory); + } + + @Override + public void onUpgrade(Database db, int oldVersion, int newVersion) { + Log.i("greenDAO", "Upgrading schema from version " + oldVersion + " to " + newVersion + " by dropping all tables"); + dropAllTables(db, true); + onCreate(db); + } + } + +} diff --git a/app/src/main/java/com/casic/xz/meterage/greendao/DaoSession.java b/app/src/main/java/com/casic/xz/meterage/greendao/DaoSession.java new file mode 100644 index 0000000..0e80024 --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/greendao/DaoSession.java @@ -0,0 +1,46 @@ +package com.casic.xz.meterage.greendao; + +import com.casic.xz.meterage.bean.SearchHistoryBean; + +import org.greenrobot.greendao.AbstractDao; +import org.greenrobot.greendao.AbstractDaoSession; +import org.greenrobot.greendao.database.Database; +import org.greenrobot.greendao.identityscope.IdentityScopeType; +import org.greenrobot.greendao.internal.DaoConfig; + +import java.util.Map; + +// THIS CODE IS GENERATED BY greenDAO, DO NOT EDIT. + +/** + * {@inheritDoc} + * + * @see org.greenrobot.greendao.AbstractDaoSession + */ +public class DaoSession extends AbstractDaoSession { + + private final DaoConfig searchHistoryBeanDaoConfig; + + private final SearchHistoryBeanDao searchHistoryBeanDao; + + public DaoSession(Database db, IdentityScopeType type, Map>, DaoConfig> + daoConfigMap) { + super(db); + + searchHistoryBeanDaoConfig = daoConfigMap.get(SearchHistoryBeanDao.class).clone(); + searchHistoryBeanDaoConfig.initIdentityScope(type); + + searchHistoryBeanDao = new SearchHistoryBeanDao(searchHistoryBeanDaoConfig, this); + + registerDao(SearchHistoryBean.class, searchHistoryBeanDao); + } + + public void clear() { + searchHistoryBeanDaoConfig.clearIdentityScope(); + } + + public SearchHistoryBeanDao getSearchHistoryBeanDao() { + return searchHistoryBeanDao; + } + +} diff --git a/app/src/main/java/com/casic/xz/meterage/greendao/SearchHistoryBeanDao.java b/app/src/main/java/com/casic/xz/meterage/greendao/SearchHistoryBeanDao.java new file mode 100644 index 0000000..5923d02 --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/greendao/SearchHistoryBeanDao.java @@ -0,0 +1,185 @@ +package com.casic.xz.meterage.greendao; + +import android.database.Cursor; +import android.database.sqlite.SQLiteStatement; + +import com.casic.xz.meterage.bean.SearchHistoryBean; + +import org.greenrobot.greendao.AbstractDao; +import org.greenrobot.greendao.Property; +import org.greenrobot.greendao.database.Database; +import org.greenrobot.greendao.database.DatabaseStatement; +import org.greenrobot.greendao.internal.DaoConfig; + +// THIS CODE IS GENERATED BY greenDAO, DO NOT EDIT. +/** + * DAO for table "SEARCH_HISTORY_BEAN". +*/ +public class SearchHistoryBeanDao extends AbstractDao { + + public static final String TABLENAME = "SEARCH_HISTORY_BEAN"; + + /** + * Properties of entity SearchHistoryBean.
+ * Can be used for QueryBuilder and for referencing column names. + */ + public static class Properties { + public final static Property Id = new Property(0, Long.class, "id", true, "_id"); + public final static Property Uuid = new Property(1, String.class, "uuid", false, "UUID"); + public final static Property Keywords = new Property(2, String.class, "keywords", false, "KEYWORDS"); + public final static Property SearchType = new Property(3, String.class, "searchType", false, "SEARCH_TYPE"); + public final static Property UserId = new Property(4, String.class, "userId", false, "USER_ID"); + public final static Property SearchTime = new Property(5, String.class, "searchTime", false, "SEARCH_TIME"); + } + + + public SearchHistoryBeanDao(DaoConfig config) { + super(config); + } + + public SearchHistoryBeanDao(DaoConfig config, DaoSession daoSession) { + super(config, daoSession); + } + + /** Creates the underlying database table. */ + public static void createTable(Database db, boolean ifNotExists) { + String constraint = ifNotExists? "IF NOT EXISTS ": ""; + db.execSQL("CREATE TABLE " + constraint + "\"SEARCH_HISTORY_BEAN\" (" + // + "\"_id\" INTEGER PRIMARY KEY AUTOINCREMENT ," + // 0: id + "\"UUID\" TEXT UNIQUE ," + // 1: uuid + "\"KEYWORDS\" TEXT," + // 2: keywords + "\"SEARCH_TYPE\" TEXT," + // 3: searchType + "\"USER_ID\" TEXT," + // 4: userId + "\"SEARCH_TIME\" TEXT);"); // 5: searchTime + } + + /** Drops the underlying database table. */ + public static void dropTable(Database db, boolean ifExists) { + String sql = "DROP TABLE " + (ifExists ? "IF EXISTS " : "") + "\"SEARCH_HISTORY_BEAN\""; + db.execSQL(sql); + } + + @Override + protected final void bindValues(DatabaseStatement stmt, SearchHistoryBean entity) { + stmt.clearBindings(); + + Long id = entity.getId(); + if (id != null) { + stmt.bindLong(1, id); + } + + String uuid = entity.getUuid(); + if (uuid != null) { + stmt.bindString(2, uuid); + } + + String keywords = entity.getKeywords(); + if (keywords != null) { + stmt.bindString(3, keywords); + } + + String searchType = entity.getSearchType(); + if (searchType != null) { + stmt.bindString(4, searchType); + } + + String userId = entity.getUserId(); + if (userId != null) { + stmt.bindString(5, userId); + } + + String searchTime = entity.getSearchTime(); + if (searchTime != null) { + stmt.bindString(6, searchTime); + } + } + + @Override + protected final void bindValues(SQLiteStatement stmt, SearchHistoryBean entity) { + stmt.clearBindings(); + + Long id = entity.getId(); + if (id != null) { + stmt.bindLong(1, id); + } + + String uuid = entity.getUuid(); + if (uuid != null) { + stmt.bindString(2, uuid); + } + + String keywords = entity.getKeywords(); + if (keywords != null) { + stmt.bindString(3, keywords); + } + + String searchType = entity.getSearchType(); + if (searchType != null) { + stmt.bindString(4, searchType); + } + + String userId = entity.getUserId(); + if (userId != null) { + stmt.bindString(5, userId); + } + + String searchTime = entity.getSearchTime(); + if (searchTime != null) { + stmt.bindString(6, searchTime); + } + } + + @Override + public Long readKey(Cursor cursor, int offset) { + return cursor.isNull(offset + 0) ? null : cursor.getLong(offset + 0); + } + + @Override + public SearchHistoryBean readEntity(Cursor cursor, int offset) { + SearchHistoryBean entity = new SearchHistoryBean( // + cursor.isNull(offset + 0) ? null : cursor.getLong(offset + 0), // id + cursor.isNull(offset + 1) ? null : cursor.getString(offset + 1), // uuid + cursor.isNull(offset + 2) ? null : cursor.getString(offset + 2), // keywords + cursor.isNull(offset + 3) ? null : cursor.getString(offset + 3), // searchType + cursor.isNull(offset + 4) ? null : cursor.getString(offset + 4), // userId + cursor.isNull(offset + 5) ? null : cursor.getString(offset + 5) // searchTime + ); + return entity; + } + + @Override + public void readEntity(Cursor cursor, SearchHistoryBean entity, int offset) { + entity.setId(cursor.isNull(offset + 0) ? null : cursor.getLong(offset + 0)); + entity.setUuid(cursor.isNull(offset + 1) ? null : cursor.getString(offset + 1)); + entity.setKeywords(cursor.isNull(offset + 2) ? null : cursor.getString(offset + 2)); + entity.setSearchType(cursor.isNull(offset + 3) ? null : cursor.getString(offset + 3)); + entity.setUserId(cursor.isNull(offset + 4) ? null : cursor.getString(offset + 4)); + entity.setSearchTime(cursor.isNull(offset + 5) ? null : cursor.getString(offset + 5)); + } + + @Override + protected final Long updateKeyAfterInsert(SearchHistoryBean entity, long rowId) { + entity.setId(rowId); + return rowId; + } + + @Override + public Long getKey(SearchHistoryBean entity) { + if(entity != null) { + return entity.getId(); + } else { + return null; + } + } + + @Override + public boolean hasKey(SearchHistoryBean entity) { + return entity.getId() != null; + } + + @Override + protected final boolean isEntityUpdateable() { + return true; + } + +} diff --git a/app/src/main/java/com/casic/xz/meterage/utils/DataBaseManager.kt b/app/src/main/java/com/casic/xz/meterage/utils/DataBaseManager.kt new file mode 100644 index 0000000..52fe032 --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/utils/DataBaseManager.kt @@ -0,0 +1,45 @@ +package com.casic.xz.meterage.utils + +import com.casic.xz.meterage.base.BaseApplication +import com.casic.xz.meterage.bean.SearchHistoryBean +import com.casic.xz.meterage.greendao.SearchHistoryBeanDao +import com.pengxh.kt.lite.extensions.timestampToCompleteDate +import com.pengxh.kt.lite.utils.SaveKeyValues +import java.util.* + +class DataBaseManager private constructor() { + + companion object { + //Kotlin委托模式双重锁单例 + val get: DataBaseManager by lazy(mode = LazyThreadSafetyMode.SYNCHRONIZED) { + DataBaseManager() + } + } + + private val searchBeanDao by lazy { BaseApplication.get().getDaoSession().searchHistoryBeanDao } + private val userId by lazy { SaveKeyValues.getValue(LocaleConstant.USER_ID, "") } + + fun addSearchHistory(keywords: String, searchType: String) { + val bean = SearchHistoryBean() + bean.uuid = UUID.randomUUID().toString() + bean.keywords = keywords + bean.searchType = searchType + bean.userId = userId.toString() + bean.searchTime = System.currentTimeMillis().timestampToCompleteDate() + searchBeanDao.insert(bean) + } + + fun queryHistoryByType(searchType: String): MutableList { + return searchBeanDao.queryBuilder().where( + SearchHistoryBeanDao.Properties.UserId.eq(userId), + SearchHistoryBeanDao.Properties.SearchType.eq(searchType) + ).list() + } + + fun deleteHistoryByType(searchType: String) { + val list = queryHistoryByType(searchType) + list.forEach { + searchBeanDao.delete(it) + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/utils/LocaleConstant.kt b/app/src/main/java/com/casic/xz/meterage/utils/LocaleConstant.kt index cc2848b..2ea47a0 100644 --- a/app/src/main/java/com/casic/xz/meterage/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/xz/meterage/utils/LocaleConstant.kt @@ -62,4 +62,5 @@ const val File_SERVER_URL = "http://111.198.10.15:21408" const val ACCOUNT = "account" const val PASSWORD = "password" + const val USER_ID = "userId" } \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/utils/SearchType.kt b/app/src/main/java/com/casic/xz/meterage/utils/SearchType.kt new file mode 100644 index 0000000..5f5253e --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/utils/SearchType.kt @@ -0,0 +1,8 @@ +package com.casic.xz.meterage.utils + +object SearchType { + /** + * 搜索仪器设备 + * */ + const val Equipment = "0" +} diff --git a/app/src/main/java/com/casic/xz/meterage/view/MainActivity.kt b/app/src/main/java/com/casic/xz/meterage/view/MainActivity.kt index 28836e0..8fb0793 100644 --- a/app/src/main/java/com/casic/xz/meterage/view/MainActivity.kt +++ b/app/src/main/java/com/casic/xz/meterage/view/MainActivity.kt @@ -3,15 +3,19 @@ import android.view.KeyEvent import android.view.MenuItem import androidx.fragment.app.Fragment +import androidx.lifecycle.ViewModelProvider import androidx.viewpager.widget.ViewPager import com.casic.xz.meterage.R import com.casic.xz.meterage.adapter.ViewPagerAdapter import com.casic.xz.meterage.fragment.HomePageFragment import com.casic.xz.meterage.fragment.MinePageFragment import com.casic.xz.meterage.fragment.SamplePageFragment +import com.casic.xz.meterage.utils.LocaleConstant +import com.casic.xz.meterage.vm.UserViewModel import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.SaveKeyValues import kotlinx.android.synthetic.main.activity_main.* class MainActivity : KotlinBaseActivity() { @@ -20,53 +24,59 @@ private var fragmentPages: ArrayList = ArrayList() private var clickTime: Long = 0 - init { - fragmentPages.add(HomePageFragment()) - fragmentPages.add(SamplePageFragment()) - fragmentPages.add(MinePageFragment()) - } - override fun initData() { - bottomNavigation.itemIconTintList = null - bottomNavigation.setOnNavigationItemSelectedListener { menuItem -> - when (menuItem.itemId) { - R.id.nav_home -> { - mainViewPager.currentItem = 0 + val userViewModel = ViewModelProvider(this)[UserViewModel::class.java] + userViewModel.getUserInfo(SaveKeyValues.getValue(LocaleConstant.ACCOUNT, "") as String) + userViewModel.userInfo.observe(this) { + if (it.code == 200) { + SaveKeyValues.putValue(LocaleConstant.USER_ID, it.data.id) + + fragmentPages.add(HomePageFragment(it.data.id)) + fragmentPages.add(SamplePageFragment()) + fragmentPages.add(MinePageFragment()) + + bottomNavigation.itemIconTintList = null + bottomNavigation.setOnNavigationItemSelectedListener { menuItem -> + when (menuItem.itemId) { + R.id.nav_home -> { + mainViewPager.currentItem = 0 + } + R.id.nav_sample -> { + mainViewPager.currentItem = 1 + } + R.id.nav_mine -> { + mainViewPager.currentItem = 2 + } + } + false } - R.id.nav_sample -> { - mainViewPager.currentItem = 1 - } - R.id.nav_mine -> { - mainViewPager.currentItem = 2 - } + mainViewPager.adapter = ViewPagerAdapter(fragmentPages, supportFragmentManager) + mainViewPager.offscreenPageLimit = fragmentPages.size //缓存页数 + mainViewPager.addOnPageChangeListener(object : ViewPager.OnPageChangeListener { + override fun onPageScrollStateChanged(state: Int) { + + } + + override fun onPageScrolled( + position: Int, + positionOffset: Float, + positionOffsetPixels: Int + ) { + + } + + override fun onPageSelected(position: Int) { + if (menuItem != null) { + menuItem!!.isChecked = false + } else { + bottomNavigation.menu.getItem(0).isChecked = false + } + menuItem = bottomNavigation.menu.getItem(position) + menuItem!!.isChecked = true + } + }) } - false } - mainViewPager.adapter = ViewPagerAdapter(fragmentPages, supportFragmentManager) - mainViewPager.offscreenPageLimit = fragmentPages.size //缓存页数 - mainViewPager.addOnPageChangeListener(object : ViewPager.OnPageChangeListener { - override fun onPageScrollStateChanged(state: Int) { - - } - - override fun onPageScrolled( - position: Int, - positionOffset: Float, - positionOffsetPixels: Int - ) { - - } - - override fun onPageSelected(position: Int) { - if (menuItem != null) { - menuItem!!.isChecked = false - } else { - bottomNavigation.menu.getItem(0).isChecked = false - } - menuItem = bottomNavigation.menu.getItem(position) - menuItem!!.isChecked = true - } - }) } override fun initEvent() { diff --git a/app/src/main/java/com/casic/xz/meterage/view/search/SearchAllActivity.kt b/app/src/main/java/com/casic/xz/meterage/view/search/SearchAllActivity.kt new file mode 100644 index 0000000..ecc8fd7 --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/view/search/SearchAllActivity.kt @@ -0,0 +1,40 @@ +package com.casic.xz.meterage.view.search + +import com.casic.xz.meterage.R +import com.casic.xz.meterage.extensions.initLayoutImmersionBar +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.navigatePageTo +import kotlinx.android.synthetic.main.activity_search_all.* +import kotlinx.android.synthetic.main.include_search_input_title.* + +class SearchAllActivity : KotlinBaseActivity() { + + override fun initData() { + + } + + override fun initEvent() { + leftBackView.setOnClickListener { finish() } + searchTextView.setOnClickListener { + navigatePageTo(inputView.text.toString()) + } + } + + override fun initLayoutView(): Int = R.layout.activity_search_all + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + initLayoutImmersionBar(rootView) + inputView.hint = "查询样品、业务" + } + + override fun onResume() { + super.onResume() + //TODO 流式布局显示查询记录Tag? + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/view/search/SearchAllResultActivity.kt b/app/src/main/java/com/casic/xz/meterage/view/search/SearchAllResultActivity.kt new file mode 100644 index 0000000..adbb570 --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/view/search/SearchAllResultActivity.kt @@ -0,0 +1,34 @@ +package com.casic.xz.meterage.view.search + +import com.casic.xz.meterage.R +import com.casic.xz.meterage.extensions.initLayoutImmersionBar +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.utils.Constant +import kotlinx.android.synthetic.main.activity_search_all_reasult.* +import kotlinx.android.synthetic.main.include_search_title.* + +class SearchAllResultActivity : KotlinBaseActivity() { + + private lateinit var param: String + + override fun initData() { + param = intent.getStringExtra(Constant.INTENT_PARAM)!! + } + + override fun initEvent() { + leftBackView.setOnClickListener { finish() } + } + + override fun initLayoutView(): Int = R.layout.activity_search_all_reasult + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + initLayoutImmersionBar(rootView) + titleView.text = "查询结果" + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/view/search/SearchEquipmentActivity.kt b/app/src/main/java/com/casic/xz/meterage/view/search/SearchEquipmentActivity.kt index f5c98d6..3551790 100644 --- a/app/src/main/java/com/casic/xz/meterage/view/search/SearchEquipmentActivity.kt +++ b/app/src/main/java/com/casic/xz/meterage/view/search/SearchEquipmentActivity.kt @@ -1,27 +1,98 @@ package com.casic.xz.meterage.view.search import com.casic.xz.meterage.R +import com.casic.xz.meterage.bean.SearchHistoryBean import com.casic.xz.meterage.extensions.initLayoutImmersionBar +import com.casic.xz.meterage.utils.DataBaseManager +import com.casic.xz.meterage.utils.SearchType import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter +import com.pengxh.kt.lite.adapter.ViewHolder import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.utils.WeakReferenceHandler +import com.pengxh.kt.lite.widget.dialog.AlertControlDialog import kotlinx.android.synthetic.main.activity_search_equipment.* import kotlinx.android.synthetic.main.include_search_input_title.* + /** * 搜索仪器设备 * */ class SearchEquipmentActivity : KotlinBaseActivity() { - override fun initData() { + private lateinit var weakReferenceHandler: WeakReferenceHandler + private lateinit var historyAdapter: NormalRecyclerAdapter + private var dataBeans: MutableList = ArrayList() + private var isRefresh = false + override fun initData() { + weakReferenceHandler = WeakReferenceHandler { + if (it.what == 2023031001) { + if (isRefresh) { + historyAdapter.notifyDataSetChanged() + } else { + historyAdapter = object : + NormalRecyclerAdapter( + R.layout.item_search_rv_l, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, position: Int, item: SearchHistoryBean + ) { + viewHolder.setText(R.id.searchTagView, item.keywords) + } + } + historyRecyclerView.adapter = historyAdapter + historyAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked(position: Int, t: SearchHistoryBean) { + navigatePageTo(t.keywords) + } + }) + } + } + true + } + } + + override fun onResume() { + super.onResume() + dataBeans = DataBaseManager.get.queryHistoryByType(SearchType.Equipment) + weakReferenceHandler.sendEmptyMessage(2023031001) } override fun initEvent() { leftBackView.setOnClickListener { finish() } searchTextView.setOnClickListener { + if (!inputView.text.isNullOrBlank()) { + DataBaseManager.get.addSearchHistory( + inputView.text.toString(), SearchType.Equipment + ) + } + navigatePageTo(inputView.text.toString()) } + + deleteHistoryView.setOnClickListener { + AlertControlDialog.Builder() + .setContext(this) + .setTitle("提示") + .setMessage("确定将所有搜索记录删除?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + + } + + override fun onConfirmClick() { + DataBaseManager.get.deleteHistoryByType(SearchType.Equipment) + dataBeans.clear() + historyAdapter.notifyDataSetChanged() + } + }).build().show() + } } override fun initLayoutView(): Int = R.layout.activity_search_equipment @@ -35,9 +106,4 @@ initLayoutImmersionBar(rootView) inputView.hint = "查询设备名称、编号" } - - override fun onResume() { - super.onResume() - //TODO 流式布局显示查询记录Tag? - } } \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_delete.xml b/app/src/main/res/drawable/ic_delete.xml new file mode 100644 index 0000000..1810342 --- /dev/null +++ b/app/src/main/res/drawable/ic_delete.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/layout/activity_search_all.xml b/app/src/main/res/layout/activity_search_all.xml new file mode 100644 index 0000000..45694fb --- /dev/null +++ b/app/src/main/res/layout/activity_search_all.xml @@ -0,0 +1,17 @@ + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_search_all_reasult.xml b/app/src/main/res/layout/activity_search_all_reasult.xml new file mode 100644 index 0000000..7e90433 --- /dev/null +++ b/app/src/main/res/layout/activity_search_all_reasult.xml @@ -0,0 +1,51 @@ + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_search_equipment.xml b/app/src/main/res/layout/activity_search_equipment.xml index 45694fb..f637b70 100644 --- a/app/src/main/res/layout/activity_search_equipment.xml +++ b/app/src/main/res/layout/activity_search_equipment.xml @@ -1,5 +1,6 @@ + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_home.xml b/app/src/main/res/layout/fragment_home.xml index 154d157..e525b93 100644 --- a/app/src/main/res/layout/fragment_home.xml +++ b/app/src/main/res/layout/fragment_home.xml @@ -33,12 +33,16 @@ android:layout_marginHorizontal="@dimen/dp_5" android:src="@drawable/ic_search" /> - + + diff --git a/app/src/main/java/com/casic/xz/meterage/base/BaseApplication.kt b/app/src/main/java/com/casic/xz/meterage/base/BaseApplication.kt index 14a604d..1684c23 100644 --- a/app/src/main/java/com/casic/xz/meterage/base/BaseApplication.kt +++ b/app/src/main/java/com/casic/xz/meterage/base/BaseApplication.kt @@ -2,6 +2,8 @@ import android.app.Application import android.content.Context +import com.casic.xz.meterage.greendao.DaoMaster +import com.casic.xz.meterage.greendao.DaoSession import com.pengxh.kt.lite.utils.SaveKeyValues import me.weishu.reflection.Reflection import kotlin.properties.Delegates @@ -12,12 +14,22 @@ private var application: BaseApplication by Delegates.notNull() fun get() = application + + private lateinit var daoSession: DaoSession } override fun onCreate() { super.onCreate() application = this SaveKeyValues.initSharedPreferences(this) + + val devOpenHelper = DaoMaster.DevOpenHelper(this, "Meterage.db", null) + val daoMaster = DaoMaster(devOpenHelper.writableDatabase) + daoSession = daoMaster.newSession() + } + + fun getDaoSession(): DaoSession { + return daoSession } //绕过Android 11以上反射限制 diff --git a/app/src/main/java/com/casic/xz/meterage/bean/SearchHistoryBean.java b/app/src/main/java/com/casic/xz/meterage/bean/SearchHistoryBean.java new file mode 100644 index 0000000..6a46a3a --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/bean/SearchHistoryBean.java @@ -0,0 +1,82 @@ +package com.casic.xz.meterage.bean; + +import org.greenrobot.greendao.annotation.Entity; +import org.greenrobot.greendao.annotation.Generated; +import org.greenrobot.greendao.annotation.Id; +import org.greenrobot.greendao.annotation.Unique; + +@Entity +public class SearchHistoryBean { + @Id(autoincrement = true) + private Long id;//主键自增 + + @Unique + private String uuid; + private String keywords;//查询条件-关键字 + private String searchType;//查询类型 + private String userId;//用户Id + private String searchTime;//查询的时间 + + @Generated(hash = 2130561778) + public SearchHistoryBean(Long id, String uuid, String keywords, + String searchType, String userId, String searchTime) { + this.id = id; + this.uuid = uuid; + this.keywords = keywords; + this.searchType = searchType; + this.userId = userId; + this.searchTime = searchTime; + } + + @Generated(hash = 1570282321) + public SearchHistoryBean() { + } + + public Long getId() { + return this.id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getUuid() { + return this.uuid; + } + + public void setUuid(String uuid) { + this.uuid = uuid; + } + + public String getKeywords() { + return this.keywords; + } + + public void setKeywords(String keywords) { + this.keywords = keywords; + } + + public String getSearchType() { + return this.searchType; + } + + public void setSearchType(String searchType) { + this.searchType = searchType; + } + + public String getUserId() { + return this.userId; + } + + public void setUserId(String userId) { + this.userId = userId; + } + + public String getSearchTime() { + return this.searchTime; + } + + public void setSearchTime(String searchTime) { + this.searchTime = searchTime; + } +} diff --git a/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt index 151f951..ae7f5e4 100644 --- a/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt +++ b/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt @@ -15,22 +15,20 @@ import com.casic.xz.meterage.extensions.showEmptyPage import com.casic.xz.meterage.model.NoticeListModel import com.casic.xz.meterage.model.RemindListModel -import com.casic.xz.meterage.model.UserInfoModel import com.casic.xz.meterage.utils.LoadingDialogHub import com.casic.xz.meterage.utils.LocaleConstant import com.casic.xz.meterage.utils.QrConfigCreator import com.casic.xz.meterage.view.home.* import com.casic.xz.meterage.view.notice.NoticeListActivity +import com.casic.xz.meterage.view.search.SearchAllActivity import com.casic.xz.meterage.vm.MeterageTrainViewModel import com.casic.xz.meterage.vm.NoticeViewModel -import com.casic.xz.meterage.vm.UserViewModel import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter import com.pengxh.kt.lite.adapter.ViewHolder import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.convertColor import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show -import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.utils.WeakReferenceHandler import com.pengxh.kt.lite.vm.LoadState import com.pengxh.kt.lite.widget.dialog.AlertControlDialog @@ -39,13 +37,12 @@ import kotlinx.android.synthetic.main.include_empty_view.* import java.util.* -class HomePageFragment : KotlinBaseFragment() { +class HomePageFragment(private val userId: String) : KotlinBaseFragment() { private val timer = object : Timer() {} private lateinit var weakReferenceHandler: WeakReferenceHandler private lateinit var meterageTrainViewModel: MeterageTrainViewModel private lateinit var noticeViewModel: NoticeViewModel - private lateinit var userData: UserInfoModel.DataModel private lateinit var remindAdapter: NormalRecyclerAdapter private var dataBeans: MutableList = ArrayList() private var noticeBeans: MutableList = ArrayList() @@ -170,14 +167,6 @@ true } - val userViewModel = ViewModelProvider(this)[UserViewModel::class.java] - userViewModel.getUserInfo(SaveKeyValues.getValue(LocaleConstant.ACCOUNT, "") as String) - userViewModel.userInfo.observe(this) { - if (it.code == 200) { - userData = it.data - } - } - meterageTrainViewModel = ViewModelProvider(this)[MeterageTrainViewModel::class.java] meterageTrainViewModel.signInResult.observe(this) { if (it.code == 200) { @@ -296,10 +285,14 @@ } override fun initEvent() { + searchBar.setOnClickListener { + requireContext().navigatePageTo() + } + scanCodeView.setOnClickListener { qrManager.startScan(requireActivity()) { result -> if (result.content.isDigitsOnly()) { - meterageTrainViewModel.signIn(userData.id, result.content) + meterageTrainViewModel.signIn(userId, result.content) } else { "签到二维码错误,请重新扫描".show(requireContext()) } diff --git a/app/src/main/java/com/casic/xz/meterage/greendao/DaoMaster.java b/app/src/main/java/com/casic/xz/meterage/greendao/DaoMaster.java new file mode 100644 index 0000000..d714ce2 --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/greendao/DaoMaster.java @@ -0,0 +1,96 @@ +package com.casic.xz.meterage.greendao; + +import android.content.Context; +import android.database.sqlite.SQLiteDatabase; +import android.database.sqlite.SQLiteDatabase.CursorFactory; +import android.util.Log; + +import org.greenrobot.greendao.AbstractDaoMaster; +import org.greenrobot.greendao.database.Database; +import org.greenrobot.greendao.database.DatabaseOpenHelper; +import org.greenrobot.greendao.database.StandardDatabase; +import org.greenrobot.greendao.identityscope.IdentityScopeType; + + +// THIS CODE IS GENERATED BY greenDAO, DO NOT EDIT. +/** + * Master of DAO (schema version 1): knows all DAOs. + */ +public class DaoMaster extends AbstractDaoMaster { + public static final int SCHEMA_VERSION = 1; + + /** Creates underlying database table using DAOs. */ + public static void createAllTables(Database db, boolean ifNotExists) { + SearchHistoryBeanDao.createTable(db, ifNotExists); + } + + /** Drops underlying database table using DAOs. */ + public static void dropAllTables(Database db, boolean ifExists) { + SearchHistoryBeanDao.dropTable(db, ifExists); + } + + /** + * WARNING: Drops all table on Upgrade! Use only during development. + * Convenience method using a {@link DevOpenHelper}. + */ + public static DaoSession newDevSession(Context context, String name) { + Database db = new DevOpenHelper(context, name).getWritableDb(); + DaoMaster daoMaster = new DaoMaster(db); + return daoMaster.newSession(); + } + + public DaoMaster(SQLiteDatabase db) { + this(new StandardDatabase(db)); + } + + public DaoMaster(Database db) { + super(db, SCHEMA_VERSION); + registerDaoClass(SearchHistoryBeanDao.class); + } + + public DaoSession newSession() { + return new DaoSession(db, IdentityScopeType.Session, daoConfigMap); + } + + public DaoSession newSession(IdentityScopeType type) { + return new DaoSession(db, type, daoConfigMap); + } + + /** + * Calls {@link #createAllTables(Database, boolean)} in {@link #onCreate(Database)} - + */ + public static abstract class OpenHelper extends DatabaseOpenHelper { + public OpenHelper(Context context, String name) { + super(context, name, SCHEMA_VERSION); + } + + public OpenHelper(Context context, String name, CursorFactory factory) { + super(context, name, factory, SCHEMA_VERSION); + } + + @Override + public void onCreate(Database db) { + Log.i("greenDAO", "Creating tables for schema version " + SCHEMA_VERSION); + createAllTables(db, false); + } + } + + /** WARNING: Drops all table on Upgrade! Use only during development. */ + public static class DevOpenHelper extends OpenHelper { + public DevOpenHelper(Context context, String name) { + super(context, name); + } + + public DevOpenHelper(Context context, String name, CursorFactory factory) { + super(context, name, factory); + } + + @Override + public void onUpgrade(Database db, int oldVersion, int newVersion) { + Log.i("greenDAO", "Upgrading schema from version " + oldVersion + " to " + newVersion + " by dropping all tables"); + dropAllTables(db, true); + onCreate(db); + } + } + +} diff --git a/app/src/main/java/com/casic/xz/meterage/greendao/DaoSession.java b/app/src/main/java/com/casic/xz/meterage/greendao/DaoSession.java new file mode 100644 index 0000000..0e80024 --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/greendao/DaoSession.java @@ -0,0 +1,46 @@ +package com.casic.xz.meterage.greendao; + +import com.casic.xz.meterage.bean.SearchHistoryBean; + +import org.greenrobot.greendao.AbstractDao; +import org.greenrobot.greendao.AbstractDaoSession; +import org.greenrobot.greendao.database.Database; +import org.greenrobot.greendao.identityscope.IdentityScopeType; +import org.greenrobot.greendao.internal.DaoConfig; + +import java.util.Map; + +// THIS CODE IS GENERATED BY greenDAO, DO NOT EDIT. + +/** + * {@inheritDoc} + * + * @see org.greenrobot.greendao.AbstractDaoSession + */ +public class DaoSession extends AbstractDaoSession { + + private final DaoConfig searchHistoryBeanDaoConfig; + + private final SearchHistoryBeanDao searchHistoryBeanDao; + + public DaoSession(Database db, IdentityScopeType type, Map>, DaoConfig> + daoConfigMap) { + super(db); + + searchHistoryBeanDaoConfig = daoConfigMap.get(SearchHistoryBeanDao.class).clone(); + searchHistoryBeanDaoConfig.initIdentityScope(type); + + searchHistoryBeanDao = new SearchHistoryBeanDao(searchHistoryBeanDaoConfig, this); + + registerDao(SearchHistoryBean.class, searchHistoryBeanDao); + } + + public void clear() { + searchHistoryBeanDaoConfig.clearIdentityScope(); + } + + public SearchHistoryBeanDao getSearchHistoryBeanDao() { + return searchHistoryBeanDao; + } + +} diff --git a/app/src/main/java/com/casic/xz/meterage/greendao/SearchHistoryBeanDao.java b/app/src/main/java/com/casic/xz/meterage/greendao/SearchHistoryBeanDao.java new file mode 100644 index 0000000..5923d02 --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/greendao/SearchHistoryBeanDao.java @@ -0,0 +1,185 @@ +package com.casic.xz.meterage.greendao; + +import android.database.Cursor; +import android.database.sqlite.SQLiteStatement; + +import com.casic.xz.meterage.bean.SearchHistoryBean; + +import org.greenrobot.greendao.AbstractDao; +import org.greenrobot.greendao.Property; +import org.greenrobot.greendao.database.Database; +import org.greenrobot.greendao.database.DatabaseStatement; +import org.greenrobot.greendao.internal.DaoConfig; + +// THIS CODE IS GENERATED BY greenDAO, DO NOT EDIT. +/** + * DAO for table "SEARCH_HISTORY_BEAN". +*/ +public class SearchHistoryBeanDao extends AbstractDao { + + public static final String TABLENAME = "SEARCH_HISTORY_BEAN"; + + /** + * Properties of entity SearchHistoryBean.
+ * Can be used for QueryBuilder and for referencing column names. + */ + public static class Properties { + public final static Property Id = new Property(0, Long.class, "id", true, "_id"); + public final static Property Uuid = new Property(1, String.class, "uuid", false, "UUID"); + public final static Property Keywords = new Property(2, String.class, "keywords", false, "KEYWORDS"); + public final static Property SearchType = new Property(3, String.class, "searchType", false, "SEARCH_TYPE"); + public final static Property UserId = new Property(4, String.class, "userId", false, "USER_ID"); + public final static Property SearchTime = new Property(5, String.class, "searchTime", false, "SEARCH_TIME"); + } + + + public SearchHistoryBeanDao(DaoConfig config) { + super(config); + } + + public SearchHistoryBeanDao(DaoConfig config, DaoSession daoSession) { + super(config, daoSession); + } + + /** Creates the underlying database table. */ + public static void createTable(Database db, boolean ifNotExists) { + String constraint = ifNotExists? "IF NOT EXISTS ": ""; + db.execSQL("CREATE TABLE " + constraint + "\"SEARCH_HISTORY_BEAN\" (" + // + "\"_id\" INTEGER PRIMARY KEY AUTOINCREMENT ," + // 0: id + "\"UUID\" TEXT UNIQUE ," + // 1: uuid + "\"KEYWORDS\" TEXT," + // 2: keywords + "\"SEARCH_TYPE\" TEXT," + // 3: searchType + "\"USER_ID\" TEXT," + // 4: userId + "\"SEARCH_TIME\" TEXT);"); // 5: searchTime + } + + /** Drops the underlying database table. */ + public static void dropTable(Database db, boolean ifExists) { + String sql = "DROP TABLE " + (ifExists ? "IF EXISTS " : "") + "\"SEARCH_HISTORY_BEAN\""; + db.execSQL(sql); + } + + @Override + protected final void bindValues(DatabaseStatement stmt, SearchHistoryBean entity) { + stmt.clearBindings(); + + Long id = entity.getId(); + if (id != null) { + stmt.bindLong(1, id); + } + + String uuid = entity.getUuid(); + if (uuid != null) { + stmt.bindString(2, uuid); + } + + String keywords = entity.getKeywords(); + if (keywords != null) { + stmt.bindString(3, keywords); + } + + String searchType = entity.getSearchType(); + if (searchType != null) { + stmt.bindString(4, searchType); + } + + String userId = entity.getUserId(); + if (userId != null) { + stmt.bindString(5, userId); + } + + String searchTime = entity.getSearchTime(); + if (searchTime != null) { + stmt.bindString(6, searchTime); + } + } + + @Override + protected final void bindValues(SQLiteStatement stmt, SearchHistoryBean entity) { + stmt.clearBindings(); + + Long id = entity.getId(); + if (id != null) { + stmt.bindLong(1, id); + } + + String uuid = entity.getUuid(); + if (uuid != null) { + stmt.bindString(2, uuid); + } + + String keywords = entity.getKeywords(); + if (keywords != null) { + stmt.bindString(3, keywords); + } + + String searchType = entity.getSearchType(); + if (searchType != null) { + stmt.bindString(4, searchType); + } + + String userId = entity.getUserId(); + if (userId != null) { + stmt.bindString(5, userId); + } + + String searchTime = entity.getSearchTime(); + if (searchTime != null) { + stmt.bindString(6, searchTime); + } + } + + @Override + public Long readKey(Cursor cursor, int offset) { + return cursor.isNull(offset + 0) ? null : cursor.getLong(offset + 0); + } + + @Override + public SearchHistoryBean readEntity(Cursor cursor, int offset) { + SearchHistoryBean entity = new SearchHistoryBean( // + cursor.isNull(offset + 0) ? null : cursor.getLong(offset + 0), // id + cursor.isNull(offset + 1) ? null : cursor.getString(offset + 1), // uuid + cursor.isNull(offset + 2) ? null : cursor.getString(offset + 2), // keywords + cursor.isNull(offset + 3) ? null : cursor.getString(offset + 3), // searchType + cursor.isNull(offset + 4) ? null : cursor.getString(offset + 4), // userId + cursor.isNull(offset + 5) ? null : cursor.getString(offset + 5) // searchTime + ); + return entity; + } + + @Override + public void readEntity(Cursor cursor, SearchHistoryBean entity, int offset) { + entity.setId(cursor.isNull(offset + 0) ? null : cursor.getLong(offset + 0)); + entity.setUuid(cursor.isNull(offset + 1) ? null : cursor.getString(offset + 1)); + entity.setKeywords(cursor.isNull(offset + 2) ? null : cursor.getString(offset + 2)); + entity.setSearchType(cursor.isNull(offset + 3) ? null : cursor.getString(offset + 3)); + entity.setUserId(cursor.isNull(offset + 4) ? null : cursor.getString(offset + 4)); + entity.setSearchTime(cursor.isNull(offset + 5) ? null : cursor.getString(offset + 5)); + } + + @Override + protected final Long updateKeyAfterInsert(SearchHistoryBean entity, long rowId) { + entity.setId(rowId); + return rowId; + } + + @Override + public Long getKey(SearchHistoryBean entity) { + if(entity != null) { + return entity.getId(); + } else { + return null; + } + } + + @Override + public boolean hasKey(SearchHistoryBean entity) { + return entity.getId() != null; + } + + @Override + protected final boolean isEntityUpdateable() { + return true; + } + +} diff --git a/app/src/main/java/com/casic/xz/meterage/utils/DataBaseManager.kt b/app/src/main/java/com/casic/xz/meterage/utils/DataBaseManager.kt new file mode 100644 index 0000000..52fe032 --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/utils/DataBaseManager.kt @@ -0,0 +1,45 @@ +package com.casic.xz.meterage.utils + +import com.casic.xz.meterage.base.BaseApplication +import com.casic.xz.meterage.bean.SearchHistoryBean +import com.casic.xz.meterage.greendao.SearchHistoryBeanDao +import com.pengxh.kt.lite.extensions.timestampToCompleteDate +import com.pengxh.kt.lite.utils.SaveKeyValues +import java.util.* + +class DataBaseManager private constructor() { + + companion object { + //Kotlin委托模式双重锁单例 + val get: DataBaseManager by lazy(mode = LazyThreadSafetyMode.SYNCHRONIZED) { + DataBaseManager() + } + } + + private val searchBeanDao by lazy { BaseApplication.get().getDaoSession().searchHistoryBeanDao } + private val userId by lazy { SaveKeyValues.getValue(LocaleConstant.USER_ID, "") } + + fun addSearchHistory(keywords: String, searchType: String) { + val bean = SearchHistoryBean() + bean.uuid = UUID.randomUUID().toString() + bean.keywords = keywords + bean.searchType = searchType + bean.userId = userId.toString() + bean.searchTime = System.currentTimeMillis().timestampToCompleteDate() + searchBeanDao.insert(bean) + } + + fun queryHistoryByType(searchType: String): MutableList { + return searchBeanDao.queryBuilder().where( + SearchHistoryBeanDao.Properties.UserId.eq(userId), + SearchHistoryBeanDao.Properties.SearchType.eq(searchType) + ).list() + } + + fun deleteHistoryByType(searchType: String) { + val list = queryHistoryByType(searchType) + list.forEach { + searchBeanDao.delete(it) + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/utils/LocaleConstant.kt b/app/src/main/java/com/casic/xz/meterage/utils/LocaleConstant.kt index cc2848b..2ea47a0 100644 --- a/app/src/main/java/com/casic/xz/meterage/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/xz/meterage/utils/LocaleConstant.kt @@ -62,4 +62,5 @@ const val File_SERVER_URL = "http://111.198.10.15:21408" const val ACCOUNT = "account" const val PASSWORD = "password" + const val USER_ID = "userId" } \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/utils/SearchType.kt b/app/src/main/java/com/casic/xz/meterage/utils/SearchType.kt new file mode 100644 index 0000000..5f5253e --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/utils/SearchType.kt @@ -0,0 +1,8 @@ +package com.casic.xz.meterage.utils + +object SearchType { + /** + * 搜索仪器设备 + * */ + const val Equipment = "0" +} diff --git a/app/src/main/java/com/casic/xz/meterage/view/MainActivity.kt b/app/src/main/java/com/casic/xz/meterage/view/MainActivity.kt index 28836e0..8fb0793 100644 --- a/app/src/main/java/com/casic/xz/meterage/view/MainActivity.kt +++ b/app/src/main/java/com/casic/xz/meterage/view/MainActivity.kt @@ -3,15 +3,19 @@ import android.view.KeyEvent import android.view.MenuItem import androidx.fragment.app.Fragment +import androidx.lifecycle.ViewModelProvider import androidx.viewpager.widget.ViewPager import com.casic.xz.meterage.R import com.casic.xz.meterage.adapter.ViewPagerAdapter import com.casic.xz.meterage.fragment.HomePageFragment import com.casic.xz.meterage.fragment.MinePageFragment import com.casic.xz.meterage.fragment.SamplePageFragment +import com.casic.xz.meterage.utils.LocaleConstant +import com.casic.xz.meterage.vm.UserViewModel import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.SaveKeyValues import kotlinx.android.synthetic.main.activity_main.* class MainActivity : KotlinBaseActivity() { @@ -20,53 +24,59 @@ private var fragmentPages: ArrayList = ArrayList() private var clickTime: Long = 0 - init { - fragmentPages.add(HomePageFragment()) - fragmentPages.add(SamplePageFragment()) - fragmentPages.add(MinePageFragment()) - } - override fun initData() { - bottomNavigation.itemIconTintList = null - bottomNavigation.setOnNavigationItemSelectedListener { menuItem -> - when (menuItem.itemId) { - R.id.nav_home -> { - mainViewPager.currentItem = 0 + val userViewModel = ViewModelProvider(this)[UserViewModel::class.java] + userViewModel.getUserInfo(SaveKeyValues.getValue(LocaleConstant.ACCOUNT, "") as String) + userViewModel.userInfo.observe(this) { + if (it.code == 200) { + SaveKeyValues.putValue(LocaleConstant.USER_ID, it.data.id) + + fragmentPages.add(HomePageFragment(it.data.id)) + fragmentPages.add(SamplePageFragment()) + fragmentPages.add(MinePageFragment()) + + bottomNavigation.itemIconTintList = null + bottomNavigation.setOnNavigationItemSelectedListener { menuItem -> + when (menuItem.itemId) { + R.id.nav_home -> { + mainViewPager.currentItem = 0 + } + R.id.nav_sample -> { + mainViewPager.currentItem = 1 + } + R.id.nav_mine -> { + mainViewPager.currentItem = 2 + } + } + false } - R.id.nav_sample -> { - mainViewPager.currentItem = 1 - } - R.id.nav_mine -> { - mainViewPager.currentItem = 2 - } + mainViewPager.adapter = ViewPagerAdapter(fragmentPages, supportFragmentManager) + mainViewPager.offscreenPageLimit = fragmentPages.size //缓存页数 + mainViewPager.addOnPageChangeListener(object : ViewPager.OnPageChangeListener { + override fun onPageScrollStateChanged(state: Int) { + + } + + override fun onPageScrolled( + position: Int, + positionOffset: Float, + positionOffsetPixels: Int + ) { + + } + + override fun onPageSelected(position: Int) { + if (menuItem != null) { + menuItem!!.isChecked = false + } else { + bottomNavigation.menu.getItem(0).isChecked = false + } + menuItem = bottomNavigation.menu.getItem(position) + menuItem!!.isChecked = true + } + }) } - false } - mainViewPager.adapter = ViewPagerAdapter(fragmentPages, supportFragmentManager) - mainViewPager.offscreenPageLimit = fragmentPages.size //缓存页数 - mainViewPager.addOnPageChangeListener(object : ViewPager.OnPageChangeListener { - override fun onPageScrollStateChanged(state: Int) { - - } - - override fun onPageScrolled( - position: Int, - positionOffset: Float, - positionOffsetPixels: Int - ) { - - } - - override fun onPageSelected(position: Int) { - if (menuItem != null) { - menuItem!!.isChecked = false - } else { - bottomNavigation.menu.getItem(0).isChecked = false - } - menuItem = bottomNavigation.menu.getItem(position) - menuItem!!.isChecked = true - } - }) } override fun initEvent() { diff --git a/app/src/main/java/com/casic/xz/meterage/view/search/SearchAllActivity.kt b/app/src/main/java/com/casic/xz/meterage/view/search/SearchAllActivity.kt new file mode 100644 index 0000000..ecc8fd7 --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/view/search/SearchAllActivity.kt @@ -0,0 +1,40 @@ +package com.casic.xz.meterage.view.search + +import com.casic.xz.meterage.R +import com.casic.xz.meterage.extensions.initLayoutImmersionBar +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.navigatePageTo +import kotlinx.android.synthetic.main.activity_search_all.* +import kotlinx.android.synthetic.main.include_search_input_title.* + +class SearchAllActivity : KotlinBaseActivity() { + + override fun initData() { + + } + + override fun initEvent() { + leftBackView.setOnClickListener { finish() } + searchTextView.setOnClickListener { + navigatePageTo(inputView.text.toString()) + } + } + + override fun initLayoutView(): Int = R.layout.activity_search_all + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + initLayoutImmersionBar(rootView) + inputView.hint = "查询样品、业务" + } + + override fun onResume() { + super.onResume() + //TODO 流式布局显示查询记录Tag? + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/view/search/SearchAllResultActivity.kt b/app/src/main/java/com/casic/xz/meterage/view/search/SearchAllResultActivity.kt new file mode 100644 index 0000000..adbb570 --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/view/search/SearchAllResultActivity.kt @@ -0,0 +1,34 @@ +package com.casic.xz.meterage.view.search + +import com.casic.xz.meterage.R +import com.casic.xz.meterage.extensions.initLayoutImmersionBar +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.utils.Constant +import kotlinx.android.synthetic.main.activity_search_all_reasult.* +import kotlinx.android.synthetic.main.include_search_title.* + +class SearchAllResultActivity : KotlinBaseActivity() { + + private lateinit var param: String + + override fun initData() { + param = intent.getStringExtra(Constant.INTENT_PARAM)!! + } + + override fun initEvent() { + leftBackView.setOnClickListener { finish() } + } + + override fun initLayoutView(): Int = R.layout.activity_search_all_reasult + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + initLayoutImmersionBar(rootView) + titleView.text = "查询结果" + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/view/search/SearchEquipmentActivity.kt b/app/src/main/java/com/casic/xz/meterage/view/search/SearchEquipmentActivity.kt index f5c98d6..3551790 100644 --- a/app/src/main/java/com/casic/xz/meterage/view/search/SearchEquipmentActivity.kt +++ b/app/src/main/java/com/casic/xz/meterage/view/search/SearchEquipmentActivity.kt @@ -1,27 +1,98 @@ package com.casic.xz.meterage.view.search import com.casic.xz.meterage.R +import com.casic.xz.meterage.bean.SearchHistoryBean import com.casic.xz.meterage.extensions.initLayoutImmersionBar +import com.casic.xz.meterage.utils.DataBaseManager +import com.casic.xz.meterage.utils.SearchType import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter +import com.pengxh.kt.lite.adapter.ViewHolder import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.utils.WeakReferenceHandler +import com.pengxh.kt.lite.widget.dialog.AlertControlDialog import kotlinx.android.synthetic.main.activity_search_equipment.* import kotlinx.android.synthetic.main.include_search_input_title.* + /** * 搜索仪器设备 * */ class SearchEquipmentActivity : KotlinBaseActivity() { - override fun initData() { + private lateinit var weakReferenceHandler: WeakReferenceHandler + private lateinit var historyAdapter: NormalRecyclerAdapter + private var dataBeans: MutableList = ArrayList() + private var isRefresh = false + override fun initData() { + weakReferenceHandler = WeakReferenceHandler { + if (it.what == 2023031001) { + if (isRefresh) { + historyAdapter.notifyDataSetChanged() + } else { + historyAdapter = object : + NormalRecyclerAdapter( + R.layout.item_search_rv_l, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, position: Int, item: SearchHistoryBean + ) { + viewHolder.setText(R.id.searchTagView, item.keywords) + } + } + historyRecyclerView.adapter = historyAdapter + historyAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked(position: Int, t: SearchHistoryBean) { + navigatePageTo(t.keywords) + } + }) + } + } + true + } + } + + override fun onResume() { + super.onResume() + dataBeans = DataBaseManager.get.queryHistoryByType(SearchType.Equipment) + weakReferenceHandler.sendEmptyMessage(2023031001) } override fun initEvent() { leftBackView.setOnClickListener { finish() } searchTextView.setOnClickListener { + if (!inputView.text.isNullOrBlank()) { + DataBaseManager.get.addSearchHistory( + inputView.text.toString(), SearchType.Equipment + ) + } + navigatePageTo(inputView.text.toString()) } + + deleteHistoryView.setOnClickListener { + AlertControlDialog.Builder() + .setContext(this) + .setTitle("提示") + .setMessage("确定将所有搜索记录删除?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + + } + + override fun onConfirmClick() { + DataBaseManager.get.deleteHistoryByType(SearchType.Equipment) + dataBeans.clear() + historyAdapter.notifyDataSetChanged() + } + }).build().show() + } } override fun initLayoutView(): Int = R.layout.activity_search_equipment @@ -35,9 +106,4 @@ initLayoutImmersionBar(rootView) inputView.hint = "查询设备名称、编号" } - - override fun onResume() { - super.onResume() - //TODO 流式布局显示查询记录Tag? - } } \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_delete.xml b/app/src/main/res/drawable/ic_delete.xml new file mode 100644 index 0000000..1810342 --- /dev/null +++ b/app/src/main/res/drawable/ic_delete.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/layout/activity_search_all.xml b/app/src/main/res/layout/activity_search_all.xml new file mode 100644 index 0000000..45694fb --- /dev/null +++ b/app/src/main/res/layout/activity_search_all.xml @@ -0,0 +1,17 @@ + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_search_all_reasult.xml b/app/src/main/res/layout/activity_search_all_reasult.xml new file mode 100644 index 0000000..7e90433 --- /dev/null +++ b/app/src/main/res/layout/activity_search_all_reasult.xml @@ -0,0 +1,51 @@ + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_search_equipment.xml b/app/src/main/res/layout/activity_search_equipment.xml index 45694fb..f637b70 100644 --- a/app/src/main/res/layout/activity_search_equipment.xml +++ b/app/src/main/res/layout/activity_search_equipment.xml @@ -1,5 +1,6 @@ + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_home.xml b/app/src/main/res/layout/fragment_home.xml index 154d157..e525b93 100644 --- a/app/src/main/res/layout/fragment_home.xml +++ b/app/src/main/res/layout/fragment_home.xml @@ -33,12 +33,16 @@ android:layout_marginHorizontal="@dimen/dp_5" android:src="@drawable/ic_search" /> - + android:textSize="@dimen/sp_14" /> + + diff --git a/app/src/main/java/com/casic/xz/meterage/base/BaseApplication.kt b/app/src/main/java/com/casic/xz/meterage/base/BaseApplication.kt index 14a604d..1684c23 100644 --- a/app/src/main/java/com/casic/xz/meterage/base/BaseApplication.kt +++ b/app/src/main/java/com/casic/xz/meterage/base/BaseApplication.kt @@ -2,6 +2,8 @@ import android.app.Application import android.content.Context +import com.casic.xz.meterage.greendao.DaoMaster +import com.casic.xz.meterage.greendao.DaoSession import com.pengxh.kt.lite.utils.SaveKeyValues import me.weishu.reflection.Reflection import kotlin.properties.Delegates @@ -12,12 +14,22 @@ private var application: BaseApplication by Delegates.notNull() fun get() = application + + private lateinit var daoSession: DaoSession } override fun onCreate() { super.onCreate() application = this SaveKeyValues.initSharedPreferences(this) + + val devOpenHelper = DaoMaster.DevOpenHelper(this, "Meterage.db", null) + val daoMaster = DaoMaster(devOpenHelper.writableDatabase) + daoSession = daoMaster.newSession() + } + + fun getDaoSession(): DaoSession { + return daoSession } //绕过Android 11以上反射限制 diff --git a/app/src/main/java/com/casic/xz/meterage/bean/SearchHistoryBean.java b/app/src/main/java/com/casic/xz/meterage/bean/SearchHistoryBean.java new file mode 100644 index 0000000..6a46a3a --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/bean/SearchHistoryBean.java @@ -0,0 +1,82 @@ +package com.casic.xz.meterage.bean; + +import org.greenrobot.greendao.annotation.Entity; +import org.greenrobot.greendao.annotation.Generated; +import org.greenrobot.greendao.annotation.Id; +import org.greenrobot.greendao.annotation.Unique; + +@Entity +public class SearchHistoryBean { + @Id(autoincrement = true) + private Long id;//主键自增 + + @Unique + private String uuid; + private String keywords;//查询条件-关键字 + private String searchType;//查询类型 + private String userId;//用户Id + private String searchTime;//查询的时间 + + @Generated(hash = 2130561778) + public SearchHistoryBean(Long id, String uuid, String keywords, + String searchType, String userId, String searchTime) { + this.id = id; + this.uuid = uuid; + this.keywords = keywords; + this.searchType = searchType; + this.userId = userId; + this.searchTime = searchTime; + } + + @Generated(hash = 1570282321) + public SearchHistoryBean() { + } + + public Long getId() { + return this.id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getUuid() { + return this.uuid; + } + + public void setUuid(String uuid) { + this.uuid = uuid; + } + + public String getKeywords() { + return this.keywords; + } + + public void setKeywords(String keywords) { + this.keywords = keywords; + } + + public String getSearchType() { + return this.searchType; + } + + public void setSearchType(String searchType) { + this.searchType = searchType; + } + + public String getUserId() { + return this.userId; + } + + public void setUserId(String userId) { + this.userId = userId; + } + + public String getSearchTime() { + return this.searchTime; + } + + public void setSearchTime(String searchTime) { + this.searchTime = searchTime; + } +} diff --git a/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt index 151f951..ae7f5e4 100644 --- a/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt +++ b/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt @@ -15,22 +15,20 @@ import com.casic.xz.meterage.extensions.showEmptyPage import com.casic.xz.meterage.model.NoticeListModel import com.casic.xz.meterage.model.RemindListModel -import com.casic.xz.meterage.model.UserInfoModel import com.casic.xz.meterage.utils.LoadingDialogHub import com.casic.xz.meterage.utils.LocaleConstant import com.casic.xz.meterage.utils.QrConfigCreator import com.casic.xz.meterage.view.home.* import com.casic.xz.meterage.view.notice.NoticeListActivity +import com.casic.xz.meterage.view.search.SearchAllActivity import com.casic.xz.meterage.vm.MeterageTrainViewModel import com.casic.xz.meterage.vm.NoticeViewModel -import com.casic.xz.meterage.vm.UserViewModel import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter import com.pengxh.kt.lite.adapter.ViewHolder import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.convertColor import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show -import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.utils.WeakReferenceHandler import com.pengxh.kt.lite.vm.LoadState import com.pengxh.kt.lite.widget.dialog.AlertControlDialog @@ -39,13 +37,12 @@ import kotlinx.android.synthetic.main.include_empty_view.* import java.util.* -class HomePageFragment : KotlinBaseFragment() { +class HomePageFragment(private val userId: String) : KotlinBaseFragment() { private val timer = object : Timer() {} private lateinit var weakReferenceHandler: WeakReferenceHandler private lateinit var meterageTrainViewModel: MeterageTrainViewModel private lateinit var noticeViewModel: NoticeViewModel - private lateinit var userData: UserInfoModel.DataModel private lateinit var remindAdapter: NormalRecyclerAdapter private var dataBeans: MutableList = ArrayList() private var noticeBeans: MutableList = ArrayList() @@ -170,14 +167,6 @@ true } - val userViewModel = ViewModelProvider(this)[UserViewModel::class.java] - userViewModel.getUserInfo(SaveKeyValues.getValue(LocaleConstant.ACCOUNT, "") as String) - userViewModel.userInfo.observe(this) { - if (it.code == 200) { - userData = it.data - } - } - meterageTrainViewModel = ViewModelProvider(this)[MeterageTrainViewModel::class.java] meterageTrainViewModel.signInResult.observe(this) { if (it.code == 200) { @@ -296,10 +285,14 @@ } override fun initEvent() { + searchBar.setOnClickListener { + requireContext().navigatePageTo() + } + scanCodeView.setOnClickListener { qrManager.startScan(requireActivity()) { result -> if (result.content.isDigitsOnly()) { - meterageTrainViewModel.signIn(userData.id, result.content) + meterageTrainViewModel.signIn(userId, result.content) } else { "签到二维码错误,请重新扫描".show(requireContext()) } diff --git a/app/src/main/java/com/casic/xz/meterage/greendao/DaoMaster.java b/app/src/main/java/com/casic/xz/meterage/greendao/DaoMaster.java new file mode 100644 index 0000000..d714ce2 --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/greendao/DaoMaster.java @@ -0,0 +1,96 @@ +package com.casic.xz.meterage.greendao; + +import android.content.Context; +import android.database.sqlite.SQLiteDatabase; +import android.database.sqlite.SQLiteDatabase.CursorFactory; +import android.util.Log; + +import org.greenrobot.greendao.AbstractDaoMaster; +import org.greenrobot.greendao.database.Database; +import org.greenrobot.greendao.database.DatabaseOpenHelper; +import org.greenrobot.greendao.database.StandardDatabase; +import org.greenrobot.greendao.identityscope.IdentityScopeType; + + +// THIS CODE IS GENERATED BY greenDAO, DO NOT EDIT. +/** + * Master of DAO (schema version 1): knows all DAOs. + */ +public class DaoMaster extends AbstractDaoMaster { + public static final int SCHEMA_VERSION = 1; + + /** Creates underlying database table using DAOs. */ + public static void createAllTables(Database db, boolean ifNotExists) { + SearchHistoryBeanDao.createTable(db, ifNotExists); + } + + /** Drops underlying database table using DAOs. */ + public static void dropAllTables(Database db, boolean ifExists) { + SearchHistoryBeanDao.dropTable(db, ifExists); + } + + /** + * WARNING: Drops all table on Upgrade! Use only during development. + * Convenience method using a {@link DevOpenHelper}. + */ + public static DaoSession newDevSession(Context context, String name) { + Database db = new DevOpenHelper(context, name).getWritableDb(); + DaoMaster daoMaster = new DaoMaster(db); + return daoMaster.newSession(); + } + + public DaoMaster(SQLiteDatabase db) { + this(new StandardDatabase(db)); + } + + public DaoMaster(Database db) { + super(db, SCHEMA_VERSION); + registerDaoClass(SearchHistoryBeanDao.class); + } + + public DaoSession newSession() { + return new DaoSession(db, IdentityScopeType.Session, daoConfigMap); + } + + public DaoSession newSession(IdentityScopeType type) { + return new DaoSession(db, type, daoConfigMap); + } + + /** + * Calls {@link #createAllTables(Database, boolean)} in {@link #onCreate(Database)} - + */ + public static abstract class OpenHelper extends DatabaseOpenHelper { + public OpenHelper(Context context, String name) { + super(context, name, SCHEMA_VERSION); + } + + public OpenHelper(Context context, String name, CursorFactory factory) { + super(context, name, factory, SCHEMA_VERSION); + } + + @Override + public void onCreate(Database db) { + Log.i("greenDAO", "Creating tables for schema version " + SCHEMA_VERSION); + createAllTables(db, false); + } + } + + /** WARNING: Drops all table on Upgrade! Use only during development. */ + public static class DevOpenHelper extends OpenHelper { + public DevOpenHelper(Context context, String name) { + super(context, name); + } + + public DevOpenHelper(Context context, String name, CursorFactory factory) { + super(context, name, factory); + } + + @Override + public void onUpgrade(Database db, int oldVersion, int newVersion) { + Log.i("greenDAO", "Upgrading schema from version " + oldVersion + " to " + newVersion + " by dropping all tables"); + dropAllTables(db, true); + onCreate(db); + } + } + +} diff --git a/app/src/main/java/com/casic/xz/meterage/greendao/DaoSession.java b/app/src/main/java/com/casic/xz/meterage/greendao/DaoSession.java new file mode 100644 index 0000000..0e80024 --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/greendao/DaoSession.java @@ -0,0 +1,46 @@ +package com.casic.xz.meterage.greendao; + +import com.casic.xz.meterage.bean.SearchHistoryBean; + +import org.greenrobot.greendao.AbstractDao; +import org.greenrobot.greendao.AbstractDaoSession; +import org.greenrobot.greendao.database.Database; +import org.greenrobot.greendao.identityscope.IdentityScopeType; +import org.greenrobot.greendao.internal.DaoConfig; + +import java.util.Map; + +// THIS CODE IS GENERATED BY greenDAO, DO NOT EDIT. + +/** + * {@inheritDoc} + * + * @see org.greenrobot.greendao.AbstractDaoSession + */ +public class DaoSession extends AbstractDaoSession { + + private final DaoConfig searchHistoryBeanDaoConfig; + + private final SearchHistoryBeanDao searchHistoryBeanDao; + + public DaoSession(Database db, IdentityScopeType type, Map>, DaoConfig> + daoConfigMap) { + super(db); + + searchHistoryBeanDaoConfig = daoConfigMap.get(SearchHistoryBeanDao.class).clone(); + searchHistoryBeanDaoConfig.initIdentityScope(type); + + searchHistoryBeanDao = new SearchHistoryBeanDao(searchHistoryBeanDaoConfig, this); + + registerDao(SearchHistoryBean.class, searchHistoryBeanDao); + } + + public void clear() { + searchHistoryBeanDaoConfig.clearIdentityScope(); + } + + public SearchHistoryBeanDao getSearchHistoryBeanDao() { + return searchHistoryBeanDao; + } + +} diff --git a/app/src/main/java/com/casic/xz/meterage/greendao/SearchHistoryBeanDao.java b/app/src/main/java/com/casic/xz/meterage/greendao/SearchHistoryBeanDao.java new file mode 100644 index 0000000..5923d02 --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/greendao/SearchHistoryBeanDao.java @@ -0,0 +1,185 @@ +package com.casic.xz.meterage.greendao; + +import android.database.Cursor; +import android.database.sqlite.SQLiteStatement; + +import com.casic.xz.meterage.bean.SearchHistoryBean; + +import org.greenrobot.greendao.AbstractDao; +import org.greenrobot.greendao.Property; +import org.greenrobot.greendao.database.Database; +import org.greenrobot.greendao.database.DatabaseStatement; +import org.greenrobot.greendao.internal.DaoConfig; + +// THIS CODE IS GENERATED BY greenDAO, DO NOT EDIT. +/** + * DAO for table "SEARCH_HISTORY_BEAN". +*/ +public class SearchHistoryBeanDao extends AbstractDao { + + public static final String TABLENAME = "SEARCH_HISTORY_BEAN"; + + /** + * Properties of entity SearchHistoryBean.
+ * Can be used for QueryBuilder and for referencing column names. + */ + public static class Properties { + public final static Property Id = new Property(0, Long.class, "id", true, "_id"); + public final static Property Uuid = new Property(1, String.class, "uuid", false, "UUID"); + public final static Property Keywords = new Property(2, String.class, "keywords", false, "KEYWORDS"); + public final static Property SearchType = new Property(3, String.class, "searchType", false, "SEARCH_TYPE"); + public final static Property UserId = new Property(4, String.class, "userId", false, "USER_ID"); + public final static Property SearchTime = new Property(5, String.class, "searchTime", false, "SEARCH_TIME"); + } + + + public SearchHistoryBeanDao(DaoConfig config) { + super(config); + } + + public SearchHistoryBeanDao(DaoConfig config, DaoSession daoSession) { + super(config, daoSession); + } + + /** Creates the underlying database table. */ + public static void createTable(Database db, boolean ifNotExists) { + String constraint = ifNotExists? "IF NOT EXISTS ": ""; + db.execSQL("CREATE TABLE " + constraint + "\"SEARCH_HISTORY_BEAN\" (" + // + "\"_id\" INTEGER PRIMARY KEY AUTOINCREMENT ," + // 0: id + "\"UUID\" TEXT UNIQUE ," + // 1: uuid + "\"KEYWORDS\" TEXT," + // 2: keywords + "\"SEARCH_TYPE\" TEXT," + // 3: searchType + "\"USER_ID\" TEXT," + // 4: userId + "\"SEARCH_TIME\" TEXT);"); // 5: searchTime + } + + /** Drops the underlying database table. */ + public static void dropTable(Database db, boolean ifExists) { + String sql = "DROP TABLE " + (ifExists ? "IF EXISTS " : "") + "\"SEARCH_HISTORY_BEAN\""; + db.execSQL(sql); + } + + @Override + protected final void bindValues(DatabaseStatement stmt, SearchHistoryBean entity) { + stmt.clearBindings(); + + Long id = entity.getId(); + if (id != null) { + stmt.bindLong(1, id); + } + + String uuid = entity.getUuid(); + if (uuid != null) { + stmt.bindString(2, uuid); + } + + String keywords = entity.getKeywords(); + if (keywords != null) { + stmt.bindString(3, keywords); + } + + String searchType = entity.getSearchType(); + if (searchType != null) { + stmt.bindString(4, searchType); + } + + String userId = entity.getUserId(); + if (userId != null) { + stmt.bindString(5, userId); + } + + String searchTime = entity.getSearchTime(); + if (searchTime != null) { + stmt.bindString(6, searchTime); + } + } + + @Override + protected final void bindValues(SQLiteStatement stmt, SearchHistoryBean entity) { + stmt.clearBindings(); + + Long id = entity.getId(); + if (id != null) { + stmt.bindLong(1, id); + } + + String uuid = entity.getUuid(); + if (uuid != null) { + stmt.bindString(2, uuid); + } + + String keywords = entity.getKeywords(); + if (keywords != null) { + stmt.bindString(3, keywords); + } + + String searchType = entity.getSearchType(); + if (searchType != null) { + stmt.bindString(4, searchType); + } + + String userId = entity.getUserId(); + if (userId != null) { + stmt.bindString(5, userId); + } + + String searchTime = entity.getSearchTime(); + if (searchTime != null) { + stmt.bindString(6, searchTime); + } + } + + @Override + public Long readKey(Cursor cursor, int offset) { + return cursor.isNull(offset + 0) ? null : cursor.getLong(offset + 0); + } + + @Override + public SearchHistoryBean readEntity(Cursor cursor, int offset) { + SearchHistoryBean entity = new SearchHistoryBean( // + cursor.isNull(offset + 0) ? null : cursor.getLong(offset + 0), // id + cursor.isNull(offset + 1) ? null : cursor.getString(offset + 1), // uuid + cursor.isNull(offset + 2) ? null : cursor.getString(offset + 2), // keywords + cursor.isNull(offset + 3) ? null : cursor.getString(offset + 3), // searchType + cursor.isNull(offset + 4) ? null : cursor.getString(offset + 4), // userId + cursor.isNull(offset + 5) ? null : cursor.getString(offset + 5) // searchTime + ); + return entity; + } + + @Override + public void readEntity(Cursor cursor, SearchHistoryBean entity, int offset) { + entity.setId(cursor.isNull(offset + 0) ? null : cursor.getLong(offset + 0)); + entity.setUuid(cursor.isNull(offset + 1) ? null : cursor.getString(offset + 1)); + entity.setKeywords(cursor.isNull(offset + 2) ? null : cursor.getString(offset + 2)); + entity.setSearchType(cursor.isNull(offset + 3) ? null : cursor.getString(offset + 3)); + entity.setUserId(cursor.isNull(offset + 4) ? null : cursor.getString(offset + 4)); + entity.setSearchTime(cursor.isNull(offset + 5) ? null : cursor.getString(offset + 5)); + } + + @Override + protected final Long updateKeyAfterInsert(SearchHistoryBean entity, long rowId) { + entity.setId(rowId); + return rowId; + } + + @Override + public Long getKey(SearchHistoryBean entity) { + if(entity != null) { + return entity.getId(); + } else { + return null; + } + } + + @Override + public boolean hasKey(SearchHistoryBean entity) { + return entity.getId() != null; + } + + @Override + protected final boolean isEntityUpdateable() { + return true; + } + +} diff --git a/app/src/main/java/com/casic/xz/meterage/utils/DataBaseManager.kt b/app/src/main/java/com/casic/xz/meterage/utils/DataBaseManager.kt new file mode 100644 index 0000000..52fe032 --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/utils/DataBaseManager.kt @@ -0,0 +1,45 @@ +package com.casic.xz.meterage.utils + +import com.casic.xz.meterage.base.BaseApplication +import com.casic.xz.meterage.bean.SearchHistoryBean +import com.casic.xz.meterage.greendao.SearchHistoryBeanDao +import com.pengxh.kt.lite.extensions.timestampToCompleteDate +import com.pengxh.kt.lite.utils.SaveKeyValues +import java.util.* + +class DataBaseManager private constructor() { + + companion object { + //Kotlin委托模式双重锁单例 + val get: DataBaseManager by lazy(mode = LazyThreadSafetyMode.SYNCHRONIZED) { + DataBaseManager() + } + } + + private val searchBeanDao by lazy { BaseApplication.get().getDaoSession().searchHistoryBeanDao } + private val userId by lazy { SaveKeyValues.getValue(LocaleConstant.USER_ID, "") } + + fun addSearchHistory(keywords: String, searchType: String) { + val bean = SearchHistoryBean() + bean.uuid = UUID.randomUUID().toString() + bean.keywords = keywords + bean.searchType = searchType + bean.userId = userId.toString() + bean.searchTime = System.currentTimeMillis().timestampToCompleteDate() + searchBeanDao.insert(bean) + } + + fun queryHistoryByType(searchType: String): MutableList { + return searchBeanDao.queryBuilder().where( + SearchHistoryBeanDao.Properties.UserId.eq(userId), + SearchHistoryBeanDao.Properties.SearchType.eq(searchType) + ).list() + } + + fun deleteHistoryByType(searchType: String) { + val list = queryHistoryByType(searchType) + list.forEach { + searchBeanDao.delete(it) + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/utils/LocaleConstant.kt b/app/src/main/java/com/casic/xz/meterage/utils/LocaleConstant.kt index cc2848b..2ea47a0 100644 --- a/app/src/main/java/com/casic/xz/meterage/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/xz/meterage/utils/LocaleConstant.kt @@ -62,4 +62,5 @@ const val File_SERVER_URL = "http://111.198.10.15:21408" const val ACCOUNT = "account" const val PASSWORD = "password" + const val USER_ID = "userId" } \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/utils/SearchType.kt b/app/src/main/java/com/casic/xz/meterage/utils/SearchType.kt new file mode 100644 index 0000000..5f5253e --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/utils/SearchType.kt @@ -0,0 +1,8 @@ +package com.casic.xz.meterage.utils + +object SearchType { + /** + * 搜索仪器设备 + * */ + const val Equipment = "0" +} diff --git a/app/src/main/java/com/casic/xz/meterage/view/MainActivity.kt b/app/src/main/java/com/casic/xz/meterage/view/MainActivity.kt index 28836e0..8fb0793 100644 --- a/app/src/main/java/com/casic/xz/meterage/view/MainActivity.kt +++ b/app/src/main/java/com/casic/xz/meterage/view/MainActivity.kt @@ -3,15 +3,19 @@ import android.view.KeyEvent import android.view.MenuItem import androidx.fragment.app.Fragment +import androidx.lifecycle.ViewModelProvider import androidx.viewpager.widget.ViewPager import com.casic.xz.meterage.R import com.casic.xz.meterage.adapter.ViewPagerAdapter import com.casic.xz.meterage.fragment.HomePageFragment import com.casic.xz.meterage.fragment.MinePageFragment import com.casic.xz.meterage.fragment.SamplePageFragment +import com.casic.xz.meterage.utils.LocaleConstant +import com.casic.xz.meterage.vm.UserViewModel import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.SaveKeyValues import kotlinx.android.synthetic.main.activity_main.* class MainActivity : KotlinBaseActivity() { @@ -20,53 +24,59 @@ private var fragmentPages: ArrayList = ArrayList() private var clickTime: Long = 0 - init { - fragmentPages.add(HomePageFragment()) - fragmentPages.add(SamplePageFragment()) - fragmentPages.add(MinePageFragment()) - } - override fun initData() { - bottomNavigation.itemIconTintList = null - bottomNavigation.setOnNavigationItemSelectedListener { menuItem -> - when (menuItem.itemId) { - R.id.nav_home -> { - mainViewPager.currentItem = 0 + val userViewModel = ViewModelProvider(this)[UserViewModel::class.java] + userViewModel.getUserInfo(SaveKeyValues.getValue(LocaleConstant.ACCOUNT, "") as String) + userViewModel.userInfo.observe(this) { + if (it.code == 200) { + SaveKeyValues.putValue(LocaleConstant.USER_ID, it.data.id) + + fragmentPages.add(HomePageFragment(it.data.id)) + fragmentPages.add(SamplePageFragment()) + fragmentPages.add(MinePageFragment()) + + bottomNavigation.itemIconTintList = null + bottomNavigation.setOnNavigationItemSelectedListener { menuItem -> + when (menuItem.itemId) { + R.id.nav_home -> { + mainViewPager.currentItem = 0 + } + R.id.nav_sample -> { + mainViewPager.currentItem = 1 + } + R.id.nav_mine -> { + mainViewPager.currentItem = 2 + } + } + false } - R.id.nav_sample -> { - mainViewPager.currentItem = 1 - } - R.id.nav_mine -> { - mainViewPager.currentItem = 2 - } + mainViewPager.adapter = ViewPagerAdapter(fragmentPages, supportFragmentManager) + mainViewPager.offscreenPageLimit = fragmentPages.size //缓存页数 + mainViewPager.addOnPageChangeListener(object : ViewPager.OnPageChangeListener { + override fun onPageScrollStateChanged(state: Int) { + + } + + override fun onPageScrolled( + position: Int, + positionOffset: Float, + positionOffsetPixels: Int + ) { + + } + + override fun onPageSelected(position: Int) { + if (menuItem != null) { + menuItem!!.isChecked = false + } else { + bottomNavigation.menu.getItem(0).isChecked = false + } + menuItem = bottomNavigation.menu.getItem(position) + menuItem!!.isChecked = true + } + }) } - false } - mainViewPager.adapter = ViewPagerAdapter(fragmentPages, supportFragmentManager) - mainViewPager.offscreenPageLimit = fragmentPages.size //缓存页数 - mainViewPager.addOnPageChangeListener(object : ViewPager.OnPageChangeListener { - override fun onPageScrollStateChanged(state: Int) { - - } - - override fun onPageScrolled( - position: Int, - positionOffset: Float, - positionOffsetPixels: Int - ) { - - } - - override fun onPageSelected(position: Int) { - if (menuItem != null) { - menuItem!!.isChecked = false - } else { - bottomNavigation.menu.getItem(0).isChecked = false - } - menuItem = bottomNavigation.menu.getItem(position) - menuItem!!.isChecked = true - } - }) } override fun initEvent() { diff --git a/app/src/main/java/com/casic/xz/meterage/view/search/SearchAllActivity.kt b/app/src/main/java/com/casic/xz/meterage/view/search/SearchAllActivity.kt new file mode 100644 index 0000000..ecc8fd7 --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/view/search/SearchAllActivity.kt @@ -0,0 +1,40 @@ +package com.casic.xz.meterage.view.search + +import com.casic.xz.meterage.R +import com.casic.xz.meterage.extensions.initLayoutImmersionBar +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.navigatePageTo +import kotlinx.android.synthetic.main.activity_search_all.* +import kotlinx.android.synthetic.main.include_search_input_title.* + +class SearchAllActivity : KotlinBaseActivity() { + + override fun initData() { + + } + + override fun initEvent() { + leftBackView.setOnClickListener { finish() } + searchTextView.setOnClickListener { + navigatePageTo(inputView.text.toString()) + } + } + + override fun initLayoutView(): Int = R.layout.activity_search_all + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + initLayoutImmersionBar(rootView) + inputView.hint = "查询样品、业务" + } + + override fun onResume() { + super.onResume() + //TODO 流式布局显示查询记录Tag? + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/view/search/SearchAllResultActivity.kt b/app/src/main/java/com/casic/xz/meterage/view/search/SearchAllResultActivity.kt new file mode 100644 index 0000000..adbb570 --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/view/search/SearchAllResultActivity.kt @@ -0,0 +1,34 @@ +package com.casic.xz.meterage.view.search + +import com.casic.xz.meterage.R +import com.casic.xz.meterage.extensions.initLayoutImmersionBar +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.utils.Constant +import kotlinx.android.synthetic.main.activity_search_all_reasult.* +import kotlinx.android.synthetic.main.include_search_title.* + +class SearchAllResultActivity : KotlinBaseActivity() { + + private lateinit var param: String + + override fun initData() { + param = intent.getStringExtra(Constant.INTENT_PARAM)!! + } + + override fun initEvent() { + leftBackView.setOnClickListener { finish() } + } + + override fun initLayoutView(): Int = R.layout.activity_search_all_reasult + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + initLayoutImmersionBar(rootView) + titleView.text = "查询结果" + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/view/search/SearchEquipmentActivity.kt b/app/src/main/java/com/casic/xz/meterage/view/search/SearchEquipmentActivity.kt index f5c98d6..3551790 100644 --- a/app/src/main/java/com/casic/xz/meterage/view/search/SearchEquipmentActivity.kt +++ b/app/src/main/java/com/casic/xz/meterage/view/search/SearchEquipmentActivity.kt @@ -1,27 +1,98 @@ package com.casic.xz.meterage.view.search import com.casic.xz.meterage.R +import com.casic.xz.meterage.bean.SearchHistoryBean import com.casic.xz.meterage.extensions.initLayoutImmersionBar +import com.casic.xz.meterage.utils.DataBaseManager +import com.casic.xz.meterage.utils.SearchType import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter +import com.pengxh.kt.lite.adapter.ViewHolder import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.utils.WeakReferenceHandler +import com.pengxh.kt.lite.widget.dialog.AlertControlDialog import kotlinx.android.synthetic.main.activity_search_equipment.* import kotlinx.android.synthetic.main.include_search_input_title.* + /** * 搜索仪器设备 * */ class SearchEquipmentActivity : KotlinBaseActivity() { - override fun initData() { + private lateinit var weakReferenceHandler: WeakReferenceHandler + private lateinit var historyAdapter: NormalRecyclerAdapter + private var dataBeans: MutableList = ArrayList() + private var isRefresh = false + override fun initData() { + weakReferenceHandler = WeakReferenceHandler { + if (it.what == 2023031001) { + if (isRefresh) { + historyAdapter.notifyDataSetChanged() + } else { + historyAdapter = object : + NormalRecyclerAdapter( + R.layout.item_search_rv_l, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, position: Int, item: SearchHistoryBean + ) { + viewHolder.setText(R.id.searchTagView, item.keywords) + } + } + historyRecyclerView.adapter = historyAdapter + historyAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked(position: Int, t: SearchHistoryBean) { + navigatePageTo(t.keywords) + } + }) + } + } + true + } + } + + override fun onResume() { + super.onResume() + dataBeans = DataBaseManager.get.queryHistoryByType(SearchType.Equipment) + weakReferenceHandler.sendEmptyMessage(2023031001) } override fun initEvent() { leftBackView.setOnClickListener { finish() } searchTextView.setOnClickListener { + if (!inputView.text.isNullOrBlank()) { + DataBaseManager.get.addSearchHistory( + inputView.text.toString(), SearchType.Equipment + ) + } + navigatePageTo(inputView.text.toString()) } + + deleteHistoryView.setOnClickListener { + AlertControlDialog.Builder() + .setContext(this) + .setTitle("提示") + .setMessage("确定将所有搜索记录删除?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + + } + + override fun onConfirmClick() { + DataBaseManager.get.deleteHistoryByType(SearchType.Equipment) + dataBeans.clear() + historyAdapter.notifyDataSetChanged() + } + }).build().show() + } } override fun initLayoutView(): Int = R.layout.activity_search_equipment @@ -35,9 +106,4 @@ initLayoutImmersionBar(rootView) inputView.hint = "查询设备名称、编号" } - - override fun onResume() { - super.onResume() - //TODO 流式布局显示查询记录Tag? - } } \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_delete.xml b/app/src/main/res/drawable/ic_delete.xml new file mode 100644 index 0000000..1810342 --- /dev/null +++ b/app/src/main/res/drawable/ic_delete.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/layout/activity_search_all.xml b/app/src/main/res/layout/activity_search_all.xml new file mode 100644 index 0000000..45694fb --- /dev/null +++ b/app/src/main/res/layout/activity_search_all.xml @@ -0,0 +1,17 @@ + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_search_all_reasult.xml b/app/src/main/res/layout/activity_search_all_reasult.xml new file mode 100644 index 0000000..7e90433 --- /dev/null +++ b/app/src/main/res/layout/activity_search_all_reasult.xml @@ -0,0 +1,51 @@ + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_search_equipment.xml b/app/src/main/res/layout/activity_search_equipment.xml index 45694fb..f637b70 100644 --- a/app/src/main/res/layout/activity_search_equipment.xml +++ b/app/src/main/res/layout/activity_search_equipment.xml @@ -1,5 +1,6 @@ + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_home.xml b/app/src/main/res/layout/fragment_home.xml index 154d157..e525b93 100644 --- a/app/src/main/res/layout/fragment_home.xml +++ b/app/src/main/res/layout/fragment_home.xml @@ -33,12 +33,16 @@ android:layout_marginHorizontal="@dimen/dp_5" android:src="@drawable/ic_search" /> - + android:textSize="@dimen/sp_14" /> + diff --git a/app/build.gradle b/app/build.gradle index 298f687..e142ec1 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -3,6 +3,7 @@ apply plugin: 'com.android.application' apply plugin: 'kotlin-android' apply plugin: 'kotlin-android-extensions' +apply plugin: 'org.greenrobot.greendao' android { signingConfigs { @@ -57,6 +58,12 @@ outputFileName = "XZJL_" + getBuildDate() + "_Beta.apk" } } + + greendao { + schemaVersion 1//数据库版本号 + targetGenDir 'src/main/java'//设置DaoMaster、DaoSession、Dao目录 + daoPackage 'com.casic.xz.meterage.greendao'//设置DaoMaster、DaoSession、Dao包名 + } } static def getBuildDate() { @@ -67,7 +74,7 @@ dependencies { //基础依赖库 implementation 'com.github.AndroidCoderPeng:Kotlin-lite-lib:1.0.4' - implementation 'androidx.appcompat:appcompat:1.5.1' + implementation 'androidx.appcompat:appcompat:1.6.1' implementation 'androidx.core:core-ktx:1.9.0' //Google官方授权框架 implementation 'pub.devrel:easypermissions:3.0.0' @@ -113,4 +120,6 @@ implementation 'com.github.tiann:FreeReflection:3.1.0' //单项/数字、二三级联动、日期/时间等滚轮选择器 implementation 'com.github.gzu-liyujiang.AndroidPicker:WheelPicker:4.1.8' + //数据库框架 + implementation 'org.greenrobot:greendao:3.3.0' } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 972eff9..5b6f9b2 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -69,6 +69,8 @@ + + diff --git a/app/src/main/java/com/casic/xz/meterage/base/BaseApplication.kt b/app/src/main/java/com/casic/xz/meterage/base/BaseApplication.kt index 14a604d..1684c23 100644 --- a/app/src/main/java/com/casic/xz/meterage/base/BaseApplication.kt +++ b/app/src/main/java/com/casic/xz/meterage/base/BaseApplication.kt @@ -2,6 +2,8 @@ import android.app.Application import android.content.Context +import com.casic.xz.meterage.greendao.DaoMaster +import com.casic.xz.meterage.greendao.DaoSession import com.pengxh.kt.lite.utils.SaveKeyValues import me.weishu.reflection.Reflection import kotlin.properties.Delegates @@ -12,12 +14,22 @@ private var application: BaseApplication by Delegates.notNull() fun get() = application + + private lateinit var daoSession: DaoSession } override fun onCreate() { super.onCreate() application = this SaveKeyValues.initSharedPreferences(this) + + val devOpenHelper = DaoMaster.DevOpenHelper(this, "Meterage.db", null) + val daoMaster = DaoMaster(devOpenHelper.writableDatabase) + daoSession = daoMaster.newSession() + } + + fun getDaoSession(): DaoSession { + return daoSession } //绕过Android 11以上反射限制 diff --git a/app/src/main/java/com/casic/xz/meterage/bean/SearchHistoryBean.java b/app/src/main/java/com/casic/xz/meterage/bean/SearchHistoryBean.java new file mode 100644 index 0000000..6a46a3a --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/bean/SearchHistoryBean.java @@ -0,0 +1,82 @@ +package com.casic.xz.meterage.bean; + +import org.greenrobot.greendao.annotation.Entity; +import org.greenrobot.greendao.annotation.Generated; +import org.greenrobot.greendao.annotation.Id; +import org.greenrobot.greendao.annotation.Unique; + +@Entity +public class SearchHistoryBean { + @Id(autoincrement = true) + private Long id;//主键自增 + + @Unique + private String uuid; + private String keywords;//查询条件-关键字 + private String searchType;//查询类型 + private String userId;//用户Id + private String searchTime;//查询的时间 + + @Generated(hash = 2130561778) + public SearchHistoryBean(Long id, String uuid, String keywords, + String searchType, String userId, String searchTime) { + this.id = id; + this.uuid = uuid; + this.keywords = keywords; + this.searchType = searchType; + this.userId = userId; + this.searchTime = searchTime; + } + + @Generated(hash = 1570282321) + public SearchHistoryBean() { + } + + public Long getId() { + return this.id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getUuid() { + return this.uuid; + } + + public void setUuid(String uuid) { + this.uuid = uuid; + } + + public String getKeywords() { + return this.keywords; + } + + public void setKeywords(String keywords) { + this.keywords = keywords; + } + + public String getSearchType() { + return this.searchType; + } + + public void setSearchType(String searchType) { + this.searchType = searchType; + } + + public String getUserId() { + return this.userId; + } + + public void setUserId(String userId) { + this.userId = userId; + } + + public String getSearchTime() { + return this.searchTime; + } + + public void setSearchTime(String searchTime) { + this.searchTime = searchTime; + } +} diff --git a/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt index 151f951..ae7f5e4 100644 --- a/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt +++ b/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt @@ -15,22 +15,20 @@ import com.casic.xz.meterage.extensions.showEmptyPage import com.casic.xz.meterage.model.NoticeListModel import com.casic.xz.meterage.model.RemindListModel -import com.casic.xz.meterage.model.UserInfoModel import com.casic.xz.meterage.utils.LoadingDialogHub import com.casic.xz.meterage.utils.LocaleConstant import com.casic.xz.meterage.utils.QrConfigCreator import com.casic.xz.meterage.view.home.* import com.casic.xz.meterage.view.notice.NoticeListActivity +import com.casic.xz.meterage.view.search.SearchAllActivity import com.casic.xz.meterage.vm.MeterageTrainViewModel import com.casic.xz.meterage.vm.NoticeViewModel -import com.casic.xz.meterage.vm.UserViewModel import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter import com.pengxh.kt.lite.adapter.ViewHolder import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.convertColor import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show -import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.utils.WeakReferenceHandler import com.pengxh.kt.lite.vm.LoadState import com.pengxh.kt.lite.widget.dialog.AlertControlDialog @@ -39,13 +37,12 @@ import kotlinx.android.synthetic.main.include_empty_view.* import java.util.* -class HomePageFragment : KotlinBaseFragment() { +class HomePageFragment(private val userId: String) : KotlinBaseFragment() { private val timer = object : Timer() {} private lateinit var weakReferenceHandler: WeakReferenceHandler private lateinit var meterageTrainViewModel: MeterageTrainViewModel private lateinit var noticeViewModel: NoticeViewModel - private lateinit var userData: UserInfoModel.DataModel private lateinit var remindAdapter: NormalRecyclerAdapter private var dataBeans: MutableList = ArrayList() private var noticeBeans: MutableList = ArrayList() @@ -170,14 +167,6 @@ true } - val userViewModel = ViewModelProvider(this)[UserViewModel::class.java] - userViewModel.getUserInfo(SaveKeyValues.getValue(LocaleConstant.ACCOUNT, "") as String) - userViewModel.userInfo.observe(this) { - if (it.code == 200) { - userData = it.data - } - } - meterageTrainViewModel = ViewModelProvider(this)[MeterageTrainViewModel::class.java] meterageTrainViewModel.signInResult.observe(this) { if (it.code == 200) { @@ -296,10 +285,14 @@ } override fun initEvent() { + searchBar.setOnClickListener { + requireContext().navigatePageTo() + } + scanCodeView.setOnClickListener { qrManager.startScan(requireActivity()) { result -> if (result.content.isDigitsOnly()) { - meterageTrainViewModel.signIn(userData.id, result.content) + meterageTrainViewModel.signIn(userId, result.content) } else { "签到二维码错误,请重新扫描".show(requireContext()) } diff --git a/app/src/main/java/com/casic/xz/meterage/greendao/DaoMaster.java b/app/src/main/java/com/casic/xz/meterage/greendao/DaoMaster.java new file mode 100644 index 0000000..d714ce2 --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/greendao/DaoMaster.java @@ -0,0 +1,96 @@ +package com.casic.xz.meterage.greendao; + +import android.content.Context; +import android.database.sqlite.SQLiteDatabase; +import android.database.sqlite.SQLiteDatabase.CursorFactory; +import android.util.Log; + +import org.greenrobot.greendao.AbstractDaoMaster; +import org.greenrobot.greendao.database.Database; +import org.greenrobot.greendao.database.DatabaseOpenHelper; +import org.greenrobot.greendao.database.StandardDatabase; +import org.greenrobot.greendao.identityscope.IdentityScopeType; + + +// THIS CODE IS GENERATED BY greenDAO, DO NOT EDIT. +/** + * Master of DAO (schema version 1): knows all DAOs. + */ +public class DaoMaster extends AbstractDaoMaster { + public static final int SCHEMA_VERSION = 1; + + /** Creates underlying database table using DAOs. */ + public static void createAllTables(Database db, boolean ifNotExists) { + SearchHistoryBeanDao.createTable(db, ifNotExists); + } + + /** Drops underlying database table using DAOs. */ + public static void dropAllTables(Database db, boolean ifExists) { + SearchHistoryBeanDao.dropTable(db, ifExists); + } + + /** + * WARNING: Drops all table on Upgrade! Use only during development. + * Convenience method using a {@link DevOpenHelper}. + */ + public static DaoSession newDevSession(Context context, String name) { + Database db = new DevOpenHelper(context, name).getWritableDb(); + DaoMaster daoMaster = new DaoMaster(db); + return daoMaster.newSession(); + } + + public DaoMaster(SQLiteDatabase db) { + this(new StandardDatabase(db)); + } + + public DaoMaster(Database db) { + super(db, SCHEMA_VERSION); + registerDaoClass(SearchHistoryBeanDao.class); + } + + public DaoSession newSession() { + return new DaoSession(db, IdentityScopeType.Session, daoConfigMap); + } + + public DaoSession newSession(IdentityScopeType type) { + return new DaoSession(db, type, daoConfigMap); + } + + /** + * Calls {@link #createAllTables(Database, boolean)} in {@link #onCreate(Database)} - + */ + public static abstract class OpenHelper extends DatabaseOpenHelper { + public OpenHelper(Context context, String name) { + super(context, name, SCHEMA_VERSION); + } + + public OpenHelper(Context context, String name, CursorFactory factory) { + super(context, name, factory, SCHEMA_VERSION); + } + + @Override + public void onCreate(Database db) { + Log.i("greenDAO", "Creating tables for schema version " + SCHEMA_VERSION); + createAllTables(db, false); + } + } + + /** WARNING: Drops all table on Upgrade! Use only during development. */ + public static class DevOpenHelper extends OpenHelper { + public DevOpenHelper(Context context, String name) { + super(context, name); + } + + public DevOpenHelper(Context context, String name, CursorFactory factory) { + super(context, name, factory); + } + + @Override + public void onUpgrade(Database db, int oldVersion, int newVersion) { + Log.i("greenDAO", "Upgrading schema from version " + oldVersion + " to " + newVersion + " by dropping all tables"); + dropAllTables(db, true); + onCreate(db); + } + } + +} diff --git a/app/src/main/java/com/casic/xz/meterage/greendao/DaoSession.java b/app/src/main/java/com/casic/xz/meterage/greendao/DaoSession.java new file mode 100644 index 0000000..0e80024 --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/greendao/DaoSession.java @@ -0,0 +1,46 @@ +package com.casic.xz.meterage.greendao; + +import com.casic.xz.meterage.bean.SearchHistoryBean; + +import org.greenrobot.greendao.AbstractDao; +import org.greenrobot.greendao.AbstractDaoSession; +import org.greenrobot.greendao.database.Database; +import org.greenrobot.greendao.identityscope.IdentityScopeType; +import org.greenrobot.greendao.internal.DaoConfig; + +import java.util.Map; + +// THIS CODE IS GENERATED BY greenDAO, DO NOT EDIT. + +/** + * {@inheritDoc} + * + * @see org.greenrobot.greendao.AbstractDaoSession + */ +public class DaoSession extends AbstractDaoSession { + + private final DaoConfig searchHistoryBeanDaoConfig; + + private final SearchHistoryBeanDao searchHistoryBeanDao; + + public DaoSession(Database db, IdentityScopeType type, Map>, DaoConfig> + daoConfigMap) { + super(db); + + searchHistoryBeanDaoConfig = daoConfigMap.get(SearchHistoryBeanDao.class).clone(); + searchHistoryBeanDaoConfig.initIdentityScope(type); + + searchHistoryBeanDao = new SearchHistoryBeanDao(searchHistoryBeanDaoConfig, this); + + registerDao(SearchHistoryBean.class, searchHistoryBeanDao); + } + + public void clear() { + searchHistoryBeanDaoConfig.clearIdentityScope(); + } + + public SearchHistoryBeanDao getSearchHistoryBeanDao() { + return searchHistoryBeanDao; + } + +} diff --git a/app/src/main/java/com/casic/xz/meterage/greendao/SearchHistoryBeanDao.java b/app/src/main/java/com/casic/xz/meterage/greendao/SearchHistoryBeanDao.java new file mode 100644 index 0000000..5923d02 --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/greendao/SearchHistoryBeanDao.java @@ -0,0 +1,185 @@ +package com.casic.xz.meterage.greendao; + +import android.database.Cursor; +import android.database.sqlite.SQLiteStatement; + +import com.casic.xz.meterage.bean.SearchHistoryBean; + +import org.greenrobot.greendao.AbstractDao; +import org.greenrobot.greendao.Property; +import org.greenrobot.greendao.database.Database; +import org.greenrobot.greendao.database.DatabaseStatement; +import org.greenrobot.greendao.internal.DaoConfig; + +// THIS CODE IS GENERATED BY greenDAO, DO NOT EDIT. +/** + * DAO for table "SEARCH_HISTORY_BEAN". +*/ +public class SearchHistoryBeanDao extends AbstractDao { + + public static final String TABLENAME = "SEARCH_HISTORY_BEAN"; + + /** + * Properties of entity SearchHistoryBean.
+ * Can be used for QueryBuilder and for referencing column names. + */ + public static class Properties { + public final static Property Id = new Property(0, Long.class, "id", true, "_id"); + public final static Property Uuid = new Property(1, String.class, "uuid", false, "UUID"); + public final static Property Keywords = new Property(2, String.class, "keywords", false, "KEYWORDS"); + public final static Property SearchType = new Property(3, String.class, "searchType", false, "SEARCH_TYPE"); + public final static Property UserId = new Property(4, String.class, "userId", false, "USER_ID"); + public final static Property SearchTime = new Property(5, String.class, "searchTime", false, "SEARCH_TIME"); + } + + + public SearchHistoryBeanDao(DaoConfig config) { + super(config); + } + + public SearchHistoryBeanDao(DaoConfig config, DaoSession daoSession) { + super(config, daoSession); + } + + /** Creates the underlying database table. */ + public static void createTable(Database db, boolean ifNotExists) { + String constraint = ifNotExists? "IF NOT EXISTS ": ""; + db.execSQL("CREATE TABLE " + constraint + "\"SEARCH_HISTORY_BEAN\" (" + // + "\"_id\" INTEGER PRIMARY KEY AUTOINCREMENT ," + // 0: id + "\"UUID\" TEXT UNIQUE ," + // 1: uuid + "\"KEYWORDS\" TEXT," + // 2: keywords + "\"SEARCH_TYPE\" TEXT," + // 3: searchType + "\"USER_ID\" TEXT," + // 4: userId + "\"SEARCH_TIME\" TEXT);"); // 5: searchTime + } + + /** Drops the underlying database table. */ + public static void dropTable(Database db, boolean ifExists) { + String sql = "DROP TABLE " + (ifExists ? "IF EXISTS " : "") + "\"SEARCH_HISTORY_BEAN\""; + db.execSQL(sql); + } + + @Override + protected final void bindValues(DatabaseStatement stmt, SearchHistoryBean entity) { + stmt.clearBindings(); + + Long id = entity.getId(); + if (id != null) { + stmt.bindLong(1, id); + } + + String uuid = entity.getUuid(); + if (uuid != null) { + stmt.bindString(2, uuid); + } + + String keywords = entity.getKeywords(); + if (keywords != null) { + stmt.bindString(3, keywords); + } + + String searchType = entity.getSearchType(); + if (searchType != null) { + stmt.bindString(4, searchType); + } + + String userId = entity.getUserId(); + if (userId != null) { + stmt.bindString(5, userId); + } + + String searchTime = entity.getSearchTime(); + if (searchTime != null) { + stmt.bindString(6, searchTime); + } + } + + @Override + protected final void bindValues(SQLiteStatement stmt, SearchHistoryBean entity) { + stmt.clearBindings(); + + Long id = entity.getId(); + if (id != null) { + stmt.bindLong(1, id); + } + + String uuid = entity.getUuid(); + if (uuid != null) { + stmt.bindString(2, uuid); + } + + String keywords = entity.getKeywords(); + if (keywords != null) { + stmt.bindString(3, keywords); + } + + String searchType = entity.getSearchType(); + if (searchType != null) { + stmt.bindString(4, searchType); + } + + String userId = entity.getUserId(); + if (userId != null) { + stmt.bindString(5, userId); + } + + String searchTime = entity.getSearchTime(); + if (searchTime != null) { + stmt.bindString(6, searchTime); + } + } + + @Override + public Long readKey(Cursor cursor, int offset) { + return cursor.isNull(offset + 0) ? null : cursor.getLong(offset + 0); + } + + @Override + public SearchHistoryBean readEntity(Cursor cursor, int offset) { + SearchHistoryBean entity = new SearchHistoryBean( // + cursor.isNull(offset + 0) ? null : cursor.getLong(offset + 0), // id + cursor.isNull(offset + 1) ? null : cursor.getString(offset + 1), // uuid + cursor.isNull(offset + 2) ? null : cursor.getString(offset + 2), // keywords + cursor.isNull(offset + 3) ? null : cursor.getString(offset + 3), // searchType + cursor.isNull(offset + 4) ? null : cursor.getString(offset + 4), // userId + cursor.isNull(offset + 5) ? null : cursor.getString(offset + 5) // searchTime + ); + return entity; + } + + @Override + public void readEntity(Cursor cursor, SearchHistoryBean entity, int offset) { + entity.setId(cursor.isNull(offset + 0) ? null : cursor.getLong(offset + 0)); + entity.setUuid(cursor.isNull(offset + 1) ? null : cursor.getString(offset + 1)); + entity.setKeywords(cursor.isNull(offset + 2) ? null : cursor.getString(offset + 2)); + entity.setSearchType(cursor.isNull(offset + 3) ? null : cursor.getString(offset + 3)); + entity.setUserId(cursor.isNull(offset + 4) ? null : cursor.getString(offset + 4)); + entity.setSearchTime(cursor.isNull(offset + 5) ? null : cursor.getString(offset + 5)); + } + + @Override + protected final Long updateKeyAfterInsert(SearchHistoryBean entity, long rowId) { + entity.setId(rowId); + return rowId; + } + + @Override + public Long getKey(SearchHistoryBean entity) { + if(entity != null) { + return entity.getId(); + } else { + return null; + } + } + + @Override + public boolean hasKey(SearchHistoryBean entity) { + return entity.getId() != null; + } + + @Override + protected final boolean isEntityUpdateable() { + return true; + } + +} diff --git a/app/src/main/java/com/casic/xz/meterage/utils/DataBaseManager.kt b/app/src/main/java/com/casic/xz/meterage/utils/DataBaseManager.kt new file mode 100644 index 0000000..52fe032 --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/utils/DataBaseManager.kt @@ -0,0 +1,45 @@ +package com.casic.xz.meterage.utils + +import com.casic.xz.meterage.base.BaseApplication +import com.casic.xz.meterage.bean.SearchHistoryBean +import com.casic.xz.meterage.greendao.SearchHistoryBeanDao +import com.pengxh.kt.lite.extensions.timestampToCompleteDate +import com.pengxh.kt.lite.utils.SaveKeyValues +import java.util.* + +class DataBaseManager private constructor() { + + companion object { + //Kotlin委托模式双重锁单例 + val get: DataBaseManager by lazy(mode = LazyThreadSafetyMode.SYNCHRONIZED) { + DataBaseManager() + } + } + + private val searchBeanDao by lazy { BaseApplication.get().getDaoSession().searchHistoryBeanDao } + private val userId by lazy { SaveKeyValues.getValue(LocaleConstant.USER_ID, "") } + + fun addSearchHistory(keywords: String, searchType: String) { + val bean = SearchHistoryBean() + bean.uuid = UUID.randomUUID().toString() + bean.keywords = keywords + bean.searchType = searchType + bean.userId = userId.toString() + bean.searchTime = System.currentTimeMillis().timestampToCompleteDate() + searchBeanDao.insert(bean) + } + + fun queryHistoryByType(searchType: String): MutableList { + return searchBeanDao.queryBuilder().where( + SearchHistoryBeanDao.Properties.UserId.eq(userId), + SearchHistoryBeanDao.Properties.SearchType.eq(searchType) + ).list() + } + + fun deleteHistoryByType(searchType: String) { + val list = queryHistoryByType(searchType) + list.forEach { + searchBeanDao.delete(it) + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/utils/LocaleConstant.kt b/app/src/main/java/com/casic/xz/meterage/utils/LocaleConstant.kt index cc2848b..2ea47a0 100644 --- a/app/src/main/java/com/casic/xz/meterage/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/xz/meterage/utils/LocaleConstant.kt @@ -62,4 +62,5 @@ const val File_SERVER_URL = "http://111.198.10.15:21408" const val ACCOUNT = "account" const val PASSWORD = "password" + const val USER_ID = "userId" } \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/utils/SearchType.kt b/app/src/main/java/com/casic/xz/meterage/utils/SearchType.kt new file mode 100644 index 0000000..5f5253e --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/utils/SearchType.kt @@ -0,0 +1,8 @@ +package com.casic.xz.meterage.utils + +object SearchType { + /** + * 搜索仪器设备 + * */ + const val Equipment = "0" +} diff --git a/app/src/main/java/com/casic/xz/meterage/view/MainActivity.kt b/app/src/main/java/com/casic/xz/meterage/view/MainActivity.kt index 28836e0..8fb0793 100644 --- a/app/src/main/java/com/casic/xz/meterage/view/MainActivity.kt +++ b/app/src/main/java/com/casic/xz/meterage/view/MainActivity.kt @@ -3,15 +3,19 @@ import android.view.KeyEvent import android.view.MenuItem import androidx.fragment.app.Fragment +import androidx.lifecycle.ViewModelProvider import androidx.viewpager.widget.ViewPager import com.casic.xz.meterage.R import com.casic.xz.meterage.adapter.ViewPagerAdapter import com.casic.xz.meterage.fragment.HomePageFragment import com.casic.xz.meterage.fragment.MinePageFragment import com.casic.xz.meterage.fragment.SamplePageFragment +import com.casic.xz.meterage.utils.LocaleConstant +import com.casic.xz.meterage.vm.UserViewModel import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.SaveKeyValues import kotlinx.android.synthetic.main.activity_main.* class MainActivity : KotlinBaseActivity() { @@ -20,53 +24,59 @@ private var fragmentPages: ArrayList = ArrayList() private var clickTime: Long = 0 - init { - fragmentPages.add(HomePageFragment()) - fragmentPages.add(SamplePageFragment()) - fragmentPages.add(MinePageFragment()) - } - override fun initData() { - bottomNavigation.itemIconTintList = null - bottomNavigation.setOnNavigationItemSelectedListener { menuItem -> - when (menuItem.itemId) { - R.id.nav_home -> { - mainViewPager.currentItem = 0 + val userViewModel = ViewModelProvider(this)[UserViewModel::class.java] + userViewModel.getUserInfo(SaveKeyValues.getValue(LocaleConstant.ACCOUNT, "") as String) + userViewModel.userInfo.observe(this) { + if (it.code == 200) { + SaveKeyValues.putValue(LocaleConstant.USER_ID, it.data.id) + + fragmentPages.add(HomePageFragment(it.data.id)) + fragmentPages.add(SamplePageFragment()) + fragmentPages.add(MinePageFragment()) + + bottomNavigation.itemIconTintList = null + bottomNavigation.setOnNavigationItemSelectedListener { menuItem -> + when (menuItem.itemId) { + R.id.nav_home -> { + mainViewPager.currentItem = 0 + } + R.id.nav_sample -> { + mainViewPager.currentItem = 1 + } + R.id.nav_mine -> { + mainViewPager.currentItem = 2 + } + } + false } - R.id.nav_sample -> { - mainViewPager.currentItem = 1 - } - R.id.nav_mine -> { - mainViewPager.currentItem = 2 - } + mainViewPager.adapter = ViewPagerAdapter(fragmentPages, supportFragmentManager) + mainViewPager.offscreenPageLimit = fragmentPages.size //缓存页数 + mainViewPager.addOnPageChangeListener(object : ViewPager.OnPageChangeListener { + override fun onPageScrollStateChanged(state: Int) { + + } + + override fun onPageScrolled( + position: Int, + positionOffset: Float, + positionOffsetPixels: Int + ) { + + } + + override fun onPageSelected(position: Int) { + if (menuItem != null) { + menuItem!!.isChecked = false + } else { + bottomNavigation.menu.getItem(0).isChecked = false + } + menuItem = bottomNavigation.menu.getItem(position) + menuItem!!.isChecked = true + } + }) } - false } - mainViewPager.adapter = ViewPagerAdapter(fragmentPages, supportFragmentManager) - mainViewPager.offscreenPageLimit = fragmentPages.size //缓存页数 - mainViewPager.addOnPageChangeListener(object : ViewPager.OnPageChangeListener { - override fun onPageScrollStateChanged(state: Int) { - - } - - override fun onPageScrolled( - position: Int, - positionOffset: Float, - positionOffsetPixels: Int - ) { - - } - - override fun onPageSelected(position: Int) { - if (menuItem != null) { - menuItem!!.isChecked = false - } else { - bottomNavigation.menu.getItem(0).isChecked = false - } - menuItem = bottomNavigation.menu.getItem(position) - menuItem!!.isChecked = true - } - }) } override fun initEvent() { diff --git a/app/src/main/java/com/casic/xz/meterage/view/search/SearchAllActivity.kt b/app/src/main/java/com/casic/xz/meterage/view/search/SearchAllActivity.kt new file mode 100644 index 0000000..ecc8fd7 --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/view/search/SearchAllActivity.kt @@ -0,0 +1,40 @@ +package com.casic.xz.meterage.view.search + +import com.casic.xz.meterage.R +import com.casic.xz.meterage.extensions.initLayoutImmersionBar +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.navigatePageTo +import kotlinx.android.synthetic.main.activity_search_all.* +import kotlinx.android.synthetic.main.include_search_input_title.* + +class SearchAllActivity : KotlinBaseActivity() { + + override fun initData() { + + } + + override fun initEvent() { + leftBackView.setOnClickListener { finish() } + searchTextView.setOnClickListener { + navigatePageTo(inputView.text.toString()) + } + } + + override fun initLayoutView(): Int = R.layout.activity_search_all + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + initLayoutImmersionBar(rootView) + inputView.hint = "查询样品、业务" + } + + override fun onResume() { + super.onResume() + //TODO 流式布局显示查询记录Tag? + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/view/search/SearchAllResultActivity.kt b/app/src/main/java/com/casic/xz/meterage/view/search/SearchAllResultActivity.kt new file mode 100644 index 0000000..adbb570 --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/view/search/SearchAllResultActivity.kt @@ -0,0 +1,34 @@ +package com.casic.xz.meterage.view.search + +import com.casic.xz.meterage.R +import com.casic.xz.meterage.extensions.initLayoutImmersionBar +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.utils.Constant +import kotlinx.android.synthetic.main.activity_search_all_reasult.* +import kotlinx.android.synthetic.main.include_search_title.* + +class SearchAllResultActivity : KotlinBaseActivity() { + + private lateinit var param: String + + override fun initData() { + param = intent.getStringExtra(Constant.INTENT_PARAM)!! + } + + override fun initEvent() { + leftBackView.setOnClickListener { finish() } + } + + override fun initLayoutView(): Int = R.layout.activity_search_all_reasult + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + initLayoutImmersionBar(rootView) + titleView.text = "查询结果" + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/view/search/SearchEquipmentActivity.kt b/app/src/main/java/com/casic/xz/meterage/view/search/SearchEquipmentActivity.kt index f5c98d6..3551790 100644 --- a/app/src/main/java/com/casic/xz/meterage/view/search/SearchEquipmentActivity.kt +++ b/app/src/main/java/com/casic/xz/meterage/view/search/SearchEquipmentActivity.kt @@ -1,27 +1,98 @@ package com.casic.xz.meterage.view.search import com.casic.xz.meterage.R +import com.casic.xz.meterage.bean.SearchHistoryBean import com.casic.xz.meterage.extensions.initLayoutImmersionBar +import com.casic.xz.meterage.utils.DataBaseManager +import com.casic.xz.meterage.utils.SearchType import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter +import com.pengxh.kt.lite.adapter.ViewHolder import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.utils.WeakReferenceHandler +import com.pengxh.kt.lite.widget.dialog.AlertControlDialog import kotlinx.android.synthetic.main.activity_search_equipment.* import kotlinx.android.synthetic.main.include_search_input_title.* + /** * 搜索仪器设备 * */ class SearchEquipmentActivity : KotlinBaseActivity() { - override fun initData() { + private lateinit var weakReferenceHandler: WeakReferenceHandler + private lateinit var historyAdapter: NormalRecyclerAdapter + private var dataBeans: MutableList = ArrayList() + private var isRefresh = false + override fun initData() { + weakReferenceHandler = WeakReferenceHandler { + if (it.what == 2023031001) { + if (isRefresh) { + historyAdapter.notifyDataSetChanged() + } else { + historyAdapter = object : + NormalRecyclerAdapter( + R.layout.item_search_rv_l, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, position: Int, item: SearchHistoryBean + ) { + viewHolder.setText(R.id.searchTagView, item.keywords) + } + } + historyRecyclerView.adapter = historyAdapter + historyAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked(position: Int, t: SearchHistoryBean) { + navigatePageTo(t.keywords) + } + }) + } + } + true + } + } + + override fun onResume() { + super.onResume() + dataBeans = DataBaseManager.get.queryHistoryByType(SearchType.Equipment) + weakReferenceHandler.sendEmptyMessage(2023031001) } override fun initEvent() { leftBackView.setOnClickListener { finish() } searchTextView.setOnClickListener { + if (!inputView.text.isNullOrBlank()) { + DataBaseManager.get.addSearchHistory( + inputView.text.toString(), SearchType.Equipment + ) + } + navigatePageTo(inputView.text.toString()) } + + deleteHistoryView.setOnClickListener { + AlertControlDialog.Builder() + .setContext(this) + .setTitle("提示") + .setMessage("确定将所有搜索记录删除?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + + } + + override fun onConfirmClick() { + DataBaseManager.get.deleteHistoryByType(SearchType.Equipment) + dataBeans.clear() + historyAdapter.notifyDataSetChanged() + } + }).build().show() + } } override fun initLayoutView(): Int = R.layout.activity_search_equipment @@ -35,9 +106,4 @@ initLayoutImmersionBar(rootView) inputView.hint = "查询设备名称、编号" } - - override fun onResume() { - super.onResume() - //TODO 流式布局显示查询记录Tag? - } } \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_delete.xml b/app/src/main/res/drawable/ic_delete.xml new file mode 100644 index 0000000..1810342 --- /dev/null +++ b/app/src/main/res/drawable/ic_delete.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/layout/activity_search_all.xml b/app/src/main/res/layout/activity_search_all.xml new file mode 100644 index 0000000..45694fb --- /dev/null +++ b/app/src/main/res/layout/activity_search_all.xml @@ -0,0 +1,17 @@ + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_search_all_reasult.xml b/app/src/main/res/layout/activity_search_all_reasult.xml new file mode 100644 index 0000000..7e90433 --- /dev/null +++ b/app/src/main/res/layout/activity_search_all_reasult.xml @@ -0,0 +1,51 @@ + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_search_equipment.xml b/app/src/main/res/layout/activity_search_equipment.xml index 45694fb..f637b70 100644 --- a/app/src/main/res/layout/activity_search_equipment.xml +++ b/app/src/main/res/layout/activity_search_equipment.xml @@ -1,5 +1,6 @@ + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_home.xml b/app/src/main/res/layout/fragment_home.xml index 154d157..e525b93 100644 --- a/app/src/main/res/layout/fragment_home.xml +++ b/app/src/main/res/layout/fragment_home.xml @@ -33,12 +33,16 @@ android:layout_marginHorizontal="@dimen/dp_5" android:src="@drawable/ic_search" /> - + android:textSize="@dimen/sp_14" /> + diff --git a/build.gradle b/build.gradle index 07470ae..c16163f 100644 --- a/build.gradle +++ b/build.gradle @@ -9,6 +9,7 @@ dependencies { classpath 'com.android.tools.build:gradle:3.6.4' classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" + classpath 'org.greenrobot:greendao-gradle-plugin:3.3.0' // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files