From 5fc9567cfa6b6beee4f52a9f835f304865d693e1 Mon Sep 17 00:00:00 2001 From: cloudroam <cloudroam> Date: 星期四, 10 四月 2025 18:13:58 +0800 Subject: [PATCH] add: 消息提醒后版本 --- app/src/main/ic_launcher-playstore.png | 0 app/src/main/java/com/example/firstapp/adapter/ReminderAdapter.kt | 67 + app/src/main/java/com/example/firstapp/core/Core.kt | 2 app/src/main/java/com/example/firstapp/database/entity/ReminderRecord.kt | 21 app/src/main/res/drawable/ic_launcher_background.xml | 171 ---- app/src/main/java/com/example/firstapp/database/repository/ReminderRecordRepository.kt | 40 + app/src/main/res/mipmap-hdpi/ic_launcher_round.webp | 0 app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp | 0 app/src/main/java/com/example/firstapp/database/AppDatabase.kt | 51 + app/src/main/java/com/example/firstapp/ui/notifications/NotificationsFragment.kt | 2 app/src/main/res/drawable/ic_reminder.xml | 157 +++ app/src/main/java/com/example/firstapp/activity/ReminderSettingsActivity.kt | 176 ++++ app/src/main/res/mipmap-xxhdpi/ic_launcher.webp | 0 app/build.gradle | 9 app/src/main/java/com/example/firstapp/database/entity/Reminder.kt | 12 app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp | 0 app/src/main/res/navigation/mobile_navigation.xml | 28 app/src/main/res/drawable/ic_launcher_foreground.xml | 174 +++ app/src/main/AndroidManifest.xml | 5 app/src/main/java/com/example/firstapp/utils/PreferencesManager.kt | 9 app/src/main/java/com/example/firstapp/adapter/ReminderRecordAdapter.kt | 72 + app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp | 0 app/src/main/java/com/example/firstapp/database/service/ApiService.kt | 4 app/src/main/res/layout/activity_reminder_settings.xml | 261 ++++++ app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml | 5 app/src/main/res/layout/item_reminder.xml | 65 app/src/main/res/layout/item_reminder_record.xml | 58 + app/src/main/res/mipmap-xhdpi/ic_launcher.webp | 0 app/src/main/res/layout/fragment_home.xml | 50 app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml | 5 app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp | 0 gradle.properties | 14 /dev/null | 146 --- app/src/main/res/layout/activity_reminder_list.xml | 38 + app/src/main/res/mipmap-mdpi/ic_launcher_round.webp | 0 app/src/main/java/com/example/firstapp/database/dao/ReminderDao.kt | 21 app/src/main/java/com/example/firstapp/ui/home/HomeFragment.kt | 26 app/src/main/java/com/example/firstapp/database/response/CheckNewContentResponse.kt | 7 app/src/main/java/com/example/firstapp/ui/dashboard/ReminderViewModel.kt | 33 app/src/main/res/mipmap-hdpi/ic_launcher.webp | 0 app/src/main/java/com/example/firstapp/activity/ReminderListActivity.kt | 56 + app/x-library.gradle | 4 app/src/main/java/com/example/firstapp/database/dao/ReminderRecordDao.kt | 32 app/src/main/java/com/example/firstapp/database/repository/ReminderRepository.kt | 31 app/src/main/java/com/example/firstapp/service/ReminderWorker.kt | 243 ++++++ app/src/main/java/com/example/firstapp/ui/dashboard/ReminderRecordViewModel.kt | 30 app/src/main/res/mipmap-mdpi/ic_launcher.webp | 0 app/src/main/java/com/example/firstapp/App.kt | 109 +- 48 files changed, 1,680 insertions(+), 554 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index efce529..61aed6e 100644 --- a/app/build.gradle +++ b/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' diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index cae52af..2cf9cda 100644 --- a/app/src/main/AndroidManifest.xml +++ b/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> \ No newline at end of file diff --git a/app/src/main/ic_launcher-playstore.png b/app/src/main/ic_launcher-playstore.png new file mode 100644 index 0000000..f81b88b --- /dev/null +++ b/app/src/main/ic_launcher-playstore.png Binary files differ diff --git a/app/src/main/java/com/example/firstapp/App.kt b/app/src/main/java/com/example/firstapp/App.kt index c8fc2c4..83a1eae 100644 --- a/app/src/main/java/com/example/firstapp/App.kt +++ b/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 + ) + } + } \ No newline at end of file diff --git a/app/src/main/java/com/example/firstapp/activity/ReminderListActivity.kt b/app/src/main/java/com/example/firstapp/activity/ReminderListActivity.kt new file mode 100644 index 0000000..a9b35d4 --- /dev/null +++ b/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) + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/example/firstapp/activity/ReminderSettingsActivity.kt b/app/src/main/java/com/example/firstapp/activity/ReminderSettingsActivity.kt new file mode 100644 index 0000000..73b0913 --- /dev/null +++ b/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() + } + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/example/firstapp/adapter/ReminderAdapter.kt b/app/src/main/java/com/example/firstapp/adapter/ReminderAdapter.kt index 3a579bc..73979ac 100644 --- a/app/src/main/java/com/example/firstapp/adapter/ReminderAdapter.kt +++ b/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 } \ No newline at end of file diff --git a/app/src/main/java/com/example/firstapp/adapter/ReminderRecordAdapter.kt b/app/src/main/java/com/example/firstapp/adapter/ReminderRecordAdapter.kt new file mode 100644 index 0000000..8a60e12 --- /dev/null +++ b/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 + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/example/firstapp/core/Core.kt b/app/src/main/java/com/example/firstapp/core/Core.kt index 6a18b64..47c3d20 100644 --- a/app/src/main/java/com/example/firstapp/core/Core.kt +++ b/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 diff --git a/app/src/main/java/com/example/firstapp/database/AppDatabase.kt b/app/src/main/java/com/example/firstapp/database/AppDatabase.kt index 626aae1..99792b8 100644 --- a/app/src/main/java/com/example/firstapp/database/AppDatabase.kt +++ b/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) + ) + """ + ) + } + } + } } diff --git a/app/src/main/java/com/example/firstapp/database/dao/ReminderDao.kt b/app/src/main/java/com/example/firstapp/database/dao/ReminderDao.kt index e0cd71f..bf6ca23 100644 --- a/app/src/main/java/com/example/firstapp/database/dao/ReminderDao.kt +++ b/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> -} \ No newline at end of file + @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() +} \ No newline at end of file diff --git a/app/src/main/java/com/example/firstapp/database/dao/ReminderRecordDao.kt b/app/src/main/java/com/example/firstapp/database/dao/ReminderRecordDao.kt new file mode 100644 index 0000000..68aa3fd --- /dev/null +++ b/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 +} \ No newline at end of file diff --git a/app/src/main/java/com/example/firstapp/database/entity/Reminder.kt b/app/src/main/java/com/example/firstapp/database/entity/Reminder.kt index 256b45d..7a48d43 100644 --- a/app/src/main/java/com/example/firstapp/database/entity/Reminder.kt +++ b/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() ) \ No newline at end of file diff --git a/app/src/main/java/com/example/firstapp/database/entity/ReminderRecord.kt b/app/src/main/java/com/example/firstapp/database/entity/ReminderRecord.kt new file mode 100644 index 0000000..767662f --- /dev/null +++ b/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 + } +} \ No newline at end of file diff --git a/app/src/main/java/com/example/firstapp/database/repository/ReminderRecordRepository.kt b/app/src/main/java/com/example/firstapp/database/repository/ReminderRecordRepository.kt new file mode 100644 index 0000000..806e33a --- /dev/null +++ b/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) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/example/firstapp/database/repository/ReminderRepository.kt b/app/src/main/java/com/example/firstapp/database/repository/ReminderRepository.kt index 20f90f4..861e344 100644 --- a/app/src/main/java/com/example/firstapp/database/repository/ReminderRepository.kt +++ b/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() } } \ No newline at end of file diff --git a/app/src/main/java/com/example/firstapp/database/response/CheckNewContentResponse.kt b/app/src/main/java/com/example/firstapp/database/response/CheckNewContentResponse.kt new file mode 100644 index 0000000..c782693 --- /dev/null +++ b/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() +) \ No newline at end of file diff --git a/app/src/main/java/com/example/firstapp/database/service/ApiService.kt b/app/src/main/java/com/example/firstapp/database/service/ApiService.kt index 3da71cb..fa497cb 100644 --- a/app/src/main/java/com/example/firstapp/database/service/ApiService.kt +++ b/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,配置拦截器和超时时间 diff --git a/app/src/main/java/com/example/firstapp/service/ReminderWorker.kt b/app/src/main/java/com/example/firstapp/service/ReminderWorker.kt new file mode 100644 index 0000000..07b811a --- /dev/null +++ b/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 + } +} \ No newline at end of file diff --git a/app/src/main/java/com/example/firstapp/ui/dashboard/ReminderRecordViewModel.kt b/app/src/main/java/com/example/firstapp/ui/dashboard/ReminderRecordViewModel.kt new file mode 100644 index 0000000..73d458b --- /dev/null +++ b/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) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/example/firstapp/ui/dashboard/ReminderViewModel.kt b/app/src/main/java/com/example/firstapp/ui/dashboard/ReminderViewModel.kt new file mode 100644 index 0000000..4f4288a --- /dev/null +++ b/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) +} \ No newline at end of file diff --git a/app/src/main/java/com/example/firstapp/ui/home/HomeFragment.kt b/app/src/main/java/com/example/firstapp/ui/home/HomeFragment.kt index 3fcc370..a6782f5 100644 --- a/app/src/main/java/com/example/firstapp/ui/home/HomeFragment.kt +++ b/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() { diff --git a/app/src/main/java/com/example/firstapp/ui/notifications/NotificationsFragment.kt b/app/src/main/java/com/example/firstapp/ui/notifications/NotificationsFragment.kt index 1eea5ce..d3ae414 100644 --- a/app/src/main/java/com/example/firstapp/ui/notifications/NotificationsFragment.kt +++ b/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() } // 待办 diff --git a/app/src/main/java/com/example/firstapp/ui/reminder/ReminderSettingsFragment.kt b/app/src/main/java/com/example/firstapp/ui/reminder/ReminderSettingsFragment.kt deleted file mode 100644 index b0b459c..0000000 --- a/app/src/main/java/com/example/firstapp/ui/reminder/ReminderSettingsFragment.kt +++ /dev/null @@ -1,105 +0,0 @@ -package com.example.firstapp.ui.reminder - -import ReminderAdapter -import android.os.Bundle -import android.view.LayoutInflater -import android.view.View -import android.view.ViewGroup -import android.widget.ArrayAdapter -import android.widget.Toast -import androidx.appcompat.app.AppCompatActivity -import androidx.fragment.app.Fragment -import androidx.fragment.app.viewModels -import androidx.navigation.fragment.findNavController -import androidx.recyclerview.widget.LinearLayoutManager -import com.example.firstapp.App -import com.example.firstapp.database.entity.Reminder -import com.example.firstapp.databinding.FragmentReminderSettingsBinding - -class ReminderSettingsFragment : Fragment() { - - private var _binding: FragmentReminderSettingsBinding? = null - private val binding get() = _binding!! - - private val reminderViewModel: ReminderViewModel by viewModels { - ReminderViewModelFactory((requireActivity().application as App).reminderRepository) - } - - private lateinit var adapter: ReminderAdapter - - override fun onCreateView( - inflater: LayoutInflater, - container: ViewGroup?, - savedInstanceState: Bundle? - ): View { - _binding = FragmentReminderSettingsBinding.inflate(inflater, container, false) - return binding.root - } - - override fun onViewCreated(view: View, savedInstanceState: Bundle?) { - super.onViewCreated(view, savedInstanceState) - - (activity as AppCompatActivity).supportActionBar?.setDisplayHomeAsUpEnabled(true) - - setupSpinner() - setupRecyclerView() - setupClickListeners() - observeReminders() - } - - private fun setupSpinner() { - val types = arrayOf("快递", "还款", "其他") - val adapter = ArrayAdapter(requireContext(), android.R.layout.simple_spinner_item, types) - adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item) - binding.spinnerType.adapter = adapter - } - - private fun setupRecyclerView() { - adapter = ReminderAdapter { reminder -> - reminderViewModel.deleteReminder(reminder) - } - binding.recyclerReminders.apply { - layoutManager = LinearLayoutManager(context) - this.adapter = this@ReminderSettingsFragment.adapter - } - } - - private fun setupClickListeners() { -// binding.btnClose.setOnClickListener { -// findNavController().navigateUp() -// } - - binding.btnAddReminder.setOnClickListener { - val type = binding.spinnerType.selectedItem.toString() - val nickname = binding.editNickname.text.toString() - val keywords = binding.editKeywords.text.toString() - - if (nickname.isBlank() || keywords.isBlank()) { - Toast.makeText(context, "请填写完整信息", Toast.LENGTH_SHORT).show() - return@setOnClickListener - } - - reminderViewModel.insertReminder( - Reminder( - type = type, - nickname = nickname, - keywords = keywords - ) - ) - - binding.editNickname.text.clear() - binding.editKeywords.text.clear() - } - } - - private fun observeReminders() { - reminderViewModel.allReminders.observe(viewLifecycleOwner) { reminders -> - adapter.submitList(reminders) - } - } - - override fun onDestroyView() { - super.onDestroyView() - _binding = null - } -} \ No newline at end of file diff --git a/app/src/main/java/com/example/firstapp/ui/reminder/ReminderViewModel.kt b/app/src/main/java/com/example/firstapp/ui/reminder/ReminderViewModel.kt deleted file mode 100644 index d1bab81..0000000 --- a/app/src/main/java/com/example/firstapp/ui/reminder/ReminderViewModel.kt +++ /dev/null @@ -1,33 +0,0 @@ -package com.example.firstapp.ui.reminder - -import androidx.lifecycle.* -import com.example.firstapp.database.entity.Reminder -import com.example.firstapp.database.repository.ReminderRepository -import kotlinx.coroutines.launch - -class ReminderViewModel(private val repository: ReminderRepository) : ViewModel() { - - // 使用 Flow 获取所有提醒 - val allReminders: LiveData<List<Reminder>> = repository.allReminders.asLiveData() - - // 插入新提醒 - fun insertReminder(reminder: Reminder) = viewModelScope.launch { - repository.insert(reminder) - } - - // 删除提醒 - fun deleteReminder(reminder: Reminder) = viewModelScope.launch { - repository.delete(reminder) - } -} - -// ViewModel Factory -class ReminderViewModelFactory(private val repository: ReminderRepository) : ViewModelProvider.Factory { - override fun <T : ViewModel> create(modelClass: Class<T>): T { - if (modelClass.isAssignableFrom(ReminderViewModel::class.java)) { - @Suppress("UNCHECKED_CAST") - return ReminderViewModel(repository) as T - } - throw IllegalArgumentException("Unknown ViewModel class") - } -} \ No newline at end of file diff --git a/app/src/main/java/com/example/firstapp/utils/PreferencesManager.kt b/app/src/main/java/com/example/firstapp/utils/PreferencesManager.kt index 34b85f4..b9636a9 100644 --- a/app/src/main/java/com/example/firstapp/utils/PreferencesManager.kt +++ b/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() + } } \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_launcher_background.xml b/app/src/main/res/drawable/ic_launcher_background.xml index 07d5da9..3f99e3a 100644 --- a/app/src/main/res/drawable/ic_launcher_background.xml +++ b/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> diff --git a/app/src/main/res/drawable/ic_launcher_foreground.xml b/app/src/main/res/drawable/ic_launcher_foreground.xml index 2b068d1..b63029f 100644 --- a/app/src/main/res/drawable/ic_launcher_foreground.xml +++ b/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> \ No newline at end of file + 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> diff --git a/app/src/main/res/drawable/ic_reminder.xml b/app/src/main/res/drawable/ic_reminder.xml index 310d415..dc63a35 100644 --- a/app/src/main/res/drawable/ic_reminder.xml +++ b/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> \ No newline at end of file + 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> diff --git a/app/src/main/res/layout/activity_reminder_list.xml b/app/src/main/res/layout/activity_reminder_list.xml new file mode 100644 index 0000000..be33cb3 --- /dev/null +++ b/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> \ No newline at end of file diff --git a/app/src/main/res/layout/activity_reminder_settings.xml b/app/src/main/res/layout/activity_reminder_settings.xml new file mode 100644 index 0000000..7479155 --- /dev/null +++ b/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> \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_home.xml b/app/src/main/res/layout/fragment_home.xml index 5305951..f46c793 100644 --- a/app/src/main/res/layout/fragment_home.xml +++ b/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"> +<!-- <!– 顶部广告位 –>--> +<!-- <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>--> <!-- 在适当的位置添加 --> diff --git a/app/src/main/res/layout/fragment_reminder_settings.xml b/app/src/main/res/layout/fragment_reminder_settings.xml deleted file mode 100644 index 57988dd..0000000 --- a/app/src/main/res/layout/fragment_reminder_settings.xml +++ /dev/null @@ -1,146 +0,0 @@ -<?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" - android:background="#FAFAFA"> - - <!-- 标题栏 --> -<!-- <RelativeLayout--> -<!-- android:layout_width="match_parent"--> -<!-- android:layout_height="56dp"--> -<!-- android:background="#FFFFFF"--> -<!-- android:elevation="1dp">--> - -<!-- <TextView--> -<!-- android:layout_width="wrap_content"--> -<!-- android:layout_height="wrap_content"--> -<!-- android:layout_centerInParent="true"--> -<!-- android:text="新增短信提醒"--> -<!-- android:textSize="17sp"--> -<!-- android:textColor="#222222" />--> - -<!-- <!– 关闭按钮 –>--> -<!-- <ImageButton--> -<!-- android:id="@+id/btn_close"--> -<!-- android:layout_width="48dp"--> -<!-- android:layout_height="48dp"--> -<!-- android:layout_alignParentEnd="true"--> -<!-- android:layout_centerVertical="true"--> -<!-- android:background="?attr/selectableItemBackgroundBorderless"--> -<!-- android:padding="12dp"--> -<!-- android:src="@android:drawable/ic_menu_close_clear_cancel" />--> -<!-- </RelativeLayout>--> - - <!-- 内容区域 --> - <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:orientation="vertical" - android:layout_marginBottom="16dp"> - - <TextView - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:text="选择新增类型 →" - android:textColor="#666666" - android:textSize="14sp" - android:layout_marginBottom="8dp"/> - - <Spinner - android:id="@+id/spinner_type" - android:layout_width="match_parent" - android:layout_height="48dp" - android:background="@drawable/bg_edit_border" - android:paddingHorizontal="12dp"/> - </LinearLayout> - - <!-- 昵称输入框 --> - <LinearLayout - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:orientation="vertical" - android:layout_marginBottom="16dp"> - - <TextView - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:text="昵称 →" - android:textColor="#666666" - android:textSize="14sp" - android:layout_marginBottom="8dp"/> - - <EditText - android:id="@+id/edit_nickname" - android:layout_width="match_parent" - android:layout_height="48dp" - android:background="@drawable/bg_edit_border" - android:hint="仅用于显示与区分,可任意输入" - android:textColorHint="#999999" - android:textSize="14sp" - android:paddingHorizontal="12dp"/> - </LinearLayout> - - <!-- 关键词输入框 --> - <LinearLayout - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:orientation="vertical" - android:layout_marginBottom="16dp"> - - <TextView - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:text="关键词 →" - android:textColor="#666666" - android:textSize="14sp" - android:layout_marginBottom="8dp"/> - - <EditText - android:id="@+id/edit_keywords" - android:layout_width="match_parent" - android:layout_height="48dp" - android:background="@drawable/bg_edit_border" - android:hint="用于匹配短信类型" - android:textColorHint="#999999" - android:textSize="14sp" - android:paddingHorizontal="12dp"/> - </LinearLayout> - - <!-- 确定新增按钮 --> - <Button - android:id="@+id/btn_add_reminder" - android:layout_width="match_parent" - android:layout_height="48dp" - android:text="确定新增" - android:textColor="#FFFFFF" - android:textSize="16sp" - android:background="@drawable/bg_button_primary" - android:layout_marginTop="16dp"/> - - <!-- 已添加列表 --> - <TextView - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:text="已添加列表 →" - android:textColor="#666666" - android:textSize="14sp" - android:layout_marginTop="24dp" - android:layout_marginBottom="8dp"/> - - <androidx.recyclerview.widget.RecyclerView - android:id="@+id/recycler_reminders" - android:layout_width="match_parent" - android:layout_height="160dp" - android:layout_marginTop="2dp" /> - - </LinearLayout> - -</LinearLayout> \ No newline at end of file diff --git a/app/src/main/res/layout/item_reminder.xml b/app/src/main/res/layout/item_reminder.xml index e6bcbe3..8b2df1d 100644 --- a/app/src/main/res/layout/item_reminder.xml +++ b/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> \ No newline at end of file +</androidx.cardview.widget.CardView> \ No newline at end of file diff --git a/app/src/main/res/layout/item_reminder_record.xml b/app/src/main/res/layout/item_reminder_record.xml new file mode 100644 index 0000000..d2bea11 --- /dev/null +++ b/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> \ No newline at end of file diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml index 6f3b755..bbd3e02 100644 --- a/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml +++ b/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> \ No newline at end of file diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml index 6f3b755..bbd3e02 100644 --- a/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml +++ b/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> \ No newline at end of file diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher.webp b/app/src/main/res/mipmap-hdpi/ic_launcher.webp index c209e78..93864bb 100644 --- a/app/src/main/res/mipmap-hdpi/ic_launcher.webp +++ b/app/src/main/res/mipmap-hdpi/ic_launcher.webp Binary files differ diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp b/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp index b2dfe3d..5cbd108 100644 --- a/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp +++ b/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp Binary files differ diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher.webp b/app/src/main/res/mipmap-mdpi/ic_launcher.webp index 4f0f1d6..c94ab32 100644 --- a/app/src/main/res/mipmap-mdpi/ic_launcher.webp +++ b/app/src/main/res/mipmap-mdpi/ic_launcher.webp Binary files differ diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp b/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp index 62b611d..735ec59 100644 --- a/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp +++ b/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp Binary files differ diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher.webp b/app/src/main/res/mipmap-xhdpi/ic_launcher.webp index 948a307..c997b7e 100644 --- a/app/src/main/res/mipmap-xhdpi/ic_launcher.webp +++ b/app/src/main/res/mipmap-xhdpi/ic_launcher.webp Binary files differ diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp b/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp index 1b9a695..06575f8 100644 --- a/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp +++ b/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp Binary files differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp b/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp index 28d4b77..85d5459 100644 --- a/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp +++ b/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp Binary files differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp b/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp index 9287f50..30fb95e 100644 --- a/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp +++ b/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp Binary files differ diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp b/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp index aa7d642..08ea7f3 100644 --- a/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp +++ b/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp Binary files differ diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp index 9126ae3..31df699 100644 --- a/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp +++ b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp Binary files differ diff --git a/app/src/main/res/navigation/mobile_navigation.xml b/app/src/main/res/navigation/mobile_navigation.xml index fcb8587..bd4637d 100644 --- a/app/src/main/res/navigation/mobile_navigation.xml +++ b/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> diff --git a/app/x-library.gradle b/app/x-library.gradle index de42c83..202d523 100644 --- a/app/x-library.gradle +++ b/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)) //页面路由 diff --git a/gradle.properties b/gradle.properties index f0b87a1..52f4841 100644 --- a/gradle.properties +++ b/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 -- Gitblit v1.9.3