cloudroam
2025-04-10 5fc9567cfa6b6beee4f52a9f835f304865d693e1
add: 消息提醒后版本
已删除3个文件
已修改33个文件
已添加14个文件
2372 ■■■■ 文件已修改
app/build.gradle 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/AndroidManifest.xml 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/ic_launcher-playstore.png 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/example/firstapp/App.kt 109 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/example/firstapp/activity/ReminderListActivity.kt 56 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/example/firstapp/activity/ReminderSettingsActivity.kt 176 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/example/firstapp/adapter/ReminderAdapter.kt 67 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/example/firstapp/adapter/ReminderRecordAdapter.kt 72 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/example/firstapp/core/Core.kt 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/example/firstapp/database/AppDatabase.kt 51 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/example/firstapp/database/dao/ReminderDao.kt 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/example/firstapp/database/dao/ReminderRecordDao.kt 32 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/example/firstapp/database/entity/Reminder.kt 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/example/firstapp/database/entity/ReminderRecord.kt 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/example/firstapp/database/repository/ReminderRecordRepository.kt 40 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/example/firstapp/database/repository/ReminderRepository.kt 31 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/example/firstapp/database/response/CheckNewContentResponse.kt 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/example/firstapp/database/service/ApiService.kt 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/example/firstapp/service/ReminderWorker.kt 243 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/example/firstapp/ui/dashboard/ReminderRecordViewModel.kt 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/example/firstapp/ui/dashboard/ReminderViewModel.kt 33 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/example/firstapp/ui/home/HomeFragment.kt 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/example/firstapp/ui/notifications/NotificationsFragment.kt 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/example/firstapp/ui/reminder/ReminderSettingsFragment.kt 105 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/example/firstapp/ui/reminder/ReminderViewModel.kt 33 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/example/firstapp/utils/PreferencesManager.kt 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/drawable/ic_launcher_background.xml 171 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/drawable/ic_launcher_foreground.xml 174 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/drawable/ic_reminder.xml 157 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/layout/activity_reminder_list.xml 38 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/layout/activity_reminder_settings.xml 261 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/layout/fragment_home.xml 50 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/layout/fragment_reminder_settings.xml 146 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/layout/item_reminder.xml 65 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/layout/item_reminder_record.xml 58 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/mipmap-hdpi/ic_launcher.webp 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/mipmap-hdpi/ic_launcher_round.webp 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/mipmap-mdpi/ic_launcher.webp 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/mipmap-mdpi/ic_launcher_round.webp 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/mipmap-xhdpi/ic_launcher.webp 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/mipmap-xxhdpi/ic_launcher.webp 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/navigation/mobile_navigation.xml 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/x-library.gradle 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
gradle.properties 14 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/build.gradle
@@ -3,7 +3,8 @@
    alias(libs.plugins.jetbrains.kotlin.android)
//    id 'com.android.application'
    id 'kotlin-android'
    id 'kotlin-kapt'
//    id 'kotlin-kapt'
    id 'com.google.devtools.ksp' version '1.9.0-1.0.13'
    id 'kotlin-parcelize'
//    id 'img-optimizer'
//    id 'com.yanzhenjie.andserver'
@@ -218,7 +219,8 @@
    //noinspection GradleDependency
    implementation "androidx.room:room-rxjava2:$room_version"
    //noinspection KaptUsageInsteadOfKsp
    kapt "androidx.room:room-compiler:$room_version"
//    kapt "androidx.room:room-compiler:$room_version"
    ksp "androidx.room:room-compiler:$room_version"
    //CodeView:https://github.com/AmrDeveloper/CodeView
    implementation 'io.github.amrdeveloper:codeview:1.3.9'
@@ -274,7 +276,8 @@
    //HTTP服务器:https://github.com/yanzhenjie/AndServer
    implementation 'cn.ppps.andserver:api:2.1.12'
    kapt 'cn.ppps.andserver:processor:2.1.12'
//    kapt 'cn.ppps.andserver:processor:2.1.12'
    ksp 'cn.ppps.andserver:processor:2.1.12'
    //Location 是一个通过 Android 自带的 LocationManager 来实现的定位功能:https://github.com/jenly1314/Location
    implementation 'com.github.pppscn:location:1.0.0'
app/src/main/AndroidManifest.xml
@@ -140,10 +140,11 @@
            android:theme="@style/Theme.ContentDetail" />
        <activity
            android:name=".ui.profile.EditProfileActivity"
            android:exported="false" />
            android:exported="false"/>
        <activity
            android:name=".ui.invitation.InvitationActivity"
            android:exported="false" />
            android:exported="false"/>
    </application>
</manifest>
app/src/main/ic_launcher-playstore.png
app/src/main/java/com/example/firstapp/App.kt
@@ -11,23 +11,15 @@
import androidx.annotation.NonNull
import androidx.lifecycle.MutableLiveData
import androidx.multidex.MultiDex
import androidx.work.Configuration
import androidx.work.WorkManager
import androidx.work.*
import com.example.firstapp.core.Core
import com.example.firstapp.database.repository.CodeRepository
import com.example.firstapp.database.repository.KeywordRepository
import com.example.firstapp.database.repository.MsgRepository
import com.example.firstapp.database.repository.ReminderRepository
import com.example.firstapp.database.service.RetrofitClient
import com.example.firstapp.receiver.CactusReceiver
import com.example.firstapp.utils.AppInfo
import com.example.firstapp.utils.FRONT_CHANNEL_ID
import com.example.firstapp.utils.FRONT_CHANNEL_NAME
import com.example.firstapp.utils.FRONT_NOTIFY_ID
import com.example.firstapp.utils.FRPC_LIB_VERSION
import com.example.firstapp.utils.Log
import com.example.firstapp.utils.PreferencesManager
import com.example.firstapp.utils.SettingUtils
import com.example.firstapp.service.ReminderWorker
import com.example.firstapp.utils.*
import com.example.firstapp.utils.tinker.TinkerLoadLibrary
import com.gyf.cactus.Cactus
import com.gyf.cactus.callback.CactusCallback
@@ -44,17 +36,15 @@
import java.io.FileWriter
import java.io.IOException
import java.text.SimpleDateFormat
import java.util.Date
import java.util.Locale
import java.util.*
@Suppress("DEPRECATION")
class App : Application(), CactusCallback, Configuration.Provider by Core {
class App : Application(), CactusCallback, Configuration.Provider {
    val applicationScope = CoroutineScope(SupervisorJob())
    val database by lazy { AppDatabase.getInstance(this) }
    val msgRepository by lazy { MsgRepository(database.msgDao()) }
    val codeRepository by lazy { CodeRepository(database.codeDao()) }
    val reminderRepository by lazy { ReminderRepository(database.reminderDao()) }
    val keywordRepository by lazy { KeywordRepository(RetrofitClient.apiService,database.keywordDao()) }
    companion object {
@@ -133,7 +123,6 @@
            } catch (ex: IOException) {
                ex.printStackTrace()
            }
            //使用默认的处理方式让APP停止运行
            defaultHandler?.uncaughtException(thread, throwable)
        }
@@ -141,12 +130,20 @@
            context = applicationContext
            initLibs()
            PreferencesManager.init(this)
            //纯客户端模式
            if (SettingUtils.enablePureClientMode) return
            //初始化WorkManager
//            WorkManager.initialize(this, Configuration.Builder().build())
            try {
                if (SettingUtils.enablePureClientMode) return
            } catch (e: Exception) {
                // 捕获SettingUtils未初始化的异常
                Log.e(TAG, "SettingUtils未初始化: ${e.message}")
                // 继续执行后续代码,不返回
            }
            // 初始化WorkManager
            WorkManager.initialize(this, getWorkManagerConfiguration())
            // 设置定时检查提醒的WorkManager
            setupReminderWorker()
            //动态加载FrpcLib
            val libPath = filesDir.absolutePath + "/libs"
@@ -285,7 +282,7 @@
    @NonNull
    override fun getWorkManagerConfiguration(): Configuration {
        return Configuration.Builder()
            .setMinimumLoggingLevel(android.util.Log.DEBUG) // 设置日志级别
            .setMinimumLoggingLevel(android.util.Log.DEBUG)
            .build()
    }
@@ -296,39 +293,39 @@
        Core.init(this)
        Log.init(applicationContext)
        // 配置文件初始化
       /* SharedPreference.init(applicationContext)
        SharedPreference.init(applicationContext)
        // X系列基础库初始化
//        XBasicLibInit.init(this)
        // 初始化日志打印
        isDebug = SettingUtils.enableDebugMode
        Log.init(applicationContext)
        // 转发历史工具类初始化
        HistoryUtils.init(applicationContext)
//        HistoryUtils.init(applicationContext)
        // 版本更新初始化
//        XUpdateInit.init(this)
        // 运营统计数据
//        UMengInit.init(this)
        // 初始化语种切换框架
        MultiLanguages.init(this)
//        MultiLanguages.init(this)
        // 设置语种变化监听器
        MultiLanguages.setOnLanguageListener(object : OnLanguageListener {
            override fun onAppLocaleChange(oldLocale: Locale, newLocale: Locale) {
                // 注意:只有setAppLanguage时触发,clearAppLanguage时不触发
                Log.i(TAG, "监听到应用切换了语种,旧语种:$oldLocale,新语种:$newLocale")
                switchLanguage(newLocale)
            }
            override fun onSystemLocaleChange(oldLocale: Locale, newLocale: Locale) {
                Log.i(TAG, "监听到系统切换了语种,旧语种:$oldLocale,新语种:$newLocale")
                switchLanguage(newLocale)
                *//*val isFlowSystem = SettingUtils.isFlowSystemLanguage //MultiLanguages.isSystemLanguage(context)取值不对,一直是false
                Log.i(TAG, "监听到系统切换了语种,旧语种:$oldLocale,新语种:$newLocale,是否跟随系统:$isFlowSystem")
                if (isFlowSystem) {
                    CommonUtils.switchLanguage(oldLocale, newLocale)
                }*//*
            }
        })
        switchLanguage(MultiLanguages.getAppLanguage(this))*/
//        MultiLanguages.setOnLanguageListener(object : OnLanguageListener {
//            override fun onAppLocaleChange(oldLocale: Locale, newLocale: Locale) {
//                // 注意:只有setAppLanguage时触发,clearAppLanguage时不触发
//                Log.i(TAG, "监听到应用切换了语种,旧语种:$oldLocale,新语种:$newLocale")
//                switchLanguage(newLocale)
//            }
//
//            override fun onSystemLocaleChange(oldLocale: Locale, newLocale: Locale) {
//                Log.i(TAG, "监听到系统切换了语种,旧语种:$oldLocale,新语种:$newLocale")
//                switchLanguage(newLocale)
//                *//*val isFlowSystem = SettingUtils.isFlowSystemLanguage //MultiLanguages.isSystemLanguage(context)取值不对,一直是false
//                Log.i(TAG, "监听到系统切换了语种,旧语种:$oldLocale,新语种:$newLocale,是否跟随系统:$isFlowSystem")
//                if (isFlowSystem) {
//                    CommonUtils.switchLanguage(oldLocale, newLocale)
//                }*//*
//            }
//        })
//        switchLanguage(MultiLanguages.getAppLanguage(this))
    }
    @SuppressLint("CheckResult")
@@ -451,4 +448,32 @@
//        )
//    }
    /**
     * 设置定时提醒Worker
     * 配置为每天运行一次检查是否有新的提醒内容
     */
    private fun setupReminderWorker() {
        Log.d(TAG, "设置定时提醒Worker")
        val constraints = Constraints.Builder()
            .setRequiredNetworkType(NetworkType.CONNECTED)
            .build()
        // 创建周期性工作请求
        val reminderWorkRequest = PeriodicWorkRequestBuilder<ReminderWorker>(
            ReminderWorker.REPEAT_INTERVAL,
            ReminderWorker.REPEAT_INTERVAL_TIME_UNIT
        )
            .setConstraints(constraints)
            .addTag("reminder_worker")
            .build()
        // 使用 REPLACE 策略确保新配置生效
        WorkManager.getInstance(this).enqueueUniquePeriodicWork(
            "reminder_work",
            ExistingPeriodicWorkPolicy.REPLACE,
            reminderWorkRequest
        )
    }
}
app/src/main/java/com/example/firstapp/activity/ReminderListActivity.kt
对比新文件
@@ -0,0 +1,56 @@
package com.example.firstapp.activity
import android.content.Intent
import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
import androidx.lifecycle.ViewModelProvider
import androidx.lifecycle.lifecycleScope
import androidx.recyclerview.widget.LinearLayoutManager
import com.example.firstapp.adapter.ReminderRecordAdapter
import com.example.firstapp.database.entity.ReminderRecord
import com.example.firstapp.databinding.ActivityReminderListBinding
import com.example.firstapp.ui.dashboard.ReminderRecordViewModel
import kotlinx.coroutines.launch
class ReminderListActivity : AppCompatActivity() {
    private lateinit var binding: ActivityReminderListBinding
    private lateinit var viewModel: ReminderRecordViewModel
    private lateinit var adapter: ReminderRecordAdapter
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = ActivityReminderListBinding.inflate(layoutInflater)
        setContentView(binding.root)
        viewModel = ViewModelProvider(this)[ReminderRecordViewModel::class.java]
        setupRecyclerView()
        setupClickListeners()
        observeRecords()
    }
    private fun setupRecyclerView() {
        adapter = ReminderRecordAdapter { record ->
            // 点击提醒记录时,标记为已读
            lifecycleScope.launch {
                viewModel.updateRecordStatus(record.id, ReminderRecord.STATUS_READ)
            }
        }
        binding.reminderRecyclerView.apply {
            layoutManager = LinearLayoutManager(this@ReminderListActivity)
            adapter = this@ReminderListActivity.adapter
        }
    }
    private fun setupClickListeners() {
        binding.addReminderButton.setOnClickListener {
            startActivity(Intent(this, ReminderSettingsActivity::class.java))
        }
    }
    private fun observeRecords() {
        viewModel.reminderRecords.observe(this) { records ->
            adapter.submitList(records)
        }
    }
}
app/src/main/java/com/example/firstapp/activity/ReminderSettingsActivity.kt
对比新文件
@@ -0,0 +1,176 @@
package com.example.firstapp.activity
import android.content.Intent
import android.os.Bundle
import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity
import androidx.lifecycle.ViewModelProvider
import androidx.lifecycle.lifecycleScope
import com.example.firstapp.databinding.ActivityReminderSettingsBinding
import com.example.firstapp.model.CategoryConfig
import com.example.firstapp.database.entity.Reminder
import com.example.firstapp.utils.PreferencesManager
import com.example.firstapp.ui.dashboard.ReminderViewModel
import kotlinx.coroutines.launch
class ReminderSettingsActivity : AppCompatActivity() {
    private lateinit var binding: ActivityReminderSettingsBinding
    private lateinit var viewModel: ReminderViewModel
    private var isInitializing = true
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = ActivityReminderSettingsBinding.inflate(layoutInflater)
        setContentView(binding.root)
        viewModel = ViewModelProvider(this)[ReminderViewModel::class.java]
        setupCheckBoxes()
        setupSaveButton()
        loadExistingSettings()
    }
    private fun setupCheckBoxes() {
        // 全选分类按钮逻辑
        binding.tvSelectAll.setOnClickListener {
            val shouldCheck = !(binding.checkBoxExpress.isChecked && binding.checkBoxFinance.isChecked &&
                    binding.checkBoxIncome.isChecked && binding.checkBoxFlight.isChecked && binding.checkBoxTrain.isChecked)
            binding.checkBoxExpress.isChecked = shouldCheck
            binding.checkBoxFinance.isChecked = shouldCheck
            binding.checkBoxIncome.isChecked = shouldCheck
            binding.checkBoxFlight.isChecked = shouldCheck
            binding.checkBoxTrain.isChecked = shouldCheck
        }
        // 全选提醒方式按钮逻辑
        binding.tvSelectAllNotifications.setOnClickListener {
            val shouldCheck = !binding.checkBoxPhone.isChecked
            binding.checkBoxPhone.isChecked = shouldCheck
        }
        // 检查会员状态,非会员只能看到快递和还款
        val savedPhone = PreferencesManager.getPhone()
        if (savedPhone.isNullOrEmpty()) {
            disableVipCategories()
            return
        }
        lifecycleScope.launch {
            try {
                val response = viewModel.getUserInfo(savedPhone)
                if (response.code == "0" && response.data?.isMember == true) {
                    enableAllCategories()
                } else {
                    disableVipCategories()
                }
            } catch (e: Exception) {
                e.printStackTrace()
                disableVipCategories()
            }
        }
    }
    private fun disableVipCategories() {
        binding.apply {
            checkBoxIncome.isEnabled = false
            checkBoxFlight.isEnabled = false
            checkBoxTrain.isEnabled = false
        }
    }
    private fun enableAllCategories() {
        binding.apply {
            checkBoxIncome.isEnabled = true
            checkBoxFlight.isEnabled = true
            checkBoxTrain.isEnabled = true
        }
    }
    private fun loadExistingSettings() {
        isInitializing = true
        viewModel.reminders.observe(this) { reminders ->
            binding.apply {
                checkBoxExpress.isChecked = reminders.any { it.categoryName == "快递" }
                checkBoxFinance.isChecked = reminders.any { it.categoryName == "还款" }
                checkBoxIncome.isChecked = reminders.any { it.categoryName == "收入" }
                checkBoxFlight.isChecked = reminders.any { it.categoryName == "航班" }
                checkBoxTrain.isChecked = reminders.any { it.categoryName == "火车票" }
                // 检查是否有通知方法设置
                checkBoxPhone.isChecked = reminders.any { it.notificationMethod == "PHONE" }
            }
            isInitializing = false
        }
    }
    private fun setupSaveButton() {
        binding.saveButton.setOnClickListener {
            saveSettings()
        }
        // 更改监听器逻辑,不再每次选择都马上保存
        binding.checkBoxPhone.setOnCheckedChangeListener { _, _ ->
            // 不做任何事情,只在保存按钮点击时保存
        }
        binding.checkBoxExpress.setOnCheckedChangeListener { _, _ -> }
        binding.checkBoxFinance.setOnCheckedChangeListener { _, _ -> }
        binding.checkBoxIncome.setOnCheckedChangeListener { _, _ -> }
        binding.checkBoxFlight.setOnCheckedChangeListener { _, _ -> }
        binding.checkBoxTrain.setOnCheckedChangeListener { _, _ -> }
    }
    private fun saveSettings() {
        if (isInitializing) return
        val selectedCategories = mutableListOf<CategoryConfig>()
        binding.apply {
            if (checkBoxExpress.isChecked) selectedCategories.add(CategoryConfig(1, "快递", 1, true))
            if (checkBoxFinance.isChecked) selectedCategories.add(CategoryConfig(2, "还款", 2, true))
            if (checkBoxIncome.isChecked) selectedCategories.add(CategoryConfig(3, "收入", 3, true))
            if (checkBoxFlight.isChecked) selectedCategories.add(CategoryConfig(4, "航班", 4, true))
            if (checkBoxTrain.isChecked) selectedCategories.add(CategoryConfig(5, "火车票", 5, true))
        }
        if (selectedCategories.isEmpty()) {
            Toast.makeText(this, "请选择至少一个分类", Toast.LENGTH_SHORT).show()
            return
        }
        if (!binding.checkBoxPhone.isChecked) {
            Toast.makeText(this, "请选择至少一种提醒方式", Toast.LENGTH_SHORT).show()
            return
        }
        lifecycleScope.launch {
            try {
                // 先删除所有现有提醒
                viewModel.deleteAllReminders()
                // 保存新的提醒设置
                selectedCategories.forEach { category ->
                    val reminder = Reminder(
                        categoryId = category.id,
                        categoryName = category.name,
                        notificationMethod = if (binding.checkBoxPhone.isChecked) "PHONE" else ""
                    )
                    viewModel.insertReminder(reminder)
                }
                // 保存成功,回到主线程处理UI相关操作
                runOnUiThread {
                    Toast.makeText(this@ReminderSettingsActivity, "设置已保存", Toast.LENGTH_SHORT).show()
                    // 关闭当前activity,返回到调用它的activity
                    finish()
                }
            } catch (e: Exception) {
                e.printStackTrace()
                runOnUiThread {
                    Toast.makeText(this@ReminderSettingsActivity, "保存失败: ${e.message}", Toast.LENGTH_SHORT).show()
                }
            }
        }
    }
}
app/src/main/java/com/example/firstapp/adapter/ReminderAdapter.kt
@@ -1,38 +1,59 @@
package com.example.firstapp.adapter
import android.view.LayoutInflater
import android.view.ViewGroup
import androidx.recyclerview.widget.DiffUtil
import androidx.recyclerview.widget.ListAdapter
import androidx.recyclerview.widget.RecyclerView
import com.example.firstapp.database.entity.Reminder
import com.example.firstapp.databinding.ItemReminderBinding
import com.example.firstapp.database.entity.Reminder
class ReminderAdapter(private val onDelete: (Reminder) -> Unit) :
    ListAdapter<Reminder, ReminderAdapter.ReminderViewHolder>(ReminderDiffCallback()) {
class ReminderAdapter(
    private val onItemClick: (Reminder) -> Unit
) : ListAdapter<Reminder, ReminderAdapter.ViewHolder>(ReminderDiffCallback()) {
    class ReminderViewHolder(private val binding: ItemReminderBinding) :
        RecyclerView.ViewHolder(binding.root) {
    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
        val binding = ItemReminderBinding.inflate(
            LayoutInflater.from(parent.context),
            parent,
            false
        )
        return ViewHolder(binding)
    }
        fun bind(reminder: Reminder, onDelete: (Reminder) -> Unit) {
            binding.textNickname.text = reminder.nickname
            //binding.textKeywords.text = reminder.keywords
            binding.btnDelete.setOnClickListener { onDelete(reminder) }
    override fun onBindViewHolder(holder: ViewHolder, position: Int) {
        holder.bind(getItem(position))
    }
    inner class ViewHolder(
        private val binding: ItemReminderBinding
    ) : RecyclerView.ViewHolder(binding.root) {
        init {
            binding.root.setOnClickListener {
                val position = bindingAdapterPosition
                if (position != RecyclerView.NO_POSITION) {
                    onItemClick(getItem(position))
                }
            }
        }
        fun bind(reminder: Reminder) {
            binding.categoryNameText.text = reminder.categoryName
            binding.notificationMethodText.text = when(reminder.notificationMethod) {
                "PHONE" -> "手机通知"
                else -> "未设置"
            }
        }
    }
    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ReminderViewHolder {
        return ReminderViewHolder(
            ItemReminderBinding.inflate(
                LayoutInflater.from(parent.context), parent, false
            )
        )
    }
    private class ReminderDiffCallback : DiffUtil.ItemCallback<Reminder>() {
        override fun areItemsTheSame(oldItem: Reminder, newItem: Reminder): Boolean {
            return oldItem.id == newItem.id
        }
    override fun onBindViewHolder(holder: ReminderViewHolder, position: Int) {
        holder.bind(getItem(position), onDelete)
        override fun areContentsTheSame(oldItem: Reminder, newItem: Reminder): Boolean {
            return oldItem == newItem
        }
    }
}
class ReminderDiffCallback : DiffUtil.ItemCallback<Reminder>() {
    override fun areItemsTheSame(oldItem: Reminder, newItem: Reminder) = oldItem.id == newItem.id
    override fun areContentsTheSame(oldItem: Reminder, newItem: Reminder) = oldItem == newItem
app/src/main/java/com/example/firstapp/adapter/ReminderRecordAdapter.kt
对比新文件
@@ -0,0 +1,72 @@
package com.example.firstapp.adapter
import android.view.LayoutInflater
import android.view.ViewGroup
import androidx.recyclerview.widget.DiffUtil
import androidx.recyclerview.widget.ListAdapter
import androidx.recyclerview.widget.RecyclerView
import com.example.firstapp.R
import com.example.firstapp.database.entity.ReminderRecord
import com.example.firstapp.databinding.ItemReminderRecordBinding
import java.text.SimpleDateFormat
import java.util.*
class ReminderRecordAdapter(
    private val onItemClick: (ReminderRecord) -> Unit
) : ListAdapter<ReminderRecord, ReminderRecordAdapter.ViewHolder>(ReminderRecordDiffCallback()) {
    private val dateFormat = SimpleDateFormat("yyyy-MM-dd HH:mm", Locale.getDefault())
    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
        val binding = ItemReminderRecordBinding.inflate(
            LayoutInflater.from(parent.context),
            parent,
            false
        )
        return ViewHolder(binding)
    }
    override fun onBindViewHolder(holder: ViewHolder, position: Int) {
        holder.bind(getItem(position))
    }
    inner class ViewHolder(
        private val binding: ItemReminderRecordBinding
    ) : RecyclerView.ViewHolder(binding.root) {
        init {
            binding.root.setOnClickListener {
                val position = bindingAdapterPosition
                if (position != RecyclerView.NO_POSITION) {
                    onItemClick(getItem(position))
                }
            }
        }
        fun bind(record: ReminderRecord) {
            binding.apply {
                categoryNameText.text = record.categoryName
                contentText.text = record.content
                timeText.text = dateFormat.format(Date(record.createdAt))
                // 设置状态图标
                statusIcon.setImageResource(
                    if (record.status == ReminderRecord.STATUS_UNREAD)
                        R.drawable.ic_reminder
                    else
                        R.drawable.ic_add
                )
            }
        }
    }
    private class ReminderRecordDiffCallback : DiffUtil.ItemCallback<ReminderRecord>() {
        override fun areItemsTheSame(oldItem: ReminderRecord, newItem: ReminderRecord): Boolean {
            return oldItem.id == newItem.id
        }
        override fun areContentsTheSame(oldItem: ReminderRecord, newItem: ReminderRecord): Boolean {
            return oldItem == newItem
        }
    }
}
app/src/main/java/com/example/firstapp/core/Core.kt
@@ -6,7 +6,6 @@
import com.example.firstapp.database.repository.CodeRepository
import com.example.firstapp.database.repository.KeywordRepository
import com.example.firstapp.database.repository.MsgRepository
import com.example.firstapp.database.repository.ReminderRepository
import kotlinx.coroutines.launch
@@ -16,7 +15,6 @@
    val msg: MsgRepository by lazy { (app as App).msgRepository }
    val code: CodeRepository by lazy { (app as App).codeRepository }
    val keyword: KeywordRepository by lazy { (app as App).keywordRepository }
    val reminder: ReminderRepository by lazy { (app as App).reminderRepository }
    fun init(app: Application) {
        this.app = app
app/src/main/java/com/example/firstapp/database/AppDatabase.kt
@@ -10,32 +10,33 @@
import com.example.firstapp.database.dao.CodeDao
import com.example.firstapp.database.dao.KeywordDao
import com.example.firstapp.database.dao.MsgDao
import com.example.firstapp.database.dao.ReminderDao
import com.example.firstapp.database.entity.Code
import com.example.firstapp.database.entity.KeywordEntity
import com.example.firstapp.database.entity.Msg
import com.example.firstapp.database.entity.Reminder
import com.example.firstapp.utils.DATABASE_NAME
import com.example.firstapp.utils.SettingUtils
import com.example.firstapp.utils.TAG_LIST
import com.example.firstapp.database.ext.ConvertersDate
import com.example.firstapp.model.CourierStat
import com.example.firstapp.model.DailyStat
import com.example.firstapp.database.dao.ReminderDao
import com.example.firstapp.database.dao.ReminderRecordDao
import com.example.firstapp.database.entity.Reminder
import com.example.firstapp.database.entity.ReminderRecord
@Database(
    entities = [
        Msg::class, 
        Code::class, 
        KeywordEntity::class,
        Reminder::class
        KeywordEntity::class,
        Reminder::class,
        ReminderRecord::class
    ],
    views = [
        CourierStat::class,
        DailyStat::class
    ],
    version = 20,
    version = 21,
    exportSchema = false
)
@TypeConverters(ConvertersDate::class)
@@ -44,6 +45,7 @@
    abstract fun codeDao(): CodeDao
    abstract fun keywordDao(): KeywordDao
    abstract fun reminderDao(): ReminderDao
    abstract fun reminderRecordDao(): ReminderRecordDao
    companion object {
        @Volatile
@@ -64,8 +66,8 @@
                    }
                }).addMigrations(
                    MIGRATION_MSG,
                    MIGRATION_20_21
                )
            /*if (BuildConfig.DEBUG) {
@@ -139,6 +141,39 @@
            }
        }
        private val MIGRATION_20_21 = object : Migration(20, 21) {
            override fun migrate(database: SupportSQLiteDatabase) {
                // 创建 reminders 表
                database.execSQL(
                    """
                    CREATE TABLE IF NOT EXISTS reminders (
                        id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
                        categoryId INTEGER NOT NULL,
                        categoryName TEXT NOT NULL,
                        notificationMethod TEXT NOT NULL,
                        isEnabled INTEGER NOT NULL DEFAULT 1,
                        createdAt INTEGER NOT NULL DEFAULT (strftime('%s','now') * 1000)
                    )
                    """
                )
                // 创建 reminder_records 表
                database.execSQL(
                    """
                    CREATE TABLE IF NOT EXISTS reminder_records (
                        id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
                        categoryId INTEGER NOT NULL,
                        categoryName TEXT NOT NULL,
                        content TEXT NOT NULL,
                        notificationMethod TEXT NOT NULL,
                        status INTEGER NOT NULL DEFAULT 0,
                        createdAt INTEGER NOT NULL DEFAULT (strftime('%s','now') * 1000)
                    )
                    """
                )
            }
        }
    }
}
app/src/main/java/com/example/firstapp/database/dao/ReminderDao.kt
@@ -6,16 +6,21 @@
@Dao
interface ReminderDao {
    @Query("SELECT * FROM reminders ORDER BY type")
    @Query("SELECT * FROM reminders ORDER BY createdAt DESC")
    fun getAllReminders(): Flow<List<Reminder>>
    @Insert
     fun insert(reminder: Reminder)
    @Insert(onConflict = OnConflictStrategy.REPLACE)
    suspend fun insertReminder(reminder: Reminder)
    @Delete
     fun delete(reminder: Reminder)
    suspend fun deleteReminder(reminder: Reminder)
    @Query("SELECT * FROM reminders WHERE type = :type")
    fun getByType(type: String): List<Reminder>
}
    @Query("DELETE FROM reminders WHERE categoryId = :categoryId")
    suspend fun deleteReminderByCategoryId(categoryId: Int)
    @Query("SELECT * FROM reminders WHERE categoryId = :categoryId")
    suspend fun getReminderByCategoryId(categoryId: Int): Reminder?
    @Query("DELETE FROM reminders")
    suspend fun deleteAllReminders()
}
app/src/main/java/com/example/firstapp/database/dao/ReminderRecordDao.kt
对比新文件
@@ -0,0 +1,32 @@
package com.example.firstapp.database.dao
import androidx.room.*
import com.example.firstapp.database.entity.ReminderRecord
import kotlinx.coroutines.flow.Flow
@Dao
interface ReminderRecordDao {
    @Query("SELECT * FROM reminder_records ORDER BY createdAt DESC")
    fun getAllRecords(): Flow<List<ReminderRecord>>
    @Query("SELECT * FROM reminder_records WHERE status = :status ORDER BY createdAt DESC")
    fun getRecordsByStatus(status: Int): Flow<List<ReminderRecord>>
    @Insert(onConflict = OnConflictStrategy.REPLACE)
    suspend fun insertRecord(record: ReminderRecord): Long
    @Update
    suspend fun updateRecord(record: ReminderRecord)
    @Delete
    suspend fun deleteRecord(record: ReminderRecord)
    @Query("DELETE FROM reminder_records WHERE categoryId = :categoryId")
    suspend fun deleteRecordsByCategoryId(categoryId: Int)
    @Query("UPDATE reminder_records SET status = :status WHERE id = :recordId")
    suspend fun updateRecordStatus(recordId: Long, status: Int)
    @Query("SELECT COUNT(*) FROM reminder_records WHERE status = :status")
    suspend fun getUnreadCount(status: Int): Int
}
app/src/main/java/com/example/firstapp/database/entity/Reminder.kt
@@ -3,11 +3,13 @@
import androidx.room.Entity
import androidx.room.PrimaryKey
@Entity(tableName = "reminders")
data class Reminder(
    @PrimaryKey(autoGenerate = true) val id: Long = 0,
    val type: String,
    val nickname: String,
    val keywords: String
    @PrimaryKey(autoGenerate = true)
    val id: Long = 0,
    val categoryId: Int,
    val categoryName: String,
    val notificationMethod: String,
    val isEnabled: Boolean = true,
    val createdAt: Long = System.currentTimeMillis()
app/src/main/java/com/example/firstapp/database/entity/ReminderRecord.kt
对比新文件
@@ -0,0 +1,21 @@
package com.example.firstapp.database.entity
import androidx.room.Entity
import androidx.room.PrimaryKey
@Entity(tableName = "reminder_records")
data class ReminderRecord(
    @PrimaryKey(autoGenerate = true)
    val id: Long = 0,
    val categoryId: Int,
    val categoryName: String,
    val content: String,
    val notificationMethod: String,
    val status: Int = STATUS_UNREAD, // 0: 未读, 1: 已读
    val createdAt: Long = System.currentTimeMillis()
) {
    companion object {
        const val STATUS_UNREAD = 0
        const val STATUS_READ = 1
    }
}
app/src/main/java/com/example/firstapp/database/repository/ReminderRecordRepository.kt
对比新文件
@@ -0,0 +1,40 @@
package com.example.firstapp.database.repository
import android.content.Context
import com.example.firstapp.AppDatabase
import com.example.firstapp.database.dao.ReminderRecordDao
import com.example.firstapp.database.entity.ReminderRecord
import kotlinx.coroutines.flow.Flow
class ReminderRecordRepository(context: Context) {
    private val reminderRecordDao: ReminderRecordDao = AppDatabase.getInstance(context).reminderRecordDao()
    fun getAllRecords(): Flow<List<ReminderRecord>> = reminderRecordDao.getAllRecords()
    fun getRecordsByStatus(status: Int): Flow<List<ReminderRecord>> =
        reminderRecordDao.getRecordsByStatus(status)
    suspend fun insertRecord(record: ReminderRecord): Long {
        return reminderRecordDao.insertRecord(record)
    }
    suspend fun updateRecord(record: ReminderRecord) {
        reminderRecordDao.updateRecord(record)
    }
    suspend fun deleteRecord(record: ReminderRecord) {
        reminderRecordDao.deleteRecord(record)
    }
    suspend fun deleteRecordsByCategoryId(categoryId: Int) {
        reminderRecordDao.deleteRecordsByCategoryId(categoryId)
    }
    suspend fun updateRecordStatus(recordId: Long, status: Int) {
        reminderRecordDao.updateRecordStatus(recordId, status)
    }
    suspend fun getUnreadCount(status: Int): Int {
        return reminderRecordDao.getUnreadCount(status)
    }
}
app/src/main/java/com/example/firstapp/database/repository/ReminderRepository.kt
@@ -1,26 +1,33 @@
package com.example.firstapp.database.repository
import android.content.Context
import com.example.firstapp.AppDatabase
import com.example.firstapp.database.dao.ReminderDao
import androidx.annotation.WorkerThread
import com.example.firstapp.database.entity.Reminder
import kotlinx.coroutines.flow.Flow
class ReminderRepository(private val reminderDao: ReminderDao) {
    val allReminders: Flow<List<Reminder>> = reminderDao.getAllReminders()
class ReminderRepository(context: Context) {
        private val reminderDao: ReminderDao = AppDatabase.getInstance(context).reminderDao()
    fun getAllReminders(): Flow<List<Reminder>> = reminderDao.getAllReminders()
    @WorkerThread
     fun insert(reminder: Reminder) {
        reminderDao.insert(reminder)
    suspend fun insertReminder(reminder: Reminder) {
        reminderDao.insertReminder(reminder)
    }
    @WorkerThread
     fun delete(reminder: Reminder) {
        reminderDao.delete(reminder)
    suspend fun deleteReminder(reminder: Reminder) {
        reminderDao.deleteReminder(reminder)
    }
    @WorkerThread
    fun getByType(type: String): List<Reminder> {
        return reminderDao.getByType(type)
    suspend fun deleteReminderByCategoryId(categoryId: Int) {
        reminderDao.deleteReminderByCategoryId(categoryId)
    }
    suspend fun getReminderByCategoryId(categoryId: Int): Reminder? {
        return reminderDao.getReminderByCategoryId(categoryId)
    }
    suspend fun deleteAllReminders() {
        reminderDao.deleteAllReminders()
    }
app/src/main/java/com/example/firstapp/database/response/CheckNewContentResponse.kt
对比新文件
@@ -0,0 +1,7 @@
package com.example.firstapp.database.response
data class CheckNewContentData(
    val hasNewContent: Boolean,
    val content: String? = null,
    val updateTime: Long = System.currentTimeMillis()
)
app/src/main/java/com/example/firstapp/database/service/ApiService.kt
@@ -78,8 +78,8 @@
// 创建Retrofit实例(单例)
object RetrofitClient{
    private const val BASE_URL ="http://192.168.1.198:8080/flower/"
//    private const val BASE_URL ="http://14.103.144.28:8080/flower/"
//    private const val BASE_URL ="http://192.168.1.198:8080/flower/"
    private const val BASE_URL ="http://14.103.144.28:8080/flower/"
    // 创建OkHttpClient,配置拦截器和超时时间
app/src/main/java/com/example/firstapp/service/ReminderWorker.kt
对比新文件
@@ -0,0 +1,243 @@
package com.example.firstapp.service
import android.app.NotificationChannel
import android.app.NotificationManager
import android.app.PendingIntent
import android.content.Context
import android.content.Intent
import android.os.Build
import androidx.core.app.NotificationCompat
import androidx.work.CoroutineWorker
import androidx.work.WorkerParameters
import com.example.firstapp.MainActivity
import com.example.firstapp.R
import com.example.firstapp.activity.PhoneLoginActivity
import com.example.firstapp.core.Core
import com.example.firstapp.database.entity.ReminderRecord
import com.example.firstapp.database.repository.ReminderRecordRepository
import com.example.firstapp.database.repository.ReminderRepository
import com.example.firstapp.model.StationGroup
import com.example.firstapp.utils.PreferencesManager
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.flow.first
import kotlinx.coroutines.withContext
import java.util.concurrent.TimeUnit
/**
 * 提醒工作类,定期检查是否有需要提醒的内容
 * 目前设置为每天检查一次
 */
class ReminderWorker(
    appContext: Context,
    workerParams: WorkerParameters
) : CoroutineWorker(appContext, workerParams) {
    private val reminderRepository = ReminderRepository(appContext)
    private val reminderRecordRepository = ReminderRecordRepository(appContext)
    override suspend fun doWork(): Result = withContext(Dispatchers.IO) {
        android.util.Log.d("ReminderWorker", "doWork 开始执行")
        try {
            // 获取所有提醒设置
            val reminderList = reminderRepository.getAllReminders().first()
            android.util.Log.d("ReminderWorker", "获取到 ${reminderList.size} 条提醒设置")
            if (reminderList.isEmpty()) {
                // 测试用:如果没有数据,也发送一条测试通知
                sendTestNotification()
                android.util.Log.d("ReminderWorker", "数据为空,发送了测试通知")
            }
            for (reminder in reminderList) {
                try {
                    android.util.Log.d("ReminderWorker", "处理提醒: ${reminder.categoryName}")
                    checkCategoryContent(reminder.categoryId, reminder.categoryName, reminder.notificationMethod)
                } catch (e: Exception) {
                    e.printStackTrace()
                    android.util.Log.e("ReminderWorker", "处理提醒失败: ${e.message}")
                }
            }
            android.util.Log.d("ReminderWorker", "doWork 执行成功")
            Result.success()
        } catch (e: Exception) {
            e.printStackTrace()
            android.util.Log.e("ReminderWorker", "doWork 执行失败: ${e.message}")
            Result.failure()
        }
    }
    private suspend fun checkCategoryContent(categoryId: Int, categoryName: String, notificationMethod: String) {
        // 根据categoryId从Code表中查询pickup=0的数据
        when (categoryId) {
            1, 2, 3, 4, 5 -> {
                val type = getCategoryType(categoryId)
                val stationGroups = Core.code.getStationsByType(type)
                if (stationGroups.isNotEmpty()) {
                    // 有未处理的数据,创建提醒
                    createRemindersForStations(categoryId, categoryName, stationGroups, notificationMethod)
                }
            }
            else -> {
                // 其他类型的提醒处理
            }
        }
    }
    private fun getCategoryType(categoryId: Int): String {
        return when(categoryId) {
            1 -> "快递"
            2 -> "还款"
            3 -> "收入"
            4 -> "航班"
            5 -> "火车票"
            else -> ""
        }
    }
    private suspend fun createRemindersForStations(
        categoryId: Int,
        categoryName: String,
        stationGroups: List<StationGroup>,
        notificationMethod: String
    ) {
        stationGroups.forEach { stationGroup ->
            val content = generateReminderContent(categoryId, stationGroup.stationName, stationGroup.count)
            // 创建提醒记录
            val record = ReminderRecord(
                categoryId = categoryId,
                categoryName = categoryName,
                content = content,
                notificationMethod = notificationMethod,
                status = ReminderRecord.STATUS_UNREAD
            )
            val recordId = reminderRecordRepository.insertRecord(record)
            // 发送通知
            if (notificationMethod.contains("PHONE")) {
                sendNotification(
                    recordId,
                    "新${categoryName}提醒",
                    content
                )
            }
        }
    }
    private fun generateReminderContent(categoryId: Int, stationName: String, count: Int): String {
        return when(categoryId) {
            1 -> "您有${count}个包裹在${stationName}未取,请及时取件"
            2 -> "您有${count}笔还款,请及时处理"
            3 -> "您有${count}笔收入待确认"
            4 -> "您有${count}个航班信息待处理"
            5 -> "您有${count}张火车票信息待处理"
            else -> "您有新的提醒"
        }
    }
    private fun sendNotification(id: Long, title: String, content: String) {
        val notificationManager = applicationContext.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
        // 创建启动应用的Intent
        val intent = createAppIntent()
        // 创建PendingIntent
        val pendingIntent = PendingIntent.getActivity(
            applicationContext,
            id.toInt(),
            intent,
            PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE
        )
        // 创建通知渠道(Android 8.0及以上需要)
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            val channel = NotificationChannel(
                CHANNEL_ID,
                "提醒通知",
                NotificationManager.IMPORTANCE_DEFAULT
            )
            notificationManager.createNotificationChannel(channel)
        }
        // 创建通知
        val notification = NotificationCompat.Builder(applicationContext, CHANNEL_ID)
            .setSmallIcon(R.drawable.ic_reminder) // 使用自定义图标
            .setContentTitle(title)
            .setContentText(content)
            .setPriority(NotificationCompat.PRIORITY_DEFAULT)
            .setAutoCancel(true)
            .setContentIntent(pendingIntent)
            .build()
        // 发送通知
        notificationManager.notify(id.toInt(), notification)
    }
    // 添加创建跳转Intent的方法
    private fun createAppIntent(): Intent {
        // 判断用户是否已登录
        val isLoggedIn = PreferencesManager.getToken() != null
        return if (isLoggedIn) {
            // 已登录,跳转到主页
            Intent(applicationContext, MainActivity::class.java).apply {
                flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK
            }
        } else {
            // 未登录,跳转到登录页
            Intent(applicationContext, PhoneLoginActivity::class.java).apply {
                flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK
            }
        }
    }
    // 修改测试通知方法,添加点击事件
    private fun sendTestNotification() {
        val notificationManager = applicationContext.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
        // 创建启动应用的Intent
        val intent = createAppIntent()
        // 创建PendingIntent
        val pendingIntent = PendingIntent.getActivity(
            applicationContext,
            1000,
            intent,
            PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE
        )
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            val channel = NotificationChannel(
                CHANNEL_ID,
                "测试通知",
                NotificationManager.IMPORTANCE_HIGH
            )
            notificationManager.createNotificationChannel(channel)
        }
        val notification = NotificationCompat.Builder(applicationContext, CHANNEL_ID)
            .setSmallIcon(R.drawable.ic_reminder) // 使用自定义图标
            .setContentTitle("测试通知")
            .setContentText("这是一条测试通知,证明 Worker 已执行")
            .setPriority(NotificationCompat.PRIORITY_HIGH)
            .setAutoCancel(true)
            .setContentIntent(pendingIntent)
            .build()
        notificationManager.notify(1000, notification)
    }
    companion object {
        private const val CHANNEL_ID = "reminder_channel"
        // 定时任务执行频率 - 设置为每天运行一次
        val REPEAT_INTERVAL = 24L   // 每24小时运行一次
        val REPEAT_INTERVAL_TIME_UNIT = TimeUnit.HOURS
        // 测试用的频率配置,已注释掉
        // val REPEAT_INTERVAL = 2L
        // val REPEAT_INTERVAL_TIME_UNIT = TimeUnit.MINUTES
    }
}
app/src/main/java/com/example/firstapp/ui/dashboard/ReminderRecordViewModel.kt
对比新文件
@@ -0,0 +1,30 @@
package com.example.firstapp.ui.dashboard
import android.app.Application
import androidx.lifecycle.AndroidViewModel
import androidx.lifecycle.LiveData
import androidx.lifecycle.asLiveData
import com.example.firstapp.database.entity.ReminderRecord
import com.example.firstapp.database.repository.ReminderRecordRepository
import com.example.firstapp.database.service.RetrofitClient
class ReminderRecordViewModel(application: Application) : AndroidViewModel(application) {
    private val reminderRecordRepository: ReminderRecordRepository = ReminderRecordRepository(application)
    val reminderRecords: LiveData<List<ReminderRecord>> = reminderRecordRepository.getAllRecords().asLiveData()
    suspend fun getUserInfo(phone: String) = RetrofitClient.apiService.getUserInfo(phone)
    // 提醒记录相关方法
    suspend fun updateRecordStatus(recordId: Long, status: Int) {
        reminderRecordRepository.updateRecordStatus(recordId, status)
    }
    suspend fun deleteRecord(record: ReminderRecord) {
        reminderRecordRepository.deleteRecord(record)
    }
    suspend fun getUnreadCount(): Int {
        return reminderRecordRepository.getUnreadCount(ReminderRecord.STATUS_UNREAD)
    }
}
app/src/main/java/com/example/firstapp/ui/dashboard/ReminderViewModel.kt
对比新文件
@@ -0,0 +1,33 @@
package com.example.firstapp.ui.dashboard
import android.app.Application
import androidx.lifecycle.AndroidViewModel
import androidx.lifecycle.LiveData
import androidx.lifecycle.asLiveData
import com.example.firstapp.database.entity.Reminder
import com.example.firstapp.database.repository.ReminderRepository
import com.example.firstapp.database.service.RetrofitClient
class ReminderViewModel(application: Application) : AndroidViewModel(application) {
    private val reminderRepository: ReminderRepository = ReminderRepository(application)
    val reminders: LiveData<List<Reminder>> = reminderRepository.getAllReminders().asLiveData()
    suspend fun insertReminder(reminder: Reminder) {
        reminderRepository.insertReminder(reminder)
    }
    suspend fun deleteReminder(reminder: Reminder) {
        reminderRepository.deleteReminder(reminder)
    }
    suspend fun getReminderByCategoryId(categoryId: Int): Reminder? {
        return reminderRepository.getReminderByCategoryId(categoryId)
    }
    suspend fun deleteAllReminders() {
        reminderRepository.deleteAllReminders()
    }
    suspend fun getUserInfo(phone: String) = RetrofitClient.apiService.getUserInfo(phone)
}
app/src/main/java/com/example/firstapp/ui/home/HomeFragment.kt
@@ -34,6 +34,7 @@
import com.google.android.material.bottomsheet.BottomSheetDialog
import kotlinx.coroutines.launch
import com.example.firstapp.view.UnderlineTextView
import com.example.firstapp.activity.ReminderListActivity
class HomeFragment : Fragment() {
@@ -406,16 +407,16 @@
        _binding = null
    }
    private fun loadAdvertisements() {
        // 使用 Glide 加载网络图片
        Glide.with(this)
            .load("http://192.168.1.235:9999/advertisement/up.png")
            .into(binding.adBanner)
        Glide.with(this)
            .load("http://192.168.1.235:9999/advertisement/down.png")
            .into(binding.bottomAdBanner)
    }
//    private fun loadAdvertisements() {
//        // 使用 Glide 加载网络图片
//        Glide.with(this)
//            .load("http://192.168.1.235:9999/advertisement/up.png")
//            .into(binding.adBanner)
//
//        Glide.with(this)
//            .load("http://192.168.1.235:9999/advertisement/down.png")
//            .into(binding.bottomAdBanner)
//    }
    // 设置分类选择器 检查会员状态
    private fun setupCategorySelector() {
@@ -448,6 +449,11 @@
                }
            }
        }
        // 添加提醒按钮点击事件
//        binding.reminderButton.setOnClickListener {
//            startActivity(Intent(requireContext(), ReminderListActivity::class.java))
//        }
    }
    private fun showCategorySelectorDialog() {
app/src/main/java/com/example/firstapp/ui/notifications/NotificationsFragment.kt
@@ -144,7 +144,7 @@
        // 设置提醒
        binding.layoutReminder.setOnClickListener {
            findNavController().navigate(R.id.action_navigation_notifications_to_reminderSettingsFragment)
            Toast.makeText(context, "设置功能开发中", Toast.LENGTH_SHORT).show()
        }
        // 待办
app/src/main/java/com/example/firstapp/ui/reminder/ReminderSettingsFragment.kt
文件已删除
app/src/main/java/com/example/firstapp/ui/reminder/ReminderViewModel.kt
文件已删除
app/src/main/java/com/example/firstapp/utils/PreferencesManager.kt
@@ -9,6 +9,7 @@
    private const val KEY_PHONE = "user_phone"
    private const val KEY_FIRST_INSTALL = "first_install"
    private const val LAST_LOGIN_PHONE = "last_login_phone"
    private const val PREF_LAST_CHECK_TIME_PREFIX = "last_check_time_"
    private lateinit var preferences: SharedPreferences
@@ -55,4 +56,12 @@
    fun getLastLoginPhone(): String {
        return preferences.getString(LAST_LOGIN_PHONE, "") ?: ""
    }
    fun getLastCheckTime(categoryId: Int): Long {
        return preferences.getLong(PREF_LAST_CHECK_TIME_PREFIX + categoryId, 0)
    }
    fun setLastCheckTime(categoryId: Int, time: Long) {
        preferences.edit().putLong(PREF_LAST_CHECK_TIME_PREFIX + categoryId, time).apply()
    }
app/src/main/res/drawable/ic_launcher_background.xml
@@ -1,170 +1,9 @@
<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
    android:width="108dp"
    android:height="108dp"
    android:viewportWidth="108"
    android:viewportHeight="108">
    <path
        android:fillColor="#3DDC84"
        android:pathData="M0,0h108v108h-108z" />
    <path
        android:fillColor="#00000000"
        android:pathData="M9,0L9,108"
        android:strokeWidth="0.8"
        android:strokeColor="#33FFFFFF" />
    <path
        android:fillColor="#00000000"
        android:pathData="M19,0L19,108"
        android:strokeWidth="0.8"
        android:strokeColor="#33FFFFFF" />
    <path
        android:fillColor="#00000000"
        android:pathData="M29,0L29,108"
        android:strokeWidth="0.8"
        android:strokeColor="#33FFFFFF" />
    <path
        android:fillColor="#00000000"
        android:pathData="M39,0L39,108"
        android:strokeWidth="0.8"
        android:strokeColor="#33FFFFFF" />
    <path
        android:fillColor="#00000000"
        android:pathData="M49,0L49,108"
        android:strokeWidth="0.8"
        android:strokeColor="#33FFFFFF" />
    <path
        android:fillColor="#00000000"
        android:pathData="M59,0L59,108"
        android:strokeWidth="0.8"
        android:strokeColor="#33FFFFFF" />
    <path
        android:fillColor="#00000000"
        android:pathData="M69,0L69,108"
        android:strokeWidth="0.8"
        android:strokeColor="#33FFFFFF" />
    <path
        android:fillColor="#00000000"
        android:pathData="M79,0L79,108"
        android:strokeWidth="0.8"
        android:strokeColor="#33FFFFFF" />
    <path
        android:fillColor="#00000000"
        android:pathData="M89,0L89,108"
        android:strokeWidth="0.8"
        android:strokeColor="#33FFFFFF" />
    <path
        android:fillColor="#00000000"
        android:pathData="M99,0L99,108"
        android:strokeWidth="0.8"
        android:strokeColor="#33FFFFFF" />
    <path
        android:fillColor="#00000000"
        android:pathData="M0,9L108,9"
        android:strokeWidth="0.8"
        android:strokeColor="#33FFFFFF" />
    <path
        android:fillColor="#00000000"
        android:pathData="M0,19L108,19"
        android:strokeWidth="0.8"
        android:strokeColor="#33FFFFFF" />
    <path
        android:fillColor="#00000000"
        android:pathData="M0,29L108,29"
        android:strokeWidth="0.8"
        android:strokeColor="#33FFFFFF" />
    <path
        android:fillColor="#00000000"
        android:pathData="M0,39L108,39"
        android:strokeWidth="0.8"
        android:strokeColor="#33FFFFFF" />
    <path
        android:fillColor="#00000000"
        android:pathData="M0,49L108,49"
        android:strokeWidth="0.8"
        android:strokeColor="#33FFFFFF" />
    <path
        android:fillColor="#00000000"
        android:pathData="M0,59L108,59"
        android:strokeWidth="0.8"
        android:strokeColor="#33FFFFFF" />
    <path
        android:fillColor="#00000000"
        android:pathData="M0,69L108,69"
        android:strokeWidth="0.8"
        android:strokeColor="#33FFFFFF" />
    <path
        android:fillColor="#00000000"
        android:pathData="M0,79L108,79"
        android:strokeWidth="0.8"
        android:strokeColor="#33FFFFFF" />
    <path
        android:fillColor="#00000000"
        android:pathData="M0,89L108,89"
        android:strokeWidth="0.8"
        android:strokeColor="#33FFFFFF" />
    <path
        android:fillColor="#00000000"
        android:pathData="M0,99L108,99"
        android:strokeWidth="0.8"
        android:strokeColor="#33FFFFFF" />
    <path
        android:fillColor="#00000000"
        android:pathData="M19,29L89,29"
        android:strokeWidth="0.8"
        android:strokeColor="#33FFFFFF" />
    <path
        android:fillColor="#00000000"
        android:pathData="M19,39L89,39"
        android:strokeWidth="0.8"
        android:strokeColor="#33FFFFFF" />
    <path
        android:fillColor="#00000000"
        android:pathData="M19,49L89,49"
        android:strokeWidth="0.8"
        android:strokeColor="#33FFFFFF" />
    <path
        android:fillColor="#00000000"
        android:pathData="M19,59L89,59"
        android:strokeWidth="0.8"
        android:strokeColor="#33FFFFFF" />
    <path
        android:fillColor="#00000000"
        android:pathData="M19,69L89,69"
        android:strokeWidth="0.8"
        android:strokeColor="#33FFFFFF" />
    <path
        android:fillColor="#00000000"
        android:pathData="M19,79L89,79"
        android:strokeWidth="0.8"
        android:strokeColor="#33FFFFFF" />
    <path
        android:fillColor="#00000000"
        android:pathData="M29,19L29,89"
        android:strokeWidth="0.8"
        android:strokeColor="#33FFFFFF" />
    <path
        android:fillColor="#00000000"
        android:pathData="M39,19L39,89"
        android:strokeWidth="0.8"
        android:strokeColor="#33FFFFFF" />
    <path
        android:fillColor="#00000000"
        android:pathData="M49,19L49,89"
        android:strokeWidth="0.8"
        android:strokeColor="#33FFFFFF" />
    <path
        android:fillColor="#00000000"
        android:pathData="M59,19L59,89"
        android:strokeWidth="0.8"
        android:strokeColor="#33FFFFFF" />
    <path
        android:fillColor="#00000000"
        android:pathData="M69,19L69,89"
        android:strokeWidth="0.8"
        android:strokeColor="#33FFFFFF" />
    <path
        android:fillColor="#00000000"
        android:pathData="M79,19L79,89"
        android:strokeWidth="0.8"
        android:strokeColor="#33FFFFFF" />
    android:viewportWidth="512"
    android:viewportHeight="512">
  <path
      android:pathData="M512,0L512,512L0,512L0,0L512,0Z"
      android:fillColor="#0275f4"/>
</vector>
app/src/main/res/drawable/ic_launcher_foreground.xml
@@ -1,30 +1,152 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:aapt="http://schemas.android.com/aapt"
    android:width="108dp"
    android:height="108dp"
    android:viewportWidth="108"
    android:viewportHeight="108">
    <path android:pathData="M31,63.928c0,0 6.4,-11 12.1,-13.1c7.2,-2.6 26,-1.4 26,-1.4l38.1,38.1L107,108.928l-32,-1L31,63.928z">
        <aapt:attr name="android:fillColor">
            <gradient
                android:endX="85.84757"
                android:endY="92.4963"
                android:startX="42.9492"
                android:startY="49.59793"
                android:type="linear">
                <item
                    android:color="#44000000"
                    android:offset="0.0" />
                <item
                    android:color="#00000000"
                    android:offset="1.0" />
            </gradient>
        </aapt:attr>
    </path>
    android:viewportWidth="512"
    android:viewportHeight="512">
  <group android:scaleX="0.8"
      android:scaleY="0.8"
      android:translateX="51.2"
      android:translateY="51.2">
    <path
        android:fillColor="#FFFFFF"
        android:fillType="nonZero"
        android:pathData="M65.3,45.828l3.8,-6.6c0.2,-0.4 0.1,-0.9 -0.3,-1.1c-0.4,-0.2 -0.9,-0.1 -1.1,0.3l-3.9,6.7c-6.3,-2.8 -13.4,-2.8 -19.7,0l-3.9,-6.7c-0.2,-0.4 -0.7,-0.5 -1.1,-0.3C38.8,38.328 38.7,38.828 38.9,39.228l3.8,6.6C36.2,49.428 31.7,56.028 31,63.928h46C76.3,56.028 71.8,49.428 65.3,45.828zM43.4,57.328c-0.8,0 -1.5,-0.5 -1.8,-1.2c-0.3,-0.7 -0.1,-1.5 0.4,-2.1c0.5,-0.5 1.4,-0.7 2.1,-0.4c0.7,0.3 1.2,1 1.2,1.8C45.3,56.528 44.5,57.328 43.4,57.328L43.4,57.328zM64.6,57.328c-0.8,0 -1.5,-0.5 -1.8,-1.2s-0.1,-1.5 0.4,-2.1c0.5,-0.5 1.4,-0.7 2.1,-0.4c0.7,0.3 1.2,1 1.2,1.8C66.5,56.528 65.6,57.328 64.6,57.328L64.6,57.328z"
        android:strokeWidth="1"
        android:strokeColor="#00000000" />
</vector>
        android:pathData="M58.45,-0.39C60.22,-0.39 61.99,-0.4 63.77,-0.4C68.62,-0.42 73.48,-0.41 78.34,-0.41C83.58,-0.4 88.83,-0.41 94.07,-0.42C104.34,-0.44 114.61,-0.44 124.88,-0.44C133.23,-0.43 141.57,-0.44 149.92,-0.44C151.7,-0.44 151.7,-0.44 153.52,-0.44C155.94,-0.44 158.35,-0.45 160.77,-0.45C183.4,-0.46 206.04,-0.46 228.68,-0.44C249.38,-0.43 270.09,-0.45 290.79,-0.47C312.06,-0.5 333.33,-0.51 354.59,-0.5C366.53,-0.49 378.47,-0.5 390.4,-0.51C400.56,-0.53 410.72,-0.53 420.89,-0.51C426.07,-0.5 431.25,-0.5 436.43,-0.52C441.18,-0.53 445.93,-0.53 450.68,-0.51C452.39,-0.5 454.1,-0.51 455.82,-0.52C472.46,-0.61 485.77,3.14 498.25,14.69C506.11,22.99 511.32,33.06 511.26,44.55C511.26,45.29 511.27,46.03 511.27,46.8C511.28,49.29 511.28,51.78 511.27,54.27C511.28,56.07 511.28,57.88 511.29,59.68C511.3,64.64 511.31,69.59 511.31,74.55C511.31,79.9 511.32,85.24 511.33,90.59C511.35,102.28 511.36,113.97 511.37,125.66C511.37,132.96 511.38,140.26 511.38,147.56C511.4,167.77 511.42,187.98 511.42,208.2C511.42,209.49 511.42,210.78 511.42,212.12C511.42,214.74 511.42,217.36 511.42,219.98C511.43,221.28 511.43,222.59 511.43,223.93C511.43,225.88 511.43,225.88 511.43,227.88C511.43,248.99 511.46,270.11 511.49,291.23C511.53,312.91 511.55,334.6 511.55,356.28C511.55,368.45 511.56,380.63 511.59,392.8C511.61,403.17 511.62,413.53 511.61,423.9C511.6,429.18 511.6,434.47 511.62,439.76C511.64,444.6 511.64,449.45 511.62,454.29C511.62,456.04 511.62,457.79 511.64,459.54C511.76,475.35 508.03,486.55 496.97,498.12C488.86,505.88 479.12,511.16 467.82,511.14C467.08,511.14 466.35,511.14 465.58,511.15C463.09,511.15 460.59,511.15 458.09,511.15C456.29,511.16 454.49,511.16 452.69,511.17C447.73,511.18 442.76,511.18 437.8,511.19C432.45,511.2 427.1,511.21 421.75,511.22C408.83,511.24 395.91,511.26 382.98,511.27C379.33,511.27 375.68,511.28 372.03,511.28C349.37,511.31 326.71,511.33 304.05,511.34C298.8,511.34 293.55,511.35 288.3,511.35C286.34,511.35 286.34,511.35 284.34,511.35C263.21,511.36 242.07,511.4 220.93,511.44C199.24,511.48 177.54,511.51 155.84,511.51C143.66,511.51 131.48,511.53 119.29,511.56C108.92,511.59 98.54,511.6 88.16,511.59C82.87,511.58 77.57,511.58 72.28,511.61C67.43,511.63 62.58,511.63 57.73,511.61C55.98,511.61 54.23,511.62 52.48,511.63C36.65,511.76 25.45,508.03 13.88,496.97C5.06,487.76 -0.24,476.27 -0.26,463.46C-0.26,462.36 -0.26,462.36 -0.27,461.24C-0.28,458.8 -0.27,456.36 -0.27,453.91C-0.27,452.14 -0.28,450.37 -0.28,448.6C-0.29,443.74 -0.29,438.87 -0.29,434.01C-0.29,428.76 -0.3,423.52 -0.31,418.27C-0.33,407.99 -0.33,397.71 -0.33,387.43C-0.34,379.08 -0.34,370.72 -0.35,362.36C-0.36,338.67 -0.37,314.98 -0.37,291.29C-0.37,290.01 -0.37,288.73 -0.37,287.42C-0.37,286.14 -0.37,284.86 -0.37,283.54C-0.37,262.82 -0.39,242.09 -0.42,221.37C-0.45,200.09 -0.46,178.81 -0.46,157.53C-0.46,145.58 -0.46,133.64 -0.48,121.69C-0.5,111.52 -0.51,101.34 -0.49,91.17C-0.49,85.98 -0.49,80.8 -0.5,75.61C-0.52,70.85 -0.52,66.1 -0.5,61.35C-0.5,59.63 -0.5,57.91 -0.51,56.2C-0.61,39.55 3.14,26.24 14.69,13.75C27.6,1.59 41.53,-0.45 58.45,-0.39Z"
        android:fillColor="#EDECE9"/>
    <path
        android:pathData="M58.45,-0.39C60.22,-0.39 61.99,-0.4 63.77,-0.4C68.62,-0.42 73.48,-0.41 78.34,-0.41C83.58,-0.4 88.83,-0.41 94.07,-0.42C104.34,-0.44 114.61,-0.44 124.88,-0.44C133.23,-0.43 141.57,-0.44 149.92,-0.44C151.7,-0.44 151.7,-0.44 153.52,-0.44C155.94,-0.44 158.35,-0.45 160.77,-0.45C183.4,-0.46 206.04,-0.46 228.68,-0.44C249.38,-0.43 270.09,-0.45 290.79,-0.47C312.06,-0.5 333.33,-0.51 354.59,-0.5C366.53,-0.49 378.47,-0.5 390.4,-0.51C400.56,-0.53 410.72,-0.53 420.89,-0.51C426.07,-0.5 431.25,-0.5 436.43,-0.52C441.18,-0.53 445.93,-0.53 450.68,-0.51C452.39,-0.5 454.1,-0.51 455.82,-0.52C472.46,-0.61 485.77,3.14 498.25,14.69C506.11,22.99 511.32,33.06 511.26,44.55C511.26,45.29 511.27,46.03 511.27,46.8C511.28,49.29 511.28,51.78 511.27,54.27C511.28,56.07 511.28,57.88 511.29,59.68C511.3,64.64 511.31,69.59 511.31,74.55C511.31,79.9 511.32,85.24 511.33,90.59C511.35,102.28 511.36,113.97 511.37,125.66C511.37,132.96 511.38,140.26 511.38,147.56C511.4,167.77 511.42,187.98 511.42,208.2C511.42,209.49 511.42,210.78 511.42,212.12C511.42,214.74 511.42,217.36 511.42,219.98C511.43,221.28 511.43,222.59 511.43,223.93C511.43,225.88 511.43,225.88 511.43,227.88C511.43,248.99 511.46,270.11 511.49,291.23C511.53,312.91 511.55,334.6 511.55,356.28C511.55,368.45 511.56,380.63 511.59,392.8C511.61,403.17 511.62,413.53 511.61,423.9C511.6,429.18 511.6,434.47 511.62,439.76C511.64,444.6 511.64,449.45 511.62,454.29C511.62,456.04 511.62,457.79 511.64,459.54C511.76,475.35 508.03,486.55 496.97,498.12C488.86,505.88 479.12,511.16 467.82,511.14C467.08,511.14 466.35,511.14 465.58,511.15C463.09,511.15 460.59,511.15 458.09,511.15C456.29,511.16 454.49,511.16 452.69,511.17C447.73,511.18 442.76,511.18 437.8,511.19C432.45,511.2 427.1,511.21 421.75,511.22C408.83,511.24 395.91,511.26 382.98,511.27C379.33,511.27 375.68,511.28 372.03,511.28C349.37,511.31 326.71,511.33 304.05,511.34C298.8,511.34 293.55,511.35 288.3,511.35C286.34,511.35 286.34,511.35 284.34,511.35C263.21,511.36 242.07,511.4 220.93,511.44C199.24,511.48 177.54,511.51 155.84,511.51C143.66,511.51 131.48,511.53 119.29,511.56C108.92,511.59 98.54,511.6 88.16,511.59C82.87,511.58 77.57,511.58 72.28,511.61C67.43,511.63 62.58,511.63 57.73,511.61C55.98,511.61 54.23,511.62 52.48,511.63C36.65,511.76 25.45,508.03 13.88,496.97C5.06,487.76 -0.24,476.27 -0.26,463.46C-0.26,462.36 -0.26,462.36 -0.27,461.24C-0.28,458.8 -0.27,456.36 -0.27,453.91C-0.27,452.14 -0.28,450.37 -0.28,448.6C-0.29,443.74 -0.29,438.87 -0.29,434.01C-0.29,428.76 -0.3,423.52 -0.31,418.27C-0.33,407.99 -0.33,397.71 -0.33,387.43C-0.34,379.08 -0.34,370.72 -0.35,362.36C-0.36,338.67 -0.37,314.98 -0.37,291.29C-0.37,290.01 -0.37,288.73 -0.37,287.42C-0.37,286.14 -0.37,284.86 -0.37,283.54C-0.37,262.82 -0.39,242.09 -0.42,221.37C-0.45,200.09 -0.46,178.81 -0.46,157.53C-0.46,145.58 -0.46,133.64 -0.48,121.69C-0.5,111.52 -0.51,101.34 -0.49,91.17C-0.49,85.98 -0.49,80.8 -0.5,75.61C-0.52,70.85 -0.52,66.1 -0.5,61.35C-0.5,59.63 -0.5,57.91 -0.51,56.2C-0.61,39.55 3.14,26.24 14.69,13.75C27.6,1.59 41.53,-0.45 58.45,-0.39ZM28.68,36.53C17.21,50.95 13.69,65.76 13.73,83.8C13.73,85.3 13.72,86.8 13.72,88.3C13.71,92.4 13.71,96.5 13.71,100.6C13.71,105.03 13.7,109.46 13.69,113.89C13.67,122.56 13.67,131.23 13.67,139.91C13.66,146.96 13.66,154.01 13.65,161.06C13.64,181.08 13.63,201.09 13.63,221.11C13.63,222.18 13.63,223.26 13.63,224.37C13.63,225.45 13.63,226.53 13.63,227.64C13.63,245.13 13.61,262.62 13.58,280.11C13.55,298.08 13.54,316.05 13.54,334.03C13.54,344.11 13.54,354.19 13.52,364.28C13.5,372.86 13.49,381.45 13.51,390.04C13.51,394.42 13.51,398.79 13.5,403.17C13.48,407.18 13.48,411.2 13.5,415.22C13.5,416.66 13.5,418.1 13.49,419.55C13.36,437.62 17.93,454.48 30.74,467.76C31.86,468.87 31.86,468.87 33,470C33.89,470.94 33.89,470.94 34.79,471.89C38.9,475.91 43.57,478.61 48.63,481.25C49.24,481.58 49.85,481.91 50.49,482.25C61.33,487.62 73.27,488.44 85.17,488.37C86.54,488.37 87.91,488.37 89.28,488.38C93,488.39 96.73,488.38 100.45,488.36C104.48,488.35 108.51,488.36 112.54,488.36C120.43,488.37 128.32,488.36 136.21,488.34C145.43,488.32 154.65,488.32 163.86,488.32C180.35,488.32 196.83,488.31 213.32,488.28C229.24,488.26 245.16,488.24 261.08,488.24C262.05,488.24 263.03,488.24 264.04,488.24C266.01,488.24 267.98,488.24 269.95,488.24C270.92,488.24 271.9,488.24 272.9,488.24C273.87,488.24 274.84,488.24 275.84,488.24C291.1,488.23 306.36,488.22 321.62,488.21C327.11,488.21 332.6,488.2 338.09,488.2C346.82,488.19 355.55,488.19 364.28,488.17C368.26,488.17 372.24,488.16 376.21,488.16C391.52,488.16 406.82,488.06 422.12,487.67C423.57,487.63 425.01,487.6 426.46,487.57C444.42,487.23 444.42,487.23 461.19,481.44C461.86,481.09 462.53,480.74 463.23,480.37C479.42,471.58 488.74,457.25 494.42,440.17C495.71,435.32 496.13,430.64 496.14,425.64C496.14,424.37 496.15,423.1 496.15,421.8C496.15,420.4 496.15,419 496.15,417.61C496.16,416.11 496.16,414.62 496.17,413.13C496.18,409.04 496.18,404.94 496.19,400.85C496.2,396.43 496.21,392.01 496.22,387.6C496.24,376.93 496.26,366.26 496.27,355.59C496.27,352.58 496.28,349.57 496.28,346.55C496.31,327.82 496.33,309.08 496.34,290.35C496.34,286.01 496.35,281.67 496.35,277.34C496.35,275.72 496.35,275.72 496.35,274.07C496.36,256.62 496.4,239.17 496.44,221.71C496.48,203.78 496.51,185.85 496.51,167.92C496.51,157.86 496.53,147.8 496.56,137.73C496.59,129.16 496.6,120.59 496.59,112.02C496.58,107.65 496.58,103.28 496.61,98.91C496.63,94.9 496.63,90.89 496.61,86.88C496.61,85.44 496.61,84 496.63,82.56C496.82,63.37 490.33,46.51 476.86,32.73C462.6,19.11 445.86,14.53 426.57,14.61C425.03,14.61 423.49,14.6 421.95,14.6C417.73,14.58 413.52,14.59 409.31,14.59C404.76,14.6 400.2,14.59 395.65,14.58C386.74,14.56 377.83,14.56 368.92,14.56C361.68,14.57 354.43,14.56 347.19,14.56C346.15,14.56 345.12,14.56 344.06,14.56C341.96,14.56 339.86,14.55 337.76,14.55C318.11,14.54 298.45,14.54 278.79,14.56C260.82,14.57 242.86,14.55 224.89,14.53C206.42,14.5 187.96,14.49 169.49,14.5C159.13,14.51 148.77,14.5 138.41,14.49C129.59,14.47 120.77,14.47 111.95,14.49C107.45,14.5 102.96,14.5 98.46,14.48C94.34,14.47 90.21,14.47 86.09,14.49C84.6,14.5 83.12,14.49 81.64,14.48C61.59,14.35 42.09,20.98 28.68,36.53Z"
        android:fillColor="#0272EF"/>
    <path
        android:pathData="M135.08,174.82C135.89,174.82 136.71,174.81 137.54,174.8C140.23,174.78 142.91,174.77 145.6,174.76C146.98,174.76 146.98,174.76 148.39,174.75C153.26,174.73 158.14,174.71 163.01,174.7C168.03,174.69 173.04,174.66 178.06,174.62C181.93,174.59 185.8,174.59 189.68,174.58C191.52,174.58 193.37,174.57 195.22,174.55C208.36,174.42 219.37,175.09 229.93,183.87C237.1,191.23 241.29,199.58 241.32,209.81C241.34,210.97 241.34,210.97 241.35,212.15C241.38,214.7 241.4,217.24 241.41,219.79C241.41,221.1 241.41,221.1 241.42,222.43C241.45,227.06 241.47,231.69 241.48,236.32C241.49,241.08 241.54,245.83 241.6,250.59C241.63,254.27 241.64,257.95 241.65,261.63C241.65,263.38 241.67,265.13 241.7,266.88C241.88,279.92 240.04,290.5 230.77,300.47C221.61,308.39 212.72,310.29 200.95,310.31C198.56,310.33 196.16,310.36 193.77,310.38C190.01,310.41 186.25,310.44 182.5,310.46C178.86,310.48 175.22,310.52 171.58,310.56C169.91,310.56 169.91,310.56 168.21,310.56C152.52,310.76 142.14,317.02 130.45,327.05C125.7,330.84 122.09,331.36 116.06,331.38C115.36,331.4 114.66,331.42 113.93,331.45C110.58,331.47 108.25,331.14 105.3,329.54C101.94,325.83 102.32,322.76 102.4,317.92C102.39,317.04 102.38,316.15 102.37,315.24C102.35,312.41 102.36,309.58 102.38,306.75C102.38,303.93 102.38,301.12 102.35,298.3C102.34,296.55 102.34,294.8 102.36,293.05C102.35,288.97 102.12,286.28 100.51,282.46C97.76,275.84 98.48,268.14 98.46,261.09C98.45,259.43 98.44,257.77 98.42,256.11C98.4,252.64 98.39,249.17 98.39,245.69C98.38,241.28 98.33,236.87 98.27,232.46C98.23,229.04 98.22,225.61 98.22,222.18C98.21,220.56 98.2,218.93 98.17,217.31C97.97,204.98 99.78,194.97 108.31,185.42C116.3,177.76 124.19,174.86 135.08,174.82Z"
        android:fillColor="#0286F7"/>
    <path
        android:pathData="M140,209C142.49,210.72 142.49,210.72 144.88,213.06C145.74,213.89 146.6,214.72 147.49,215.57C148.32,216.37 149.15,217.17 150,218C151.32,219.18 152.66,220.34 154,221.5C156.23,223.44 158.43,225.4 160.61,227.4C161.5,228.22 162.39,229.03 163.31,229.88C164.13,230.64 164.95,231.4 165.8,232.18C167.95,234.19 167.95,234.19 171,235C171.63,234.43 172.26,233.86 172.91,233.28C183.01,224.16 183.01,224.16 186.8,220.91C188.53,219.41 190.23,217.86 191.92,216.31C192.97,215.37 194.01,214.44 195.06,213.5C196.02,212.62 196.98,211.75 197.97,210.84C201,209 201,209 204.68,209.03C208,210 209.02,210.31 211,213C211.38,215.54 211.38,215.54 211.39,218.62C211.4,219.77 211.41,220.92 211.42,222.11C211.41,223.35 211.4,224.59 211.4,225.88C211.4,227.15 211.4,228.43 211.41,229.74C211.41,232.44 211.41,235.14 211.39,237.84C211.37,241.3 211.38,244.76 211.4,248.22C211.42,251.52 211.41,254.82 211.4,258.13C211.4,259.37 211.41,260.61 211.42,261.89C211.4,263.62 211.4,263.62 211.39,265.38C211.39,266.4 211.38,267.41 211.38,268.46C211,271 211,271 209.69,272.82C206.78,274.85 204.42,274.48 201,274C198.01,271.19 197.07,269.49 196.45,265.4C196.41,264.03 196.39,262.66 196.39,261.29C196.37,260.57 196.36,259.84 196.34,259.09C196.29,256.79 196.27,254.49 196.25,252.19C196.22,250.62 196.19,249.05 196.16,247.49C196.09,243.66 196.04,239.83 196,236C193.65,235.23 193.65,235.23 191,235C189.08,236.01 189.08,236.01 188,238C187.54,240.46 187.54,240.46 187.59,243.22C187.57,244.23 187.55,245.25 187.53,246.29C187.52,247.35 187.51,248.41 187.5,249.5C187.48,251.59 187.45,253.69 187.41,255.78C187.4,256.71 187.39,257.64 187.38,258.6C187,261 187,261 185.66,262.8C183.05,264.69 181.12,264.45 178,264C174.22,260.87 174.45,256.59 174,252C172.94,250.72 172.94,250.72 170.5,250.88C168.06,250.72 168.06,250.72 167,252C166.76,254.26 166.62,256.51 166.48,258.77C165.91,261.44 165.16,262.37 163,264C160.06,264.5 160.06,264.5 157,264C154.32,261.76 153.14,259.9 152.59,256.43C152.38,253.35 152.29,250.28 152.25,247.19C152.22,246.11 152.19,245.04 152.16,243.93C152.09,241.29 152.04,238.64 152,236C149.1,235.32 149.1,235.32 146,235C143.14,237.86 143.7,240.7 143.69,244.53C143.67,246.06 143.64,247.59 143.62,249.12C143.59,251.53 143.56,253.94 143.54,256.36C143.52,258.69 143.48,261.01 143.44,263.34C143.44,264.06 143.44,264.78 143.44,265.53C143.38,268.43 143.33,270.5 141.69,272.96C138.81,274.74 136.28,274.35 133,274C131.31,272.83 131.31,272.83 130,271C129.61,268.42 129.61,268.42 129.6,265.29C129.58,264.12 129.57,262.95 129.56,261.74C129.56,260.48 129.56,259.21 129.57,257.91C129.56,256.61 129.56,255.31 129.55,253.97C129.54,251.23 129.54,248.48 129.55,245.73C129.57,242.21 129.55,238.69 129.52,235.17C129.49,231.81 129.5,228.45 129.5,225.09C129.49,223.2 129.49,223.2 129.47,221.26C129.48,220.09 129.49,218.92 129.5,217.71C129.5,216.68 129.5,215.64 129.5,214.58C130,212 130,212 131.85,210.17C134.82,208.55 136.66,208.52 140,209Z"
        android:fillColor="#F8FAF8"/>
    <path
        android:pathData="M309.75,189.63C310.59,189.58 311.43,189.53 312.3,189.48C316.09,190.21 318.4,192.27 321,195C322.73,197.57 324.06,200.27 325.39,203.06C325.78,203.84 326.16,204.62 326.56,205.43C327.81,207.95 329.03,210.47 330.25,213C331.1,214.73 331.94,216.46 332.79,218.19C334.45,221.58 336.11,224.97 337.75,228.37C339.64,232.28 341.56,236.16 343.5,240.04C344.42,241.9 345.33,243.76 346.25,245.63C346.66,246.44 347.07,247.26 347.5,248.11C349.31,251.87 350.33,254 349,258C346.58,258.14 344.17,258.23 341.75,258.31C341.07,258.35 340.39,258.4 339.68,258.44C336.21,258.52 334.42,258.36 331.77,256.04C329.53,252.19 327.81,248.07 326,244C315.11,243.67 304.22,243.34 293,243C292.01,245.97 291.02,248.94 290,252C287.74,256.61 287.74,256.61 285,258C279.95,258.5 275.06,258.34 270,258C270.57,253.14 272.1,249.15 274.21,244.79C274.54,244.1 274.86,243.42 275.19,242.71C276.25,240.49 277.31,238.28 278.38,236.06C279.11,234.53 279.83,233.01 280.56,231.48C281.66,229.17 282.76,226.87 283.86,224.57C286.06,219.99 288.21,215.4 290.33,210.79C291.07,209.2 291.07,209.2 291.81,207.59C292.7,205.67 293.59,203.74 294.46,201.8C297.79,194.7 301.49,189.95 309.75,189.63Z"
        android:fillColor="#0C2274"/>
    <path
        android:pathData="M367,189.69C367.87,189.69 368.73,189.7 369.63,189.7C372,190 372,190 375,192C375.37,194.7 375.37,194.7 375.36,198.18C375.36,199.48 375.36,200.77 375.37,202.11C375.35,203.53 375.34,204.96 375.33,206.38C375.33,207.83 375.32,209.28 375.32,210.74C375.32,213.78 375.3,216.82 375.28,219.87C375.25,223.78 375.24,227.69 375.24,231.6C375.23,234.59 375.22,237.59 375.21,240.59C375.21,242.03 375.2,243.48 375.2,244.92C375.19,246.93 375.18,248.94 375.16,250.95C375.15,252.1 375.15,253.24 375.14,254.43C375,257 375,257 374,258C371.67,258.1 369.33,258.13 367,258.13C365.72,258.13 364.44,258.13 363.13,258.13C360,258 360,258 359,257C358.89,255.02 358.85,253.04 358.84,251.06C358.83,249.79 358.82,248.52 358.81,247.21C358.8,245.81 358.8,244.41 358.8,243.01C358.79,241.58 358.79,240.16 358.78,238.73C358.77,235.73 358.76,232.74 358.76,229.75C358.75,225.91 358.73,222.07 358.7,218.23C358.68,215.28 358.68,212.33 358.68,209.39C358.67,207.97 358.67,206.55 358.65,205.14C358.64,203.16 358.64,201.18 358.64,199.2C358.64,198.07 358.64,196.95 358.63,195.78C359,193 359,193 360.37,191.14C362.64,189.56 364.26,189.63 367,189.69Z"
        android:fillColor="#102475"/>
    <path
        android:pathData="M412.99,286.77C415,287 415,287 418,289C418,288.34 418,287.68 418,287C419.65,287 421.3,287 423,287C423.1,291.02 423.17,295.04 423.22,299.06C423.24,300.43 423.27,301.79 423.3,303.16C423.35,305.13 423.37,307.1 423.39,309.07C423.41,310.25 423.43,311.44 423.45,312.66C422.9,316.71 421.54,318.83 419,322C415.58,324.35 413.66,325 409.5,325C405.17,323.76 403.23,322.08 400,319C401.32,317.68 402.64,316.36 404,315C404.52,315.49 405.03,315.99 405.56,316.5C408.81,318.5 411.26,318.22 415,318C415.33,316.02 415.66,314.04 416,312C415.34,312.33 414.68,312.66 414,313C411.04,313.4 408.91,313.56 406.31,311.95C404.12,310.16 402.28,308.56 401,306C399.94,294.9 399.94,294.9 402.08,291.07C403.44,289.75 403.44,289.75 406,288C407.88,286.12 410.5,286.82 412.99,286.77Z"
        android:fillColor="#125EC8"/>
    <path
        android:pathData="M267,287C269.67,287 272.33,287 275,287C276.42,286.94 276.42,286.94 277.88,286.88C281,287 281,287 283.69,288.13C284.45,288.41 285.21,288.7 286,289C286.99,288.34 287.98,287.68 289,287C292.54,286.54 294.48,286.74 297.68,288.35C301.28,292.46 300.54,296.48 300.31,301.75C300.29,302.73 300.27,303.72 300.24,304.73C300.19,307.16 300.1,309.58 300,312C298.33,312.04 296.67,312.04 295,312C292.94,309.94 293.59,305.78 293.44,302.94C293.39,302.18 293.35,301.42 293.31,300.64C293.2,298.76 293.1,296.88 293,295C291.05,294.41 291.05,294.41 289,294C286.96,296.04 287.63,300.18 287.5,303C287.14,310.86 287.14,310.86 286,312C283.5,312.13 283.5,312.13 281,312C278.88,309.88 279.58,305.38 279.44,302.44C279.39,301.63 279.35,300.82 279.31,299.99C279.2,298 279.1,296 279,294C277.35,294.33 275.7,294.66 274,295C273.67,300.28 273.34,305.56 273,311C271.35,311.33 269.7,311.66 268,312C267,311 267,311 266.89,308.68C266.89,307.68 266.9,306.68 266.9,305.65C266.91,304.57 266.91,303.49 266.91,302.38C266.92,301.24 266.93,300.11 266.94,298.94C266.94,297.8 266.95,296.66 266.95,295.48C266.96,292.65 266.98,289.83 267,287Z"
        android:fillColor="#1462CA"/>
    <path
        android:pathData="M321,287C324.06,289.44 324.06,289.44 326,292C326.33,292.33 326.66,292.66 327,293C327.13,296.5 327.13,296.5 327,300C326,301 326,301 322.62,301.1C321.23,301.09 319.83,301.08 318.44,301.06C317.73,301.06 317.02,301.05 316.28,301.05C314.52,301.04 312.76,301.02 311,301C311.99,302.65 312.98,304.3 314,306C315.61,305.75 315.61,305.75 317.25,305.5C321,305 321,305 325,305C325.33,306.32 325.66,307.64 326,309C322.08,312.03 318.94,312.47 314.15,312.29C310,311.73 307.84,309.99 305.19,306.88C303.52,302.84 303.3,299.31 304,295C308.02,287.38 312.75,285.66 321,287Z"
        android:fillColor="#1162CA"/>
    <path
        android:pathData="M385.38,286.63C386.78,286.58 386.78,286.58 388.21,286.54C392.05,287.17 393.5,287.99 396,291C396.61,294.44 396.47,297.77 396.31,301.25C396.29,302.19 396.27,303.12 396.24,304.09C396.19,306.39 396.1,308.7 396,311C393.24,311.6 390.84,312 388,312C386.72,312.1 385.44,312.21 384.13,312.31C380.69,312.3 379.98,311.99 376.94,309.94C375,307 375,307 374.94,303.38C376,300 376,300 377.5,298.13C381.21,296.45 384.97,296.25 389,296C389,295.01 389,294.02 389,293C385.05,292.82 382.4,292.91 379,295C377,293 377,293 377,289C380.29,286.81 381.52,286.68 385.38,286.63Z"
        android:fillColor="#095AC9"/>
    <path
        android:pathData="M442,287C447.5,290 447.5,290 449,293C449,295.64 449,298.28 449,301C443.72,301 438.44,301 433,301C433.66,302.32 434.32,303.64 435,305C437.92,306 437.92,306 441,306C441.99,305.34 442.98,304.68 444,304C446.19,304.38 446.19,304.38 448,305C448,306.32 448,307.64 448,309C444.45,312.21 440.83,312.57 436.22,312.43C432.42,311.69 430.64,309.78 428,307C425.87,302.74 426.28,297.6 427,293C430.55,287.11 435.56,285.98 442,287Z"
        android:fillColor="#0A60CE"/>
    <path
        android:pathData="M345,287C345.99,287.66 346.98,288.32 348,289C347.67,290.32 347.34,291.64 347,293C343.49,293 340.44,292.62 337,292C337.33,292.99 337.66,293.98 338,295C339.77,295.91 339.77,295.91 341.88,296.5C345.01,297.47 346.95,298.38 349,301C349.49,304.83 349.59,307.07 347.5,310.38C344.12,312.57 340.98,313.35 337,313C334.36,311.93 332.37,310.63 330,309C330.33,307.68 330.66,306.36 331,305C335,305 335,305 336,306C338,306.04 340,306.04 342,306C342,305.34 342,304.68 342,304C340.95,303.62 340.95,303.62 339.88,303.23C338.97,302.89 338.06,302.54 337.13,302.19C336.22,301.85 335.32,301.51 334.38,301.17C332,300 332,300 330,297C330.07,292.92 330.43,290.71 333,287.5C337.16,285.42 340.56,285.82 345,287Z"
        android:fillColor="#1662C7"/>
    <path
        android:pathData="M365,286C368.38,287.5 368.38,287.5 371,289C370.34,290.65 369.68,292.3 369,294C366.03,293.67 363.06,293.34 360,293C360,293.66 360,294.32 360,295C360.61,295.18 361.23,295.36 361.86,295.55C363.08,295.93 363.08,295.93 364.31,296.31C365.51,296.68 365.51,296.68 366.74,297.05C369.15,298.06 370.39,298.96 372,301C372.68,304.93 372.31,306.52 370.13,309.88C366.31,312.47 363.91,312.71 359.38,312.51C355.62,311.71 354.27,310.02 352,307C352.99,305.52 352.99,305.52 354,304C354.72,304.33 355.44,304.66 356.19,305C359.02,306.01 361.03,306.17 364,306C364.33,305.01 364.66,304.02 365,303C364.39,302.9 363.77,302.8 363.14,302.7C356.58,301.49 356.58,301.49 353.94,299.25C352.64,296.14 352.39,294.34 353,291C356.76,286.88 359.4,285.07 365,286Z"
        android:fillColor="#115EC9"/>
    <path
        android:pathData="M308,209C311,210 311,210 312.07,211.64C312.39,212.34 312.71,213.03 313.04,213.75C313.39,214.5 313.75,215.26 314.11,216.03C314.64,217.22 314.64,217.22 315.19,218.44C315.56,219.23 315.92,220.02 316.3,220.83C319,226.7 319,226.7 319,229C312.73,229 306.46,229 300,229C303.38,218.88 303.38,218.88 305.69,213.94C306.12,213 306.56,212.06 307.01,211.09C307.34,210.4 307.66,209.71 308,209Z"
        android:fillColor="#F0F2F5"/>
    <path
        android:pathData="M380,297C380.8,297.46 380.8,297.46 381.63,297.94C384.4,299.18 387,299.59 390,300C390.15,307.68 390.15,307.68 389,311C388,312 388,312 384.25,312.38C380.79,312.32 379.98,311.99 376.94,309.94C375,307 375,307 374.94,303.38C376.06,299.79 376.77,298.77 380,297Z"
        android:fillColor="#1765C7"/>
    <path
        android:pathData="M442,287C447.5,290 447.5,290 449,293C449,295.64 449,298.28 449,301C443.72,301 438.44,301 433,301C433,299.68 433,298.36 433,297C436.3,297 439.6,297 443,297C442.01,295.68 441.02,294.36 440,293C438.02,293.33 436.04,293.66 434,294C434,292.68 434,291.36 434,290C431.03,291.98 431.03,291.98 428,294C430.69,287.49 435.13,285.77 442,287Z"
        android:fillColor="#0D5EC6"/>
    <path
        android:pathData="M409,293C412,292.63 412,292.63 415,293C417.47,296.7 417.31,298.62 417,303C416,305.44 416,305.44 415,307C412.69,307.25 412.69,307.25 410,307C407.21,304.6 407.01,303.13 406.69,299.44C407,296 407,296 409,293Z"
        android:fillColor="#F1F7FB"/>
    <path
        android:pathData="M103,288C103.33,288 103.66,288 104,288C104.03,289 104.05,290.01 104.08,291.04C104.17,294.78 104.27,298.52 104.37,302.25C104.42,303.87 104.46,305.48 104.5,307.1C104.56,309.42 104.62,311.75 104.68,314.07C104.7,314.79 104.72,315.51 104.73,316.25C104.84,319.94 105.14,323.41 106,327C113.39,328.34 121.73,329.19 129,327C126.1,330.03 124.82,330.94 120.48,331.24C119.05,331.27 117.62,331.29 116.19,331.31C115.48,331.34 114.76,331.37 114.03,331.4C110.64,331.44 108.28,331.15 105.29,329.53C101.96,325.85 102.36,322.87 102.51,318.08C102.52,317.22 102.53,316.36 102.53,315.47C102.56,312.73 102.62,309.99 102.69,307.25C102.71,305.39 102.74,303.53 102.76,301.67C102.81,297.11 102.9,292.56 103,288Z"
        android:fillColor="#4B84D8"/>
    <path
        android:pathData="M365,286C368.38,287.5 368.38,287.5 371,289C370.34,290.65 369.68,292.3 369,294C367.52,293.72 366.04,293.42 364.56,293.13C363.74,292.96 362.92,292.8 362.07,292.63C361.38,292.42 360.7,292.22 360,292C359.67,291.34 359.34,290.68 359,290C356.66,292.26 354.81,294.28 353,297C352.63,294.31 352.63,294.31 353,291C356.76,286.88 359.4,285.07 365,286Z"
        android:fillColor="#2469BF"/>
    <path
        android:pathData="M433,301C438.28,301 443.56,301 449,301C446.62,304.57 444.97,305.47 441,307C437.75,307 437.75,307 435,306C434.34,304.35 433.68,302.7 433,301Z"
        android:fillColor="#E8F4F8"/>
    <path
        android:pathData="M448,295C448.33,295 448.66,295 449,295C449,296.98 449,298.96 449,301C443.72,301 438.44,301 433,301C433,299.68 433,298.36 433,297C436.63,297 440.26,297 444,297C444.33,297.99 444.66,298.98 445,300C445.99,300 446.98,300 448,300C448,298.35 448,296.7 448,295Z"
        android:fillColor="#0858BA"/>
    <path
        android:pathData="M39,27C39.66,27.33 40.32,27.66 41,28C40.12,28.94 39.24,29.88 38.33,30.85C37.16,32.11 35.99,33.37 34.81,34.63C34.23,35.24 33.66,35.86 33.06,36.5C29.58,40.24 26.23,44.04 23,48C23,42.44 27.58,38.15 31,34C33.54,31.49 36.18,29.19 39,27Z"
        android:fillColor="#D9E6F1"/>
    <path
        android:pathData="M386,287C385.67,288.32 385.34,289.64 385,291C385.99,291.33 386.98,291.66 388,292C385,293 382,294 379,295C377,293 377,293 377,289C380.44,286.71 381.99,286.82 386,287Z"
        android:fillColor="#1D67C0"/>
    <path
        android:pathData="M193.69,234.13C196,235 196,235 197,237C195.86,237.15 195.86,237.15 194.69,237.31C191.71,238.07 190.86,238.63 189,241C188.5,243.12 188.5,243.12 188.49,245.45C188.45,246.3 188.42,247.14 188.38,248.02C188.36,248.9 188.34,249.78 188.31,250.69C188.28,251.58 188.24,252.47 188.21,253.39C188.13,255.59 188.06,257.8 188,260C187.67,260 187.34,260 187,260C186.88,256.42 186.81,252.83 186.75,249.25C186.72,248.23 186.68,247.22 186.65,246.17C186.55,238.66 186.55,238.66 188.85,235.29C191,234 191,234 193.69,234.13Z"
        android:fillColor="#4DA1DE"/>
    <path
        android:pathData="M154,312C152.62,312.65 152.62,312.65 151.22,313.32C144.31,316.66 137.9,320 132,325C132,324.01 132,323.02 132,322C137.66,316.92 146.01,309.53 154,312Z"
        android:fillColor="#1B6BD1"/>
    <path
        android:pathData="M387.13,300.88C388.07,300.92 389.02,300.96 390,301C389.13,305.88 389.13,305.88 388,307C386.33,307.04 384.67,307.04 383,307C382.38,305.13 382.38,305.13 382,303C384,301 384,301 387.13,300.88Z"
        android:fillColor="#E8F4F9"/>
    <path
        android:pathData="M383,292C384.98,292 386.96,292 389,292C389.56,293.94 389.56,293.94 390,296C389,297 389,297 387.15,297.1C385.1,297.07 383.05,297.03 381,297C381.66,295.35 382.32,293.7 383,292Z"
        android:fillColor="#D7EAF5"/>
    <path
        android:pathData="M311,297C314.63,297 318.26,297 322,297C321.67,297.99 321.34,298.98 321,300C317.53,301.16 314.64,301.07 311,301C311,299.68 311,298.36 311,297Z"
        android:fillColor="#055AC1"/>
    <path
        android:pathData="M436,292C438.44,292.19 438.44,292.19 441,293C441.66,294.32 442.32,295.64 443,297C439.7,297 436.4,297 433,297C435,293 435,293 436,292Z"
        android:fillColor="#C8E6F4"/>
    <path
        android:pathData="M314,292C316.44,292.19 316.44,292.19 319,293C319.66,294.32 320.32,295.64 321,297C317.7,297 314.4,297 311,297C313,293 313,293 314,292Z"
        android:fillColor="#D4EBF6"/>
    <path
        android:pathData="M115,180C115.66,180.33 116.32,180.66 117,181C115.71,182.34 114.42,183.67 113.13,185C112.41,185.74 111.69,186.49 110.95,187.25C109,189 109,189 107,189C106.78,189.93 106.78,189.93 106.56,190.88C106,193 106,193 105,195C104.34,195 103.68,195 103,195C104.77,188.71 109.67,183.55 115,180Z"
        android:fillColor="#1C90DC"/>
    <path
        android:pathData="M21,9C21.33,9.66 21.66,10.32 22,11C18.33,14.67 14.67,18.33 11,22C10.34,21.67 9.68,21.34 9,21C12.72,16.58 16.3,12.42 21,9Z"
        android:fillColor="#094791"/>
    <path
        android:pathData="M198,211C198.99,211.33 199.98,211.66 201,212C196.74,215.76 192.48,219.5 188,223C187.34,222.67 186.68,222.34 186,222C189.96,218.37 193.92,214.74 198,211Z"
        android:fillColor="#DCF0F6"/>
    <path
        android:pathData="M337,292C339.88,291.88 339.88,291.88 343,292C345,294 345,294 345,297C342.69,296.67 340.38,296.34 338,296C337.67,294.68 337.34,293.36 337,292Z"
        android:fillColor="#EBF5F9"/>
    <path
        android:pathData="M448,305C448,306.32 448,307.64 448,309C446.02,309.99 446.02,309.99 444,311C443.34,309.02 442.68,307.04 442,305C444.49,303.75 445.41,304.22 448,305Z"
        android:fillColor="#2464BB"/>
    <path
        android:pathData="M336,302C338.97,302.49 338.97,302.49 342,303C342,304.32 342,305.64 342,307C340.02,307 338.04,307 336,307C336,305.35 336,303.7 336,302Z"
        android:fillColor="#E8F3F9"/>
    <path
        android:pathData="M360,292C361.65,292 363.3,292 365,292C365.33,293.32 365.66,294.64 366,296C364.02,296 362.04,296 360,296C360,294.68 360,293.36 360,292Z"
        android:fillColor="#E6F3F9"/>
    <path
        android:pathData="M146,234C151.71,234.71 151.71,234.71 153,236C153.04,237.67 153.04,239.33 153,241C152.34,239.68 151.68,238.36 151,237C147.07,237.57 147.07,237.57 144,240C144.88,235.13 144.88,235.13 146,234Z"
        android:fillColor="#2287D7"/>
    <path
        android:pathData="M433,301C438.28,301 443.56,301 449,301C448.01,302.48 448.01,302.48 447,304C446.34,304 445.68,304 445,304C445,303.34 445,302.68 445,302C439.06,302.49 439.06,302.49 433,303C433,302.34 433,301.68 433,301Z"
        android:fillColor="#C7E4F4"/>
    <path
        android:pathData="M354,304C356.48,304.99 356.48,304.99 359,306C358.01,306.33 357.02,306.66 356,307C355.27,309.02 355.27,309.02 355,311C354.01,309.68 353.02,308.36 352,307C352.66,306.01 353.32,305.02 354,304Z"
        android:fillColor="#346BBA"/>
    <path
        android:pathData="M233,294C233.66,294.33 234.32,294.66 235,295C234.05,296.17 233.09,297.34 232.13,298.5C231.59,299.15 231.06,299.8 230.51,300.47C230.01,300.97 229.51,301.48 229,302C228.34,302 227.68,302 227,302C227,301.34 227,300.68 227,300C227.66,300 228.32,300 229,300C229.29,299.38 229.58,298.76 229.88,298.13C231,296 231,296 233,294Z"
        android:fillColor="#257BD3"/>
    <path
        android:pathData="M407,287C407.66,287.33 408.32,287.66 409,288C408.39,288.6 408.39,288.6 407.76,289.21C407.22,289.74 406.68,290.27 406.13,290.81C405.59,291.33 405.06,291.86 404.51,292.39C402.79,294.13 402.79,294.13 401,297C401.41,292.17 403.46,290.17 407,287Z"
        android:fillColor="#2466BF"/>
    <path
        android:pathData="M140,209C139.46,209.25 138.93,209.49 138.38,209.75C135.44,211.3 132.74,213.13 130,215C130.31,213.13 130.31,213.13 131,211C134.44,208.71 135.99,208.82 140,209Z"
        android:fillColor="#CCEBF4"/>
    <path
        android:pathData="M334,287C334.66,287.33 335.32,287.66 336,288C335.38,288.74 334.76,289.48 334.13,290.25C332.4,292.49 331.14,294.44 330,297C330.62,290.48 330.62,290.48 332.56,288.06C333.27,287.54 333.27,287.54 334,287Z"
        android:fillColor="#286ABF"/>
    <path
        android:pathData="M358,289C358,291 358,291 356.63,292.44C356.09,292.95 355.55,293.47 355,294C354.34,294.99 353.68,295.98 353,297C352.88,294.13 352.88,294.13 353,291C355,289 355,289 358,289Z"
        android:fillColor="#1B60BA"/>
    <path
        android:pathData="M308,191C307.44,191.25 306.89,191.49 306.31,191.75C303.6,193.22 301.36,195.03 299,197C299.31,195.13 299.31,195.13 300,193C303.23,190.85 304.28,190.8 308,191Z"
        android:fillColor="#102367"/>
    <path
        android:pathData="M471,29C474.8,30.49 476.61,32.76 479,36C476.05,34.63 473.48,33.12 471,31C471,30.34 471,29.68 471,29Z"
        android:fillColor="#E5F0F8"/>
  </group>
</vector>
app/src/main/res/drawable/ic_reminder.xml
@@ -1,12 +1,147 @@
<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
    android:width="24dp"
    android:height="24dp"
    android:viewportWidth="24"
    android:viewportHeight="24">
    <path
        android:fillColor="#FFD700"
        android:pathData="M12,1a11,11 0 0,1 0,22a11,11 0 0,1 0,-22zM12,18a2,2 0 0,1 0,4h-2v-4h2zm0,-12a3,3 0 0,0 -3,3v5h6V9a3,3 0 0,0 -3,-3z"/>
</vector>
    android:width="512dp"
    android:height="512dp"
    android:viewportWidth="512"
    android:viewportHeight="512">
  <path
      android:pathData="M58.45,-0.39C60.22,-0.39 61.99,-0.4 63.77,-0.4C68.62,-0.42 73.48,-0.41 78.34,-0.41C83.58,-0.4 88.83,-0.41 94.07,-0.42C104.34,-0.44 114.61,-0.44 124.88,-0.44C133.23,-0.43 141.57,-0.44 149.92,-0.44C151.7,-0.44 151.7,-0.44 153.52,-0.44C155.94,-0.44 158.35,-0.45 160.77,-0.45C183.4,-0.46 206.04,-0.46 228.68,-0.44C249.38,-0.43 270.09,-0.45 290.79,-0.47C312.06,-0.5 333.33,-0.51 354.59,-0.5C366.53,-0.49 378.47,-0.5 390.4,-0.51C400.56,-0.53 410.72,-0.53 420.89,-0.51C426.07,-0.5 431.25,-0.5 436.43,-0.52C441.18,-0.53 445.93,-0.53 450.68,-0.51C452.39,-0.5 454.1,-0.51 455.82,-0.52C472.46,-0.61 485.77,3.14 498.25,14.69C506.11,22.99 511.32,33.06 511.26,44.55C511.26,45.29 511.27,46.03 511.27,46.8C511.28,49.29 511.28,51.78 511.27,54.27C511.28,56.07 511.28,57.88 511.29,59.68C511.3,64.64 511.31,69.59 511.31,74.55C511.31,79.9 511.32,85.24 511.33,90.59C511.35,102.28 511.36,113.97 511.37,125.66C511.37,132.96 511.38,140.26 511.38,147.56C511.4,167.77 511.42,187.98 511.42,208.2C511.42,209.49 511.42,210.78 511.42,212.12C511.42,214.74 511.42,217.36 511.42,219.98C511.43,221.28 511.43,222.59 511.43,223.93C511.43,225.88 511.43,225.88 511.43,227.88C511.43,248.99 511.46,270.11 511.49,291.23C511.53,312.91 511.55,334.6 511.55,356.28C511.55,368.45 511.56,380.63 511.59,392.8C511.61,403.17 511.62,413.53 511.61,423.9C511.6,429.18 511.6,434.47 511.62,439.76C511.64,444.6 511.64,449.45 511.62,454.29C511.62,456.04 511.62,457.79 511.64,459.54C511.76,475.35 508.03,486.55 496.97,498.12C488.86,505.88 479.12,511.16 467.82,511.14C467.08,511.14 466.35,511.14 465.58,511.15C463.09,511.15 460.59,511.15 458.09,511.15C456.29,511.16 454.49,511.16 452.69,511.17C447.73,511.18 442.76,511.18 437.8,511.19C432.45,511.2 427.1,511.21 421.75,511.22C408.83,511.24 395.91,511.26 382.98,511.27C379.33,511.27 375.68,511.28 372.03,511.28C349.37,511.31 326.71,511.33 304.05,511.34C298.8,511.34 293.55,511.35 288.3,511.35C286.34,511.35 286.34,511.35 284.34,511.35C263.21,511.36 242.07,511.4 220.93,511.44C199.24,511.48 177.54,511.51 155.84,511.51C143.66,511.51 131.48,511.53 119.29,511.56C108.92,511.59 98.54,511.6 88.16,511.59C82.87,511.58 77.57,511.58 72.28,511.61C67.43,511.63 62.58,511.63 57.73,511.61C55.98,511.61 54.23,511.62 52.48,511.63C36.65,511.76 25.45,508.03 13.88,496.97C5.06,487.76 -0.24,476.27 -0.26,463.46C-0.26,462.36 -0.26,462.36 -0.27,461.24C-0.28,458.8 -0.27,456.36 -0.27,453.91C-0.27,452.14 -0.28,450.37 -0.28,448.6C-0.29,443.74 -0.29,438.87 -0.29,434.01C-0.29,428.76 -0.3,423.52 -0.31,418.27C-0.33,407.99 -0.33,397.71 -0.33,387.43C-0.34,379.08 -0.34,370.72 -0.35,362.36C-0.36,338.67 -0.37,314.98 -0.37,291.29C-0.37,290.01 -0.37,288.73 -0.37,287.42C-0.37,286.14 -0.37,284.86 -0.37,283.54C-0.37,262.82 -0.39,242.09 -0.42,221.37C-0.45,200.09 -0.46,178.81 -0.46,157.53C-0.46,145.58 -0.46,133.64 -0.48,121.69C-0.5,111.52 -0.51,101.34 -0.49,91.17C-0.49,85.98 -0.49,80.8 -0.5,75.61C-0.52,70.85 -0.52,66.1 -0.5,61.35C-0.5,59.63 -0.5,57.91 -0.51,56.2C-0.61,39.55 3.14,26.24 14.69,13.75C27.6,1.59 41.53,-0.45 58.45,-0.39Z"
      android:fillColor="#EDECE9"/>
  <path
      android:pathData="M58.45,-0.39C60.22,-0.39 61.99,-0.4 63.77,-0.4C68.62,-0.42 73.48,-0.41 78.34,-0.41C83.58,-0.4 88.83,-0.41 94.07,-0.42C104.34,-0.44 114.61,-0.44 124.88,-0.44C133.23,-0.43 141.57,-0.44 149.92,-0.44C151.7,-0.44 151.7,-0.44 153.52,-0.44C155.94,-0.44 158.35,-0.45 160.77,-0.45C183.4,-0.46 206.04,-0.46 228.68,-0.44C249.38,-0.43 270.09,-0.45 290.79,-0.47C312.06,-0.5 333.33,-0.51 354.59,-0.5C366.53,-0.49 378.47,-0.5 390.4,-0.51C400.56,-0.53 410.72,-0.53 420.89,-0.51C426.07,-0.5 431.25,-0.5 436.43,-0.52C441.18,-0.53 445.93,-0.53 450.68,-0.51C452.39,-0.5 454.1,-0.51 455.82,-0.52C472.46,-0.61 485.77,3.14 498.25,14.69C506.11,22.99 511.32,33.06 511.26,44.55C511.26,45.29 511.27,46.03 511.27,46.8C511.28,49.29 511.28,51.78 511.27,54.27C511.28,56.07 511.28,57.88 511.29,59.68C511.3,64.64 511.31,69.59 511.31,74.55C511.31,79.9 511.32,85.24 511.33,90.59C511.35,102.28 511.36,113.97 511.37,125.66C511.37,132.96 511.38,140.26 511.38,147.56C511.4,167.77 511.42,187.98 511.42,208.2C511.42,209.49 511.42,210.78 511.42,212.12C511.42,214.74 511.42,217.36 511.42,219.98C511.43,221.28 511.43,222.59 511.43,223.93C511.43,225.88 511.43,225.88 511.43,227.88C511.43,248.99 511.46,270.11 511.49,291.23C511.53,312.91 511.55,334.6 511.55,356.28C511.55,368.45 511.56,380.63 511.59,392.8C511.61,403.17 511.62,413.53 511.61,423.9C511.6,429.18 511.6,434.47 511.62,439.76C511.64,444.6 511.64,449.45 511.62,454.29C511.62,456.04 511.62,457.79 511.64,459.54C511.76,475.35 508.03,486.55 496.97,498.12C488.86,505.88 479.12,511.16 467.82,511.14C467.08,511.14 466.35,511.14 465.58,511.15C463.09,511.15 460.59,511.15 458.09,511.15C456.29,511.16 454.49,511.16 452.69,511.17C447.73,511.18 442.76,511.18 437.8,511.19C432.45,511.2 427.1,511.21 421.75,511.22C408.83,511.24 395.91,511.26 382.98,511.27C379.33,511.27 375.68,511.28 372.03,511.28C349.37,511.31 326.71,511.33 304.05,511.34C298.8,511.34 293.55,511.35 288.3,511.35C286.34,511.35 286.34,511.35 284.34,511.35C263.21,511.36 242.07,511.4 220.93,511.44C199.24,511.48 177.54,511.51 155.84,511.51C143.66,511.51 131.48,511.53 119.29,511.56C108.92,511.59 98.54,511.6 88.16,511.59C82.87,511.58 77.57,511.58 72.28,511.61C67.43,511.63 62.58,511.63 57.73,511.61C55.98,511.61 54.23,511.62 52.48,511.63C36.65,511.76 25.45,508.03 13.88,496.97C5.06,487.76 -0.24,476.27 -0.26,463.46C-0.26,462.36 -0.26,462.36 -0.27,461.24C-0.28,458.8 -0.27,456.36 -0.27,453.91C-0.27,452.14 -0.28,450.37 -0.28,448.6C-0.29,443.74 -0.29,438.87 -0.29,434.01C-0.29,428.76 -0.3,423.52 -0.31,418.27C-0.33,407.99 -0.33,397.71 -0.33,387.43C-0.34,379.08 -0.34,370.72 -0.35,362.36C-0.36,338.67 -0.37,314.98 -0.37,291.29C-0.37,290.01 -0.37,288.73 -0.37,287.42C-0.37,286.14 -0.37,284.86 -0.37,283.54C-0.37,262.82 -0.39,242.09 -0.42,221.37C-0.45,200.09 -0.46,178.81 -0.46,157.53C-0.46,145.58 -0.46,133.64 -0.48,121.69C-0.5,111.52 -0.51,101.34 -0.49,91.17C-0.49,85.98 -0.49,80.8 -0.5,75.61C-0.52,70.85 -0.52,66.1 -0.5,61.35C-0.5,59.63 -0.5,57.91 -0.51,56.2C-0.61,39.55 3.14,26.24 14.69,13.75C27.6,1.59 41.53,-0.45 58.45,-0.39ZM28.68,36.53C17.21,50.95 13.69,65.76 13.73,83.8C13.73,85.3 13.72,86.8 13.72,88.3C13.71,92.4 13.71,96.5 13.71,100.6C13.71,105.03 13.7,109.46 13.69,113.89C13.67,122.56 13.67,131.23 13.67,139.91C13.66,146.96 13.66,154.01 13.65,161.06C13.64,181.08 13.63,201.09 13.63,221.11C13.63,222.18 13.63,223.26 13.63,224.37C13.63,225.45 13.63,226.53 13.63,227.64C13.63,245.13 13.61,262.62 13.58,280.11C13.55,298.08 13.54,316.05 13.54,334.03C13.54,344.11 13.54,354.19 13.52,364.28C13.5,372.86 13.49,381.45 13.51,390.04C13.51,394.42 13.51,398.79 13.5,403.17C13.48,407.18 13.48,411.2 13.5,415.22C13.5,416.66 13.5,418.1 13.49,419.55C13.36,437.62 17.93,454.48 30.74,467.76C31.86,468.87 31.86,468.87 33,470C33.89,470.94 33.89,470.94 34.79,471.89C38.9,475.91 43.57,478.61 48.63,481.25C49.24,481.58 49.85,481.91 50.49,482.25C61.33,487.62 73.27,488.44 85.17,488.37C86.54,488.37 87.91,488.37 89.28,488.38C93,488.39 96.73,488.38 100.45,488.36C104.48,488.35 108.51,488.36 112.54,488.36C120.43,488.37 128.32,488.36 136.21,488.34C145.43,488.32 154.65,488.32 163.86,488.32C180.35,488.32 196.83,488.31 213.32,488.28C229.24,488.26 245.16,488.24 261.08,488.24C262.05,488.24 263.03,488.24 264.04,488.24C266.01,488.24 267.98,488.24 269.95,488.24C270.92,488.24 271.9,488.24 272.9,488.24C273.87,488.24 274.84,488.24 275.84,488.24C291.1,488.23 306.36,488.22 321.62,488.21C327.11,488.21 332.6,488.2 338.09,488.2C346.82,488.19 355.55,488.19 364.28,488.17C368.26,488.17 372.24,488.16 376.21,488.16C391.52,488.16 406.82,488.06 422.12,487.67C423.57,487.63 425.01,487.6 426.46,487.57C444.42,487.23 444.42,487.23 461.19,481.44C461.86,481.09 462.53,480.74 463.23,480.37C479.42,471.58 488.74,457.25 494.42,440.17C495.71,435.32 496.13,430.64 496.14,425.64C496.14,424.37 496.15,423.1 496.15,421.8C496.15,420.4 496.15,419 496.15,417.61C496.16,416.11 496.16,414.62 496.17,413.13C496.18,409.04 496.18,404.94 496.19,400.85C496.2,396.43 496.21,392.01 496.22,387.6C496.24,376.93 496.26,366.26 496.27,355.59C496.27,352.58 496.28,349.57 496.28,346.55C496.31,327.82 496.33,309.08 496.34,290.35C496.34,286.01 496.35,281.67 496.35,277.34C496.35,275.72 496.35,275.72 496.35,274.07C496.36,256.62 496.4,239.17 496.44,221.71C496.48,203.78 496.51,185.85 496.51,167.92C496.51,157.86 496.53,147.8 496.56,137.73C496.59,129.16 496.6,120.59 496.59,112.02C496.58,107.65 496.58,103.28 496.61,98.91C496.63,94.9 496.63,90.89 496.61,86.88C496.61,85.44 496.61,84 496.63,82.56C496.82,63.37 490.33,46.51 476.86,32.73C462.6,19.11 445.86,14.53 426.57,14.61C425.03,14.61 423.49,14.6 421.95,14.6C417.73,14.58 413.52,14.59 409.31,14.59C404.76,14.6 400.2,14.59 395.65,14.58C386.74,14.56 377.83,14.56 368.92,14.56C361.68,14.57 354.43,14.56 347.19,14.56C346.15,14.56 345.12,14.56 344.06,14.56C341.96,14.56 339.86,14.55 337.76,14.55C318.11,14.54 298.45,14.54 278.79,14.56C260.82,14.57 242.86,14.55 224.89,14.53C206.42,14.5 187.96,14.49 169.49,14.5C159.13,14.51 148.77,14.5 138.41,14.49C129.59,14.47 120.77,14.47 111.95,14.49C107.45,14.5 102.96,14.5 98.46,14.48C94.34,14.47 90.21,14.47 86.09,14.49C84.6,14.5 83.12,14.49 81.64,14.48C61.59,14.35 42.09,20.98 28.68,36.53Z"
      android:fillColor="#0272EF"/>
  <path
      android:pathData="M135.08,174.82C135.89,174.82 136.71,174.81 137.54,174.8C140.23,174.78 142.91,174.77 145.6,174.76C146.98,174.76 146.98,174.76 148.39,174.75C153.26,174.73 158.14,174.71 163.01,174.7C168.03,174.69 173.04,174.66 178.06,174.62C181.93,174.59 185.8,174.59 189.68,174.58C191.52,174.58 193.37,174.57 195.22,174.55C208.36,174.42 219.37,175.09 229.93,183.87C237.1,191.23 241.29,199.58 241.32,209.81C241.34,210.97 241.34,210.97 241.35,212.15C241.38,214.7 241.4,217.24 241.41,219.79C241.41,221.1 241.41,221.1 241.42,222.43C241.45,227.06 241.47,231.69 241.48,236.32C241.49,241.08 241.54,245.83 241.6,250.59C241.63,254.27 241.64,257.95 241.65,261.63C241.65,263.38 241.67,265.13 241.7,266.88C241.88,279.92 240.04,290.5 230.77,300.47C221.61,308.39 212.72,310.29 200.95,310.31C198.56,310.33 196.16,310.36 193.77,310.38C190.01,310.41 186.25,310.44 182.5,310.46C178.86,310.48 175.22,310.52 171.58,310.56C169.91,310.56 169.91,310.56 168.21,310.56C152.52,310.76 142.14,317.02 130.45,327.05C125.7,330.84 122.09,331.36 116.06,331.38C115.36,331.4 114.66,331.42 113.93,331.45C110.58,331.47 108.25,331.14 105.3,329.54C101.94,325.83 102.32,322.76 102.4,317.92C102.39,317.04 102.38,316.15 102.37,315.24C102.35,312.41 102.36,309.58 102.38,306.75C102.38,303.93 102.38,301.12 102.35,298.3C102.34,296.55 102.34,294.8 102.36,293.05C102.35,288.97 102.12,286.28 100.51,282.46C97.76,275.84 98.48,268.14 98.46,261.09C98.45,259.43 98.44,257.77 98.42,256.11C98.4,252.64 98.39,249.17 98.39,245.69C98.38,241.28 98.33,236.87 98.27,232.46C98.23,229.04 98.22,225.61 98.22,222.18C98.21,220.56 98.2,218.93 98.17,217.31C97.97,204.98 99.78,194.97 108.31,185.42C116.3,177.76 124.19,174.86 135.08,174.82Z"
      android:fillColor="#0286F7"/>
  <path
      android:pathData="M140,209C142.49,210.72 142.49,210.72 144.88,213.06C145.74,213.89 146.6,214.72 147.49,215.57C148.32,216.37 149.15,217.17 150,218C151.32,219.18 152.66,220.34 154,221.5C156.23,223.44 158.43,225.4 160.61,227.4C161.5,228.22 162.39,229.03 163.31,229.88C164.13,230.64 164.95,231.4 165.8,232.18C167.95,234.19 167.95,234.19 171,235C171.63,234.43 172.26,233.86 172.91,233.28C183.01,224.16 183.01,224.16 186.8,220.91C188.53,219.41 190.23,217.86 191.92,216.31C192.97,215.37 194.01,214.44 195.06,213.5C196.02,212.62 196.98,211.75 197.97,210.84C201,209 201,209 204.68,209.03C208,210 209.02,210.31 211,213C211.38,215.54 211.38,215.54 211.39,218.62C211.4,219.77 211.41,220.92 211.42,222.11C211.41,223.35 211.4,224.59 211.4,225.88C211.4,227.15 211.4,228.43 211.41,229.74C211.41,232.44 211.41,235.14 211.39,237.84C211.37,241.3 211.38,244.76 211.4,248.22C211.42,251.52 211.41,254.82 211.4,258.13C211.4,259.37 211.41,260.61 211.42,261.89C211.4,263.62 211.4,263.62 211.39,265.38C211.39,266.4 211.38,267.41 211.38,268.46C211,271 211,271 209.69,272.82C206.78,274.85 204.42,274.48 201,274C198.01,271.19 197.07,269.49 196.45,265.4C196.41,264.03 196.39,262.66 196.39,261.29C196.37,260.57 196.36,259.84 196.34,259.09C196.29,256.79 196.27,254.49 196.25,252.19C196.22,250.62 196.19,249.05 196.16,247.49C196.09,243.66 196.04,239.83 196,236C193.65,235.23 193.65,235.23 191,235C189.08,236.01 189.08,236.01 188,238C187.54,240.46 187.54,240.46 187.59,243.22C187.57,244.23 187.55,245.25 187.53,246.29C187.52,247.35 187.51,248.41 187.5,249.5C187.48,251.59 187.45,253.69 187.41,255.78C187.4,256.71 187.39,257.64 187.38,258.6C187,261 187,261 185.66,262.8C183.05,264.69 181.12,264.45 178,264C174.22,260.87 174.45,256.59 174,252C172.94,250.72 172.94,250.72 170.5,250.88C168.06,250.72 168.06,250.72 167,252C166.76,254.26 166.62,256.51 166.48,258.77C165.91,261.44 165.16,262.37 163,264C160.06,264.5 160.06,264.5 157,264C154.32,261.76 153.14,259.9 152.59,256.43C152.38,253.35 152.29,250.28 152.25,247.19C152.22,246.11 152.19,245.04 152.16,243.93C152.09,241.29 152.04,238.64 152,236C149.1,235.32 149.1,235.32 146,235C143.14,237.86 143.7,240.7 143.69,244.53C143.67,246.06 143.64,247.59 143.62,249.12C143.59,251.53 143.56,253.94 143.54,256.36C143.52,258.69 143.48,261.01 143.44,263.34C143.44,264.06 143.44,264.78 143.44,265.53C143.38,268.43 143.33,270.5 141.69,272.96C138.81,274.74 136.28,274.35 133,274C131.31,272.83 131.31,272.83 130,271C129.61,268.42 129.61,268.42 129.6,265.29C129.58,264.12 129.57,262.95 129.56,261.74C129.56,260.48 129.56,259.21 129.57,257.91C129.56,256.61 129.56,255.31 129.55,253.97C129.54,251.23 129.54,248.48 129.55,245.73C129.57,242.21 129.55,238.69 129.52,235.17C129.49,231.81 129.5,228.45 129.5,225.09C129.49,223.2 129.49,223.2 129.47,221.26C129.48,220.09 129.49,218.92 129.5,217.71C129.5,216.68 129.5,215.64 129.5,214.58C130,212 130,212 131.85,210.17C134.82,208.55 136.66,208.52 140,209Z"
      android:fillColor="#F8FAF8"/>
  <path
      android:pathData="M309.75,189.63C310.59,189.58 311.43,189.53 312.3,189.48C316.09,190.21 318.4,192.27 321,195C322.73,197.57 324.06,200.27 325.39,203.06C325.78,203.84 326.16,204.62 326.56,205.43C327.81,207.95 329.03,210.47 330.25,213C331.1,214.73 331.94,216.46 332.79,218.19C334.45,221.58 336.11,224.97 337.75,228.37C339.64,232.28 341.56,236.16 343.5,240.04C344.42,241.9 345.33,243.76 346.25,245.63C346.66,246.44 347.07,247.26 347.5,248.11C349.31,251.87 350.33,254 349,258C346.58,258.14 344.17,258.23 341.75,258.31C341.07,258.35 340.39,258.4 339.68,258.44C336.21,258.52 334.42,258.36 331.77,256.04C329.53,252.19 327.81,248.07 326,244C315.11,243.67 304.22,243.34 293,243C292.01,245.97 291.02,248.94 290,252C287.74,256.61 287.74,256.61 285,258C279.95,258.5 275.06,258.34 270,258C270.57,253.14 272.1,249.15 274.21,244.79C274.54,244.1 274.86,243.42 275.19,242.71C276.25,240.49 277.31,238.28 278.38,236.06C279.11,234.53 279.83,233.01 280.56,231.48C281.66,229.17 282.76,226.87 283.86,224.57C286.06,219.99 288.21,215.4 290.33,210.79C291.07,209.2 291.07,209.2 291.81,207.59C292.7,205.67 293.59,203.74 294.46,201.8C297.79,194.7 301.49,189.95 309.75,189.63Z"
      android:fillColor="#0C2274"/>
  <path
      android:pathData="M367,189.69C367.87,189.69 368.73,189.7 369.63,189.7C372,190 372,190 375,192C375.37,194.7 375.37,194.7 375.36,198.18C375.36,199.48 375.36,200.77 375.37,202.11C375.35,203.53 375.34,204.96 375.33,206.38C375.33,207.83 375.32,209.28 375.32,210.74C375.32,213.78 375.3,216.82 375.28,219.87C375.25,223.78 375.24,227.69 375.24,231.6C375.23,234.59 375.22,237.59 375.21,240.59C375.21,242.03 375.2,243.48 375.2,244.92C375.19,246.93 375.18,248.94 375.16,250.95C375.15,252.1 375.15,253.24 375.14,254.43C375,257 375,257 374,258C371.67,258.1 369.33,258.13 367,258.13C365.72,258.13 364.44,258.13 363.13,258.13C360,258 360,258 359,257C358.89,255.02 358.85,253.04 358.84,251.06C358.83,249.79 358.82,248.52 358.81,247.21C358.8,245.81 358.8,244.41 358.8,243.01C358.79,241.58 358.79,240.16 358.78,238.73C358.77,235.73 358.76,232.74 358.76,229.75C358.75,225.91 358.73,222.07 358.7,218.23C358.68,215.28 358.68,212.33 358.68,209.39C358.67,207.97 358.67,206.55 358.65,205.14C358.64,203.16 358.64,201.18 358.64,199.2C358.64,198.07 358.64,196.95 358.63,195.78C359,193 359,193 360.37,191.14C362.64,189.56 364.26,189.63 367,189.69Z"
      android:fillColor="#102475"/>
  <path
      android:pathData="M412.99,286.77C415,287 415,287 418,289C418,288.34 418,287.68 418,287C419.65,287 421.3,287 423,287C423.1,291.02 423.17,295.04 423.22,299.06C423.24,300.43 423.27,301.79 423.3,303.16C423.35,305.13 423.37,307.1 423.39,309.07C423.41,310.25 423.43,311.44 423.45,312.66C422.9,316.71 421.54,318.83 419,322C415.58,324.35 413.66,325 409.5,325C405.17,323.76 403.23,322.08 400,319C401.32,317.68 402.64,316.36 404,315C404.52,315.49 405.03,315.99 405.56,316.5C408.81,318.5 411.26,318.22 415,318C415.33,316.02 415.66,314.04 416,312C415.34,312.33 414.68,312.66 414,313C411.04,313.4 408.91,313.56 406.31,311.95C404.12,310.16 402.28,308.56 401,306C399.94,294.9 399.94,294.9 402.08,291.07C403.44,289.75 403.44,289.75 406,288C407.88,286.12 410.5,286.82 412.99,286.77Z"
      android:fillColor="#125EC8"/>
  <path
      android:pathData="M267,287C269.67,287 272.33,287 275,287C276.42,286.94 276.42,286.94 277.88,286.88C281,287 281,287 283.69,288.13C284.45,288.41 285.21,288.7 286,289C286.99,288.34 287.98,287.68 289,287C292.54,286.54 294.48,286.74 297.68,288.35C301.28,292.46 300.54,296.48 300.31,301.75C300.29,302.73 300.27,303.72 300.24,304.73C300.19,307.16 300.1,309.58 300,312C298.33,312.04 296.67,312.04 295,312C292.94,309.94 293.59,305.78 293.44,302.94C293.39,302.18 293.35,301.42 293.31,300.64C293.2,298.76 293.1,296.88 293,295C291.05,294.41 291.05,294.41 289,294C286.96,296.04 287.63,300.18 287.5,303C287.14,310.86 287.14,310.86 286,312C283.5,312.13 283.5,312.13 281,312C278.88,309.88 279.58,305.38 279.44,302.44C279.39,301.63 279.35,300.82 279.31,299.99C279.2,298 279.1,296 279,294C277.35,294.33 275.7,294.66 274,295C273.67,300.28 273.34,305.56 273,311C271.35,311.33 269.7,311.66 268,312C267,311 267,311 266.89,308.68C266.89,307.68 266.9,306.68 266.9,305.65C266.91,304.57 266.91,303.49 266.91,302.38C266.92,301.24 266.93,300.11 266.94,298.94C266.94,297.8 266.95,296.66 266.95,295.48C266.96,292.65 266.98,289.83 267,287Z"
      android:fillColor="#1462CA"/>
  <path
      android:pathData="M321,287C324.06,289.44 324.06,289.44 326,292C326.33,292.33 326.66,292.66 327,293C327.13,296.5 327.13,296.5 327,300C326,301 326,301 322.62,301.1C321.23,301.09 319.83,301.08 318.44,301.06C317.73,301.06 317.02,301.05 316.28,301.05C314.52,301.04 312.76,301.02 311,301C311.99,302.65 312.98,304.3 314,306C315.61,305.75 315.61,305.75 317.25,305.5C321,305 321,305 325,305C325.33,306.32 325.66,307.64 326,309C322.08,312.03 318.94,312.47 314.15,312.29C310,311.73 307.84,309.99 305.19,306.88C303.52,302.84 303.3,299.31 304,295C308.02,287.38 312.75,285.66 321,287Z"
      android:fillColor="#1162CA"/>
  <path
      android:pathData="M385.38,286.63C386.78,286.58 386.78,286.58 388.21,286.54C392.05,287.17 393.5,287.99 396,291C396.61,294.44 396.47,297.77 396.31,301.25C396.29,302.19 396.27,303.12 396.24,304.09C396.19,306.39 396.1,308.7 396,311C393.24,311.6 390.84,312 388,312C386.72,312.1 385.44,312.21 384.13,312.31C380.69,312.3 379.98,311.99 376.94,309.94C375,307 375,307 374.94,303.38C376,300 376,300 377.5,298.13C381.21,296.45 384.97,296.25 389,296C389,295.01 389,294.02 389,293C385.05,292.82 382.4,292.91 379,295C377,293 377,293 377,289C380.29,286.81 381.52,286.68 385.38,286.63Z"
      android:fillColor="#095AC9"/>
  <path
      android:pathData="M442,287C447.5,290 447.5,290 449,293C449,295.64 449,298.28 449,301C443.72,301 438.44,301 433,301C433.66,302.32 434.32,303.64 435,305C437.92,306 437.92,306 441,306C441.99,305.34 442.98,304.68 444,304C446.19,304.38 446.19,304.38 448,305C448,306.32 448,307.64 448,309C444.45,312.21 440.83,312.57 436.22,312.43C432.42,311.69 430.64,309.78 428,307C425.87,302.74 426.28,297.6 427,293C430.55,287.11 435.56,285.98 442,287Z"
      android:fillColor="#0A60CE"/>
  <path
      android:pathData="M345,287C345.99,287.66 346.98,288.32 348,289C347.67,290.32 347.34,291.64 347,293C343.49,293 340.44,292.62 337,292C337.33,292.99 337.66,293.98 338,295C339.77,295.91 339.77,295.91 341.88,296.5C345.01,297.47 346.95,298.38 349,301C349.49,304.83 349.59,307.07 347.5,310.38C344.12,312.57 340.98,313.35 337,313C334.36,311.93 332.37,310.63 330,309C330.33,307.68 330.66,306.36 331,305C335,305 335,305 336,306C338,306.04 340,306.04 342,306C342,305.34 342,304.68 342,304C340.95,303.62 340.95,303.62 339.88,303.23C338.97,302.89 338.06,302.54 337.13,302.19C336.22,301.85 335.32,301.51 334.38,301.17C332,300 332,300 330,297C330.07,292.92 330.43,290.71 333,287.5C337.16,285.42 340.56,285.82 345,287Z"
      android:fillColor="#1662C7"/>
  <path
      android:pathData="M365,286C368.38,287.5 368.38,287.5 371,289C370.34,290.65 369.68,292.3 369,294C366.03,293.67 363.06,293.34 360,293C360,293.66 360,294.32 360,295C360.61,295.18 361.23,295.36 361.86,295.55C363.08,295.93 363.08,295.93 364.31,296.31C365.51,296.68 365.51,296.68 366.74,297.05C369.15,298.06 370.39,298.96 372,301C372.68,304.93 372.31,306.52 370.13,309.88C366.31,312.47 363.91,312.71 359.38,312.51C355.62,311.71 354.27,310.02 352,307C352.99,305.52 352.99,305.52 354,304C354.72,304.33 355.44,304.66 356.19,305C359.02,306.01 361.03,306.17 364,306C364.33,305.01 364.66,304.02 365,303C364.39,302.9 363.77,302.8 363.14,302.7C356.58,301.49 356.58,301.49 353.94,299.25C352.64,296.14 352.39,294.34 353,291C356.76,286.88 359.4,285.07 365,286Z"
      android:fillColor="#115EC9"/>
  <path
      android:pathData="M308,209C311,210 311,210 312.07,211.64C312.39,212.34 312.71,213.03 313.04,213.75C313.39,214.5 313.75,215.26 314.11,216.03C314.64,217.22 314.64,217.22 315.19,218.44C315.56,219.23 315.92,220.02 316.3,220.83C319,226.7 319,226.7 319,229C312.73,229 306.46,229 300,229C303.38,218.88 303.38,218.88 305.69,213.94C306.12,213 306.56,212.06 307.01,211.09C307.34,210.4 307.66,209.71 308,209Z"
      android:fillColor="#F0F2F5"/>
  <path
      android:pathData="M380,297C380.8,297.46 380.8,297.46 381.63,297.94C384.4,299.18 387,299.59 390,300C390.15,307.68 390.15,307.68 389,311C388,312 388,312 384.25,312.38C380.79,312.32 379.98,311.99 376.94,309.94C375,307 375,307 374.94,303.38C376.06,299.79 376.77,298.77 380,297Z"
      android:fillColor="#1765C7"/>
  <path
      android:pathData="M442,287C447.5,290 447.5,290 449,293C449,295.64 449,298.28 449,301C443.72,301 438.44,301 433,301C433,299.68 433,298.36 433,297C436.3,297 439.6,297 443,297C442.01,295.68 441.02,294.36 440,293C438.02,293.33 436.04,293.66 434,294C434,292.68 434,291.36 434,290C431.03,291.98 431.03,291.98 428,294C430.69,287.49 435.13,285.77 442,287Z"
      android:fillColor="#0D5EC6"/>
  <path
      android:pathData="M409,293C412,292.63 412,292.63 415,293C417.47,296.7 417.31,298.62 417,303C416,305.44 416,305.44 415,307C412.69,307.25 412.69,307.25 410,307C407.21,304.6 407.01,303.13 406.69,299.44C407,296 407,296 409,293Z"
      android:fillColor="#F1F7FB"/>
  <path
      android:pathData="M103,288C103.33,288 103.66,288 104,288C104.03,289 104.05,290.01 104.08,291.04C104.17,294.78 104.27,298.52 104.37,302.25C104.42,303.87 104.46,305.48 104.5,307.1C104.56,309.42 104.62,311.75 104.68,314.07C104.7,314.79 104.72,315.51 104.73,316.25C104.84,319.94 105.14,323.41 106,327C113.39,328.34 121.73,329.19 129,327C126.1,330.03 124.82,330.94 120.48,331.24C119.05,331.27 117.62,331.29 116.19,331.31C115.48,331.34 114.76,331.37 114.03,331.4C110.64,331.44 108.28,331.15 105.29,329.53C101.96,325.85 102.36,322.87 102.51,318.08C102.52,317.22 102.53,316.36 102.53,315.47C102.56,312.73 102.62,309.99 102.69,307.25C102.71,305.39 102.74,303.53 102.76,301.67C102.81,297.11 102.9,292.56 103,288Z"
      android:fillColor="#4B84D8"/>
  <path
      android:pathData="M365,286C368.38,287.5 368.38,287.5 371,289C370.34,290.65 369.68,292.3 369,294C367.52,293.72 366.04,293.42 364.56,293.13C363.74,292.96 362.92,292.8 362.07,292.63C361.38,292.42 360.7,292.22 360,292C359.67,291.34 359.34,290.68 359,290C356.66,292.26 354.81,294.28 353,297C352.63,294.31 352.63,294.31 353,291C356.76,286.88 359.4,285.07 365,286Z"
      android:fillColor="#2469BF"/>
  <path
      android:pathData="M433,301C438.28,301 443.56,301 449,301C446.62,304.57 444.97,305.47 441,307C437.75,307 437.75,307 435,306C434.34,304.35 433.68,302.7 433,301Z"
      android:fillColor="#E8F4F8"/>
  <path
      android:pathData="M448,295C448.33,295 448.66,295 449,295C449,296.98 449,298.96 449,301C443.72,301 438.44,301 433,301C433,299.68 433,298.36 433,297C436.63,297 440.26,297 444,297C444.33,297.99 444.66,298.98 445,300C445.99,300 446.98,300 448,300C448,298.35 448,296.7 448,295Z"
      android:fillColor="#0858BA"/>
  <path
      android:pathData="M39,27C39.66,27.33 40.32,27.66 41,28C40.12,28.94 39.24,29.88 38.33,30.85C37.16,32.11 35.99,33.37 34.81,34.63C34.23,35.24 33.66,35.86 33.06,36.5C29.58,40.24 26.23,44.04 23,48C23,42.44 27.58,38.15 31,34C33.54,31.49 36.18,29.19 39,27Z"
      android:fillColor="#D9E6F1"/>
  <path
      android:pathData="M386,287C385.67,288.32 385.34,289.64 385,291C385.99,291.33 386.98,291.66 388,292C385,293 382,294 379,295C377,293 377,293 377,289C380.44,286.71 381.99,286.82 386,287Z"
      android:fillColor="#1D67C0"/>
  <path
      android:pathData="M193.69,234.13C196,235 196,235 197,237C195.86,237.15 195.86,237.15 194.69,237.31C191.71,238.07 190.86,238.63 189,241C188.5,243.12 188.5,243.12 188.49,245.45C188.45,246.3 188.42,247.14 188.38,248.02C188.36,248.9 188.34,249.78 188.31,250.69C188.28,251.58 188.24,252.47 188.21,253.39C188.13,255.59 188.06,257.8 188,260C187.67,260 187.34,260 187,260C186.88,256.42 186.81,252.83 186.75,249.25C186.72,248.23 186.68,247.22 186.65,246.17C186.55,238.66 186.55,238.66 188.85,235.29C191,234 191,234 193.69,234.13Z"
      android:fillColor="#4DA1DE"/>
  <path
      android:pathData="M154,312C152.62,312.65 152.62,312.65 151.22,313.32C144.31,316.66 137.9,320 132,325C132,324.01 132,323.02 132,322C137.66,316.92 146.01,309.53 154,312Z"
      android:fillColor="#1B6BD1"/>
  <path
      android:pathData="M387.13,300.88C388.07,300.92 389.02,300.96 390,301C389.13,305.88 389.13,305.88 388,307C386.33,307.04 384.67,307.04 383,307C382.38,305.13 382.38,305.13 382,303C384,301 384,301 387.13,300.88Z"
      android:fillColor="#E8F4F9"/>
  <path
      android:pathData="M383,292C384.98,292 386.96,292 389,292C389.56,293.94 389.56,293.94 390,296C389,297 389,297 387.15,297.1C385.1,297.07 383.05,297.03 381,297C381.66,295.35 382.32,293.7 383,292Z"
      android:fillColor="#D7EAF5"/>
  <path
      android:pathData="M311,297C314.63,297 318.26,297 322,297C321.67,297.99 321.34,298.98 321,300C317.53,301.16 314.64,301.07 311,301C311,299.68 311,298.36 311,297Z"
      android:fillColor="#055AC1"/>
  <path
      android:pathData="M436,292C438.44,292.19 438.44,292.19 441,293C441.66,294.32 442.32,295.64 443,297C439.7,297 436.4,297 433,297C435,293 435,293 436,292Z"
      android:fillColor="#C8E6F4"/>
  <path
      android:pathData="M314,292C316.44,292.19 316.44,292.19 319,293C319.66,294.32 320.32,295.64 321,297C317.7,297 314.4,297 311,297C313,293 313,293 314,292Z"
      android:fillColor="#D4EBF6"/>
  <path
      android:pathData="M115,180C115.66,180.33 116.32,180.66 117,181C115.71,182.34 114.42,183.67 113.13,185C112.41,185.74 111.69,186.49 110.95,187.25C109,189 109,189 107,189C106.78,189.93 106.78,189.93 106.56,190.88C106,193 106,193 105,195C104.34,195 103.68,195 103,195C104.77,188.71 109.67,183.55 115,180Z"
      android:fillColor="#1C90DC"/>
  <path
      android:pathData="M21,9C21.33,9.66 21.66,10.32 22,11C18.33,14.67 14.67,18.33 11,22C10.34,21.67 9.68,21.34 9,21C12.72,16.58 16.3,12.42 21,9Z"
      android:fillColor="#094791"/>
  <path
      android:pathData="M198,211C198.99,211.33 199.98,211.66 201,212C196.74,215.76 192.48,219.5 188,223C187.34,222.67 186.68,222.34 186,222C189.96,218.37 193.92,214.74 198,211Z"
      android:fillColor="#DCF0F6"/>
  <path
      android:pathData="M337,292C339.88,291.88 339.88,291.88 343,292C345,294 345,294 345,297C342.69,296.67 340.38,296.34 338,296C337.67,294.68 337.34,293.36 337,292Z"
      android:fillColor="#EBF5F9"/>
  <path
      android:pathData="M448,305C448,306.32 448,307.64 448,309C446.02,309.99 446.02,309.99 444,311C443.34,309.02 442.68,307.04 442,305C444.49,303.75 445.41,304.22 448,305Z"
      android:fillColor="#2464BB"/>
  <path
      android:pathData="M336,302C338.97,302.49 338.97,302.49 342,303C342,304.32 342,305.64 342,307C340.02,307 338.04,307 336,307C336,305.35 336,303.7 336,302Z"
      android:fillColor="#E8F3F9"/>
  <path
      android:pathData="M360,292C361.65,292 363.3,292 365,292C365.33,293.32 365.66,294.64 366,296C364.02,296 362.04,296 360,296C360,294.68 360,293.36 360,292Z"
      android:fillColor="#E6F3F9"/>
  <path
      android:pathData="M146,234C151.71,234.71 151.71,234.71 153,236C153.04,237.67 153.04,239.33 153,241C152.34,239.68 151.68,238.36 151,237C147.07,237.57 147.07,237.57 144,240C144.88,235.13 144.88,235.13 146,234Z"
      android:fillColor="#2287D7"/>
  <path
      android:pathData="M433,301C438.28,301 443.56,301 449,301C448.01,302.48 448.01,302.48 447,304C446.34,304 445.68,304 445,304C445,303.34 445,302.68 445,302C439.06,302.49 439.06,302.49 433,303C433,302.34 433,301.68 433,301Z"
      android:fillColor="#C7E4F4"/>
  <path
      android:pathData="M354,304C356.48,304.99 356.48,304.99 359,306C358.01,306.33 357.02,306.66 356,307C355.27,309.02 355.27,309.02 355,311C354.01,309.68 353.02,308.36 352,307C352.66,306.01 353.32,305.02 354,304Z"
      android:fillColor="#346BBA"/>
  <path
      android:pathData="M233,294C233.66,294.33 234.32,294.66 235,295C234.05,296.17 233.09,297.34 232.13,298.5C231.59,299.15 231.06,299.8 230.51,300.47C230.01,300.97 229.51,301.48 229,302C228.34,302 227.68,302 227,302C227,301.34 227,300.68 227,300C227.66,300 228.32,300 229,300C229.29,299.38 229.58,298.76 229.88,298.13C231,296 231,296 233,294Z"
      android:fillColor="#257BD3"/>
  <path
      android:pathData="M407,287C407.66,287.33 408.32,287.66 409,288C408.39,288.6 408.39,288.6 407.76,289.21C407.22,289.74 406.68,290.27 406.13,290.81C405.59,291.33 405.06,291.86 404.51,292.39C402.79,294.13 402.79,294.13 401,297C401.41,292.17 403.46,290.17 407,287Z"
      android:fillColor="#2466BF"/>
  <path
      android:pathData="M140,209C139.46,209.25 138.93,209.49 138.38,209.75C135.44,211.3 132.74,213.13 130,215C130.31,213.13 130.31,213.13 131,211C134.44,208.71 135.99,208.82 140,209Z"
      android:fillColor="#CCEBF4"/>
  <path
      android:pathData="M334,287C334.66,287.33 335.32,287.66 336,288C335.38,288.74 334.76,289.48 334.13,290.25C332.4,292.49 331.14,294.44 330,297C330.62,290.48 330.62,290.48 332.56,288.06C333.27,287.54 333.27,287.54 334,287Z"
      android:fillColor="#286ABF"/>
  <path
      android:pathData="M358,289C358,291 358,291 356.63,292.44C356.09,292.95 355.55,293.47 355,294C354.34,294.99 353.68,295.98 353,297C352.88,294.13 352.88,294.13 353,291C355,289 355,289 358,289Z"
      android:fillColor="#1B60BA"/>
  <path
      android:pathData="M308,191C307.44,191.25 306.89,191.49 306.31,191.75C303.6,193.22 301.36,195.03 299,197C299.31,195.13 299.31,195.13 300,193C303.23,190.85 304.28,190.8 308,191Z"
      android:fillColor="#102367"/>
  <path
      android:pathData="M471,29C474.8,30.49 476.61,32.76 479,36C476.05,34.63 473.48,33.12 471,31C471,30.34 471,29.68 471,29Z"
      android:fillColor="#E5F0F8"/>
</vector>
app/src/main/res/layout/activity_reminder_list.xml
对比新文件
@@ -0,0 +1,38 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">
    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/reminderRecyclerView"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"
        android:padding="16dp" />
    <!-- 设置提醒,保存按钮区域 -->
    <LinearLayout
        android:id="@+id/layout_bottom"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:layout_marginBottom="16dp"
        android:gravity="center"
        android:orientation="vertical"
        android:padding="16dp">
        <Button
            android:id="@+id/addReminderButton"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginTop="8dp"
            android:backgroundTint="@color/black"
            android:drawablePadding="8dp"
            android:padding="12dp"
            android:text="设置提醒"
            android:textColor="@android:color/white"
            android:textSize="18sp" />
    </LinearLayout>
</LinearLayout>
app/src/main/res/layout/activity_reminder_settings.xml
对比新文件
@@ -0,0 +1,261 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#F5F5F5"
    android:orientation="vertical">
    <!-- 选择提醒分类部分 -->
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        android:padding="16dp">
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:gravity="center_vertical"
            android:orientation="horizontal">
            <TextView
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:text="选择设置分类"
                android:textColor="#000000"
                android:textSize="16sp" />
            <TextView
                android:id="@+id/tvSelectAll"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="全选"
                android:textColor="#3F51B5"
                android:textSize="14sp" />
        </LinearLayout>
        <!-- 分类选项 第一行4个 -->
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginTop="8dp"
            android:orientation="horizontal">
            <LinearLayout
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:orientation="horizontal">
                <CheckBox
                    android:id="@+id/checkBoxExpress"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content" />
                <TextView
                    android:layout_width="0dp"
                    android:layout_height="wrap_content"
                    android:layout_weight="1"
                    android:text="快递"
                    android:textColor="#000000"
                    android:textSize="14sp" />
            </LinearLayout>
            <LinearLayout
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:orientation="horizontal">
                <CheckBox
                    android:id="@+id/checkBoxFinance"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content" />
                <TextView
                    android:layout_width="0dp"
                    android:layout_height="wrap_content"
                    android:layout_weight="1"
                    android:text="还款"
                    android:textColor="#000000"
                    android:textSize="14sp" />
            </LinearLayout>
            <LinearLayout
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:orientation="horizontal">
                <CheckBox
                    android:id="@+id/checkBoxIncome"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content" />
                <TextView
                    android:layout_width="0dp"
                    android:layout_height="wrap_content"
                    android:layout_weight="1"
                    android:text="收入"
                    android:textColor="#000000"
                    android:textSize="14sp" />
            </LinearLayout>
            <LinearLayout
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:orientation="horizontal">
                <CheckBox
                    android:id="@+id/checkBoxFlight"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content" />
                <TextView
                    android:layout_width="0dp"
                    android:layout_height="wrap_content"
                    android:layout_weight="1"
                    android:text="航班"
                    android:textColor="#000000"
                    android:textSize="14sp" />
            </LinearLayout>
        </LinearLayout>
        <!-- 第二行1个 -->
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginTop="8dp"
            android:orientation="horizontal">
            <LinearLayout
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:orientation="horizontal">
                <CheckBox
                    android:id="@+id/checkBoxTrain"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content" />
                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="火车票"
                    android:textColor="#000000"
                    android:textSize="14sp" />
            </LinearLayout>
        </LinearLayout>
        <!-- 选择提醒方式部分 -->
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginTop="16dp"
            android:gravity="center_vertical"
            android:orientation="horizontal">
            <TextView
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:text="选择提醒方式"
                android:textColor="#000000"
                android:textSize="16sp" />
            <TextView
                android:id="@+id/tvSelectAllNotifications"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="全选"
                android:textColor="#3F51B5"
                android:textSize="14sp" />
        </LinearLayout>
        <!-- 通知卡片 -->
        <androidx.cardview.widget.CardView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginTop="8dp"
            app:cardCornerRadius="8dp"
            app:cardElevation="2dp">
            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:orientation="vertical"
                android:padding="8dp">
                <LinearLayout
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:gravity="center_vertical"
                    android:orientation="horizontal">
                    <TextView
                        android:layout_width="0dp"
                        android:layout_height="wrap_content"
                        android:layout_weight="1"
                        android:text="手机界面弹框"
                        android:textSize="14sp"
                        android:gravity="end"/>
                    <CheckBox
                        android:id="@+id/checkBoxPhone"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content" />
                </LinearLayout>
                <!-- 简化的通知图片 -->
                <ImageView
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:layout_marginTop="8dp"
                    android:adjustViewBounds="true"
                    android:background="#F8F8F8"
                    android:contentDescription="通知示例"
                    android:padding="8dp"
                    android:src="@drawable/up" />
            </LinearLayout>
        </androidx.cardview.widget.CardView>
    </LinearLayout>
    <!-- 保存按钮区域 -->
    <LinearLayout
        android:id="@+id/layout_bottom"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:layout_marginBottom="16dp"
        android:gravity="center"
        android:orientation="vertical"
        android:padding="16dp">
        <Button
            android:id="@+id/saveButton"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginTop="8dp"
            android:backgroundTint="@color/black"
            android:drawablePadding="8dp"
            android:padding="12dp"
            android:text="保存"
            android:textColor="@android:color/white"
            android:textSize="18sp" />
    </LinearLayout>
</LinearLayout>
app/src/main/res/layout/fragment_home.xml
@@ -7,9 +7,8 @@
    <ScrollView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_marginTop="40dp"> <!-- 留出顶部广告位的高度 -->
        android:layout_marginTop="0dp"> <!-- 留出顶部广告位的高度 -->
        >
        <!--    LinearLayout的作用是按照垂直或者水平方向排列其子视图-->
        <!--    CardView组件是用于实现卡片式布局-->
        <!--    RecyclerView 回收商视图 它使用适配器(Adapter)来管理数据的显示,-->
@@ -33,7 +32,7 @@
                <LinearLayout
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:layout_marginEnd="30dp"
                    android:layout_marginEnd="70dp"
                    android:orientation="horizontal">
                    <com.example.firstapp.view.UnderlineTextView
@@ -89,13 +88,32 @@
                </LinearLayout>
                <FrameLayout
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:layout_marginEnd="32dp">
                    <ImageButton
                        android:id="@+id/categoryButton"
                        android:layout_width="28dp"
                        android:layout_height="28dp"
                        android:layout_gravity="center_vertical|end"
                        android:layout_marginEnd="32dp"
                        android:background="?attr/selectableItemBackgroundBorderless"
                        android:contentDescription="分类设置"
                        android:padding="4dp"
                        android:scaleType="fitCenter"
                        android:src="@drawable/home_add" />
                </FrameLayout>
                <ImageButton
                    android:id="@+id/categoryButton"
                    android:id="@+id/reminderButton"
                    android:layout_width="28dp"
                    android:layout_height="28dp"
                    android:layout_gravity="center_vertical|end"
                    android:background="?attr/selectableItemBackgroundBorderless"
                    android:contentDescription="分类设置"
                    android:contentDescription="提醒设置"
                    android:padding="4dp"
                    android:scaleType="fitCenter"
                    android:src="@drawable/home_add" />
@@ -159,18 +177,18 @@
        </LinearLayout>
    </ScrollView>
    <!-- 顶部广告位 -->
    <androidx.cardview.widget.CardView
        android:layout_width="match_parent"
        android:layout_height="wrap_content">
<!--    &lt;!&ndash; 顶部广告位 &ndash;&gt;-->
<!--    <androidx.cardview.widget.CardView-->
<!--        android:layout_width="match_parent"-->
<!--        android:layout_height="wrap_content">-->
        <ImageView
            android:id="@+id/adBanner"
            android:layout_width="match_parent"
            android:layout_height="40dp"
            android:scaleType="centerCrop"
            android:src="@drawable/up_back" />
    </androidx.cardview.widget.CardView>
<!--        <ImageView-->
<!--            android:id="@+id/adBanner"-->
<!--            android:layout_width="match_parent"-->
<!--            android:layout_height="40dp"-->
<!--            android:scaleType="centerCrop"-->
<!--            android:src="@drawable/up_back" />-->
<!--    </androidx.cardview.widget.CardView>-->
    <!-- 在适当的位置添加 -->
app/src/main/res/layout/fragment_reminder_settings.xml
文件已删除
app/src/main/res/layout/item_reminder.xml
@@ -1,40 +1,49 @@
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
<androidx.cardview.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:padding="8dp"
    android:background="@android:color/white">
    android:layout_marginHorizontal="8dp"
    android:layout_marginVertical="4dp"
    app:cardCornerRadius="8dp"
    app:cardElevation="2dp">
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginEnd="0dp"
        android:layout_toStartOf="@id/btn_delete"
        android:orientation="vertical">
        android:orientation="horizontal"
        android:padding="16dp">
        <TextView
            android:id="@+id/text_nickname"
            android:layout_width="wrap_content"
        <LinearLayout
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:textColor="#000000"
            android:textSize="16sp" />
            android:layout_weight="1"
            android:orientation="vertical">
<!--        <TextView-->
<!--            android:id="@+id/text_keywords"-->
<!--            android:layout_width="wrap_content"-->
<!--            android:layout_height="wrap_content"-->
<!--            android:layout_marginTop="4dp"-->
<!--            android:textColor="#666666"-->
<!--            android:textSize="14sp" />-->
            <TextView
                android:id="@+id/categoryNameText"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:textSize="16sp"
                android:textStyle="bold" />
            <TextView
                android:id="@+id/notificationMethodText"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginTop="4dp"
                android:textColor="@android:color/darker_gray"
                android:textSize="14sp" />
        </LinearLayout>
        <ImageView
            android:layout_width="24dp"
            android:layout_height="24dp"
            android:layout_gravity="center_vertical"
            android:src="@drawable/ic_delete"
            android:tint="@android:color/darker_gray" />
    </LinearLayout>
    <ImageButton
        android:id="@+id/btn_delete"
        android:layout_width="24dp"
        android:layout_height="24dp"
        android:layout_alignParentEnd="true"
        android:layout_centerVertical="true"
        android:background="@null"
        android:src="@android:drawable/ic_delete" />
</RelativeLayout>
</androidx.cardview.widget.CardView>
app/src/main/res/layout/item_reminder_record.xml
对比新文件
@@ -0,0 +1,58 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.cardview.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_marginHorizontal="8dp"
    android:layout_marginVertical="4dp"
    app:cardCornerRadius="8dp"
    app:cardElevation="2dp">
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        android:padding="16dp">
        <LinearLayout
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:orientation="vertical">
            <TextView
                android:id="@+id/categoryNameText"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:textSize="16sp"
                android:textStyle="bold" />
            <TextView
                android:id="@+id/contentText"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginTop="4dp"
                android:textColor="@android:color/darker_gray"
                android:textSize="14sp" />
            <TextView
                android:id="@+id/timeText"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginTop="4dp"
                android:textColor="@android:color/darker_gray"
                android:textSize="12sp" />
        </LinearLayout>
        <ImageView
            android:id="@+id/statusIcon"
            android:layout_width="24dp"
            android:layout_height="24dp"
            android:layout_gravity="center_vertical"
            android:src="@drawable/ic_add"
            />
    </LinearLayout>
</androidx.cardview.widget.CardView>
app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml
@@ -1,6 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
    <background android:drawable="@drawable/ic_launcher_background" />
    <foreground android:drawable="@drawable/ic_launcher_foreground" />
    <monochrome android:drawable="@drawable/ic_launcher_foreground" />
    <background android:drawable="@drawable/ic_launcher_background"/>
    <foreground android:drawable="@drawable/ic_launcher_foreground"/>
</adaptive-icon>
app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml
@@ -1,6 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
    <background android:drawable="@drawable/ic_launcher_background" />
    <foreground android:drawable="@drawable/ic_launcher_foreground" />
    <monochrome android:drawable="@drawable/ic_launcher_foreground" />
    <background android:drawable="@drawable/ic_launcher_background"/>
    <foreground android:drawable="@drawable/ic_launcher_foreground"/>
</adaptive-icon>
app/src/main/res/mipmap-hdpi/ic_launcher.webp
Binary files differ
app/src/main/res/mipmap-hdpi/ic_launcher_round.webp
Binary files differ
app/src/main/res/mipmap-mdpi/ic_launcher.webp
Binary files differ
app/src/main/res/mipmap-mdpi/ic_launcher_round.webp
Binary files differ
app/src/main/res/mipmap-xhdpi/ic_launcher.webp
Binary files differ
app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp
Binary files differ
app/src/main/res/mipmap-xxhdpi/ic_launcher.webp
Binary files differ
app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp
Binary files differ
app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp
Binary files differ
app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp
Binary files differ
app/src/main/res/navigation/mobile_navigation.xml
@@ -24,13 +24,6 @@
        android:name="com.example.firstapp.ui.notifications.NotificationsFragment"
        android:label="@string/title_notifications"
        tools:layout="@layout/fragment_notifications" >
        <action
            android:id="@+id/action_navigation_notifications_to_reminderSettingsFragment"
            app:destination="@id/reminderSettingsFragment"
            app:enterAnim="@anim/nav_default_enter_anim"
            app:exitAnim="@anim/nav_default_exit_anim"
            app:popEnterAnim="@anim/nav_default_pop_enter_anim"
            app:popExitAnim="@anim/nav_default_pop_exit_anim" />
        <!-- 新增的action,跳转到 ReminderSettingsFragmentOther -->
        <action
@@ -41,27 +34,6 @@
            app:popEnterAnim="@anim/nav_default_pop_enter_anim"
            app:popExitAnim="@anim/nav_default_pop_exit_anim" />
    </fragment>
<!--    <fragment-->
<!--        android:id="@+id/reminderSettingsFragment"-->
<!--        android:name="com.example.firstapp.ui.reminder.ReminderSettingsFragment"-->
<!--        android:label="设置提醒"-->
<!--        tools:layout="@layout/fragment_reminder_settings" />-->
    <fragment
        android:id="@+id/reminderSettingsFragment"
        android:name="com.example.firstapp.ui.reminder.ReminderSettingsFragment"
        android:label="设置提醒"
        tools:layout="@layout/fragment_reminder_settings">
        <!-- 可以添加 popUpTo 属性来指定返回时的目标 -->
        <action
            android:id="@+id/action_reminderSettings_to_notifications"
            app:popUpTo="@id/navigation_notifications"
            app:enterAnim="@anim/nav_default_enter_anim"
            app:exitAnim="@anim/nav_default_exit_anim"
            app:popEnterAnim="@anim/nav_default_pop_enter_anim"
            app:popExitAnim="@anim/nav_default_pop_exit_anim" />
    </fragment>
app/x-library.gradle
@@ -1,5 +1,5 @@
apply plugin: 'com.xuexiang.xrouter'
apply plugin: 'kotlin-kapt'
apply plugin: 'com.google.devtools.ksp'
//apply plugin: 'android-aspectjx'
apply plugin: 'com.xuexiang.xaop'
@@ -33,7 +33,7 @@
        configuration.dependencies.add(dependencies.create(deps.xlibrary.xrouter_runtime))
    }
    if (configuration.name == "kapt") {
    if (configuration.name == "ksp") {
        //XPage
        configuration.dependencies.add(dependencies.create(deps.xlibrary.xpage_compiler))
        //页面路由
gradle.properties
@@ -7,9 +7,12 @@
# Specifies the JVM arguments used for the daemon process.
# The setting is particularly useful for tweaking memory settings.
#org.gradle.jvmargs=-Xmx1024m -Dfile.encoding=UTF-8
org.gradle.jvmargs=--add-exports jdk.compiler/com.sun.tools.javac.main=ALL-UNNAMED \
                   --add-exports jdk.compiler/com.sun.tools.javac.util=ALL-UNNAMED \
                   --add-exports jdk.compiler/com.sun.tools.javac.tree=ALL-UNNAMED
#org.gradle.jvmargs=--add-exports jdk.compiler/com.sun.tools.javac.main=ALL-UNNAMED \
#                   --add-exports jdk.compiler/com.sun.tools.javac.util=ALL-UNNAMED \
#                   --add-exports jdk.compiler/com.sun.tools.javac.tree=ALL-UNNAMED
org.gradle.jvmargs=-Xmx2048m -Dfile.encoding=UTF-8 --add-opens=jdk.compiler/com.sun.tools.javac.main=ALL-UNNAMED --add-opens=jdk.compiler/com.sun.tools.javac.util=ALL-UNNAMED --add-opens=jdk.compiler/com.sun.tools.javac.file=ALL-UNNAMED --add-opens=jdk.compiler/com.sun.tools.javac.main=ALL-UNNAMED --add-opens=jdk.compiler/com.sun.tools.javac.processing=ALL-UNNAMED --add-opens=jdk.compiler/com.sun.tools.javac.tree=ALL-UNNAMED --add-opens=jdk.compiler/com.sun.tools.javac.util=ALL-UNNAMED --add-opens=jdk.compiler/com.sun.tools.javac.code=ALL-UNNAMED
# ?? KAPT ?? JDK ????
# When configured, Gradle will run in incubating parallel mode.
@@ -35,8 +38,5 @@
android.precompileDependenciesResources=false
android.enableJetifier=true
#android.enableD8=true
org.gradle.java.home=D\:\\devInstall\\java\\jdk-17.0.12
# ??????
WX_PAY_APP_ID=wxb4ba302aa476ea1
org.gradle.java.home=D\:\\tanjiyaun\\jdk\\jdk1.8\\jdk-17.0.12