已删除3个文件
已修改33个文件
已添加14个文件
| | |
| | | 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' |
| | |
| | | //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' |
| | |
| | | |
| | | //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' |
| | |
| | | <activity |
| | | android:name=".ui.invitation.InvitationActivity" |
| | | android:exported="false" /> |
| | | |
| | | </application> |
| | | |
| | | </manifest> |
| | |
| | | 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 |
| | |
| | | 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 { |
| | |
| | | } catch (ex: IOException) { |
| | | ex.printStackTrace() |
| | | } |
| | | //使用默认的处理方式让APP停止运行 |
| | | defaultHandler?.uncaughtException(thread, throwable) |
| | | } |
| | | |
| | |
| | | context = applicationContext |
| | | initLibs() |
| | | PreferencesManager.init(this) |
| | | //纯客户端模式 |
| | | |
| | | try { |
| | | if (SettingUtils.enablePureClientMode) return |
| | | } catch (e: Exception) { |
| | | // 捕获SettingUtils未初始化的异常 |
| | | Log.e(TAG, "SettingUtils未初始化: ${e.message}") |
| | | // 继续执行后续代码,不返回 |
| | | } |
| | | |
| | | //初始化WorkManager |
| | | // WorkManager.initialize(this, Configuration.Builder().build()) |
| | | WorkManager.initialize(this, getWorkManagerConfiguration()) |
| | | |
| | | // 设置定时检查提醒的WorkManager |
| | | setupReminderWorker() |
| | | |
| | | //动态加载FrpcLib |
| | | val libPath = filesDir.absolutePath + "/libs" |
| | |
| | | @NonNull |
| | | override fun getWorkManagerConfiguration(): Configuration { |
| | | return Configuration.Builder() |
| | | .setMinimumLoggingLevel(android.util.Log.DEBUG) // 设置日志级别 |
| | | .setMinimumLoggingLevel(android.util.Log.DEBUG) |
| | | .build() |
| | | } |
| | | |
| | |
| | | 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") |
| | |
| | | // ) |
| | | // } |
| | | |
| | | /** |
| | | * 设置定时提醒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 |
| | | ) |
| | | } |
| | | |
| | | } |
对比新文件 |
| | |
| | | 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) |
| | | } |
| | | } |
| | | } |
对比新文件 |
| | |
| | | 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() |
| | | } |
| | | } |
| | | } |
| | | } |
| | | } |
| | |
| | | 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) { |
| | | |
| | | fun bind(reminder: Reminder, onDelete: (Reminder) -> Unit) { |
| | | binding.textNickname.text = reminder.nickname |
| | | //binding.textKeywords.text = reminder.keywords |
| | | binding.btnDelete.setOnClickListener { onDelete(reminder) } |
| | | } |
| | | } |
| | | |
| | | override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ReminderViewHolder { |
| | | return ReminderViewHolder( |
| | | ItemReminderBinding.inflate( |
| | | LayoutInflater.from(parent.context), parent, false |
| | | override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { |
| | | val binding = ItemReminderBinding.inflate( |
| | | LayoutInflater.from(parent.context), |
| | | parent, |
| | | false |
| | | ) |
| | | ) |
| | | return ViewHolder(binding) |
| | | } |
| | | |
| | | override fun onBindViewHolder(holder: ReminderViewHolder, position: Int) { |
| | | holder.bind(getItem(position), onDelete) |
| | | 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)) |
| | | } |
| | | } |
| | | } |
| | | |
| | | 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 |
| | | fun bind(reminder: Reminder) { |
| | | binding.categoryNameText.text = reminder.categoryName |
| | | binding.notificationMethodText.text = when(reminder.notificationMethod) { |
| | | "PHONE" -> "手机通知" |
| | | else -> "未设置" |
| | | } |
| | | } |
| | | } |
| | | |
| | | private class ReminderDiffCallback : DiffUtil.ItemCallback<Reminder>() { |
| | | override fun areItemsTheSame(oldItem: Reminder, newItem: Reminder): Boolean { |
| | | return oldItem.id == newItem.id |
| | | } |
| | | |
| | | override fun areContentsTheSame(oldItem: Reminder, newItem: Reminder): Boolean { |
| | | return oldItem == newItem |
| | | } |
| | | } |
| | | } |
对比新文件 |
| | |
| | | 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 |
| | | } |
| | | } |
| | | } |
| | |
| | | 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 |
| | | |
| | |
| | | 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 |
| | |
| | | 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( |
| | |
| | | Msg::class, |
| | | Code::class, |
| | | KeywordEntity::class, |
| | | Reminder::class |
| | | Reminder::class, |
| | | ReminderRecord::class |
| | | ], |
| | | views = [ |
| | | CourierStat::class, |
| | | DailyStat::class |
| | | ], |
| | | version = 20, |
| | | version = 21, |
| | | exportSchema = false |
| | | ) |
| | | @TypeConverters(ConvertersDate::class) |
| | |
| | | abstract fun codeDao(): CodeDao |
| | | abstract fun keywordDao(): KeywordDao |
| | | abstract fun reminderDao(): ReminderDao |
| | | abstract fun reminderRecordDao(): ReminderRecordDao |
| | | |
| | | companion object { |
| | | @Volatile |
| | |
| | | |
| | | } |
| | | }).addMigrations( |
| | | |
| | | MIGRATION_MSG, |
| | | MIGRATION_20_21 |
| | | ) |
| | | |
| | | /*if (BuildConfig.DEBUG) { |
| | |
| | | } |
| | | } |
| | | |
| | | 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) |
| | | ) |
| | | """ |
| | | ) |
| | | } |
| | | } |
| | | |
| | | } |
| | | |
| | | } |
| | |
| | | |
| | | @Dao |
| | | interface ReminderDao { |
| | | |
| | | @Query("SELECT * FROM reminders ORDER BY type") |
| | | @Query("SELECT * FROM reminders ORDER BY createdAt DESC") |
| | | fun getAllReminders(): Flow<List<Reminder>> |
| | | |
| | | @Insert |
| | | fun insert(reminder: Reminder) |
| | | @Insert(onConflict = OnConflictStrategy.REPLACE) |
| | | suspend fun insertReminder(reminder: Reminder) |
| | | |
| | | @Delete |
| | | fun delete(reminder: Reminder) |
| | | suspend fun deleteReminder(reminder: Reminder) |
| | | |
| | | @Query("SELECT * FROM reminders WHERE type = :type") |
| | | fun getByType(type: String): List<Reminder> |
| | | @Query("DELETE FROM reminders WHERE categoryId = :categoryId") |
| | | suspend fun deleteReminderByCategoryId(categoryId: Int) |
| | | |
| | | @Query("SELECT * FROM reminders WHERE categoryId = :categoryId") |
| | | suspend fun getReminderByCategoryId(categoryId: Int): Reminder? |
| | | |
| | | @Query("DELETE FROM reminders") |
| | | suspend fun deleteAllReminders() |
| | | } |
对比新文件 |
| | |
| | | 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 |
| | | } |
| | |
| | | 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() |
| | | ) |
对比新文件 |
| | |
| | | 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 |
| | | } |
| | | } |
对比新文件 |
| | |
| | | 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) |
| | | } |
| | | } |
| | |
| | | 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() |
| | | } |
| | | } |
对比新文件 |
| | |
| | | package com.example.firstapp.database.response |
| | | |
| | | data class CheckNewContentData( |
| | | val hasNewContent: Boolean, |
| | | val content: String? = null, |
| | | val updateTime: Long = System.currentTimeMillis() |
| | | ) |
| | |
| | | // 创建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,配置拦截器和超时时间 |
对比新文件 |
| | |
| | | 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 |
| | | } |
| | | } |
对比新文件 |
| | |
| | | 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) |
| | | } |
| | | } |
对比新文件 |
| | |
| | | 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) |
| | | } |
| | |
| | | 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() { |
| | | |
| | |
| | | _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() { |
| | |
| | | } |
| | | } |
| | | } |
| | | |
| | | // 添加提醒按钮点击事件 |
| | | // binding.reminderButton.setOnClickListener { |
| | | // startActivity(Intent(requireContext(), ReminderListActivity::class.java)) |
| | | // } |
| | | } |
| | | |
| | | private fun showCategorySelectorDialog() { |
| | |
| | | |
| | | // 设置提醒 |
| | | binding.layoutReminder.setOnClickListener { |
| | | findNavController().navigate(R.id.action_navigation_notifications_to_reminderSettingsFragment) |
| | | Toast.makeText(context, "设置功能开发中", Toast.LENGTH_SHORT).show() |
| | | } |
| | | |
| | | // 待办 |
| | |
| | | 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 |
| | | |
| | |
| | | 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() |
| | | } |
| | | } |
| | |
| | | <?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"> |
| | | android:viewportWidth="512" |
| | | android:viewportHeight="512"> |
| | | <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:pathData="M512,0L512,512L0,512L0,0L512,0Z" |
| | | android:fillColor="#0275f4"/> |
| | | </vector> |
| | |
| | | <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" /> |
| | | 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> |
| | |
| | | <?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"> |
| | | |
| | | android:width="512dp" |
| | | android:height="512dp" |
| | | android:viewportWidth="512" |
| | | android:viewportHeight="512"> |
| | | <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"/> |
| | | |
| | | 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> |
对比新文件 |
| | |
| | | <?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> |
对比新文件 |
| | |
| | | <?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> |
| | |
| | | <ScrollView |
| | | android:layout_width="match_parent" |
| | | android:layout_height="match_parent" |
| | | android:layout_marginTop="40dp"> <!-- 留出顶部广告位的高度 --> |
| | | android:layout_marginTop="0dp"> <!-- 留出顶部广告位的高度 --> |
| | | > |
| | | |
| | | <!-- LinearLayout的作用是按照垂直或者水平方向排列其子视图--> |
| | | <!-- CardView组件是用于实现卡片式布局--> |
| | | <!-- RecyclerView 回收商视图 它使用适配器(Adapter)来管理数据的显示,--> |
| | |
| | | <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 |
| | |
| | | |
| | | </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/reminderButton" |
| | | android:layout_width="28dp" |
| | | android:layout_height="28dp" |
| | | android:layout_gravity="center_vertical|end" |
| | | android:background="?attr/selectableItemBackgroundBorderless" |
| | | android:contentDescription="提醒设置" |
| | | android:padding="4dp" |
| | | android:scaleType="fitCenter" |
| | | android:src="@drawable/home_add" /> |
| | |
| | | </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>--> |
| | | |
| | | <!-- 在适当的位置添加 --> |
| | | |
| | |
| | | <?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="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/text_nickname" |
| | | android:id="@+id/categoryNameText" |
| | | android:layout_width="wrap_content" |
| | | android:layout_height="wrap_content" |
| | | android:textColor="#000000" |
| | | android:textSize="16sp" /> |
| | | android:textSize="16sp" |
| | | android:textStyle="bold" /> |
| | | |
| | | <!-- <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/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> |
| | | |
| | | <ImageButton |
| | | android:id="@+id/btn_delete" |
| | | <ImageView |
| | | 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" /> |
| | | android:layout_gravity="center_vertical" |
| | | android:src="@drawable/ic_delete" |
| | | android:tint="@android:color/darker_gray" /> |
| | | |
| | | </RelativeLayout> |
| | | </LinearLayout> |
| | | |
| | | </androidx.cardview.widget.CardView> |
对比新文件 |
| | |
| | | <?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> |
| | |
| | | <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" /> |
| | | </adaptive-icon> |
| | |
| | | <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" /> |
| | | </adaptive-icon> |
| | |
| | | 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 |
| | |
| | | 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> |
| | | |
| | | |
| | |
| | | apply plugin: 'com.xuexiang.xrouter' |
| | | apply plugin: 'kotlin-kapt' |
| | | apply plugin: 'com.google.devtools.ksp' |
| | | //apply plugin: 'android-aspectjx' |
| | | apply plugin: 'com.xuexiang.xaop' |
| | | |
| | |
| | | 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)) |
| | | //页面路由 |
| | |
| | | # 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. |
| | |
| | | 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 |
| | | |