├── .gitignore ├── LICENSE ├── README.md ├── aat ├── compared.png ├── qrcode_1715829336053.png └── 架构UI图.ai ├── app ├── build.gradle ├── proguard-rules.pro └── src │ └── main │ ├── AndroidManifest.xml │ ├── java │ └── com │ │ └── just │ │ └── machine │ │ ├── App.kt │ │ ├── api │ │ ├── BaseApiService.kt │ │ └── UserRepository.kt │ │ ├── dao │ │ ├── AppDatabase.kt │ │ ├── Plant.kt │ │ ├── PlantDao.kt │ │ └── PlantRepository.kt │ │ ├── di │ │ ├── AppModule.kt │ │ └── DatabaseModule.kt │ │ ├── helper │ │ ├── GlideApp.kt │ │ ├── Net.kt │ │ ├── UriConfig.kt │ │ └── binding │ │ │ └── Binding.java │ │ ├── model │ │ ├── Canstants.kt │ │ ├── DataStoreHelper.kt │ │ ├── LoginBean.kt │ │ ├── LoginData.kt │ │ ├── NewResponse.kt │ │ ├── OrderListBean.kt │ │ ├── OrderListData.kt │ │ ├── OrdersShipmentsBean.kt │ │ └── SharedPreferencesUtils.kt │ │ ├── ui │ │ ├── activity │ │ │ ├── LoginActivity.kt │ │ │ ├── MainActivity.kt │ │ │ └── WelComeActivity.kt │ │ ├── adapter │ │ │ ├── GoodsAdapter.kt │ │ │ └── OrderAdapter.kt │ │ ├── dialog │ │ │ ├── AllDialogFragment.kt │ │ │ ├── LoadingDialogFragment.kt │ │ │ └── OrderDetailsDialogFragment.kt │ │ ├── fragment │ │ │ ├── LoginFragment.kt │ │ │ ├── MainFragment.kt │ │ │ ├── MeFragment.kt │ │ │ ├── NewFragment.kt │ │ │ ├── OrderFragment.kt │ │ │ └── SettingFragment.kt │ │ └── viewmodel │ │ │ └── MainViewModel.kt │ │ └── workers │ │ └── SeedDatabaseWorker.kt │ └── res │ ├── color │ └── main_bottom_tab_color.xml │ ├── drawable │ ├── arrow_back.xml │ ├── bg_input.xml │ ├── check_click_yes.xml │ ├── check_no.xml │ ├── custom_checkbox_selector.xml │ ├── ic_back.xml │ ├── ic_home.xml │ ├── ic_home_on.xml │ ├── ic_launcher_background.xml │ ├── ic_logo.xml │ ├── ic_new.xml │ ├── ic_new_on.xml │ ├── ic_personal.xml │ ├── ic_personal_on.xml │ ├── main_home.xml │ ├── main_new.xml │ ├── main_personal.xml │ ├── order.xml │ ├── order_bg.xml │ └── succeed_blue_btn.xml │ ├── layout │ ├── activity_login.xml │ ├── activity_main.xml │ ├── activity_organization.xml │ ├── activity_succeed_prison.xml │ ├── activity_web.xml │ ├── activity_welcome.xml │ ├── dialog_fragment_all.xml │ ├── dialog_fragment_order_details.xml │ ├── fragmelayout_succeed.xml │ ├── fragment_dialog_loading.xml │ ├── fragment_login.xml │ ├── fragment_main.xml │ ├── fragment_me.xml │ ├── fragment_new.xml │ ├── fragment_order.xml │ ├── fragment_setting.xml │ ├── item_goods.xml │ ├── item_order.xml │ ├── printer_list.xml │ └── view_toolbar.xml │ ├── menu │ └── bottom_navigation_main.xml │ ├── mipmap-xxxhdpi │ └── logo.png │ ├── navigation │ ├── nav_login.xml │ └── nav_main.xml │ └── values │ ├── colors.xml │ ├── strings.xml │ └── styles.xml ├── autosize ├── build.gradle ├── proguard-rules.pro └── src │ └── main │ ├── AndroidManifest.xml │ └── java │ └── me │ └── jessyan │ └── autosize │ ├── ActivityLifecycleCallbacksImpl.kt │ ├── AutoAdaptStrategy.kt │ ├── AutoSize.kt │ ├── AutoSizeCompat.kt │ ├── AutoSizeConfig.kt │ ├── DefaultAutoAdaptStrategy.kt │ ├── DisplayMetricsInfo.kt │ ├── FragmentLifecycleCallbacksImpl.kt │ ├── FragmentLifecycleCallbacksImplToAndroidx.kt │ ├── InitProvider.kt │ ├── WrapperAutoAdaptStrategy.kt │ ├── external │ ├── ExternalAdaptInfo.kt │ └── ExternalAdaptManager.kt │ ├── internal │ ├── CancelAdapt.kt │ └── CustomAdapt.kt │ ├── onAdaptListener.kt │ ├── unit │ ├── Subunits.kt │ └── UnitsManager.kt │ └── utils │ ├── AutoSizeLog.java │ ├── AutoSizeUtils.java │ ├── Preconditions.java │ └── ScreenUtils.java ├── build.gradle ├── common ├── build.gradle ├── consumer-rules.pro ├── libs │ └── log4j-1.2.13.jar ├── proguard-rules.pro └── src │ └── main │ ├── AndroidManifest.xml │ └── java │ └── com │ └── common │ ├── BaseResponse.kt │ ├── base │ ├── BaseDataBingViewHolder.java │ ├── BaseDialogFragment.kt │ ├── BaseFrameLayout.kt │ ├── BasePageAdapter.kt │ ├── BaseRecyclerViewAdapter.kt │ ├── CommonBaseActivity.kt │ ├── CommonBaseFragment.kt │ └── base.kt │ ├── log │ ├── LogCatAppender.java │ ├── LogConfigurator.java │ ├── MyDailyRollingFileAppender.java │ └── ThinkerLogger.java │ ├── network │ ├── LogUtils.java │ └── RequestObserver.kt │ ├── throwe │ ├── BaseResponseThrowable.kt │ └── ThrowableHandler.kt │ └── viewmodel │ ├── BaseLifeViewModel.kt │ ├── BaseViewModel.kt │ ├── LiveDataEvent.kt │ ├── SingleLiveEvent.kt │ ├── StateView.kt │ └── ViewEvent.kt ├── dependencies.gradle ├── gradle.properties ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat ├── libview ├── build.gradle ├── proguard-rules.pro └── src │ └── main │ ├── AndroidManifest.xml │ ├── java │ └── com │ │ └── justsafe │ │ └── libview │ │ ├── invite │ │ ├── CrumbView.kt │ │ └── KeyWordUtil.kt │ │ ├── nav │ │ ├── FragmentNavigatorHideShow.kt │ │ └── NavHostFragmentHideShow.kt │ │ ├── text │ │ ├── MarqueeTextView.kt │ │ ├── RequiredTextView.kt │ │ └── SuperEditText.kt │ │ └── util │ │ ├── BaseUtil.kt │ │ ├── DateUtils.kt │ │ ├── InputFilterUtils.kt │ │ └── SystemUtil.kt │ └── res │ ├── drawable-v24 │ ├── alert_bg.9.png │ ├── elab_tab_bg.xml │ ├── ic_launcher_foreground.xml │ └── ic_loading.xml │ ├── drawable-xxhdpi │ ├── arrow.png │ ├── ic_submit.xml │ ├── public_waiting.png │ └── succeed_bg.xml │ ├── drawable-xxxhdpi │ ├── btn_100.png │ ├── btn_100_h.png │ ├── btn_alpha50.png │ ├── btn_close.png │ ├── icon_arrow_right.png │ ├── icon_back.png │ ├── icon_organization.png │ ├── icon_radio.png │ ├── icon_radio_selected.png │ ├── icon_search.png │ └── img_head_smal.png │ ├── drawable │ ├── bg_search.xml │ ├── bg_white.xml │ ├── btn_100_bg.xml │ ├── cv_bg_material.xml │ ├── ic_back.xml │ ├── ic_delete.xml │ ├── ic_launcher_background.xml │ ├── ic_user_img.xml │ ├── org_selector.xml │ ├── public_progress.xml │ ├── super_edittext_bg.xml │ └── super_edittext_cursor.xml │ ├── layout │ ├── activity_invite_people.xml │ ├── crumb_item_layout.xml │ ├── cv_layout_calendar_view.xml │ ├── cv_week_bar.xml │ ├── fragment_play_movie_view.xml │ ├── fragment_search.xml │ ├── item_search.xml │ ├── item_type_org.xml │ ├── item_type_staff.xml │ ├── message_item.xml │ ├── message_list_item.xml │ ├── message_list_item2.xml │ ├── search_layout.xml │ ├── view_dialog.xml │ ├── view_toolbar.xml │ ├── wheel_dialog_base.xml │ ├── wheel_dialog_title_bar.xml │ └── wheel_fragment_dialog.xml │ ├── mipmap-anydpi-v26 │ ├── ic_launcher.xml │ └── ic_launcher_round.xml │ ├── mipmap-hdpi │ ├── fragment_chat_play_video.png │ ├── ic_launcher.png │ └── ic_launcher_round.png │ ├── mipmap-mdpi │ ├── ic_launcher.png │ ├── ic_launcher_round.png │ └── trans_bg.png │ ├── mipmap-xhdpi │ ├── ic_launcher.png │ └── ic_launcher_round.png │ ├── mipmap-xxhdpi │ ├── back.png │ ├── clear.png │ ├── date.png │ ├── ic_launcher.png │ ├── ic_launcher_round.png │ └── search.png │ ├── mipmap-xxxhdpi │ ├── ic_launcher.png │ └── ic_launcher_round.png │ ├── values-night │ ├── circleprgbar_attrs.xml │ └── themes.xml │ └── values │ ├── attrs.xml │ ├── colors.xml │ ├── dimens.xml │ ├── strings.xml │ ├── style.xml │ └── themes.xml ├── settings.gradle └── xp460b ├── .cxx └── Debug │ ├── 1o3e4g18 │ └── x86 │ │ ├── .cmake │ │ └── api │ │ │ └── v1 │ │ │ ├── query │ │ │ └── client-agp │ │ │ │ ├── cache-v2 │ │ │ │ ├── cmakeFiles-v1 │ │ │ │ └── codemodel-v2 │ │ │ └── reply │ │ │ ├── cache-v2-fe0f62849f987ff42220.json │ │ │ ├── cmakeFiles-v1-a0390a5de1b95f436d6c.json │ │ │ ├── codemodel-v2-819c4144758e644b6a21.json │ │ │ ├── index-2024-03-01T07-28-20-0231.json │ │ │ └── target-xp460b-Debug-76e6cf918218d064ba15.json │ │ ├── .ninja_deps │ │ ├── .ninja_log │ │ ├── CMakeCache.txt │ │ ├── CMakeFiles │ │ ├── 3.18.1-g262b901 │ │ │ ├── CMakeCCompiler.cmake │ │ │ ├── CMakeCXXCompiler.cmake │ │ │ ├── CMakeDetermineCompilerABI_C.bin │ │ │ ├── CMakeDetermineCompilerABI_CXX.bin │ │ │ └── CMakeSystem.cmake │ │ ├── TargetDirectories.txt │ │ ├── cmake.check_cache │ │ └── rules.ninja │ │ ├── android_gradle_build.json │ │ ├── build.ninja │ │ ├── cmake_install.cmake │ │ ├── compile_commands.json │ │ ├── compile_commands.json.bin │ │ ├── metadata_generation_command.txt │ │ └── prefab_config.json │ └── 2z4w301x │ ├── arm64-v8a │ ├── .cmake │ │ └── api │ │ │ └── v1 │ │ │ ├── query │ │ │ └── client-agp │ │ │ │ ├── cache-v2 │ │ │ │ ├── cmakeFiles-v1 │ │ │ │ └── codemodel-v2 │ │ │ └── reply │ │ │ ├── cache-v2-07f7fceb6942dd782c98.json │ │ │ ├── cmakeFiles-v1-fffc0c383048d827523f.json │ │ │ ├── codemodel-v2-7bbaf92080a5aa935bac.json │ │ │ ├── index-2024-08-02T09-04-01-0323.json │ │ │ └── target-xp460b-Debug-fb7cdc1d28f5653a7391.json │ ├── .ninja_deps │ ├── .ninja_log │ ├── CMakeCache.txt │ ├── CMakeFiles │ │ ├── 3.18.1-g262b901 │ │ │ ├── CMakeCCompiler.cmake │ │ │ ├── CMakeCXXCompiler.cmake │ │ │ ├── CMakeDetermineCompilerABI_C.bin │ │ │ ├── CMakeDetermineCompilerABI_CXX.bin │ │ │ └── CMakeSystem.cmake │ │ ├── TargetDirectories.txt │ │ ├── cmake.check_cache │ │ ├── rules.ninja │ │ └── xp460b.dir │ │ │ └── xp460b.cpp.o │ ├── android_gradle_build.json │ ├── android_gradle_build_command_xp460b_arm64-v8a.txt │ ├── android_gradle_build_stderr_xp460b_arm64-v8a.txt │ ├── android_gradle_build_stdout_xp460b_arm64-v8a.txt │ ├── build.ninja │ ├── cmake_install.cmake │ ├── compile_commands.json │ ├── compile_commands.json.bin │ ├── metadata_generation_command.txt │ └── prefab_config.json │ └── x86 │ ├── .cmake │ └── api │ │ └── v1 │ │ ├── query │ │ └── client-agp │ │ │ ├── cache-v2 │ │ │ ├── cmakeFiles-v1 │ │ │ └── codemodel-v2 │ │ └── reply │ │ ├── cache-v2-3d026f07d75375047360.json │ │ ├── cmakeFiles-v1-5d238ced76e207bbdf0a.json │ │ ├── codemodel-v2-285482eff219e552c3f3.json │ │ ├── index-2024-08-02T09-03-49-0182.json │ │ └── target-xp460b-Debug-12387b5d59e21718b7ef.json │ ├── CMakeCache.txt │ ├── CMakeFiles │ ├── 3.18.1-g262b901 │ │ ├── CMakeCCompiler.cmake │ │ ├── CMakeCXXCompiler.cmake │ │ ├── CMakeDetermineCompilerABI_C.bin │ │ ├── CMakeDetermineCompilerABI_CXX.bin │ │ └── CMakeSystem.cmake │ ├── TargetDirectories.txt │ ├── cmake.check_cache │ └── rules.ninja │ ├── android_gradle_build.json │ ├── build.ninja │ ├── cmake_install.cmake │ ├── compile_commands.json │ ├── compile_commands.json.bin │ ├── metadata_generation_command.txt │ └── prefab_config.json ├── .gitignore ├── build.gradle ├── consumer-rules.pro ├── libs └── posprinterconnectandsendsdk_1.1.13.jar ├── proguard-rules.pro └── src └── main ├── AndroidManifest.xml ├── cpp ├── CMakeLists.txt └── xp460b.cpp ├── java └── com │ └── example │ └── xp460b │ ├── Conts.java │ ├── MainActivity.java │ ├── P76Activity.java │ ├── PictureHelper.java │ └── PosActivity.java └── res ├── drawable-mdpi └── ic_launcher.png ├── layout ├── activity_main.xml ├── p76_activity.xml ├── pos_activity.xml ├── printer_list.xml └── usb_link.xml └── values ├── strings.xml └── styles.xml /.gitignore: -------------------------------------------------------------------------------- 1 | # Built application files 2 | *.apk 3 | *.ap_ 4 | 5 | # Files for the ART/Dalvik VM 6 | *.dex 7 | 8 | # Java class files 9 | *.class 10 | 11 | # Generated files 12 | bin/ 13 | gen/ 14 | out/ 15 | 16 | # Gradle files 17 | .gradle/ 18 | build/ 19 | 20 | # Local configuration file (sdk path, etc) 21 | local.properties 22 | 23 | # Proguard folder generated by Eclipse 24 | proguard/ 25 | 26 | # Log Files 27 | *.log 28 | 29 | # Android Studio Navigation editor temp files 30 | .navigation/ 31 | 32 | # Android Studio captures folder 33 | captures/ 34 | 35 | # ShareSDK临时生成的文件夹 36 | tmpmob/ 37 | 38 | # IntelliJ 39 | *.iml 40 | .idea/ 41 | 42 | # Keystore files 43 | # Uncomment the following line if you do not want to check your keystore files in. 44 | #*.jks 45 | 46 | # External native build folder generated in Android Studio 2.2 and later 47 | .externalNativeBuild 48 | 49 | # Google Services (e.g. APIs or Firebase) 50 | google-services.json 51 | 52 | # Freeline 53 | freeline.py 54 | freeline/ 55 | freeline_project_description.json 56 | 57 | # fastlane 58 | fastlane/report.xml 59 | fastlane/Preview.html 60 | fastlane/screenshots 61 | fastlane/test_output 62 | fastlane/readme.md 63 | /app/app.iml -------------------------------------------------------------------------------- /aat/compared.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Primary-hacker1/MVVMJetpack/77ee003b620856c7e3c515fb5033a149bceb192a/aat/compared.png -------------------------------------------------------------------------------- /aat/qrcode_1715829336053.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Primary-hacker1/MVVMJetpack/77ee003b620856c7e3c515fb5033a149bceb192a/aat/qrcode_1715829336053.png -------------------------------------------------------------------------------- /aat/架构UI图.ai: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Primary-hacker1/MVVMJetpack/77ee003b620856c7e3c515fb5033a149bceb192a/aat/架构UI图.ai -------------------------------------------------------------------------------- /app/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # You can control the set of applied configuration files using the 3 | # proguardFiles setting in build.gradle. 4 | # 5 | # For more details, see 6 | # http://developer.android.com/guide/developing/tools/proguard.html 7 | 8 | # If your project uses WebView with JS, uncomment the following 9 | # and specify the fully qualified class name to the JavaScript interface 10 | # class: 11 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 12 | # public *; 13 | #} 14 | 15 | # Uncomment this to preserve the line number information for 16 | # debugging stack traces. 17 | #-keepattributes SourceFile,LineNumberTable 18 | 19 | # If you keep the line number information, uncomment this to 20 | # hide the original source file name. 21 | #-renamesourcefileattribute SourceFile 22 | -------------------------------------------------------------------------------- /app/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 7 | 8 | 18 | 19 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | -------------------------------------------------------------------------------- /app/src/main/java/com/just/machine/App.kt: -------------------------------------------------------------------------------- 1 | package com.just.machine 2 | 3 | import android.app.Activity 4 | import android.app.Application 5 | import com.common.log.ThinkerLogger 6 | import com.just.machine.helper.UriConfig 7 | 8 | import dagger.hilt.android.HiltAndroidApp 9 | import me.jessyan.autosize.AutoSize 10 | import me.jessyan.autosize.AutoSizeConfig 11 | import me.jessyan.autosize.onAdaptListener 12 | import me.jessyan.autosize.utils.AutoSizeLog 13 | import java.util.* 14 | 15 | @HiltAndroidApp 16 | open class App : Application() { 17 | companion object { 18 | var instance: App? = null 19 | } 20 | 21 | override fun onCreate() { 22 | super.onCreate() 23 | 24 | instance = this 25 | 26 | ThinkerLogger.getInstance().init(UriConfig.LOG_PATH)//日志输出本地 27 | 28 | AutoSize.initCompatMultiProcess(this)//今日头条终极适配 29 | AutoSizeConfig.instance!! //是否让框架支持自定义 Fragment 的适配参数, 由于这个需求是比较少见的, 所以须要使用者手动开启 30 | .setUseDeviceSize(true) 31 | .setBaseOnWidth(false)//全局适配宽高 32 | //如果没有这个需求建议不开启 33 | .setCustomFragment(true).onAdaptListener = object : onAdaptListener { 34 | override fun onAdaptBefore(target: Any?, activity: Activity?) { 35 | AutoSizeLog.d( 36 | String.format( 37 | Locale.ENGLISH, 38 | "%s onAdaptBefore!", 39 | target?.javaClass?.name 40 | ) 41 | ) 42 | } 43 | 44 | override fun onAdaptAfter(target: Any?, activity: Activity?) { 45 | AutoSizeLog.d( 46 | String.format( 47 | Locale.ENGLISH, 48 | "%s onAdaptAfter!", 49 | target?.javaClass?.name 50 | ) 51 | ) 52 | } 53 | } 54 | } 55 | } -------------------------------------------------------------------------------- /app/src/main/java/com/just/machine/api/BaseApiService.kt: -------------------------------------------------------------------------------- 1 | package com.just.machine.api 2 | 3 | import com.just.machine.model.LoginBean 4 | import com.just.machine.model.LoginData 5 | import com.just.machine.model.NewResponse 6 | import com.just.machine.model.OrderListBean 7 | import com.just.machine.model.OrderListData 8 | import com.just.machine.model.OrdersShipmentsBean 9 | import retrofit2.http.Body 10 | import retrofit2.http.GET 11 | import retrofit2.http.POST 12 | import retrofit2.http.Query 13 | 14 | /** 15 | *create by 2020/3/19 16 | *@author zt 17 | */ 18 | interface BaseApiService { 19 | 20 | @POST("auth/login") 21 | suspend fun login(@Body loginBean: LoginBean?): NewResponse 22 | 23 | @GET("order/list") 24 | suspend fun orderList( 25 | @Query("page") page: Int?, 26 | @Query("limit") limit: Int?, 27 | @Query("showType") showType: Int?, 28 | @Query("sort") sort: String?, 29 | @Query("order") order: String?, 30 | @Query("start") start: String?, 31 | @Query("end") end: String? 32 | ): NewResponse 33 | 34 | 35 | @POST("order/batchShip") 36 | suspend fun ordersShipments(@Body ordersShipmentsBean: OrdersShipmentsBean?): NewResponse 37 | 38 | } -------------------------------------------------------------------------------- /app/src/main/java/com/just/machine/api/UserRepository.kt: -------------------------------------------------------------------------------- 1 | package com.just.machine.api 2 | 3 | import com.just.machine.model.LoginBean 4 | import com.just.machine.model.LoginData 5 | import com.just.machine.model.NewResponse 6 | import com.just.machine.model.OrderListData 7 | import com.just.machine.model.OrdersShipmentsBean 8 | import javax.inject.Inject 9 | 10 | /** 11 | *create by 2020/3/19 12 | *@author zt 13 | */ 14 | class UserRepository @Inject internal constructor(private val apiService: BaseApiService) { 15 | /** 16 | * 协程请求 17 | */ 18 | suspend fun login(loginBean: LoginBean): NewResponse = apiService.login(loginBean) 19 | suspend fun orderList( 20 | page: Int?, 21 | limit: Int?, 22 | showType: Int?, 23 | sort: String?, 24 | order: String?, 25 | start: String?, 26 | end: String? 27 | ): NewResponse = 28 | apiService.orderList( 29 | page, 30 | limit, 31 | showType, 32 | sort, 33 | order, 34 | start, 35 | end 36 | ) 37 | 38 | suspend fun ordersShipments(orders: OrdersShipmentsBean): NewResponse = apiService.ordersShipments(orders) 39 | } 40 | -------------------------------------------------------------------------------- /app/src/main/java/com/just/machine/dao/AppDatabase.kt: -------------------------------------------------------------------------------- 1 | 2 | package com.just.machine.dao 3 | 4 | import android.content.Context 5 | import androidx.room.Database 6 | import androidx.room.Room 7 | import androidx.room.RoomDatabase 8 | import androidx.sqlite.db.SupportSQLiteDatabase 9 | import androidx.work.OneTimeWorkRequestBuilder 10 | import androidx.work.WorkManager 11 | import androidx.work.workDataOf 12 | import com.just.machine.workers.SeedDatabaseWorker 13 | import com.just.machine.workers.SeedDatabaseWorker.Companion.KEY_FILENAME 14 | import com.just.machine.helper.UriConfig.DATABASE_NAME 15 | import com.just.machine.helper.UriConfig.PLANT_DATA_FILENAME 16 | 17 | /** 18 | *create by 2021/9/18 19 | *@author zt 20 | * 此应用程序的房间数据库 21 | */ 22 | @Database(entities = [Plant::class], version = 2, exportSchema = false) 23 | //@TypeConverters(Converters::class) 24 | abstract class AppDatabase : RoomDatabase() { 25 | 26 | abstract fun plantDao(): PlantDao 27 | 28 | companion object { 29 | 30 | // For Singleton instantiation 31 | @Volatile private var instance: AppDatabase? = null 32 | 33 | fun getInstance(context: Context): AppDatabase { 34 | return instance ?: synchronized(this) { 35 | instance ?: buildDatabase(context).also { instance = it } 36 | } 37 | } 38 | 39 | // 创建并预填充数据库。 有关更多详细信息,请参阅这篇文章: 40 | // https://medium.com/google-developers/7-pro-tips-for-room-fbadea4bfbd1#4785 41 | private fun buildDatabase(context: Context): AppDatabase { 42 | return Room.databaseBuilder(context, AppDatabase::class.java, DATABASE_NAME) 43 | .addCallback( 44 | object : RoomDatabase.Callback() { 45 | override fun onCreate(db: SupportSQLiteDatabase) { 46 | super.onCreate(db) 47 | val request = OneTimeWorkRequestBuilder() 48 | .setInputData(workDataOf(KEY_FILENAME to PLANT_DATA_FILENAME)) 49 | .build() 50 | WorkManager.getInstance(context).enqueue(request) 51 | } 52 | } 53 | ) 54 | .build() 55 | } 56 | } 57 | } 58 | -------------------------------------------------------------------------------- /app/src/main/java/com/just/machine/dao/Plant.kt: -------------------------------------------------------------------------------- 1 | package com.just.machine.dao 2 | 3 | import androidx.room.ColumnInfo 4 | import androidx.room.Entity 5 | import androidx.room.PrimaryKey 6 | 7 | @Entity(tableName = "plants") 8 | data class Plant( 9 | @PrimaryKey @ColumnInfo(name = "id") val plantId: String, 10 | val name: String, 11 | val description: String, 12 | val growZoneNumber: Int, 13 | val wateringInterval: Int = 7, // how often the plant should be watered, in days 14 | val imageUrl: String = "" 15 | ) { 16 | override fun toString() = name 17 | } 18 | -------------------------------------------------------------------------------- /app/src/main/java/com/just/machine/dao/PlantDao.kt: -------------------------------------------------------------------------------- 1 | package com.just.machine.dao 2 | 3 | import androidx.room.Dao 4 | import androidx.room.Insert 5 | import androidx.room.OnConflictStrategy 6 | import androidx.room.Query 7 | import kotlinx.coroutines.flow.Flow 8 | 9 | /** 10 | * Plant 类的数据访问对象。 11 | */ 12 | @Dao 13 | interface PlantDao { 14 | @Query("SELECT * FROM plants ORDER BY name") 15 | fun getPlants(): Flow> 16 | 17 | @Query("SELECT * FROM plants WHERE growZoneNumber = :growZoneNumber ORDER BY name") 18 | fun getPlantsWithGrowZoneNumber(growZoneNumber: Int): Flow> 19 | 20 | @Query("SELECT * FROM plants WHERE id = :plantId") 21 | fun getPlant(plantId: String): Flow 22 | 23 | @Insert(onConflict = OnConflictStrategy.REPLACE) 24 | suspend fun insertAll(plants: List) 25 | } 26 | -------------------------------------------------------------------------------- /app/src/main/java/com/just/machine/dao/PlantRepository.kt: -------------------------------------------------------------------------------- 1 | package com.just.machine.dao 2 | 3 | import kotlinx.coroutines.flow.Flow 4 | import javax.inject.Inject 5 | 6 | /** 7 | * 用于处理数据操作的存储库模块。 8 | * 9 | * 从 [PlantDao] 中的 Flow 中收集是主要安全的。 Room 支持 Coroutines 并移动 10 | * 主线程外的查询执行。 11 | */ 12 | class PlantRepository @Inject constructor(private val plantDao: PlantDao) { 13 | 14 | fun getPlants() = plantDao.getPlants() 15 | 16 | fun getPlant(plantId: String): Flow = plantDao.getPlant(plantId) 17 | 18 | suspend fun insertAll(plants: List) = plantDao.insertAll(plants) 19 | 20 | fun getPlantsWithGrowZoneNumber(growZoneNumber: Int) = 21 | plantDao.getPlantsWithGrowZoneNumber(growZoneNumber) 22 | } 23 | -------------------------------------------------------------------------------- /app/src/main/java/com/just/machine/di/AppModule.kt: -------------------------------------------------------------------------------- 1 | package com.just.machine.di 2 | 3 | import com.just.machine.helper.Net 4 | import com.just.machine.api.BaseApiService 5 | import com.just.machine.helper.UriConfig 6 | import dagger.Module 7 | import dagger.Provides 8 | import dagger.hilt.InstallIn 9 | import dagger.hilt.components.SingletonComponent 10 | import retrofit2.Retrofit 11 | import javax.inject.Singleton 12 | 13 | @Module 14 | @InstallIn(SingletonComponent::class) 15 | object AppModule { 16 | @Provides 17 | @Singleton 18 | fun providerBaseApi(): BaseApiService { 19 | return providerRetrofit().create(BaseApiService::class.java) 20 | } 21 | 22 | @Provides 23 | @Singleton 24 | fun providerRetrofit(): Retrofit { 25 | return Net.getRetrofit(UriConfig.BASE_URL, 6000L) 26 | } 27 | } -------------------------------------------------------------------------------- /app/src/main/java/com/just/machine/di/DatabaseModule.kt: -------------------------------------------------------------------------------- 1 | package com.just.machine.di 2 | 3 | 4 | 5 | import android.content.Context 6 | import com.just.machine.dao.AppDatabase 7 | import com.just.machine.dao.PlantDao 8 | import dagger.Module 9 | import dagger.Provides 10 | import dagger.hilt.InstallIn 11 | import dagger.hilt.android.qualifiers.ApplicationContext 12 | import dagger.hilt.components.SingletonComponent 13 | import javax.inject.Singleton 14 | 15 | @Module 16 | @InstallIn(SingletonComponent::class) 17 | object DatabaseModule { 18 | @Singleton 19 | @Provides 20 | fun provideAppDatabase(@ApplicationContext context: Context): AppDatabase { 21 | return AppDatabase.getInstance(context) 22 | } 23 | 24 | @Singleton 25 | @Provides 26 | fun providePlantDao(appDatabase: AppDatabase): PlantDao { 27 | return appDatabase.plantDao() 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /app/src/main/java/com/just/machine/helper/UriConfig.kt: -------------------------------------------------------------------------------- 1 | package com.just.machine.helper 2 | 3 | import com.just.machine.App 4 | 5 | /** 6 | *create by 2020/6/19 7 | *@author zt 8 | */ 9 | object UriConfig { 10 | const val BASE_URL = "https://www.xmdd1679.com/admin" //线上正式 11 | // const val BASE_URL = "http://119.3.234.32:6913/admin" //线上测试 12 | // const val BASE_URL = "http://localhost:9527/admin/" //本地测试 13 | 14 | const val DATABASE_NAME = "news-db" 15 | 16 | const val PLANT_DATA_FILENAME = "plants.json" 17 | 18 | val LOG_PATH: String = App.instance?.getExternalFilesDir("log")!!.path//本地日志输出 19 | } -------------------------------------------------------------------------------- /app/src/main/java/com/just/machine/helper/binding/Binding.java: -------------------------------------------------------------------------------- 1 | package com.just.machine.helper.binding; 2 | 3 | 4 | import android.text.TextUtils; 5 | 6 | import androidx.annotation.DrawableRes; 7 | import androidx.appcompat.widget.AppCompatImageView; 8 | import androidx.appcompat.widget.AppCompatTextView; 9 | import androidx.databinding.BindingAdapter; 10 | import androidx.recyclerview.widget.RecyclerView; 11 | 12 | import com.common.base.BaseRecyclerViewAdapter; 13 | 14 | import java.util.List; 15 | 16 | public class Binding { 17 | 18 | @BindingAdapter(value = {"setText"}, requireAll = false) 19 | public static void onText(AppCompatTextView textView, String string) { 20 | if (!TextUtils.isEmpty(string)) { 21 | textView.setText(string); 22 | } 23 | } 24 | 25 | @BindingAdapter("setImage") 26 | public static void onImage(AppCompatImageView imageView, @DrawableRes int res) { 27 | if (res != 0) { 28 | imageView.setBackgroundResource(res); 29 | } 30 | } 31 | 32 | // @BindingAdapter({"itmes"}) 33 | // public static void addItem(RecyclerView recyclerView, ObservableList it) { 34 | // BaseRecyclerViewAdapter adapter = (BaseRecyclerViewAdapter) recyclerView.getAdapter(); 35 | // if (adapter != null) { 36 | // adapter.onSetItem(it); 37 | // } 38 | // } 39 | // 40 | // @BindingAdapter({"setItmes"}) 41 | // public static void setItem(RecyclerView recyclerView, ObservableList it) { 42 | // if (it != null) { 43 | // recyclerView.setAdapter(new PatientsAdapter((ObservableList) it, 44 | // R.layout.item_new, 45 | // 0)); 46 | // } 47 | // 48 | // } 49 | 50 | @BindingAdapter({"listener"}) 51 | public static void setListener(RecyclerView recyclerView, List it) { 52 | BaseRecyclerViewAdapter adapter = (BaseRecyclerViewAdapter) recyclerView.getAdapter(); 53 | 54 | } 55 | 56 | 57 | } 58 | -------------------------------------------------------------------------------- /app/src/main/java/com/just/machine/model/Canstants.kt: -------------------------------------------------------------------------------- 1 | package com.just.machine.model 2 | 3 | interface Constants { 4 | companion object { 5 | const val succeedName = "首页" 6 | const val succeed = "交班" 7 | const val news = "首页" 8 | const val me = "我的" 9 | const val setting = "设置" 10 | const val orderManger = "订单管理" 11 | const val dialog = "dialog"//loading弹窗文案 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /app/src/main/java/com/just/machine/model/LoginBean.kt: -------------------------------------------------------------------------------- 1 | package com.just.machine.model 2 | 3 | data class LoginBean( 4 | var username: String? = "", 5 | var password: String? = "", 6 | var code: String? = "", 7 | var appid: String? = "", 8 | ) -------------------------------------------------------------------------------- /app/src/main/java/com/just/machine/model/LoginData.kt: -------------------------------------------------------------------------------- 1 | package com.just.machine.model 2 | 3 | data class LoginData( 4 | val token: String, 5 | val tenantId: String, 6 | val adminInfo: AdminInfo 7 | ) 8 | 9 | data class AdminInfo( 10 | val username: String, 11 | val avatar: String, 12 | val openid: String, 13 | val mobile: String, 14 | val mail: String, 15 | val gender: Int, 16 | val roleIds: List, 17 | val addTime: String 18 | ) -------------------------------------------------------------------------------- /app/src/main/java/com/just/machine/model/NewResponse.kt: -------------------------------------------------------------------------------- 1 | package com.just.machine.model 2 | 3 | /** 4 | *create by 2020/6/19 5 | *@author zt 6 | */ 7 | data class NewResponse( 8 | val errno: String, 9 | val errmsg: String, 10 | val data: T 11 | ) -------------------------------------------------------------------------------- /app/src/main/java/com/just/machine/model/OrderListBean.kt: -------------------------------------------------------------------------------- 1 | package com.just.machine.model 2 | 3 | /** 4 | * 表示列表查询参数的数据类。 5 | * 6 | * @property page 页码,用于分页。默认为 1。 7 | * @property limit 每页显示的项目数量。默认为 50。 8 | * @property showType 显示类型,例如 '0' 表示默认类型。默认为 '0'。 9 | * @property shipSn 运输序列号,可以为空。默认为 null。 10 | * @property goodsId 商品 ID,可以为空。默认为 null。 11 | * @property brandId 品牌 ID,可以为空。默认为 null。 12 | * @property mobile 关联订单的手机号,可以为空。默认为 null。 13 | * @property orderSn 订单序列号,可以为空。默认为 null。 14 | * @property timeArray 时间过滤数组。默认为空列表。 15 | * @property orderStatusArray 订单状态过滤数组。默认为空列表。 16 | * @property sort 排序字段,例如 'add_time'。默认为 'add_time'。 17 | * @property order 排序方式,例如 'desc' 表示降序。默认为 'desc'。 18 | */ 19 | data class OrderListBean( 20 | val page: Int = 1, // 页码,默认为 1 21 | val limit: Int = 50, // 每页显示的项目数量,默认为 50 22 | val showType: String = "0", // 显示类型,默认为 '0' 23 | val shipSn: String? = null, // 运输序列号,默认为 null 24 | val goodsId: String? = null, // 商品 ID,默认为 null 25 | val brandId: String? = null, // 品牌 ID,默认为 null 26 | val mobile: String? = null, // 手机号,默认为 null 27 | val orderSn: String? = null, // 订单序列号,默认为 null 28 | val timeArray: List = emptyList(), // 时间过滤数组,默认为空列表 29 | val orderStatusArray: List = emptyList(), // 订单状态过滤数组,默认为空列表 30 | val sort: String = "add_time", // 排序字段,默认为 'add_time' 31 | val order: String = "desc" // 排序方式,默认为 'desc' 32 | ) -------------------------------------------------------------------------------- /app/src/main/java/com/just/machine/model/OrdersShipmentsBean.kt: -------------------------------------------------------------------------------- 1 | package com.just.machine.model 2 | 3 | data class OrdersShipmentsBean( 4 | var orders: MutableList? = ArrayList() 5 | ) -------------------------------------------------------------------------------- /app/src/main/java/com/just/machine/ui/activity/LoginActivity.kt: -------------------------------------------------------------------------------- 1 | package com.just.machine.ui.activity 2 | 3 | import android.content.Context 4 | import android.content.Intent 5 | import androidx.activity.viewModels 6 | import com.common.base.CommonBaseActivity 7 | import com.just.news.databinding.ActivityLoginBinding 8 | import com.just.machine.ui.viewmodel.MainViewModel 9 | import dagger.hilt.android.AndroidEntryPoint 10 | 11 | @AndroidEntryPoint 12 | class LoginActivity : CommonBaseActivity() {//布局ID 13 | 14 | private val viewModel by viewModels()//委托 15 | 16 | companion object { 17 | /** 18 | * @param context - 19 | */ 20 | fun startJUSTLoginActivity(context: Context) { 21 | val intent = Intent(context, LoginActivity::class.java) 22 | context.startActivity(intent) 23 | } 24 | } 25 | 26 | override fun initView() { 27 | 28 | } 29 | 30 | override fun getViewBinding() = ActivityLoginBinding.inflate(layoutInflater) 31 | 32 | } -------------------------------------------------------------------------------- /app/src/main/java/com/just/machine/ui/activity/MainActivity.kt: -------------------------------------------------------------------------------- 1 | package com.just.machine.ui.activity 2 | 3 | import android.content.Context 4 | import android.content.Intent 5 | import androidx.navigation.Navigation 6 | import androidx.navigation.fragment.NavHostFragment 7 | import com.common.base.CommonBaseActivity 8 | import com.just.news.R 9 | import com.just.news.databinding.ActivityMainBinding 10 | import com.justsafe.libview.nav.FragmentNavigatorHideShow 11 | import dagger.hilt.android.AndroidEntryPoint 12 | 13 | @AndroidEntryPoint 14 | class MainActivity : CommonBaseActivity() { 15 | 16 | companion object { 17 | /** 18 | * @param context -跳转主界面 19 | */ 20 | fun startMainActivity(context: Context?) { 21 | val intent = Intent(context, MainActivity::class.java) 22 | intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TOP 23 | context?.startActivity(intent) 24 | } 25 | } 26 | 27 | override fun initView() { 28 | initNavigationView() 29 | } 30 | 31 | private fun initNavigationView() { 32 | val navHostFragment = 33 | supportFragmentManager.findFragmentById(R.id.main_layout) as NavHostFragment 34 | val navControllerNavigation = Navigation.findNavController(this, R.id.main_layout) 35 | val navigator = 36 | FragmentNavigatorHideShow(this, navHostFragment.childFragmentManager, R.id.main_layout) 37 | navControllerNavigation.navigatorProvider.addNavigator(navigator) 38 | navControllerNavigation.setGraph(R.navigation.nav_main) 39 | } 40 | 41 | 42 | override fun getViewBinding() = ActivityMainBinding.inflate(layoutInflater) 43 | 44 | } 45 | -------------------------------------------------------------------------------- /app/src/main/java/com/just/machine/ui/activity/WelComeActivity.kt: -------------------------------------------------------------------------------- 1 | package com.just.machine.ui.activity 2 | 3 | import com.common.base.CommonBaseActivity 4 | import com.just.news.databinding.ActivityLoginBinding 5 | import com.just.news.databinding.ActivityWelcomeBinding 6 | import dagger.hilt.android.AndroidEntryPoint 7 | 8 | @AndroidEntryPoint 9 | class WelComeActivity : CommonBaseActivity() { 10 | 11 | override fun initView() {} 12 | 13 | override fun getViewBinding() = ActivityWelcomeBinding.inflate(layoutInflater) 14 | } -------------------------------------------------------------------------------- /app/src/main/java/com/just/machine/ui/adapter/GoodsAdapter.kt: -------------------------------------------------------------------------------- 1 | package com.just.machine.ui.adapter 2 | 3 | import android.content.Context 4 | import com.common.base.BaseRecyclerViewAdapter 5 | import com.just.machine.helper.GlideApp 6 | import com.just.machine.model.Goods 7 | import com.just.news.R 8 | import com.just.news.databinding.ItemGoodsBinding 9 | 10 | //单向绑定适配器,用dataBanding去绑定item里的控件参数 11 | //(双向绑定的话得用ObserveList之类的参数要修改适配器) 12 | class GoodsAdapter(val context: Context) : 13 | BaseRecyclerViewAdapter() { 14 | 15 | override fun bindData(item: Goods, position: Int) { 16 | binding.item = item 17 | GlideApp.loadImage(context,item.picUrl,binding.image) 18 | } 19 | 20 | override fun getLayoutRes(): Int { 21 | return R.layout.item_goods 22 | } 23 | } -------------------------------------------------------------------------------- /app/src/main/java/com/just/machine/ui/dialog/LoadingDialogFragment.kt: -------------------------------------------------------------------------------- 1 | package com.just.machine.ui.dialog 2 | 3 | import android.app.Dialog 4 | import android.os.Bundle 5 | import androidx.fragment.app.FragmentManager 6 | import com.common.base.BaseDialogFragment 7 | import com.just.machine.model.Constants 8 | import com.just.news.R 9 | import com.just.news.databinding.FragmentDialogLoadingBinding 10 | /** 11 | * 订单详情弹窗 12 | */ 13 | class LoadingDialogFragment: BaseDialogFragment() { 14 | 15 | private var dialogContent = "" 16 | 17 | companion object { 18 | /** 19 | * @param fragmentManager FragmentManager 20 | */ 21 | fun startLoadingDialogFragment( 22 | fragmentManager: FragmentManager, 23 | content:String 24 | ): LoadingDialogFragment { 25 | 26 | val dialogFragment = LoadingDialogFragment() 27 | dialogFragment.show( 28 | fragmentManager, 29 | LoadingDialogFragment::javaClass.toString() 30 | ) 31 | 32 | val bundle = Bundle() 33 | 34 | bundle.putString(Constants.dialog, content) 35 | 36 | dialogFragment.arguments = bundle 37 | 38 | return dialogFragment 39 | } 40 | } 41 | 42 | override fun start(dialog: Dialog?) { 43 | dialog?.setCancelable(false) 44 | dialog?.setCanceledOnTouchOutside(false) 45 | } 46 | 47 | override fun initView() { 48 | binding.loadingTips.text = dialogContent 49 | } 50 | 51 | override fun initListener() { 52 | 53 | } 54 | 55 | override fun initData() { 56 | dialogContent = arguments?.getString(Constants.dialog, "").toString() 57 | } 58 | 59 | override fun getLayout(): Int { 60 | return R.layout.fragment_dialog_loading 61 | } 62 | } -------------------------------------------------------------------------------- /app/src/main/java/com/just/machine/ui/fragment/MainFragment.kt: -------------------------------------------------------------------------------- 1 | package com.just.machine.ui.fragment 2 | 3 | import android.view.LayoutInflater 4 | import android.view.ViewGroup 5 | import androidx.fragment.app.viewModels 6 | import com.common.base.CommonBaseFragment 7 | import com.common.base.gone 8 | import com.common.base.setNoRepeatListener 9 | import com.common.viewmodel.LiveDataEvent 10 | import com.just.news.R 11 | import com.just.news.databinding.FragmentMainBinding 12 | import com.just.machine.model.Constants 13 | import com.just.machine.ui.viewmodel.MainViewModel 14 | import dagger.hilt.android.AndroidEntryPoint 15 | import com.common.base.toast 16 | 17 | 18 | /** 19 | *create by 2024/6/19 20 | * 主界面 21 | *@author zt 22 | */ 23 | @AndroidEntryPoint 24 | class MainFragment : CommonBaseFragment() { 25 | 26 | private val viewModel by viewModels() 27 | 28 | 29 | override fun loadData() {//懒加载 30 | } 31 | 32 | override fun initView() { 33 | initToolbar() 34 | 35 | binding.btnOrder.setOnClickListener { 36 | navigate(it, R.id.orderFragment) 37 | } 38 | 39 | binding.llOrder.setNoRepeatListener { 40 | navigate(it, R.id.orderFragment) 41 | } 42 | 43 | viewModel.getDates("")//插入或者请求网络数据 44 | 45 | viewModel.getPlant() 46 | 47 | viewModel.mEventHub.observe(this) { 48 | when (it.action) { 49 | LiveDataEvent.LOGIN_FAIL or LiveDataEvent.JUST_ERROR_FAIL -> {//请求成功返回 50 | 51 | } 52 | 53 | LiveDataEvent.LOGIN_FAIL -> {//请求失败返回 54 | if (it.any is String) { 55 | toast(it.toString()) 56 | } 57 | } 58 | } 59 | } 60 | } 61 | 62 | 63 | private fun initToolbar() { 64 | binding.toolbar.title = Constants.succeedName 65 | binding.toolbar.tvRight.gone() 66 | binding.toolbar.ivTitleBack.gone() 67 | } 68 | 69 | 70 | override fun getViewBinding(inflater: LayoutInflater, container: ViewGroup?) = 71 | FragmentMainBinding.inflate(inflater, container, false) 72 | 73 | } -------------------------------------------------------------------------------- /app/src/main/java/com/just/machine/ui/fragment/MeFragment.kt: -------------------------------------------------------------------------------- 1 | package com.just.machine.ui.fragment 2 | 3 | import android.view.LayoutInflater 4 | import android.view.ViewGroup 5 | import androidx.fragment.app.viewModels 6 | import androidx.navigation.fragment.findNavController 7 | import com.common.base.CommonBaseFragment 8 | import com.common.base.gone 9 | import com.common.network.LogUtils 10 | import com.just.machine.model.Constants 11 | import com.just.news.R 12 | import com.just.news.databinding.FragmentMeBinding 13 | import com.just.machine.ui.viewmodel.MainViewModel 14 | import dagger.hilt.android.AndroidEntryPoint 15 | 16 | 17 | /** 18 | *create by 2020/6/19 19 | *@author zt 20 | */ 21 | @AndroidEntryPoint 22 | class MeFragment : CommonBaseFragment() { 23 | 24 | private val viewModel by viewModels() 25 | 26 | override fun loadData() {//懒加载 27 | 28 | } 29 | 30 | private fun initToolbar() { 31 | binding.toolbar.title = Constants.me//标题 32 | binding.toolbar.tvRight.gone() 33 | binding.toolbar.ivTitleBack.gone() 34 | } 35 | 36 | override fun initView() { 37 | initToolbar() 38 | 39 | binding.btnMe.setOnClickListener { 40 | navigate(it, R.id.settingFragment)//fragment跳转 41 | } 42 | 43 | val navController = findNavController()//fragment返回数据处理 44 | 45 | navController.currentBackStackEntry?.savedStateHandle?.getLiveData("key") 46 | ?.observe(this 47 | ) { 48 | LogUtils.e(TAG + it.toString()) 49 | } 50 | 51 | } 52 | 53 | override fun getViewBinding(inflater: LayoutInflater, container: ViewGroup?) = 54 | FragmentMeBinding.inflate(inflater, container, false) 55 | 56 | } 57 | -------------------------------------------------------------------------------- /app/src/main/java/com/just/machine/ui/fragment/NewFragment.kt: -------------------------------------------------------------------------------- 1 | package com.just.machine.ui.fragment 2 | 3 | import android.annotation.SuppressLint 4 | import android.view.LayoutInflater 5 | import android.view.ViewGroup 6 | import androidx.navigation.Navigation 7 | import com.common.base.* 8 | import com.just.machine.model.Constants 9 | import com.just.news.databinding.FragmentNewBinding 10 | import dagger.hilt.android.AndroidEntryPoint 11 | 12 | /** 13 | *create by 2020/6/19 14 | *@author zt 15 | */ 16 | @AndroidEntryPoint 17 | class NewFragment : CommonBaseFragment() { 18 | 19 | private fun initToolbar() { 20 | binding.toolbar.title = Constants.news//标题 21 | binding.toolbar.tvRight.gone() 22 | binding.toolbar.ivTitleBack.visible() 23 | } 24 | 25 | @SuppressLint("UseRequireInsteadOfGet") 26 | override fun initView() { 27 | initToolbar() 28 | } 29 | 30 | override fun loadData() { 31 | binding.toolbar.ivTitleBack.setNoRepeatListener { 32 | Navigation.findNavController(it).popBackStack() 33 | } 34 | } 35 | 36 | override fun getViewBinding(inflater: LayoutInflater, container: ViewGroup?) = 37 | FragmentNewBinding.inflate(inflater, container, false) 38 | } -------------------------------------------------------------------------------- /app/src/main/java/com/just/machine/ui/fragment/SettingFragment.kt: -------------------------------------------------------------------------------- 1 | package com.just.machine.ui.fragment 2 | 3 | import android.view.LayoutInflater 4 | import android.view.ViewGroup 5 | import androidx.navigation.fragment.findNavController 6 | import com.common.base.CommonBaseFragment 7 | import com.just.news.databinding.FragmentSettingBinding 8 | import com.just.machine.model.Constants 9 | import dagger.hilt.android.AndroidEntryPoint 10 | 11 | /** 12 | *create by 2020/6/19 13 | * 设置界面 14 | *@author zt 15 | */ 16 | @AndroidEntryPoint 17 | class SettingFragment : CommonBaseFragment() { 18 | 19 | override fun initView() { 20 | initToolbar() 21 | } 22 | 23 | private fun initToolbar() { 24 | binding.toolbar.title = Constants.setting//标题 25 | binding.toolbar.ivTitleBack.setOnClickListener {//返回 26 | val navController = findNavController()//fragment返回数据处理 27 | navController.previousBackStackEntry?.savedStateHandle?.set("key", "傻逼") 28 | navController.popBackStack() 29 | } 30 | } 31 | 32 | override fun loadData() { 33 | 34 | } 35 | 36 | override fun getViewBinding(inflater: LayoutInflater, container: ViewGroup?) = 37 | FragmentSettingBinding.inflate(inflater, container, false) 38 | 39 | } 40 | -------------------------------------------------------------------------------- /app/src/main/java/com/just/machine/workers/SeedDatabaseWorker.kt: -------------------------------------------------------------------------------- 1 | package com.just.machine.workers 2 | 3 | import android.content.Context 4 | import android.util.Log 5 | import androidx.work.CoroutineWorker 6 | import androidx.work.WorkerParameters 7 | import com.google.gson.Gson 8 | import com.google.gson.reflect.TypeToken 9 | import com.google.gson.stream.JsonReader 10 | import com.just.machine.dao.AppDatabase 11 | import com.just.machine.dao.Plant 12 | import kotlinx.coroutines.Dispatchers 13 | import kotlinx.coroutines.withContext 14 | 15 | class SeedDatabaseWorker( 16 | context: Context, 17 | workerParams: WorkerParameters 18 | ) : CoroutineWorker(context, workerParams) { 19 | override suspend fun doWork(): Result = withContext(Dispatchers.IO) { 20 | try { 21 | val filename = inputData.getString(KEY_FILENAME) 22 | if (filename != null) { 23 | applicationContext.assets.open(filename).use { inputStream -> 24 | JsonReader(inputStream.reader()).use { jsonReader -> 25 | val plantType = object : TypeToken>() {}.type 26 | val plantList: List = Gson().fromJson(jsonReader, plantType) 27 | 28 | val database = AppDatabase.getInstance(applicationContext) 29 | database.plantDao().insertAll(plantList) 30 | 31 | Result.success() 32 | } 33 | } 34 | } else { 35 | Log.e(TAG, "Error seeding database - no valid filename") 36 | Result.failure() 37 | } 38 | } catch (ex: Exception) { 39 | Log.e(TAG, "Error seeding database", ex) 40 | Result.failure() 41 | } 42 | } 43 | 44 | companion object { 45 | private const val TAG = "SeedDatabaseWorker" 46 | const val KEY_FILENAME = "PLANT_DATA_FILENAME" 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /app/src/main/res/color/main_bottom_tab_color.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/arrow_back.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/bg_input.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/check_click_yes.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 14 | 17 | 18 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/check_no.xml: -------------------------------------------------------------------------------- 1 | 6 | 11 | 16 | 17 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/custom_checkbox_selector.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_back.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_home.xml: -------------------------------------------------------------------------------- 1 | 3 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_home_on.xml: -------------------------------------------------------------------------------- 1 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_new.xml: -------------------------------------------------------------------------------- 1 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_new_on.xml: -------------------------------------------------------------------------------- 1 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_personal.xml: -------------------------------------------------------------------------------- 1 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_personal_on.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 12 | 15 | 16 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/main_home.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/main_new.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/main_personal.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/order.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 12 | 15 | 18 | 21 | 24 | 27 | 30 | 33 | 34 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/order_bg.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/succeed_blue_btn.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_login.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | 8 | 9 | 13 | 14 | 17 | 18 | 25 | 26 | 27 | 28 | 29 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_main.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 16 | 17 | 20 | 26 | 27 | 28 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_organization.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_succeed_prison.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 12 | 13 | 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_web.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_welcome.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /app/src/main/res/layout/dialog_fragment_all.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 14 | 15 | 23 | 24 | 29 | 30 |