main
Ernest Litvinenko 2024-06-26 16:50:29 +03:00
commit d31bce2f89
96 changed files with 4538 additions and 0 deletions

15
.gitignore vendored Normal file
View File

@ -0,0 +1,15 @@
*.iml
.gradle
/local.properties
/.idea/caches
/.idea/libraries
/.idea/modules.xml
/.idea/workspace.xml
/.idea/navEditor.xml
/.idea/assetWizardSettings.xml
.DS_Store
/build
/captures
.externalNativeBuild
.cxx
local.properties

3
.idea/.gitignore vendored Normal file
View File

@ -0,0 +1,3 @@
# Default ignored files
/shelf/
/workspace.xml

6
.idea/compiler.xml Normal file
View File

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="CompilerConfiguration">
<bytecodeTargetLevel target="17" />
</component>
</project>

View File

@ -0,0 +1,16 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="deploymentTargetSelector">
<selectionStates>
<SelectionState runConfigName="app">
<option name="selectionMode" value="DROPDOWN" />
</SelectionState>
<SelectionState runConfigName="GreetingPreview">
<option name="selectionMode" value="DROPDOWN" />
</SelectionState>
<SelectionState runConfigName="MainActivity">
<option name="selectionMode" value="DROPDOWN" />
</SelectionState>
</selectionStates>
</component>
</project>

19
.idea/gradle.xml Normal file
View File

@ -0,0 +1,19 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="GradleMigrationSettings" migrationVersion="1" />
<component name="GradleSettings">
<option name="linkedExternalProjectsSettings">
<GradleProjectSettings>
<option name="externalProjectPath" value="$PROJECT_DIR$" />
<option name="gradleJvm" value="#GRADLE_LOCAL_JAVA_HOME" />
<option name="modules">
<set>
<option value="$PROJECT_DIR$" />
<option value="$PROJECT_DIR$/app" />
</set>
</option>
<option name="resolveExternalAnnotations" value="false" />
</GradleProjectSettings>
</option>
</component>
</project>

View File

@ -0,0 +1,41 @@
<component name="InspectionProjectProfileManager">
<profile version="1.0">
<option name="myName" value="Project Default" />
<inspection_tool class="PreviewAnnotationInFunctionWithParameters" enabled="true" level="ERROR" enabled_by_default="true">
<option name="composableFile" value="true" />
<option name="previewFile" value="true" />
</inspection_tool>
<inspection_tool class="PreviewApiLevelMustBeValid" enabled="true" level="ERROR" enabled_by_default="true">
<option name="composableFile" value="true" />
<option name="previewFile" value="true" />
</inspection_tool>
<inspection_tool class="PreviewDimensionRespectsLimit" enabled="true" level="WARNING" enabled_by_default="true">
<option name="composableFile" value="true" />
<option name="previewFile" value="true" />
</inspection_tool>
<inspection_tool class="PreviewFontScaleMustBeGreaterThanZero" enabled="true" level="ERROR" enabled_by_default="true">
<option name="composableFile" value="true" />
<option name="previewFile" value="true" />
</inspection_tool>
<inspection_tool class="PreviewMultipleParameterProviders" enabled="true" level="ERROR" enabled_by_default="true">
<option name="composableFile" value="true" />
<option name="previewFile" value="true" />
</inspection_tool>
<inspection_tool class="PreviewMustBeTopLevelFunction" enabled="true" level="ERROR" enabled_by_default="true">
<option name="composableFile" value="true" />
<option name="previewFile" value="true" />
</inspection_tool>
<inspection_tool class="PreviewNeedsComposableAnnotation" enabled="true" level="ERROR" enabled_by_default="true">
<option name="composableFile" value="true" />
<option name="previewFile" value="true" />
</inspection_tool>
<inspection_tool class="PreviewNotSupportedInUnitTestFiles" enabled="true" level="ERROR" enabled_by_default="true">
<option name="composableFile" value="true" />
<option name="previewFile" value="true" />
</inspection_tool>
<inspection_tool class="PreviewPickerAnnotation" enabled="true" level="ERROR" enabled_by_default="true">
<option name="composableFile" value="true" />
<option name="previewFile" value="true" />
</inspection_tool>
</profile>
</component>

6
.idea/kotlinc.xml Normal file
View File

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="KotlinJpsPluginSettings">
<option name="version" value="1.9.0" />
</component>
</project>

10
.idea/migrations.xml Normal file
View File

@ -0,0 +1,10 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectMigrations">
<option name="MigrateToGradleLocalJavaHome">
<set>
<option value="$PROJECT_DIR$" />
</set>
</option>
</component>
</project>

10
.idea/misc.xml Normal file
View File

@ -0,0 +1,10 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ExternalStorageConfigurationManager" enabled="true" />
<component name="ProjectRootManager" version="2" languageLevel="JDK_17" default="true" project-jdk-name="jbr-17" project-jdk-type="JavaSDK">
<output url="file://$PROJECT_DIR$/build/classes" />
</component>
<component name="ProjectType">
<option name="id" value="Android" />
</component>
</project>

1
app/.gitignore vendored Normal file
View File

@ -0,0 +1 @@
/build

79
app/build.gradle.kts Normal file
View File

@ -0,0 +1,79 @@
plugins {
alias(libs.plugins.android.application)
alias(libs.plugins.jetbrains.kotlin.android)
alias(libs.plugins.kotlinx.serialization)
}
android {
namespace = "com.example.mpdriver"
compileSdk = 34
defaultConfig {
applicationId = "com.example.mpdriver"
minSdk = 24
targetSdk = 34
versionCode = 1
versionName = "1.0"
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
vectorDrawables {
useSupportLibrary = true
}
}
buildTypes {
release {
isMinifyEnabled = false
proguardFiles(
getDefaultProguardFile("proguard-android-optimize.txt"),
"proguard-rules.pro"
)
}
}
compileOptions {
sourceCompatibility = JavaVersion.VERSION_1_8
targetCompatibility = JavaVersion.VERSION_1_8
}
kotlinOptions {
jvmTarget = "1.8"
}
buildFeatures {
compose = true
}
composeOptions {
kotlinCompilerExtensionVersion = "1.5.1"
}
packaging {
resources {
excludes += "/META-INF/{AL2.0,LGPL2.1}"
}
}
}
dependencies {
implementation(libs.androidx.core.ktx)
implementation(libs.androidx.lifecycle.runtime.ktx)
implementation(libs.androidx.activity.compose)
implementation(platform(libs.androidx.compose.bom))
implementation(libs.androidx.ui)
implementation(libs.androidx.ui.graphics)
implementation(libs.androidx.ui.tooling.preview)
implementation(libs.androidx.material3)
implementation(libs.androidx.navigation.compose)
testImplementation(libs.junit)
androidTestImplementation(libs.androidx.junit)
androidTestImplementation(libs.androidx.espresso.core)
androidTestImplementation(platform(libs.androidx.compose.bom))
androidTestImplementation(libs.androidx.ui.test.junit4)
debugImplementation(libs.androidx.ui.tooling)
debugImplementation(libs.androidx.ui.test.manifest)
implementation(libs.kotlinx.serialization.json)
implementation(libs.okhttp)
implementation(libs.gson)
implementation(libs.mmkv)
implementation(libs.kotlinx.datetime)
implementation(libs.yandex.maps)
implementation(libs.kotlin.coroutines)
}

21
app/proguard-rules.pro vendored Normal file
View File

@ -0,0 +1,21 @@
# Add project specific ProGuard rules here.
# You can control the set of applied configuration files using the
# proguardFiles setting in build.gradle.
#
# For more details, see
# http://developer.android.com/guide/developing/tools/proguard.html
# If your project uses WebView with JS, uncomment the following
# and specify the fully qualified class name to the JavaScript interface
# class:
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
# public *;
#}
# Uncomment this to preserve the line number information for
# debugging stack traces.
#-keepattributes SourceFile,LineNumberTable
# If you keep the line number information, uncomment this to
# hide the original source file name.
#-renamesourcefileattribute SourceFile

View File

@ -0,0 +1,24 @@
package com.example.mpdriver
import androidx.test.platform.app.InstrumentationRegistry
import androidx.test.ext.junit.runners.AndroidJUnit4
import org.junit.Test
import org.junit.runner.RunWith
import org.junit.Assert.*
/**
* Instrumented test, which will execute on an Android device.
*
* See [testing documentation](http://d.android.com/tools/testing).
*/
@RunWith(AndroidJUnit4::class)
class ExampleInstrumentedTest {
@Test
fun useAppContext() {
// Context of the app under test.
val appContext = InstrumentationRegistry.getInstrumentation().targetContext
assertEquals("com.example.mpdriver", appContext.packageName)
}
}

View File

@ -0,0 +1,33 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<application
android:usesCleartextTraffic="true"
android:name=".NotificationApplication"
android:allowBackup="true"
android:dataExtractionRules="@xml/data_extraction_rules"
android:fullBackupContent="@xml/backup_rules"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/Theme.MPDriver"
tools:targetApi="31">
<activity
android:name=".MainActivity"
android:exported="true"
android:label="@string/app_name"
android:theme="@style/Theme.MPDriver">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>

View File

@ -0,0 +1,364 @@
package com.example.mpdriver
import android.content.Intent
import android.content.IntentFilter
import android.os.Bundle
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import androidx.activity.enableEdgeToEdge
import androidx.compose.animation.AnimatedContentTransitionScope
import androidx.compose.animation.EnterTransition
import androidx.compose.animation.ExitTransition
import androidx.compose.animation.core.spring
import androidx.compose.animation.core.tween
import androidx.compose.animation.fadeIn
import androidx.compose.animation.fadeOut
import androidx.compose.animation.slideInHorizontally
import androidx.compose.foundation.Image
import androidx.compose.foundation.background
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.fillMaxHeight
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.ArrowBack
import androidx.compose.material.icons.sharp.Settings
import androidx.compose.material3.ButtonDefaults
import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.Icon
import androidx.compose.material3.IconButton
import androidx.compose.material3.Scaffold
import androidx.compose.material3.Text
import androidx.compose.material3.TextButton
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.clip
import androidx.compose.ui.draw.shadow
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import androidx.navigation.NavHostController
import androidx.navigation.NavType
import androidx.navigation.compose.NavHost
import androidx.navigation.compose.composable
import androidx.navigation.compose.rememberNavController
import androidx.navigation.navArgument
import com.example.mpdriver.api.Api
import com.example.mpdriver.recievers.TimeTickReciever
import com.example.mpdriver.screens.Feed
import com.example.mpdriver.screens.MapScreen
import com.example.mpdriver.screens.PhoneCodeInputScreen
import com.example.mpdriver.screens.PhoneInputScreen
import com.example.mpdriver.screens.SubtaskScreen
import com.example.mpdriver.screens.TasksList
import com.example.mpdriver.storage.Database
import com.tencent.mmkv.MMKV
import com.yandex.mapkit.MapKitFactory
class MainActivity : ComponentActivity() {
val timeTickReciever = TimeTickReciever()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
MapKitFactory.setApiKey("f4385b18-0740-454a-a71f-d20da7e8fc3b")
MapKitFactory.initialize(this)
val rootDir = MMKV.initialize(this)
println("mmkv root: $rootDir")
registerReceiver(timeTickReciever, IntentFilter(Intent.ACTION_TIME_TICK))
enableEdgeToEdge()
setContent {
AuthNavigator()
}
}
override fun onDestroy() {
super.onDestroy()
unregisterReceiver(timeTickReciever)
}
}
@Composable
fun AuthNavigator() {
val authNavigator = rememberNavController()
Api.setNavHostController(authNavigator)
val startDestination = if (Database.access_token == null) "auth" else "home"
NavHost(navController = authNavigator, startDestination = startDestination) {
composable("auth") {
PhoneInputScreen(navHostController = authNavigator)
}
composable("auth/code") {
PhoneCodeInputScreen(navHostController = authNavigator)
}
composable("home") {
MainNavigator()
}
}
}
@OptIn(ExperimentalMaterial3Api::class)
@Composable
fun MainNavigator() {
var headerTitle by remember {
mutableStateOf("Лента")
}
var backLink by remember {
mutableStateOf(false)
}
val bottomNavController = rememberNavController()
Scaffold(
topBar = {
Header(
hostController = bottomNavController,
title = headerTitle,
backLink = backLink
)
},
bottomBar = { Footer(
hostController = bottomNavController
) },
) {
Box(modifier = Modifier.padding(it)) {
NavHost(
navController = bottomNavController,
startDestination = "feed",
) {
composable("feed",
exitTransition = {
slideOutOfContainer(AnimatedContentTransitionScope.SlideDirection.Left, tween(200))
}
) {
backLink = false
headerTitle = "Лента"
Box(modifier = Modifier
.fillMaxWidth()
.fillMaxHeight()) {
Feed(hostController = bottomNavController)
}
}
composable("feed/planned-tasks",
enterTransition = {
slideIntoContainer(
AnimatedContentTransitionScope.SlideDirection.Left, tween(200))
}
) {
backLink = true
headerTitle = "Задачи"
Box(modifier = Modifier
.fillMaxWidth()
.fillMaxHeight()) {
TasksList(hostController = bottomNavController)
}
}
composable("events") {
backLink = false
headerTitle = "События"
Box(modifier = Modifier.fillMaxWidth().fillMaxHeight()) {
Text(text = "События")
}
}
composable("settings") {
backLink = false
headerTitle = "Настройки"
Box(modifier = Modifier.fillMaxWidth().fillMaxHeight()) {
Text(text = "Profile")
}
}
composable("notifications") {
backLink = false
headerTitle = "Уведомления"
Box(modifier = Modifier.fillMaxWidth().fillMaxHeight()) {
Text(text = "Notifications")
}
}
composable("chat") {
backLink = false
headerTitle = "Чат"
Box(modifier = Modifier.fillMaxWidth().fillMaxHeight()) {
Text(text = "Chat")
}
}
composable("map",
enterTransition = {
fadeIn()
},
exitTransition = {
ExitTransition.None
}) {
backLink = false
headerTitle = "Карта"
MapScreen()
}
composable("tasks/{taskId}", arguments = listOf(navArgument("taskId") {
type = NavType.LongType
}),
enterTransition = {
slideIntoContainer(
AnimatedContentTransitionScope.SlideDirection.Left, tween(200))
}
) {bse ->
bse.arguments?.let {args ->
headerTitle = "Детали задачи"
backLink = true
Box(modifier = Modifier
.fillMaxWidth()
.fillMaxHeight()){
SubtaskScreen(args.getLong("taskId"))
}
return@composable
}
}
}
}
}
}
@Composable
fun Header(
modifier: Modifier = Modifier,
title: String = "Лента",
backLink: Boolean = false,
hostController: NavHostController
) {
Row(
modifier = modifier
.shadow(10.dp, RoundedCornerShape(10.dp))
.fillMaxWidth()
.background(Color.White)
.clip(RoundedCornerShape(bottomStart = 10.dp, bottomEnd = 10.dp))
.height(100.dp)
.padding(horizontal = 16.dp),
verticalAlignment = Alignment.CenterVertically
) {
Row(
modifier = Modifier.fillMaxWidth(),
horizontalArrangement = Arrangement.SpaceBetween,
verticalAlignment = Alignment.CenterVertically
) {
if (backLink) {
IconButton(onClick = { hostController.navigateUp() }) {
Icon(Icons.Filled.ArrowBack, contentDescription = "Back")
}
}
Text(
text = title,
modifier = Modifier,
fontSize = 30.sp,
fontWeight = FontWeight.SemiBold
)
if (!backLink) {
TextButton(
onClick = { /*TODO*/ },
colors = ButtonDefaults.textButtonColors(
contentColor = Color.Black,
)
) {
Icon(
Icons.Sharp.Settings,
contentDescription = "Settings",
)
}
} else {
Spacer(modifier = Modifier.weight(1f))
}
}
}
}
data class FooterNavMenuLabel(
val title: String,
val defaultImage: Int,
val imageActive: Int
)
@Composable
fun Footer(modifier: Modifier = Modifier,
hostController: NavHostController
) {
val menuItems = mapOf<String, FooterNavMenuLabel>(
"feed" to FooterNavMenuLabel("Лента", R.drawable.home_default, R.drawable.home),
"events" to FooterNavMenuLabel("События", R.drawable.calendar_default, R.drawable.calendar),
"notifications" to FooterNavMenuLabel("Уведомления", R.drawable.bell_default, R.drawable.bell),
"chat" to FooterNavMenuLabel("Чат", R.drawable.chat_default, R.drawable.chat),
"map" to FooterNavMenuLabel("Карта", R.drawable.location_default, R.drawable.location)
)
var activeRoute by remember {
mutableStateOf("feed")
}
Row(
modifier = modifier
.shadow(10.dp, RoundedCornerShape(10.dp))
.fillMaxWidth()
.background(Color.White)
.clip(RoundedCornerShape(bottomStart = 10.dp, bottomEnd = 10.dp))
.padding(horizontal = 5.dp),
verticalAlignment = Alignment.CenterVertically
) {
Row(
modifier = Modifier
.fillMaxWidth()
.padding(vertical = 40.dp),
horizontalArrangement = Arrangement.SpaceBetween,
verticalAlignment = Alignment.CenterVertically
) {
menuItems.forEach {
TextButton(
onClick = {
activeRoute = it.key
hostController.navigate(it.key)
},
colors = ButtonDefaults.textButtonColors(
contentColor = Color.Black,
)
) {
Column (horizontalAlignment = Alignment.CenterHorizontally) {
if (activeRoute== it.key) {
Image(painter = painterResource(id = it.value.imageActive), contentDescription = "")
Text(text = it.value.title, fontSize = 11.sp, color = Color.Black)
} else {
Image(painter = painterResource(id = it.value.defaultImage), contentDescription = "")
Text(text = it.value.title, fontSize = 11.sp, color = Color.Gray)
}
}
}
}
}
}
}

View File

@ -0,0 +1,21 @@
package com.example.mpdriver
import android.app.Application
import android.app.NotificationChannel
import android.app.NotificationManager
import android.os.Build
import androidx.annotation.RequiresApi
import androidx.core.content.getSystemService
class NotificationApplication: Application() {
@RequiresApi(Build.VERSION_CODES.O)
override fun onCreate() {
super.onCreate()
val notificationChannel = NotificationChannel("mpdriver_notifications",
"MPDriver notification channel",
NotificationManager.IMPORTANCE_HIGH)
val notificationManager = getSystemService(NOTIFICATION_SERVICE) as NotificationManager
notificationManager.createNotificationChannel(notificationChannel)
}
}

View File

@ -0,0 +1,27 @@
package com.example.mpdriver
import android.annotation.SuppressLint
import android.app.NotificationManager
import android.content.Context
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.Notifications
import androidx.core.app.NotificationCompat
import androidx.core.graphics.drawable.IconCompat
import kotlin.random.Random
class NotificationService(private val context: Context) {
val manager = context.getSystemService(NotificationManager::class.java)
fun showNotificationAuthCode(code: String) {
val notification = NotificationCompat.Builder(context, "mpdriver_notifications")
.setContentTitle("MPDriver - код подтверждения")
.setContentText("Ваш код подтверждения: $code")
.setPriority(NotificationManager.IMPORTANCE_HIGH)
.setSmallIcon(R.drawable.tick_default)
.setAutoCancel(true)
.build()
manager.notify(Random.nextInt(), notification)
}
}

View File

@ -0,0 +1,88 @@
package com.example.mpdriver.api
import android.annotation.SuppressLint
import android.content.Context
import androidx.navigation.NavHostController
import androidx.navigation.compose.rememberNavController
import com.example.mpdriver.storage.Database
import com.google.gson.Gson
import com.google.gson.reflect.TypeToken
import com.tencent.mmkv.MMKV
import kotlinx.coroutines.MainScope
import kotlinx.coroutines.launch
import okhttp3.Call
import okhttp3.Callback
import okhttp3.OkHttpClient
import okhttp3.Request
import okhttp3.Response
import okhttp3.internal.EMPTY_REQUEST
import java.io.IOException
import java.lang.reflect.Type
data class Langs(
val ru: String?
)
fun <T> T.toJson(): String {
return Gson().toJson(this)
}
inline fun <reified T> Response.parse(): T {
val data = this.body!!.string()
return Gson().fromJson(data, T::class.java)
}
inline fun <reified T> Response.parseList(): List<T> {
val data = this.body!!.string()
val type: Type = object : TypeToken<List<T>>() {}.type
return Gson().fromJson(data, type)
}
open class Api(val ctx: Context) {
val kv = MMKV.defaultMMKV()
val clientCheckAuth = OkHttpClient.Builder().build()
val client = OkHttpClient.Builder()
.addInterceptor { chain ->
val req = chain.request().newBuilder()
.addHeader("Authorization", "Bearer ${Database.access_token}")
.build()
chain.proceed(req)
}
.build()
val BASE_URL = "http://147.45.107.119:8000/api/v1"
fun performRequest(clientReq: Request, errorHandler: (Exception) -> Unit = {}, handler: (Response) -> Unit) {
client.newCall(clientReq).enqueue(object : Callback {
override fun onFailure(call: okhttp3.Call, e: java.io.IOException) {
errorHandler(e)
}
override fun onResponse(call: okhttp3.Call, response: okhttp3.Response) {
if (response.code == 401) {
Database.access_token = null
hostController?.let { hc ->
MainScope().launch {
hc.navigate("auth")
}
}
}
handler(response)
}
})
}
companion object {
var hostController: NavHostController? = null
fun setNavHostController(hc: NavHostController) {
hostController = hc
}
}
}

View File

@ -0,0 +1,86 @@
package com.example.mpdriver.api
import android.content.Context
import android.widget.Toast
import com.example.mpdriver.storage.Database
import com.google.gson.Gson
import com.google.gson.annotations.SerializedName
import okhttp3.Call
import okhttp3.Callback
import okhttp3.MediaType
import okhttp3.MediaType.Companion.toMediaType
import okhttp3.MultipartBody
import okhttp3.Request
import okhttp3.RequestBody
import okhttp3.RequestBody.Companion.toRequestBody
import okhttp3.Response
import java.io.IOException
data class GetPhoneCodeRequest(
val phoneNumber: String
)
enum class ErrorCodes {
@SerializedName("SotrNotFounded")
SOTR_NOT_FOUNDED,
@SerializedName("IncorrectPhone")
INCORRECT_PHONE
}
data class GetPhoneCodeResponse(
val code: Int?,
val error: ErrorCodes?,
val status: Int?,
val detail: String?,
val langs: Langs?
)
data class GetTokenResponse(
@SerializedName("access_token") val accessToken: String?,
@SerializedName("token_type") val tokenType: String?
)
class Auth(ctx: Context) : Api(ctx) {
fun getPhoneCode(phone: String, errorHandler: (IOException)-> Unit = {}, handler: (GetPhoneCodeResponse) -> Unit) {
Database.phoneNumber = phone
val body = GetPhoneCodeRequest(phone).toJson().toRequestBody("application/json".toMediaType())
val req = Request.Builder()
.url("${BASE_URL}/auth/phone")
.post(body)
.build()
client.newCall(req).enqueue(object : Callback {
override fun onFailure(call: Call, e: IOException) {
println(e)
errorHandler(e)
}
override fun onResponse(call: Call, response: Response) {
handler(response.parse())
}
})
}
fun getToken(phone: String, code: String, errorHandler: (IOException)-> Unit = {}, handler: (GetTokenResponse) -> Unit) {
val body = MultipartBody.Builder().setType(MultipartBody.FORM).addFormDataPart("username", phone).addFormDataPart("password", code).build()
val req = Request.Builder()
.url("${BASE_URL}/auth/phone/code")
.post(body)
.build()
client.newCall(req).enqueue(object: Callback {
override fun onFailure(call: Call, e: IOException) {
errorHandler(e)
}
override fun onResponse(call: Call, response: Response) {
val parsedResponse = response.parse<GetTokenResponse>()
Database.access_token = parsedResponse.accessToken
handler(parsedResponse)
}
})
}
}

View File

@ -0,0 +1,191 @@
package com.example.mpdriver.api
import android.content.Context
import android.util.Log
import com.example.mpdriver.storage.Database
import com.google.gson.annotations.SerializedName
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.GlobalScope
import kotlinx.coroutines.MainScope
import kotlinx.coroutines.launch
import kotlinx.coroutines.runBlocking
import okhttp3.MediaType.Companion.toMediaType
import okhttp3.Request
import okhttp3.RequestBody.Companion.toRequestBody
data class SetTaskStatusRequest(
val task_id: Long
)
data class TaskResponse(
@SerializedName("id" ) var id: Long? = null,
@SerializedName("startPln" ) var startPln: String? = null,
@SerializedName("endPln" ) var endPln: String? = null,
@SerializedName("startFact" ) var startFact: String? = null,
@SerializedName("endFact" ) var endFact: String? = null,
@SerializedName("status" ) var status: String? = null,
@SerializedName("taskType" ) var taskType: String? = null,
@SerializedName("text" ) var text: String? = null,
@SerializedName("events" ) var events: ArrayList<Events> = arrayListOf(),
@SerializedName("subtasks" ) var subtasks: ArrayList<Subtasks> = arrayListOf(),
@SerializedName("route" ) var route: Route? = Route()
)
data class Events (
@SerializedName("id" ) var id : Long? = null,
@SerializedName("type" ) var type : String? = null,
@SerializedName("text" ) var text : String? = null,
@SerializedName("eventDatetime" ) var eventDatetime : String? = null
)
data class Location (
@SerializedName("lat" ) var lat : Double? = null,
@SerializedName("lon" ) var lon : Double? = null
)
data class Station (
@SerializedName("id" ) var id : Long? = null,
@SerializedName("name" ) var name : String? = null,
@SerializedName("location" ) var location : Location? = Location()
)
data class Subtasks (
@SerializedName("id" ) var id : Long? = null,
@SerializedName("parentId" ) var parentId : Long? = null,
@SerializedName("startPln" ) var startPln : String? = null,
@SerializedName("endPln" ) var endPln : String? = null,
@SerializedName("startFact" ) var startFact : String? = null,
@SerializedName("endFact" ) var endFact : String? = null,
@SerializedName("status" ) var status : String? = null,
@SerializedName("taskType" ) var taskType : String? = null,
@SerializedName("text" ) var text : String? = null,
@SerializedName("station" ) var station : Station? = Station()
)
data class TRS (
@SerializedName("id" ) var id : Long? = null,
@SerializedName("gost" ) var gost : String? = null
)
data class Route (
@SerializedName("id" ) var id : Long? = null,
@SerializedName("temperatureProperty" ) var temperatureProperty : Int? = null,
@SerializedName("name" ) var name : String? = null,
@SerializedName("trailer" ) var trailer : TRS? = null,
@SerializedName("truck" ) var truck : TRS? = null
)
class TaskApi(ctx: Context): Api(ctx) {
suspend fun getPlannedTasksApiCall(errorHandler: (Exception)-> Unit = {}, handler: (List<TaskResponse>) -> Unit) {
val req = Request.Builder()
.url("$BASE_URL/tasks/planned")
.build()
performRequest(req, errorHandler) {
handler(it.parseList<TaskResponse>())
}
}
fun getPlannedTasks(errorHandler: (Exception)-> Unit = {}, handler: (List<TaskResponse>) -> Unit) {
runBlocking {
launch(Dispatchers.IO) {
getPlannedTasksApiCall {
println(Database.planned_tasks)
println(it)
Database.planned_tasks = it
println(Database.planned_tasks)
}
}
handler(Database.planned_tasks)
}
}
suspend fun getActiveTaskApiCall(errorHandler: (Exception)-> Unit = {}, handler: (TaskResponse) -> Unit) {
val req = Request.Builder()
.url("$BASE_URL/tasks/active")
.build()
performRequest(req, errorHandler) {
handler(it.parse<TaskResponse>())
}
}
fun getActiveTask(errorHandler: (Exception)-> Unit = {}, handler: (TaskResponse) -> Unit) {
runBlocking {
launch(Dispatchers.IO) {
getAllTasksForUser()
}
val data = Database.tasks.filter { it.status == "InProgress" }
if (data.count() >= 1) {
return@runBlocking handler(data[0])
}
handler(TaskResponse())
}
}
fun getCompletedTask(errorHandler: (Exception)-> Unit = {}, handler: (List<TaskResponse>) -> Unit) {
val req = Request.Builder()
.url("$BASE_URL/tasks/completed")
.build()
performRequest(req, errorHandler) {
handler(it.parseList<TaskResponse>())
}
}
fun getSubtasks(taskId: Long, errorHandler: (Exception)-> Unit = {}, handler: (List<Subtasks>) -> Unit) {
val req = Request.Builder()
.url("$BASE_URL/tasks/$taskId/subtasks")
.build()
performRequest(req, errorHandler) {
handler(it.parseList<Subtasks>())
}
}
fun getEvents(taskId: Long, errorHandler: (Exception)-> Unit = {}, handler: (List<Events>) -> Unit) {
val req = Request.Builder()
.url("$BASE_URL/tasks/$taskId/events")
.build()
performRequest(req, errorHandler) {
handler(it.parseList<Events>())
}
}
fun getAllTasksForUser() {
val req = Request.Builder().url("$BASE_URL/tasks").build()
performRequest(req) {res ->
val data = res.parseList<TaskResponse>()
Database.tasks = data
}
}
fun setTaskStatusInProgress(taskId: Long, errorHandler: (Exception)-> Unit = {}, handler: (TaskResponse) -> Unit) {
val body = SetTaskStatusRequest(taskId).toJson().toRequestBody("application/json".toMediaType())
val req = Request.Builder()
.url("$BASE_URL/tasks/active")
.post(body)
performRequest(req.build(), errorHandler) {
handler(it.parse())
}
}
}

View File

@ -0,0 +1,89 @@
package com.example.mpdriver.components
import androidx.compose.foundation.border
import androidx.compose.foundation.layout.PaddingValues
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.material3.Button
import androidx.compose.material3.ButtonDefaults
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.graphics.RectangleShape
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
enum class ButtonType {
DANGER,
WARNING,
SUCCESS,
DEFAULT
}
@Composable
fun ActiveButton(onClick: () -> Unit, modifier: Modifier = Modifier, text: String) {
Button(
modifier = modifier,
onClick = onClick,
colors = ButtonDefaults.buttonColors(containerColor = Color.Black),
shape = RoundedCornerShape(10.dp)
) {
Text(text = text)
}
}
@Composable
fun StaleButton(onClick: () -> Unit, modifier: Modifier = Modifier, text: String) {
Button(
modifier = modifier,
onClick = onClick,
colors = ButtonDefaults.buttonColors(
containerColor = Color(0xFFF2F2F2),
contentColor = Color.Black
),
shape = RoundedCornerShape(10.dp)
) {
Text(text = text)
}
}
@Composable
fun IteractionButton(onClick: () -> Unit, child: @Composable () -> Unit) {
Button(onClick = onClick, shape = RectangleShape, contentPadding = PaddingValues(0.dp), colors = ButtonDefaults.buttonColors(contentColor = Color.Black, containerColor = Color.Transparent)) {
child()
}
}
@Preview(showBackground = true)
@Composable
fun JDEButton(modifier: Modifier = Modifier,
onClick: () -> Unit = {},
type: ButtonType = ButtonType.DEFAULT,
content: @Composable () -> Unit = { Text(
text = "Button",
)}) {
Button(onClick = onClick,
colors = ButtonDefaults.buttonColors(containerColor = Color.Transparent, contentColor = Color.Black), contentPadding = PaddingValues(0.dp), shape = RectangleShape
) {
Row(modifier
.fillMaxWidth()
.border(2.dp,
when(type) {
ButtonType.DANGER -> Color(0xFFE5332A)
ButtonType.WARNING -> Color(0xFFFFC700)
ButtonType.SUCCESS -> Color(0xFF45900B)
ButtonType.DEFAULT -> Color.Gray
},
RoundedCornerShape(10.dp))
.padding(15.dp)) {
content()
}
}
}

View File

@ -0,0 +1,23 @@
package com.example.mpdriver.components
import androidx.compose.runtime.Composable
import androidx.compose.runtime.DisposableEffect
import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.LocalLifecycleOwner
import androidx.lifecycle.Lifecycle
import androidx.lifecycle.LifecycleEventObserver
import androidx.lifecycle.LifecycleOwner
@Composable
fun ComposableLifecycle(modifier: Modifier = Modifier, lifecycleOwner: LifecycleOwner = LocalLifecycleOwner.current, onEvent: (LifecycleOwner, Lifecycle.Event) -> Unit) {
DisposableEffect(lifecycleOwner) {
val observer = LifecycleEventObserver {source, event ->
onEvent(source, event)
}
lifecycleOwner.lifecycle.addObserver(observer)
onDispose {
lifecycleOwner.lifecycle.removeObserver(observer)
}
}
}

View File

@ -0,0 +1,40 @@
package com.example.mpdriver.components
import androidx.compose.foundation.Image
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.padding
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import com.example.mpdriver.R
@Composable
fun EmptyList(modifier: Modifier = Modifier, text: String = "") {
Column(
horizontalAlignment = Alignment.CenterHorizontally,
modifier = modifier
) {
Image(
painter = painterResource(id = R.drawable.zoom_icon),
contentDescription = "No Active Task",
modifier = Modifier
.fillMaxWidth()
)
Spacer(modifier = Modifier.height(10.dp))
Text(
text = text,
fontSize = 16.sp,
textAlign = TextAlign.Center
)
}
return
}

View File

@ -0,0 +1,51 @@
package com.example.mpdriver.components
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.width
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.unit.dp
data class HeaderTabsData(
val idx: Int,
val title: String
)
@Composable
fun HeaderTabs(
modifier: Modifier = Modifier,
tabsData: List<HeaderTabsData>,
activeTab: Int = 0,
setActiveTab: (Int) -> Unit
) {
Row(
modifier
.fillMaxWidth()
.padding(bottom = 15.dp), horizontalArrangement = Arrangement.SpaceBetween
) {
tabsData.forEachIndexed { idx, it ->
when (activeTab) {
it.idx -> ActiveButton(
modifier = Modifier.weight(1f),
onClick = {
setActiveTab(it.idx)
},
text = it.title
)
else -> StaleButton(
modifier = Modifier.weight(1f),
onClick = { setActiveTab(it.idx) },
text = it.title
)
}
if (idx != 0 || idx != tabsData.count() - 1) {
Spacer(modifier = Modifier.width(10.dp))
}
}
}
}

View File

@ -0,0 +1,90 @@
package com.example.mpdriver.components
import androidx.compose.foundation.background
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.clip
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
@Preview(showBackground = true)
@Composable
fun InformationPlaceholderBig(
modifier: Modifier = Modifier,
mainText: String = "main text",
subText: String = "Subtext"
) {
Column(
modifier = modifier
.clip(RoundedCornerShape(10.dp))
.background(Color(0xFFEEEEEE))
.padding(vertical = 12.dp)
.clip(RoundedCornerShape(10.dp)),
horizontalAlignment = androidx.compose.ui.Alignment.CenterHorizontally
) {
Text(
text = mainText,
fontSize = 22.sp,
fontWeight = androidx.compose.ui.text.font.FontWeight.Bold
)
Text(
text = subText,
fontSize = 15.sp,
fontWeight = androidx.compose.ui.text.font.FontWeight.Normal,
color = Color.Gray
)
}
}
@Preview(showBackground = true)
@Composable
fun InformationPlaceholderSmall(
modifier: Modifier = Modifier,
mainText: String = "main text",
subText: String = "Subtext",
children: @Composable () -> Unit = {}
) {
Row(
modifier = modifier
.clip(RoundedCornerShape(10.dp))
.background(Color(0xFFEEEEEE))
.padding(vertical = 12.dp, horizontal = 10.dp)
.clip(RoundedCornerShape(10.dp)),
horizontalArrangement = Arrangement.Absolute.SpaceBetween,
verticalAlignment = Alignment.CenterVertically
) {
Column(
horizontalAlignment = Alignment.Start
) {
Text(
text = subText,
fontSize = 15.sp,
fontWeight = androidx.compose.ui.text.font.FontWeight.Normal,
color = Color.Gray
)
Text(
text = mainText,
fontSize = 22.sp,
fontWeight = androidx.compose.ui.text.font.FontWeight.Bold
)
}
children()
}
}

View File

@ -0,0 +1,29 @@
package com.example.mpdriver.components
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.PaddingValues
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.lazy.LazyListState
import androidx.compose.foundation.lazy.items
import androidx.compose.foundation.lazy.rememberLazyListState
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.unit.dp
@Composable
fun <T> Layout(modifier: Modifier = Modifier, header: @Composable () -> Unit = {}, dataList: List<T>, state : LazyListState = rememberLazyListState(), itemComponent: @Composable (T) -> Unit) {
LazyColumn(
modifier
.fillMaxWidth()
.padding(16.dp), verticalArrangement = Arrangement.spacedBy(10.dp), state = state) {
item {
header()
}
items(items = dataList) {
itemComponent(it)
}
}
}

View File

@ -0,0 +1,545 @@
package com.example.mpdriver.components
import androidx.compose.animation.core.animateFloatAsState
import androidx.compose.foundation.Image
import androidx.compose.foundation.background
import androidx.compose.foundation.border
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.fillMaxHeight
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.offset
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.width
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.foundation.text.BasicTextField
import androidx.compose.foundation.text.KeyboardOptions
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.outlined.Notifications
import androidx.compose.material3.Button
import androidx.compose.material3.ButtonDefaults
import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.Icon
import androidx.compose.material3.IconButton
import androidx.compose.material3.ModalBottomSheet
import androidx.compose.material3.Text
import androidx.compose.material3.TextButton
import androidx.compose.material3.TextField
import androidx.compose.material3.TextFieldDefaults
import androidx.compose.material3.rememberModalBottomSheetState
import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.rememberCoroutineScope
import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.clip
import androidx.compose.ui.focus.onFocusEvent
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.text.input.KeyboardType
import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import androidx.navigation.NavHostController
import androidx.navigation.compose.NavHost
import androidx.navigation.compose.composable
import androidx.navigation.compose.rememberNavController
import com.example.mpdriver.R
import com.example.mpdriver.api.Subtasks
import com.example.mpdriver.recievers.TimeTickReciever
import kotlinx.coroutines.MainScope
import kotlinx.coroutines.coroutineScope
import kotlinx.coroutines.launch
import kotlinx.coroutines.runBlocking
import kotlinx.datetime.Clock
import kotlinx.datetime.DateTimeUnit
import kotlinx.datetime.LocalDateTime
import kotlinx.datetime.UtcOffset
import kotlinx.datetime.asTimeZone
import kotlinx.datetime.format.byUnicodePattern
import kotlinx.datetime.toInstant
import kotlinx.datetime.until
import kotlin.math.abs
@Preview(showBackground = true)
@Composable
fun Subtask(
modifier: Modifier = Modifier,
children: @Composable () -> Unit = {},
subtask: Subtasks = Subtasks(1, startPln = "2024-06-01T00:00", endPln = "2024-06-10T00:00"),
footerButton: @Composable () -> Unit = {}
) {
var isActionVisible by remember {
mutableStateOf(false)
}
var expanded by remember {
mutableStateOf(true)
}
var nowTime by remember {
mutableStateOf(Clock.System.now())
}
TimeTickReciever.registerHandler {
nowTime = Clock.System.now()
}
val startPln = LocalDateTime.parse(subtask.startPln!!)
val endPln = LocalDateTime.parse(subtask.endPln!!)
val dateFormat = LocalDateTime.Format {
byUnicodePattern("d.MM.yyyy")
}
val timeFormat = LocalDateTime.Format {
byUnicodePattern("HH:mm")
}
val leastBase = nowTime.until(
endPln.toInstant(offset = UtcOffset(3)),
timeZone = UtcOffset(3).asTimeZone(), unit = DateTimeUnit.MINUTE
)
val isDelay = leastBase != abs(leastBase)
val leastDays = abs(leastBase) / 60 / 24
val leastHours = abs(leastBase) / 60 - leastDays * 24
val leastMinutes = abs(leastBase) - leastDays * 60 * 24 - leastHours * 60
val status = when {
subtask.status == "Completed" && !isDelay -> TaskStatus.SUCCESS
subtask.status == "Completed" && isDelay -> TaskStatus.WARNING
subtask.status == "Cancelled" -> TaskStatus.WARNING
subtask.status == "InProgress" || subtask.status == "NotDefined" && isDelay -> TaskStatus.DANGER
else -> TaskStatus.DEFAULT
}
IteractionButton(onClick = {
isActionVisible = true
}) {
Column(
modifier
.border(
2.dp, when (status) {
TaskStatus.DEFAULT -> Color.Gray
TaskStatus.SUCCESS -> Color(0xFF45900B)
TaskStatus.DANGER -> Color(0xFFE5332A)
TaskStatus.WARNING -> Color(0xFFFFC700)
}, RoundedCornerShape(10.dp)
)
.fillMaxWidth()
.padding(horizontal = 15.dp, vertical = 15.dp)
) {
Row(
Modifier
.fillMaxWidth()
.padding(bottom = 15.dp),
horizontalArrangement = Arrangement.SpaceBetween
) {
Text(
modifier = Modifier.weight(1f),
text = "${subtask.text}",
fontWeight = FontWeight.Bold,
fontSize = 20.sp
)
Spacer(modifier = Modifier.width(10.dp))
IconButton(onClick = { /*TODO*/ }, modifier = Modifier.weight(0.1f)) {
Image(
painter = painterResource(id = R.drawable.tick_default),
contentDescription = "tick"
)
}
}
Text(
modifier = Modifier.padding(bottom = 5.dp),
text = "Подзадача доожна быть выполнена: ",
fontWeight = FontWeight.Bold,
fontSize = 14.sp
)
Row(Modifier.padding(bottom = 20.dp)) {
InformationPlaceholderSmall(
Modifier.weight(2f),
mainText = dateFormat.format(endPln),
subText = "Дата"
)
Spacer(modifier = Modifier.width(10.dp))
InformationPlaceholderSmall(
Modifier.weight(1f),
mainText = timeFormat.format(endPln),
subText = "Время"
)
}
Text(
modifier = Modifier.padding(bottom = 5.dp),
text = if (isDelay) "Задержка" else "Осталось времени:",
fontWeight = FontWeight.Bold,
fontSize = if (isDelay) 20.sp else 14.sp,
color = if (isDelay) Color(0xFFE5332A) else Color.Black
)
Row(Modifier.padding(bottom = 20.dp)) {
InformationPlaceholderSmall(
Modifier
.weight(1f)
.border(
1.dp,
color = if (isDelay) Color(0xFFE5332A) else Color.Gray,
shape = RoundedCornerShape(10.dp)
),
mainText = leastDays.toString(),
subText = "Дни"
)
Spacer(modifier = Modifier.width(10.dp))
InformationPlaceholderSmall(
Modifier
.weight(1f)
.border(
1.dp,
color = if (isDelay) Color(0xFFE5332A) else Color.Gray,
shape = RoundedCornerShape(10.dp)
),
mainText = leastHours.toString(),
subText = "Часы"
)
Spacer(modifier = Modifier.width(10.dp))
InformationPlaceholderSmall(
Modifier
.weight(1f)
.border(
1.dp,
color = if (isDelay) Color(0xFFE5332A) else Color.Gray,
shape = RoundedCornerShape(10.dp)
),
mainText = leastMinutes.toString(),
subText = "Минуты"
)
}
TextButton(
onClick = { /*TODO*/ },
colors = ButtonDefaults.buttonColors(
contentColor = Color.Black,
containerColor = Color.Transparent
)
) {
Row(
Modifier
.fillMaxWidth()
.border(1.dp, Color.Gray, RoundedCornerShape(10.dp))
.padding(vertical = 10.dp),
horizontalArrangement = Arrangement.Center,
verticalAlignment = Alignment.CenterVertically
) {
Image(
painter = painterResource(id = R.drawable.yanavi),
contentDescription = "yanavi"
)
Spacer(modifier = Modifier.width(10.dp))
Text(text = "Открыть в Яндекс Навигатор")
}
}
footerButton()
}
}
if (isActionVisible) {
IsSubtaskCompletedAction(setStateAction = { isActionVisible = false }, subtask)
}
}
@OptIn(ExperimentalMaterial3Api::class)
@Composable
fun IsSubtaskCompletedAction(setStateAction: (Boolean) -> Unit = { }, subtask: Subtasks) {
var currentStep by remember {
mutableStateOf(0)
}
var title by remember {
mutableStateOf("Вам удалось выполнить подзадачу?")
}
val actionController = rememberNavController()
var isFullScreen by remember {
mutableStateOf(false)
}
val sheetState = rememberModalBottomSheetState(
skipPartiallyExpanded = false,
)
ModalBottomSheet(
onDismissRequest = {
setStateAction(false)
},
containerColor = Color.White,
modifier = Modifier.fillMaxHeight(),
sheetState = sheetState
) {
Column(
Modifier
.fillMaxWidth()
.padding(horizontal = 16.dp)
) {
Row(
modifier = Modifier
.fillMaxWidth()
.padding(bottom = 10.dp), horizontalArrangement = Arrangement.Start
) {
Text(
text = title,
fontSize = 20.sp,
textAlign = TextAlign.Center,
modifier = Modifier.weight(1f)
)
}
Column {
NavHost(navController = actionController, startDestination = "initial") {
composable("initial") {
InitialStep(subtask = subtask, controller = actionController)
}
composable("success") {
SuccessStep(subtask = subtask, controller = actionController)
title = "Когда вы выполнили подзадачу?"
}
composable("failure") {
isFullScreen = true
LaunchedEffect(sheetState) {
sheetState.expand()
}
title = "Что помешало выполнить подзадачу?"
FailureStep(subtask = subtask, controller = actionController)
}
}
}
}
}
}
@Composable
fun InitialStep(subtask: Subtasks, controller: NavHostController) {
Column {
JDEButton(type = ButtonType.SUCCESS, onClick = { controller.navigate("success") }) {
Text(text = "Подзадача выполнена", fontSize = 15.sp, fontWeight = FontWeight.Bold)
}
Spacer(modifier = Modifier.height(10.dp))
JDEButton(type = ButtonType.WARNING, onClick = {controller.navigate("failure")}) {
Text(text = "У меня возникла проблема", fontSize = 15.sp, fontWeight = FontWeight.Bold)
}
Spacer(modifier = Modifier.height(40.dp))
}
}
@Preview(showBackground = true)
@Composable
fun SuccessStep(
subtask: Subtasks = Subtasks(),
controller: NavHostController = rememberNavController()
) {
var date by remember {
mutableStateOf("")
}
var time by remember {
mutableStateOf("")
}
Column {
Column(
Modifier
.border(
2.dp, Color.Gray, RoundedCornerShape(10.dp)
)
.fillMaxWidth()
.padding(horizontal = 15.dp, vertical = 15.dp)
) {
Row(
Modifier
.fillMaxWidth()
.padding(bottom = 15.dp),
horizontalArrangement = Arrangement.SpaceBetween
) {
Text(
modifier = Modifier.weight(1f),
text = "${subtask.text}",
fontWeight = FontWeight.Bold,
fontSize = 20.sp
)
Spacer(modifier = Modifier.width(10.dp))
IconButton(onClick = { /*TODO*/ }, modifier = Modifier.weight(0.1f)) {
Image(
painter = painterResource(id = R.drawable.tick_default),
contentDescription = "tick"
)
}
}
Spacer(modifier = Modifier.height(10.dp))
Row(Modifier.fillMaxWidth()) {
TextInput(modifier = Modifier.weight(.66f), date, { date = it }, "Дата")
Spacer(modifier = Modifier.width(10.dp))
TextInput(modifier = Modifier.weight(.33f), time, { date = time }, "Время")
}
}
Spacer(modifier = Modifier.height(20.dp))
ActiveButton(onClick = { /*TODO*/ }, text = "Сохранить", modifier = Modifier.fillMaxWidth())
}
}
@OptIn(ExperimentalMaterial3Api::class)
@Preview(showBackground = true)
@Composable
fun FailureStep(
subtask: Subtasks = Subtasks(),
controller: NavHostController = rememberNavController()
) {
var failureDesk by remember {
mutableStateOf("")
}
var date by remember {
mutableStateOf("")
}
Column {
Text(
text = "Опишите причину, по которой вам не удалось выполнить подзадачу",
fontSize = 14.sp,
fontWeight = FontWeight.Normal,
textAlign = TextAlign.Center,
color = Color.Gray
)
Spacer(modifier = Modifier.height(40.dp))
TextField(value = failureDesk,
onValueChange = { failureDesk = it },
shape = RoundedCornerShape(10.dp),
modifier = Modifier.fillMaxWidth(),
placeholder = { Text(text = "Введите текст") },
colors = TextFieldDefaults.colors(
unfocusedContainerColor = Color(0xFFF2F2F2),
focusedContainerColor = Color(0xFFF2F2F2),
focusedIndicatorColor = Color.Transparent,
unfocusedIndicatorColor = Color.Transparent
)
)
Spacer(modifier = Modifier.height(10.dp))
Text(text = "Проблема возникла:", fontSize = 14.sp, fontWeight = FontWeight.Bold)
TextField(
value = date,
onValueChange = { date = it },
shape = RoundedCornerShape(10.dp),
modifier = Modifier.fillMaxWidth(),
placeholder = { Text(text = "Дата") },
colors = TextFieldDefaults.colors(
unfocusedContainerColor = Color(0xFFF2F2F2),
focusedContainerColor = Color(0xFFF2F2F2),
focusedIndicatorColor = Color.Transparent,
unfocusedIndicatorColor = Color.Transparent
),
trailingIcon = {Icon(
painter = painterResource(id = R.drawable.calendar_default),
contentDescription = ""
)}
)
Spacer(modifier = Modifier.height(10.dp))
TextField(
value = date,
onValueChange = { date = it },
shape = RoundedCornerShape(10.dp),
modifier = Modifier.fillMaxWidth(),
placeholder = { Text(text = "Дата") },
colors = TextFieldDefaults.colors(
unfocusedContainerColor = Color(0xFFF2F2F2),
focusedContainerColor = Color(0xFFF2F2F2),
focusedIndicatorColor = Color.Transparent,
unfocusedIndicatorColor = Color.Transparent
),
trailingIcon = {Icon(painter = painterResource(id = R.drawable.calendar_default),
contentDescription = ""
)}
)
Spacer(modifier = Modifier.height(20.dp))
ActiveButton(onClick = { /*TODO*/ }, text = "Отправить", modifier = Modifier.fillMaxWidth())
}
}
@Preview(showBackground = true)
@Composable
fun TextInput(
modifier: Modifier = Modifier,
value: String = "24.12.2023",
onValueChange: (String) -> Unit = {},
placeholder: String = "Дата"
) {
var isFocused by remember {
mutableStateOf(true)
}
BasicTextField(
modifier = modifier
.onFocusEvent {
isFocused = it.isFocused
},
value = value,
onValueChange = onValueChange,
keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Number),
decorationBox = {
Box(
Modifier
.height(50.dp)
.clip(RoundedCornerShape(10.dp))
.background(Color(0xFFF2F2F2))
.padding(horizontal = 10.dp, vertical = 5.dp)
) {
Text(
modifier = Modifier.align(if (isFocused) Alignment.TopStart else Alignment.CenterStart),
text = placeholder,
fontWeight = FontWeight.Normal,
fontSize = if (isFocused) 13.sp else 18.sp,
color = Color.Gray
)
if (isFocused) {
Text(
modifier = Modifier.align(Alignment.BottomStart),
text = value,
fontSize = 18.sp,
fontWeight = FontWeight.Bold
)
}
}
})
}

View File

@ -0,0 +1,276 @@
package com.example.mpdriver.components
import androidx.compose.animation.AnimatedVisibility
import androidx.compose.foundation.Image
import androidx.compose.foundation.border
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.width
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.rounded.KeyboardArrowUp
import androidx.compose.material3.ButtonDefaults
import androidx.compose.material3.Divider
import androidx.compose.material3.Icon
import androidx.compose.material3.IconButton
import androidx.compose.material3.Text
import androidx.compose.material3.TextButton
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import com.example.mpdriver.R
import com.example.mpdriver.api.Subtasks
import com.example.mpdriver.api.TaskResponse
import com.example.mpdriver.recievers.TimeTickReciever
import kotlinx.datetime.Clock
import kotlinx.datetime.DateTimeUnit
import kotlinx.datetime.LocalDateTime
import kotlinx.datetime.UtcOffset
import kotlinx.datetime.asTimeZone
import kotlinx.datetime.format.byUnicodePattern
import kotlinx.datetime.toInstant
import kotlinx.datetime.until
import kotlin.math.abs
enum class TaskStatus {
DANGER,
SUCCESS,
WARNING,
DEFAULT
}
@Preview(showBackground = true)
@Composable
fun Task(modifier: Modifier = Modifier,
children: @Composable() ()->Unit = {},
taskResponse: TaskResponse = TaskResponse(1, "2024-06-01T00:00", "2024-06-10T00:00"),
footerButton: @Composable ()-> Unit = {}) {
var expanded by remember {
mutableStateOf(false)
}
var nowTime by remember {
mutableStateOf(Clock.System.now())
}
TimeTickReciever.registerHandler {
nowTime = Clock.System.now()
}
val startPln = LocalDateTime.parse(taskResponse.startPln!!)
val endPln = LocalDateTime.parse(taskResponse.endPln!!)
val dateFormat = LocalDateTime.Format {
byUnicodePattern("d.MM.yyyy")
}
val timeFormat = LocalDateTime.Format {
byUnicodePattern("HH:mm")
}
val leastBase = nowTime.until(
endPln.toInstant(offset = UtcOffset(3)),
timeZone = UtcOffset(3).asTimeZone(), unit = DateTimeUnit.MINUTE)
val isDelay = leastBase != abs(leastBase)
val leastDays = abs( leastBase) / 60 / 24
val leastHours = abs(leastBase) / 60 - leastDays * 24
val leastMinutes = abs(leastBase) - leastDays * 60 * 24 - leastHours * 60
val status = when {
taskResponse.status == "Completed" && !isDelay -> TaskStatus.SUCCESS
taskResponse.status == "Completed" && isDelay -> TaskStatus.WARNING
taskResponse.status == "Cancelled" -> TaskStatus.WARNING
taskResponse.status == "InProgress" || taskResponse.status == "NotDefined" && isDelay -> TaskStatus.DANGER
else -> TaskStatus.DEFAULT
}
Column(
modifier
.border(
2.dp, when (status) {
TaskStatus.DEFAULT -> Color.Gray
TaskStatus.SUCCESS -> Color(0xFF45900B)
TaskStatus.DANGER -> Color(0xFFE5332A)
TaskStatus.WARNING -> Color(0xFFFFC700)
}, RoundedCornerShape(10.dp)
)
.fillMaxWidth()
.padding(horizontal = 15.dp, vertical = 15.dp)
) {
Row(
Modifier
.fillMaxWidth()
.padding(bottom = 15.dp),
horizontalArrangement = Arrangement.SpaceBetween
) {
Text(
modifier = Modifier.weight(1f),
text = "Движение по маршруту\n${taskResponse.route?.name}",
fontWeight = FontWeight.Bold,
fontSize = 20.sp
)
Spacer(modifier = Modifier.width(10.dp))
IconButton(onClick = { /*TODO*/ }, modifier = Modifier.weight(0.1f)) {
Image(
painter = painterResource(id = R.drawable.tick_default),
contentDescription = "tick"
)
}
}
Row(Modifier.padding(bottom = 20.dp)) {
InformationPlaceholderSmall(
Modifier.weight(1f),
mainText = "${taskResponse.route?.truck?.gost}",
subText = "Номер ТС"
)
Spacer(modifier = Modifier.width(10.dp))
InformationPlaceholderSmall(
Modifier.weight(1f),
mainText = "${if (taskResponse.route!!.trailer != null) taskResponse.route!!.trailer!!.gost else "-"}",
subText = "Номер прицепа"
)
}
InformationPlaceholderSmall(
Modifier
.fillMaxWidth()
.padding(bottom = 20.dp),
mainText = if (taskResponse.route!!.temperatureProperty == 1) "Горячая" else "Холодная",
subText = "Тип перевозки"
) {
when (taskResponse.route!!.temperatureProperty) {
1 -> Image(painter = painterResource(id = R.drawable.hottransport), contentDescription = "" )
else -> Image(painter = painterResource(id = R.drawable.coltransport), contentDescription = "" )
}
}
children()
AnimatedVisibility(visible = expanded) {
Column {
InformationPlaceholderSmall(
Modifier
.fillMaxWidth()
.padding(bottom = 20.dp),
mainText = "${taskResponse.text}",
subText = "Полный маршрут"
)
Text(
modifier = Modifier.padding(bottom = 5.dp),
text = "Начало маршрута",
fontWeight = FontWeight.Bold,
fontSize = 14.sp
)
Row(Modifier.padding(bottom = 20.dp)) {
InformationPlaceholderSmall(
Modifier.weight(2f),
mainText = dateFormat.format(startPln),
subText = "Дата"
)
Spacer(modifier = Modifier.width(10.dp))
InformationPlaceholderSmall(
Modifier.weight(1f),
mainText = timeFormat.format(startPln),
subText = "Время"
)
}
Text(
modifier = Modifier.padding(bottom = 5.dp),
text = "Конец маршрута",
fontWeight = FontWeight.Bold,
fontSize = 14.sp
)
Row(Modifier.padding(bottom = 20.dp)) {
InformationPlaceholderSmall(
Modifier.weight(2f),
mainText = dateFormat.format(endPln),
subText = "Дата"
)
Spacer(modifier = Modifier.width(10.dp))
InformationPlaceholderSmall(
Modifier.weight(1f),
mainText = timeFormat.format(endPln),
subText = "Время"
)
}
Text(
modifier = Modifier.padding(bottom = 5.dp),
text = if (isDelay) "Задержка" else "Осталось времени до конца маршрута",
fontWeight = FontWeight.Bold,
fontSize = if (isDelay) 20.sp else 14.sp,
color = if (isDelay) Color(0xFFE5332A) else Color.Black
)
Row(Modifier.padding(bottom = 20.dp)) {
InformationPlaceholderSmall(
Modifier
.weight(1f)
.border(
1.dp,
color = if (isDelay) Color(0xFFE5332A) else Color.Gray,
shape = RoundedCornerShape(10.dp)
),
mainText = leastDays.toString(),
subText = "Дни"
)
Spacer(modifier = Modifier.width(10.dp))
InformationPlaceholderSmall(
Modifier
.weight(1f)
.border(
1.dp,
color = if (isDelay) Color(0xFFE5332A) else Color.Gray,
shape = RoundedCornerShape(10.dp)
),
mainText = leastHours.toString(),
subText = "Часы"
)
Spacer(modifier = Modifier.width(10.dp))
InformationPlaceholderSmall(
Modifier
.weight(1f)
.border(
1.dp,
color = if (isDelay) Color(0xFFE5332A) else Color.Gray,
shape = RoundedCornerShape(10.dp)
),
mainText = leastMinutes.toString(),
subText = "Минуты"
)
}
}
}
Divider(thickness = 2.dp, color = Color.Gray)
TextButton(onClick = { expanded = !expanded }, colors = ButtonDefaults.buttonColors(contentColor = Color.Black, containerColor = Color.Transparent)) {
Row(Modifier.fillMaxWidth(), horizontalArrangement = Arrangement.Center) {
Text(text = if (expanded) "Скрыть" else "Развернуть", fontSize = 16.sp)
Icon(Icons.Rounded.KeyboardArrowUp, contentDescription = "Chevron")
}
}
footerButton()
}
}

View File

@ -0,0 +1,94 @@
package com.example.mpdriver.components.feed
import androidx.compose.foundation.BorderStroke
import androidx.compose.foundation.Image
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.PaddingValues
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.width
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.Call
import androidx.compose.material.icons.filled.CheckCircle
import androidx.compose.material.icons.outlined.Clear
import androidx.compose.material3.Button
import androidx.compose.material3.ButtonDefaults
import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.ModalBottomSheet
import androidx.compose.material3.Text
import androidx.compose.material3.TextButton
import androidx.compose.material3.rememberModalBottomSheetState
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.graphics.RectangleShape
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import androidx.navigation.NavHostController
import com.example.mpdriver.api.TaskResponse
import com.example.mpdriver.components.ButtonType
import com.example.mpdriver.components.EmptyList
import com.example.mpdriver.components.IteractionButton
import com.example.mpdriver.components.JDEButton
import com.example.mpdriver.components.Subtask
import com.example.mpdriver.components.Task
@OptIn(ExperimentalMaterial3Api::class)
@Composable
fun ActiveTask(activeTask: TaskResponse? = null, hostController: NavHostController) {
Column(
Modifier
.fillMaxWidth()
.padding(vertical = 15.dp)
) {
if (activeTask == null) {
EmptyList(Modifier.padding(vertical = 60.dp), text = "У вас нет активных задач")
return
}
Text(
text = "Активная задача",
fontWeight = androidx.compose.ui.text.font.FontWeight.Bold,
fontSize = 18.sp
)
activeTask.let {
IteractionButton(onClick = { hostController.navigate("tasks/${it.id}") }) {
Task(taskResponse = it)
}
}
Spacer(modifier = Modifier.height(10.dp))
Text(
text = "Активная подзадача",
fontWeight = androidx.compose.ui.text.font.FontWeight.Bold,
fontSize = 18.sp
)
Spacer(modifier = Modifier.height(10.dp))
activeTask.let { task ->
IteractionButton(onClick = { /*TODO*/ }) {
Subtask(subtask = task.subtasks.filter { it.status == "InProgress" }[0])
}
}
}
}

View File

@ -0,0 +1,79 @@
package com.example.mpdriver.components.feed
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.ArrowForward
import androidx.compose.material3.Button
import androidx.compose.material3.ButtonDefaults
import androidx.compose.material3.Icon
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import androidx.navigation.NavHostController
import com.example.mpdriver.components.InformationPlaceholderBig
@Composable
fun FeedTaskDataCard(
modifier: Modifier = Modifier,
title: String = "Запланированные задачи",
count: Int = 2,
date: String = "30.11.2023",
dateDescription: String = "Ближайшая",
buttonLabel: String = "Смотреть запланированные задачи",
hostController: NavHostController,
link: String
) {
Column(modifier = modifier.fillMaxWidth()) {
Text(
text = title,
fontWeight = FontWeight.Bold,
fontSize = 18.sp
)
Spacer(modifier = Modifier.height(8.dp))
Row(modifier = Modifier.fillMaxWidth(), horizontalArrangement = Arrangement.SpaceBetween) {
InformationPlaceholderBig(
mainText = "$count",
subText = "Количество",
modifier = Modifier.weight(1f)
)
Spacer(modifier = Modifier.weight(0.1f))
InformationPlaceholderBig(
mainText = date,
subText = dateDescription,
modifier = Modifier.weight(1f)
)
}
Spacer(modifier = Modifier.height(15.dp))
Button(
onClick = { hostController.navigate(link) },
colors = ButtonDefaults.buttonColors(
contentColor = Color.White,
containerColor = Color.Black
),
shape = RoundedCornerShape(10.dp),
modifier = Modifier.fillMaxWidth()
) {
Row(
modifier = Modifier
.fillMaxWidth()
.padding(vertical = 8.dp), horizontalArrangement = Arrangement.SpaceBetween
) {
Text(text = buttonLabel, fontSize = 15.sp)
Spacer(modifier = Modifier.weight(0.1f))
Icon(Icons.Filled.ArrowForward, contentDescription = "Arrow Forward")
}
}
}
}

View File

@ -0,0 +1,31 @@
package com.example.mpdriver.recievers
import android.content.BroadcastReceiver
import android.content.Context
import android.content.Intent
import kotlin.random.Random
class TimeTickReciever: BroadcastReceiver() {
override fun onReceive(context: Context?, intent: Intent?) {
if (intent?.action == Intent.ACTION_TIME_TICK) {
handlers.forEach {
it.value()
}
}
}
companion object {
var handlers = mutableMapOf<Int, () -> Unit>()
fun registerHandler(cb: () -> Unit): Int {
handlers[cb.hashCode()] = cb
return cb.hashCode()
}
fun unregisterHandler(hashCode: Int) {
handlers.remove(hashCode)
}
}
}

View File

@ -0,0 +1,117 @@
package com.example.mpdriver.screens
import android.os.Build
import androidx.annotation.RequiresApi
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.padding
import androidx.compose.material3.CircularProgressIndicator
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.unit.dp
import androidx.navigation.NavHostController
import com.example.mpdriver.api.TaskApi
import com.example.mpdriver.api.TaskResponse
import com.example.mpdriver.components.Layout
import com.example.mpdriver.components.feed.ActiveTask
import com.example.mpdriver.components.feed.FeedTaskDataCard
import kotlinx.datetime.LocalDateTime
import kotlinx.datetime.format.byUnicodePattern
@RequiresApi(Build.VERSION_CODES.O)
@Composable
fun Feed(modifier: Modifier = Modifier, hostController: NavHostController) {
// Fetch active task
var isLoading by remember {
mutableStateOf(true)
}
val context = LocalContext.current
var activeTask by remember {
mutableStateOf<TaskResponse?>(null)
}
var plannedTasks by remember {
mutableStateOf<List<TaskResponse>>(emptyList())
}
var completedTasks by remember {
mutableStateOf<List<TaskResponse>>(emptyList())
}
val taskApi = TaskApi(context)
taskApi.getActiveTask { task ->
isLoading = false
task.id?.let {
activeTask = task
}
}
taskApi.getPlannedTasks { tasks ->
plannedTasks = tasks
}
val dateFormat = LocalDateTime.Format {
byUnicodePattern("dd.MM.yyyy")
}
val dataList = listOf(
mapOf(
"title" to "Запланированные задачи",
"count" to plannedTasks.count(),
"date" to when (plannedTasks.count()) {
0 -> "-"
else -> dateFormat.format(LocalDateTime.parse(plannedTasks[0].startPln!!))
},
"buttonLabel" to "Смотреть запланированные задачи",
"dateDescription" to "Ближайшая",
),
mapOf(
"title" to "Завершенные задачи",
"count" to completedTasks.count(),
"date" to when (completedTasks.count()) {
0 -> "-"
else -> dateFormat.format(LocalDateTime.parse(completedTasks[0].startPln!!))
},
"buttonLabel" to "Смотреть завершенные задачи",
"dateDescription" to "Последняя",
),
)
if(isLoading) {
Column (Modifier.fillMaxWidth().padding(vertical = 60.dp), horizontalAlignment = Alignment.CenterHorizontally) {
CircularProgressIndicator(color = Color(0xFFE5332A))
}
return
}
Layout(dataList = dataList, header = {
Column {
ActiveTask(activeTask = activeTask, hostController = hostController)
Spacer(modifier = Modifier.height(20.dp))
}
}) {
FeedTaskDataCard(
title = it["title"].toString(),
count = it["count"].toString().toInt(),
dateDescription = it["dateDescription"].toString(),
buttonLabel = it["buttonLabel"].toString(),
hostController = hostController, link = "feed/planned-tasks",
date = it["date"].toString()
)
}
}

View File

@ -0,0 +1,55 @@
package com.example.mpdriver.screens
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.runtime.Composable
import androidx.compose.runtime.DisposableEffect
import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.platform.LocalLifecycleOwner
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.viewinterop.AndroidView
import androidx.lifecycle.Lifecycle
import androidx.lifecycle.LifecycleEventObserver
import androidx.lifecycle.LifecycleOwner
import com.example.mpdriver.components.ComposableLifecycle
import com.yandex.mapkit.MapKitFactory
import com.yandex.mapkit.geometry.Point
import com.yandex.mapkit.map.CameraPosition
import com.yandex.mapkit.mapview.MapView as YaMapView
@Composable
fun MapScreen() {
var map: YaMapView = YaMapView(LocalContext.current)
val ctx = LocalContext.current
ComposableLifecycle { _, event ->
when(event) {
Lifecycle.Event.ON_START -> {
MapKitFactory.getInstance().onStart()
println("MAP STARTED")
map.onStart()
}
Lifecycle.Event.ON_STOP -> {
MapKitFactory.getInstance().onStop()
println("MAP STOPPED")
map.onStop()
}
Lifecycle.Event.ON_CREATE -> {
MapKitFactory.initialize(ctx)
println("MAP CREATED")
}
else -> {}
}
}
AndroidView(
modifier = Modifier.fillMaxWidth(),
factory = { _ ->
map.map.move(CameraPosition(Point(55.777586, 37.737731), 18.0f, 0.0f, 0.0f))
return@AndroidView map
}
)
}

View File

@ -0,0 +1,132 @@
package com.example.mpdriver.screens
import androidx.compose.foundation.border
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.width
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.foundation.text.BasicTextField
import androidx.compose.foundation.text.KeyboardOptions
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.text.input.KeyboardType
import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import androidx.navigation.NavHostController
import com.example.mpdriver.api.Auth
import com.example.mpdriver.storage.Database
import kotlinx.coroutines.MainScope
import kotlinx.coroutines.launch
@Composable
fun PhoneCodeInputScreen(navHostController: NavHostController) {
val context = LocalContext.current
var errorText by remember {
mutableStateOf("")
}
var code by remember {
mutableStateOf("")
}
var isSuccess by remember {
mutableStateOf(false)
}
Column(
Modifier
.fillMaxSize()
.padding(horizontal = 16.dp), verticalArrangement = Arrangement.Center
) {
Text(
modifier = Modifier.fillMaxWidth(),
text = "JDE Перевозчик",
fontSize = 30.sp,
fontWeight = FontWeight.Bold,
textAlign = TextAlign.Center
)
Spacer(modifier = Modifier.height(15.dp))
Text(
modifier = Modifier.fillMaxWidth(),
text = "Введите код из СМС",
fontSize = 16.sp,
fontWeight = FontWeight.Normal,
textAlign = TextAlign.Center,
color = Color.Gray
)
Spacer(modifier = Modifier.height(15.dp))
BasicTextField(
value = code,
onValueChange = {
if (it.length > 4) {
code = it.slice(0..3)
return@BasicTextField
}
code = it
if (code.length == 4) {
Auth(context).getToken(phone = Database.phoneNumber!!, code = code) {
MainScope().launch {
it.accessToken?.let {
isSuccess = true
errorText = ""
navHostController.navigate("home")
return@launch
}
errorText = "Неверный OTP код."
}
}
}
},
keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Number),
decorationBox = {
Row(Modifier.fillMaxWidth(), horizontalArrangement = Arrangement.Center) {
repeat(4) { index ->
val isFocused = code.length == index
val char = when {
index >= code.length -> ""
else -> code[index].toString()
}
Text(
modifier = Modifier
.padding(horizontal = 10.dp)
.width(40.dp)
.border(
if (isFocused) 3.dp else 1.dp,
color = when {
isSuccess -> Color(0xFF45900B)
errorText != "" -> Color.Red
else -> Color.Gray
},
RoundedCornerShape(10.dp)
)
.padding(10.dp),
text = char,
textAlign = TextAlign.Center,
fontSize = 16.sp,
fontWeight = FontWeight.Bold
)
}
}
})
Spacer(modifier = Modifier.padding(bottom = 10.dp))
Text(text = errorText, color = Color(0xFFE5332A), fontWeight = FontWeight.Bold)
}
}

View File

@ -0,0 +1,161 @@
package com.example.mpdriver.screens
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.text.KeyboardActions
import androidx.compose.foundation.text.KeyboardOptions
import androidx.compose.material3.Text
import androidx.compose.material3.TextField
import androidx.compose.material3.TextFieldDefaults
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.text.AnnotatedString
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.text.input.ImeAction
import androidx.compose.ui.text.input.KeyboardType
import androidx.compose.ui.text.input.OffsetMapping
import androidx.compose.ui.text.input.TransformedText
import androidx.compose.ui.text.input.VisualTransformation
import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import androidx.navigation.NavHostController
import com.example.mpdriver.NotificationService
import com.example.mpdriver.api.Auth
import kotlinx.coroutines.MainScope
import kotlinx.coroutines.launch
@Composable
fun PhoneInputScreen(navHostController: NavHostController) {
val context = LocalContext.current
var errorText by remember {
mutableStateOf("")
}
var phone by remember {
mutableStateOf("")
}
Column(
Modifier
.fillMaxSize()
.padding(horizontal = 16.dp), verticalArrangement = Arrangement.Center
) {
Text(
modifier = Modifier.fillMaxWidth(),
text = "JDE Перевозчик",
fontSize = 30.sp,
fontWeight = FontWeight.Bold,
textAlign = TextAlign.Center
)
Spacer(modifier = Modifier.height(15.dp))
Text(
modifier = Modifier.fillMaxWidth(),
text = "Введите номер телефона",
fontSize = 16.sp,
fontWeight = FontWeight.Normal,
textAlign = TextAlign.Center,
color = Color.Gray
)
Spacer(modifier = Modifier.height(15.dp))
TextField(
isError = errorText != "",
modifier = Modifier.fillMaxWidth(),
value = phone, onValueChange = { phone = it.filter { it.isDigit() } },
placeholder = { Text(text = "+7 (999) 999-99-99") },
colors = TextFieldDefaults.colors(
unfocusedContainerColor = Color(0xFFF2F2F2),
focusedContainerColor = Color(0xFFE2E2E2),
focusedIndicatorColor = Color(0xFFE5332A),
errorContainerColor = Color(0xFFE2E2E2),
errorTextColor = Color(0xFFE5332A)
),
visualTransformation = VisualTransformation { text ->
TransformedText(
AnnotatedString(
phoneChecking(text.text)
), object : OffsetMapping {
override fun originalToTransformed(offset: Int): Int {
when (offset) {
1 -> return offset + 1
in 2..4 -> return offset + 3
in 5..7 -> return offset + 5
in 8..9 -> return offset + 6
in 10..11 -> return offset + 7
else -> return offset
}
}
override fun transformedToOriginal(offset: Int): Int {
return offset
}
}
)
},
keyboardOptions = KeyboardOptions(
keyboardType = KeyboardType.Phone,
autoCorrect = false,
imeAction = ImeAction.Go
),
keyboardActions = KeyboardActions(onGo = {
Auth(context).getPhoneCode(phone.filter { it.isDigit() }) {
it.code?.let {
NotificationService(context).showNotificationAuthCode(it.toString())
MainScope().launch {
navHostController.navigate("auth/code")
}
}
it.error?.let { error ->
errorText = it.langs!!.ru!!
}
}
})
)
Text(text = errorText, color = Color(0xFFE5332A), fontWeight = FontWeight.Bold)
}
}
fun phoneChecking(text: String): String {
val digitText = text.filter { char -> char.isDigit() }
when (digitText.length) {
1 -> return "+7"
in 2..4 -> return "+7 (${digitText.slice(1..<digitText.length)}"
in 5..7 -> return "+7 (${digitText.slice(1..3)}) ${digitText.slice(4..<digitText.length)}"
in 8..9 -> return "+7 (${digitText.slice(1..3)}) ${digitText.slice(4..6)}-${
digitText.slice(
7..<digitText.length
)
}"
in 10..11 -> return "+7 (${digitText.slice(1..3)}) ${digitText.slice(4..6)}-${
digitText.slice(
7..8
)
}-${digitText.slice(9..<digitText.length)}"
}
return ""
}

View File

@ -0,0 +1,120 @@
package com.example.mpdriver.screens
import androidx.compose.animation.AnimatedVisibility
import androidx.compose.animation.fadeIn
import androidx.compose.animation.fadeOut
import androidx.compose.animation.slideInVertically
import androidx.compose.animation.slideOutVertically
import androidx.compose.foundation.gestures.Orientation
import androidx.compose.foundation.gestures.rememberScrollableState
import androidx.compose.foundation.gestures.scrollable
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.heightIn
import androidx.compose.foundation.layout.offset
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.width
import androidx.compose.foundation.lazy.rememberLazyListState
import androidx.compose.foundation.rememberScrollState
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.foundation.verticalScroll
import androidx.compose.material3.CircularProgressIndicator
import androidx.compose.material3.ExtendedFloatingActionButton
import androidx.compose.material3.FloatingActionButton
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.derivedStateOf
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.layout.boundsInParent
import androidx.compose.ui.layout.boundsInRoot
import androidx.compose.ui.layout.onGloballyPositioned
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import androidx.lifecycle.Lifecycle
import com.example.mpdriver.api.Subtasks
import com.example.mpdriver.api.TaskApi
import com.example.mpdriver.components.ComposableLifecycle
import com.example.mpdriver.components.HeaderTabs
import com.example.mpdriver.components.HeaderTabsData
import com.example.mpdriver.components.Layout
import com.example.mpdriver.components.Subtask
@Preview(showBackground = true)
@Composable
fun SubtaskScreen(taskId: Long = 0) {
var api = TaskApi(LocalContext.current)
var isLoading by remember {
mutableStateOf(true)
}
var floatingActionShowOffset by remember {
mutableStateOf(0f)
}
var datalist by remember {
mutableStateOf<List<Subtasks>>(mutableListOf())
}
var activeTab by remember {
mutableStateOf(0)
}
val listState = rememberLazyListState()
var offset = listState.firstVisibleItemScrollOffset + listState.firstVisibleItemIndex
val tabsData = listOf<HeaderTabsData>(HeaderTabsData(0, "Подзадачи"), HeaderTabsData(1, "События"))
ComposableLifecycle { _, event ->
when (event) {
Lifecycle.Event.ON_CREATE -> {
api.getSubtasks(taskId) {
datalist = it
isLoading = false
}
}
else -> {}
}
}
if(isLoading) {
Column (
Modifier
.fillMaxWidth()
.padding(vertical = 60.dp), horizontalAlignment = Alignment.CenterHorizontally) {
CircularProgressIndicator(color = Color(0xFFE5332A))
}
return
}
Layout(state = listState, dataList = datalist, header = {
HeaderTabs(modifier = Modifier.onGloballyPositioned { lc ->
val cords = lc.boundsInParent()
floatingActionShowOffset = cords.bottom
}, tabsData = tabsData, activeTab = activeTab) {
activeTab = it
}
}) {
Subtask(subtask = it)
}
AnimatedVisibility(visible = offset + 200 > floatingActionShowOffset + 100, enter = slideInVertically() + fadeIn(), exit = slideOutVertically() + fadeOut()) {
ExtendedFloatingActionButton(onClick = { /*TODO*/ },
shape = RoundedCornerShape(10.dp), containerColor = Color.White, contentColor = Color.Black) {
Row(Modifier.fillMaxWidth()) {
Text(text = "Скрыть завершенные задачи")
}
}
}
}

View File

@ -0,0 +1,109 @@
package com.example.mpdriver.screens
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.width
import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.lazy.items
import androidx.compose.foundation.lazy.rememberLazyListState
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.material3.Button
import androidx.compose.material3.ButtonDefaults
import androidx.compose.material3.CircularProgressIndicator
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableIntStateOf
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import androidx.navigation.NavHostController
import com.example.mpdriver.api.TaskApi
import com.example.mpdriver.api.TaskResponse
import com.example.mpdriver.components.ActiveButton
import com.example.mpdriver.components.HeaderTabs
import com.example.mpdriver.components.HeaderTabsData
import com.example.mpdriver.components.Layout
import com.example.mpdriver.components.StaleButton
import com.example.mpdriver.components.Task
import com.example.mpdriver.storage.Database
import kotlinx.coroutines.MainScope
import kotlinx.coroutines.launch
@Composable
fun TasksList(modifier: Modifier = Modifier, hostController: NavHostController) {
val api = TaskApi(LocalContext.current)
var isLoading by remember {
mutableStateOf(true)
}
var itemsList by remember {
mutableStateOf<List<TaskResponse>>(emptyList())
}
api.getPlannedTasks {
itemsList = it
isLoading = false
}
var activeTab by remember {
mutableIntStateOf(0)
}
if(isLoading) {
Column (Modifier.fillMaxWidth().padding(vertical = 60.dp), horizontalAlignment = Alignment.CenterHorizontally) {
CircularProgressIndicator(color = Color(0xFFE5332A))
}
return
}
Layout(dataList = itemsList, header = {
HeaderTabs(
tabsData = listOf(
HeaderTabsData(0, "Запланированные"),
HeaderTabsData(1, "Завершенные")
), activeTab = activeTab
) {
activeTab = it
}
}) {
Task(Modifier.padding(bottom = 10.dp), taskResponse = it) {
when (activeTab) {
0 -> Button(
onClick = {
api.setTaskStatusInProgress(it.id!!) {
MainScope().launch {
hostController.navigate("feed")
}
}
},
colors = ButtonDefaults.buttonColors(
contentColor = Color.White,
containerColor = Color.Black,
disabledContentColor = Color.White,
disabledContainerColor = Color.Gray
),
shape = RoundedCornerShape(10.dp),
enabled = if (Database.tasks.filter { it.status == "InProgress" }.count() >= 1) false else true,
modifier = Modifier.fillMaxWidth()
) {
Text(text = "Приступить к выполнению")
}
}
}
}
}

View File

@ -0,0 +1,55 @@
package com.example.mpdriver.storage
import com.example.mpdriver.api.TaskResponse
import com.google.gson.Gson
import com.google.gson.reflect.TypeToken
import com.tencent.mmkv.MMKV
import java.lang.reflect.Type
object Database {
val kv = MMKV.defaultMMKV()
var tasks: List<TaskResponse>
get() {
val data = kv.decodeString("tasks")
data?.let { json ->
val type: Type = object : TypeToken<List<TaskResponse>>() {}.type
return Gson().fromJson(json, type)
}
return emptyList()
}
set(value) {
val data = Gson().toJson(value)
kv.encode("tasks", data)
}
var planned_tasks: List<TaskResponse>
get() {
val data = kv.decodeString("planned_tasks")
data?.let { json ->
val type: Type = object : TypeToken<List<TaskResponse>>() {}.type
return Gson().fromJson(json, type)
}
return emptyList()
}
set(value) {
val data = Gson().toJson(value)
println(value)
println(data)
kv.encode("planned_tasks", data)
}
var access_token: String?
get() {
return kv.decodeString("access_token")
}
set(value) {
kv.encode("access_token", value)
}
var phoneNumber: String?
get() = kv.decodeString("phone_number")
set(value) {
kv.encode("phone_number", value)
}
}

View File

@ -0,0 +1,11 @@
package com.example.mpdriver.ui.theme
import androidx.compose.ui.graphics.Color
val Purple80 = Color(0xFFD0BCFF)
val PurpleGrey80 = Color(0xFFCCC2DC)
val Pink80 = Color(0xFFEFB8C8)
val Purple40 = Color(0xFF6650a4)
val PurpleGrey40 = Color(0xFF625b71)
val Pink40 = Color(0xFF7D5260)

View File

@ -0,0 +1,58 @@
package com.example.mpdriver.ui.theme
import android.app.Activity
import android.os.Build
import androidx.compose.foundation.isSystemInDarkTheme
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.darkColorScheme
import androidx.compose.material3.dynamicDarkColorScheme
import androidx.compose.material3.dynamicLightColorScheme
import androidx.compose.material3.lightColorScheme
import androidx.compose.runtime.Composable
import androidx.compose.ui.platform.LocalContext
private val DarkColorScheme = darkColorScheme(
primary = Purple80,
secondary = PurpleGrey80,
tertiary = Pink80
)
private val LightColorScheme = lightColorScheme(
primary = Purple40,
secondary = PurpleGrey40,
tertiary = Pink40
/* Other default colors to override
background = Color(0xFFFFFBFE),
surface = Color(0xFFFFFBFE),
onPrimary = Color.White,
onSecondary = Color.White,
onTertiary = Color.White,
onBackground = Color(0xFF1C1B1F),
onSurface = Color(0xFF1C1B1F),
*/
)
@Composable
fun MPDriverTheme(
darkTheme: Boolean = isSystemInDarkTheme(),
// Dynamic color is available on Android 12+
dynamicColor: Boolean = true,
content: @Composable () -> Unit
) {
val colorScheme = when {
dynamicColor && Build.VERSION.SDK_INT >= Build.VERSION_CODES.S -> {
val context = LocalContext.current
if (darkTheme) dynamicDarkColorScheme(context) else dynamicLightColorScheme(context)
}
darkTheme -> DarkColorScheme
else -> LightColorScheme
}
MaterialTheme(
colorScheme = colorScheme,
typography = Typography,
content = content
)
}

View File

@ -0,0 +1,34 @@
package com.example.mpdriver.ui.theme
import androidx.compose.material3.Typography
import androidx.compose.ui.text.TextStyle
import androidx.compose.ui.text.font.FontFamily
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.unit.sp
// Set of Material typography styles to start with
val Typography = Typography(
bodyLarge = TextStyle(
fontFamily = FontFamily.Default,
fontWeight = FontWeight.Normal,
fontSize = 16.sp,
lineHeight = 24.sp,
letterSpacing = 0.5.sp
)
/* Other default text styles to override
titleLarge = TextStyle(
fontFamily = FontFamily.Default,
fontWeight = FontWeight.Normal,
fontSize = 22.sp,
lineHeight = 28.sp,
letterSpacing = 0.sp
),
labelSmall = TextStyle(
fontFamily = FontFamily.Default,
fontWeight = FontWeight.Medium,
fontSize = 11.sp,
lineHeight = 16.sp,
letterSpacing = 0.5.sp
)
*/
)

View File

@ -0,0 +1,10 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:pathData="M12.914,1.972C12.914,1.435 12.505,1 12,1C11.495,1 11.086,1.435 11.086,1.972V3.915C11.086,3.923 11.086,3.931 11.086,3.939C7.874,4.412 5.4,7.342 5.4,10.886V14.934C5.4,15.373 5.213,15.787 4.892,16.062C4.325,16.506 3.661,17.042 3.527,17.184C3.19,17.543 3,18.029 3,18.537C3,19.044 3.19,19.531 3.527,19.889C3.865,20.248 4.322,20.45 4.8,20.45H9.06C9.338,21.904 10.55,23 12,23C13.45,23 14.662,21.904 14.94,20.45H19.2C19.678,20.45 20.135,20.248 20.473,19.889C20.81,19.531 21,19.044 21,18.537C21,18.029 20.81,17.543 20.473,17.184C20.339,17.042 19.67,16.502 19.112,16.063C18.792,15.793 18.602,15.375 18.602,14.933V14.932C18.6,13.97 18.6,12.462 18.6,10.889V10.886C18.6,7.342 16.126,4.412 12.914,3.939C12.914,3.931 12.914,3.923 12.914,3.915V1.972ZM12,21.725C12.783,21.725 13.45,21.192 13.697,20.45H10.303C10.55,21.192 11.217,21.725 12,21.725ZM12,5.147C14.983,5.147 17.4,7.716 17.4,10.886V10.889C17.4,12.463 17.4,13.973 17.402,14.935C17.402,15.768 17.763,16.557 18.38,17.074L18.395,17.085C18.897,17.48 19.504,17.958 19.624,18.086C19.737,18.205 19.8,18.368 19.8,18.537C19.8,18.706 19.737,18.868 19.624,18.988C19.512,19.108 19.359,19.174 19.2,19.174H4.8C4.641,19.174 4.488,19.108 4.376,18.988C4.263,18.868 4.2,18.706 4.2,18.537C4.2,18.368 4.263,18.205 4.376,18.086C4.496,17.958 5.102,17.48 5.605,17.088C5.611,17.084 5.616,17.08 5.621,17.076C6.239,16.559 6.6,15.77 6.6,14.934V10.886C6.6,7.716 9.017,5.147 12,5.147Z"
android:fillColor="#000000"
android:fillType="evenOdd"/>
</vector>

View File

@ -0,0 +1,10 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:pathData="M12.914,1.972C12.914,1.435 12.505,1 12,1C11.495,1 11.086,1.435 11.086,1.972V3.915C11.086,3.923 11.086,3.931 11.086,3.939C7.874,4.412 5.4,7.342 5.4,10.886V14.934C5.4,15.373 5.213,15.787 4.892,16.062C4.325,16.506 3.661,17.042 3.527,17.184C3.19,17.543 3,18.029 3,18.537C3,19.044 3.19,19.531 3.527,19.889C3.865,20.248 4.322,20.45 4.8,20.45H9.06C9.338,21.904 10.55,23 12,23C13.45,23 14.662,21.904 14.94,20.45H19.2C19.678,20.45 20.135,20.248 20.473,19.889C20.81,19.531 21,19.044 21,18.537C21,18.029 20.81,17.543 20.473,17.184C20.339,17.042 19.67,16.502 19.112,16.063C18.792,15.793 18.602,15.375 18.602,14.933V14.932C18.6,13.97 18.6,12.462 18.6,10.889V10.886C18.6,7.342 16.126,4.412 12.914,3.939C12.914,3.931 12.914,3.923 12.914,3.915V1.972ZM12,21.725C12.783,21.725 13.45,21.192 13.697,20.45H10.303C10.55,21.192 11.217,21.725 12,21.725ZM12,5.147C14.983,5.147 17.4,7.716 17.4,10.886V10.889C17.4,12.463 17.4,13.973 17.402,14.935C17.402,15.768 17.763,16.557 18.38,17.074L18.395,17.085C18.897,17.48 19.504,17.958 19.624,18.086C19.737,18.205 19.8,18.368 19.8,18.537C19.8,18.706 19.737,18.868 19.624,18.988C19.512,19.108 19.359,19.174 19.2,19.174H4.8C4.641,19.174 4.488,19.108 4.376,18.988C4.263,18.868 4.2,18.706 4.2,18.537C4.2,18.368 4.263,18.205 4.376,18.086C4.496,17.958 5.102,17.48 5.605,17.088C5.611,17.084 5.616,17.08 5.621,17.076C6.239,16.559 6.6,15.77 6.6,14.934V10.886C6.6,7.716 9.017,5.147 12,5.147Z"
android:fillColor="#A8A8A8"
android:fillType="evenOdd"/>
</vector>

View File

@ -0,0 +1,33 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:pathData="M7.625,13.844H6.375C6.051,13.844 5.789,14.12 5.789,14.461C5.789,14.802 6.051,15.078 6.375,15.078H7.625C7.949,15.078 8.211,14.802 8.211,14.461C8.211,14.12 7.949,13.844 7.625,13.844Z"
android:fillColor="#000000"/>
<path
android:pathData="M7.625,16.476H6.375C6.051,16.476 5.789,16.752 5.789,17.093C5.789,17.434 6.051,17.71 6.375,17.71H7.625C7.949,17.71 8.211,17.434 8.211,17.093C8.211,16.752 7.949,16.476 7.625,16.476Z"
android:fillColor="#000000"/>
<path
android:pathData="M12.625,11.212H11.375C11.051,11.212 10.789,11.488 10.789,11.829C10.789,12.17 11.051,12.446 11.375,12.446H12.625C12.949,12.446 13.211,12.17 13.211,11.829C13.211,11.488 12.949,11.212 12.625,11.212Z"
android:fillColor="#000000"/>
<path
android:pathData="M12.625,13.844H11.375C11.051,13.844 10.789,14.12 10.789,14.461C10.789,14.802 11.051,15.078 11.375,15.078H12.625C12.949,15.078 13.211,14.802 13.211,14.461C13.211,14.12 12.949,13.844 12.625,13.844Z"
android:fillColor="#000000"/>
<path
android:pathData="M12.625,16.476H11.375C11.051,16.476 10.789,16.752 10.789,17.093C10.789,17.434 11.051,17.71 11.375,17.71H12.625C12.949,17.71 13.211,17.434 13.211,17.093C13.211,16.752 12.949,16.476 12.625,16.476Z"
android:fillColor="#000000"/>
<path
android:pathData="M17.625,11.212H16.375C16.051,11.212 15.789,11.488 15.789,11.829C15.789,12.17 16.051,12.446 16.375,12.446H17.625C17.949,12.446 18.211,12.17 18.211,11.829C18.211,11.488 17.949,11.212 17.625,11.212Z"
android:fillColor="#000000"/>
<path
android:pathData="M17.625,13.844H16.375C16.051,13.844 15.789,14.12 15.789,14.461C15.789,14.802 16.051,15.078 16.375,15.078H17.625C17.949,15.078 18.211,14.802 18.211,14.461C18.211,14.12 17.949,13.844 17.625,13.844Z"
android:fillColor="#000000"/>
<path
android:pathData="M17.625,16.476H16.375C16.051,16.476 15.789,16.752 15.789,17.093C15.789,17.434 16.051,17.71 16.375,17.71H17.625C17.949,17.71 18.211,17.434 18.211,17.093C18.211,16.752 17.949,16.476 17.625,16.476Z"
android:fillColor="#000000"/>
<path
android:pathData="M20.242,3.645H18.836V2.617C18.836,2.276 18.574,2 18.25,2C17.926,2 17.664,2.276 17.664,2.617V3.645H12.586H11.414H6.336V2.617C6.336,2.276 6.074,2 5.75,2C5.426,2 5.164,2.276 5.164,2.617V3.645H3.758C2.789,3.645 2,4.475 2,5.496V19.149C2,20.17 2.789,21 3.758,21H20.242C21.211,21 22,20.17 22,19.149C22,18.751 22,5.842 22,5.496C22,4.475 21.211,3.645 20.242,3.645ZM3.172,5.496C3.172,5.156 3.435,4.879 3.758,4.879H5.164V5.907C5.164,6.248 5.426,6.524 5.75,6.524C6.074,6.524 6.336,6.248 6.336,5.907V4.879H11.414H12.586H17.664V5.907C17.664,6.248 17.926,6.524 18.25,6.524C18.574,6.524 18.836,6.248 18.836,5.907V4.879H20.242C20.565,4.879 20.828,5.156 20.828,5.496V7.922H3.172V5.496ZM20.242,19.766H3.758C3.435,19.766 3.172,19.49 3.172,19.149V9.156H20.828V19.149C20.828,19.49 20.565,19.766 20.242,19.766Z"
android:fillColor="#000000"/>
</vector>

View File

@ -0,0 +1,33 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:pathData="M7.625,13.844H6.375C6.051,13.844 5.789,14.12 5.789,14.461C5.789,14.802 6.051,15.078 6.375,15.078H7.625C7.949,15.078 8.211,14.802 8.211,14.461C8.211,14.12 7.949,13.844 7.625,13.844Z"
android:fillColor="#A8A8A8"/>
<path
android:pathData="M7.625,16.476H6.375C6.051,16.476 5.789,16.752 5.789,17.093C5.789,17.434 6.051,17.71 6.375,17.71H7.625C7.949,17.71 8.211,17.434 8.211,17.093C8.211,16.752 7.949,16.476 7.625,16.476Z"
android:fillColor="#A8A8A8"/>
<path
android:pathData="M12.625,11.212H11.375C11.051,11.212 10.789,11.488 10.789,11.829C10.789,12.17 11.051,12.446 11.375,12.446H12.625C12.949,12.446 13.211,12.17 13.211,11.829C13.211,11.488 12.949,11.212 12.625,11.212Z"
android:fillColor="#A8A8A8"/>
<path
android:pathData="M12.625,13.844H11.375C11.051,13.844 10.789,14.12 10.789,14.461C10.789,14.802 11.051,15.078 11.375,15.078H12.625C12.949,15.078 13.211,14.802 13.211,14.461C13.211,14.12 12.949,13.844 12.625,13.844Z"
android:fillColor="#A8A8A8"/>
<path
android:pathData="M12.625,16.476H11.375C11.051,16.476 10.789,16.752 10.789,17.093C10.789,17.434 11.051,17.71 11.375,17.71H12.625C12.949,17.71 13.211,17.434 13.211,17.093C13.211,16.752 12.949,16.476 12.625,16.476Z"
android:fillColor="#A8A8A8"/>
<path
android:pathData="M17.625,11.212H16.375C16.051,11.212 15.789,11.488 15.789,11.829C15.789,12.17 16.051,12.446 16.375,12.446H17.625C17.949,12.446 18.211,12.17 18.211,11.829C18.211,11.488 17.949,11.212 17.625,11.212Z"
android:fillColor="#A8A8A8"/>
<path
android:pathData="M17.625,13.844H16.375C16.051,13.844 15.789,14.12 15.789,14.461C15.789,14.802 16.051,15.078 16.375,15.078H17.625C17.949,15.078 18.211,14.802 18.211,14.461C18.211,14.12 17.949,13.844 17.625,13.844Z"
android:fillColor="#A8A8A8"/>
<path
android:pathData="M17.625,16.476H16.375C16.051,16.476 15.789,16.752 15.789,17.093C15.789,17.434 16.051,17.71 16.375,17.71H17.625C17.949,17.71 18.211,17.434 18.211,17.093C18.211,16.752 17.949,16.476 17.625,16.476Z"
android:fillColor="#A8A8A8"/>
<path
android:pathData="M20.242,3.645H18.836V2.617C18.836,2.276 18.574,2 18.25,2C17.926,2 17.664,2.276 17.664,2.617V3.645H12.586H11.414H6.336V2.617C6.336,2.276 6.074,2 5.75,2C5.426,2 5.164,2.276 5.164,2.617V3.645H3.758C2.789,3.645 2,4.475 2,5.496V19.149C2,20.17 2.789,21 3.758,21H20.242C21.211,21 22,20.17 22,19.149C22,18.751 22,5.842 22,5.496C22,4.475 21.211,3.645 20.242,3.645ZM3.172,5.496C3.172,5.156 3.435,4.879 3.758,4.879H5.164V5.907C5.164,6.248 5.426,6.524 5.75,6.524C6.074,6.524 6.336,6.248 6.336,5.907V4.879H11.414H12.586H17.664V5.907C17.664,6.248 17.926,6.524 18.25,6.524C18.574,6.524 18.836,6.248 18.836,5.907V4.879H20.242C20.565,4.879 20.828,5.156 20.828,5.496V7.922H3.172V5.496ZM20.242,19.766H3.758C3.435,19.766 3.172,19.49 3.172,19.149V9.156H20.828V19.149C20.828,19.49 20.565,19.766 20.242,19.766Z"
android:fillColor="#A8A8A8"/>
</vector>

View File

@ -0,0 +1,13 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:pathData="M22,11.972C22.004,13.365 21.678,14.74 21.05,15.983C20.305,17.473 19.16,18.727 17.743,19.603C16.326,20.479 14.694,20.944 13.028,20.944C11.704,20.948 10.397,20.654 9.204,20.086C9.083,20.029 8.946,20.018 8.819,20.06L3.949,21.684C3.558,21.814 3.186,21.442 3.316,21.051L4.94,16.181C4.982,16.055 4.971,15.917 4.914,15.796C4.346,14.603 4.052,13.296 4.056,11.972C4.056,10.306 4.521,8.673 5.397,7.257C6.273,5.84 7.526,4.695 9.017,3.95C10.26,3.322 11.635,2.996 13.028,3H13.556C15.756,3.121 17.834,4.05 19.392,5.608C20.95,7.166 21.879,9.244 22,11.444V11.972Z"
android:strokeLineJoin="round"
android:strokeWidth="1.2"
android:fillColor="#00000000"
android:strokeColor="#000000"
android:strokeLineCap="round"/>
</vector>

View File

@ -0,0 +1,13 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:pathData="M22,11.972C22.004,13.365 21.678,14.74 21.05,15.983C20.305,17.473 19.16,18.727 17.743,19.603C16.326,20.479 14.694,20.944 13.028,20.944C11.704,20.948 10.397,20.654 9.204,20.086C9.083,20.029 8.946,20.018 8.819,20.06L3.949,21.684C3.558,21.814 3.186,21.442 3.316,21.051L4.94,16.181C4.982,16.055 4.971,15.917 4.914,15.796C4.346,14.603 4.052,13.296 4.056,11.972C4.056,10.306 4.521,8.673 5.397,7.257C6.273,5.84 7.526,4.695 9.017,3.95C10.26,3.322 11.635,2.996 13.028,3H13.556C15.756,3.121 17.834,4.05 19.392,5.608C20.95,7.166 21.879,9.244 22,11.444V11.972Z"
android:strokeLineJoin="round"
android:strokeWidth="1.2"
android:fillColor="#00000000"
android:strokeColor="#A8A8A8"
android:strokeLineCap="round"/>
</vector>

View File

@ -0,0 +1,126 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="62dp"
android:height="37dp"
android:viewportWidth="62"
android:viewportHeight="37">
<path
android:pathData="M3.139,35C3.139,35.53 6.078,36.039 11.31,36.414C16.542,36.789 23.637,37 31.036,37C38.435,37 45.53,36.789 50.762,36.414C55.994,36.039 58.933,35.53 58.933,35C58.933,34.47 55.994,33.961 50.762,33.586C45.53,33.211 38.435,33 31.036,33C23.637,33 16.542,33.211 11.31,33.586C6.078,33.961 3.139,34.47 3.139,35Z"
android:strokeAlpha="0.15"
android:fillColor="#000000"
android:fillAlpha="0.15"/>
<path
android:pathData="M19.463,25.659H1.629V18.469C1.632,16.939 2.037,15.435 2.807,14.099L7.384,6.239C7.816,5.493 8.446,4.871 9.209,4.439C9.972,4.006 10.84,3.779 11.724,3.779H19.463V25.659Z"
android:fillColor="#DCDCD9"/>
<path
android:pathData="M11.724,3.779C10.84,3.779 9.972,4.006 9.209,4.439C8.446,4.871 7.816,5.493 7.384,6.239L2.818,14.099C2.041,15.433 1.632,16.938 1.629,18.469V21.759C1.631,20.231 2.041,18.729 2.818,17.399L7.384,9.529C7.818,8.785 8.449,8.166 9.212,7.736C9.974,7.305 10.841,7.079 11.724,7.079H19.463V3.779H11.724Z"
android:fillColor="#ffffff"/>
<path
android:pathData="M19.463,25.659H1.629V18.469C1.632,16.939 2.037,15.435 2.807,14.099L7.384,6.239C7.816,5.493 8.446,4.871 9.209,4.439C9.972,4.006 10.84,3.779 11.724,3.779H19.463V25.659Z"
android:strokeLineJoin="round"
android:strokeWidth="0.5"
android:fillColor="#00000000"
android:strokeColor="#000000"
android:strokeLineCap="round"/>
<path
android:pathData="M1.074,24.999H61V30.999H1.074V24.999Z"
android:fillColor="#161616"/>
<path
android:pathData="M59.257,24.999H2.804C2.345,24.999 1.905,25.136 1.58,25.38C1.256,25.623 1.074,25.954 1.074,26.299V28.999C1.074,28.654 1.256,28.324 1.58,28.08C1.905,27.836 2.345,27.699 2.804,27.699H59.257C59.485,27.698 59.711,27.731 59.923,27.795C60.134,27.86 60.327,27.956 60.489,28.076C60.651,28.197 60.779,28.341 60.867,28.499C60.955,28.658 61,28.827 61,28.999V26.299C61,26.127 60.955,25.957 60.867,25.799C60.779,25.641 60.651,25.497 60.489,25.376C60.327,25.255 60.134,25.16 59.923,25.095C59.711,25.03 59.485,24.998 59.257,24.999Z"
android:fillColor="#494949"/>
<path
android:pathData="M1.074,24.999H61V30.999H1.074V24.999Z"
android:strokeLineJoin="round"
android:strokeWidth="0.5"
android:fillColor="#00000000"
android:strokeColor="#000000"
android:strokeLineCap="round"/>
<path
android:pathData="M21.769,1H58.9C59.457,1 59.991,1.129 60.384,1.358C60.778,1.586 60.999,1.897 60.999,2.221V25H19.67V2.221C19.67,1.897 19.891,1.586 20.285,1.358C20.678,1.129 21.212,1 21.769,1Z"
android:fillColor="#1FAEFF"/>
<path
android:pathData="M58.881,1H21.772C21.215,1 20.68,1.119 20.286,1.33C19.892,1.542 19.67,1.829 19.67,2.128V5C19.67,4.701 19.892,4.414 20.286,4.202C20.68,3.991 21.215,3.872 21.772,3.872H58.881C59.44,3.872 59.976,3.991 60.373,4.202C60.77,4.413 60.994,4.7 60.999,5V2.128C60.994,1.828 60.77,1.541 60.373,1.33C59.976,1.119 59.44,1 58.881,1Z"
android:fillColor="#9FE2FF"/>
<path
android:pathData="M21.769,1H58.9C59.457,1 59.991,1.129 60.384,1.358C60.778,1.586 60.999,1.897 60.999,2.221V25H19.67V2.221C19.67,1.897 19.891,1.586 20.285,1.358C20.678,1.129 21.212,1 21.769,1Z"
android:strokeLineJoin="round"
android:strokeWidth="0.5"
android:fillColor="#00000000"
android:strokeColor="#000000"
android:strokeLineCap="round"/>
<path
android:pathData="M5.67,30.28C5.67,30.899 5.796,31.513 6.041,32.086C6.286,32.659 6.645,33.179 7.098,33.617C7.551,34.055 8.088,34.403 8.68,34.64C9.272,34.877 9.906,35 10.546,35C11.187,35 11.821,34.877 12.413,34.64C13.004,34.403 13.542,34.055 13.995,33.617C14.448,33.179 14.807,32.659 15.052,32.086C15.297,31.513 15.423,30.899 15.423,30.28C15.423,29.66 15.297,29.046 15.052,28.473C14.807,27.901 14.448,27.38 13.995,26.942C13.542,26.504 13.004,26.156 12.413,25.919C11.821,25.682 11.187,25.56 10.546,25.56C9.906,25.56 9.272,25.682 8.68,25.919C8.088,26.156 7.551,26.504 7.098,26.942C6.645,27.38 6.286,27.901 6.041,28.473C5.796,29.046 5.67,29.66 5.67,30.28Z"
android:fillColor="#656769"/>
<path
android:pathData="M45.284,30.28C45.284,31.531 45.798,32.732 46.713,33.617C47.627,34.502 48.868,35 50.161,35C51.454,35 52.695,34.502 53.609,33.617C54.524,32.732 55.038,31.531 55.038,30.28C55.038,29.028 54.524,27.827 53.609,26.942C52.695,26.057 51.454,25.56 50.161,25.56C48.868,25.56 47.627,26.057 46.713,26.942C45.798,27.827 45.284,29.028 45.284,30.28Z"
android:fillColor="#656769"/>
<path
android:pathData="M10.546,27.429C11.671,27.43 12.762,27.806 13.633,28.495C14.505,29.183 15.104,30.142 15.33,31.209C15.47,30.524 15.452,29.818 15.276,29.142C15.101,28.465 14.772,27.835 14.315,27.296C13.858,26.757 13.282,26.322 12.631,26.024C11.979,25.726 11.267,25.571 10.546,25.571C9.826,25.571 9.114,25.726 8.462,26.024C7.81,26.322 7.235,26.757 6.778,27.296C6.32,27.835 5.992,28.465 5.816,29.142C5.641,29.818 5.622,30.524 5.763,31.209C5.989,30.142 6.588,29.183 7.459,28.495C8.331,27.806 9.421,27.43 10.546,27.429Z"
android:fillColor="#525252"/>
<path
android:pathData="M50.161,27.429C51.286,27.43 52.376,27.806 53.248,28.495C54.119,29.183 54.719,30.142 54.945,31.209C55.085,30.524 55.066,29.818 54.891,29.142C54.715,28.465 54.387,27.835 53.93,27.296C53.472,26.757 52.897,26.322 52.245,26.024C51.593,25.726 50.882,25.571 50.161,25.571C49.44,25.571 48.728,25.726 48.077,26.024C47.425,26.322 46.85,26.757 46.392,27.296C45.935,27.835 45.606,28.465 45.431,29.142C45.255,29.818 45.237,30.524 45.377,31.209C45.603,30.142 46.202,29.183 47.074,28.495C47.945,27.806 49.036,27.43 50.161,27.429Z"
android:fillColor="#525252"/>
<path
android:pathData="M5.67,30.28C5.67,30.899 5.796,31.513 6.041,32.086C6.286,32.659 6.645,33.179 7.098,33.617C7.551,34.055 8.088,34.403 8.68,34.64C9.272,34.877 9.906,35 10.546,35C11.187,35 11.821,34.877 12.413,34.64C13.004,34.403 13.542,34.055 13.995,33.617C14.448,33.179 14.807,32.659 15.052,32.086C15.297,31.513 15.423,30.899 15.423,30.28C15.423,29.66 15.297,29.046 15.052,28.473C14.807,27.901 14.448,27.38 13.995,26.942C13.542,26.504 13.004,26.156 12.413,25.919C11.821,25.682 11.187,25.56 10.546,25.56C9.906,25.56 9.272,25.682 8.68,25.919C8.088,26.156 7.551,26.504 7.098,26.942C6.645,27.38 6.286,27.901 6.041,28.473C5.796,29.046 5.67,29.66 5.67,30.28V30.28Z"
android:strokeLineJoin="round"
android:strokeWidth="0.5"
android:fillColor="#00000000"
android:strokeColor="#000000"
android:strokeLineCap="round"/>
<path
android:pathData="M45.284,30.28C45.284,31.531 45.798,32.732 46.713,33.617C47.627,34.502 48.868,35 50.161,35C51.454,35 52.695,34.502 53.609,33.617C54.524,32.732 55.038,31.531 55.038,30.28C55.038,29.028 54.524,27.827 53.609,26.942C52.695,26.057 51.454,25.56 50.161,25.56C48.868,25.56 47.627,26.057 46.713,26.942C45.798,27.827 45.284,29.028 45.284,30.28V30.28Z"
android:strokeLineJoin="round"
android:strokeWidth="0.5"
android:fillColor="#00000000"
android:strokeColor="#000000"
android:strokeLineCap="round"/>
<path
android:pathData="M1.629,18.979H19.463V25.649H1.629V18.979Z"
android:strokeLineJoin="round"
android:strokeWidth="0.5"
android:fillColor="#161616"
android:strokeColor="#000000"
android:strokeLineCap="round"/>
<path
android:pathData="M14.121,7.26H6.785L2.807,14.1C2.694,14.3 2.59,14.51 2.487,14.72H12.148C12.345,14.719 12.539,14.676 12.717,14.595C12.896,14.514 13.054,14.396 13.181,14.25L15.154,11.94C15.356,11.708 15.466,11.414 15.464,11.11V8.57C15.464,8.225 15.323,7.893 15.071,7.647C14.82,7.402 14.478,7.263 14.121,7.26Z"
android:fillColor="#8EDFF8"/>
<path
android:pathData="M14.122,7.26H10.97L6.838,14.72H12.128C12.325,14.719 12.52,14.677 12.698,14.596C12.877,14.515 13.035,14.397 13.161,14.25L15.134,11.94C15.336,11.708 15.446,11.414 15.444,11.11V8.57C15.444,8.228 15.306,7.899 15.059,7.654C14.812,7.41 14.475,7.268 14.122,7.26Z"
android:fillColor="#B4EBFF"/>
<path
android:pathData="M14.121,7.26H6.785L2.807,14.1C2.694,14.3 2.59,14.51 2.487,14.72H12.148C12.345,14.719 12.539,14.676 12.717,14.595C12.896,14.514 13.054,14.396 13.181,14.25L15.154,11.94C15.356,11.708 15.466,11.414 15.464,11.11V8.57C15.464,8.225 15.323,7.893 15.071,7.647C14.82,7.402 14.478,7.263 14.121,7.26V7.26Z"
android:strokeLineJoin="round"
android:strokeWidth="0.5"
android:fillColor="#00000000"
android:strokeColor="#000000"
android:strokeLineCap="round"/>
<path
android:pathData="M3.986,20.137C3.986,19.899 3.937,19.663 3.843,19.442C3.748,19.222 3.609,19.022 3.435,18.854C3.26,18.686 3.052,18.553 2.824,18.462C2.596,18.372 2.352,18.326 2.106,18.327H1V21.997H2.106C2.356,21.999 2.605,21.951 2.837,21.858C3.068,21.764 3.278,21.627 3.453,21.453C3.629,21.28 3.766,21.074 3.858,20.848C3.949,20.622 3.993,20.38 3.986,20.137Z"
android:strokeLineJoin="round"
android:strokeWidth="0.5"
android:fillColor="#FFD66B"
android:strokeColor="#000000"
android:strokeLineCap="round"/>
<path
android:pathData="M8.947,30.279C8.947,30.483 8.988,30.684 9.068,30.872C9.149,31.06 9.267,31.231 9.416,31.375C9.564,31.519 9.741,31.633 9.935,31.711C10.13,31.789 10.338,31.829 10.548,31.829C10.758,31.829 10.967,31.789 11.161,31.711C11.355,31.633 11.532,31.519 11.68,31.375C11.829,31.231 11.947,31.06 12.028,30.872C12.108,30.684 12.149,30.483 12.149,30.279C12.149,30.076 12.108,29.874 12.028,29.686C11.947,29.498 11.829,29.327 11.68,29.183C11.532,29.039 11.355,28.925 11.161,28.847C10.967,28.769 10.758,28.729 10.548,28.729C10.338,28.729 10.13,28.769 9.935,28.847C9.741,28.925 9.564,29.039 9.416,29.183C9.267,29.327 9.149,29.498 9.068,29.686C8.988,29.874 8.947,30.076 8.947,30.279Z"
android:strokeLineJoin="round"
android:strokeWidth="0.5"
android:fillColor="#DAEDF7"
android:strokeColor="#000000"
android:strokeLineCap="round"/>
<path
android:pathData="M48.559,30.279C48.559,30.69 48.728,31.084 49.028,31.375C49.329,31.666 49.736,31.829 50.161,31.829C50.585,31.829 50.993,31.666 51.293,31.375C51.593,31.084 51.762,30.69 51.762,30.279C51.762,29.868 51.593,29.474 51.293,29.183C50.993,28.892 50.585,28.729 50.161,28.729C49.736,28.729 49.329,28.892 49.028,29.183C48.728,29.474 48.559,29.868 48.559,30.279Z"
android:strokeLineJoin="round"
android:strokeWidth="0.5"
android:fillColor="#DAEDF7"
android:strokeColor="#000000"
android:strokeLineCap="round"/>
<path
android:pathData="M31.809,14.906V9.784H33.107V14.906C33.107,15.392 33,15.806 32.785,16.148C32.57,16.49 32.278,16.751 31.907,16.932C31.537,17.113 31.116,17.203 30.645,17.203C30.164,17.203 29.736,17.125 29.362,16.967C28.992,16.81 28.701,16.568 28.49,16.243C28.278,15.918 28.173,15.506 28.173,15.007H29.482C29.482,15.295 29.528,15.528 29.622,15.705C29.719,15.88 29.854,16.007 30.027,16.087C30.204,16.164 30.41,16.203 30.645,16.203C30.87,16.203 31.069,16.154 31.242,16.057C31.419,15.957 31.558,15.811 31.658,15.62C31.758,15.425 31.809,15.188 31.809,14.906Z"
android:fillColor="#ffffff"/>
<path
android:pathData="M39.405,17.103H37.789L37.8,16.103H39.405C39.872,16.103 40.263,16.004 40.578,15.806C40.897,15.608 41.136,15.325 41.295,14.956C41.458,14.588 41.539,14.149 41.539,13.639V13.242C41.539,12.847 41.493,12.497 41.399,12.192C41.309,11.887 41.174,11.63 40.994,11.422C40.817,11.215 40.599,11.057 40.34,10.95C40.083,10.843 39.787,10.789 39.451,10.789H37.758V9.784H39.451C39.953,9.784 40.412,9.866 40.828,10.03C41.243,10.191 41.602,10.424 41.903,10.729C42.208,11.034 42.441,11.399 42.604,11.825C42.767,12.25 42.848,12.726 42.848,13.252V13.639C42.848,14.165 42.767,14.641 42.604,15.067C42.441,15.493 42.208,15.858 41.903,16.163C41.598,16.464 41.235,16.697 40.812,16.861C40.393,17.022 39.924,17.103 39.405,17.103ZM38.511,9.784V17.103H37.208V9.784H38.511Z"
android:fillColor="#ffffff"/>
<path
android:pathData="M50.667,16.103V17.103H46.652V16.103H50.667ZM47.021,9.784V17.103H45.717V9.784H47.021ZM50.142,12.84V13.825H46.652V12.84H50.142ZM50.641,9.784V10.789H46.652V9.784H50.641Z"
android:fillColor="#ffffff"/>
</vector>

View File

@ -0,0 +1,11 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:pathData="M11.793,2.705L2.71,11.774C2.08,12.403 2.526,13.481 3.417,13.481H3.696C4.249,13.481 4.696,13.929 4.696,14.481V21C4.696,21.552 5.144,22 5.696,22H9.036C9.588,22 10.036,21.552 10.036,21V17.074C10.036,16.522 10.483,16.074 11.036,16.074H12.5H13.964C14.517,16.074 14.964,16.522 14.964,17.074V21C14.964,21.552 15.412,22 15.964,22H19.304C19.856,22 20.304,21.552 20.304,21V14.481C20.304,13.929 20.751,13.481 21.304,13.481H21.583C22.474,13.481 22.92,12.403 22.29,11.774L13.207,2.705C12.816,2.316 12.184,2.316 11.793,2.705Z"
android:strokeWidth="1.15"
android:fillColor="#00000000"
android:strokeColor="#000000"/>
</vector>

View File

@ -0,0 +1,11 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:pathData="M11.793,2.705L2.71,11.774C2.08,12.403 2.526,13.481 3.417,13.481H3.696C4.249,13.481 4.696,13.929 4.696,14.481V21C4.696,21.552 5.144,22 5.696,22H9.036C9.588,22 10.036,21.552 10.036,21V17.074C10.036,16.522 10.483,16.074 11.036,16.074H12.5H13.964C14.517,16.074 14.964,16.522 14.964,17.074V21C14.964,21.552 15.412,22 15.964,22H19.304C19.856,22 20.304,21.552 20.304,21V14.481C20.304,13.929 20.751,13.481 21.304,13.481H21.583C22.474,13.481 22.92,12.403 22.29,11.774L13.207,2.705C12.816,2.316 12.184,2.316 11.793,2.705Z"
android:strokeWidth="1.15"
android:fillColor="#00000000"
android:strokeColor="#A8A8A8"/>
</vector>

View File

@ -0,0 +1,126 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="62dp"
android:height="37dp"
android:viewportWidth="62"
android:viewportHeight="37">
<path
android:pathData="M3.139,35C3.139,35.53 6.078,36.039 11.31,36.414C16.542,36.789 23.637,37 31.036,37C38.435,37 45.53,36.789 50.762,36.414C55.994,36.039 58.933,35.53 58.933,35C58.933,34.47 55.994,33.961 50.762,33.586C45.53,33.211 38.435,33 31.036,33C23.637,33 16.542,33.211 11.31,33.586C6.078,33.961 3.139,34.47 3.139,35Z"
android:strokeAlpha="0.15"
android:fillColor="#000000"
android:fillAlpha="0.15"/>
<path
android:pathData="M19.463,25.659H1.629V18.469C1.632,16.939 2.037,15.435 2.807,14.099L7.384,6.239C7.816,5.493 8.446,4.871 9.209,4.439C9.972,4.006 10.84,3.779 11.724,3.779H19.463V25.659Z"
android:fillColor="#DCDCD9"/>
<path
android:pathData="M11.724,3.779C10.84,3.779 9.972,4.006 9.209,4.439C8.446,4.871 7.816,5.493 7.384,6.239L2.818,14.099C2.041,15.433 1.632,16.938 1.629,18.469V21.759C1.631,20.231 2.041,18.729 2.818,17.399L7.384,9.529C7.819,8.785 8.449,8.166 9.212,7.736C9.974,7.305 10.841,7.079 11.724,7.079H19.463V3.779H11.724Z"
android:fillColor="#ffffff"/>
<path
android:pathData="M19.463,25.659H1.629V18.469C1.632,16.939 2.037,15.435 2.807,14.099L7.384,6.239C7.816,5.493 8.446,4.871 9.209,4.439C9.972,4.006 10.84,3.779 11.724,3.779H19.463V25.659Z"
android:strokeLineJoin="round"
android:strokeWidth="0.5"
android:fillColor="#00000000"
android:strokeColor="#000000"
android:strokeLineCap="round"/>
<path
android:pathData="M1.074,24.999H61V30.999H1.074V24.999Z"
android:fillColor="#161616"/>
<path
android:pathData="M59.257,24.999H2.804C2.345,24.999 1.905,25.136 1.58,25.38C1.256,25.623 1.074,25.954 1.074,26.299V28.999C1.074,28.654 1.256,28.324 1.58,28.08C1.905,27.836 2.345,27.699 2.804,27.699H59.257C59.485,27.698 59.711,27.731 59.923,27.795C60.134,27.86 60.327,27.956 60.489,28.076C60.651,28.197 60.779,28.341 60.867,28.499C60.955,28.658 61,28.827 61,28.999V26.299C61,26.127 60.955,25.957 60.867,25.799C60.779,25.641 60.651,25.497 60.489,25.376C60.327,25.255 60.134,25.16 59.923,25.095C59.711,25.03 59.485,24.998 59.257,24.999Z"
android:fillColor="#494949"/>
<path
android:pathData="M1.074,24.999H61V30.999H1.074V24.999Z"
android:strokeLineJoin="round"
android:strokeWidth="0.5"
android:fillColor="#00000000"
android:strokeColor="#000000"
android:strokeLineCap="round"/>
<path
android:pathData="M21.769,1H58.9C59.457,1 59.991,1.129 60.384,1.358C60.778,1.586 60.999,1.897 60.999,2.221V25H19.67V2.221C19.67,1.897 19.891,1.586 20.285,1.358C20.678,1.129 21.212,1 21.769,1Z"
android:fillColor="#FF5722"/>
<path
android:pathData="M58.881,1H21.772C21.215,1 20.68,1.119 20.286,1.33C19.892,1.542 19.67,1.829 19.67,2.128V5C19.67,4.701 19.892,4.414 20.286,4.202C20.68,3.991 21.215,3.872 21.772,3.872H58.881C59.44,3.872 59.976,3.991 60.373,4.202C60.77,4.413 60.994,4.7 60.999,5V2.128C60.994,1.828 60.77,1.541 60.373,1.33C59.976,1.119 59.44,1 58.881,1Z"
android:fillColor="#FF9B7C"/>
<path
android:pathData="M21.769,1H58.9C59.457,1 59.991,1.129 60.384,1.358C60.778,1.586 60.999,1.897 60.999,2.221V25H19.67V2.221C19.67,1.897 19.891,1.586 20.285,1.358C20.678,1.129 21.212,1 21.769,1Z"
android:strokeLineJoin="round"
android:strokeWidth="0.5"
android:fillColor="#00000000"
android:strokeColor="#000000"
android:strokeLineCap="round"/>
<path
android:pathData="M5.67,30.28C5.67,30.899 5.796,31.513 6.041,32.086C6.286,32.659 6.645,33.179 7.098,33.617C7.551,34.055 8.088,34.403 8.68,34.64C9.272,34.877 9.906,35 10.546,35C11.187,35 11.821,34.877 12.413,34.64C13.004,34.403 13.542,34.055 13.995,33.617C14.448,33.179 14.807,32.659 15.052,32.086C15.297,31.513 15.423,30.899 15.423,30.28C15.423,29.66 15.297,29.046 15.052,28.473C14.807,27.901 14.448,27.38 13.995,26.942C13.542,26.504 13.004,26.156 12.413,25.919C11.821,25.682 11.187,25.56 10.546,25.56C9.906,25.56 9.272,25.682 8.68,25.919C8.088,26.156 7.551,26.504 7.098,26.942C6.645,27.38 6.286,27.901 6.041,28.473C5.796,29.046 5.67,29.66 5.67,30.28Z"
android:fillColor="#656769"/>
<path
android:pathData="M45.284,30.28C45.284,31.531 45.798,32.732 46.713,33.617C47.627,34.502 48.868,35 50.161,35C51.454,35 52.695,34.502 53.609,33.617C54.524,32.732 55.038,31.531 55.038,30.28C55.038,29.028 54.524,27.827 53.609,26.942C52.695,26.057 51.454,25.56 50.161,25.56C48.868,25.56 47.627,26.057 46.713,26.942C45.798,27.827 45.284,29.028 45.284,30.28Z"
android:fillColor="#656769"/>
<path
android:pathData="M10.546,27.429C11.671,27.43 12.762,27.806 13.633,28.495C14.505,29.183 15.104,30.142 15.33,31.209C15.47,30.524 15.452,29.818 15.276,29.142C15.101,28.465 14.772,27.835 14.315,27.296C13.858,26.757 13.282,26.322 12.631,26.024C11.979,25.726 11.267,25.571 10.546,25.571C9.826,25.571 9.114,25.726 8.462,26.024C7.81,26.322 7.235,26.757 6.778,27.296C6.32,27.835 5.992,28.465 5.816,29.142C5.641,29.818 5.622,30.524 5.763,31.209C5.989,30.142 6.588,29.183 7.459,28.495C8.331,27.806 9.421,27.43 10.546,27.429Z"
android:fillColor="#525252"/>
<path
android:pathData="M50.161,27.429C51.286,27.43 52.376,27.806 53.248,28.495C54.119,29.183 54.719,30.142 54.945,31.209C55.085,30.524 55.066,29.818 54.891,29.142C54.715,28.465 54.387,27.835 53.93,27.296C53.472,26.757 52.897,26.322 52.245,26.024C51.593,25.726 50.882,25.571 50.161,25.571C49.44,25.571 48.728,25.726 48.077,26.024C47.425,26.322 46.85,26.757 46.392,27.296C45.935,27.835 45.606,28.465 45.431,29.142C45.255,29.818 45.237,30.524 45.377,31.209C45.603,30.142 46.202,29.183 47.074,28.495C47.945,27.806 49.036,27.43 50.161,27.429Z"
android:fillColor="#525252"/>
<path
android:pathData="M5.67,30.28C5.67,30.899 5.796,31.513 6.041,32.086C6.286,32.659 6.645,33.179 7.098,33.617C7.551,34.055 8.088,34.403 8.68,34.64C9.272,34.877 9.906,35 10.546,35C11.187,35 11.821,34.877 12.413,34.64C13.004,34.403 13.542,34.055 13.995,33.617C14.448,33.179 14.807,32.659 15.052,32.086C15.297,31.513 15.423,30.899 15.423,30.28C15.423,29.66 15.297,29.046 15.052,28.473C14.807,27.901 14.448,27.38 13.995,26.942C13.542,26.504 13.004,26.156 12.413,25.919C11.821,25.682 11.187,25.56 10.546,25.56C9.906,25.56 9.272,25.682 8.68,25.919C8.088,26.156 7.551,26.504 7.098,26.942C6.645,27.38 6.286,27.901 6.041,28.473C5.796,29.046 5.67,29.66 5.67,30.28V30.28Z"
android:strokeLineJoin="round"
android:strokeWidth="0.5"
android:fillColor="#00000000"
android:strokeColor="#000000"
android:strokeLineCap="round"/>
<path
android:pathData="M45.284,30.28C45.284,31.531 45.798,32.732 46.713,33.617C47.627,34.502 48.868,35 50.161,35C51.454,35 52.695,34.502 53.609,33.617C54.524,32.732 55.038,31.531 55.038,30.28C55.038,29.028 54.524,27.827 53.609,26.942C52.695,26.057 51.454,25.56 50.161,25.56C48.868,25.56 47.627,26.057 46.713,26.942C45.798,27.827 45.284,29.028 45.284,30.28V30.28Z"
android:strokeLineJoin="round"
android:strokeWidth="0.5"
android:fillColor="#00000000"
android:strokeColor="#000000"
android:strokeLineCap="round"/>
<path
android:pathData="M1.629,18.979H19.463V25.649H1.629V18.979Z"
android:strokeLineJoin="round"
android:strokeWidth="0.5"
android:fillColor="#161616"
android:strokeColor="#000000"
android:strokeLineCap="round"/>
<path
android:pathData="M14.121,7.26H6.785L2.807,14.1C2.694,14.3 2.59,14.51 2.487,14.72H12.148C12.345,14.719 12.539,14.676 12.717,14.595C12.896,14.514 13.054,14.396 13.181,14.25L15.154,11.94C15.356,11.708 15.466,11.414 15.464,11.11V8.57C15.464,8.225 15.323,7.893 15.071,7.647C14.82,7.402 14.478,7.263 14.121,7.26Z"
android:fillColor="#8EDFF8"/>
<path
android:pathData="M14.122,7.26H10.97L6.838,14.72H12.128C12.325,14.719 12.52,14.677 12.698,14.596C12.877,14.515 13.035,14.397 13.161,14.25L15.134,11.94C15.336,11.708 15.446,11.414 15.444,11.11V8.57C15.444,8.228 15.306,7.899 15.059,7.654C14.812,7.41 14.475,7.268 14.122,7.26Z"
android:fillColor="#B4EBFF"/>
<path
android:pathData="M14.121,7.26H6.785L2.807,14.1C2.694,14.3 2.59,14.51 2.487,14.72H12.148C12.345,14.719 12.539,14.676 12.717,14.595C12.896,14.514 13.054,14.396 13.181,14.25L15.154,11.94C15.356,11.708 15.466,11.414 15.464,11.11V8.57C15.464,8.225 15.323,7.893 15.071,7.647C14.82,7.402 14.478,7.263 14.121,7.26V7.26Z"
android:strokeLineJoin="round"
android:strokeWidth="0.5"
android:fillColor="#00000000"
android:strokeColor="#000000"
android:strokeLineCap="round"/>
<path
android:pathData="M3.986,20.137C3.986,19.899 3.937,19.663 3.843,19.442C3.748,19.222 3.609,19.022 3.435,18.854C3.26,18.686 3.052,18.553 2.824,18.462C2.596,18.372 2.352,18.326 2.106,18.327H1V21.997H2.106C2.356,21.999 2.605,21.951 2.837,21.858C3.068,21.764 3.278,21.627 3.453,21.453C3.629,21.28 3.766,21.074 3.858,20.848C3.949,20.622 3.993,20.38 3.986,20.137Z"
android:strokeLineJoin="round"
android:strokeWidth="0.5"
android:fillColor="#FFD66B"
android:strokeColor="#000000"
android:strokeLineCap="round"/>
<path
android:pathData="M8.947,30.279C8.947,30.483 8.988,30.684 9.068,30.872C9.149,31.06 9.267,31.231 9.416,31.375C9.564,31.519 9.741,31.633 9.935,31.711C10.13,31.789 10.338,31.829 10.548,31.829C10.758,31.829 10.967,31.789 11.161,31.711C11.355,31.633 11.532,31.519 11.68,31.375C11.829,31.231 11.947,31.06 12.028,30.872C12.108,30.684 12.149,30.483 12.149,30.279C12.149,30.076 12.108,29.874 12.028,29.686C11.947,29.498 11.829,29.327 11.68,29.183C11.532,29.039 11.355,28.925 11.161,28.847C10.967,28.769 10.758,28.729 10.548,28.729C10.338,28.729 10.13,28.769 9.935,28.847C9.741,28.925 9.564,29.039 9.416,29.183C9.267,29.327 9.149,29.498 9.068,29.686C8.988,29.874 8.947,30.076 8.947,30.279Z"
android:strokeLineJoin="round"
android:strokeWidth="0.5"
android:fillColor="#DAEDF7"
android:strokeColor="#000000"
android:strokeLineCap="round"/>
<path
android:pathData="M48.559,30.279C48.559,30.69 48.728,31.084 49.028,31.375C49.329,31.666 49.736,31.829 50.161,31.829C50.585,31.829 50.993,31.666 51.293,31.375C51.593,31.084 51.762,30.69 51.762,30.279C51.762,29.868 51.593,29.474 51.293,29.183C50.993,28.892 50.585,28.729 50.161,28.729C49.736,28.729 49.329,28.892 49.028,29.183C48.728,29.474 48.559,29.868 48.559,30.279Z"
android:strokeLineJoin="round"
android:strokeWidth="0.5"
android:fillColor="#DAEDF7"
android:strokeColor="#000000"
android:strokeLineCap="round"/>
<path
android:pathData="M31.809,14.906V9.784H33.107V14.906C33.107,15.392 33,15.806 32.785,16.148C32.57,16.49 32.278,16.751 31.907,16.932C31.537,17.113 31.116,17.203 30.645,17.203C30.164,17.203 29.736,17.125 29.362,16.967C28.992,16.81 28.701,16.568 28.49,16.243C28.278,15.918 28.173,15.506 28.173,15.007H29.482C29.482,15.295 29.528,15.528 29.622,15.705C29.719,15.88 29.854,16.007 30.027,16.087C30.204,16.164 30.41,16.203 30.645,16.203C30.87,16.203 31.069,16.154 31.242,16.057C31.419,15.957 31.558,15.811 31.658,15.62C31.758,15.425 31.809,15.188 31.809,14.906Z"
android:fillColor="#ffffff"/>
<path
android:pathData="M39.405,17.103H37.789L37.8,16.103H39.405C39.872,16.103 40.263,16.004 40.578,15.806C40.897,15.608 41.136,15.325 41.295,14.956C41.458,14.588 41.539,14.149 41.539,13.639V13.242C41.539,12.847 41.493,12.497 41.399,12.192C41.309,11.887 41.174,11.63 40.994,11.422C40.817,11.215 40.599,11.057 40.34,10.95C40.083,10.843 39.787,10.789 39.451,10.789H37.758V9.784H39.451C39.953,9.784 40.412,9.866 40.828,10.03C41.243,10.191 41.602,10.424 41.903,10.729C42.208,11.034 42.441,11.399 42.604,11.825C42.767,12.25 42.848,12.726 42.848,13.252V13.639C42.848,14.165 42.767,14.641 42.604,15.067C42.441,15.493 42.208,15.858 41.903,16.163C41.598,16.464 41.235,16.697 40.812,16.861C40.393,17.022 39.924,17.103 39.405,17.103ZM38.511,9.784V17.103H37.208V9.784H38.511Z"
android:fillColor="#ffffff"/>
<path
android:pathData="M50.667,16.103V17.103H46.652V16.103H50.667ZM47.021,9.784V17.103H45.717V9.784H47.021ZM50.142,12.84V13.825H46.652V12.84H50.142ZM50.641,9.784V10.789H46.652V9.784H50.641Z"
android:fillColor="#ffffff"/>
</vector>

View File

@ -0,0 +1,170 @@
<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="108dp"
android:height="108dp"
android:viewportWidth="108"
android:viewportHeight="108">
<path
android:fillColor="#3DDC84"
android:pathData="M0,0h108v108h-108z" />
<path
android:fillColor="#00000000"
android:pathData="M9,0L9,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M19,0L19,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M29,0L29,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M39,0L39,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M49,0L49,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M59,0L59,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M69,0L69,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M79,0L79,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M89,0L89,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M99,0L99,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,9L108,9"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,19L108,19"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,29L108,29"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,39L108,39"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,49L108,49"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,59L108,59"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,69L108,69"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,79L108,79"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,89L108,89"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,99L108,99"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M19,29L89,29"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M19,39L89,39"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M19,49L89,49"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M19,59L89,59"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M19,69L89,69"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M19,79L89,79"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M29,19L29,89"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M39,19L39,89"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M49,19L49,89"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M59,19L59,89"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M69,19L69,89"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M79,19L79,89"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
</vector>

View File

@ -0,0 +1,30 @@
<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>
<path
android:fillColor="#FFFFFF"
android:fillType="nonZero"
android:pathData="M65.3,45.828l3.8,-6.6c0.2,-0.4 0.1,-0.9 -0.3,-1.1c-0.4,-0.2 -0.9,-0.1 -1.1,0.3l-3.9,6.7c-6.3,-2.8 -13.4,-2.8 -19.7,0l-3.9,-6.7c-0.2,-0.4 -0.7,-0.5 -1.1,-0.3C38.8,38.328 38.7,38.828 38.9,39.228l3.8,6.6C36.2,49.428 31.7,56.028 31,63.928h46C76.3,56.028 71.8,49.428 65.3,45.828zM43.4,57.328c-0.8,0 -1.5,-0.5 -1.8,-1.2c-0.3,-0.7 -0.1,-1.5 0.4,-2.1c0.5,-0.5 1.4,-0.7 2.1,-0.4c0.7,0.3 1.2,1 1.2,1.8C45.3,56.528 44.5,57.328 43.4,57.328L43.4,57.328zM64.6,57.328c-0.8,0 -1.5,-0.5 -1.8,-1.2s-0.1,-1.5 0.4,-2.1c0.5,-0.5 1.4,-0.7 2.1,-0.4c0.7,0.3 1.2,1 1.2,1.8C66.5,56.528 65.6,57.328 64.6,57.328L64.6,57.328z"
android:strokeWidth="1"
android:strokeColor="#00000000" />
</vector>

View File

@ -0,0 +1,9 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:pathData="M21.258,2.734C20.931,2.404 20.518,2.173 20.066,2.067C19.614,1.96 19.141,1.982 18.701,2.13L3.154,7.314C2.818,7.426 2.526,7.641 2.318,7.928C2.111,8.215 2,8.561 2,8.915C2,9.269 2.111,9.614 2.318,9.901C2.526,10.189 2.818,10.403 3.154,10.515L10.708,13.034C10.767,13.054 10.821,13.087 10.865,13.131C10.909,13.175 10.942,13.229 10.962,13.288L13.479,20.846C13.588,21.184 13.803,21.479 14.091,21.687C14.38,21.895 14.727,22.004 15.083,22C15.438,22.004 15.785,21.895 16.073,21.687C16.362,21.48 16.576,21.185 16.686,20.847L21.872,5.293C22.019,4.852 22.04,4.378 21.931,3.926C21.823,3.473 21.59,3.06 21.258,2.734ZM20.787,4.934L15.6,20.487C15.565,20.599 15.495,20.696 15.4,20.764C15.305,20.832 15.191,20.868 15.074,20.865C14.958,20.867 14.843,20.832 14.748,20.764C14.654,20.696 14.584,20.599 14.549,20.487L12.038,12.93C11.963,12.704 11.836,12.498 11.667,12.33C11.498,12.161 11.293,12.034 11.067,11.958L3.512,9.441C3.402,9.404 3.306,9.333 3.238,9.239C3.17,9.144 3.134,9.031 3.134,8.915C3.134,8.799 3.17,8.685 3.238,8.591C3.306,8.496 3.402,8.426 3.512,8.389L19.058,3.2C19.299,3.12 19.557,3.108 19.804,3.166C20.051,3.225 20.277,3.351 20.457,3.53C20.636,3.71 20.762,3.936 20.82,4.183C20.879,4.43 20.867,4.688 20.787,4.929V4.934Z"
android:fillColor="#000000"/>
</vector>

View File

@ -0,0 +1,9 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:pathData="M21.258,2.734C20.931,2.404 20.518,2.173 20.066,2.067C19.614,1.96 19.141,1.982 18.701,2.13L3.154,7.314C2.818,7.426 2.526,7.641 2.318,7.928C2.111,8.215 2,8.561 2,8.915C2,9.269 2.111,9.614 2.318,9.901C2.526,10.189 2.818,10.403 3.154,10.515L10.708,13.034C10.767,13.054 10.821,13.087 10.865,13.131C10.909,13.175 10.942,13.229 10.962,13.288L13.479,20.846C13.588,21.184 13.803,21.479 14.091,21.687C14.38,21.895 14.727,22.004 15.083,22C15.438,22.004 15.785,21.895 16.073,21.687C16.362,21.48 16.576,21.185 16.686,20.847L21.872,5.293C22.019,4.852 22.04,4.378 21.931,3.926C21.823,3.473 21.59,3.06 21.258,2.734ZM20.787,4.934L15.6,20.487C15.565,20.599 15.495,20.696 15.4,20.764C15.305,20.832 15.191,20.868 15.074,20.865C14.958,20.867 14.843,20.832 14.748,20.764C14.654,20.696 14.584,20.599 14.549,20.487L12.038,12.93C11.963,12.704 11.836,12.498 11.667,12.33C11.498,12.161 11.293,12.034 11.067,11.958L3.512,9.441C3.402,9.404 3.306,9.333 3.238,9.239C3.17,9.144 3.134,9.031 3.134,8.915C3.134,8.799 3.17,8.685 3.238,8.591C3.306,8.496 3.402,8.426 3.512,8.389L19.058,3.2C19.299,3.12 19.557,3.108 19.804,3.166C20.051,3.225 20.277,3.351 20.457,3.53C20.636,3.71 20.762,3.936 20.82,4.183C20.879,4.43 20.867,4.688 20.787,4.929V4.934Z"
android:fillColor="#A8A8A8"/>
</vector>

View File

@ -0,0 +1,16 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="32dp"
android:height="32dp"
android:viewportWidth="32"
android:viewportHeight="32">
<path
android:pathData="M16,16m-16,0a16,16 0,1 1,32 0a16,16 0,1 1,-32 0"
android:fillColor="#D6D6D6"/>
<path
android:pathData="M8,13.286L15,24L24,10"
android:strokeLineJoin="round"
android:strokeWidth="2"
android:fillColor="#00000000"
android:strokeColor="#ffffff"
android:strokeLineCap="round"/>
</vector>

View File

@ -0,0 +1,27 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:aapt="http://schemas.android.com/aapt"
android:width="30dp"
android:height="30dp"
android:viewportWidth="30"
android:viewportHeight="30">
<path
android:pathData="M13.128,16.88L17.816,30L30,0L0,12.192L13.128,16.88Z">
<aapt:attr name="android:fillColor">
<gradient
android:startX="0.012"
android:startY="30.011"
android:endX="30.014"
android:endY="0.01"
android:type="linear">
<item android:offset="0" android:color="#FFFFCC00"/>
<item android:offset="1" android:color="#FFFFE992"/>
</gradient>
</aapt:attr>
</path>
<path
android:pathData="M17.816,30L30,0L12.66,17.348L17.816,30Z"
android:fillColor="#FFC700"/>
<path
android:pathData="M15.936,14.064L0,12.192L12.192,17.816L17.816,30L15.936,14.064Z"
android:fillColor="#ECA704"/>
</vector>

View File

@ -0,0 +1,50 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="54dp"
android:height="56dp"
android:viewportWidth="54"
android:viewportHeight="56">
<path
android:pathData="M34.959,6.849C32.266,4.129 28.852,2.252 25.126,1.445C21.401,0.637 17.524,0.934 13.961,2.298C10.399,3.662 7.303,6.035 5.047,9.133C2.791,12.231 1.471,15.92 1.245,19.757C1.02,23.595 1.899,27.416 3.776,30.761C5.654,34.106 8.45,36.832 11.827,38.611C15.205,40.39 19.02,41.146 22.814,40.788C26.608,40.43 30.219,38.974 33.211,36.594L36.196,39.606L39.488,36.285L36.503,33.273C39.497,29.442 40.994,24.635 40.709,19.765C40.425,14.895 38.379,10.299 34.959,6.849Z"
android:fillColor="#F1F1F1"/>
<path
android:pathData="M7.016,10.981C9.656,8.314 12.991,6.457 16.635,5.626C20.279,4.795 24.082,5.025 27.601,6.288C31.121,7.551 34.213,9.796 36.519,12.761C38.824,15.727 40.247,19.292 40.624,23.041C40.913,20.264 40.621,17.456 39.766,14.801C38.911,12.145 37.512,9.7 35.66,7.625C33.808,5.549 31.544,3.89 29.015,2.754C26.486,1.618 23.749,1.031 20.981,1.031C18.213,1.031 15.476,1.618 12.947,2.754C10.418,3.89 8.155,5.549 6.303,7.625C4.451,9.7 3.052,12.145 2.196,14.801C1.341,17.456 1.049,20.264 1.339,23.041C1.79,18.479 3.797,14.216 7.016,10.981Z"
android:fillColor="#E3E3E3"/>
<path
android:pathData="M34.959,6.849C32.266,4.129 28.852,2.252 25.126,1.445C21.401,0.637 17.524,0.934 13.961,2.298C10.399,3.662 7.303,6.035 5.047,9.133C2.791,12.231 1.471,15.92 1.245,19.757C1.02,23.595 1.899,27.416 3.776,30.761C5.654,34.106 8.45,36.832 11.827,38.611C15.205,40.39 19.02,41.146 22.814,40.788C26.608,40.43 30.219,38.974 33.211,36.594L36.196,39.606L39.488,36.285L36.503,33.273C39.497,29.442 40.994,24.635 40.709,19.765C40.425,14.895 38.379,10.299 34.959,6.849V6.849Z"
android:strokeLineJoin="round"
android:strokeWidth="0.5"
android:fillColor="#00000000"
android:strokeColor="#45413C"
android:strokeLineCap="round"/>
<path
android:pathData="M1,53.509C1,54.169 3.716,54.803 8.55,55.27C13.384,55.737 19.94,56 26.776,56C33.612,56 40.168,55.737 45.002,55.27C49.836,54.803 52.552,54.169 52.552,53.509C52.552,52.848 49.836,52.214 45.002,51.747C40.168,51.28 33.612,51.018 26.776,51.018C19.94,51.018 13.384,51.28 8.55,51.747C3.716,52.214 1,52.848 1,53.509Z"
android:strokeAlpha="0.15"
android:fillColor="#45413C"
android:fillAlpha="0.15"/>
<path
android:pathData="M5.294,20.943C5.294,23.022 5.7,25.08 6.489,27.001C7.277,28.922 8.433,30.667 9.891,32.137C11.348,33.607 13.078,34.773 14.982,35.569C16.886,36.365 18.927,36.774 20.988,36.774C23.049,36.774 25.089,36.365 26.993,35.569C28.897,34.773 30.627,33.607 32.085,32.137C33.542,30.667 34.698,28.922 35.487,27.001C36.275,25.08 36.681,23.022 36.681,20.943C36.681,18.864 36.275,16.805 35.487,14.884C34.698,12.963 33.542,11.218 32.085,9.748C30.627,8.278 28.897,7.112 26.993,6.316C25.089,5.521 23.049,5.111 20.988,5.111C18.927,5.111 16.886,5.521 14.982,6.316C13.078,7.112 11.348,8.278 9.891,9.748C8.433,11.218 7.277,12.963 6.489,14.884C5.7,16.805 5.294,18.864 5.294,20.943Z"
android:fillColor="#CBE9F3"/>
<path
android:pathData="M9.887,9.693C7.255,12.341 5.641,15.845 5.333,19.582C5.024,23.318 6.042,27.044 8.203,30.094L28.949,7.325C25.961,5.532 22.467,4.792 19.017,5.221C15.566,5.65 12.355,7.223 9.887,9.693Z"
android:fillColor="#E7F5FA"/>
<path
android:pathData="M5.294,20.943C5.294,23.022 5.7,25.08 6.489,27.001C7.277,28.922 8.433,30.667 9.891,32.137C11.348,33.607 13.078,34.773 14.982,35.569C16.886,36.365 18.927,36.774 20.988,36.774C23.049,36.774 25.089,36.365 26.993,35.569C28.897,34.773 30.627,33.607 32.085,32.137C33.542,30.667 34.698,28.922 35.487,27.001C36.275,25.08 36.681,23.022 36.681,20.943C36.681,18.864 36.275,16.805 35.487,14.884C34.698,12.963 33.542,11.218 32.085,9.748C30.627,8.278 28.897,7.112 26.993,6.316C25.089,5.521 23.049,5.111 20.988,5.111C18.927,5.111 16.886,5.521 14.982,6.316C13.078,7.112 11.348,8.278 9.891,9.748C8.433,11.218 7.277,12.963 6.489,14.884C5.7,16.805 5.294,18.864 5.294,20.943V20.943Z"
android:strokeLineJoin="round"
android:strokeWidth="0.5"
android:fillColor="#00000000"
android:strokeColor="#45413C"
android:strokeLineCap="round"/>
<path
android:pathData="M51.813,46.235L40.713,35.037C40.493,34.819 40.198,34.697 39.89,34.697C39.582,34.697 39.287,34.819 39.067,35.037L34.959,39.181C34.743,39.403 34.622,39.701 34.622,40.011C34.622,40.322 34.743,40.62 34.959,40.841L46.059,52.039C46.828,52.778 47.853,53.185 48.916,53.172C49.978,53.159 50.993,52.727 51.744,51.969C52.495,51.212 52.923,50.188 52.936,49.116C52.949,48.045 52.546,47.011 51.813,46.235Z"
android:fillColor="#E5332A"/>
<path
android:pathData="M51.813,46.235L40.713,35.037C40.493,34.819 40.198,34.697 39.89,34.697C39.582,34.697 39.287,34.819 39.067,35.037L36.515,37.611C36.623,37.501 36.751,37.415 36.893,37.355C37.034,37.296 37.185,37.266 37.338,37.266C37.491,37.266 37.643,37.296 37.784,37.355C37.925,37.415 38.053,37.501 38.161,37.611L49.262,48.809C49.79,49.342 50.162,50.013 50.335,50.747C50.509,51.481 50.477,52.249 50.244,52.966C50.854,52.775 51.409,52.439 51.864,51.988C52.602,51.212 53.009,50.176 53,49.101C52.99,48.026 52.564,46.997 51.813,46.235Z"
android:fillColor="#CD1D15"/>
<path
android:pathData="M51.813,46.235L40.713,35.037C40.493,34.819 40.198,34.697 39.89,34.697C39.582,34.697 39.287,34.819 39.067,35.037L34.959,39.181C34.743,39.403 34.622,39.701 34.622,40.011C34.622,40.322 34.743,40.62 34.959,40.841L46.059,52.039C46.828,52.778 47.853,53.185 48.916,53.172C49.978,53.159 50.993,52.727 51.744,51.969C52.495,51.212 52.923,50.188 52.936,49.116C52.949,48.045 52.546,47.011 51.813,46.235V46.235Z"
android:strokeLineJoin="round"
android:strokeWidth="0.5"
android:fillColor="#00000000"
android:strokeColor="#45413C"
android:strokeLineCap="round"/>
</vector>

View File

@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<com.yandex.mapkit.mapview.MapView android:id="@+id/mapview"
android:layout_width="match_parent"
android:layout_height="match_parent"
xmlns:android="http://schemas.android.com/apk/res/android" />

View File

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
<background android:drawable="@drawable/ic_launcher_background" />
<foreground android:drawable="@drawable/ic_launcher_foreground" />
<monochrome android:drawable="@drawable/ic_launcher_foreground" />
</adaptive-icon>

View File

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
<background android:drawable="@drawable/ic_launcher_background" />
<foreground android:drawable="@drawable/ic_launcher_foreground" />
<monochrome android:drawable="@drawable/ic_launcher_foreground" />
</adaptive-icon>

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 982 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.6 KiB

View File

@ -0,0 +1,10 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<color name="purple_200">#FFBB86FC</color>
<color name="purple_500">#FF6200EE</color>
<color name="purple_700">#FF3700B3</color>
<color name="teal_200">#FF03DAC5</color>
<color name="teal_700">#FF018786</color>
<color name="black">#FF000000</color>
<color name="white">#FFFFFFFF</color>
</resources>

View File

@ -0,0 +1,3 @@
<resources>
<string name="app_name">MPDriver</string>
</resources>

View File

@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<style name="Theme.MPDriver" parent="android:Theme.Material.Light.NoActionBar" />
</resources>

View File

@ -0,0 +1,13 @@
<?xml version="1.0" encoding="utf-8"?><!--
Sample backup rules file; uncomment and customize as necessary.
See https://developer.android.com/guide/topics/data/autobackup
for details.
Note: This file is ignored for devices older that API 31
See https://developer.android.com/about/versions/12/backup-restore
-->
<full-backup-content>
<!--
<include domain="sharedpref" path="."/>
<exclude domain="sharedpref" path="device.xml"/>
-->
</full-backup-content>

View File

@ -0,0 +1,19 @@
<?xml version="1.0" encoding="utf-8"?><!--
Sample data extraction rules file; uncomment and customize as necessary.
See https://developer.android.com/about/versions/12/backup-restore#xml-changes
for details.
-->
<data-extraction-rules>
<cloud-backup>
<!-- TODO: Use <include> and <exclude> to control what is backed up.
<include .../>
<exclude .../>
-->
</cloud-backup>
<!--
<device-transfer>
<include .../>
<exclude .../>
</device-transfer>
-->
</data-extraction-rules>

View File

@ -0,0 +1,17 @@
package com.example.mpdriver
import org.junit.Test
import org.junit.Assert.*
/**
* Example local unit test, which will execute on the development machine (host).
*
* See [testing documentation](http://d.android.com/tools/testing).
*/
class ExampleUnitTest {
@Test
fun addition_isCorrect() {
assertEquals(4, 2 + 2)
}
}

3
bell.svg Normal file
View File

@ -0,0 +1,3 @@
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" clip-rule="evenodd" d="M12.9143 1.97157C12.9143 1.43499 12.5049 1 12 1C11.4951 1 11.0857 1.43499 11.0857 1.97157V3.91471C11.0857 3.92281 11.0858 3.9309 11.086 3.93896C7.87355 4.4119 5.4 7.34194 5.4 10.8858V14.9338C5.4 15.3725 5.2134 15.7869 4.8924 16.0624C4.3254 16.5055 3.6606 17.0423 3.5274 17.1845C3.1896 17.5428 3 18.0293 3 18.5369C3 19.0444 3.1896 19.5309 3.5274 19.8892C3.8646 20.2482 4.3224 20.4496 4.8 20.4496H9.06C9.3384 21.904 10.5498 23 12 23C13.4502 23 14.6616 21.904 14.94 20.4496H19.2C19.6776 20.4496 20.1354 20.2482 20.4726 19.8892C20.8104 19.5309 21 19.0444 21 18.5369C21 18.0293 20.8104 17.5428 20.4726 17.1845C20.3388 17.0417 19.6704 16.5023 19.1118 16.063C18.792 15.7927 18.6024 15.375 18.6024 14.9332V14.9319C18.6 13.9698 18.6 12.4622 18.6 10.8892V10.8858C18.6 7.34194 16.1265 4.4119 12.914 3.93896C12.9142 3.9309 12.9143 3.92281 12.9143 3.91471V1.97157ZM12 21.7248C12.783 21.7248 13.4502 21.1924 13.6974 20.4496H10.3026C10.5498 21.1924 11.217 21.7248 12 21.7248ZM12 5.14743C14.9826 5.14743 17.4 7.71629 17.4 10.8858V10.8892C17.4 12.4634 17.4 13.973 17.4024 14.9351C17.4024 15.7684 17.763 16.5571 18.3804 17.0736L18.3948 17.0851C18.897 17.4797 19.5036 17.9579 19.6242 18.0861C19.737 18.2053 19.8 18.3679 19.8 18.5369C19.8 18.7058 19.737 18.8684 19.6242 18.9876C19.512 19.1075 19.359 19.1744 19.2 19.1744H4.8C4.641 19.1744 4.488 19.1075 4.3758 18.9876C4.263 18.8684 4.2 18.7058 4.2 18.5369C4.2 18.3679 4.263 18.2053 4.3758 18.0861C4.4958 17.9579 5.1024 17.4804 5.6052 17.0882C5.6106 17.0844 5.616 17.08 5.6214 17.0755C6.2394 16.559 6.6 15.7697 6.6 14.9338V10.8858C6.6 7.71629 9.0174 5.14743 12 5.14743Z" fill="black"/>
</svg>

After

Width:  |  Height:  |  Size: 1.7 KiB

5
build.gradle.kts Normal file
View File

@ -0,0 +1,5 @@
// Top-level build file where you can add configuration options common to all sub-projects/modules.
plugins {
alias(libs.plugins.android.application) apply false
alias(libs.plugins.jetbrains.kotlin.android) apply false
}

11
calendar.svg Normal file
View File

@ -0,0 +1,11 @@
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M7.625 13.8442H6.375C6.05141 13.8442 5.78906 14.1204 5.78906 14.4611C5.78906 14.8018 6.05141 15.078 6.375 15.078H7.625C7.94859 15.078 8.21094 14.8018 8.21094 14.4611C8.21094 14.1204 7.94859 13.8442 7.625 13.8442Z" fill="black"/>
<path d="M7.625 16.4761H6.375C6.05141 16.4761 5.78906 16.7523 5.78906 17.093C5.78906 17.4336 6.05141 17.7098 6.375 17.7098H7.625C7.94859 17.7098 8.21094 17.4336 8.21094 17.093C8.21094 16.7523 7.94859 16.4761 7.625 16.4761Z" fill="black"/>
<path d="M12.625 11.2122H11.375C11.0514 11.2122 10.7891 11.4884 10.7891 11.829C10.7891 12.1697 11.0514 12.4459 11.375 12.4459H12.625C12.9486 12.4459 13.2109 12.1697 13.2109 11.829C13.2109 11.4884 12.9486 11.2122 12.625 11.2122Z" fill="black"/>
<path d="M12.625 13.8442H11.375C11.0514 13.8442 10.7891 14.1204 10.7891 14.4611C10.7891 14.8018 11.0514 15.078 11.375 15.078H12.625C12.9486 15.078 13.2109 14.8018 13.2109 14.4611C13.2109 14.1204 12.9486 13.8442 12.625 13.8442Z" fill="black"/>
<path d="M12.625 16.4761H11.375C11.0514 16.4761 10.7891 16.7523 10.7891 17.093C10.7891 17.4336 11.0514 17.7098 11.375 17.7098H12.625C12.9486 17.7098 13.2109 17.4336 13.2109 17.093C13.2109 16.7523 12.9486 16.4761 12.625 16.4761Z" fill="black"/>
<path d="M17.625 11.2122H16.375C16.0514 11.2122 15.7891 11.4884 15.7891 11.829C15.7891 12.1697 16.0514 12.4459 16.375 12.4459H17.625C17.9486 12.4459 18.2109 12.1697 18.2109 11.829C18.2109 11.4884 17.9486 11.2122 17.625 11.2122Z" fill="black"/>
<path d="M17.625 13.8442H16.375C16.0514 13.8442 15.7891 14.1204 15.7891 14.4611C15.7891 14.8018 16.0514 15.078 16.375 15.078H17.625C17.9486 15.078 18.2109 14.8018 18.2109 14.4611C18.2109 14.1204 17.9486 13.8442 17.625 13.8442Z" fill="black"/>
<path d="M17.625 16.4761H16.375C16.0514 16.4761 15.7891 16.7523 15.7891 17.093C15.7891 17.4336 16.0514 17.7098 16.375 17.7098H17.625C17.9486 17.7098 18.2109 17.4336 18.2109 17.093C18.2109 16.7523 17.9486 16.4761 17.625 16.4761Z" fill="black"/>
<path d="M20.2422 3.64502H18.8359V2.61688C18.8359 2.2762 18.5736 2 18.25 2C17.9264 2 17.6641 2.2762 17.6641 2.61688V3.64502H12.5859H11.4141H6.33594V2.61688C6.33594 2.2762 6.07359 2 5.75 2C5.42641 2 5.16406 2.2762 5.16406 2.61688V3.64502H3.75781C2.78855 3.64502 2 4.47522 2 5.49567V19.1494C2 20.1698 2.78855 21 3.75781 21H20.2422C21.2114 21 22 20.1698 22 19.1494C22 18.7512 22 5.84215 22 5.49567C22 4.47522 21.2114 3.64502 20.2422 3.64502ZM3.17188 5.49567C3.17188 5.15552 3.43473 4.87879 3.75781 4.87879H5.16406V5.90693C5.16406 6.24761 5.42641 6.52381 5.75 6.52381C6.07359 6.52381 6.33594 6.24761 6.33594 5.90693V4.87879H11.4141H12.5859H17.6641V5.90693C17.6641 6.24761 17.9264 6.52381 18.25 6.52381C18.5736 6.52381 18.8359 6.24761 18.8359 5.90693V4.87879H20.2422C20.5653 4.87879 20.8281 5.15552 20.8281 5.49567V7.92208H3.17188V5.49567ZM20.2422 19.7662H3.75781C3.43473 19.7662 3.17188 19.4895 3.17188 19.1494V9.15584H20.8281V19.1494C20.8281 19.4895 20.5653 19.7662 20.2422 19.7662Z" fill="black"/>
</svg>

After

Width:  |  Height:  |  Size: 3.0 KiB

3
chat.svg Normal file
View File

@ -0,0 +1,3 @@
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M22 11.9722C22.0036 13.3654 21.6781 14.7398 21.05 15.9833C20.3052 17.4735 19.1603 18.7269 17.7434 19.6031C16.3265 20.4794 14.6937 20.9438 13.0278 20.9444C11.7041 20.9479 10.3974 20.6542 9.20369 20.0862C9.08331 20.0289 8.94552 20.0182 8.81905 20.0603L3.94868 21.6838C3.5578 21.8141 3.18593 21.4422 3.31623 21.0513L4.93968 16.181C4.98184 16.0545 4.97112 15.9167 4.91383 15.7963C4.34578 14.6026 4.0521 13.2959 4.05555 11.9722C4.0562 10.3063 4.52064 8.67348 5.39687 7.2566C6.27309 5.83973 7.52648 4.69479 9.01666 3.95003C10.2602 3.3219 11.6346 2.9964 13.0278 3.00003H13.5555C15.7557 3.12141 17.8337 4.05005 19.3918 5.60815C20.9499 7.16626 21.8786 9.24432 22 11.4445V11.9722Z" stroke="black" stroke-width="1.2" stroke-linecap="round" stroke-linejoin="round"/>
</svg>

After

Width:  |  Height:  |  Size: 867 B

28
colTransport.svg Normal file
View File

@ -0,0 +1,28 @@
<svg width="62" height="37" viewBox="0 0 62 37" fill="none" xmlns="http://www.w3.org/2000/svg">
<path opacity="0.15" d="M3.13916 35C3.13916 35.5304 6.07828 36.0391 11.31 36.4142C16.5416 36.7893 23.6373 37 31.036 37C38.4347 37 45.5304 36.7893 50.762 36.4142C55.9937 36.0391 58.9328 35.5304 58.9328 35C58.9328 34.4696 55.9937 33.9609 50.762 33.5858C45.5304 33.2107 38.4347 33 31.036 33C23.6373 33 16.5416 33.2107 11.31 33.5858C6.07828 33.9609 3.13916 34.4696 3.13916 35Z" fill="black"/>
<path d="M19.4627 25.6592H1.62939V18.4693C1.63188 16.9394 2.03726 15.4354 2.80726 14.0993L7.38441 6.23929C7.81631 5.49276 8.44613 4.87125 9.20893 4.43883C9.97173 4.00641 10.8399 3.77874 11.7239 3.7793H19.4627V25.6592Z" fill="#DCDCD9"/>
<path d="M11.7239 3.7793C10.8399 3.77874 9.97173 4.00641 9.20893 4.43883C8.44613 4.87125 7.81631 5.49276 7.38441 6.23929L2.81759 14.0993C2.04142 15.4334 1.63228 16.9382 1.62939 18.4693V21.7592C1.63127 20.2312 2.04053 18.7294 2.81759 17.3993L7.38441 9.52928C7.81847 8.78531 8.44905 8.16637 9.21157 7.73587C9.97409 7.30537 10.8411 7.07877 11.7239 7.07929H19.4627V3.7793H11.7239Z" fill="white"/>
<path d="M19.4627 25.6592H1.62939V18.4693C1.63188 16.9394 2.03726 15.4354 2.80726 14.0993L7.38441 6.23929C7.81631 5.49276 8.44613 4.87125 9.20893 4.43883C9.97173 4.00641 10.8399 3.77874 11.7239 3.7793H19.4627V25.6592Z" stroke="black" stroke-width="0.5" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M1.07373 24.999H61.0002V30.999H1.07373V24.999Z" fill="#161616"/>
<path d="M59.2568 24.9991H2.80368C2.34487 24.9991 1.90485 25.136 1.58042 25.3797C1.25599 25.6234 1.07373 25.9539 1.07373 26.2985V28.999C1.07373 28.6544 1.25599 28.3238 1.58042 28.0801C1.90485 27.8364 2.34487 27.6995 2.80368 27.6995H59.2568C59.4851 27.6982 59.7115 27.7308 59.923 27.7955C60.1344 27.8602 60.3267 27.9557 60.4888 28.0765C60.6509 28.1973 60.7795 28.341 60.8673 28.4994C60.9551 28.6577 61.0003 28.8275 61.0002 28.999V26.2985C61.0003 26.127 60.9551 25.9572 60.8673 25.7989C60.7795 25.6406 60.6509 25.4969 60.4888 25.3761C60.3267 25.2553 60.1344 25.1598 59.923 25.0951C59.7115 25.0303 59.4851 24.9977 59.2568 24.9991Z" fill="#494949"/>
<path d="M1.07373 24.999H61.0002V30.999H1.07373V24.999Z" stroke="black" stroke-width="0.5" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M21.7689 1H58.9001C59.4567 1 59.9905 1.1286 60.3841 1.35752C60.7777 1.58644 60.9988 1.89692 60.9988 2.22065V24.9999H19.6702V2.22065C19.6702 1.89692 19.8913 1.58644 20.2849 1.35752C20.6785 1.1286 21.2123 1 21.7689 1Z" fill="#1FAEFF"/>
<path d="M58.8806 1H21.7722C21.2147 1 20.68 1.11884 20.2858 1.33038C19.8916 1.54191 19.6702 1.82882 19.6702 2.12798V4.99999C19.6702 4.70083 19.8916 4.41392 20.2858 4.20239C20.68 3.99085 21.2147 3.87201 21.7722 3.87201H58.8806C59.4396 3.872 59.9759 3.99056 60.3727 4.20185C60.7695 4.41314 60.9945 4.70003 60.9988 4.99999V2.12798C60.9945 1.82803 60.7695 1.54114 60.3727 1.32985C59.9759 1.11855 59.4396 0.999991 58.8806 1Z" fill="#9FE2FF"/>
<path d="M21.7689 1H58.9001C59.4567 1 59.9905 1.1286 60.3841 1.35752C60.7777 1.58644 60.9988 1.89692 60.9988 2.22065V24.9999H19.6702V2.22065C19.6702 1.89692 19.8913 1.58644 20.2849 1.35752C20.6785 1.1286 21.2123 1 21.7689 1Z" stroke="black" stroke-width="0.5" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M5.66956 30.2796C5.66956 30.8994 5.7957 31.5132 6.04078 32.0858C6.28586 32.6585 6.64508 33.1788 7.09793 33.6171C7.55078 34.0554 8.08839 34.4031 8.68007 34.6403C9.27175 34.8775 9.90591 34.9995 10.5463 34.9995C11.1868 34.9995 11.8209 34.8775 12.4126 34.6403C13.0043 34.4031 13.5419 34.0554 13.9947 33.6171C14.4476 33.1788 14.8068 32.6585 15.0519 32.0858C15.297 31.5132 15.4231 30.8994 15.4231 30.2796C15.4231 29.6597 15.297 29.046 15.0519 28.4733C14.8068 27.9006 14.4476 27.3803 13.9947 26.942C13.5419 26.5037 13.0043 26.1561 12.4126 25.9189C11.8209 25.6817 11.1868 25.5596 10.5463 25.5596C9.90591 25.5596 9.27175 25.6817 8.68007 25.9189C8.08839 26.1561 7.55078 26.5037 7.09793 26.942C6.64508 27.3803 6.28586 27.9006 6.04078 28.4733C5.7957 29.046 5.66956 29.6597 5.66956 30.2796Z" fill="#656769"/>
<path d="M45.2841 30.2796C45.2841 31.5314 45.7979 32.7319 46.7125 33.6171C47.6271 34.5023 48.8675 34.9995 50.1609 34.9995C51.4543 34.9995 52.6947 34.5023 53.6093 33.6171C54.5239 32.7319 55.0377 31.5314 55.0377 30.2796C55.0377 29.0277 54.5239 27.8272 53.6093 26.942C52.6947 26.0569 51.4543 25.5596 50.1609 25.5596C48.8675 25.5596 47.6271 26.0569 46.7125 26.942C45.7979 27.8272 45.2841 29.0277 45.2841 30.2796Z" fill="#656769"/>
<path d="M10.5463 27.4286C11.6714 27.4295 12.7618 27.806 13.6333 28.4946C14.5048 29.1833 15.1042 30.1419 15.3301 31.2086C15.4702 30.5243 15.4518 29.8184 15.2763 29.1418C15.1008 28.4652 14.7724 27.8347 14.315 27.2956C13.8575 26.7565 13.2822 26.3222 12.6306 26.0241C11.979 25.7259 11.2671 25.5713 10.5463 25.5713C9.82555 25.5713 9.11372 25.7259 8.46208 26.0241C7.81043 26.3222 7.23518 26.7565 6.7777 27.2956C6.32023 27.8347 5.99191 28.4652 5.81638 29.1418C5.64084 29.8184 5.62246 30.5243 5.76255 31.2086C5.98851 30.1419 6.58785 29.1833 7.45938 28.4946C8.3309 27.806 9.42124 27.4295 10.5463 27.4286Z" fill="#525252"/>
<path d="M50.1609 27.4286C51.286 27.4295 52.3763 27.806 53.2479 28.4946C54.1194 29.1833 54.7187 30.1419 54.9447 31.2086C55.0848 30.5243 55.0664 29.8184 54.8909 29.1418C54.7153 28.4652 54.387 27.8347 53.9295 27.2956C53.4721 26.7565 52.8968 26.3222 52.2452 26.0241C51.5935 25.7259 50.8817 25.5713 50.1609 25.5713C49.4401 25.5713 48.7283 25.7259 48.0766 26.0241C47.425 26.3222 46.8497 26.7565 46.3923 27.2956C45.9348 27.8347 45.6065 28.4652 45.4309 29.1418C45.2554 29.8184 45.237 30.5243 45.3771 31.2086C45.6031 30.1419 46.2024 29.1833 47.0739 28.4946C47.9455 27.806 49.0358 27.4295 50.1609 27.4286Z" fill="#525252"/>
<path d="M5.66956 30.2796C5.66956 30.8994 5.7957 31.5132 6.04078 32.0858C6.28586 32.6585 6.64508 33.1788 7.09793 33.6171C7.55078 34.0554 8.08839 34.4031 8.68007 34.6403C9.27175 34.8775 9.90591 34.9995 10.5463 34.9995C11.1868 34.9995 11.8209 34.8775 12.4126 34.6403C13.0043 34.4031 13.5419 34.0554 13.9947 33.6171C14.4476 33.1788 14.8068 32.6585 15.0519 32.0858C15.297 31.5132 15.4231 30.8994 15.4231 30.2796C15.4231 29.6597 15.297 29.046 15.0519 28.4733C14.8068 27.9006 14.4476 27.3803 13.9947 26.942C13.5419 26.5037 13.0043 26.1561 12.4126 25.9189C11.8209 25.6817 11.1868 25.5596 10.5463 25.5596C9.90591 25.5596 9.27175 25.6817 8.68007 25.9189C8.08839 26.1561 7.55078 26.5037 7.09793 26.942C6.64508 27.3803 6.28586 27.9006 6.04078 28.4733C5.7957 29.046 5.66956 29.6597 5.66956 30.2796V30.2796Z" stroke="black" stroke-width="0.5" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M45.2841 30.2796C45.2841 31.5314 45.7979 32.7319 46.7125 33.6171C47.6271 34.5023 48.8675 34.9995 50.1609 34.9995C51.4543 34.9995 52.6947 34.5023 53.6093 33.6171C54.5239 32.7319 55.0377 31.5314 55.0377 30.2796C55.0377 29.0277 54.5239 27.8272 53.6093 26.942C52.6947 26.0569 51.4543 25.5596 50.1609 25.5596C48.8675 25.5596 47.6271 26.0569 46.7125 26.942C45.7979 27.8272 45.2841 29.0277 45.2841 30.2796V30.2796Z" stroke="black" stroke-width="0.5" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M1.62939 18.9785H19.4627V25.6485H1.62939V18.9785Z" fill="#161616" stroke="black" stroke-width="0.5" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M14.1211 7.26025H6.78524L2.80736 14.1002C2.6937 14.3002 2.59038 14.5102 2.48706 14.7202H12.1476C12.3447 14.7188 12.5391 14.676 12.7175 14.5949C12.8959 14.5138 13.0539 14.3962 13.1808 14.2502L15.1543 11.9402C15.356 11.7079 15.4659 11.4137 15.4643 11.1102V8.57025C15.4643 8.22454 15.3231 7.89285 15.0715 7.64746C14.8199 7.40207 14.4783 7.26289 14.1211 7.26025Z" fill="#8EDFF8"/>
<path d="M14.1218 7.26025H10.9705L6.83765 14.7202H12.1277C12.3249 14.7195 12.5196 14.677 12.698 14.5958C12.8765 14.5146 13.0345 14.3967 13.1609 14.2502L15.1344 11.9402C15.3361 11.7079 15.4459 11.4137 15.4443 11.1102V8.57025C15.4444 8.22795 15.3061 7.89922 15.0589 7.65439C14.8118 7.40956 14.4754 7.26809 14.1218 7.26025Z" fill="#B4EBFF"/>
<path d="M14.1211 7.26025H6.78524L2.80736 14.1002C2.6937 14.3002 2.59038 14.5102 2.48706 14.7202H12.1476C12.3447 14.7188 12.5391 14.676 12.7175 14.5949C12.8959 14.5138 13.0539 14.3962 13.1808 14.2502L15.1543 11.9402C15.356 11.7079 15.4659 11.4137 15.4643 11.1102V8.57025C15.4643 8.22454 15.3231 7.89285 15.0715 7.64746C14.8199 7.40207 14.4783 7.26289 14.1211 7.26025V7.26025Z" stroke="black" stroke-width="0.5" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M3.98599 20.1374C3.986 19.8989 3.93729 19.6627 3.84266 19.4424C3.74803 19.2222 3.60935 19.0222 3.4346 18.854C3.25985 18.6858 3.05247 18.5527 2.82438 18.4623C2.59629 18.3719 2.352 18.3261 2.10554 18.3274H1V21.9974H2.10554C2.35641 21.9988 2.605 21.9514 2.83654 21.8579C3.06807 21.7645 3.27781 21.6269 3.45326 21.4533C3.62871 21.2798 3.76629 21.0738 3.85782 20.8478C3.94934 20.6217 3.99293 20.3801 3.98599 20.1374Z" fill="#FFD66B" stroke="black" stroke-width="0.5" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M8.94653 30.279C8.94653 30.4825 8.98796 30.6841 9.06844 30.8722C9.14892 31.0602 9.26689 31.2311 9.4156 31.375C9.56431 31.5189 9.74085 31.6331 9.93516 31.711C10.1295 31.7889 10.3377 31.829 10.548 31.829C10.7583 31.829 10.9666 31.7889 11.1609 31.711C11.3552 31.6331 11.5317 31.5189 11.6804 31.375C11.8291 31.2311 11.9471 31.0602 12.0276 30.8722C12.1081 30.6841 12.1495 30.4825 12.1495 30.279C12.1495 30.0755 12.1081 29.8739 12.0276 29.6858C11.9471 29.4978 11.8291 29.3269 11.6804 29.183C11.5317 29.0391 11.3552 28.9249 11.1609 28.847C10.9666 28.7691 10.7583 28.729 10.548 28.729C10.3377 28.729 10.1295 28.7691 9.93516 28.847C9.74085 28.9249 9.56431 29.0391 9.4156 29.183C9.26689 29.3269 9.14892 29.4978 9.06844 29.6858C8.98796 29.8739 8.94653 30.0755 8.94653 30.279Z" fill="#DAEDF7" stroke="black" stroke-width="0.5" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M48.5592 30.279C48.5592 30.6901 48.7279 31.0843 49.0283 31.375C49.3286 31.6657 49.7359 31.829 50.1607 31.829C50.5854 31.829 50.9928 31.6657 51.2931 31.375C51.5934 31.0843 51.7622 30.6901 51.7622 30.279C51.7622 29.8679 51.5934 29.4737 51.2931 29.183C50.9928 28.8923 50.5854 28.729 50.1607 28.729C49.7359 28.729 49.3286 28.8923 49.0283 29.183C48.7279 29.4737 48.5592 29.8679 48.5592 30.279Z" fill="#DAEDF7" stroke="black" stroke-width="0.5" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M31.8086 14.9061V9.78369H33.107V14.9061C33.107 15.392 32.9997 15.8059 32.785 16.1477C32.5703 16.4896 32.2777 16.751 31.9072 16.9319C31.5368 17.1129 31.116 17.2034 30.6451 17.2034C30.1638 17.2034 29.7362 17.1246 29.3622 16.9671C28.9918 16.8096 28.7009 16.5683 28.4897 16.2432C28.2785 15.9182 28.1729 15.506 28.1729 15.0066H29.4817C29.4817 15.2948 29.5285 15.5277 29.6219 15.7054C29.7189 15.8796 29.8539 16.007 30.0271 16.0874C30.2037 16.1645 30.4097 16.203 30.6451 16.203C30.8702 16.203 31.0693 16.1544 31.2424 16.0572C31.419 15.9567 31.5575 15.8109 31.6579 15.6199C31.7584 15.4255 31.8086 15.1876 31.8086 14.9061Z" fill="white"/>
<path d="M39.4047 17.1028H37.7894L37.7997 16.1025H39.4047C39.8721 16.1025 40.2634 16.0036 40.5785 15.8059C40.897 15.6082 41.1359 15.325 41.2952 14.9564C41.458 14.5877 41.5393 14.1487 41.5393 13.6393V13.2422C41.5393 12.8467 41.4926 12.4965 41.3991 12.1916C41.3091 11.8866 41.174 11.6302 40.994 11.4225C40.8174 11.2147 40.5992 11.0572 40.3395 10.9499C40.0833 10.8427 39.7873 10.7891 39.4514 10.7891H37.7582V9.78369H39.4514C39.9535 9.78369 40.4123 9.8658 40.8278 10.03C41.2433 10.1909 41.6017 10.4238 41.9029 10.7287C42.2076 11.0337 42.4413 11.399 42.6041 11.8246C42.7668 12.2502 42.8482 12.7261 42.8482 13.2522V13.6393C42.8482 14.1655 42.7668 14.6413 42.6041 15.067C42.4413 15.4926 42.2076 15.8578 41.9029 16.1628C41.5982 16.4644 41.2346 16.6973 40.8122 16.8615C40.3932 17.0224 39.924 17.1028 39.4047 17.1028ZM38.5113 9.78369V17.1028H37.2076V9.78369H38.5113Z" fill="white"/>
<path d="M50.6667 16.1025V17.1028H46.6519V16.1025H50.6667ZM47.0206 9.78369V17.1028H45.717V9.78369H47.0206ZM50.1422 12.84V13.8253H46.6519V12.84H50.1422ZM50.6408 9.78369V10.7891H46.6519V9.78369H50.6408Z" fill="white"/>
</svg>

After

Width:  |  Height:  |  Size: 12 KiB

23
gradle.properties Normal file
View File

@ -0,0 +1,23 @@
# Project-wide Gradle settings.
# IDE (e.g. Android Studio) users:
# Gradle settings configured through the IDE *will override*
# any settings specified in this file.
# For more details on how to configure your build environment visit
# http://www.gradle.org/docs/current/userguide/build_environment.html
# Specifies the JVM arguments used for the daemon process.
# The setting is particularly useful for tweaking memory settings.
org.gradle.jvmargs=-Xmx2048m -Dfile.encoding=UTF-8
# When configured, Gradle will run in incubating parallel mode.
# This option should only be used with decoupled projects. For more details, visit
# https://developer.android.com/r/tools/gradle-multi-project-decoupled-projects
# org.gradle.parallel=true
# AndroidX package structure to make it clearer which packages are bundled with the
# Android operating system, and which are packaged with your app's APK
# https://developer.android.com/topic/libraries/support-library/androidx-rn
android.useAndroidX=true
# Kotlin code style for this project: "official" or "obsolete":
kotlin.code.style=official
# Enables namespacing of each library's R class so that its R class includes only the
# resources declared in the library itself and none from the library's dependencies,
# thereby reducing the size of the R class for that library
android.nonTransitiveRClass=true

48
gradle/libs.versions.toml Normal file
View File

@ -0,0 +1,48 @@
[versions]
agp = "8.4.0"
kotlin = "1.9.0"
coreKtx = "1.10.1"
junit = "4.13.2"
junitVersion = "1.1.5"
espressoCore = "3.5.1"
lifecycleRuntimeKtx = "2.6.1"
activityCompose = "1.8.0"
composeBom = "2023.08.00"
navigationCompose = "2.7.7"
serialization = "1.6.3"
okhttp = '4.12.0'
gson = "2.11.0"
mmkv = "1.3.5"
kotlinx-datetime = "0.6.0"
yandex-maps = "4.6.1-full"
kotlin-coroutines = "1.3.9"
[libraries]
androidx-core-ktx = { group = "androidx.core", name = "core-ktx", version.ref = "coreKtx" }
junit = { group = "junit", name = "junit", version.ref = "junit" }
androidx-junit = { group = "androidx.test.ext", name = "junit", version.ref = "junitVersion" }
androidx-espresso-core = { group = "androidx.test.espresso", name = "espresso-core", version.ref = "espressoCore" }
androidx-lifecycle-runtime-ktx = { group = "androidx.lifecycle", name = "lifecycle-runtime-ktx", version.ref = "lifecycleRuntimeKtx" }
androidx-activity-compose = { group = "androidx.activity", name = "activity-compose", version.ref = "activityCompose" }
androidx-compose-bom = { group = "androidx.compose", name = "compose-bom", version.ref = "composeBom" }
androidx-ui = { group = "androidx.compose.ui", name = "ui" }
androidx-ui-graphics = { group = "androidx.compose.ui", name = "ui-graphics" }
androidx-ui-tooling = { group = "androidx.compose.ui", name = "ui-tooling" }
androidx-ui-tooling-preview = { group = "androidx.compose.ui", name = "ui-tooling-preview" }
androidx-ui-test-manifest = { group = "androidx.compose.ui", name = "ui-test-manifest" }
androidx-ui-test-junit4 = { group = "androidx.compose.ui", name = "ui-test-junit4" }
androidx-material3 = { group = "androidx.compose.material3", name = "material3" }
androidx-navigation-compose = { group = "androidx.navigation", name = "navigation-compose", version.ref = "navigationCompose" }
kotlinx-serialization-json = { module = "org.jetbrains.kotlinx:kotlinx-serialization-json", version.ref = "serialization"}
okhttp = {module = "com.squareup.okhttp3:okhttp", version.ref="okhttp"}
gson = {module = "com.google.code.gson:gson", version.ref="gson"}
mmkv = {module = "com.tencent:mmkv", version.ref="mmkv"}
kotlinx-datetime = {module = "org.jetbrains.kotlinx:kotlinx-datetime", version.ref="kotlinx-datetime"}
yandex-maps = {module= "com.yandex.android:maps.mobile", version.ref="yandex-maps"}
kotlin-coroutines = {module="org.jetbrains.kotlinx:kotlinx-coroutines-android", version.ref="kotlin-coroutines"}
[plugins]
android-application = { id = "com.android.application", version.ref = "agp" }
jetbrains-kotlin-android = { id = "org.jetbrains.kotlin.android", version.ref = "kotlin"}
kotlinx-serialization = { id = "org.jetbrains.kotlin.plugin.serialization", version.ref = "kotlin" }

BIN
gradle/wrapper/gradle-wrapper.jar vendored Normal file

Binary file not shown.

View File

@ -0,0 +1,6 @@
#Mon Jun 03 16:25:10 MSK 2024
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-8.6-bin.zip
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists

185
gradlew vendored Executable file
View File

@ -0,0 +1,185 @@
#!/usr/bin/env sh
#
# Copyright 2015 the original author or authors.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
##############################################################################
##
## Gradle start up script for UN*X
##
##############################################################################
# Attempt to set APP_HOME
# Resolve links: $0 may be a link
PRG="$0"
# Need this for relative symlinks.
while [ -h "$PRG" ] ; do
ls=`ls -ld "$PRG"`
link=`expr "$ls" : '.*-> \(.*\)$'`
if expr "$link" : '/.*' > /dev/null; then
PRG="$link"
else
PRG=`dirname "$PRG"`"/$link"
fi
done
SAVED="`pwd`"
cd "`dirname \"$PRG\"`/" >/dev/null
APP_HOME="`pwd -P`"
cd "$SAVED" >/dev/null
APP_NAME="Gradle"
APP_BASE_NAME=`basename "$0"`
# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
# Use the maximum available, or set MAX_FD != -1 to use that value.
MAX_FD="maximum"
warn () {
echo "$*"
}
die () {
echo
echo "$*"
echo
exit 1
}
# OS specific support (must be 'true' or 'false').
cygwin=false
msys=false
darwin=false
nonstop=false
case "`uname`" in
CYGWIN* )
cygwin=true
;;
Darwin* )
darwin=true
;;
MINGW* )
msys=true
;;
NONSTOP* )
nonstop=true
;;
esac
CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
# Determine the Java command to use to start the JVM.
if [ -n "$JAVA_HOME" ] ; then
if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
# IBM's JDK on AIX uses strange locations for the executables
JAVACMD="$JAVA_HOME/jre/sh/java"
else
JAVACMD="$JAVA_HOME/bin/java"
fi
if [ ! -x "$JAVACMD" ] ; then
die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
Please set the JAVA_HOME variable in your environment to match the
location of your Java installation."
fi
else
JAVACMD="java"
which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
Please set the JAVA_HOME variable in your environment to match the
location of your Java installation."
fi
# Increase the maximum file descriptors if we can.
if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then
MAX_FD_LIMIT=`ulimit -H -n`
if [ $? -eq 0 ] ; then
if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
MAX_FD="$MAX_FD_LIMIT"
fi
ulimit -n $MAX_FD
if [ $? -ne 0 ] ; then
warn "Could not set maximum file descriptor limit: $MAX_FD"
fi
else
warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
fi
fi
# For Darwin, add options to specify how the application appears in the dock
if $darwin; then
GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
fi
# For Cygwin or MSYS, switch paths to Windows format before running java
if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then
APP_HOME=`cygpath --path --mixed "$APP_HOME"`
CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
JAVACMD=`cygpath --unix "$JAVACMD"`
# We build the pattern for arguments to be converted via cygpath
ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
SEP=""
for dir in $ROOTDIRSRAW ; do
ROOTDIRS="$ROOTDIRS$SEP$dir"
SEP="|"
done
OURCYGPATTERN="(^($ROOTDIRS))"
# Add a user-defined pattern to the cygpath arguments
if [ "$GRADLE_CYGPATTERN" != "" ] ; then
OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
fi
# Now convert the arguments - kludge to limit ourselves to /bin/sh
i=0
for arg in "$@" ; do
CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
else
eval `echo args$i`="\"$arg\""
fi
i=`expr $i + 1`
done
case $i in
0) set -- ;;
1) set -- "$args0" ;;
2) set -- "$args0" "$args1" ;;
3) set -- "$args0" "$args1" "$args2" ;;
4) set -- "$args0" "$args1" "$args2" "$args3" ;;
5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
esac
fi
# Escape application args
save () {
for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
echo " "
}
APP_ARGS=`save "$@"`
# Collect all arguments for the java command, following the shell quoting and substitution rules
eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS"
exec "$JAVACMD" "$@"

89
gradlew.bat vendored Normal file
View File

@ -0,0 +1,89 @@
@rem
@rem Copyright 2015 the original author or authors.
@rem
@rem Licensed under the Apache License, Version 2.0 (the "License");
@rem you may not use this file except in compliance with the License.
@rem You may obtain a copy of the License at
@rem
@rem https://www.apache.org/licenses/LICENSE-2.0
@rem
@rem Unless required by applicable law or agreed to in writing, software
@rem distributed under the License is distributed on an "AS IS" BASIS,
@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@rem See the License for the specific language governing permissions and
@rem limitations under the License.
@rem
@if "%DEBUG%" == "" @echo off
@rem ##########################################################################
@rem
@rem Gradle startup script for Windows
@rem
@rem ##########################################################################
@rem Set local scope for the variables with windows NT shell
if "%OS%"=="Windows_NT" setlocal
set DIRNAME=%~dp0
if "%DIRNAME%" == "" set DIRNAME=.
set APP_BASE_NAME=%~n0
set APP_HOME=%DIRNAME%
@rem Resolve any "." and ".." in APP_HOME to make it shorter.
for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi
@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m"
@rem Find java.exe
if defined JAVA_HOME goto findJavaFromJavaHome
set JAVA_EXE=java.exe
%JAVA_EXE% -version >NUL 2>&1
if "%ERRORLEVEL%" == "0" goto execute
echo.
echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
echo.
echo Please set the JAVA_HOME variable in your environment to match the
echo location of your Java installation.
goto fail
:findJavaFromJavaHome
set JAVA_HOME=%JAVA_HOME:"=%
set JAVA_EXE=%JAVA_HOME%/bin/java.exe
if exist "%JAVA_EXE%" goto execute
echo.
echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
echo.
echo Please set the JAVA_HOME variable in your environment to match the
echo location of your Java installation.
goto fail
:execute
@rem Setup the command line
set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
@rem Execute Gradle
"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %*
:end
@rem End local scope for the variables with windows NT shell
if "%ERRORLEVEL%"=="0" goto mainEnd
:fail
rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
rem the _cmd.exe /c_ return code!
if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
exit /b 1
:mainEnd
if "%OS%"=="Windows_NT" endlocal
:omega

3
home.svg Normal file
View File

@ -0,0 +1,3 @@
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M11.7935 2.7054L2.71043 11.7738C2.07968 12.4035 2.52567 13.4815 3.41697 13.4815H3.69643C4.24871 13.4815 4.69643 13.9292 4.69643 14.4815V21C4.69643 21.5523 5.14415 22 5.69643 22H9.03572C9.588 22 10.0357 21.5523 10.0357 21V17.0741C10.0357 16.5218 10.4834 16.0741 11.0357 16.0741H12.5H13.9643C14.5166 16.0741 14.9643 16.5218 14.9643 17.0741V21C14.9643 21.5523 15.412 22 15.9643 22H19.3036C19.8559 22 20.3036 21.5523 20.3036 21V14.4815C20.3036 13.9292 20.7513 13.4815 21.3036 13.4815H21.583C22.4743 13.4815 22.9203 12.4035 22.2896 11.7738L13.2065 2.7054C12.8161 2.31563 12.1839 2.31563 11.7935 2.7054Z" stroke="#A8A8A8" stroke-width="1.15"/>
</svg>

After

Width:  |  Height:  |  Size: 750 B

11
home_active.svg Normal file
View File

@ -0,0 +1,11 @@
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M7.625 13.8442H6.375C6.05141 13.8442 5.78906 14.1204 5.78906 14.4611C5.78906 14.8018 6.05141 15.078 6.375 15.078H7.625C7.94859 15.078 8.21094 14.8018 8.21094 14.4611C8.21094 14.1204 7.94859 13.8442 7.625 13.8442Z" fill="black"/>
<path d="M7.625 16.4761H6.375C6.05141 16.4761 5.78906 16.7523 5.78906 17.093C5.78906 17.4336 6.05141 17.7098 6.375 17.7098H7.625C7.94859 17.7098 8.21094 17.4336 8.21094 17.093C8.21094 16.7523 7.94859 16.4761 7.625 16.4761Z" fill="black"/>
<path d="M12.625 11.2122H11.375C11.0514 11.2122 10.7891 11.4884 10.7891 11.829C10.7891 12.1697 11.0514 12.4459 11.375 12.4459H12.625C12.9486 12.4459 13.2109 12.1697 13.2109 11.829C13.2109 11.4884 12.9486 11.2122 12.625 11.2122Z" fill="black"/>
<path d="M12.625 13.8442H11.375C11.0514 13.8442 10.7891 14.1204 10.7891 14.4611C10.7891 14.8018 11.0514 15.078 11.375 15.078H12.625C12.9486 15.078 13.2109 14.8018 13.2109 14.4611C13.2109 14.1204 12.9486 13.8442 12.625 13.8442Z" fill="black"/>
<path d="M12.625 16.4761H11.375C11.0514 16.4761 10.7891 16.7523 10.7891 17.093C10.7891 17.4336 11.0514 17.7098 11.375 17.7098H12.625C12.9486 17.7098 13.2109 17.4336 13.2109 17.093C13.2109 16.7523 12.9486 16.4761 12.625 16.4761Z" fill="black"/>
<path d="M17.625 11.2122H16.375C16.0514 11.2122 15.7891 11.4884 15.7891 11.829C15.7891 12.1697 16.0514 12.4459 16.375 12.4459H17.625C17.9486 12.4459 18.2109 12.1697 18.2109 11.829C18.2109 11.4884 17.9486 11.2122 17.625 11.2122Z" fill="black"/>
<path d="M17.625 13.8442H16.375C16.0514 13.8442 15.7891 14.1204 15.7891 14.4611C15.7891 14.8018 16.0514 15.078 16.375 15.078H17.625C17.9486 15.078 18.2109 14.8018 18.2109 14.4611C18.2109 14.1204 17.9486 13.8442 17.625 13.8442Z" fill="black"/>
<path d="M17.625 16.4761H16.375C16.0514 16.4761 15.7891 16.7523 15.7891 17.093C15.7891 17.4336 16.0514 17.7098 16.375 17.7098H17.625C17.9486 17.7098 18.2109 17.4336 18.2109 17.093C18.2109 16.7523 17.9486 16.4761 17.625 16.4761Z" fill="black"/>
<path d="M20.2422 3.64502H18.8359V2.61688C18.8359 2.2762 18.5736 2 18.25 2C17.9264 2 17.6641 2.2762 17.6641 2.61688V3.64502H12.5859H11.4141H6.33594V2.61688C6.33594 2.2762 6.07359 2 5.75 2C5.42641 2 5.16406 2.2762 5.16406 2.61688V3.64502H3.75781C2.78855 3.64502 2 4.47522 2 5.49567V19.1494C2 20.1698 2.78855 21 3.75781 21H20.2422C21.2114 21 22 20.1698 22 19.1494C22 18.7512 22 5.84215 22 5.49567C22 4.47522 21.2114 3.64502 20.2422 3.64502ZM3.17188 5.49567C3.17188 5.15552 3.43473 4.87879 3.75781 4.87879H5.16406V5.90693C5.16406 6.24761 5.42641 6.52381 5.75 6.52381C6.07359 6.52381 6.33594 6.24761 6.33594 5.90693V4.87879H11.4141H12.5859H17.6641V5.90693C17.6641 6.24761 17.9264 6.52381 18.25 6.52381C18.5736 6.52381 18.8359 6.24761 18.8359 5.90693V4.87879H20.2422C20.5653 4.87879 20.8281 5.15552 20.8281 5.49567V7.92208H3.17188V5.49567ZM20.2422 19.7662H3.75781C3.43473 19.7662 3.17188 19.4895 3.17188 19.1494V9.15584H20.8281V19.1494C20.8281 19.4895 20.5653 19.7662 20.2422 19.7662Z" fill="black"/>
</svg>

After

Width:  |  Height:  |  Size: 3.0 KiB

28
hotTransport.svg Normal file
View File

@ -0,0 +1,28 @@
<svg width="62" height="37" viewBox="0 0 62 37" fill="none" xmlns="http://www.w3.org/2000/svg">
<path opacity="0.15" d="M3.13913 35C3.13913 35.5304 6.07825 36.0391 11.3099 36.4142C16.5416 36.7893 23.6373 37 31.036 37C38.4347 37 45.5303 36.7893 50.762 36.4142C55.9937 36.0391 58.9328 35.5304 58.9328 35C58.9328 34.4696 55.9937 33.9609 50.762 33.5858C45.5303 33.2107 38.4347 33 31.036 33C23.6373 33 16.5416 33.2107 11.3099 33.5858C6.07825 33.9609 3.13913 34.4696 3.13913 35Z" fill="black"/>
<path d="M19.4627 25.6592H1.62943V18.4693C1.63191 16.9394 2.03729 15.4354 2.80729 14.0993L7.38444 6.23929C7.81634 5.49276 8.44616 4.87125 9.20896 4.43883C9.97176 4.00641 10.8399 3.77874 11.7239 3.7793H19.4627V25.6592Z" fill="#DCDCD9"/>
<path d="M11.7239 3.7793C10.8399 3.77874 9.97176 4.00641 9.20896 4.43883C8.44616 4.87125 7.81634 5.49276 7.38444 6.23929L2.81762 14.0993C2.04145 15.4334 1.63231 16.9382 1.62943 18.4693V21.7592C1.6313 20.2312 2.04056 18.7294 2.81762 17.3993L7.38444 9.52928C7.8185 8.78531 8.44908 8.16637 9.2116 7.73587C9.97412 7.30537 10.8412 7.07877 11.7239 7.07929H19.4627V3.7793H11.7239Z" fill="white"/>
<path d="M19.4627 25.6592H1.62943V18.4693C1.63191 16.9394 2.03729 15.4354 2.80729 14.0993L7.38444 6.23929C7.81634 5.49276 8.44616 4.87125 9.20896 4.43883C9.97176 4.00641 10.8399 3.77874 11.7239 3.7793H19.4627V25.6592Z" stroke="black" stroke-width="0.5" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M1.0737 24.999H61.0002V30.999H1.0737V24.999Z" fill="#161616"/>
<path d="M59.2568 24.9991H2.80365C2.34484 24.9991 1.90482 25.136 1.58039 25.3797C1.25596 25.6234 1.0737 25.9539 1.0737 26.2985V28.999C1.0737 28.6544 1.25596 28.3238 1.58039 28.0801C1.90482 27.8364 2.34484 27.6995 2.80365 27.6995H59.2568C59.4851 27.6982 59.7115 27.7308 59.9229 27.7955C60.1344 27.8602 60.3267 27.9557 60.4888 28.0765C60.6508 28.1973 60.7795 28.341 60.8673 28.4994C60.955 28.6577 61.0002 28.8275 61.0002 28.999V26.2985C61.0002 26.127 60.955 25.9572 60.8673 25.7989C60.7795 25.6406 60.6508 25.4969 60.4888 25.3761C60.3267 25.2553 60.1344 25.1598 59.9229 25.0951C59.7115 25.0303 59.4851 24.9977 59.2568 24.9991Z" fill="#494949"/>
<path d="M1.0737 24.999H61.0002V30.999H1.0737V24.999Z" stroke="black" stroke-width="0.5" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M21.7689 1H58.9C59.4567 1 59.9905 1.1286 60.3841 1.35752C60.7777 1.58644 60.9988 1.89692 60.9988 2.22065V24.9999H19.6701V2.22065C19.6701 1.89692 19.8913 1.58644 20.2848 1.35752C20.6784 1.1286 21.2122 1 21.7689 1Z" fill="#FF5722"/>
<path d="M58.8806 1H21.7721C21.2147 1 20.68 1.11884 20.2858 1.33038C19.8916 1.54191 19.6701 1.82882 19.6701 2.12798V4.99999C19.6701 4.70083 19.8916 4.41392 20.2858 4.20239C20.68 3.99085 21.2147 3.87201 21.7721 3.87201H58.8806C59.4396 3.872 59.9759 3.99056 60.3727 4.20185C60.7695 4.41314 60.9945 4.70003 60.9988 4.99999V2.12798C60.9945 1.82803 60.7695 1.54114 60.3727 1.32985C59.9759 1.11855 59.4396 0.999991 58.8806 1Z" fill="#FF9B7C"/>
<path d="M21.7689 1H58.9C59.4567 1 59.9905 1.1286 60.3841 1.35752C60.7777 1.58644 60.9988 1.89692 60.9988 2.22065V24.9999H19.6701V2.22065C19.6701 1.89692 19.8913 1.58644 20.2848 1.35752C20.6784 1.1286 21.2122 1 21.7689 1Z" stroke="black" stroke-width="0.5" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M5.66956 30.2796C5.66956 30.8994 5.7957 31.5132 6.04078 32.0858C6.28586 32.6585 6.64508 33.1788 7.09793 33.6171C7.55078 34.0554 8.08839 34.4031 8.68007 34.6403C9.27175 34.8775 9.90591 34.9995 10.5463 34.9995C11.1868 34.9995 11.8209 34.8775 12.4126 34.6403C13.0043 34.4031 13.5419 34.0554 13.9947 33.6171C14.4476 33.1788 14.8068 32.6585 15.0519 32.0858C15.297 31.5132 15.4231 30.8994 15.4231 30.2796C15.4231 29.6597 15.297 29.046 15.0519 28.4733C14.8068 27.9006 14.4476 27.3803 13.9947 26.942C13.5419 26.5037 13.0043 26.1561 12.4126 25.9189C11.8209 25.6817 11.1868 25.5596 10.5463 25.5596C9.90591 25.5596 9.27175 25.6817 8.68007 25.9189C8.08839 26.1561 7.55078 26.5037 7.09793 26.942C6.64508 27.3803 6.28586 27.9006 6.04078 28.4733C5.7957 29.046 5.66956 29.6597 5.66956 30.2796Z" fill="#656769"/>
<path d="M45.2841 30.2796C45.2841 31.5314 45.7979 32.7319 46.7125 33.6171C47.6271 34.5023 48.8675 34.9995 50.1609 34.9995C51.4543 34.9995 52.6947 34.5023 53.6093 33.6171C54.5239 32.7319 55.0377 31.5314 55.0377 30.2796C55.0377 29.0277 54.5239 27.8272 53.6093 26.942C52.6947 26.0569 51.4543 25.5596 50.1609 25.5596C48.8675 25.5596 47.6271 26.0569 46.7125 26.942C45.7979 27.8272 45.2841 29.0277 45.2841 30.2796Z" fill="#656769"/>
<path d="M10.5463 27.4286C11.6714 27.4295 12.7618 27.806 13.6333 28.4946C14.5048 29.1833 15.1042 30.1419 15.3301 31.2086C15.4702 30.5243 15.4518 29.8184 15.2763 29.1418C15.1008 28.4652 14.7724 27.8347 14.315 27.2956C13.8575 26.7565 13.2822 26.3222 12.6306 26.0241C11.979 25.7259 11.2671 25.5713 10.5463 25.5713C9.82555 25.5713 9.11372 25.7259 8.46208 26.0241C7.81043 26.3222 7.23518 26.7565 6.7777 27.2956C6.32023 27.8347 5.99191 28.4652 5.81638 29.1418C5.64084 29.8184 5.62246 30.5243 5.76255 31.2086C5.98851 30.1419 6.58785 29.1833 7.45938 28.4946C8.3309 27.806 9.42124 27.4295 10.5463 27.4286Z" fill="#525252"/>
<path d="M50.1609 27.4286C51.286 27.4295 52.3763 27.806 53.2479 28.4946C54.1194 29.1833 54.7187 30.1419 54.9447 31.2086C55.0848 30.5243 55.0664 29.8184 54.8909 29.1418C54.7153 28.4652 54.387 27.8347 53.9295 27.2956C53.4721 26.7565 52.8968 26.3222 52.2452 26.0241C51.5935 25.7259 50.8817 25.5713 50.1609 25.5713C49.4401 25.5713 48.7283 25.7259 48.0766 26.0241C47.425 26.3222 46.8497 26.7565 46.3923 27.2956C45.9348 27.8347 45.6065 28.4652 45.4309 29.1418C45.2554 29.8184 45.237 30.5243 45.3771 31.2086C45.6031 30.1419 46.2024 29.1833 47.0739 28.4946C47.9455 27.806 49.0358 27.4295 50.1609 27.4286Z" fill="#525252"/>
<path d="M5.66956 30.2796C5.66956 30.8994 5.7957 31.5132 6.04078 32.0858C6.28586 32.6585 6.64508 33.1788 7.09793 33.6171C7.55078 34.0554 8.08839 34.4031 8.68007 34.6403C9.27175 34.8775 9.90591 34.9995 10.5463 34.9995C11.1868 34.9995 11.8209 34.8775 12.4126 34.6403C13.0043 34.4031 13.5419 34.0554 13.9947 33.6171C14.4476 33.1788 14.8068 32.6585 15.0519 32.0858C15.297 31.5132 15.4231 30.8994 15.4231 30.2796C15.4231 29.6597 15.297 29.046 15.0519 28.4733C14.8068 27.9006 14.4476 27.3803 13.9947 26.942C13.5419 26.5037 13.0043 26.1561 12.4126 25.9189C11.8209 25.6817 11.1868 25.5596 10.5463 25.5596C9.90591 25.5596 9.27175 25.6817 8.68007 25.9189C8.08839 26.1561 7.55078 26.5037 7.09793 26.942C6.64508 27.3803 6.28586 27.9006 6.04078 28.4733C5.7957 29.046 5.66956 29.6597 5.66956 30.2796V30.2796Z" stroke="black" stroke-width="0.5" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M45.2841 30.2796C45.2841 31.5314 45.7979 32.7319 46.7125 33.6171C47.6271 34.5023 48.8675 34.9995 50.1609 34.9995C51.4543 34.9995 52.6947 34.5023 53.6093 33.6171C54.5239 32.7319 55.0377 31.5314 55.0377 30.2796C55.0377 29.0277 54.5239 27.8272 53.6093 26.942C52.6947 26.0569 51.4543 25.5596 50.1609 25.5596C48.8675 25.5596 47.6271 26.0569 46.7125 26.942C45.7979 27.8272 45.2841 29.0277 45.2841 30.2796V30.2796Z" stroke="black" stroke-width="0.5" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M1.62943 18.9785H19.4627V25.6485H1.62943V18.9785Z" fill="#161616" stroke="black" stroke-width="0.5" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M14.1211 7.26025H6.78524L2.80736 14.1002C2.6937 14.3002 2.59038 14.5102 2.48706 14.7202H12.1476C12.3447 14.7188 12.5391 14.676 12.7175 14.5949C12.8959 14.5138 13.0539 14.3962 13.1808 14.2502L15.1543 11.9402C15.356 11.7079 15.4659 11.4137 15.4643 11.1102V8.57025C15.4643 8.22454 15.3231 7.89285 15.0715 7.64746C14.8199 7.40207 14.4783 7.26289 14.1211 7.26025Z" fill="#8EDFF8"/>
<path d="M14.1218 7.26025H10.9705L6.83765 14.7202H12.1277C12.3249 14.7195 12.5196 14.677 12.698 14.5958C12.8765 14.5146 13.0345 14.3967 13.1609 14.2502L15.1344 11.9402C15.3361 11.7079 15.4459 11.4137 15.4443 11.1102V8.57025C15.4444 8.22795 15.3061 7.89922 15.0589 7.65439C14.8118 7.40956 14.4754 7.26809 14.1218 7.26025Z" fill="#B4EBFF"/>
<path d="M14.1211 7.26025H6.78524L2.80736 14.1002C2.6937 14.3002 2.59038 14.5102 2.48706 14.7202H12.1476C12.3447 14.7188 12.5391 14.676 12.7175 14.5949C12.8959 14.5138 13.0539 14.3962 13.1808 14.2502L15.1543 11.9402C15.356 11.7079 15.4659 11.4137 15.4643 11.1102V8.57025C15.4643 8.22454 15.3231 7.89285 15.0715 7.64746C14.8199 7.40207 14.4783 7.26289 14.1211 7.26025V7.26025Z" stroke="black" stroke-width="0.5" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M3.98599 20.1374C3.986 19.8989 3.93729 19.6627 3.84266 19.4424C3.74803 19.2222 3.60935 19.0222 3.4346 18.854C3.25985 18.6858 3.05247 18.5527 2.82438 18.4623C2.59629 18.3719 2.352 18.3261 2.10554 18.3274H1V21.9974H2.10554C2.35641 21.9988 2.605 21.9514 2.83654 21.8579C3.06807 21.7645 3.27781 21.6269 3.45326 21.4533C3.62871 21.2798 3.76629 21.0738 3.85782 20.8478C3.94934 20.6217 3.99293 20.3801 3.98599 20.1374Z" fill="#FFD66B" stroke="black" stroke-width="0.5" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M8.94653 30.279C8.94653 30.4825 8.98796 30.6841 9.06844 30.8722C9.14892 31.0602 9.26689 31.2311 9.4156 31.375C9.56431 31.5189 9.74085 31.6331 9.93516 31.711C10.1295 31.7889 10.3377 31.829 10.548 31.829C10.7583 31.829 10.9666 31.7889 11.1609 31.711C11.3552 31.6331 11.5317 31.5189 11.6804 31.375C11.8291 31.2311 11.9471 31.0602 12.0276 30.8722C12.1081 30.6841 12.1495 30.4825 12.1495 30.279C12.1495 30.0755 12.1081 29.8739 12.0276 29.6858C11.9471 29.4978 11.8291 29.3269 11.6804 29.183C11.5317 29.0391 11.3552 28.9249 11.1609 28.847C10.9666 28.7691 10.7583 28.729 10.548 28.729C10.3377 28.729 10.1295 28.7691 9.93516 28.847C9.74085 28.9249 9.56431 29.0391 9.4156 29.183C9.26689 29.3269 9.14892 29.4978 9.06844 29.6858C8.98796 29.8739 8.94653 30.0755 8.94653 30.279Z" fill="#DAEDF7" stroke="black" stroke-width="0.5" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M48.5592 30.279C48.5592 30.6901 48.728 31.0843 49.0283 31.375C49.3286 31.6657 49.736 31.829 50.1607 31.829C50.5855 31.829 50.9928 31.6657 51.2931 31.375C51.5935 31.0843 51.7622 30.6901 51.7622 30.279C51.7622 29.8679 51.5935 29.4737 51.2931 29.183C50.9928 28.8923 50.5855 28.729 50.1607 28.729C49.736 28.729 49.3286 28.8923 49.0283 29.183C48.728 29.4737 48.5592 29.8679 48.5592 30.279Z" fill="#DAEDF7" stroke="black" stroke-width="0.5" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M31.8086 14.9061V9.78369H33.107V14.9061C33.107 15.392 32.9997 15.8059 32.785 16.1477C32.5703 16.4896 32.2777 16.751 31.9072 16.9319C31.5368 17.1129 31.116 17.2034 30.6451 17.2034C30.1638 17.2034 29.7362 17.1246 29.3622 16.9671C28.9918 16.8096 28.7009 16.5683 28.4897 16.2432C28.2785 15.9182 28.1729 15.506 28.1729 15.0066H29.4817C29.4817 15.2948 29.5285 15.5277 29.6219 15.7054C29.7189 15.8796 29.8539 16.007 30.0271 16.0874C30.2037 16.1645 30.4097 16.203 30.6451 16.203C30.8702 16.203 31.0693 16.1544 31.2424 16.0572C31.419 15.9567 31.5575 15.8109 31.6579 15.6199C31.7584 15.4255 31.8086 15.1876 31.8086 14.9061Z" fill="white"/>
<path d="M39.4047 17.1028H37.7894L37.7997 16.1025H39.4047C39.8721 16.1025 40.2634 16.0036 40.5785 15.8059C40.897 15.6082 41.1359 15.325 41.2952 14.9564C41.458 14.5877 41.5393 14.1487 41.5393 13.6393V13.2422C41.5393 12.8467 41.4926 12.4965 41.3991 12.1916C41.3091 11.8866 41.174 11.6302 40.994 11.4225C40.8174 11.2147 40.5992 11.0572 40.3395 10.9499C40.0833 10.8427 39.7873 10.7891 39.4514 10.7891H37.7582V9.78369H39.4514C39.9535 9.78369 40.4123 9.8658 40.8278 10.03C41.2433 10.1909 41.6017 10.4238 41.9029 10.7287C42.2076 11.0337 42.4413 11.399 42.6041 11.8246C42.7668 12.2502 42.8482 12.7261 42.8482 13.2522V13.6393C42.8482 14.1655 42.7668 14.6413 42.6041 15.067C42.4413 15.4926 42.2076 15.8578 41.9029 16.1628C41.5982 16.4644 41.2346 16.6973 40.8122 16.8615C40.3932 17.0224 39.924 17.1028 39.4047 17.1028ZM38.5113 9.78369V17.1028H37.2076V9.78369H38.5113Z" fill="white"/>
<path d="M50.6667 16.1025V17.1028H46.6518V16.1025H50.6667ZM47.0206 9.78369V17.1028H45.7169V9.78369H47.0206ZM50.1421 12.84V13.8253H46.6518V12.84H50.1421ZM50.6407 9.78369V10.7891H46.6518V9.78369H50.6407Z" fill="white"/>
</svg>

After

Width:  |  Height:  |  Size: 12 KiB

3
location.svg Normal file
View File

@ -0,0 +1,3 @@
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M21.2582 2.73383C20.9308 2.4044 20.5177 2.17324 20.0657 2.06654C19.6137 1.95983 19.1409 1.98182 18.7008 2.13002L3.15361 7.31424C2.81772 7.42609 2.52554 7.64088 2.31848 7.92815C2.11143 8.21543 2 8.56062 2 8.91479C2 9.26897 2.11143 9.61416 2.31848 9.90143C2.52554 10.1887 2.81772 10.4035 3.15361 10.5153L10.708 13.0343C10.767 13.0541 10.8207 13.0873 10.8647 13.1313C10.9087 13.1754 10.9419 13.229 10.9616 13.2881L13.4794 20.846C13.5883 21.1845 13.8027 21.4792 14.0912 21.6869C14.3797 21.8946 14.7271 22.0042 15.0825 21.9999C15.4378 22.0042 15.785 21.8946 16.0735 21.6871C16.362 21.4796 16.5765 21.1852 16.6856 20.847L21.8721 5.29339C22.0194 4.85201 22.0399 4.37816 21.9314 3.92569C21.8229 3.47322 21.5896 3.06028 21.2582 2.73383ZM20.7867 4.93393L15.6002 20.4875C15.5652 20.5989 15.4949 20.6959 15.4 20.764C15.3051 20.832 15.1908 20.8675 15.074 20.8649C14.9575 20.8674 14.8432 20.8319 14.7485 20.7639C14.6538 20.6958 14.5837 20.5989 14.5488 20.4875L12.0385 12.9296C11.9627 12.7036 11.8356 12.4982 11.667 12.3295C11.4985 12.1609 11.2932 12.0337 11.0672 11.9579L3.51195 9.44076C3.40177 9.4038 3.30598 9.33314 3.23811 9.23876C3.17024 9.14439 3.13373 9.03106 3.13373 8.91479C3.13373 8.79853 3.17024 8.6852 3.23811 8.59082C3.30598 8.49644 3.40177 8.42578 3.51195 8.38882L19.0582 3.19989C19.299 3.11955 19.5573 3.10789 19.8043 3.16621C20.0513 3.22453 20.2772 3.35052 20.4567 3.53007C20.6362 3.70961 20.7621 3.93561 20.8204 4.18274C20.8787 4.42986 20.867 4.68835 20.7867 4.92922V4.93393Z" fill="black"/>
</svg>

After

Width:  |  Height:  |  Size: 1.6 KiB

24
settings.gradle.kts Normal file
View File

@ -0,0 +1,24 @@
pluginManagement {
repositories {
google {
content {
includeGroupByRegex("com\\.android.*")
includeGroupByRegex("com\\.google.*")
includeGroupByRegex("androidx.*")
}
}
mavenCentral()
gradlePluginPortal()
}
}
dependencyResolutionManagement {
repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
repositories {
google()
mavenCentral()
}
}
rootProject.name = "MPDriver"
include(":app")

4
tick_default.svg Normal file
View File

@ -0,0 +1,4 @@
<svg width="32" height="32" viewBox="0 0 32 32" fill="none" xmlns="http://www.w3.org/2000/svg">
<circle cx="16" cy="16" r="16" fill="#D6D6D6"/>
<path d="M8 13.2857L15 24L24 10" stroke="white" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
</svg>

After

Width:  |  Height:  |  Size: 265 B

11
yanavi.svg Normal file
View File

@ -0,0 +1,11 @@
<svg width="30" height="30" viewBox="0 0 30 30" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M13.1278 16.8797L17.8158 30L30 0L0 12.1917L13.1278 16.8797Z" fill="url(#paint0_linear_87_4009)"/>
<path d="M17.8158 30L30 0L12.6598 17.3478L17.8158 30Z" fill="#FFC700"/>
<path d="M15.9361 14.0639L0 12.1918L12.1917 17.8158L17.8158 30L15.9361 14.0639Z" fill="#ECA704"/>
<defs>
<linearGradient id="paint0_linear_87_4009" x1="0.0124129" y1="30.0113" x2="30.0137" y2="0.0100685" gradientUnits="userSpaceOnUse">
<stop stop-color="#FFCC00"/>
<stop offset="1" stop-color="#FFE992"/>
</linearGradient>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 613 B

12
Иконка лупа.svg Normal file
View File

@ -0,0 +1,12 @@
<svg width="54" height="56" viewBox="0 0 54 56" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M34.9588 6.84882C32.2662 4.12901 28.8516 2.25237 25.1263 1.44488C21.4009 0.637399 17.5236 0.933501 13.9612 2.29753C10.3988 3.66157 7.3032 6.03537 5.04719 9.1331C2.79119 12.2308 1.47095 15.9204 1.24546 19.7575C1.01997 23.5947 1.89884 27.4158 3.77624 30.7607C5.65365 34.1056 8.44953 36.8317 11.8272 38.6108C15.2049 40.3899 19.0204 41.146 22.8143 40.7882C26.6081 40.4304 30.2185 38.9739 33.2108 36.594L36.1964 39.6059L39.4882 36.2851L36.5026 33.2733C39.497 29.4419 40.9937 24.6355 40.7092 19.765C40.4246 14.8946 38.3785 10.2988 34.9588 6.84882Z" fill="#F1F1F1"/>
<path d="M7.01649 10.9808C9.65573 8.31359 12.9911 6.45671 16.635 5.62597C20.2789 4.79522 24.0817 5.02473 27.6014 6.28782C31.1212 7.5509 34.2133 9.7957 36.5185 12.7613C38.8236 15.727 40.2472 19.2916 40.6237 23.0411C40.9134 20.264 40.6212 17.4565 39.766 14.8007C38.9109 12.1449 37.5119 9.70003 35.6598 7.62475C33.8078 5.54948 31.5439 3.8901 29.0152 2.75425C26.4865 1.61839 23.7493 1.03143 20.9812 1.03143C18.2131 1.03143 15.476 1.61839 12.9472 2.75425C10.4185 3.8901 8.15468 5.54948 6.3026 7.62475C4.45052 9.70003 3.05155 12.1449 2.1964 14.8007C1.34126 17.4565 1.04906 20.264 1.33874 23.0411C1.78982 18.479 3.79661 14.2163 7.01649 10.9808Z" fill="#E3E3E3"/>
<path d="M34.9588 6.84882C32.2662 4.12901 28.8516 2.25237 25.1263 1.44488C21.4009 0.637399 17.5236 0.933501 13.9612 2.29753C10.3988 3.66157 7.3032 6.03537 5.04719 9.1331C2.79119 12.2308 1.47095 15.9204 1.24546 19.7575C1.01997 23.5947 1.89884 27.4158 3.77624 30.7607C5.65365 34.1056 8.44953 36.8317 11.8272 38.6108C15.2049 40.3899 19.0204 41.146 22.8143 40.7882C26.6081 40.4304 30.2185 38.9739 33.2108 36.594L36.1964 39.6059L39.4882 36.2851L36.5026 33.2733C39.497 29.4419 40.9937 24.6355 40.7092 19.765C40.4246 14.8946 38.3785 10.2988 34.9588 6.84882V6.84882Z" stroke="#45413C" stroke-width="0.5" stroke-linecap="round" stroke-linejoin="round"/>
<path opacity="0.15" d="M1 53.5088C1 54.1695 3.71566 54.8031 8.54958 55.2703C13.3835 55.7375 19.9397 56 26.7759 56C33.612 56 40.1682 55.7375 45.0022 55.2703C49.8361 54.8031 52.5517 54.1695 52.5517 53.5088C52.5517 52.848 49.8361 52.2144 45.0022 51.7472C40.1682 51.28 33.612 51.0175 26.7759 51.0175C19.9397 51.0175 13.3835 51.28 8.54958 51.7472C3.71566 52.2144 1 52.848 1 53.5088Z" fill="#45413C"/>
<path d="M5.29407 20.9426C5.29407 23.0217 5.69999 25.0803 6.48867 27.0011C7.27734 28.9219 8.43332 30.6671 9.89061 32.1372C11.3479 33.6073 13.0779 34.7734 14.982 35.569C16.886 36.3646 18.9267 36.7741 20.9876 36.7741C23.0485 36.7741 25.0893 36.3646 26.9933 35.569C28.8973 34.7734 30.6274 33.6073 32.0847 32.1372C33.5419 30.6671 34.6979 28.9219 35.4866 27.0011C36.2753 25.0803 36.6812 23.0217 36.6812 20.9426C36.6812 18.8636 36.2753 16.805 35.4866 14.8842C34.6979 12.9634 33.5419 11.2182 32.0847 9.74808C30.6274 8.27799 28.8973 7.11185 26.9933 6.31625C25.0893 5.52064 23.0485 5.11115 20.9876 5.11115C18.9267 5.11115 16.886 5.52064 14.982 6.31625C13.0779 7.11185 11.3479 8.27799 9.89061 9.74808C8.43332 11.2182 7.27734 12.9634 6.48867 14.8842C5.69999 16.805 5.29407 18.8636 5.29407 20.9426Z" fill="#CBE9F3"/>
<path d="M9.88733 9.6934C7.25544 12.3409 5.64134 15.8454 5.33287 19.5819C5.0244 23.3184 6.04163 27.044 8.20314 30.0941L28.9493 7.32511C25.9612 5.53234 22.4673 4.79212 19.0168 5.22082C15.5663 5.64952 12.3549 7.22282 9.88733 9.6934Z" fill="#E7F5FA"/>
<path d="M5.29407 20.9426C5.29407 23.0217 5.69999 25.0803 6.48867 27.0011C7.27734 28.9219 8.43332 30.6671 9.89061 32.1372C11.3479 33.6073 13.0779 34.7734 14.982 35.569C16.886 36.3646 18.9267 36.7741 20.9876 36.7741C23.0485 36.7741 25.0893 36.3646 26.9933 35.569C28.8973 34.7734 30.6274 33.6073 32.0847 32.1372C33.5419 30.6671 34.6979 28.9219 35.4866 27.0011C36.2753 25.0803 36.6812 23.0217 36.6812 20.9426C36.6812 18.8636 36.2753 16.805 35.4866 14.8842C34.6979 12.9634 33.5419 11.2182 32.0847 9.74808C30.6274 8.27799 28.8973 7.11185 26.9933 6.31625C25.0893 5.52064 23.0485 5.11115 20.9876 5.11115C18.9267 5.11115 16.886 5.52064 14.982 6.31625C13.0779 7.11185 11.3479 8.27799 9.89061 9.74808C8.43332 11.2182 7.27734 12.9634 6.48867 14.8842C5.69999 16.805 5.29407 18.8636 5.29407 20.9426V20.9426Z" stroke="#45413C" stroke-width="0.5" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M51.8133 46.2345L40.713 35.0366C40.4935 34.8189 40.1979 34.6968 39.89 34.6968C39.5822 34.6968 39.2866 34.8189 39.0671 35.0366L34.9587 39.1811C34.7428 39.4026 34.6219 39.7007 34.6219 40.0113C34.6219 40.3219 34.7428 40.62 34.9587 40.8415L46.059 52.0394C46.8283 52.7784 47.8534 53.1848 48.9156 53.1717C49.9778 53.1587 50.9929 52.7272 51.744 51.9694C52.4952 51.2117 52.9229 50.1877 52.9358 49.1162C52.9488 48.0447 52.5459 47.0105 51.8133 46.2345Z" fill="#E5332A"/>
<path d="M51.8134 46.2345L40.713 35.0366C40.4935 34.8189 40.1979 34.6968 39.8901 34.6968C39.5822 34.6968 39.2867 34.8189 39.0671 35.0366L36.5153 37.6108C36.6232 37.5015 36.7514 37.4147 36.8927 37.3555C37.0339 37.2963 37.1853 37.2658 37.3383 37.2658C37.4912 37.2658 37.6426 37.2963 37.7839 37.3555C37.9251 37.4147 38.0533 37.5015 38.1612 37.6108L49.2616 48.8087C49.7903 49.3423 50.1621 50.0133 50.3355 50.7472C50.509 51.4812 50.4773 52.2492 50.244 52.9661C50.8535 52.7745 51.4089 52.4391 51.8644 51.9879C52.6019 51.2118 53.0094 50.1757 52.9998 49.1007C52.9903 48.0257 52.5645 46.9971 51.8134 46.2345Z" fill="#CD1D15"/>
<path d="M51.8133 46.2345L40.713 35.0366C40.4935 34.8189 40.1979 34.6968 39.89 34.6968C39.5822 34.6968 39.2866 34.8189 39.0671 35.0366L34.9587 39.1811C34.7428 39.4026 34.6219 39.7007 34.6219 40.0113C34.6219 40.3219 34.7428 40.62 34.9587 40.8415L46.059 52.0394C46.8283 52.7784 47.8534 53.1848 48.9156 53.1717C49.9778 53.1587 50.9929 52.7272 51.744 51.9694C52.4952 51.2117 52.9229 50.1877 52.9358 49.1162C52.9488 48.0447 52.5459 47.0105 51.8133 46.2345V46.2345Z" stroke="#45413C" stroke-width="0.5" stroke-linecap="round" stroke-linejoin="round"/>
</svg>

After

Width:  |  Height:  |  Size: 5.8 KiB