[
  {
    "path": ".gitignore",
    "content": "*.iml\n.gradle\n/local.properties\n/.idea/caches\n/.idea/libraries\n/.idea/modules.xml\n/.idea/workspace.xml\n/.idea/navEditor.xml\n/.idea/assetWizardSettings.xml\n.DS_Store\n/build\n/captures\n.externalNativeBuild\n.cxx\nlocal.properties\n"
  },
  {
    "path": ".idea/.gitignore",
    "content": "# Default ignored files\n/shelf/\n/workspace.xml\n"
  },
  {
    "path": ".idea/.name",
    "content": "Forest"
  },
  {
    "path": ".idea/AndroidProjectSystem.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"AndroidProjectSystem\">\n    <option name=\"providerId\" value=\"com.android.tools.idea.GradleProjectSystem\" />\n  </component>\n</project>"
  },
  {
    "path": ".idea/codeStyles/Project.xml",
    "content": "<component name=\"ProjectCodeStyleConfiguration\">\n  <code_scheme name=\"Project\" version=\"173\">\n    <JavaCodeStyleSettings>\n      <option name=\"IMPORT_LAYOUT_TABLE\">\n        <value>\n          <package name=\"\" withSubpackages=\"true\" static=\"false\" module=\"true\" />\n          <package name=\"android\" withSubpackages=\"true\" static=\"true\" />\n          <package name=\"androidx\" withSubpackages=\"true\" static=\"true\" />\n          <package name=\"com\" withSubpackages=\"true\" static=\"true\" />\n          <package name=\"junit\" withSubpackages=\"true\" static=\"true\" />\n          <package name=\"net\" withSubpackages=\"true\" static=\"true\" />\n          <package name=\"org\" withSubpackages=\"true\" static=\"true\" />\n          <package name=\"java\" withSubpackages=\"true\" static=\"true\" />\n          <package name=\"javax\" withSubpackages=\"true\" static=\"true\" />\n          <package name=\"\" withSubpackages=\"true\" static=\"true\" />\n          <emptyLine />\n          <package name=\"android\" withSubpackages=\"true\" static=\"false\" />\n          <emptyLine />\n          <package name=\"androidx\" withSubpackages=\"true\" static=\"false\" />\n          <emptyLine />\n          <package name=\"com\" withSubpackages=\"true\" static=\"false\" />\n          <emptyLine />\n          <package name=\"junit\" withSubpackages=\"true\" static=\"false\" />\n          <emptyLine />\n          <package name=\"net\" withSubpackages=\"true\" static=\"false\" />\n          <emptyLine />\n          <package name=\"org\" withSubpackages=\"true\" static=\"false\" />\n          <emptyLine />\n          <package name=\"java\" withSubpackages=\"true\" static=\"false\" />\n          <emptyLine />\n          <package name=\"javax\" withSubpackages=\"true\" static=\"false\" />\n          <emptyLine />\n          <package name=\"\" withSubpackages=\"true\" static=\"false\" />\n          <emptyLine />\n        </value>\n      </option>\n    </JavaCodeStyleSettings>\n    <JetCodeStyleSettings>\n      <option name=\"CODE_STYLE_DEFAULTS\" value=\"KOTLIN_OFFICIAL\" />\n    </JetCodeStyleSettings>\n    <codeStyleSettings language=\"XML\">\n      <option name=\"FORCE_REARRANGE_MODE\" value=\"1\" />\n      <indentOptions>\n        <option name=\"CONTINUATION_INDENT_SIZE\" value=\"4\" />\n      </indentOptions>\n      <arrangement>\n        <rules>\n          <section>\n            <rule>\n              <match>\n                <AND>\n                  <NAME>xmlns:android</NAME>\n                  <XML_ATTRIBUTE />\n                  <XML_NAMESPACE>^$</XML_NAMESPACE>\n                </AND>\n              </match>\n            </rule>\n          </section>\n          <section>\n            <rule>\n              <match>\n                <AND>\n                  <NAME>xmlns:.*</NAME>\n                  <XML_ATTRIBUTE />\n                  <XML_NAMESPACE>^$</XML_NAMESPACE>\n                </AND>\n              </match>\n              <order>BY_NAME</order>\n            </rule>\n          </section>\n          <section>\n            <rule>\n              <match>\n                <AND>\n                  <NAME>.*:id</NAME>\n                  <XML_ATTRIBUTE />\n                  <XML_NAMESPACE>http://schemas.android.com/apk/res/android</XML_NAMESPACE>\n                </AND>\n              </match>\n            </rule>\n          </section>\n          <section>\n            <rule>\n              <match>\n                <AND>\n                  <NAME>.*:name</NAME>\n                  <XML_ATTRIBUTE />\n                  <XML_NAMESPACE>http://schemas.android.com/apk/res/android</XML_NAMESPACE>\n                </AND>\n              </match>\n            </rule>\n          </section>\n          <section>\n            <rule>\n              <match>\n                <AND>\n                  <NAME>name</NAME>\n                  <XML_ATTRIBUTE />\n                  <XML_NAMESPACE>^$</XML_NAMESPACE>\n                </AND>\n              </match>\n            </rule>\n          </section>\n          <section>\n            <rule>\n              <match>\n                <AND>\n                  <NAME>style</NAME>\n                  <XML_ATTRIBUTE />\n                  <XML_NAMESPACE>^$</XML_NAMESPACE>\n                </AND>\n              </match>\n            </rule>\n          </section>\n          <section>\n            <rule>\n              <match>\n                <AND>\n                  <NAME>.*</NAME>\n                  <XML_ATTRIBUTE />\n                  <XML_NAMESPACE>^$</XML_NAMESPACE>\n                </AND>\n              </match>\n              <order>BY_NAME</order>\n            </rule>\n          </section>\n          <section>\n            <rule>\n              <match>\n                <AND>\n                  <NAME>.*</NAME>\n                  <XML_ATTRIBUTE />\n                  <XML_NAMESPACE>http://schemas.android.com/apk/res/android</XML_NAMESPACE>\n                </AND>\n              </match>\n              <order>ANDROID_ATTRIBUTE_ORDER</order>\n            </rule>\n          </section>\n          <section>\n            <rule>\n              <match>\n                <AND>\n                  <NAME>.*</NAME>\n                  <XML_ATTRIBUTE />\n                  <XML_NAMESPACE>.*</XML_NAMESPACE>\n                </AND>\n              </match>\n              <order>BY_NAME</order>\n            </rule>\n          </section>\n        </rules>\n      </arrangement>\n    </codeStyleSettings>\n    <codeStyleSettings language=\"kotlin\">\n      <option name=\"CODE_STYLE_DEFAULTS\" value=\"KOTLIN_OFFICIAL\" />\n    </codeStyleSettings>\n  </code_scheme>\n</component>"
  },
  {
    "path": ".idea/codeStyles/codeStyleConfig.xml",
    "content": "<component name=\"ProjectCodeStyleConfiguration\">\n  <state>\n    <option name=\"USE_PER_PROJECT_SETTINGS\" value=\"true\" />\n  </state>\n</component>"
  },
  {
    "path": ".idea/compiler.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"CompilerConfiguration\">\n    <bytecodeTargetLevel target=\"21\" />\n  </component>\n</project>"
  },
  {
    "path": ".idea/deploymentTargetSelector.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"deploymentTargetSelector\">\n    <selectionStates>\n      <SelectionState runConfigName=\"app\">\n        <option name=\"selectionMode\" value=\"DROPDOWN\" />\n      </SelectionState>\n    </selectionStates>\n  </component>\n</project>"
  },
  {
    "path": ".idea/deviceManager.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"DeviceTable\">\n    <option name=\"columnSorters\">\n      <list>\n        <ColumnSorterState>\n          <option name=\"column\" value=\"Name\" />\n          <option name=\"order\" value=\"ASCENDING\" />\n        </ColumnSorterState>\n      </list>\n    </option>\n  </component>\n</project>"
  },
  {
    "path": ".idea/gradle.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"GradleMigrationSettings\" migrationVersion=\"1\" />\n  <component name=\"GradleSettings\">\n    <option name=\"linkedExternalProjectsSettings\">\n      <GradleProjectSettings>\n        <option name=\"testRunner\" value=\"CHOOSE_PER_TEST\" />\n        <option name=\"externalProjectPath\" value=\"$PROJECT_DIR$\" />\n        <option name=\"gradleJvm\" value=\"#GRADLE_LOCAL_JAVA_HOME\" />\n        <option name=\"modules\">\n          <set>\n            <option value=\"$PROJECT_DIR$\" />\n            <option value=\"$PROJECT_DIR$/app\" />\n          </set>\n        </option>\n      </GradleProjectSettings>\n    </option>\n  </component>\n</project>"
  },
  {
    "path": ".idea/kotlinc.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"KotlinJpsPluginSettings\">\n    <option name=\"version\" value=\"1.8.0\" />\n  </component>\n</project>"
  },
  {
    "path": ".idea/migrations.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"ProjectMigrations\">\n    <option name=\"MigrateToGradleLocalJavaHome\">\n      <set>\n        <option value=\"$PROJECT_DIR$\" />\n      </set>\n    </option>\n  </component>\n</project>"
  },
  {
    "path": ".idea/misc.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"ExternalStorageConfigurationManager\" enabled=\"true\" />\n  <component name=\"ProjectRootManager\" version=\"2\" languageLevel=\"JDK_21\" default=\"true\" project-jdk-name=\"jbr-21\" project-jdk-type=\"JavaSDK\">\n    <output url=\"file://$PROJECT_DIR$/build/classes\" />\n  </component>\n  <component name=\"ProjectType\">\n    <option name=\"id\" value=\"Android\" />\n  </component>\n</project>"
  },
  {
    "path": ".idea/runConfigurations.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"RunConfigurationProducerService\">\n    <option name=\"ignoredProducers\">\n      <set>\n        <option value=\"com.intellij.execution.junit.AbstractAllInDirectoryConfigurationProducer\" />\n        <option value=\"com.intellij.execution.junit.AllInPackageConfigurationProducer\" />\n        <option value=\"com.intellij.execution.junit.PatternConfigurationProducer\" />\n        <option value=\"com.intellij.execution.junit.TestInClassConfigurationProducer\" />\n        <option value=\"com.intellij.execution.junit.UniqueIdConfigurationProducer\" />\n        <option value=\"com.intellij.execution.junit.testDiscovery.JUnitTestDiscoveryConfigurationProducer\" />\n        <option value=\"org.jetbrains.kotlin.idea.junit.KotlinJUnitRunConfigurationProducer\" />\n        <option value=\"org.jetbrains.kotlin.idea.junit.KotlinPatternConfigurationProducer\" />\n      </set>\n    </option>\n  </component>\n</project>"
  },
  {
    "path": ".idea/vcs.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"VcsDirectoryMappings\">\n    <mapping directory=\"$PROJECT_DIR$\" vcs=\"Git\" />\n  </component>\n</project>"
  },
  {
    "path": "README.md",
    "content": "# Forest\n\nTrack your daily step count, stay healthy and fight the climate change, one step at a time.\n\n![banner](https://user-images.githubusercontent.com/60577942/221682753-a0251f61-63e0-4ae9-bb40-2854864cebc3.jpg)\n\n## 🦁 Table of Contents\n\n- [Forest](#forest)\n    - [🦁 Table of Contents](#-table-of-contents)\n    - [🌳 Inspiration](#-inspiration)\n    - [🥕 Features](#-features)\n    - [🐻‍❄️ Installation and First Launch](#-installation-and-first-launch)\n    - [🪴 Technologies](#-technologies)\n    - [🐌 Resources](#-resources)\n\n## 🌳 Inspiration\n\nA couple of years ago together with my friends, I took part in a programming competition. The\nobjective was to build a mobile app that solves a global problem. We didn't win, but the app we\nbuilt quickly spread in our families.\n\n## 🥕 Features\n\n<img src=\"https://user-images.githubusercontent.com/60577942/221682705-39a0e476-bb52-4257-8d3b-5e5a64e72424.gif\" alt=\"application demo\" width=\"270\">\n\n<br />\n\n- Track your step count, burned calories, distance traveled and CO₂ saved\n- Get rewarded by completing your daily goal and stay motivated\n- Get handy notifications when your daily stats get updated\n- View a daily history of your progress\n- View a detailed summary of your overall progress\n\n## 🐻‍❄️ Installation and First Launch\n\n1. Download the **latest stable** application binary (.apk file) from\n   [Releases](https://github.com/bartek537/forest/releases).\n2. Tap on the downloaded file and temporarily **allow installation from unknown sources**,\n   if prompted (turn it back off after installation).\n3. On some devices you may encounter a Play Protect warning, but don't worry — the app is safe\n   to use and open-sourced. I'm just an unverified developer.\n4. Click “Install” and wait for the app to install.\n5. You are now good to go 🚀.\n\n[//]: # (@formatter:off)\n\n> [!CAUTION]\n> On most devices you'll need to **turn off the app battery optimizations** for the\n> app to count steps accurately. Forest uses a minimal amount of power and it won't impact your\n> battery life.\n> \n> - Xiaomi devices running MIUI 14\n>     1. Go to Settings > Apps > Manage apps > Forest > Battery saver.\n>     2. Select \"No restrictions\".\n> \n> - Devices running Lineage OS 22.2\n>     1. Go to Settings > Apps > All apps > Forest > App battery usage > Allow background usage\n>        (tap on the setting name to enter another menu).\n>     2. Enable “Allow background usage”.\n>     3. Change battery optimizations to “Unrestricted”.\n\n[//]: # (@formatter:on)\n\n## 🪴 Technologies\n\n- Kotlin\n- Flows and Coroutines\n- Room\n- Shared Preferences\n- Navigation Component\n- AndroidX Preference Library\n- MVVM Design Pattern\n- Clean Architecture\n- Material You Dynamic Theming\n\n## 🐌 Resources\n\nhttps://www.notion.so/bartek537/Forest-223bc0c0f5be80bcbb4cc738eefe1ddd"
  },
  {
    "path": "app/.gitignore",
    "content": "/build"
  },
  {
    "path": "app/build.gradle",
    "content": "import org.jetbrains.kotlin.gradle.dsl.JvmTarget\n\nplugins {\n    alias libs.plugins.android.application\n    alias libs.plugins.kotlin.android\n    alias libs.plugins.devtools.ksp\n}\n\nandroid {\n    namespace = 'pl.bartek537.forest'\n    compileSdk = 36\n\n    defaultConfig {\n        applicationId \"pl.bk20.forest\"\n        minSdk 24\n        targetSdk 33\n        versionCode 1\n        versionName \"1.0\"\n\n        testInstrumentationRunner \"androidx.test.runner.AndroidJUnitRunner\"\n    }\n\n    buildFeatures {\n        viewBinding = true\n    }\n    buildTypes {\n        release {\n            minifyEnabled false\n            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'\n        }\n    }\n    compileOptions {\n        sourceCompatibility JavaVersion.VERSION_11\n        targetCompatibility JavaVersion.VERSION_11\n        coreLibraryDesugaringEnabled = true\n    }\n    kotlin {\n        compilerOptions {\n            jvmTarget = JvmTarget.JVM_11\n        }\n    }\n}\n\ndependencies {\n\n    implementation libs.koin.androidx\n\n    coreLibraryDesugaring libs.tools.desugar.jdk.libs\n\n    implementation libs.androidx.core.ktx\n    implementation libs.androidx.appcompat\n\n    // User interface\n    implementation libs.android.material.design\n    implementation libs.androidx.activity.ktx\n    implementation libs.androidx.constraintlayout\n    implementation libs.androidx.lifecycle.runtime.ktx\n    implementation libs.androidx.lifecycle.service\n    implementation libs.androidx.lifecycle.viewmodel.ktx\n    implementation libs.androidx.navigation.fragment.ktx\n    implementation libs.androidx.navigation.ui.ktx\n    implementation libs.androidx.swiperefreshlayout\n\n    // Persistence\n    implementation libs.androidx.preference\n    implementation libs.androidx.room.ktx\n    ksp libs.androidx.room.compiler\n\n    // Test\n    testImplementation libs.junit\n    androidTestImplementation libs.androidx.test.espresso\n    androidTestImplementation libs.androidx.test.junit\n}"
  },
  {
    "path": "app/proguard-rules.pro",
    "content": "# Add project specific ProGuard rules here.\n# You can control the set of applied configuration files using the\n# proguardFiles setting in build.gradle.\n#\n# For more details, see\n#   http://developer.android.com/guide/developing/tools/proguard.html\n\n# If your project uses WebView with JS, uncomment the following\n# and specify the fully qualified class name to the JavaScript interface\n# class:\n#-keepclassmembers class fqcn.of.javascript.interface.for.webview {\n#   public *;\n#}\n\n# Uncomment this to preserve the line number information for\n# debugging stack traces.\n#-keepattributes SourceFile,LineNumberTable\n\n# If you keep the line number information, uncomment this to\n# hide the original source file name.\n#-renamesourcefileattribute SourceFile"
  },
  {
    "path": "app/src/androidTest/java/pl/bartek537/forest/ExampleInstrumentedTest.kt",
    "content": "package pl.bartek537.forest\n\nimport androidx.test.platform.app.InstrumentationRegistry\nimport androidx.test.ext.junit.runners.AndroidJUnit4\n\nimport org.junit.Test\nimport org.junit.runner.RunWith\n\nimport org.junit.Assert.*\n\n/**\n * Instrumented test, which will execute on an Android device.\n *\n * See [testing documentation](http://d.android.com/tools/testing).\n */\n@RunWith(AndroidJUnit4::class)\nclass ExampleInstrumentedTest {\n    @Test\n    fun useAppContext() {\n        // Context of the app under test.\n        val appContext = InstrumentationRegistry.getInstrumentation().targetContext\n        assertEquals(\"pl.bk20.forest\", appContext.packageName)\n    }\n}"
  },
  {
    "path": "app/src/main/AndroidManifest.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:tools=\"http://schemas.android.com/tools\">\n\n    <uses-permission android:name=\"android.permission.RECEIVE_BOOT_COMPLETED\" />\n    <uses-permission android:name=\"android.permission.ACTIVITY_RECOGNITION\" />\n    <uses-permission android:name=\"android.permission.FOREGROUND_SERVICE\" />\n    <uses-permission android:name=\"android.permission.POST_NOTIFICATIONS\" />\n\n    <uses-feature\n        android:name=\"android.hardware.sensor.stepcounter\"\n        android:required=\"true\" />\n\n    <application\n        android:name=\".ForestApplication\"\n        android:allowBackup=\"true\"\n        android:dataExtractionRules=\"@xml/data_extraction_rules\"\n        android:fullBackupContent=\"@xml/backup_rules\"\n        android:icon=\"@mipmap/ic_launcher\"\n        android:label=\"@string/app_name\"\n        android:roundIcon=\"@mipmap/ic_launcher_round\"\n        android:supportsRtl=\"true\"\n        android:theme=\"@style/Theme.Forest\"\n        tools:targetApi=\"31\">\n\n        <service android:name=\".service.StepCounterService\" />\n\n        <receiver\n            android:name=\".service.StepCounterServiceLauncher\"\n            android:exported=\"false\">\n            <intent-filter>\n                <action android:name=\"android.intent.action.BOOT_COMPLETED\" />\n            </intent-filter>\n        </receiver>\n\n        <activity\n            android:name=\".core.presentation.SplashActivity\"\n            android:exported=\"true\">\n            <intent-filter>\n                <action android:name=\"android.intent.action.MAIN\" />\n\n                <category android:name=\"android.intent.category.LAUNCHER\" />\n            </intent-filter>\n        </activity>\n        <activity\n            android:name=\".core.presentation.OnboardingActivity\"\n            android:exported=\"false\" />\n        <activity\n            android:name=\".core.presentation.MainActivity\"\n            android:exported=\"true\"\n            android:launchMode=\"singleInstance\" />\n        <activity\n            android:name=\".settings.SettingsActivity\"\n            android:exported=\"false\"\n            android:launchMode=\"singleTop\"\n            android:parentActivityName=\".core.presentation.MainActivity\" />\n    </application>\n\n</manifest>"
  },
  {
    "path": "app/src/main/java/pl/bartek537/forest/ForestApplication.kt",
    "content": "package pl.bartek537.forest\n\nimport android.app.Application\nimport android.content.BroadcastReceiver\nimport android.content.Context\nimport android.content.Intent\nimport android.content.IntentFilter\nimport androidx.preference.PreferenceManager\nimport androidx.room.Room\nimport com.google.android.material.color.DynamicColors\nimport kotlinx.coroutines.flow.MutableStateFlow\nimport org.koin.android.ext.koin.androidContext\nimport org.koin.android.ext.koin.androidLogger\nimport org.koin.core.context.startKoin\nimport org.koin.dsl.module\nimport pl.bartek537.forest.core.data.source.ForestDatabase\nimport pl.bartek537.forest.settings.data.source.SettingsStore\nimport pl.bartek537.forest.settings.data.source.SettingsStoreImpl\nimport java.time.LocalDate\n\nval forestApplicationModule = module {\n}\n\nclass ForestApplication : Application() {\n\n    lateinit var settingsStore: SettingsStore\n    lateinit var forestDatabase: ForestDatabase\n\n    val currentDate = MutableStateFlow<LocalDate>(LocalDate.now())\n\n    override fun onCreate() {\n        super.onCreate()\n\n        startKoin {\n            androidLogger()\n            androidContext(this@ForestApplication)\n            modules(forestApplicationModule)\n        }\n\n        DynamicColors.applyToActivitiesIfAvailable(this)\n        PreferenceManager.setDefaultValues(this, R.xml.settings, false)\n        registerMidnightTimer()\n\n        val sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this)\n        settingsStore = SettingsStoreImpl(sharedPreferences)\n\n        forestDatabase = Room.databaseBuilder(\n            applicationContext,\n            ForestDatabase::class.java,\n            ForestDatabase.DATABASE_NAME\n        ).build()\n    }\n\n    private fun registerMidnightTimer() {\n        val intentFilter = IntentFilter().apply {\n            addAction(Intent.ACTION_TIME_TICK)\n            addAction(Intent.ACTION_TIME_CHANGED)\n            addAction(Intent.ACTION_TIMEZONE_CHANGED)\n        }\n        registerReceiver(midnightBroadcastReceiver, intentFilter)\n    }\n\n    private val midnightBroadcastReceiver = object : BroadcastReceiver() {\n\n        override fun onReceive(context: Context?, intent: Intent?) {\n            val today = LocalDate.now()\n            if (today != currentDate.value) {\n                currentDate.value = today\n            }\n        }\n    }\n}"
  },
  {
    "path": "app/src/main/java/pl/bartek537/forest/core/data/repository/DayRepositoryImpl.kt",
    "content": "package pl.bartek537.forest.core.data.repository\n\nimport kotlinx.coroutines.flow.Flow\nimport pl.bartek537.forest.core.data.source.DayDao\nimport pl.bartek537.forest.core.domain.model.Day\nimport pl.bartek537.forest.core.domain.model.DaySettings\nimport pl.bartek537.forest.core.domain.repository.DayRepository\nimport java.time.LocalDate\n\nclass DayRepositoryImpl(\n    private val dao: DayDao\n) : DayRepository {\n\n    override fun getTreeCount(): Flow<Int> {\n        return dao.getTreeCount()\n    }\n\n    override fun getFirstDay(): Flow<Day?> {\n        return dao.getFirstDay()\n    }\n\n    override fun getDay(date: LocalDate): Flow<Day?> {\n        return dao.getDay(date)\n    }\n\n    override suspend fun getAllDays(): List<Day> {\n        return dao.getAllDays()\n    }\n\n    override fun getDays(range: ClosedRange<LocalDate>): Flow<List<Day>> {\n        return dao.getDays(range.start, range.endInclusive)\n    }\n\n    override suspend fun upsertDay(day: Day) {\n        dao.upsertDay(day)\n    }\n\n    override suspend fun updateDaySettings(daySettings: DaySettings) {\n        dao.updateDaySettings(daySettings)\n    }\n}"
  },
  {
    "path": "app/src/main/java/pl/bartek537/forest/core/data/source/DayDao.kt",
    "content": "package pl.bartek537.forest.core.data.source\n\nimport androidx.room.*\nimport kotlinx.coroutines.flow.Flow\nimport pl.bartek537.forest.core.domain.model.Day\nimport pl.bartek537.forest.core.domain.model.DaySettings\nimport java.time.LocalDate\n\n@Dao\ninterface DayDao {\n\n    @Query(\"SELECT COUNT(*) FROM day WHERE steps >= goal\")\n    fun getTreeCount(): Flow<Int>\n\n    @Query(\"SELECT * FROM day ORDER BY date ASC LIMIT 1\")\n    fun getFirstDay(): Flow<Day?>\n\n    @Query(\"SELECT * FROM day WHERE date = :date\")\n    fun getDay(date: LocalDate): Flow<Day?>\n\n    @Query(\"SELECT * FROM day\")\n    suspend fun getAllDays(): List<Day>\n\n    @Query(\"SELECT * FROM day WHERE date BETWEEN :start AND :endInclusive\")\n    fun getDays(start: LocalDate, endInclusive: LocalDate): Flow<List<Day>>\n\n    @Upsert\n    suspend fun upsertDay(day: Day)\n\n    @Update(entity = Day::class)\n    suspend fun updateDaySettings(day: DaySettings)\n}"
  },
  {
    "path": "app/src/main/java/pl/bartek537/forest/core/data/source/ForestDatabase.kt",
    "content": "package pl.bartek537.forest.core.data.source\n\nimport androidx.room.Database\nimport androidx.room.RoomDatabase\nimport androidx.room.TypeConverters\nimport pl.bartek537.forest.core.data.source.util.Converters\nimport pl.bartek537.forest.core.domain.model.Day\n\n@Database(entities = [Day::class], version = 1)\n@TypeConverters(Converters::class)\nabstract class ForestDatabase : RoomDatabase() {\n\n    abstract val dayDao: DayDao\n\n    companion object {\n        const val DATABASE_NAME = \"forest_database\"\n    }\n}"
  },
  {
    "path": "app/src/main/java/pl/bartek537/forest/core/data/source/util/Converters.kt",
    "content": "package pl.bartek537.forest.core.data.source.util\n\nimport androidx.room.TypeConverter\nimport java.time.LocalDate\n\n@Suppress(\"unused\")\nclass Converters {\n    @TypeConverter\n    fun localDateToTimestamp(date: LocalDate): Long {\n        return date.toEpochDay()\n    }\n\n    @TypeConverter\n    fun timestampToLocalDate(timestamp: Long): LocalDate {\n        return LocalDate.ofEpochDay(timestamp)\n    }\n}"
  },
  {
    "path": "app/src/main/java/pl/bartek537/forest/core/domain/model/Day.kt",
    "content": "package pl.bartek537.forest.core.domain.model\n\nimport androidx.room.Entity\nimport androidx.room.PrimaryKey\nimport pl.bartek537.forest.settings.domain.model.Settings\nimport java.time.LocalDate\n\n@Entity(tableName = \"day\")\ndata class Day(\n\n    @PrimaryKey val date: LocalDate,\n\n    val steps: Int = 0,\n\n    val goal: Int,\n\n    val height: Int = 188,\n\n    val weight: Int = 70,\n\n    val stepLength: Int = 72,\n\n    val pace: Double = 1.0\n) {\n\n    companion object\n\n    val distanceTravelled\n        get() = run {\n            val distanceCentimeters = steps * stepLength\n            distanceCentimeters.toDouble() / 100_000\n        }\n\n    val calorieBurned\n        get() = run {\n            val modifier = height / 182.0 + weight / 70.0 - 1\n            0.04 * steps * pace * modifier\n        }\n\n    val carbonDioxideSaved\n        get() = run {\n            steps * 0.1925 / 1000.0\n        }\n}\n\nfun Day.Companion.of(date: LocalDate, settings: Settings, steps: Int = 0): Day {\n    return settings.run {\n        Day(\n            date = date,\n            steps = steps,\n            goal = dailyGoal,\n            height = height,\n            weight = weight,\n            stepLength = stepLength,\n            pace = pace\n        )\n    }\n}"
  },
  {
    "path": "app/src/main/java/pl/bartek537/forest/core/domain/model/DaySettings.kt",
    "content": "package pl.bartek537.forest.core.domain.model\n\nimport java.time.LocalDate\n\ndata class DaySettings(\n\n    val date: LocalDate,\n\n    val goal: Int,\n\n    val height: Int,\n\n    val weight: Int,\n\n    val stepLength: Int,\n\n    val pace: Double\n)\n"
  },
  {
    "path": "app/src/main/java/pl/bartek537/forest/core/domain/model/StatsSummary.kt",
    "content": "package pl.bartek537.forest.core.domain.model\n\ndata class StatsSummary(\n    val treesCollected: Int = 0,\n    val stepsTaken: Long = 0L,\n    val calorieBurned: Double = 0.0,\n    val distanceTravelled: Double = 0.0,\n    val carbonDioxideSaved: Double = 0.0,\n) {\n    companion object\n}\n\nfun StatsSummary.Companion.of(days: List<Day>): StatsSummary {\n    val treesCollected = days.count { it.steps >= it.goal }\n    val stepsTaken = days.sumOf { it.steps.toLong() }\n    val calorieBurned = days.sumOf { it.calorieBurned }\n    val distanceTravelled = days.sumOf { it.distanceTravelled }\n    val carbonDioxideSaved = days.sumOf { it.carbonDioxideSaved }\n    return StatsSummary(\n        treesCollected = treesCollected,\n        stepsTaken = stepsTaken,\n        calorieBurned = calorieBurned,\n        distanceTravelled = distanceTravelled,\n        carbonDioxideSaved = carbonDioxideSaved\n    )\n}"
  },
  {
    "path": "app/src/main/java/pl/bartek537/forest/core/domain/repository/DayRepository.kt",
    "content": "package pl.bartek537.forest.core.domain.repository\n\nimport kotlinx.coroutines.flow.Flow\nimport pl.bartek537.forest.core.domain.model.Day\nimport pl.bartek537.forest.core.domain.model.DaySettings\nimport java.time.LocalDate\n\ninterface DayRepository {\n\n    fun getTreeCount(): Flow<Int>\n\n    fun getFirstDay(): Flow<Day?>\n\n    fun getDay(date: LocalDate): Flow<Day?>\n\n    suspend fun getAllDays(): List<Day>\n\n    fun getDays(range: ClosedRange<LocalDate>): Flow<List<Day>>\n\n    suspend fun upsertDay(day: Day)\n\n    suspend fun updateDaySettings(daySettings: DaySettings)\n}"
  },
  {
    "path": "app/src/main/java/pl/bartek537/forest/core/domain/usecase/DayUseCases.kt",
    "content": "package pl.bartek537.forest.core.domain.usecase\n\nimport pl.bartek537.forest.core.domain.repository.DayRepository\nimport pl.bartek537.forest.settings.domain.repository.SettingsRepository\n\nclass DayUseCases(\n    dayRepository: DayRepository,\n    settingsRepository: SettingsRepository\n) {\n\n    val getDay: GetDay = GetDayImpl(dayRepository, settingsRepository)\n    val incrementStepCount: IncrementStepCount = IncrementStepCountImpl(dayRepository, getDay)\n}"
  },
  {
    "path": "app/src/main/java/pl/bartek537/forest/core/domain/usecase/GetDay.kt",
    "content": "package pl.bartek537.forest.core.domain.usecase\n\nimport kotlinx.coroutines.flow.Flow\nimport pl.bartek537.forest.core.domain.model.Day\nimport java.time.LocalDate\n\ninterface GetDay {\n\n    operator fun invoke(date: LocalDate): Flow<Day>\n}"
  },
  {
    "path": "app/src/main/java/pl/bartek537/forest/core/domain/usecase/GetDayImpl.kt",
    "content": "package pl.bartek537.forest.core.domain.usecase\n\nimport kotlinx.coroutines.flow.Flow\nimport kotlinx.coroutines.flow.combine\nimport pl.bartek537.forest.core.domain.model.Day\nimport pl.bartek537.forest.core.domain.model.of\nimport pl.bartek537.forest.core.domain.repository.DayRepository\nimport pl.bartek537.forest.settings.domain.repository.SettingsRepository\nimport java.time.LocalDate\n\nclass GetDayImpl(\n    private val dayRepository: DayRepository,\n    private val settingsRepository: SettingsRepository,\n) : GetDay {\n\n    override fun invoke(date: LocalDate): Flow<Day> {\n        val settingsFlow = settingsRepository.getSettings()\n        val dayFlow = dayRepository.getDay(date)\n\n        return settingsFlow.combine(dayFlow) { settings, day ->\n            day ?: Day.of(date, settings, steps = 0)\n        }\n    }\n}"
  },
  {
    "path": "app/src/main/java/pl/bartek537/forest/core/domain/usecase/IncrementStepCount.kt",
    "content": "package pl.bartek537.forest.core.domain.usecase\n\nimport java.time.LocalDate\n\ninterface IncrementStepCount {\n\n    suspend operator fun invoke(date: LocalDate, by: Int)\n}"
  },
  {
    "path": "app/src/main/java/pl/bartek537/forest/core/domain/usecase/IncrementStepCountImpl.kt",
    "content": "package pl.bartek537.forest.core.domain.usecase\n\nimport kotlinx.coroutines.flow.first\nimport pl.bartek537.forest.core.domain.repository.DayRepository\nimport java.time.LocalDate\n\nclass IncrementStepCountImpl(\n    private val repository: DayRepository,\n    private val getDayUseCase: GetDay\n) : IncrementStepCount {\n\n    override suspend fun invoke(date: LocalDate, by: Int) {\n        val day = getDayUseCase(date).first()\n        val updatedDay = day.copy(steps = day.steps + by)\n        repository.upsertDay(updatedDay)\n    }\n}"
  },
  {
    "path": "app/src/main/java/pl/bartek537/forest/core/presentation/ActivityRecognitionPermissionFragment.kt",
    "content": "package pl.bartek537.forest.core.presentation\n\nimport android.Manifest\nimport android.content.Intent\nimport android.content.pm.PackageManager\nimport android.net.Uri\nimport android.os.Build\nimport android.os.Bundle\nimport android.provider.Settings\nimport android.view.LayoutInflater\nimport android.view.View\nimport android.view.ViewGroup\nimport androidx.activity.result.contract.ActivityResultContracts.RequestPermission\nimport androidx.annotation.RequiresApi\nimport androidx.core.content.ContextCompat\nimport androidx.fragment.app.Fragment\nimport androidx.navigation.fragment.findNavController\nimport pl.bartek537.forest.R\nimport pl.bartek537.forest.databinding.FragmentActivityRecognitionPermissionBinding\n\nclass ActivityRecognitionPermissionFragment : Fragment() {\n\n    private var _binding: FragmentActivityRecognitionPermissionBinding? = null\n    private val binding get() = _binding!!\n\n    @RequiresApi(Build.VERSION_CODES.Q)\n    private val requestPermissionLauncher = registerForActivityResult(RequestPermission()) {\n        when (ContextCompat.checkSelfPermission(\n            requireContext(), Manifest.permission.ACTIVITY_RECOGNITION\n        )) {\n            PackageManager.PERMISSION_GRANTED -> openMainActivity()\n            PackageManager.PERMISSION_DENIED -> openPermissionSettings()\n        }\n    }\n\n    private fun openMainActivity() {\n        val action = R.id.action_activityRecognitionPermissionFragment_to_mainActivity\n        findNavController().navigate(action)\n        requireActivity().finish()\n    }\n\n    private fun openPermissionSettings() {\n        startActivity(Intent().apply {\n            action = Settings.ACTION_APPLICATION_DETAILS_SETTINGS\n            data = Uri.fromParts(\"package\", requireContext().packageName, null)\n        })\n    }\n\n    override fun onCreateView(\n        inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?\n    ): View {\n        _binding = FragmentActivityRecognitionPermissionBinding.inflate(inflater, container, false)\n        return binding.root\n    }\n\n    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {\n        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.Q) {\n            openMainActivity()\n            return\n        }\n        binding.buttonContinue.setOnClickListener {\n            requestPermission()\n        }\n    }\n\n    @RequiresApi(Build.VERSION_CODES.Q)\n    private fun requestPermission() {\n        requestPermissionLauncher.launch(Manifest.permission.ACTIVITY_RECOGNITION)\n    }\n}"
  },
  {
    "path": "app/src/main/java/pl/bartek537/forest/core/presentation/MainActivity.kt",
    "content": "package pl.bartek537.forest.core.presentation\n\nimport android.content.Intent\nimport android.content.pm.PackageManager\nimport android.os.Build\nimport android.os.Bundle\nimport android.view.Menu\nimport android.view.MenuItem\nimport androidx.activity.result.contract.ActivityResultContracts\nimport androidx.annotation.RequiresApi\nimport androidx.appcompat.app.AppCompatActivity\nimport androidx.core.content.ContextCompat\nimport androidx.core.view.WindowCompat\nimport androidx.navigation.NavController\nimport androidx.navigation.fragment.NavHostFragment\nimport androidx.navigation.ui.AppBarConfiguration\nimport androidx.navigation.ui.setupActionBarWithNavController\nimport androidx.navigation.ui.setupWithNavController\nimport pl.bartek537.forest.R\nimport pl.bartek537.forest.databinding.ActivityMainBinding\nimport pl.bartek537.forest.service.StepCounterService\nimport pl.bartek537.forest.settings.SettingsActivity\n\nclass MainActivity : AppCompatActivity() {\n\n    private lateinit var navController: NavController\n\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n        WindowCompat.setDecorFitsSystemWindows(window, false)\n\n        val binding = ActivityMainBinding.inflate(layoutInflater)\n        setContentView(binding.root)\n\n        setSupportActionBar(binding.toolbar)\n\n        val navHostFragment = supportFragmentManager\n            .findFragmentById(R.id.nav_host_fragment) as NavHostFragment\n        navController = navHostFragment.navController\n\n        val appBarConfiguration = AppBarConfiguration(\n            setOf(\n                R.id.progressFragment,\n                R.id.statsFragment,\n                R.id.forestFragment,\n            )\n        )\n\n        setupActionBarWithNavController(navController, appBarConfiguration)\n        binding.bottomNavigation.setupWithNavController(navController)\n\n        startStepCounterService()\n\n        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {\n            askForNotificationPermission()\n        }\n    }\n\n    private val requestPermissionLauncher =\n        registerForActivityResult(ActivityResultContracts.RequestPermission()) {}\n\n    @RequiresApi(Build.VERSION_CODES.TIRAMISU)\n    private fun askForNotificationPermission() {\n        val notificationPermission = android.Manifest.permission.POST_NOTIFICATIONS\n        val notificationPermissionStatus = ContextCompat\n            .checkSelfPermission(this, notificationPermission)\n        if (notificationPermissionStatus == PackageManager.PERMISSION_DENIED) {\n            requestPermissionLauncher.launch(notificationPermission)\n        }\n    }\n\n    private fun startStepCounterService() {\n        val intent = Intent(this, StepCounterService::class.java)\n        ContextCompat.startForegroundService(this, intent)\n    }\n\n    override fun onCreateOptionsMenu(menu: Menu?): Boolean {\n        menuInflater.inflate(R.menu.main_menu, menu)\n        return true\n    }\n\n    override fun onOptionsItemSelected(item: MenuItem): Boolean = when (item.itemId) {\n        R.id.settings -> {\n            openSettings()\n            true\n        }\n        else -> false\n    }\n\n    private fun openSettings() {\n        val settingsIntent = Intent(this, SettingsActivity::class.java)\n        startActivity(settingsIntent)\n    }\n}"
  },
  {
    "path": "app/src/main/java/pl/bartek537/forest/core/presentation/OnboardingActivity.kt",
    "content": "package pl.bartek537.forest.core.presentation\n\nimport android.os.Bundle\nimport androidx.appcompat.app.AppCompatActivity\nimport androidx.navigation.NavController\nimport androidx.navigation.fragment.NavHostFragment\nimport pl.bartek537.forest.R\nimport pl.bartek537.forest.databinding.ActivityOnboardingBinding\n\nclass OnboardingActivity : AppCompatActivity() {\n\n    private lateinit var navController: NavController\n\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n\n        val binding = ActivityOnboardingBinding.inflate(layoutInflater)\n        setContentView(binding.root)\n\n        val navHostFragment = supportFragmentManager\n            .findFragmentById(R.id.nav_host_fragment) as NavHostFragment\n        navController = navHostFragment.navController\n    }\n\n    override fun onSupportNavigateUp(): Boolean {\n        return navController.navigateUp() || super.onSupportNavigateUp()\n    }\n}"
  },
  {
    "path": "app/src/main/java/pl/bartek537/forest/core/presentation/SplashActivity.kt",
    "content": "package pl.bartek537.forest.core.presentation\n\nimport android.Manifest\nimport android.annotation.SuppressLint\nimport android.content.Context\nimport android.content.Intent\nimport android.content.pm.PackageManager\nimport android.os.Build\nimport android.os.Bundle\nimport androidx.appcompat.app.AppCompatActivity\nimport androidx.core.content.ContextCompat\n\n@SuppressLint(\"CustomSplashScreen\")\nclass SplashActivity : AppCompatActivity() {\n\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n\n        if (shouldOpenOnboarding()) {\n            openOnboardingActivity()\n        } else {\n            openMainActivity()\n        }\n        finish()\n    }\n\n    private fun shouldOpenOnboarding(): Boolean {\n        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.Q) {\n            return false\n        }\n        val permission = Manifest.permission.ACTIVITY_RECOGNITION\n        return !hasPermission(this, permission)\n    }\n\n    private fun openOnboardingActivity() {\n        val intent = Intent(this, OnboardingActivity::class.java)\n        startActivity(intent)\n    }\n\n    private fun openMainActivity() {\n        val intent = Intent(this, MainActivity::class.java)\n        startActivity(intent)\n    }\n\n    @Suppress(\"SameParameterValue\")\n    private fun hasPermission(context: Context, permission: String): Boolean {\n        val status = ContextCompat.checkSelfPermission(context, permission)\n        return status == PackageManager.PERMISSION_GRANTED\n    }\n}"
  },
  {
    "path": "app/src/main/java/pl/bartek537/forest/progress/ProgressFragment.kt",
    "content": "package pl.bartek537.forest.progress\n\nimport android.os.Bundle\nimport android.view.LayoutInflater\nimport android.view.View\nimport android.view.ViewGroup\nimport androidx.fragment.app.Fragment\nimport androidx.fragment.app.activityViewModels\nimport androidx.lifecycle.Lifecycle\nimport androidx.lifecycle.lifecycleScope\nimport androidx.lifecycle.repeatOnLifecycle\nimport kotlinx.coroutines.launch\nimport pl.bartek537.forest.R\nimport pl.bartek537.forest.databinding.FragmentProgressBinding\nimport java.text.DecimalFormat\n\nclass ProgressFragment : Fragment() {\n\n    private val viewModel: ProgressViewModel by activityViewModels { ProgressViewModel }\n\n    private var _binding: FragmentProgressBinding? = null\n    private val binding get() = _binding!!\n\n    override fun onCreateView(\n        inflater: LayoutInflater,\n        container: ViewGroup?,\n        savedInstanceState: Bundle?\n    ): View {\n        _binding = FragmentProgressBinding.inflate(inflater, container, false)\n        return binding.root\n    }\n\n    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {\n        viewLifecycleOwner.lifecycleScope.launch {\n            viewLifecycleOwner.repeatOnLifecycle(Lifecycle.State.STARTED) {\n                viewModel.progress.collect { progress -> updateUserInterface(progress) }\n            }\n        }\n    }\n\n    private fun updateUserInterface(state: ProgressState) {\n        updateProgress(state)\n        updateTree(state)\n        updateTiles(state)\n    }\n\n    private fun updateProgress(state: ProgressState) = state.apply {\n        val numberFormat = DecimalFormat.getIntegerInstance()\n        val formattedStepCount = numberFormat.format(stepsTaken)\n        val dailyGoalStepCount = numberFormat.format(dailyGoal)\n        val dailyGoalText = getString(R.string.step_goal, dailyGoalStepCount)\n        binding.apply {\n            textStepCount.text = formattedStepCount\n            textDailyGoal.text = dailyGoalText\n            progressDailyGoal.max = dailyGoal\n            progressDailyGoal.progress = stepsTaken\n        }\n    }\n\n    private fun updateTree(state: ProgressState) = state.apply {\n        val treeResource = getTreeResource(stepsTaken.toDouble() / dailyGoal)\n        binding.imageTree.setImageResource(treeResource)\n    }\n\n    private fun updateTiles(state: ProgressState) = state.apply {\n        val calorieText = getString(\n            R.string.calorie_burned_format, calorieBurned\n        )\n        val distanceText = getString(\n            R.string.distance_travelled_format, distanceTravelled\n        )\n        val carbonDioxideText = getString(\n            R.string.carbon_dioxide_saved_format, carbonDioxideSaved\n        )\n        binding.apply {\n            textCalorieBurned.text = calorieText\n            textDistanceTravelled.text = distanceText\n            textCarbonDioxideSaved.text = carbonDioxideText\n        }\n    }\n\n    private fun getTreeResource(progress: Double) =\n        when {\n            progress < .2 -> R.drawable.stage_1\n            progress < .4 -> R.drawable.stage_2\n            progress < .6 -> R.drawable.stage_3\n            progress < .8 -> R.drawable.stage_4\n            progress < 1 -> R.drawable.stage_5\n            else -> R.drawable.stage_6\n        }\n}"
  },
  {
    "path": "app/src/main/java/pl/bartek537/forest/progress/ProgressState.kt",
    "content": "package pl.bartek537.forest.progress\n\nimport java.time.LocalDate\n\ndata class ProgressState(\n    val date: LocalDate,\n    val stepsTaken: Int,\n    val dailyGoal: Int,\n    val calorieBurned: Int,\n    val distanceTravelled: Double,\n    val carbonDioxideSaved: Double,\n)"
  },
  {
    "path": "app/src/main/java/pl/bartek537/forest/progress/ProgressViewModel.kt",
    "content": "package pl.bartek537.forest.progress\n\nimport androidx.lifecycle.ViewModel\nimport androidx.lifecycle.ViewModelProvider\nimport androidx.lifecycle.ViewModelProvider.AndroidViewModelFactory.Companion.APPLICATION_KEY\nimport androidx.lifecycle.viewModelScope\nimport androidx.lifecycle.viewmodel.CreationExtras\nimport kotlinx.coroutines.Job\nimport kotlinx.coroutines.flow.*\nimport kotlinx.coroutines.launch\nimport pl.bartek537.forest.ForestApplication\nimport pl.bartek537.forest.core.data.repository.DayRepositoryImpl\nimport pl.bartek537.forest.core.domain.usecase.DayUseCases\nimport pl.bartek537.forest.settings.data.repository.SettingsRepositoryImpl\nimport java.time.LocalDate\nimport kotlin.math.roundToInt\n\nclass ProgressViewModel(\n    private val dayUseCases: DayUseCases,\n    private val currentDateFlow: StateFlow<LocalDate>\n) : ViewModel() {\n\n    private val _progress = MutableStateFlow(\n        ProgressState(\n            date = LocalDate.MIN,\n            stepsTaken = 0,\n            dailyGoal = 0,\n            calorieBurned = 0,\n            distanceTravelled = 0.0,\n            carbonDioxideSaved = 0.0,\n        )\n    )\n    val progress: StateFlow<ProgressState> = _progress.asStateFlow()\n\n    private var getProgressJob: Job? = null\n\n    init {\n        viewModelScope.launch {\n            currentDateFlow.collect { date ->\n                getProgress(date)\n            }\n        }\n    }\n\n    private fun getProgress(date: LocalDate) {\n        getProgressJob?.cancel()\n\n        getProgressJob = dayUseCases.getDay(date).onEach { day ->\n            _progress.value = progress.value.copy(\n                date = day.date,\n                stepsTaken = day.steps,\n                dailyGoal = day.goal,\n                calorieBurned = day.calorieBurned.roundToInt(),\n                distanceTravelled = day.distanceTravelled,\n                carbonDioxideSaved = day.carbonDioxideSaved,\n            )\n        }.launchIn(viewModelScope)\n    }\n\n    companion object Factory : ViewModelProvider.Factory {\n\n        @Suppress(\"UNCHECKED_CAST\")\n        override fun <T : ViewModel> create(modelClass: Class<T>, extras: CreationExtras): T {\n            val application = checkNotNull(extras[APPLICATION_KEY]) as ForestApplication\n\n            val settingsStore = application.settingsStore\n            val settingsRepository = SettingsRepositoryImpl(settingsStore)\n            val dayDatabase = application.forestDatabase\n            val dayRepository = DayRepositoryImpl(dayDatabase.dayDao)\n            val dayUseCases = DayUseCases(dayRepository, settingsRepository)\n            val currentDateFlow = application.currentDate\n\n            return ProgressViewModel(dayUseCases, currentDateFlow) as T\n        }\n    }\n}"
  },
  {
    "path": "app/src/main/java/pl/bartek537/forest/service/StepCounterController.kt",
    "content": "package pl.bartek537.forest.service\n\nimport kotlinx.coroutines.CoroutineScope\nimport kotlinx.coroutines.Job\nimport kotlinx.coroutines.flow.*\nimport kotlinx.coroutines.launch\nimport pl.bartek537.forest.core.domain.usecase.DayUseCases\nimport java.time.LocalDate\nimport kotlin.math.roundToInt\n\nclass StepCounterController(\n    private val dayUseCases: DayUseCases,\n    private val coroutineScope: CoroutineScope,\n    currentDateFlow: StateFlow<LocalDate>,\n) {\n\n    private val _stats = MutableStateFlow(StepCounterState(LocalDate.now(), 0, 0, 0.0, 0))\n    val stats: StateFlow<StepCounterState> = _stats.asStateFlow()\n\n    private var getStatsJob: Job? = null\n\n    init {\n        coroutineScope.launch {\n            currentDateFlow.collect { getStats(it) }\n        }\n    }\n\n    private fun getStats(date: LocalDate) {\n        getStatsJob?.cancel()\n\n        getStatsJob = dayUseCases.getDay(date).onEach { day ->\n            _stats.value = day.run {\n                StepCounterState(\n                    date = date,\n                    steps = steps,\n                    goal = goal,\n                    distanceTravelled = distanceTravelled,\n                    calorieBurned = calorieBurned.roundToInt()\n                )\n            }\n        }.launchIn(coroutineScope)\n    }\n\n    private val rawStepSensorReadings = MutableStateFlow(StepCounterEvent(0, LocalDate.MIN))\n    private var previousStepCount: Int? = null\n\n    init {\n        rawStepSensorReadings.drop(1).onEach { event ->\n            val stepCountDifference = event.stepCount - (previousStepCount ?: event.stepCount)\n            previousStepCount = event.stepCount\n            dayUseCases.incrementStepCount(event.eventDate, stepCountDifference)\n        }.launchIn(coroutineScope)\n    }\n\n    fun onStepCountChanged(newStepCount: Int, eventDate: LocalDate) {\n        rawStepSensorReadings.value = StepCounterEvent(newStepCount, eventDate)\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/pl/bartek537/forest/service/StepCounterEvent.kt",
    "content": "package pl.bartek537.forest.service\n\nimport java.time.LocalDate\n\ndata class StepCounterEvent(\n    val stepCount: Int,\n    val eventDate: LocalDate,\n)"
  },
  {
    "path": "app/src/main/java/pl/bartek537/forest/service/StepCounterService.kt",
    "content": "package pl.bartek537.forest.service\n\nimport android.app.Notification\nimport android.app.NotificationChannel\nimport android.app.NotificationManager\nimport android.app.PendingIntent\nimport android.content.Context\nimport android.content.Intent\nimport android.hardware.Sensor\nimport android.hardware.SensorEvent\nimport android.hardware.SensorEventListener\nimport android.hardware.SensorManager\nimport android.os.Build\nimport android.os.Build.VERSION_CODES\nimport androidx.annotation.RequiresApi\nimport androidx.core.app.NotificationCompat\nimport androidx.lifecycle.Lifecycle\nimport androidx.lifecycle.LifecycleService\nimport androidx.lifecycle.lifecycleScope\nimport androidx.lifecycle.repeatOnLifecycle\nimport kotlinx.coroutines.launch\nimport pl.bartek537.forest.ForestApplication\nimport pl.bartek537.forest.R\nimport pl.bartek537.forest.core.data.repository.DayRepositoryImpl\nimport pl.bartek537.forest.core.domain.usecase.DayUseCases\nimport pl.bartek537.forest.core.presentation.MainActivity\nimport pl.bartek537.forest.settings.data.repository.SettingsRepositoryImpl\nimport java.time.LocalDate\n\nclass StepCounterService : LifecycleService(), SensorEventListener {\n\n    private lateinit var sensorManager: SensorManager\n    private lateinit var controller: StepCounterController\n\n    companion object {\n        private const val NOTIFICATION_CHANNEL_ID = \"step_counter_channel\"\n        private const val NOTIFICATION_ID = 0x1\n        private const val PENDING_INTENT_ID = 0x1\n    }\n\n    override fun onCreate() {\n        super.onCreate()\n        if (Build.VERSION.SDK_INT >= VERSION_CODES.O) {\n            val notificationChannel = createNotificationChannel()\n            registerNotificationChannel(notificationChannel)\n        }\n        sensorManager = getSystemService(Context.SENSOR_SERVICE) as SensorManager\n        registerStepCounter(sensorManager)\n\n        // Initialise controller\n        val application = application as ForestApplication\n\n        val settingsStore = application.settingsStore\n        val settingsRepository = SettingsRepositoryImpl(settingsStore)\n        val dayDatabase = application.forestDatabase\n        val dayRepository = DayRepositoryImpl(dayDatabase.dayDao)\n        val dayUseCases = DayUseCases(dayRepository, settingsRepository)\n\n        controller = StepCounterController(dayUseCases, lifecycleScope, application.currentDate)\n\n        // Create notification\n        val notification = createNotification(controller.stats.value)\n        startForeground(NOTIFICATION_ID, notification)\n\n        val notificationManager = getSystemService(NOTIFICATION_SERVICE) as NotificationManager\n        lifecycleScope.launch {\n            repeatOnLifecycle(Lifecycle.State.STARTED) {\n                controller.stats.collect {\n                    val updatedNotification = createNotification(it)\n                    notificationManager.notify(NOTIFICATION_ID, updatedNotification)\n                }\n            }\n        }\n    }\n\n    private fun createNotification(state: StepCounterState): Notification = state.run {\n        val title = resources.getQuantityString(R.plurals.step_count, steps, steps)\n        val progress = if (goal == 0) 0 else steps * 100 / goal\n        val content = getString(\n            R.string.step_counter_stats, calorieBurned, distanceTravelled, progress\n        )\n\n        NotificationCompat.Builder(this@StepCounterService, NOTIFICATION_CHANNEL_ID)\n            .setContentIntent(launchApplicationPendingIntent)\n            .setSmallIcon(R.drawable.nature_fill0_wght400_grad0_opsz24)\n            .setContentTitle(title)\n            .setContentText(content)\n            .setOnlyAlertOnce(true)\n            .setOngoing(true)\n            .setVisibility(NotificationCompat.VISIBILITY_PUBLIC)\n            .setSilent(true)\n            .build()\n    }\n\n    private val launchApplicationPendingIntent\n        get(): PendingIntent {\n            val intent = Intent(applicationContext, MainActivity::class.java)\n            val flags = PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE\n            return PendingIntent.getActivity(this, PENDING_INTENT_ID, intent, flags)\n        }\n\n    private fun registerStepCounter(sensorManager: SensorManager) {\n        val stepCounterSensor: Sensor? = sensorManager.getDefaultSensor(Sensor.TYPE_STEP_COUNTER)\n        stepCounterSensor?.let {\n            sensorManager.registerListener(this, it, SensorManager.SENSOR_DELAY_NORMAL)\n        }\n    }\n\n    override fun onSensorChanged(event: SensorEvent?) {\n        event?.let {\n            val eventStepCount = it.values[0].toInt()\n            controller.onStepCountChanged(eventStepCount, LocalDate.now())\n        }\n    }\n\n    override fun onAccuracyChanged(sensor: Sensor?, accuracy: Int) {}\n\n    override fun onDestroy() {\n        super.onDestroy()\n        sensorManager.unregisterListener(this)\n    }\n\n    @RequiresApi(VERSION_CODES.O)\n    private fun createNotificationChannel(): NotificationChannel {\n        val name = getString(R.string.step_counter_channel)\n        val importance = NotificationManager.IMPORTANCE_DEFAULT\n\n        return NotificationChannel(NOTIFICATION_CHANNEL_ID, name, importance).apply {\n            setShowBadge(false)\n        }\n    }\n\n    @RequiresApi(VERSION_CODES.O)\n    private fun registerNotificationChannel(channel: NotificationChannel) {\n        val notificationManager = getSystemService(NOTIFICATION_SERVICE) as NotificationManager\n        notificationManager.createNotificationChannel(channel)\n    }\n}"
  },
  {
    "path": "app/src/main/java/pl/bartek537/forest/service/StepCounterServiceLauncher.kt",
    "content": "package pl.bartek537.forest.service\n\nimport android.Manifest\nimport android.content.BroadcastReceiver\nimport android.content.Context\nimport android.content.Intent\nimport android.content.pm.PackageManager\nimport android.os.Build\nimport androidx.core.content.ContextCompat\n\nclass StepCounterServiceLauncher : BroadcastReceiver() {\n\n    override fun onReceive(context: Context?, intent: Intent?) {\n        context?.run {\n            if (intent?.action == Intent.ACTION_BOOT_COMPLETED && hasPermissions(context)) {\n                val launchIntent = Intent(applicationContext, StepCounterService::class.java)\n                ContextCompat.startForegroundService(applicationContext, launchIntent)\n            }\n        }\n    }\n\n    private fun hasPermissions(context: Context): Boolean {\n        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {\n            if (!hasPermission(context, Manifest.permission.ACTIVITY_RECOGNITION)) {\n                return false\n            }\n        }\n        return true\n    }\n\n    @Suppress(\"SameParameterValue\")\n    private fun hasPermission(context: Context, permission: String): Boolean {\n        val status = ContextCompat.checkSelfPermission(context, permission)\n        return status == PackageManager.PERMISSION_GRANTED\n    }\n}"
  },
  {
    "path": "app/src/main/java/pl/bartek537/forest/service/StepCounterState.kt",
    "content": "package pl.bartek537.forest.service\n\nimport java.time.LocalDate\n\ndata class StepCounterState(\n    val date: LocalDate,\n    val steps: Int,\n    val goal: Int,\n    val distanceTravelled: Double,\n    val calorieBurned: Int\n)"
  },
  {
    "path": "app/src/main/java/pl/bartek537/forest/settings/SettingsActivity.kt",
    "content": "package pl.bartek537.forest.settings\n\nimport android.os.Bundle\nimport androidx.appcompat.app.AppCompatActivity\nimport androidx.core.view.WindowCompat\nimport pl.bartek537.forest.databinding.ActivitySettingsBinding\n\nclass SettingsActivity : AppCompatActivity() {\n\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n        WindowCompat.setDecorFitsSystemWindows(window, false)\n\n        val binding = ActivitySettingsBinding.inflate(layoutInflater)\n        setContentView(binding.root)\n        setupActionBar(binding)\n    }\n\n    private fun setupActionBar(binding: ActivitySettingsBinding) {\n        setSupportActionBar(binding.toolbar)\n        supportActionBar?.setDisplayHomeAsUpEnabled(true)\n    }\n}"
  },
  {
    "path": "app/src/main/java/pl/bartek537/forest/settings/SettingsFragment.kt",
    "content": "package pl.bartek537.forest.settings\n\nimport android.os.Bundle\nimport android.text.InputType\nimport androidx.fragment.app.activityViewModels\nimport androidx.preference.EditTextPreference\nimport androidx.preference.Preference\nimport androidx.preference.PreferenceFragmentCompat\nimport pl.bartek537.forest.R\n\nclass SettingsFragment : PreferenceFragmentCompat() {\n\n    private val viewModel: SettingsViewModel by activityViewModels { SettingsViewModel }\n\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n        viewModel.observeSettingsChanges()\n    }\n\n    override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {\n        setPreferencesFromResource(R.xml.settings, rootKey)\n\n        val dailyGoalPreference = preferenceManager.findPreference<EditTextPreference>(\"daily_goal\")\n        dailyGoalPreference?.summaryProvider = Preference.SummaryProvider<EditTextPreference> {\n            val dailyGoal = it.text?.toIntOrNull() ?: 0\n            resources.getQuantityString(R.plurals.daily_goal_summary, dailyGoal, dailyGoal)\n        }\n\n        val numericPreferenceKeys = listOf(\"daily_goal\", \"step_length\", \"height\", \"weight\")\n        numericPreferenceKeys.forEach {\n            val preference = preferenceManager.findPreference<EditTextPreference>(it)\n            preference?.setOnBindEditTextListener { editText ->\n                editText.inputType = InputType.TYPE_CLASS_NUMBER\n            }\n        }\n    }\n}"
  },
  {
    "path": "app/src/main/java/pl/bartek537/forest/settings/SettingsViewModel.kt",
    "content": "package pl.bartek537.forest.settings\n\nimport androidx.lifecycle.ViewModel\nimport androidx.lifecycle.ViewModelProvider\nimport androidx.lifecycle.ViewModelProvider.AndroidViewModelFactory.Companion.APPLICATION_KEY\nimport androidx.lifecycle.viewModelScope\nimport androidx.lifecycle.viewmodel.CreationExtras\nimport kotlinx.coroutines.Job\nimport kotlinx.coroutines.flow.launchIn\nimport kotlinx.coroutines.flow.onEach\nimport pl.bartek537.forest.ForestApplication\nimport pl.bartek537.forest.core.data.repository.DayRepositoryImpl\nimport pl.bartek537.forest.core.domain.model.DaySettings\nimport pl.bartek537.forest.settings.data.repository.SettingsRepositoryImpl\nimport pl.bartek537.forest.settings.domain.usecase.SettingsUseCases\nimport java.time.LocalDate\n\nclass SettingsViewModel(\n    private val settingsUseCases: SettingsUseCases\n) : ViewModel() {\n\n    private var observeSettingsChangesJob: Job? = null\n\n    fun observeSettingsChanges() {\n        observeSettingsChangesJob?.cancel()\n        observeSettingsChangesJob = settingsUseCases.getSettings().onEach {\n            settingsUseCases.updateDaySettings(\n                DaySettings(\n                    date = LocalDate.now(),\n                    goal = it.dailyGoal,\n                    height = it.height,\n                    weight = it.weight,\n                    stepLength = it.stepLength,\n                    pace = it.pace\n                )\n            )\n        }.launchIn(viewModelScope)\n    }\n\n    companion object Factory : ViewModelProvider.Factory {\n\n        @Suppress(\"UNCHECKED_CAST\")\n        override fun <T : ViewModel> create(modelClass: Class<T>, extras: CreationExtras): T {\n            val application = checkNotNull(extras[APPLICATION_KEY]) as ForestApplication\n\n            val settingsStore = application.settingsStore\n            val settingsRepository = SettingsRepositoryImpl(settingsStore)\n            val dayDatabase = application.forestDatabase\n            val dayRepository = DayRepositoryImpl(dayDatabase.dayDao)\n\n            val settingsUseCases = SettingsUseCases(settingsRepository, dayRepository)\n\n            return SettingsViewModel(settingsUseCases) as T\n        }\n    }\n}"
  },
  {
    "path": "app/src/main/java/pl/bartek537/forest/settings/data/repository/SettingsRepositoryImpl.kt",
    "content": "package pl.bartek537.forest.settings.data.repository\n\nimport kotlinx.coroutines.flow.Flow\nimport pl.bartek537.forest.settings.data.source.SettingsStore\nimport pl.bartek537.forest.settings.domain.model.Settings\nimport pl.bartek537.forest.settings.domain.repository.SettingsRepository\n\nclass SettingsRepositoryImpl(\n    private val settingsStore: SettingsStore\n) : SettingsRepository {\n\n    override fun getSettings(): Flow<Settings> {\n        return settingsStore.getSettings()\n    }\n}"
  },
  {
    "path": "app/src/main/java/pl/bartek537/forest/settings/data/source/SettingsStore.kt",
    "content": "package pl.bartek537.forest.settings.data.source\n\nimport kotlinx.coroutines.flow.Flow\nimport pl.bartek537.forest.settings.domain.model.Settings\n\ninterface SettingsStore {\n\n    fun getSettings(): Flow<Settings>\n}"
  },
  {
    "path": "app/src/main/java/pl/bartek537/forest/settings/data/source/SettingsStoreImpl.kt",
    "content": "package pl.bartek537.forest.settings.data.source\n\nimport android.content.SharedPreferences\nimport android.content.SharedPreferences.OnSharedPreferenceChangeListener\nimport kotlinx.coroutines.flow.Flow\nimport kotlinx.coroutines.flow.MutableStateFlow\nimport kotlinx.coroutines.flow.asStateFlow\nimport pl.bartek537.forest.settings.domain.model.Settings\n\nclass SettingsStoreImpl(\n    private val sharedPreferences: SharedPreferences\n) : SettingsStore, OnSharedPreferenceChangeListener {\n\n    private val settings: MutableStateFlow<Settings>\n\n    init {\n        val parsedSettings = parseSettings(sharedPreferences)\n        settings = MutableStateFlow(parsedSettings)\n        sharedPreferences.registerOnSharedPreferenceChangeListener(this)\n    }\n\n    override fun getSettings(): Flow<Settings> {\n        return settings.asStateFlow()\n    }\n\n    private fun parseSettings(sharedPreferences: SharedPreferences): Settings =\n        sharedPreferences.run {\n            Settings(\n                dailyGoal = getNumericString(\"daily_goal\", 0),\n                stepLength = getNumericString(\"step_length\", 0),\n                height = getNumericString(\"height\", 0),\n                weight = getNumericString(\"weight\", 0),\n                pace = getNumericString(\"pace\", 0.0)\n            )\n        }\n\n    private fun SharedPreferences.getNumericString(key: String, defaultValue: Int): Int =\n        getString(key, \"\")?.toIntOrNull() ?: defaultValue\n\n    private fun SharedPreferences.getNumericString(key: String, defaultValue: Double): Double =\n        getString(key, \"\")?.toDoubleOrNull() ?: defaultValue\n\n    override fun onSharedPreferenceChanged(\n        updatedSharedPreferences: SharedPreferences?,\n        key: String?\n    ) {\n        settings.value = parseSettings(sharedPreferences)\n    }\n}"
  },
  {
    "path": "app/src/main/java/pl/bartek537/forest/settings/domain/model/Settings.kt",
    "content": "package pl.bartek537.forest.settings.domain.model\n\ndata class Settings(\n    val dailyGoal: Int,\n    val stepLength: Int,\n    val height: Int,\n    val weight: Int,\n    val pace: Double\n)\n"
  },
  {
    "path": "app/src/main/java/pl/bartek537/forest/settings/domain/repository/SettingsRepository.kt",
    "content": "package pl.bartek537.forest.settings.domain.repository\n\nimport kotlinx.coroutines.flow.Flow\nimport pl.bartek537.forest.settings.domain.model.Settings\n\ninterface SettingsRepository {\n\n    fun getSettings(): Flow<Settings>\n}"
  },
  {
    "path": "app/src/main/java/pl/bartek537/forest/settings/domain/usecase/GetSettings.kt",
    "content": "package pl.bartek537.forest.settings.domain.usecase\n\nimport kotlinx.coroutines.flow.Flow\nimport pl.bartek537.forest.settings.domain.model.Settings\nimport pl.bartek537.forest.settings.domain.repository.SettingsRepository\n\ninterface GetSettings {\n\n    operator fun invoke(): Flow<Settings>\n}\n\nclass GetSettingsImpl(\n    private val repository: SettingsRepository\n) : GetSettings {\n\n    override fun invoke(): Flow<Settings> {\n        return repository.getSettings()\n    }\n}"
  },
  {
    "path": "app/src/main/java/pl/bartek537/forest/settings/domain/usecase/SettingsUseCases.kt",
    "content": "package pl.bartek537.forest.settings.domain.usecase\n\nimport pl.bartek537.forest.core.domain.repository.DayRepository\nimport pl.bartek537.forest.settings.domain.repository.SettingsRepository\n\nclass SettingsUseCases(\n    settingsRepository: SettingsRepository,\n    dayRepository: DayRepository,\n) {\n\n    val getSettings: GetSettings = GetSettingsImpl(settingsRepository)\n    val updateDaySettings: UpdateDaySettings = UpdateDaySettingsImpl(dayRepository)\n}"
  },
  {
    "path": "app/src/main/java/pl/bartek537/forest/settings/domain/usecase/UpdateDaySettings.kt",
    "content": "package pl.bartek537.forest.settings.domain.usecase\n\nimport pl.bartek537.forest.core.domain.model.DaySettings\nimport pl.bartek537.forest.core.domain.repository.DayRepository\n\ninterface UpdateDaySettings {\n\n    suspend operator fun invoke(daySettings: DaySettings)\n}\n\nclass UpdateDaySettingsImpl(\n    private val dayRepository: DayRepository\n) : UpdateDaySettings {\n\n    override suspend fun invoke(daySettings: DaySettings) {\n        dayRepository.updateDaySettings(daySettings)\n    }\n}"
  },
  {
    "path": "app/src/main/java/pl/bartek537/forest/stats/StatsFragment.kt",
    "content": "package pl.bartek537.forest.stats\n\nimport android.os.Bundle\nimport android.view.LayoutInflater\nimport android.view.View\nimport android.view.ViewGroup\nimport androidx.fragment.app.Fragment\nimport androidx.viewpager2.adapter.FragmentStateAdapter\nimport com.google.android.material.tabs.TabLayoutMediator\nimport pl.bartek537.forest.R\nimport pl.bartek537.forest.databinding.FragmentStatsBinding\nimport pl.bartek537.forest.stats.presentation.StatsDetailsFragment\nimport pl.bartek537.forest.stats.presentation.StatsSummaryFragment\n\nclass StatsFragment : Fragment() {\n\n    private lateinit var binding: FragmentStatsBinding\n\n    companion object {\n\n        private val fragments = listOf(\n            R.string.details to { StatsDetailsFragment() },\n            R.string.summary to { StatsSummaryFragment() },\n        )\n    }\n\n    override fun onCreateView(\n        inflater: LayoutInflater,\n        container: ViewGroup?,\n        savedInstanceState: Bundle?\n    ): View {\n        binding = FragmentStatsBinding.inflate(inflater, container, false)\n        return binding.root\n    }\n\n    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {\n        val statsPageAdapter = StatsPageAdapter(this)\n        binding.pager.apply {\n            isUserInputEnabled = false\n            adapter = statsPageAdapter\n        }\n        TabLayoutMediator(binding.tabLayout, binding.pager) { tab, position ->\n            val tabTitleRes = fragments[position].first\n            tab.text = getString(tabTitleRes)\n        }.attach()\n    }\n\n    class StatsPageAdapter(fragment: Fragment) : FragmentStateAdapter(fragment) {\n\n        override fun getItemCount(): Int = fragments.size\n\n        override fun createFragment(position: Int): Fragment {\n            return fragments[position].second()\n        }\n    }\n}"
  },
  {
    "path": "app/src/main/java/pl/bartek537/forest/stats/domain/usecase/GetFirstDate.kt",
    "content": "package pl.bartek537.forest.stats.domain.usecase\n\nimport kotlinx.coroutines.flow.Flow\nimport kotlinx.coroutines.flow.map\nimport pl.bartek537.forest.core.domain.repository.DayRepository\nimport java.time.LocalDate\n\ninterface GetFirstDate {\n\n    operator fun invoke(): Flow<LocalDate>\n}\n\nclass GetFirstDateImpl(\n    private val dayRepository: DayRepository\n) : GetFirstDate {\n\n    override fun invoke(): Flow<LocalDate> {\n        return dayRepository.getFirstDay().map { it?.date ?: LocalDate.now() }\n    }\n}"
  },
  {
    "path": "app/src/main/java/pl/bartek537/forest/stats/domain/usecase/GetSummary.kt",
    "content": "package pl.bartek537.forest.stats.domain.usecase\n\nimport pl.bartek537.forest.core.domain.model.StatsSummary\nimport pl.bartek537.forest.core.domain.model.of\nimport pl.bartek537.forest.core.domain.repository.DayRepository\n\ninterface GetSummary {\n    suspend operator fun invoke(): StatsSummary\n}\n\nclass GetSummaryImpl(\n    private val dayRepository: DayRepository\n) : GetSummary {\n\n    override suspend operator fun invoke(): StatsSummary {\n        val allDays = dayRepository.getAllDays()\n        return StatsSummary.of(allDays)\n    }\n}"
  },
  {
    "path": "app/src/main/java/pl/bartek537/forest/stats/domain/usecase/GetWeek.kt",
    "content": "package pl.bartek537.forest.stats.domain.usecase\n\nimport kotlinx.coroutines.flow.Flow\nimport pl.bartek537.forest.core.domain.model.Day\nimport pl.bartek537.forest.core.domain.repository.DayRepository\nimport java.time.LocalDate\n\ninterface GetWeek {\n\n    operator fun invoke(startingAt: LocalDate): Flow<List<Day>>\n}\n\nclass GetWeekImpl(\n    private val dayRepository: DayRepository\n) : GetWeek {\n\n    override fun invoke(startingAt: LocalDate): Flow<List<Day>> {\n        val endingAt = startingAt.plusDays(6)\n        return dayRepository.getDays(startingAt..endingAt)\n    }\n}"
  },
  {
    "path": "app/src/main/java/pl/bartek537/forest/stats/domain/usecase/StatsChartPageUseCases.kt",
    "content": "package pl.bartek537.forest.stats.domain.usecase\n\nimport pl.bartek537.forest.core.domain.repository.DayRepository\n\nclass StatsChartPageUseCases(\n    dayRepository: DayRepository\n) {\n\n    val getWeek: GetWeek = GetWeekImpl(dayRepository)\n}"
  },
  {
    "path": "app/src/main/java/pl/bartek537/forest/stats/domain/usecase/StatsDetailsUseCases.kt",
    "content": "package pl.bartek537.forest.stats.domain.usecase\n\nimport pl.bartek537.forest.core.domain.repository.DayRepository\n\nclass StatsDetailsUseCases(\n    dayRepository: DayRepository\n) {\n\n    val getFirstDate: GetFirstDate = GetFirstDateImpl(dayRepository)\n}"
  },
  {
    "path": "app/src/main/java/pl/bartek537/forest/stats/domain/usecase/StatsSummaryUseCases.kt",
    "content": "package pl.bartek537.forest.stats.domain.usecase\n\nimport pl.bartek537.forest.core.domain.repository.DayRepository\n\nclass StatsSummaryUseCases(\n    dayRepository: DayRepository\n) {\n\n    val getSummary: GetSummary = GetSummaryImpl(dayRepository)\n}"
  },
  {
    "path": "app/src/main/java/pl/bartek537/forest/stats/presentation/ChartAdapter.kt",
    "content": "package pl.bartek537.forest.stats.presentation\n\nimport android.content.res.ColorStateList\nimport android.view.LayoutInflater\nimport android.view.ViewGroup\nimport androidx.annotation.AttrRes\nimport androidx.constraintlayout.widget.ConstraintLayout\nimport androidx.recyclerview.widget.DiffUtil\nimport androidx.recyclerview.widget.ListAdapter\nimport androidx.recyclerview.widget.RecyclerView.ViewHolder\nimport pl.bartek537.forest.databinding.ItemChartBarBinding\nimport pl.bartek537.forest.stats.util.getThemeColor\n\nclass ChartAdapter<T>(\n    private val listener: OnValueSelected<T>\n) : ListAdapter<ChartAdapter.ChartValue<T>, ChartAdapter.ChartItemViewHolder<T>>(DiffCallback()) {\n\n    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ChartItemViewHolder<T> {\n        val layoutInflater = LayoutInflater.from(parent.context)\n        val binding = ItemChartBarBinding.inflate(layoutInflater, parent, false)\n        return ChartItemViewHolder(binding)\n    }\n\n    override fun onBindViewHolder(holder: ChartItemViewHolder<T>, position: Int) {\n        val value = getItem(position)\n        holder.bind(value, listener)\n    }\n\n    class ChartItemViewHolder<T>(\n        private val binding: ItemChartBarBinding\n    ) : ViewHolder(binding.root) {\n\n        fun bind(chartValue: ChartValue<T>, listener: OnValueSelected<T>) {\n            binding.root.setOnClickListener { listener.onSelect(chartValue) }\n            binding.textSupporting.apply {\n                text = chartValue.label\n                val color = context.getThemeColor(chartValue.textColor)\n                setTextColor(color)\n            }\n            binding.barFilled.apply {\n                val color = context.getThemeColor(chartValue.barColor)\n                backgroundTintList = ColorStateList.valueOf(color)\n                val params = layoutParams as ConstraintLayout.LayoutParams\n                params.matchConstraintPercentHeight = chartValue.value.toFloat()\n                requestLayout()\n            }\n        }\n    }\n\n    private class DiffCallback<T> : DiffUtil.ItemCallback<ChartValue<T>>() {\n\n        override fun areItemsTheSame(oldItem: ChartValue<T>, newItem: ChartValue<T>): Boolean {\n            return oldItem.id == newItem.id\n        }\n\n        override fun areContentsTheSame(oldItem: ChartValue<T>, newItem: ChartValue<T>): Boolean {\n            return oldItem == newItem\n        }\n    }\n\n    data class ChartValue<T>(\n\n        val id: T,\n\n        val value: Double,\n\n        val label: String,\n\n        @field:AttrRes\n        val barColor: Int,\n\n        @field:AttrRes\n        val textColor: Int,\n    )\n\n    fun interface OnValueSelected<T> {\n        fun onSelect(value: ChartValue<T>)\n    }\n}"
  },
  {
    "path": "app/src/main/java/pl/bartek537/forest/stats/presentation/StatsChartFragment.kt",
    "content": "package pl.bartek537.forest.stats.presentation\n\nimport android.os.Bundle\nimport android.view.LayoutInflater\nimport android.view.View\nimport android.view.ViewGroup\nimport androidx.core.view.isVisible\nimport androidx.fragment.app.Fragment\nimport androidx.fragment.app.activityViewModels\nimport androidx.lifecycle.Lifecycle\nimport androidx.lifecycle.lifecycleScope\nimport androidx.lifecycle.repeatOnLifecycle\nimport androidx.viewpager2.adapter.FragmentStateAdapter\nimport kotlinx.coroutines.launch\nimport pl.bartek537.forest.databinding.FragmentStatsChartBinding\nimport java.time.LocalDate\nimport java.time.Period\nimport java.time.format.DateTimeFormatter\n\nclass StatsChartFragment : Fragment() {\n\n    private val statsDetailsViewModel: StatsDetailsViewModel by activityViewModels { StatsDetailsViewModel.Factory }\n\n    private lateinit var binding: FragmentStatsChartBinding\n    private lateinit var chartPageAdapter: ChartPageAdapter\n\n    private val dateFormatter = DateTimeFormatter.ofPattern(\"EEE, MMM dd\")\n\n    override fun onCreateView(\n        inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?\n    ): View {\n        binding = FragmentStatsChartBinding.inflate(inflater, container, false)\n        return binding.root\n    }\n\n    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {\n        super.onViewCreated(view, savedInstanceState)\n\n        chartPageAdapter = ChartPageAdapter(this)\n        binding.viewPagerChart.adapter = chartPageAdapter\n\n        binding.buttonPreviousDay.setOnClickListener { changeSelectedDate(offset = -1) }\n        binding.buttonNextDay.setOnClickListener { changeSelectedDate(offset = 1) }\n\n        lifecycleScope.launch {\n            viewLifecycleOwner.repeatOnLifecycle(Lifecycle.State.STARTED) {\n                statsDetailsViewModel.day.collect {\n                    updateUserInterface(it.date, it.chartDateRange)\n                }\n            }\n        }\n    }\n\n    private fun changeSelectedDate(offset: Long) {\n        val currentDate = statsDetailsViewModel.day.value.date\n        statsDetailsViewModel.selectDay(currentDate.plusDays(offset))\n    }\n\n    private fun updateUserInterface(selectedDate: LocalDate, dateRange: ClosedRange<LocalDate>) {\n        binding.apply {\n            textSelectedDate.text = selectedDate.format(dateFormatter)\n            buttonPreviousDay.isVisible = selectedDate.isAfter(dateRange.start)\n            buttonNextDay.isVisible = selectedDate.isBefore(dateRange.endInclusive)\n            chartPageAdapter.dateRange = dateRange\n            scrollChartTo(selectedDate)\n        }\n    }\n\n    private fun scrollChartTo(\n        selectedDate: LocalDate,\n    ) {\n        val pageIndex = chartPageAdapter.getPageContaining(selectedDate)\n        binding.viewPagerChart.currentItem = pageIndex\n    }\n\n    class ChartPageAdapter(fragment: Fragment) : FragmentStateAdapter(fragment) {\n\n        var dateRange = LocalDate.now()..LocalDate.now()\n\n        fun getPageContaining(selectedDate: LocalDate): Int {\n            val period = Period.between(selectedDate, dateRange.endInclusive)\n            return (period.days / 7).coerceIn(0, itemCount)\n        }\n\n        override fun getItemCount(): Int = dateRange.run {\n            val period = Period.between(start, endInclusive)\n            return period.days / 7 + 1\n        }\n\n        override fun createFragment(position: Int): Fragment {\n            val fragment = StatsChartPageFragment()\n            fragment.arguments = Bundle().apply {\n                putLong(StatsChartPageFragment.ARG_PAGE_NUMBER, position.toLong())\n            }\n            return fragment\n        }\n    }\n}"
  },
  {
    "path": "app/src/main/java/pl/bartek537/forest/stats/presentation/StatsChartPageFragment.kt",
    "content": "package pl.bartek537.forest.stats.presentation\n\nimport android.os.Bundle\nimport android.view.LayoutInflater\nimport android.view.View\nimport android.view.ViewGroup\nimport androidx.fragment.app.Fragment\nimport androidx.fragment.app.activityViewModels\nimport androidx.fragment.app.viewModels\nimport androidx.lifecycle.Lifecycle\nimport androidx.lifecycle.lifecycleScope\nimport androidx.lifecycle.repeatOnLifecycle\nimport kotlinx.coroutines.flow.collect\nimport kotlinx.coroutines.flow.combine\nimport kotlinx.coroutines.launch\nimport pl.bartek537.forest.core.domain.model.Day\nimport pl.bartek537.forest.databinding.FragmentStatsPageChartBinding\nimport pl.bartek537.forest.stats.util.toChartValues\nimport java.lang.Integer.max\nimport java.time.LocalDate\n\nclass StatsChartPageFragment : Fragment() {\n\n    companion object {\n        const val ARG_PAGE_NUMBER = \"__page_number\"\n    }\n\n    private lateinit var binding: FragmentStatsPageChartBinding\n\n    private val statsChartPageViewModel: StatsChartPageViewModel by viewModels { StatsChartPageViewModel.Factory }\n    private val statsDetailsViewModel: StatsDetailsViewModel by activityViewModels { StatsDetailsViewModel.Factory }\n\n    private var pageNumber: Long = 0\n\n    private val chartAdapter = ChartAdapter {\n        statsDetailsViewModel.selectDay(it.id)\n    }\n\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n        pageNumber = arguments?.getLong(ARG_PAGE_NUMBER) ?: 0\n    }\n\n    override fun onCreateView(\n        inflater: LayoutInflater,\n        container: ViewGroup?,\n        savedInstanceState: Bundle?\n    ): View {\n        binding = FragmentStatsPageChartBinding.inflate(inflater, container, false)\n        return binding.root\n    }\n\n    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {\n        binding.recyclerViewChart.apply {\n            adapter = chartAdapter\n        }\n\n        lifecycleScope.launch {\n            val activeDayFlow = statsDetailsViewModel.day\n            viewLifecycleOwner.repeatOnLifecycle(Lifecycle.State.CREATED) {\n                launch {\n                    val weekFlow = statsChartPageViewModel.week\n                    weekFlow.combine(activeDayFlow) { week, activeDay ->\n                        updateUserInterface(week, activeDay.date)\n                    }.collect()\n                }\n                launch {\n                    activeDayFlow.collect {\n                        updateSelectedWeek(it.chartDateRange.endInclusive)\n                    }\n                }\n            }\n        }\n    }\n\n    private fun updateUserInterface(week: List<Day>, activeDate: LocalDate) {\n        val highestChartValue = week.maxOfOrNull { max(it.steps, it.goal) } ?: 1\n        val locale = resources.configuration.locales[0]\n        val chartValues = week.toChartValues(highestChartValue, locale, activeDate)\n        chartAdapter.submitList(chartValues)\n    }\n\n    private fun updateSelectedWeek(lastDate: LocalDate) {\n        val daysToSubtract = 7 * pageNumber + 6\n        val firstDate = lastDate.minusDays(daysToSubtract)\n        statsChartPageViewModel.selectWeek(firstDate)\n    }\n}"
  },
  {
    "path": "app/src/main/java/pl/bartek537/forest/stats/presentation/StatsChartPageViewModel.kt",
    "content": "package pl.bartek537.forest.stats.presentation\n\nimport androidx.lifecycle.ViewModel\nimport androidx.lifecycle.ViewModelProvider\nimport androidx.lifecycle.viewModelScope\nimport androidx.lifecycle.viewmodel.CreationExtras\nimport kotlinx.coroutines.Job\nimport kotlinx.coroutines.flow.MutableStateFlow\nimport kotlinx.coroutines.flow.StateFlow\nimport kotlinx.coroutines.flow.asStateFlow\nimport kotlinx.coroutines.launch\nimport pl.bartek537.forest.ForestApplication\nimport pl.bartek537.forest.core.data.repository.DayRepositoryImpl\nimport pl.bartek537.forest.core.domain.model.Day\nimport pl.bartek537.forest.stats.domain.usecase.StatsChartPageUseCases\nimport pl.bartek537.forest.stats.util.alignWeek\nimport java.time.LocalDate\n\nclass StatsChartPageViewModel(\n    private val statsChartPageUseCases: StatsChartPageUseCases\n) : ViewModel() {\n\n    private val _week = MutableStateFlow<List<Day>>(emptyList())\n    val week: StateFlow<List<Day>> = _week.asStateFlow()\n\n    private var getWeekJob: Job? = null\n    fun selectWeek(firstDate: LocalDate) {\n        getWeekJob?.cancel()\n        getWeekJob = viewModelScope.launch {\n            statsChartPageUseCases.getWeek(firstDate).collect { week ->\n                _week.value = week.alignWeek(firstDate)\n            }\n        }\n    }\n\n    companion object Factory : ViewModelProvider.Factory {\n\n        @Suppress(\"UNCHECKED_CAST\")\n        override fun <T : ViewModel> create(modelClass: Class<T>, extras: CreationExtras): T {\n            val application =\n                checkNotNull(extras[ViewModelProvider.AndroidViewModelFactory.APPLICATION_KEY]) as ForestApplication\n\n            val forestDatabase = application.forestDatabase\n            val dayRepository = DayRepositoryImpl(forestDatabase.dayDao)\n            val statsChartPageUseCases = StatsChartPageUseCases(dayRepository)\n\n            return StatsChartPageViewModel(statsChartPageUseCases) as T\n        }\n    }\n}"
  },
  {
    "path": "app/src/main/java/pl/bartek537/forest/stats/presentation/StatsChartState.kt",
    "content": "package pl.bartek537.forest.stats.presentation\n\nimport pl.bartek537.forest.core.domain.model.Day\nimport java.time.LocalDate\n\ndata class StatsChartState(\n    val week: List<Day>,\n    val dateRange: ClosedRange<LocalDate>\n) {\n    companion object\n}\n\nfun StatsChartState.Companion.of(currentDate: LocalDate) = StatsChartState(\n    week = emptyList(),\n    dateRange = currentDate..currentDate\n)"
  },
  {
    "path": "app/src/main/java/pl/bartek537/forest/stats/presentation/StatsDetailsFragment.kt",
    "content": "package pl.bartek537.forest.stats.presentation\n\nimport android.os.Bundle\nimport android.view.LayoutInflater\nimport android.view.View\nimport android.view.ViewGroup\nimport androidx.core.view.isVisible\nimport androidx.fragment.app.Fragment\nimport androidx.fragment.app.activityViewModels\nimport androidx.lifecycle.Lifecycle\nimport androidx.lifecycle.lifecycleScope\nimport androidx.lifecycle.repeatOnLifecycle\nimport kotlinx.coroutines.launch\nimport pl.bartek537.forest.R\nimport pl.bartek537.forest.databinding.FragmentStatsDetailsBinding\n\nclass StatsDetailsFragment : Fragment() {\n\n    private val viewModel: StatsDetailsViewModel by activityViewModels { StatsDetailsViewModel }\n\n    private lateinit var binding: FragmentStatsDetailsBinding\n\n    override fun onCreateView(\n        inflater: LayoutInflater,\n        container: ViewGroup?,\n        savedInstanceState: Bundle?\n    ): View {\n        binding = FragmentStatsDetailsBinding.inflate(inflater, container, false)\n        return binding.root\n    }\n\n    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {\n        lifecycleScope.launch {\n            viewLifecycleOwner.repeatOnLifecycle(Lifecycle.State.CREATED) {\n                viewModel.day.collect { updateUserInterface(it) }\n            }\n        }\n    }\n\n    private fun updateUserInterface(state: StatsDetailsState) = state.apply {\n        val stepsText = resources.getQuantityString(\n            R.plurals.step_count_format, stepsTaken, stepsTaken\n        )\n        val calorieText = getString(\n            R.string.calorie_burned_format, calorieBurned\n        )\n        val distanceText = getString(\n            R.string.distance_travelled_format, distanceTravelled\n        )\n        val carbonDioxideText = getString(\n            R.string.carbon_dioxide_saved_format, carbonDioxideSaved\n        )\n        binding.apply {\n            textStepCount.text = stepsText\n            viewGroupTree.isVisible = treeCollected\n            textCalorieBurned.text = calorieText\n            textDistanceTravelled.text = distanceText\n            textCarbonDioxideSaved.text = carbonDioxideText\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/pl/bartek537/forest/stats/presentation/StatsDetailsState.kt",
    "content": "package pl.bartek537.forest.stats.presentation\n\nimport java.time.LocalDate\n\ndata class StatsDetailsState(\n    val date: LocalDate,\n    val stepsTaken: Int,\n    val treeCollected: Boolean,\n    val calorieBurned: Int,\n    val distanceTravelled: Double,\n    val carbonDioxideSaved: Double,\n    val chartDateRange: ClosedRange<LocalDate>\n)"
  },
  {
    "path": "app/src/main/java/pl/bartek537/forest/stats/presentation/StatsDetailsViewModel.kt",
    "content": "package pl.bartek537.forest.stats.presentation\n\nimport androidx.lifecycle.ViewModel\nimport androidx.lifecycle.ViewModelProvider\nimport androidx.lifecycle.ViewModelProvider.AndroidViewModelFactory.Companion.APPLICATION_KEY\nimport androidx.lifecycle.viewModelScope\nimport androidx.lifecycle.viewmodel.CreationExtras\nimport kotlinx.coroutines.Job\nimport kotlinx.coroutines.flow.*\nimport kotlinx.coroutines.launch\nimport pl.bartek537.forest.ForestApplication\nimport pl.bartek537.forest.core.data.repository.DayRepositoryImpl\nimport pl.bartek537.forest.core.domain.usecase.DayUseCases\nimport pl.bartek537.forest.settings.data.repository.SettingsRepositoryImpl\nimport pl.bartek537.forest.stats.domain.usecase.StatsDetailsUseCases\nimport java.time.LocalDate\nimport kotlin.math.roundToInt\n\nclass StatsDetailsViewModel(\n    private val dayUseCases: DayUseCases,\n    statsDetailsUseCases: StatsDetailsUseCases,\n    currentDateFlow: StateFlow<LocalDate>\n) : ViewModel() {\n\n    private val _day = MutableStateFlow(\n        StatsDetailsState(\n            date = LocalDate.MIN,\n            stepsTaken = 0,\n            treeCollected = false,\n            calorieBurned = 0,\n            distanceTravelled = 0.0,\n            carbonDioxideSaved = 0.0,\n            chartDateRange = currentDateFlow.value..currentDateFlow.value\n        )\n    )\n    val day: StateFlow<StatsDetailsState> = _day.asStateFlow()\n\n    init {\n        selectDay(currentDateFlow.value)\n\n        viewModelScope.launch {\n            val firstDateFlow = statsDetailsUseCases.getFirstDate()\n            firstDateFlow\n                .combine(currentDateFlow) { firstDate, currentDate ->\n                    firstDate..currentDate\n                }.collect { dateRange ->\n                    _day.value = day.value.copy(chartDateRange = dateRange)\n                }\n        }\n    }\n\n    private var selectDateJob: Job? = null\n\n    fun selectDay(date: LocalDate) {\n        selectDateJob?.cancel()\n        selectDateJob = dayUseCases.getDay(date).onEach {\n            _day.value = day.value.copy(\n                date = it.date,\n                stepsTaken = it.steps,\n                treeCollected = it.steps >= it.goal,\n                calorieBurned = it.calorieBurned.roundToInt(),\n                distanceTravelled = it.distanceTravelled,\n                carbonDioxideSaved = it.carbonDioxideSaved\n            )\n        }.launchIn(viewModelScope)\n    }\n\n    companion object Factory : ViewModelProvider.Factory {\n\n        @Suppress(\"UNCHECKED_CAST\")\n        override fun <T : ViewModel> create(modelClass: Class<T>, extras: CreationExtras): T {\n            val application = checkNotNull(extras[APPLICATION_KEY]) as ForestApplication\n\n            val dayDatabase = application.forestDatabase\n            val dayRepository = DayRepositoryImpl(dayDatabase.dayDao)\n            val settingsStore = application.settingsStore\n            val settingsRepository = SettingsRepositoryImpl(settingsStore)\n            val dayUseCases = DayUseCases(dayRepository, settingsRepository)\n            val statsDetailsUseCases = StatsDetailsUseCases(dayRepository)\n\n            return StatsDetailsViewModel(\n                dayUseCases,\n                statsDetailsUseCases,\n                application.currentDate\n            ) as T\n        }\n    }\n}"
  },
  {
    "path": "app/src/main/java/pl/bartek537/forest/stats/presentation/StatsSummaryFragment.kt",
    "content": "package pl.bartek537.forest.stats.presentation\n\nimport android.os.Bundle\nimport android.view.LayoutInflater\nimport android.view.View\nimport android.view.ViewGroup\nimport androidx.fragment.app.Fragment\nimport androidx.fragment.app.viewModels\nimport androidx.lifecycle.Lifecycle\nimport androidx.lifecycle.lifecycleScope\nimport androidx.lifecycle.repeatOnLifecycle\nimport kotlinx.coroutines.launch\nimport pl.bartek537.forest.R\nimport pl.bartek537.forest.databinding.FragmentStatsSummaryBinding\nimport kotlin.math.roundToInt\n\n\nclass StatsSummaryFragment : Fragment() {\n\n    private lateinit var binding: FragmentStatsSummaryBinding\n\n    private val viewModel: StatsSummaryViewModel by viewModels { StatsSummaryViewModel }\n\n    override fun onCreateView(\n        inflater: LayoutInflater,\n        container: ViewGroup?,\n        savedInstanceState: Bundle?\n    ): View {\n        binding = FragmentStatsSummaryBinding.inflate(inflater, container, false)\n        return binding.root\n    }\n\n    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {\n        binding.swipeRefreshContainer.setOnRefreshListener {\n            viewModel.refreshStatsSummary()\n        }\n\n        lifecycleScope.launch {\n            viewLifecycleOwner.repeatOnLifecycle(Lifecycle.State.CREATED) {\n                viewModel.statsSummary.collect { updateUserInterface(it) }\n            }\n        }\n    }\n\n    private fun updateUserInterface(state: StatsSummaryState) = state.apply {\n        val treesText = resources.getQuantityString(\n            R.plurals.trees_collected_format, treesCollected, treesCollected\n        )\n        val stepsText = resources.getQuantityString(\n            R.plurals.step_count_format, stepsTaken.toInt(), stepsTaken\n        )\n        val calorieText = getString(\n            R.string.calorie_burned_format, calorieBurned.roundToInt()\n        )\n        val distanceText = getString(\n            R.string.distance_travelled_format, distanceTravelled\n        )\n        val carbonDioxideText = getString(\n            R.string.carbon_dioxide_saved_format, carbonDioxideSaved\n        )\n        binding.apply {\n            swipeRefreshContainer.isRefreshing = state.isRefreshing\n            textTreesCollected.text = treesText\n            textStepCount.text = stepsText\n            textCalorieBurned.text = calorieText\n            textDistanceTravelled.text = distanceText\n            textCarbonDioxideSaved.text = carbonDioxideText\n        }\n    }\n}"
  },
  {
    "path": "app/src/main/java/pl/bartek537/forest/stats/presentation/StatsSummaryState.kt",
    "content": "package pl.bartek537.forest.stats.presentation\n\ndata class StatsSummaryState(\n    val isRefreshing: Boolean = false,\n    val treesCollected: Int = 0,\n    val stepsTaken: Long = 0L,\n    val calorieBurned: Double = 0.0,\n    val distanceTravelled: Double = 0.0,\n    val carbonDioxideSaved: Double = 0.0,\n)\n"
  },
  {
    "path": "app/src/main/java/pl/bartek537/forest/stats/presentation/StatsSummaryViewModel.kt",
    "content": "package pl.bartek537.forest.stats.presentation\n\nimport androidx.lifecycle.ViewModel\nimport androidx.lifecycle.ViewModelProvider\nimport androidx.lifecycle.viewModelScope\nimport androidx.lifecycle.viewmodel.CreationExtras\nimport kotlinx.coroutines.Job\nimport kotlinx.coroutines.flow.MutableStateFlow\nimport kotlinx.coroutines.flow.StateFlow\nimport kotlinx.coroutines.flow.asStateFlow\nimport kotlinx.coroutines.launch\nimport pl.bartek537.forest.ForestApplication\nimport pl.bartek537.forest.core.data.repository.DayRepositoryImpl\nimport pl.bartek537.forest.stats.domain.usecase.StatsSummaryUseCases\n\nclass StatsSummaryViewModel(\n    private val statsSummaryUseCases: StatsSummaryUseCases\n) : ViewModel() {\n\n    private val _statsStatsSummary = MutableStateFlow(StatsSummaryState())\n    val statsSummary: StateFlow<StatsSummaryState> = _statsStatsSummary.asStateFlow()\n\n    init {\n        refreshStatsSummary()\n    }\n\n    private var refreshStatsSummaryJob: Job? = null\n\n    fun refreshStatsSummary() {\n        refreshStatsSummaryJob?.cancel()\n        refreshStatsSummaryJob = viewModelScope.launch {\n            _statsStatsSummary.value = statsSummary.value.copy(\n                isRefreshing = true\n            )\n            val updatedSummary = statsSummaryUseCases.getSummary()\n            updatedSummary.run {\n                _statsStatsSummary.value = statsSummary.value.copy(\n                    isRefreshing = false,\n                    treesCollected = treesCollected,\n                    stepsTaken = stepsTaken,\n                    calorieBurned = calorieBurned,\n                    distanceTravelled = distanceTravelled,\n                    carbonDioxideSaved = carbonDioxideSaved,\n                )\n            }\n        }\n    }\n\n    companion object Factory : ViewModelProvider.Factory {\n\n        @Suppress(\"UNCHECKED_CAST\")\n        override fun <T : ViewModel> create(modelClass: Class<T>, extras: CreationExtras): T {\n            val application =\n                checkNotNull(extras[ViewModelProvider.AndroidViewModelFactory.APPLICATION_KEY]) as ForestApplication\n            val dayDatabase = application.forestDatabase\n            val dayRepository = DayRepositoryImpl(dayDatabase.dayDao)\n            val statsSummaryUseCases = StatsSummaryUseCases(dayRepository)\n            return StatsSummaryViewModel(statsSummaryUseCases) as T\n        }\n    }\n}"
  },
  {
    "path": "app/src/main/java/pl/bartek537/forest/stats/util/ContextExtension.kt",
    "content": "package pl.bartek537.forest.stats.util\n\nimport android.content.Context\nimport android.util.TypedValue\nimport androidx.annotation.AttrRes\n\nfun Context.getThemeColor(\n    @AttrRes attrColor: Int\n): Int {\n    val typedValue = TypedValue()\n    theme.resolveAttribute(attrColor, typedValue, true)\n    return typedValue.data\n}"
  },
  {
    "path": "app/src/main/java/pl/bartek537/forest/stats/util/DayExtension.kt",
    "content": "package pl.bartek537.forest.stats.util\n\nimport pl.bartek537.forest.core.domain.model.Day\nimport java.time.LocalDate\n\nfun List<Day>.alignWeek(\n    firstDay: LocalDate,\n    lastDay: LocalDate = firstDay.plusDays(6),\n): List<Day> {\n    val alignedWeek = mutableListOf<Day>()\n    for (date in firstDay..lastDay) {\n        val currentDay = singleOrNull { it.date == date }\n        alignedWeek.add(currentDay ?: Day(date, goal = 0))\n    }\n    return alignedWeek\n}"
  },
  {
    "path": "app/src/main/java/pl/bartek537/forest/stats/util/LocalDateExtension.kt",
    "content": "package pl.bartek537.forest.stats.util\n\nimport com.google.android.material.R\nimport pl.bartek537.forest.core.domain.model.Day\nimport pl.bartek537.forest.stats.presentation.ChartAdapter\nimport java.time.LocalDate\nimport java.time.format.TextStyle\nimport java.util.*\n\noperator fun ClosedRange<LocalDate>.iterator() = object : Iterator<LocalDate> {\n\n    private var current = start.minusDays(1)\n\n    override fun hasNext(): Boolean {\n        return current.isBefore(endInclusive)\n    }\n\n    override fun next(): LocalDate {\n        if (current.isBefore(endInclusive)) {\n            current = current.plusDays(1)\n        }\n        return current\n    }\n}\n\nfun List<Day>.toChartValues(\n    max: Int,\n    locale: Locale,\n    activeDay: LocalDate\n): List<ChartAdapter.ChartValue<LocalDate>> = map {\n    val value = it.steps / max.toDouble()\n    val weekdayName = it.date.dayOfWeek.getDisplayName(TextStyle.SHORT, locale)\n    val isSelected = it.date.isEqual(activeDay)\n    val barColor =\n        if (isSelected) android.R.attr.colorPrimary\n        else R.attr.colorPrimaryContainer\n    val textColor =\n        if (isSelected) android.R.attr.colorPrimary\n        else R.attr.colorOnSurface\n    ChartAdapter.ChartValue(\n        it.date,\n        value = value,\n        label = weekdayName,\n        barColor = barColor,\n        textColor = textColor\n    )\n}"
  },
  {
    "path": "app/src/main/java/pl/bartek537/forest/trees/ForestFragment.kt",
    "content": "package pl.bartek537.forest.trees\n\nimport android.os.Bundle\nimport android.view.LayoutInflater\nimport android.view.View\nimport android.view.ViewGroup\nimport android.widget.ImageView\nimport androidx.constraintlayout.widget.ConstraintLayout\nimport androidx.core.view.updateLayoutParams\nimport androidx.fragment.app.Fragment\nimport androidx.fragment.app.viewModels\nimport androidx.lifecycle.Lifecycle\nimport androidx.lifecycle.lifecycleScope\nimport androidx.lifecycle.repeatOnLifecycle\nimport kotlinx.coroutines.launch\nimport pl.bartek537.forest.R\nimport pl.bartek537.forest.databinding.FragmentForestBinding\nimport kotlin.random.Random\n\nclass ForestFragment : Fragment() {\n\n    private val viewModel: ForestViewModel by viewModels { ForestViewModel.Factory }\n\n    private lateinit var binding: FragmentForestBinding\n\n    override fun onCreateView(\n        inflater: LayoutInflater,\n        container: ViewGroup?,\n        savedInstanceState: Bundle?\n    ): View {\n        binding = FragmentForestBinding.inflate(inflater, container, false)\n        return binding.root\n    }\n\n    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {\n        lifecycleScope.launch {\n            viewLifecycleOwner.repeatOnLifecycle(Lifecycle.State.CREATED) {\n                viewModel.trees.collect { updateUserInterface(it) }\n            }\n        }\n    }\n\n    private fun updateUserInterface(forestState: ForestState) {\n        val treeCount = forestState.treeCount\n        binding.apply {\n            textTreesCollected.text = treeCount.toString()\n            textTreesCollectedLabel.text = resources.getQuantityString(R.plurals.trees, treeCount)\n        }\n        generateTrees(forestState.treeCount)\n    }\n\n    private fun generateTrees(treeCount: Int) {\n        val parentLayout = binding.constraintLayoutTrees\n        parentLayout.removeAllViews()\n        val gapCount = treeCount + 1\n        repeat(treeCount) {\n            val fixedPosition = (it + 1.0) / gapCount\n            val randomOffset = (Random.nextDouble() - 0.5) / 5\n            val horizontalPosition = fixedPosition + randomOffset\n            createTree(parentLayout, horizontalPosition)\n        }\n    }\n\n    private fun createTree(parentLayout: ConstraintLayout, horizontalPosition: Double) {\n        val treeImageView = ImageView(context)\n        treeImageView.setImageResource(R.drawable.tree_collected)\n        parentLayout.addView(treeImageView)\n        treeImageView.updateLayoutParams<ConstraintLayout.LayoutParams> {\n            startToStart = parentLayout.id\n            endToEnd = parentLayout.id\n            bottomToBottom = parentLayout.id\n            horizontalBias = horizontalPosition.toFloat()\n        }\n    }\n}"
  },
  {
    "path": "app/src/main/java/pl/bartek537/forest/trees/ForestState.kt",
    "content": "package pl.bartek537.forest.trees\n\ndata class ForestState(\n    val treeCount: Int\n)"
  },
  {
    "path": "app/src/main/java/pl/bartek537/forest/trees/ForestViewModel.kt",
    "content": "package pl.bartek537.forest.trees\n\nimport androidx.lifecycle.ViewModel\nimport androidx.lifecycle.ViewModelProvider\nimport androidx.lifecycle.ViewModelProvider.AndroidViewModelFactory.Companion.APPLICATION_KEY\nimport androidx.lifecycle.viewModelScope\nimport androidx.lifecycle.viewmodel.CreationExtras\nimport kotlinx.coroutines.flow.MutableStateFlow\nimport kotlinx.coroutines.flow.StateFlow\nimport kotlinx.coroutines.flow.asStateFlow\nimport kotlinx.coroutines.launch\nimport pl.bartek537.forest.ForestApplication\nimport pl.bartek537.forest.core.data.repository.DayRepositoryImpl\nimport pl.bartek537.forest.trees.domain.usecase.ForestUseCases\n\nclass ForestViewModel(\n    forestUseCases: ForestUseCases\n) : ViewModel() {\n\n    private val _trees = MutableStateFlow(ForestState(treeCount = 0))\n    val trees: StateFlow<ForestState> = _trees.asStateFlow()\n\n    init {\n        viewModelScope.launch {\n            forestUseCases.getTreeCount().collect {\n                _trees.value = _trees.value.copy(\n                    treeCount = it\n                )\n            }\n        }\n    }\n\n    object Factory : ViewModelProvider.Factory {\n\n        @Suppress(\"UNCHECKED_CAST\")\n        override fun <T : ViewModel> create(modelClass: Class<T>, extras: CreationExtras): T {\n            val application = checkNotNull(extras[APPLICATION_KEY]) as ForestApplication\n            val forestDatabase = application.forestDatabase\n            val dayRepository = DayRepositoryImpl(forestDatabase.dayDao)\n            val forestUseCases = ForestUseCases(dayRepository)\n            return ForestViewModel(forestUseCases) as T\n        }\n    }\n}"
  },
  {
    "path": "app/src/main/java/pl/bartek537/forest/trees/domain/usecase/ForestUseCases.kt",
    "content": "package pl.bartek537.forest.trees.domain.usecase\n\nimport pl.bartek537.forest.core.domain.repository.DayRepository\n\nclass ForestUseCases(\n    dayRepository: DayRepository\n) {\n\n    val getTreeCount: GetTreeCount = GetTreeCountImpl(dayRepository)\n}"
  },
  {
    "path": "app/src/main/java/pl/bartek537/forest/trees/domain/usecase/GetTreeCount.kt",
    "content": "package pl.bartek537.forest.trees.domain.usecase\n\nimport kotlinx.coroutines.flow.Flow\nimport pl.bartek537.forest.core.domain.repository.DayRepository\n\ninterface GetTreeCount {\n    operator fun invoke(): Flow<Int>\n}\n\nclass GetTreeCountImpl(\n    private val dayRepository: DayRepository\n) : GetTreeCount {\n\n    override fun invoke(): Flow<Int> {\n        return dayRepository.getTreeCount()\n    }\n}"
  },
  {
    "path": "app/src/main/res/drawable/bubble_chart_fill0_wght400_grad0_opsz24.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"960\"\n    android:viewportHeight=\"960\">\n  <path\n      android:fillColor=\"#FF000000\"\n      android:pathData=\"M280,720q-66,0 -113,-47t-47,-113q0,-66 47,-113t113,-47q66,0 113,47t47,113q0,66 -47,113t-113,47ZM280,640q33,0 56.5,-23.5T360,560q0,-33 -23.5,-56.5T280,480q-33,0 -56.5,23.5T200,560q0,33 23.5,56.5T280,640ZM660,560q-92,0 -156,-64t-64,-156q0,-92 64,-156t156,-64q92,0 156,64t64,156q0,92 -64,156t-156,64ZM580,840q-50,0 -85,-35t-35,-85q0,-50 35,-85t85,-35q50,0 85,35t35,85q0,50 -35,85t-85,35ZM660,480q59,0 99.5,-40.5T800,340q0,-59 -40.5,-99.5T660,200q-59,0 -99.5,40.5T520,340q0,59 40.5,99.5T660,480ZM580,760q17,0 28.5,-11.5T620,720q0,-17 -11.5,-28.5T580,680q-17,0 -28.5,11.5T540,720q0,17 11.5,28.5T580,760ZM660,340ZM280,560ZM580,720Z\"/>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/chevron_left_fill0_wght400_grad0_opsz24.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\">\n  <path\n      android:fillColor=\"#FF000000\"\n      android:pathData=\"m14,18 l-6,-6 6,-6 1.4,1.4 -4.6,4.6 4.6,4.6Z\"/>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/chevron_right_fill0_wght400_grad0_opsz24.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\">\n  <path\n      android:fillColor=\"#FF000000\"\n      android:pathData=\"M9.4,18 L8,16.6l4.6,-4.6L8,7.4 9.4,6l6,6Z\"/>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/conversion_path_fill0_wght400_grad0_opsz24.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\">\n  <path\n      android:fillColor=\"#FF000000\"\n      android:pathData=\"M19,21q-0.975,0 -1.75,-0.562 -0.775,-0.563 -1.075,-1.438H11q-1.65,0 -2.825,-1.175Q7,16.65 7,15q0,-1.65 1.175,-2.825Q9.35,11 11,11h2q0.825,0 1.413,-0.588Q15,9.825 15,9t-0.587,-1.413Q13.825,7 13,7H7.825q-0.325,0.875 -1.087,1.438Q5.975,9 5,9q-1.25,0 -2.125,-0.875T2,6q0,-1.25 0.875,-2.125T5,3q0.975,0 1.738,0.562Q7.5,4.125 7.825,5H13q1.65,0 2.825,1.175Q17,7.35 17,9q0,1.65 -1.175,2.825Q14.65,13 13,13h-2q-0.825,0 -1.412,0.587Q9,14.175 9,15q0,0.825 0.588,1.413Q10.175,17 11,17h5.175q0.325,-0.875 1.088,-1.438Q18.025,15 19,15q1.25,0 2.125,0.875T22,18q0,1.25 -0.875,2.125T19,21ZM5,7q0.425,0 0.713,-0.287Q6,6.425 6,6t-0.287,-0.713Q5.425,5 5,5t-0.713,0.287Q4,5.575 4,6t0.287,0.713Q4.575,7 5,7Z\"/>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/directions_walk_fill0_wght400_grad0_opsz48.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"48dp\"\n    android:height=\"48dp\"\n    android:viewportWidth=\"48\"\n    android:viewportHeight=\"48\">\n  <path\n      android:fillColor=\"#FF000000\"\n      android:pathData=\"m13.9,46 l5.8,-29.3 -5.05,2.15v6.65H11.6v-8.65l9.6,-4.05q0.7,-0.3 1.475,-0.375 0.775,-0.075 1.525,0.075 0.85,0.15 1.475,0.55 0.625,0.4 1.025,1l2.1,3.3q1.55,2.4 3.875,3.775T37.65,22.5v3q-3.5,-0.1 -6.175,-1.525Q28.8,22.55 26.65,19.6l-1.9,7.6 4.6,4.15V46h-3V34l-5.4,-4.9L17,46ZM27,10.3q-1.5,0 -2.575,-1.075Q23.35,8.15 23.35,6.65q0,-1.5 1.075,-2.575Q25.5,3 27,3q1.5,0 2.575,1.075Q30.65,5.15 30.65,6.65q0,1.5 -1.075,2.575Q28.5,10.3 27,10.3Z\"/>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/do_not_disturb_on_fill0_wght400_grad0_opsz24.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\">\n  <path\n      android:fillColor=\"#FF000000\"\n      android:pathData=\"M7,13h10v-2L7,11ZM12,22q-2.075,0 -3.9,-0.788 -1.825,-0.787 -3.175,-2.137 -1.35,-1.35 -2.137,-3.175Q2,14.075 2,12t0.788,-3.9q0.787,-1.825 2.137,-3.175 1.35,-1.35 3.175,-2.138Q9.925,2 12,2t3.9,0.787q1.825,0.788 3.175,2.138 1.35,1.35 2.137,3.175Q22,9.925 22,12t-0.788,3.9q-0.787,1.825 -2.137,3.175 -1.35,1.35 -3.175,2.137Q14.075,22 12,22ZM12,20q3.35,0 5.675,-2.325Q20,15.35 20,12q0,-3.35 -2.325,-5.675Q15.35,4 12,4 8.65,4 6.325,6.325 4,8.65 4,12q0,3.35 2.325,5.675Q8.65,20 12,20ZM12,12Z\"/>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/forest_fill0_wght400_grad0_opsz24.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\">\n  <path\n      android:fillColor=\"#FF000000\"\n      android:pathData=\"M7,22v-4L0,18l3.85,-6L2,12L9,2l3,4.3L15,2l7,10h-1.85L24,18h-7v4h-4v-4h-2v4ZM16.725,16h3.625l-3.875,-6h1.675L15,5.5l-1.775,2.525L16,12h-1.85ZM3.65,16h10.7l-3.875,-6h1.675L9,5.5 5.85,10h1.675ZM3.65,16h3.875L5.85,16h6.3,-1.675 3.875ZM16.725,16L14.15,16 16,16h-2.775,4.925 -1.675,3.875ZM13,18h4,-4ZM18.025,18Z\"/>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_launcher_background.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"108dp\"\n    android:height=\"108dp\"\n    android:viewportWidth=\"108\"\n    android:viewportHeight=\"108\">\n    <path\n        android:fillColor=\"#3DDC84\"\n        android:pathData=\"M0,0h108v108h-108z\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M9,0L9,108\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M19,0L19,108\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M29,0L29,108\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M39,0L39,108\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M49,0L49,108\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M59,0L59,108\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M69,0L69,108\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M79,0L79,108\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M89,0L89,108\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M99,0L99,108\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M0,9L108,9\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M0,19L108,19\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M0,29L108,29\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M0,39L108,39\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M0,49L108,49\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M0,59L108,59\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M0,69L108,69\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M0,79L108,79\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M0,89L108,89\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M0,99L108,99\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M19,29L89,29\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M19,39L89,39\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M19,49L89,49\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M19,59L89,59\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M19,69L89,69\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M19,79L89,79\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M29,19L29,89\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M39,19L39,89\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M49,19L49,89\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M59,19L59,89\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M69,19L69,89\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M79,19L79,89\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_launcher_foreground.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"108dp\"\n    android:height=\"108dp\"\n    android:viewportWidth=\"319\"\n    android:viewportHeight=\"188\">\n  <group android:scaleX=\"0.64\"\n      android:scaleY=\"0.37717867\"\n      android:translateX=\"57.42\"\n      android:translateY=\"58.545204\">\n    <group>\n      <clip-path\n          android:pathData=\"M0,140h319v48h-319z\"/>\n      <path\n          android:pathData=\"M159.5,188C247.59,188 319,177.26 319,164C319,150.74 247.59,140 159.5,140C71.41,140 0,150.74 0,164C0,177.26 71.41,188 159.5,188Z\"\n          android:fillColor=\"#60A625\"/>\n      <path\n          android:pathData=\"M159.5,173C192.64,173 219.5,168.97 219.5,164C219.5,159.03 192.64,155 159.5,155C126.36,155 99.5,159.03 99.5,164C99.5,168.97 126.36,173 159.5,173Z\"\n          android:fillColor=\"#51901C\"/>\n    </group>\n    <group>\n      <clip-path\n          android:pathData=\"M77,0h164v164h-164z\"/>\n      <path\n          android:pathData=\"M161.97,90.48H156.6C156.6,90.48 151.8,149.84 150.83,161.88C150.78,162.43 150.97,162.97 151.34,163.37C151.71,163.77 152.23,164 152.78,164H165.22C165.76,164 166.29,163.77 166.65,163.37C167.03,162.97 167.21,162.44 167.18,161.9C166.3,149.88 161.97,90.48 161.97,90.48Z\"\n          android:fillColor=\"#413022\"\n          android:fillType=\"evenOdd\"/>\n      <path\n          android:pathData=\"M77,22.85C77,22.85 98.82,24.71 119.36,26.45C139.86,28.19 156.12,44.45 157.86,64.95C159.3,81.84 160.8,99.6 161.3,105.37C161.34,105.86 161.16,106.33 160.82,106.67C160.48,107.01 160.01,107.19 159.52,107.15C153.75,106.65 135.99,105.15 119.1,103.71C98.6,101.97 82.34,85.71 80.6,65.21C78.85,44.67 77,22.85 77,22.85Z\"\n          android:fillColor=\"#60A625\"\n          android:fillType=\"evenOdd\"/>\n      <path\n          android:pathData=\"M241,22.85C241,22.85 239.15,44.67 237.4,65.21C235.66,85.71 219.4,101.97 198.9,103.71C182.01,105.15 164.26,106.66 158.48,107.15C158,107.19 157.52,107.01 157.18,106.67C156.84,106.33 156.66,105.86 156.7,105.37C157.2,99.6 158.71,81.84 160.14,64.95C161.88,44.45 178.14,28.19 198.64,26.45C219.18,24.71 241,22.85 241,22.85Z\"\n          android:fillColor=\"#7EC046\"\n          android:fillType=\"evenOdd\"/>\n    </group>\n  </group>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/local_fire_department_fill0_wght400_grad0_opsz24.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\">\n  <path\n      android:fillColor=\"#FF000000\"\n      android:pathData=\"M6,14q0,1.3 0.525,2.462 0.525,1.163 1.5,2.038Q8,18.375 8,18.275v-0.225q0,-0.8 0.3,-1.5t0.875,-1.275L12,12.5l2.825,2.775q0.575,0.575 0.875,1.275 0.3,0.7 0.3,1.5v0.225q0,0.1 -0.025,0.225 0.975,-0.875 1.5,-2.038Q18,15.3 18,14q0,-1.25 -0.462,-2.363 -0.463,-1.112 -1.338,-1.987 -0.5,0.325 -1.05,0.487 -0.55,0.163 -1.125,0.163 -1.55,0 -2.687,-1.025Q10.2,8.25 10.025,6.75 9.05,7.575 8.3,8.462q-0.75,0.888 -1.262,1.8 -0.513,0.913 -0.775,1.863Q6,13.075 6,14ZM12,15.3 L10.575,16.7q-0.275,0.275 -0.425,0.625 -0.15,0.35 -0.15,0.725 0,0.8 0.588,1.375Q11.175,20 12,20t1.413,-0.575Q14,18.85 14,18.05q0,-0.4 -0.15,-0.738 -0.15,-0.337 -0.425,-0.612ZM12,3v3.3q0,0.85 0.588,1.425 0.587,0.575 1.437,0.575 0.45,0 0.838,-0.187 0.387,-0.188 0.687,-0.563L16,7q1.85,1.05 2.925,2.925Q20,11.8 20,14q0,3.35 -2.325,5.675Q15.35,22 12,22q-3.35,0 -5.675,-2.325Q4,17.35 4,14q0,-3.225 2.163,-6.125Q8.325,4.975 12,3Z\"/>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/nature_fill0_wght400_grad0_opsz24.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\">\n  <path\n      android:fillColor=\"#FF000000\"\n      android:pathData=\"M5,22v-2h6v-4L9,16q-2.075,0 -3.537,-1.463Q4,13.075 4,11q0,-1.5 0.825,-2.763Q5.65,6.975 7.05,6.4q0.225,-1.875 1.638,-3.138Q10.1,2 12,2t3.312,1.262Q16.725,4.525 16.95,6.4q1.4,0.575 2.225,1.837Q20,9.5 20,11q0,2.075 -1.462,3.537Q17.075,16 15,16h-2v4h6v2ZM9,14h6q1.25,0 2.125,-0.875T18,11q0,-0.9 -0.512,-1.65 -0.513,-0.75 -1.338,-1.1L15.1,7.8l-0.15,-1.15q-0.15,-1.125 -0.987,-1.888Q13.125,4 12,4t-1.962,0.762Q9.2,5.525 9.05,6.65L8.9,7.8l-1.05,0.45q-0.825,0.35 -1.337,1.1Q6,10.1 6,11q0,1.25 0.875,2.125T9,14ZM12,9Z\"/>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/shape_chart_bar.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<shape xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    tools:tint=\"?attr/colorSurfaceVariant\">\n\n    <corners\n        android:topLeftRadius=\"4dp\"\n        android:topRightRadius=\"4dp\" />\n\n</shape>"
  },
  {
    "path": "app/src/main/res/drawable/shape_circle.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<shape xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    tools:tint=\"?attr/colorSurface\">\n\n    <corners android:radius=\"999dp\" />\n</shape>"
  },
  {
    "path": "app/src/main/res/drawable/shape_divider.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<inset xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:insetLeft=\"80dp\">\n    <shape>\n        <size android:height=\"1dp\" />\n        <solid android:color=\"?attr/colorOutlineVariant\" />\n    </shape>\n</inset>"
  },
  {
    "path": "app/src/main/res/drawable/shape_ground.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<shape xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <solid android:color=\"?attr/colorSecondaryContainer\" />\n    <corners\n        android:topLeftRadius=\"12dp\"\n        android:topRightRadius=\"12dp\" />\n</shape>"
  },
  {
    "path": "app/src/main/res/drawable/show_chart_fill0_wght400_grad0_opsz24.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\">\n  <path\n      android:fillColor=\"#FF000000\"\n      android:pathData=\"M3.5,18.5 L2,17l7.5,-7.5 4,4 7.1,-8L22,6.9l-8.5,9.6 -4,-4Z\"/>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/stage_1.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"500dp\"\n    android:height=\"500dp\"\n    android:viewportWidth=\"500\"\n    android:viewportHeight=\"500\">\n  <group>\n    <clip-path\n        android:pathData=\"M91,452h319v48h-319z\"/>\n    <path\n        android:pathData=\"M250.5,500C338.59,500 410,489.26 410,476C410,462.74 338.59,452 250.5,452C162.41,452 91,462.74 91,476C91,489.26 162.41,500 250.5,500Z\"\n        android:fillColor=\"#60A625\"/>\n    <path\n        android:pathData=\"M250.5,485C283.64,485 310.5,480.97 310.5,476C310.5,471.03 283.64,467 250.5,467C217.36,467 190.5,471.03 190.5,476C190.5,480.97 217.36,485 250.5,485Z\"\n        android:fillColor=\"#51901C\"/>\n  </group>\n  <group>\n    <clip-path\n        android:pathData=\"M168,312h164v164h-164z\"/>\n    <path\n        android:pathData=\"M252.97,402.48H247.6C247.6,402.48 242.8,461.84 241.83,473.88C241.78,474.42 241.97,474.97 242.34,475.37C242.71,475.77 243.23,476 243.78,476H256.22C256.77,476 257.29,475.77 257.65,475.37C258.03,474.97 258.21,474.44 258.18,473.9C257.3,461.88 252.97,402.48 252.97,402.48Z\"\n        android:fillColor=\"#413022\"\n        android:fillType=\"evenOdd\"/>\n    <path\n        android:pathData=\"M168,334.85C168,334.85 189.82,336.7 210.36,338.45C230.86,340.19 247.12,356.45 248.86,376.95C250.3,393.84 251.8,411.6 252.3,417.37C252.34,417.86 252.16,418.33 251.82,418.67C251.48,419.01 251.01,419.19 250.52,419.15C244.75,418.65 226.99,417.15 210.1,415.71C189.6,413.97 173.34,397.71 171.6,377.21C169.85,356.67 168,334.85 168,334.85Z\"\n        android:fillColor=\"#60A625\"\n        android:fillType=\"evenOdd\"/>\n    <path\n        android:pathData=\"M332,334.85C332,334.85 330.15,356.67 328.4,377.21C326.66,397.71 310.4,413.97 289.9,415.71C273.01,417.15 255.26,418.66 249.48,419.15C249,419.19 248.52,419.01 248.18,418.67C247.84,418.33 247.66,417.86 247.7,417.37C248.2,411.6 249.71,393.84 251.14,376.95C252.88,356.45 269.14,340.19 289.64,338.45C310.18,336.71 332,334.85 332,334.85Z\"\n        android:fillColor=\"#7EC046\"\n        android:fillType=\"evenOdd\"/>\n  </group>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/stage_2.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"500dp\"\n    android:height=\"500dp\"\n    android:viewportWidth=\"500\"\n    android:viewportHeight=\"500\">\n  <group>\n    <clip-path\n        android:pathData=\"M91,452h319v48h-319z\"/>\n    <path\n        android:pathData=\"M250.5,500C338.59,500 410,489.26 410,476C410,462.74 338.59,452 250.5,452C162.41,452 91,462.74 91,476C91,489.26 162.41,500 250.5,500Z\"\n        android:fillColor=\"#60A625\"/>\n    <path\n        android:pathData=\"M250.5,485C283.64,485 310.5,480.97 310.5,476C310.5,471.03 283.64,467 250.5,467C217.36,467 190.5,471.03 190.5,476C190.5,480.97 217.36,485 250.5,485Z\"\n        android:fillColor=\"#51901C\"/>\n  </group>\n  <group>\n    <clip-path\n        android:pathData=\"M125,226h250v250h-250z\"/>\n    <path\n        android:pathData=\"M254.29,369.73H246.53C246.53,369.73 239.59,455.53 238.18,472.93C238.12,473.72 238.39,474.51 238.93,475.08C239.46,475.67 240.22,476 241.01,476H258.99C259.78,476 260.53,475.67 261.07,475.09C261.6,474.52 261.87,473.74 261.82,472.96C260.55,455.6 254.29,369.73 254.29,369.73Z\"\n        android:fillColor=\"#413022\"\n        android:fillType=\"evenOdd\"/>\n    <path\n        android:pathData=\"M229.17,400.21L226.13,402.61C226.13,402.61 241.04,427.14 244.07,432.12C244.2,432.34 244.47,432.46 244.8,432.45C245.13,432.43 245.49,432.29 245.8,432.04L252.87,426.48C253.18,426.23 253.4,425.92 253.49,425.6C253.59,425.28 253.54,425 253.35,424.81C249.28,420.67 229.17,400.21 229.17,400.21Z\"\n        android:fillColor=\"#413022\"\n        android:fillType=\"evenOdd\"/>\n    <path\n        android:pathData=\"M276.03,383.09L273.29,380.35C273.29,380.35 250.69,398.05 246.1,401.64C245.89,401.8 245.8,402.08 245.86,402.4C245.91,402.73 246.1,403.08 246.38,403.36L252.74,409.71C253.02,409.99 253.36,410.18 253.68,410.23C254.01,410.29 254.29,410.2 254.45,410C258.08,405.47 276.03,383.09 276.03,383.09Z\"\n        android:fillColor=\"#413022\"\n        android:fillType=\"evenOdd\"/>\n    <path\n        android:pathData=\"M138.63,315.07C138.63,315.07 155.78,316.52 175.16,318.17C206.41,320.83 231.2,345.61 233.85,376.86C235.09,391.42 236.22,404.73 236.71,410.44C236.77,411.18 236.51,411.9 235.99,412.42C235.46,412.94 234.74,413.21 234.01,413.15C228.29,412.66 214.99,411.53 200.43,410.29C169.18,407.64 144.39,382.85 141.73,351.6C140.09,332.22 138.63,315.07 138.63,315.07Z\"\n        android:fillColor=\"#60A625\"\n        android:fillType=\"evenOdd\"/>\n    <path\n        android:pathData=\"M239.54,227.93C239.54,227.93 254.64,243.27 270.73,259.62C292.73,281.98 295.42,316.93 277.1,342.39C266.67,356.88 256.75,370.66 252.86,376.08C252.43,376.67 251.76,377.05 251.02,377.11C250.29,377.16 249.56,376.89 249.05,376.37C244.37,371.62 232.46,359.51 219.93,346.79C197.93,324.43 195.24,289.48 213.56,264.02C226.97,245.4 239.54,227.93 239.54,227.93Z\"\n        android:fillColor=\"#7EC046\"\n        android:fillType=\"evenOdd\"/>\n    <path\n        android:pathData=\"M375,281.69C375,281.69 373.18,303.13 371.23,326C368.58,357.25 343.79,382.04 312.54,384.7C294.75,386.21 277.82,387.65 271.18,388.21C270.45,388.27 269.72,388.01 269.2,387.49C268.68,386.97 268.42,386.24 268.48,385.51C269.04,378.87 270.48,361.94 271.99,344.15C274.65,312.9 299.44,288.11 330.69,285.46C353.56,283.51 375,281.69 375,281.69Z\"\n        android:fillColor=\"#6BA43C\"\n        android:fillType=\"evenOdd\"/>\n  </group>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/stage_3.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"500dp\"\n    android:height=\"500dp\"\n    android:viewportWidth=\"500\"\n    android:viewportHeight=\"500\">\n  <group>\n    <clip-path\n        android:pathData=\"M91,452h319v48h-319z\"/>\n    <path\n        android:pathData=\"M250.5,500C338.59,500 410,489.26 410,476C410,462.74 338.59,452 250.5,452C162.41,452 91,462.74 91,476C91,489.26 162.41,500 250.5,500Z\"\n        android:fillColor=\"#60A625\"/>\n    <path\n        android:pathData=\"M250.5,485C283.64,485 310.5,480.97 310.5,476C310.5,471.03 283.64,467 250.5,467C217.36,467 190.5,471.03 190.5,476C190.5,480.97 217.36,485 250.5,485Z\"\n        android:fillColor=\"#51901C\"/>\n  </group>\n  <group>\n    <clip-path\n        android:pathData=\"M79,134h342v342h-342z\"/>\n    <path\n        android:pathData=\"M257.44,172.57H243.99C243.99,172.57 231.95,417.55 229.5,467.25C229.4,469.5 229.86,471.73 230.79,473.39C231.72,475.05 233.03,476 234.4,476H265.59C266.96,476 268.27,475.07 269.19,473.41C270.13,471.77 270.6,469.56 270.5,467.33C268.3,417.74 257.44,172.57 257.44,172.57Z\"\n        android:fillColor=\"#413022\"\n        android:fillType=\"evenOdd\"/>\n    <path\n        android:pathData=\"M218.93,335.34L213.62,338.03C213.62,338.03 232.19,386.35 235.96,396.15C236.13,396.6 236.53,396.92 237.05,397.05C237.58,397.17 238.18,397.09 238.73,396.81L251.03,390.56C251.57,390.29 252,389.85 252.2,389.35C252.41,388.86 252.39,388.35 252.14,387.95C246.55,379.1 218.93,335.34 218.93,335.34Z\"\n        android:fillColor=\"#413022\"\n        android:fillType=\"evenOdd\"/>\n    <path\n        android:pathData=\"M333.21,309.07L328.44,305.51C328.44,305.51 266.02,380.17 253.36,395.31C252.79,396 252.42,396.83 252.36,397.61C252.29,398.38 252.53,399.03 253.02,399.39L264.08,407.65C264.56,408.01 265.24,408.06 265.97,407.78C266.69,407.51 267.38,406.93 267.87,406.19C278.86,389.86 333.21,309.07 333.21,309.07Z\"\n        android:fillColor=\"#413022\"\n        android:fillType=\"evenOdd\"/>\n    <path\n        android:pathData=\"M241.67,138.94C213.53,149.71 176.44,159.61 162.27,217.41C148.1,275.21 176.01,293.32 191.12,302.77C204.82,311.34 293.97,344.73 331.16,268.75C371.28,186.8 354.54,172.39 331.13,152.81C309.65,134.84 268.38,128.72 241.67,138.94Z\"\n        android:fillColor=\"#6DAC38\"\n        android:fillType=\"evenOdd\"/>\n    <path\n        android:pathData=\"M372.24,275.46C372.24,275.46 372.29,275.61 372.39,275.9C379.62,297.98 373.82,322.25 357.4,338.68C340.97,355.11 316.7,360.9 294.62,353.67L294.62,353.67C294.34,353.58 294.12,353.36 294.03,353.08L294.03,353.08C286.8,331.01 292.6,306.74 309.02,290.31C325.45,273.88 349.72,268.08 371.8,275.32C372.09,275.41 372.24,275.46 372.24,275.46Z\"\n        android:fillColor=\"#5B8F30\"\n        android:fillType=\"evenOdd\"/>\n    <path\n        android:pathData=\"M205.1,263.3C206.3,263.3 207.28,262.33 207.28,261.12C207.28,259.92 206.3,258.94 205.1,258.94C203.89,258.94 202.92,259.92 202.92,261.12C202.92,262.33 203.89,263.3 205.1,263.3Z\"\n        android:fillColor=\"#9FE664\"/>\n    <path\n        android:pathData=\"M253.02,187.16C253.81,187.16 254.44,186.53 254.44,185.74C254.44,184.96 253.81,184.32 253.02,184.32C252.24,184.32 251.6,184.96 251.6,185.74C251.6,186.53 252.24,187.16 253.02,187.16Z\"\n        android:fillColor=\"#9FE664\"/>\n    <path\n        android:pathData=\"M224.59,212.31C225.16,212.31 225.63,211.85 225.63,211.28C225.63,210.71 225.16,210.25 224.59,210.25C224.02,210.25 223.56,210.71 223.56,211.28C223.56,211.85 224.02,212.31 224.59,212.31Z\"\n        android:fillColor=\"#9FE664\"/>\n    <path\n        android:pathData=\"M196.86,242.46C197.69,242.46 198.36,241.78 198.36,240.95C198.36,240.12 197.69,239.45 196.86,239.45C196.02,239.45 195.35,240.12 195.35,240.95C195.35,241.78 196.02,242.46 196.86,242.46Z\"\n        android:fillColor=\"#9FE664\"/>\n    <path\n        android:pathData=\"M209.6,179.43C212.02,179.43 213.97,177.48 213.97,175.07C213.97,172.65 212.02,170.7 209.6,170.7C207.19,170.7 205.24,172.65 205.24,175.07C205.24,177.48 207.19,179.43 209.6,179.43Z\"\n        android:fillColor=\"#9FE664\"/>\n    <path\n        android:pathData=\"M285.17,247.47C286.56,247.47 287.68,246.35 287.68,244.96C287.68,243.58 286.56,242.46 285.17,242.46C283.79,242.46 282.67,243.58 282.67,244.96C282.67,246.35 283.79,247.47 285.17,247.47Z\"\n        android:fillColor=\"#9FE664\"/>\n  </group>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/stage_4.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"500dp\"\n    android:height=\"500dp\"\n    android:viewportWidth=\"500\"\n    android:viewportHeight=\"500\">\n  <group>\n    <clip-path\n        android:pathData=\"M91,452h319v48h-319z\"/>\n    <path\n        android:pathData=\"M250.5,500C338.59,500 410,489.26 410,476C410,462.74 338.59,452 250.5,452C162.41,452 91,462.74 91,476C91,489.26 162.41,500 250.5,500Z\"\n        android:fillColor=\"#60A625\"/>\n    <path\n        android:pathData=\"M250.5,485C283.64,485 310.5,480.97 310.5,476C310.5,471.03 283.64,467 250.5,467C217.36,467 190.5,471.03 190.5,476C190.5,480.97 217.36,485 250.5,485Z\"\n        android:fillColor=\"#51901C\"/>\n  </group>\n  <group>\n    <clip-path\n        android:pathData=\"M68,78h398v398h-398z\"/>\n    <path\n        android:pathData=\"M259.78,135.64H245.12C245.12,135.64 231.99,410.43 229.32,466.18C229.21,468.71 229.71,471.21 230.73,473.07C231.75,474.94 233.17,476 234.67,476H268.68C270.17,476 271.59,474.95 272.6,473.1C273.62,471.25 274.13,468.77 274.03,466.27C271.63,410.65 259.78,135.64 259.78,135.64Z\"\n        android:fillColor=\"#413022\"\n        android:fillType=\"evenOdd\"/>\n    <path\n        android:pathData=\"M202.36,289.3L199.4,291.63C199.4,291.63 234.8,341.99 241.98,352.21C242.3,352.67 242.75,353.03 243.21,353.2C243.68,353.37 244.11,353.33 244.41,353.09L251.27,347.68C251.57,347.45 251.71,347.04 251.66,346.55C251.61,346.06 251.37,345.55 251,345.13C242.82,335.73 202.36,289.3 202.36,289.3Z\"\n        android:fillColor=\"#413022\"\n        android:fillType=\"evenOdd\"/>\n    <path\n        android:pathData=\"M328.43,352.78L320.51,344.85C320.51,344.85 255.15,396.02 241.89,406.4C241.29,406.87 241.04,407.67 241.19,408.62C241.34,409.56 241.89,410.56 242.7,411.37L261.08,429.74C261.88,430.55 262.88,431.1 263.82,431.25C264.76,431.41 265.56,431.16 266.03,430.57C276.53,417.48 328.43,352.78 328.43,352.78Z\"\n        android:fillColor=\"#413022\"\n        android:fillType=\"evenOdd\"/>\n    <path\n        android:pathData=\"M347.53,175C336.88,142.43 327.52,99.53 264.8,82.73C202.07,65.92 181.12,98 170.16,115.36C160.22,131.11 120.06,233.77 201.76,277.29C289.9,324.24 306.35,305.02 328.73,278.16C349.28,253.5 357.65,205.91 347.53,175Z\"\n        android:fillColor=\"#6DAC38\"\n        android:fillType=\"evenOdd\"/>\n    <path\n        android:pathData=\"M380.39,336.61C375.19,320.72 370.63,299.8 340.03,291.6C309.44,283.41 299.22,299.05 293.88,307.52C289.03,315.2 269.44,365.27 309.29,386.5C352.27,409.39 360.3,400.02 371.21,386.92C381.23,374.89 385.32,351.68 380.39,336.61Z\"\n        android:fillColor=\"#507E28\"\n        android:fillType=\"evenOdd\"/>\n    <path\n        android:pathData=\"M203.89,216.17C205.29,216.17 206.42,215.03 206.42,213.63C206.42,212.23 205.29,211.1 203.89,211.1C202.49,211.1 201.35,212.23 201.35,213.63C201.35,215.03 202.49,216.17 203.89,216.17Z\"\n        android:fillColor=\"#9FE664\"/>\n    <path\n        android:pathData=\"M259.66,127.56C260.57,127.56 261.31,126.82 261.31,125.91C261.31,124.99 260.57,124.25 259.66,124.25C258.74,124.25 258,124.99 258,125.91C258,126.82 258.74,127.56 259.66,127.56Z\"\n        android:fillColor=\"#9FE664\"/>\n    <path\n        android:pathData=\"M226.57,156.83C227.24,156.83 227.77,156.29 227.77,155.63C227.77,154.97 227.24,154.43 226.57,154.43C225.91,154.43 225.38,154.97 225.38,155.63C225.38,156.29 225.91,156.83 226.57,156.83Z\"\n        android:fillColor=\"#9FE664\"/>\n    <path\n        android:pathData=\"M194.29,191.91C195.26,191.91 196.04,191.13 196.04,190.16C196.04,189.19 195.26,188.41 194.29,188.41C193.33,188.41 192.54,189.19 192.54,190.16C192.54,191.13 193.33,191.91 194.29,191.91Z\"\n        android:fillColor=\"#9FE664\"/>\n    <path\n        android:pathData=\"M209.13,118.57C211.94,118.57 214.21,116.29 214.21,113.48C214.21,110.68 211.94,108.4 209.13,108.4C206.32,108.4 204.05,110.68 204.05,113.48C204.05,116.29 206.32,118.57 209.13,118.57Z\"\n        android:fillColor=\"#9FE664\"/>\n    <path\n        android:pathData=\"M297.07,197.74C298.68,197.74 299.99,196.44 299.99,194.82C299.99,193.21 298.68,191.91 297.07,191.91C295.46,191.91 294.16,193.21 294.16,194.82C294.16,196.44 295.46,197.74 297.07,197.74Z\"\n        android:fillColor=\"#9FE664\"/>\n    <path\n        android:pathData=\"M354.31,322.43C355.28,322.43 356.07,321.64 356.07,320.66C356.07,319.69 355.28,318.9 354.31,318.9C353.33,318.9 352.55,319.69 352.55,320.66C352.55,321.64 353.33,322.43 354.31,322.43Z\"\n        android:fillColor=\"#71BA33\"/>\n    <path\n        android:pathData=\"M372.08,358.76C373.68,358.76 374.98,357.47 374.98,355.86C374.98,354.26 373.68,352.96 372.08,352.96C370.48,352.96 369.18,354.26 369.18,355.86C369.18,357.47 370.48,358.76 372.08,358.76Z\"\n        android:fillColor=\"#71BA33\"/>\n    <path\n        android:pathData=\"M353.43,352.96C353.91,352.96 354.31,352.57 354.31,352.08C354.31,351.6 353.91,351.2 353.43,351.2C352.94,351.2 352.55,351.6 352.55,352.08C352.55,352.57 352.94,352.96 353.43,352.96Z\"\n        android:fillColor=\"#71BA33\"/>\n    <path\n        android:pathData=\"M340.95,381C342.96,381 344.58,379.37 344.58,377.36C344.58,375.35 342.96,373.72 340.95,373.72C338.94,373.72 337.31,375.35 337.31,377.36C337.31,379.37 338.94,381 340.95,381Z\"\n        android:fillColor=\"#71BA33\"/>\n    <path\n        android:pathData=\"M332.9,339.2C333.42,339.2 333.84,338.78 333.84,338.26C333.84,337.75 333.42,337.33 332.9,337.33C332.38,337.33 331.96,337.75 331.96,338.26C331.96,338.78 332.38,339.2 332.9,339.2Z\"\n        android:fillColor=\"#71BA33\"/>\n  </group>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/stage_5.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"500dp\"\n    android:height=\"500dp\"\n    android:viewportWidth=\"500\"\n    android:viewportHeight=\"500\">\n  <group>\n    <clip-path\n        android:pathData=\"M91,452h319v48h-319z\"/>\n    <path\n        android:pathData=\"M250.5,500C338.59,500 410,489.26 410,476C410,462.74 338.59,452 250.5,452C162.41,452 91,462.74 91,476C91,489.26 162.41,500 250.5,500Z\"\n        android:fillColor=\"#60A625\"/>\n    <path\n        android:pathData=\"M250.5,485C283.64,485 310.5,480.97 310.5,476C310.5,471.03 283.64,467 250.5,467C217.36,467 190.5,471.03 190.5,476C190.5,480.97 217.36,485 250.5,485Z\"\n        android:fillColor=\"#51901C\"/>\n  </group>\n  <group>\n    <clip-path\n        android:pathData=\"M30,35h441v441h-441z\"/>\n    <path\n        android:pathData=\"M258.45,227.57H244.07C244.07,227.57 231.19,428.14 228.58,468.83C228.46,470.68 228.96,472.51 229.95,473.86C230.95,475.23 232.35,476 233.82,476H267.18C268.64,476 270.04,475.24 271.03,473.88C272.03,472.53 272.53,470.72 272.43,468.9C270.08,428.3 258.45,227.57 258.45,227.57Z\"\n        android:fillColor=\"#413022\"\n        android:fillType=\"evenOdd\"/>\n    <path\n        android:pathData=\"M207.76,303.24L201.33,308.3C201.33,308.3 232.8,360.07 239.19,370.57C239.48,371.05 240.04,371.3 240.74,371.27C241.43,371.24 242.2,370.93 242.86,370.41L257.76,358.67C258.41,358.15 258.9,357.48 259.09,356.82C259.28,356.15 259.17,355.54 258.79,355.15C250.2,346.42 207.76,303.24 207.76,303.24Z\"\n        android:fillColor=\"#413022\"\n        android:fillType=\"evenOdd\"/>\n    <path\n        android:pathData=\"M309.46,285.38L303.67,279.6C303.67,279.6 255.97,316.94 246.29,324.52C245.86,324.86 245.67,325.45 245.78,326.14C245.89,326.83 246.29,327.55 246.88,328.14L260.3,341.56C260.89,342.15 261.61,342.55 262.3,342.66C262.98,342.77 263.57,342.59 263.91,342.16C271.58,332.61 309.46,285.38 309.46,285.38Z\"\n        android:fillColor=\"#413022\"\n        android:fillType=\"evenOdd\"/>\n    <path\n        android:pathData=\"M182.14,184.93C153.03,179.96 116.9,169.78 75.06,211.62C33.21,253.47 47.13,282.77 54.85,298.34C61.84,312.46 119,385.37 189.52,339.65C265.58,290.35 259.07,269.76 249.68,241.47C241.06,215.5 209.76,189.65 182.14,184.93Z\"\n        android:fillColor=\"#4A8D12\"\n        android:fillType=\"evenOdd\"/>\n    <path\n        android:pathData=\"M355.48,142.7C343.65,106.53 333.27,58.91 263.62,40.25C193.98,21.59 170.72,57.2 158.55,76.48C147.51,93.97 102.92,207.95 193.64,256.27C291.49,308.4 309.76,287.06 334.61,257.24C357.42,229.86 366.71,177.02 355.48,142.7Z\"\n        android:fillColor=\"#6DAC38\"\n        android:fillType=\"evenOdd\"/>\n    <path\n        android:pathData=\"M348.73,224.19C333.49,221.59 314.57,216.26 292.67,238.16C270.76,260.07 278.05,275.42 282.08,283.56C285.75,290.95 315.67,329.13 352.59,305.2C392.42,279.38 389.01,268.6 384.09,253.79C379.58,240.2 363.19,226.66 348.73,224.19Z\"\n        android:fillColor=\"#4A8D12\"\n        android:fillType=\"evenOdd\"/>\n    <path\n        android:pathData=\"M180.57,188.09C182.12,188.09 183.38,186.84 183.38,185.29C183.38,183.73 182.12,182.48 180.57,182.48C179.02,182.48 177.76,183.73 177.76,185.29C177.76,186.84 179.02,188.09 180.57,188.09Z\"\n        android:fillColor=\"#9FE664\"/>\n    <path\n        android:pathData=\"M242.37,89.92C243.38,89.92 244.2,89.1 244.2,88.08C244.2,87.07 243.38,86.25 242.37,86.25C241.35,86.25 240.53,87.07 240.53,88.08C240.53,89.1 241.35,89.92 242.37,89.92Z\"\n        android:fillColor=\"#9FE664\"/>\n    <path\n        android:pathData=\"M205.71,122.35C206.44,122.35 207.04,121.75 207.04,121.02C207.04,120.28 206.44,119.69 205.71,119.69C204.97,119.69 204.38,120.28 204.38,121.02C204.38,121.75 204.97,122.35 205.71,122.35Z\"\n        android:fillColor=\"#9FE664\"/>\n    <path\n        android:pathData=\"M169.94,161.22C171.01,161.22 171.88,160.35 171.88,159.28C171.88,158.21 171.01,157.34 169.94,157.34C168.87,157.34 168,158.21 168,159.28C168,160.35 168.87,161.22 169.94,161.22Z\"\n        android:fillColor=\"#9FE664\"/>\n    <path\n        android:pathData=\"M186.38,79.95C189.49,79.95 192.01,77.43 192.01,74.32C192.01,71.21 189.49,68.69 186.38,68.69C183.27,68.69 180.75,71.21 180.75,74.32C180.75,77.43 183.27,79.95 186.38,79.95Z\"\n        android:fillColor=\"#9FE664\"/>\n    <path\n        android:pathData=\"M283.82,167.68C285.61,167.68 287.05,166.23 287.05,164.45C287.05,162.66 285.61,161.22 283.82,161.22C282.04,161.22 280.59,162.66 280.59,164.45C280.59,166.23 282.04,167.68 283.82,167.68Z\"\n        android:fillColor=\"#9FE664\"/>\n    <path\n        android:pathData=\"M342.64,242.21C343.72,242.21 344.6,241.33 344.6,240.25C344.6,239.17 343.72,238.3 342.64,238.3C341.56,238.3 340.69,239.17 340.69,240.25C340.69,241.33 341.56,242.21 342.64,242.21Z\"\n        android:fillColor=\"#71BA33\"/>\n    <path\n        android:pathData=\"M362.33,282.47C364.1,282.47 365.54,281.03 365.54,279.26C365.54,277.48 364.1,276.04 362.33,276.04C360.55,276.04 359.12,277.48 359.12,279.26C359.12,281.03 360.55,282.47 362.33,282.47Z\"\n        android:fillColor=\"#71BA33\"/>\n    <path\n        android:pathData=\"M341.67,276.04C342.2,276.04 342.64,275.6 342.64,275.07C342.64,274.53 342.2,274.09 341.67,274.09C341.13,274.09 340.69,274.53 340.69,275.07C340.69,275.6 341.13,276.04 341.67,276.04Z\"\n        android:fillColor=\"#71BA33\"/>\n    <path\n        android:pathData=\"M327.83,307.11C330.06,307.11 331.87,305.3 331.87,303.07C331.87,300.85 330.06,299.04 327.83,299.04C325.61,299.04 323.8,300.85 323.8,303.07C323.8,305.3 325.61,307.11 327.83,307.11Z\"\n        android:fillColor=\"#71BA33\"/>\n    <path\n        android:pathData=\"M318.92,260.79C319.49,260.79 319.96,260.33 319.96,259.75C319.96,259.18 319.49,258.71 318.92,258.71C318.35,258.71 317.88,259.18 317.88,259.75C317.88,260.33 318.35,260.79 318.92,260.79Z\"\n        android:fillColor=\"#71BA33\"/>\n    <path\n        android:pathData=\"M105.63,209.76C106.81,209.76 107.76,208.81 107.76,207.63C107.76,206.45 106.81,205.49 105.63,205.49C104.45,205.49 103.49,206.45 103.49,207.63C103.49,208.81 104.45,209.76 105.63,209.76Z\"\n        android:fillColor=\"#69B528\"/>\n    <path\n        android:pathData=\"M99.16,290.48C99.96,290.48 100.61,289.83 100.61,289.04C100.61,288.24 99.96,287.59 99.16,287.59C98.36,287.59 97.72,288.24 97.72,289.04C97.72,289.83 98.36,290.48 99.16,290.48Z\"\n        android:fillColor=\"#69B528\"/>\n    <path\n        android:pathData=\"M118.32,234.27C119.11,234.27 119.76,233.63 119.76,232.83C119.76,232.03 119.11,231.38 118.32,231.38C117.52,231.38 116.87,232.03 116.87,232.83C116.87,233.63 117.52,234.27 118.32,234.27Z\"\n        android:fillColor=\"#69B528\"/>\n    <path\n        android:pathData=\"M70.27,279.18C71.07,279.18 71.72,278.53 71.72,277.73C71.72,276.93 71.07,276.29 70.27,276.29C69.47,276.29 68.83,276.93 68.83,277.73C68.83,278.53 69.47,279.18 70.27,279.18Z\"\n        android:fillColor=\"#69B528\"/>\n    <path\n        android:pathData=\"M132.58,328.43C135.89,328.43 138.58,325.75 138.58,322.43C138.58,319.11 135.89,316.43 132.58,316.43C129.26,316.43 126.57,319.11 126.57,322.43C126.57,325.75 129.26,328.43 132.58,328.43Z\"\n        android:fillColor=\"#69B528\"/>\n    <path\n        android:pathData=\"M87.1,247.46C88.7,247.46 89.99,246.17 89.99,244.57C89.99,242.98 88.7,241.68 87.1,241.68C85.51,241.68 84.21,242.98 84.21,244.57C84.21,246.17 85.51,247.46 87.1,247.46Z\"\n        android:fillColor=\"#69B528\"/>\n    <path\n        android:pathData=\"M83.31,318.59C84.51,318.59 85.48,317.62 85.48,316.42C85.48,315.23 84.51,314.26 83.31,314.26C82.12,314.26 81.15,315.23 81.15,316.42C81.15,317.62 82.12,318.59 83.31,318.59Z\"\n        android:fillColor=\"#69B528\"/>\n  </group>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/stage_6.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"500dp\"\n    android:height=\"500dp\"\n    android:viewportWidth=\"500\"\n    android:viewportHeight=\"500\">\n  <group>\n    <clip-path\n        android:pathData=\"M91,452h319v48h-319z\"/>\n    <path\n        android:pathData=\"M250.5,500C338.59,500 410,489.26 410,476C410,462.74 338.59,452 250.5,452C162.41,452 91,462.74 91,476C91,489.26 162.41,500 250.5,500Z\"\n        android:fillColor=\"#60A625\"/>\n    <path\n        android:pathData=\"M250.5,485C283.64,485 310.5,480.97 310.5,476C310.5,471.03 283.64,467 250.5,467C217.36,467 190.5,471.03 190.5,476C190.5,480.97 217.36,485 250.5,485Z\"\n        android:fillColor=\"#51901C\"/>\n  </group>\n  <group>\n    <clip-path\n        android:pathData=\"M25,24h452v452h-452z\"/>\n    <path\n        android:pathData=\"M259.23,271.99H244.35C244.35,271.99 231.02,436.7 228.32,470.12C228.2,471.63 228.71,473.13 229.74,474.25C230.77,475.36 232.22,476 233.74,476H268.26C269.77,476 271.22,475.38 272.24,474.26C273.27,473.15 273.8,471.67 273.69,470.17C271.26,436.83 259.23,271.99 259.23,271.99Z\"\n        android:fillColor=\"#413022\"\n        android:fillType=\"evenOdd\"/>\n    <path\n        android:pathData=\"M207.63,318.84L201.79,323.44C201.79,323.44 230.41,370.54 236.22,380.09C236.49,380.52 237,380.75 237.63,380.73C238.26,380.7 238.96,380.42 239.56,379.95L253.12,369.27C253.71,368.8 254.15,368.19 254.32,367.58C254.5,366.97 254.4,366.42 254.05,366.06C246.24,358.12 207.63,318.84 207.63,318.84Z\"\n        android:fillColor=\"#413022\"\n        android:fillType=\"evenOdd\"/>\n    <path\n        android:pathData=\"M302.94,291.44L297.68,286.17C297.68,286.17 254.28,320.15 245.48,327.04C245.08,327.35 244.91,327.89 245.01,328.51C245.11,329.14 245.48,329.8 246.01,330.34L258.22,342.54C258.75,343.08 259.41,343.44 260.03,343.54C260.66,343.65 261.19,343.48 261.51,343.09C268.48,334.4 302.94,291.44 302.94,291.44Z\"\n        android:fillColor=\"#413022\"\n        android:fillType=\"evenOdd\"/>\n    <path\n        android:pathData=\"M93.98,156.1C76.35,184.45 50.45,217.35 74.4,286.03C98.35,354.71 133.87,356.5 152.87,357.11C170.11,357.66 268.24,337.99 252.83,236.39C236.2,126.8 212.67,122.04 180.14,115.97C150.27,110.4 110.71,129.2 93.98,156.1Z\"\n        android:fillColor=\"#3F6B19\"\n        android:fillType=\"evenOdd\"/>\n    <path\n        android:pathData=\"M258.49,156.1C240.86,184.45 214.96,217.35 238.91,286.03C262.86,354.71 298.38,356.5 317.38,357.11C334.61,357.66 432.74,337.99 417.33,236.39C400.71,126.8 377.18,122.04 344.65,115.97C314.78,110.4 275.21,129.2 258.49,156.1Z\"\n        android:fillColor=\"#7EC046\"\n        android:fillType=\"evenOdd\"/>\n    <path\n        android:pathData=\"M294.79,30.18C257.35,23.78 210.86,10.69 157.03,64.52C103.2,118.35 121.11,156.05 131.03,176.08C140.03,194.24 213.56,288.04 304.28,229.23C402.14,165.8 393.76,139.31 381.68,102.92C370.59,69.51 330.33,36.26 294.79,30.18Z\"\n        android:fillColor=\"#60A625\"\n        android:fillType=\"evenOdd\"/>\n    <path\n        android:pathData=\"M299.72,289.93L294.02,285.15C294.02,285.15 253.76,322.79 245.6,330.42C245.23,330.77 245.1,331.32 245.26,331.93C245.42,332.55 245.84,333.18 246.42,333.66L259.64,344.75C260.22,345.24 260.91,345.54 261.54,345.59C262.17,345.64 262.69,345.43 262.97,345.01C269.15,335.74 299.72,289.93 299.72,289.93Z\"\n        android:fillColor=\"#413022\"\n        android:fillType=\"evenOdd\"/>\n    <path\n        android:pathData=\"M352.44,161.09C325.97,156.56 293.1,147.3 255.03,185.37C216.97,223.43 229.63,250.09 236.65,264.25C243.01,277.1 295.01,343.42 359.16,301.84C428.35,256.98 422.43,238.26 413.89,212.52C406.04,188.9 377.57,165.38 352.44,161.09Z\"\n        android:fillColor=\"#4A8D12\"\n        android:fillType=\"evenOdd\"/>\n    <path\n        android:pathData=\"M253.73,385.73C258.45,385.73 262.27,380.74 262.27,374.6C262.27,368.45 258.45,363.47 253.73,363.47C249.02,363.47 245.19,368.45 245.19,374.6C245.19,380.74 249.02,385.73 253.73,385.73Z\"\n        android:fillColor=\"#2B1604\"/>\n    <path\n        android:pathData=\"M206.82,171.48C208.41,171.48 209.7,170.2 209.7,168.6C209.7,167.01 208.41,165.73 206.82,165.73C205.23,165.73 203.95,167.01 203.95,168.6C203.95,170.2 205.23,171.48 206.82,171.48Z\"\n        android:fillColor=\"#9FE664\"/>\n    <path\n        android:pathData=\"M270.16,70.86C271.2,70.86 272.04,70.02 272.04,68.98C272.04,67.94 271.2,67.1 270.16,67.1C269.13,67.1 268.28,67.94 268.28,68.98C268.28,70.02 269.13,70.86 270.16,70.86Z\"\n        android:fillColor=\"#9FE664\"/>\n    <path\n        android:pathData=\"M232.59,104.1C233.34,104.1 233.95,103.49 233.95,102.73C233.95,101.98 233.34,101.37 232.59,101.37C231.84,101.37 231.23,101.98 231.23,102.73C231.23,103.49 231.84,104.1 232.59,104.1Z\"\n        android:fillColor=\"#9FE664\"/>\n    <path\n        android:pathData=\"M195.93,143.94C197.03,143.94 197.92,143.05 197.92,141.95C197.92,140.85 197.03,139.96 195.93,139.96C194.83,139.96 193.94,140.85 193.94,141.95C193.94,143.05 194.83,143.94 195.93,143.94Z\"\n        android:fillColor=\"#9FE664\"/>\n    <path\n        android:pathData=\"M212.78,60.64C215.97,60.64 218.55,58.06 218.55,54.87C218.55,51.68 215.97,49.1 212.78,49.1C209.59,49.1 207.01,51.68 207.01,54.87C207.01,58.06 209.59,60.64 212.78,60.64Z\"\n        android:fillColor=\"#9FE664\"/>\n    <path\n        android:pathData=\"M312.65,150.56C314.48,150.56 315.97,149.08 315.97,147.25C315.97,145.42 314.48,143.94 312.65,143.94C310.83,143.94 309.34,145.42 309.34,147.25C309.34,149.08 310.83,150.56 312.65,150.56Z\"\n        android:fillColor=\"#9FE664\"/>\n    <path\n        android:pathData=\"M358.01,207.12C359.11,207.12 360.01,206.22 360.01,205.12C360.01,204.01 359.11,203.11 358.01,203.11C356.9,203.11 356.01,204.01 356.01,205.12C356.01,206.22 356.9,207.12 358.01,207.12Z\"\n        android:fillColor=\"#71BA33\"/>\n    <path\n        android:pathData=\"M378.19,248.39C380.01,248.39 381.48,246.91 381.48,245.09C381.48,243.27 380.01,241.8 378.19,241.8C376.37,241.8 374.89,243.27 374.89,245.09C374.89,246.91 376.37,248.39 378.19,248.39Z\"\n        android:fillColor=\"#71BA33\"/>\n    <path\n        android:pathData=\"M357.01,241.8C357.56,241.8 358.01,241.35 358.01,240.8C358.01,240.25 357.56,239.8 357.01,239.8C356.45,239.8 356.01,240.25 356.01,240.8C356.01,241.35 356.45,241.8 357.01,241.8Z\"\n        android:fillColor=\"#71BA33\"/>\n    <path\n        android:pathData=\"M342.83,273.64C345.11,273.64 346.96,271.79 346.96,269.51C346.96,267.22 345.11,265.37 342.83,265.37C340.55,265.37 338.7,267.22 338.7,269.51C338.7,271.79 340.55,273.64 342.83,273.64Z\"\n        android:fillColor=\"#71BA33\"/>\n    <path\n        android:pathData=\"M333.7,226.17C334.28,226.17 334.76,225.69 334.76,225.1C334.76,224.52 334.28,224.04 333.7,224.04C333.11,224.04 332.63,224.52 332.63,225.1C332.63,225.69 333.11,226.17 333.7,226.17Z\"\n        android:fillColor=\"#71BA33\"/>\n    <path\n        android:pathData=\"M108.84,195.37C110,195.03 110.66,193.81 110.32,192.65C109.98,191.49 108.76,190.83 107.6,191.17C106.44,191.52 105.78,192.73 106.12,193.89C106.46,195.05 107.68,195.71 108.84,195.37Z\"\n        android:fillColor=\"#69B528\"/>\n    <path\n        android:pathData=\"M125.9,276.6C126.68,276.36 127.13,275.54 126.9,274.76C126.67,273.97 125.85,273.52 125.06,273.76C124.28,273.99 123.83,274.81 124.06,275.6C124.29,276.38 125.12,276.83 125.9,276.6Z\"\n        android:fillColor=\"#69B528\"/>\n    <path\n        android:pathData=\"M128.42,215.79C129.21,215.55 129.65,214.73 129.42,213.95C129.19,213.16 128.37,212.71 127.58,212.95C126.8,213.18 126.35,214 126.58,214.78C126.82,215.57 127.64,216.02 128.42,215.79Z\"\n        android:fillColor=\"#69B528\"/>\n    <path\n        android:pathData=\"M94.22,273.86C95.01,273.63 95.45,272.81 95.22,272.02C94.99,271.24 94.17,270.79 93.38,271.02C92.6,271.26 92.15,272.08 92.38,272.86C92.61,273.65 93.44,274.1 94.22,273.86Z\"\n        android:fillColor=\"#69B528\"/>\n    <path\n        android:pathData=\"M169.76,304.21C173.02,303.25 174.88,299.83 173.92,296.57C172.96,293.31 169.54,291.44 166.27,292.41C163.01,293.37 161.15,296.79 162.11,300.05C163.08,303.31 166.5,305.17 169.76,304.21Z\"\n        android:fillColor=\"#69B528\"/>\n    <path\n        android:pathData=\"M101.57,237.8C103.13,237.34 104.03,235.69 103.57,234.13C103.11,232.56 101.46,231.66 99.89,232.13C98.32,232.59 97.43,234.23 97.89,235.8C98.35,237.37 100,238.27 101.57,237.8Z\"\n        android:fillColor=\"#69B528\"/>\n    <path\n        android:pathData=\"M118.48,308.83C119.65,308.48 120.32,307.24 119.98,306.07C119.63,304.89 118.4,304.22 117.22,304.57C116.05,304.92 115.38,306.15 115.72,307.33C116.07,308.5 117.3,309.17 118.48,308.83Z\"\n        android:fillColor=\"#69B528\"/>\n  </group>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/steps_fill0_wght400_grad0_opsz24.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\">\n  <path\n      android:fillColor=\"#FF000000\"\n      android:pathData=\"M5.4,9.5q0.975,0 1.85,0.35 0.875,0.35 1.6,1.025L18.4,20h0.6q0.425,0 0.712,-0.288Q20,19.425 20,19q0,-0.2 -0.038,-0.425 -0.037,-0.225 -0.262,-0.45l-4.575,-4.575L13.35,8.2l-1.85,0.45q-0.95,0.25 -1.725,-0.35Q9,7.7 9,6.725v-2.1l-0.7,-0.35 -3.85,5.15q-0.025,0.025 -0.025,0.037 0,0.013 -0.025,0.038ZM5.4,11.5L4.25,11.5q0.075,0.175 0.188,0.325 0.112,0.15 0.262,0.275l8.1,7.375q0.275,0.275 0.625,0.4t0.725,0.125h1.35l-8.025,-7.675q-0.425,-0.425 -0.962,-0.625 -0.538,-0.2 -1.113,-0.2ZM14.15,22q-0.75,0 -1.425,-0.275t-1.25,-0.775L3.35,13.575Q2.2,12.525 2.062,11q-0.137,-1.525 0.788,-2.775l3.85,-5.15q0.425,-0.575 1.138,-0.763 0.712,-0.187 1.362,0.163l0.7,0.35q0.525,0.275 0.813,0.75 0.287,0.475 0.287,1.05v2.1l1.85,-0.475q0.75,-0.2 1.45,0.188 0.7,0.387 0.95,1.112l1.625,4.9 4.25,4.25q0.5,0.5 0.687,1.075Q22,18.35 22,19q0,1.25 -0.875,2.125T19,22Z\"/>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/tree_collected.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"150dp\"\n    android:height=\"200dp\"\n    android:viewportWidth=\"150\"\n    android:viewportHeight=\"200\">\n  <group>\n    <clip-path\n        android:pathData=\"M0,0h150v200h-150z\"/>\n    <path\n        android:pathData=\"M75,200C108.14,200 135,195.97 135,191C135,186.03 108.14,182 75,182C41.86,182 15,186.03 15,191C15,195.97 41.86,200 75,200Z\"\n        android:fillColor=\"#000000\"\n        android:fillAlpha=\"0.1\"/>\n    <path\n        android:pathData=\"M77.63,119.06H72.39C72.39,119.06 67.7,177 66.75,188.76C66.71,189.29 66.89,189.82 67.25,190.21C67.61,190.6 68.12,190.82 68.66,190.82H80.8C81.33,190.82 81.84,190.6 82.2,190.21C82.57,189.82 82.75,189.3 82.71,188.77C81.86,177.04 77.63,119.06 77.63,119.06Z\"\n        android:fillColor=\"#413022\"\n        android:fillType=\"evenOdd\"/>\n    <path\n        android:pathData=\"M59.47,135.54L57.42,137.16C57.42,137.16 67.49,153.72 69.53,157.09C69.62,157.24 69.8,157.32 70.03,157.31C70.25,157.3 70.5,157.2 70.71,157.03L75.47,153.28C75.68,153.11 75.84,152.9 75.9,152.68C75.96,152.47 75.93,152.28 75.8,152.15C73.06,149.35 59.47,135.54 59.47,135.54Z\"\n        android:fillColor=\"#413022\"\n        android:fillType=\"evenOdd\"/>\n    <path\n        android:pathData=\"M93,125.9L91.15,124.05C91.15,124.05 75.88,136 72.79,138.42C72.65,138.53 72.59,138.72 72.62,138.94C72.66,139.16 72.79,139.39 72.97,139.58L77.27,143.88C77.46,144.06 77.69,144.19 77.91,144.23C78.13,144.26 78.31,144.21 78.43,144.07C80.88,141.01 93,125.9 93,125.9Z\"\n        android:fillColor=\"#413022\"\n        android:fillType=\"evenOdd\"/>\n    <path\n        android:pathData=\"M19.49,78.29C13.29,88.26 4.18,99.84 12.6,124C21.03,148.16 33.52,148.79 40.21,149C46.27,149.2 80.79,142.28 75.37,106.53C69.52,67.98 61.25,66.31 49.8,64.17C39.3,62.21 25.38,68.83 19.49,78.29Z\"\n        android:fillColor=\"#3F6B19\"\n        android:fillType=\"evenOdd\"/>\n    <path\n        android:pathData=\"M77.36,78.29C71.16,88.26 62.05,99.84 70.48,124C78.9,148.16 91.4,148.79 98.08,149C104.14,149.2 138.66,142.28 133.24,106.53C127.4,67.98 119.12,66.31 107.67,64.17C97.17,62.21 83.25,68.83 77.36,78.29Z\"\n        android:fillColor=\"#7EC046\"\n        android:fillType=\"evenOdd\"/>\n    <path\n        android:pathData=\"M90.13,33.99C76.96,31.74 60.61,27.13 41.67,46.07C22.74,65.01 29.04,78.27 32.53,85.32C35.69,91.71 61.56,124.7 93.47,104.01C127.9,81.7 124.95,72.38 120.7,59.58C116.8,47.83 102.64,36.13 90.13,33.99Z\"\n        android:fillColor=\"#60A625\"\n        android:fillType=\"evenOdd\"/>\n    <path\n        android:pathData=\"M91.87,125.37L89.86,123.68C89.86,123.68 75.7,136.93 72.83,139.61C72.7,139.74 72.66,139.93 72.71,140.14C72.77,140.36 72.91,140.58 73.12,140.75L77.77,144.65C77.97,144.82 78.22,144.93 78.44,144.95C78.66,144.96 78.84,144.89 78.94,144.74C81.11,141.49 91.87,125.37 91.87,125.37Z\"\n        android:fillColor=\"#413022\"\n        android:fillType=\"evenOdd\"/>\n    <path\n        android:pathData=\"M110.42,80.04C101.1,78.45 89.54,75.19 76.15,88.58C62.76,101.98 67.21,111.35 69.68,116.33C71.92,120.85 90.21,144.19 112.78,129.56C137.12,113.78 135.04,107.19 132.03,98.14C129.27,89.83 119.26,81.55 110.42,80.04Z\"\n        android:fillColor=\"#4A8D12\"\n        android:fillType=\"evenOdd\"/>\n    <path\n        android:pathData=\"M75.69,159.07C77.35,159.07 78.69,157.31 78.69,155.15C78.69,152.99 77.35,151.24 75.69,151.24C74.03,151.24 72.69,152.99 72.69,155.15C72.69,157.31 74.03,159.07 75.69,159.07Z\"\n        android:fillColor=\"#2B1604\"/>\n    <path\n        android:pathData=\"M59.19,83.7C59.75,83.7 60.2,83.25 60.2,82.69C60.2,82.13 59.75,81.67 59.19,81.67C58.63,81.67 58.18,82.13 58.18,82.69C58.18,83.25 58.63,83.7 59.19,83.7Z\"\n        android:fillColor=\"#9FE664\"/>\n    <path\n        android:pathData=\"M81.47,48.3C81.84,48.3 82.13,48.01 82.13,47.64C82.13,47.28 81.84,46.98 81.47,46.98C81.11,46.98 80.81,47.28 80.81,47.64C80.81,48.01 81.11,48.3 81.47,48.3Z\"\n        android:fillColor=\"#9FE664\"/>\n    <path\n        android:pathData=\"M68.25,59.99C68.52,59.99 68.73,59.78 68.73,59.52C68.73,59.25 68.52,59.04 68.25,59.04C67.99,59.04 67.77,59.25 67.77,59.52C67.77,59.78 67.99,59.99 68.25,59.99Z\"\n        android:fillColor=\"#9FE664\"/>\n    <path\n        android:pathData=\"M55.36,74.01C55.74,74.01 56.06,73.7 56.06,73.31C56.06,72.92 55.74,72.61 55.36,72.61C54.97,72.61 54.66,72.92 54.66,73.31C54.66,73.7 54.97,74.01 55.36,74.01Z\"\n        android:fillColor=\"#9FE664\"/>\n    <path\n        android:pathData=\"M61.28,44.71C62.41,44.71 63.31,43.8 63.31,42.68C63.31,41.56 62.41,40.65 61.28,40.65C60.16,40.65 59.25,41.56 59.25,42.68C59.25,43.8 60.16,44.71 61.28,44.71Z\"\n        android:fillColor=\"#9FE664\"/>\n    <path\n        android:pathData=\"M96.42,76.34C97.06,76.34 97.58,75.82 97.58,75.17C97.58,74.53 97.06,74.01 96.42,74.01C95.78,74.01 95.25,74.53 95.25,75.17C95.25,75.82 95.78,76.34 96.42,76.34Z\"\n        android:fillColor=\"#9FE664\"/>\n    <path\n        android:pathData=\"M112.37,96.24C112.76,96.24 113.08,95.92 113.08,95.53C113.08,95.14 112.76,94.83 112.37,94.83C111.98,94.83 111.67,95.14 111.67,95.53C111.67,95.92 111.98,96.24 112.37,96.24Z\"\n        android:fillColor=\"#71BA33\"/>\n    <path\n        android:pathData=\"M119.47,110.75C120.11,110.75 120.63,110.24 120.63,109.6C120.63,108.96 120.11,108.44 119.47,108.44C118.83,108.44 118.31,108.96 118.31,109.6C118.31,110.24 118.83,110.75 119.47,110.75Z\"\n        android:fillColor=\"#71BA33\"/>\n    <path\n        android:pathData=\"M112.02,108.44C112.22,108.44 112.37,108.28 112.37,108.08C112.37,107.89 112.22,107.73 112.02,107.73C111.83,107.73 111.67,107.89 111.67,108.08C111.67,108.28 111.83,108.44 112.02,108.44Z\"\n        android:fillColor=\"#71BA33\"/>\n    <path\n        android:pathData=\"M107.03,119.64C107.84,119.64 108.49,118.99 108.49,118.18C108.49,117.38 107.84,116.73 107.03,116.73C106.23,116.73 105.58,117.38 105.58,118.18C105.58,118.99 106.23,119.64 107.03,119.64Z\"\n        android:fillColor=\"#71BA33\"/>\n    <path\n        android:pathData=\"M103.82,102.94C104.03,102.94 104.19,102.77 104.19,102.56C104.19,102.36 104.03,102.19 103.82,102.19C103.61,102.19 103.45,102.36 103.45,102.56C103.45,102.77 103.61,102.94 103.82,102.94Z\"\n        android:fillColor=\"#71BA33\"/>\n    <path\n        android:pathData=\"M24.72,92.1C25.13,91.98 25.36,91.56 25.24,91.15C25.12,90.74 24.69,90.51 24.29,90.63C23.88,90.75 23.64,91.18 23.76,91.58C23.88,91.99 24.31,92.22 24.72,92.1Z\"\n        android:fillColor=\"#69B528\"/>\n    <path\n        android:pathData=\"M30.72,120.68C31,120.6 31.16,120.31 31.07,120.03C30.99,119.75 30.7,119.6 30.43,119.68C30.15,119.76 29.99,120.05 30.07,120.32C30.16,120.6 30.45,120.76 30.72,120.68Z\"\n        android:fillColor=\"#69B528\"/>\n    <path\n        android:pathData=\"M31.61,99.28C31.89,99.2 32.04,98.91 31.96,98.64C31.88,98.36 31.59,98.2 31.31,98.29C31.04,98.37 30.88,98.66 30.96,98.93C31.04,99.21 31.33,99.37 31.61,99.28Z\"\n        android:fillColor=\"#69B528\"/>\n    <path\n        android:pathData=\"M19.58,119.72C19.85,119.63 20.01,119.35 19.93,119.07C19.85,118.79 19.56,118.64 19.28,118.72C19.01,118.8 18.85,119.09 18.93,119.36C19.01,119.64 19.3,119.8 19.58,119.72Z\"\n        android:fillColor=\"#69B528\"/>\n    <path\n        android:pathData=\"M46.15,130.39C47.3,130.05 47.95,128.85 47.61,127.7C47.28,126.56 46.07,125.9 44.92,126.24C43.78,126.58 43.12,127.78 43.46,128.93C43.8,130.07 45,130.73 46.15,130.39Z\"\n        android:fillColor=\"#69B528\"/>\n    <path\n        android:pathData=\"M22.16,107.03C22.71,106.87 23.03,106.29 22.87,105.74C22.7,105.18 22.12,104.87 21.57,105.03C21.02,105.2 20.7,105.78 20.87,106.33C21.03,106.88 21.61,107.19 22.16,107.03Z\"\n        android:fillColor=\"#69B528\"/>\n    <path\n        android:pathData=\"M28.11,132.01C28.52,131.89 28.76,131.46 28.64,131.04C28.52,130.63 28.08,130.4 27.67,130.52C27.26,130.64 27.02,131.07 27.14,131.49C27.26,131.9 27.7,132.14 28.11,132.01Z\"\n        android:fillColor=\"#69B528\"/>\n  </group>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/layout/activity_main.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    android:orientation=\"vertical\"\n    tools:context=\".core.presentation.MainActivity\">\n\n    <androidx.coordinatorlayout.widget.CoordinatorLayout\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"0dp\"\n        android:layout_weight=\"1\">\n\n        <com.google.android.material.appbar.AppBarLayout\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:fitsSystemWindows=\"true\">\n\n            <com.google.android.material.appbar.MaterialToolbar\n                android:id=\"@+id/toolbar\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"?attr/actionBarSize\"\n                app:title=\"@string/app_name\" />\n\n        </com.google.android.material.appbar.AppBarLayout>\n\n        <androidx.fragment.app.FragmentContainerView\n            android:id=\"@+id/nav_host_fragment\"\n            android:name=\"androidx.navigation.fragment.NavHostFragment\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"match_parent\"\n            app:defaultNavHost=\"true\"\n            app:layout_behavior=\"@string/appbar_scrolling_view_behavior\"\n            app:navGraph=\"@navigation/nav_graph\" />\n\n    </androidx.coordinatorlayout.widget.CoordinatorLayout>\n\n    <com.google.android.material.bottomnavigation.BottomNavigationView\n        android:id=\"@+id/bottom_navigation\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        app:menu=\"@menu/bottom_navigation_menu\" />\n\n</LinearLayout>"
  },
  {
    "path": "app/src/main/res/layout/activity_onboarding.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<FrameLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    tools:context=\".core.presentation.OnboardingActivity\">\n\n    <androidx.fragment.app.FragmentContainerView\n        android:id=\"@+id/nav_host_fragment\"\n        android:name=\"androidx.navigation.fragment.NavHostFragment\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        app:defaultNavHost=\"true\"\n        app:navGraph=\"@navigation/onboarding_nav_graph\" />\n\n</FrameLayout>"
  },
  {
    "path": "app/src/main/res/layout/activity_settings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    tools:context=\".settings.SettingsActivity\">\n\n    <com.google.android.material.appbar.AppBarLayout\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:fitsSystemWindows=\"true\">\n\n        <com.google.android.material.appbar.MaterialToolbar\n            android:id=\"@+id/toolbar\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"?attr/actionBarSize\"\n            app:title=\"@string/settings\" />\n\n    </com.google.android.material.appbar.AppBarLayout>\n\n    <androidx.fragment.app.FragmentContainerView\n        android:id=\"@+id/settings_fragment\"\n        android:name=\"pl.bartek537.forest.settings.SettingsFragment\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        app:layout_behavior=\"@string/appbar_scrolling_view_behavior\" />\n\n</androidx.coordinatorlayout.widget.CoordinatorLayout>"
  },
  {
    "path": "app/src/main/res/layout/fragment_activity_recognition_permission.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<androidx.constraintlayout.widget.ConstraintLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    android:padding=\"16dp\"\n    tools:context=\".core.presentation.ActivityRecognitionPermissionFragment\">\n\n    <ImageView\n        android:id=\"@+id/image_walk\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginTop=\"38dp\"\n        android:importantForAccessibility=\"no\"\n        android:src=\"@drawable/directions_walk_fill0_wght400_grad0_opsz48\"\n        app:layout_constraintStart_toStartOf=\"parent\"\n        app:layout_constraintTop_toTopOf=\"parent\"\n        app:tint=\"?android:textColorPrimary\" />\n\n    <TextView\n        android:id=\"@+id/text_permission_title\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginTop=\"24dp\"\n        android:text=\"@string/allow_activity_recognition\"\n        android:textAppearance=\"?attr/textAppearanceHeadline5\"\n        app:layout_constraintStart_toStartOf=\"parent\"\n        app:layout_constraintTop_toBottomOf=\"@+id/image_walk\" />\n\n    <TextView\n        android:id=\"@+id/text_permission_rationale\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginTop=\"12dp\"\n        android:text=\"@string/activity_recognition_rationale\"\n        android:textAppearance=\"?attr/textAppearanceBodyMedium\"\n        app:layout_constraintStart_toStartOf=\"parent\"\n        app:layout_constraintTop_toBottomOf=\"@+id/text_permission_title\" />\n\n    <ImageView\n        android:id=\"@+id/icon_revoke_permission\"\n        android:layout_width=\"24dp\"\n        android:layout_height=\"24dp\"\n        android:layout_marginTop=\"38dp\"\n        android:importantForAccessibility=\"no\"\n        app:layout_constraintStart_toStartOf=\"parent\"\n        app:layout_constraintTop_toBottomOf=\"@+id/text_permission_rationale\"\n        app:srcCompat=\"@drawable/do_not_disturb_on_fill0_wght400_grad0_opsz24\"\n        app:tint=\"?android:textColorPrimary\" />\n\n    <TextView\n        android:layout_width=\"0dp\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginStart=\"12dp\"\n        android:text=\"@string/revoke_permission_rationale\"\n        android:textAppearance=\"?attr/textAppearanceBodyMedium\"\n        app:layout_constraintEnd_toEndOf=\"parent\"\n        app:layout_constraintStart_toEndOf=\"@+id/icon_revoke_permission\"\n        app:layout_constraintTop_toTopOf=\"@+id/icon_revoke_permission\" />\n\n    <TextView\n        android:layout_width=\"0dp\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginBottom=\"12dp\"\n        android:text=\"@string/data_consent\"\n        android:textAppearance=\"?attr/textAppearanceBodySmall\"\n        app:layout_constraintBottom_toTopOf=\"@+id/button_continue\"\n        app:layout_constraintEnd_toEndOf=\"parent\"\n        app:layout_constraintStart_toStartOf=\"parent\" />\n\n    <com.google.android.material.button.MaterialButton\n        android:id=\"@+id/button_continue\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:text=\"@string/action_continue\"\n        app:layout_constraintBottom_toBottomOf=\"parent\"\n        tools:layout_editor_absoluteX=\"16dp\" />\n\n</androidx.constraintlayout.widget.ConstraintLayout>"
  },
  {
    "path": "app/src/main/res/layout/fragment_forest.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<androidx.constraintlayout.widget.ConstraintLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    tools:context=\".trees.ForestFragment\">\n\n    <TextView\n        android:id=\"@+id/text_trees_collected\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginStart=\"16dp\"\n        android:layout_marginTop=\"16dp\"\n        android:textAppearance=\"?attr/textAppearanceDisplayMedium\"\n        android:textColor=\"?attr/colorOnSurface\"\n        app:layout_constraintStart_toStartOf=\"parent\"\n        app:layout_constraintTop_toTopOf=\"parent\"\n        tools:text=\"12\" />\n\n    <TextView\n        android:id=\"@+id/text_trees_collected_label\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginStart=\"4dp\"\n        android:textAppearance=\"?attr/textAppearanceTitleMedium\"\n        android:textColor=\"?attr/colorOnSurface\"\n        app:layout_constraintBaseline_toBaselineOf=\"@id/text_trees_collected\"\n        app:layout_constraintStart_toEndOf=\"@id/text_trees_collected\"\n        tools:text=\"trees\" />\n\n    <ImageView\n        android:id=\"@+id/image_ground\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"64dp\"\n        android:importantForAccessibility=\"no\"\n        android:src=\"@drawable/shape_ground\"\n        app:layout_constraintBottom_toBottomOf=\"parent\" />\n\n    <androidx.constraintlayout.widget.ConstraintLayout\n        android:id='@+id/constraint_layout_trees'\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"400dp\"\n        android:layout_marginBottom=\"-40dp\"\n        app:layout_constraintBottom_toTopOf=\"@id/image_ground\" />\n\n</androidx.constraintlayout.widget.ConstraintLayout>"
  },
  {
    "path": "app/src/main/res/layout/fragment_progress.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<androidx.core.widget.NestedScrollView xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    tools:context=\".progress.ProgressFragment\">\n\n    <androidx.constraintlayout.widget.ConstraintLayout\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:padding=\"16dp\">\n\n        <TextView\n            android:id=\"@+id/text_step_count\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:textAppearance=\"?attr/textAppearanceDisplayMedium\"\n            android:textColor=\"?attr/colorOnSurface\"\n            app:layout_constraintStart_toStartOf=\"parent\"\n            app:layout_constraintTop_toTopOf=\"parent\"\n            tools:text=\"3,837\" />\n\n        <TextView\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_marginStart=\"4dp\"\n            android:text=\"@string/steps\"\n            android:textAppearance=\"?attr/textAppearanceTitleMedium\"\n            android:textColor=\"?attr/colorOnSurface\"\n            app:layout_constraintBaseline_toBaselineOf=\"@id/text_step_count\"\n            app:layout_constraintStart_toEndOf=\"@id/text_step_count\" />\n\n        <com.google.android.material.progressindicator.LinearProgressIndicator\n            android:id=\"@+id/progress_daily_goal\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_marginTop=\"8dp\"\n            app:indicatorColor=\"?attr/colorPrimary\"\n            app:layout_constraintEnd_toEndOf=\"parent\"\n            app:layout_constraintStart_toStartOf=\"parent\"\n            app:layout_constraintTop_toBottomOf=\"@id/text_step_count\"\n            app:trackColor=\"?attr/colorSurfaceVariant\"\n            app:trackCornerRadius=\"4dp\"\n            app:trackThickness=\"8dp\"\n            tools:max=\"7500\"\n            tools:progress=\"3837\" />\n\n        <TextView\n            android:id=\"@+id/text_daily_goal\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_marginTop=\"8dp\"\n            android:textAppearance=\"?attr/textAppearanceTitleSmall\"\n            android:textColor=\"?attr/colorOnSurfaceVariant\"\n            app:layout_constraintStart_toStartOf=\"parent\"\n            app:layout_constraintTop_toBottomOf=\"@id/progress_daily_goal\"\n            tools:text=\"Goal 7,500\" />\n\n        <ImageView\n            android:id=\"@+id/image_tree\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:layout_marginTop=\"48dp\"\n            android:adjustViewBounds=\"true\"\n            android:importantForAccessibility=\"no\"\n            android:maxHeight=\"320dp\"\n            app:layout_constraintEnd_toEndOf=\"parent\"\n            app:layout_constraintStart_toStartOf=\"parent\"\n            app:layout_constraintTop_toBottomOf=\"@id/text_daily_goal\"\n            tools:src=\"@drawable/stage_6\" />\n\n        <LinearLayout\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:layout_marginHorizontal=\"8dp\"\n            android:layout_marginTop=\"36dp\"\n            android:orientation=\"vertical\"\n            app:layout_constraintTop_toBottomOf=\"@+id/image_tree\">\n\n            <androidx.cardview.widget.CardView\n                style=\"@style/Widget.Material3.CardView.Filled\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                app:cardBackgroundColor=\"?attr/colorTertiaryContainer\"\n                app:cardCornerRadius=\"24dp\">\n\n                <androidx.constraintlayout.widget.ConstraintLayout\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"wrap_content\"\n                    android:orientation=\"vertical\"\n                    android:paddingHorizontal=\"16dp\"\n                    android:paddingVertical=\"18dp\">\n\n                    <View\n                        android:id=\"@+id/view_calorie_background\"\n                        android:layout_width=\"48dp\"\n                        android:layout_height=\"48dp\"\n                        android:background=\"@drawable/shape_circle\"\n                        android:backgroundTint=\"?attr/colorTertiary\"\n                        app:layout_constraintBottom_toBottomOf=\"parent\"\n                        app:layout_constraintStart_toStartOf=\"parent\"\n                        app:layout_constraintTop_toTopOf=\"parent\" />\n\n                    <ImageView\n                        android:layout_width=\"wrap_content\"\n                        android:layout_height=\"wrap_content\"\n                        android:importantForAccessibility=\"no\"\n                        app:layout_constraintBottom_toBottomOf=\"@+id/view_calorie_background\"\n                        app:layout_constraintEnd_toEndOf=\"@+id/view_calorie_background\"\n                        app:layout_constraintStart_toStartOf=\"@+id/view_calorie_background\"\n                        app:layout_constraintTop_toTopOf=\"@+id/view_calorie_background\"\n                        app:srcCompat=\"@drawable/local_fire_department_fill0_wght400_grad0_opsz24\"\n                        app:tint=\"?attr/colorOnTertiary\" />\n\n                    <TextView\n                        android:id=\"@+id/text_calorie_burned\"\n                        android:layout_width=\"wrap_content\"\n                        android:layout_height=\"wrap_content\"\n                        android:layout_marginStart=\"16dp\"\n                        android:layout_marginBottom=\"2dp\"\n                        android:textAppearance=\"?attr/textAppearanceTitleMedium\"\n                        app:layout_constraintBottom_toTopOf=\"@+id/text_calorie_burned_label\"\n                        app:layout_constraintStart_toEndOf=\"@+id/view_calorie_background\"\n                        app:layout_constraintTop_toTopOf=\"@+id/view_calorie_background\"\n                        app:layout_constraintVertical_chainStyle=\"packed\"\n                        tools:text=\"210 kcal\" />\n\n                    <TextView\n                        android:id=\"@+id/text_calorie_burned_label\"\n                        android:layout_width=\"wrap_content\"\n                        android:layout_height=\"wrap_content\"\n                        android:text=\"@string/calorie_burned\"\n                        android:textAppearance=\"?attr/textAppearanceBodyMedium\"\n                        app:layout_constraintBottom_toBottomOf=\"@+id/view_calorie_background\"\n                        app:layout_constraintStart_toStartOf=\"@+id/text_calorie_burned\"\n                        app:layout_constraintTop_toBottomOf=\"@+id/text_calorie_burned\"\n                        app:layout_constraintVertical_chainStyle=\"packed\" />\n\n                </androidx.constraintlayout.widget.ConstraintLayout>\n\n            </androidx.cardview.widget.CardView>\n\n            <androidx.cardview.widget.CardView\n                style=\"@style/Widget.Material3.CardView.Filled\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:layout_marginTop=\"12dp\"\n                app:cardBackgroundColor=\"?attr/colorPrimaryContainer\"\n                app:cardCornerRadius=\"24dp\">\n\n                <androidx.constraintlayout.widget.ConstraintLayout\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"wrap_content\"\n                    android:orientation=\"vertical\"\n                    android:paddingHorizontal=\"16dp\"\n                    android:paddingVertical=\"18dp\">\n\n                    <View\n                        android:id=\"@+id/view_distance_background\"\n                        android:layout_width=\"48dp\"\n                        android:layout_height=\"48dp\"\n                        android:background=\"@drawable/shape_circle\"\n                        android:backgroundTint=\"?attr/colorPrimary\"\n                        app:layout_constraintBottom_toBottomOf=\"parent\"\n                        app:layout_constraintStart_toStartOf=\"parent\"\n                        app:layout_constraintTop_toTopOf=\"parent\" />\n\n                    <ImageView\n                        android:layout_width=\"wrap_content\"\n                        android:layout_height=\"wrap_content\"\n                        android:importantForAccessibility=\"no\"\n                        app:layout_constraintBottom_toBottomOf=\"@+id/view_distance_background\"\n                        app:layout_constraintEnd_toEndOf=\"@+id/view_distance_background\"\n                        app:layout_constraintStart_toStartOf=\"@+id/view_distance_background\"\n                        app:layout_constraintTop_toTopOf=\"@+id/view_distance_background\"\n                        app:srcCompat=\"@drawable/conversion_path_fill0_wght400_grad0_opsz24\"\n                        app:tint=\"?attr/colorOnPrimary\" />\n\n                    <TextView\n                        android:id=\"@+id/text_distance_travelled\"\n                        android:layout_width=\"wrap_content\"\n                        android:layout_height=\"wrap_content\"\n                        android:layout_marginStart=\"16dp\"\n                        android:layout_marginBottom=\"2dp\"\n                        android:textAppearance=\"?attr/textAppearanceTitleMedium\"\n                        app:layout_constraintBottom_toTopOf=\"@+id/text_distance_travelled_label\"\n                        app:layout_constraintStart_toEndOf=\"@+id/view_distance_background\"\n                        app:layout_constraintTop_toTopOf=\"@+id/view_distance_background\"\n                        app:layout_constraintVertical_chainStyle=\"packed\"\n                        tools:text=\"4.1 km\" />\n\n                    <TextView\n                        android:id=\"@+id/text_distance_travelled_label\"\n                        android:layout_width=\"wrap_content\"\n                        android:layout_height=\"wrap_content\"\n                        android:text=\"@string/distance_travelled\"\n                        android:textAppearance=\"?attr/textAppearanceBodyMedium\"\n                        app:layout_constraintBottom_toBottomOf=\"@+id/view_distance_background\"\n                        app:layout_constraintStart_toStartOf=\"@+id/text_distance_travelled\"\n                        app:layout_constraintTop_toBottomOf=\"@+id/text_distance_travelled\"\n                        app:layout_constraintVertical_chainStyle=\"packed\" />\n\n                </androidx.constraintlayout.widget.ConstraintLayout>\n\n            </androidx.cardview.widget.CardView>\n\n            <androidx.cardview.widget.CardView\n                style=\"@style/Widget.Material3.CardView.Filled\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:layout_marginTop=\"12dp\"\n                app:cardBackgroundColor=\"?attr/colorSecondaryContainer\"\n                app:cardCornerRadius=\"24dp\">\n\n                <androidx.constraintlayout.widget.ConstraintLayout\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"wrap_content\"\n                    android:orientation=\"vertical\"\n                    android:paddingHorizontal=\"16dp\"\n                    android:paddingVertical=\"18dp\">\n\n                    <View\n                        android:id=\"@+id/view_carbon_dioxide_background\"\n                        android:layout_width=\"48dp\"\n                        android:layout_height=\"48dp\"\n                        android:background=\"@drawable/shape_circle\"\n                        android:backgroundTint=\"?attr/colorSecondary\"\n                        app:layout_constraintBottom_toBottomOf=\"parent\"\n                        app:layout_constraintStart_toStartOf=\"parent\"\n                        app:layout_constraintTop_toTopOf=\"parent\" />\n\n                    <ImageView\n                        android:layout_width=\"wrap_content\"\n                        android:layout_height=\"wrap_content\"\n                        android:importantForAccessibility=\"no\"\n                        app:layout_constraintBottom_toBottomOf=\"@+id/view_carbon_dioxide_background\"\n                        app:layout_constraintEnd_toEndOf=\"@+id/view_carbon_dioxide_background\"\n                        app:layout_constraintStart_toStartOf=\"@+id/view_carbon_dioxide_background\"\n                        app:layout_constraintTop_toTopOf=\"@+id/view_carbon_dioxide_background\"\n                        app:srcCompat=\"@drawable/bubble_chart_fill0_wght400_grad0_opsz24\"\n                        app:tint=\"?attr/colorOnSecondary\" />\n\n                    <TextView\n                        android:id=\"@+id/text_carbon_dioxide_saved\"\n                        android:layout_width=\"wrap_content\"\n                        android:layout_height=\"wrap_content\"\n                        android:layout_marginStart=\"16dp\"\n                        android:layout_marginBottom=\"2dp\"\n                        android:textAppearance=\"?attr/textAppearanceTitleMedium\"\n                        app:layout_constraintBottom_toTopOf=\"@+id/text_carbon_dioxide_saved_label\"\n                        app:layout_constraintStart_toEndOf=\"@+id/view_carbon_dioxide_background\"\n                        app:layout_constraintTop_toTopOf=\"@+id/view_carbon_dioxide_background\"\n                        app:layout_constraintVertical_chainStyle=\"packed\"\n                        tools:text=\"1.43 kg\" />\n\n                    <TextView\n                        android:id=\"@+id/text_carbon_dioxide_saved_label\"\n                        android:layout_width=\"wrap_content\"\n                        android:layout_height=\"wrap_content\"\n                        android:text=\"@string/carbon_dioxide_saved\"\n                        android:textAppearance=\"?attr/textAppearanceBodyMedium\"\n                        app:layout_constraintBottom_toBottomOf=\"@+id/view_carbon_dioxide_background\"\n                        app:layout_constraintStart_toStartOf=\"@+id/text_carbon_dioxide_saved\"\n                        app:layout_constraintTop_toBottomOf=\"@+id/text_carbon_dioxide_saved\"\n                        app:layout_constraintVertical_chainStyle=\"packed\" />\n\n                </androidx.constraintlayout.widget.ConstraintLayout>\n\n            </androidx.cardview.widget.CardView>\n\n        </LinearLayout>\n\n    </androidx.constraintlayout.widget.ConstraintLayout>\n\n</androidx.core.widget.NestedScrollView>"
  },
  {
    "path": "app/src/main/res/layout/fragment_stats.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    android:orientation=\"vertical\"\n    tools:context=\".stats.StatsFragment\">\n\n    <com.google.android.material.tabs.TabLayout\n        android:id=\"@+id/tab_layout\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\" />\n\n    <androidx.viewpager2.widget.ViewPager2\n        android:id=\"@+id/pager\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\" />\n\n</LinearLayout>"
  },
  {
    "path": "app/src/main/res/layout/fragment_stats_chart.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    android:orientation=\"vertical\"\n    tools:context=\".stats.presentation.StatsChartFragment\"\n    tools:layout_margin=\"24dp\">\n\n    <androidx.viewpager2.widget.ViewPager2\n        android:id=\"@+id/view_pager_chart\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"200dp\"\n        android:layoutDirection=\"rtl\"\n        tools:background=\"?attr/colorPrimaryContainer\" />\n\n    <androidx.constraintlayout.widget.ConstraintLayout\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginTop=\"24dp\"\n        android:minHeight=\"48dp\">\n\n        <ImageButton\n            android:id=\"@+id/button_previous_day\"\n            android:layout_width=\"48dp\"\n            android:layout_height=\"48dp\"\n            android:background=\"@null\"\n            android:clickable=\"true\"\n            android:contentDescription=\"@string/previous_day\"\n            android:focusable=\"true\"\n            android:src=\"@drawable/chevron_left_fill0_wght400_grad0_opsz24\"\n            app:layout_constraintBottom_toBottomOf=\"parent\"\n            app:layout_constraintStart_toStartOf=\"parent\"\n            app:layout_constraintTop_toTopOf=\"parent\"\n            app:tint=\"?attr/colorOnBackground\" />\n\n        <TextView\n            android:id=\"@+id/text_selected_date\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:textAppearance=\"?attr/textAppearanceLabelLarge\"\n            android:textColor=\"?attr/colorOnBackground\"\n            app:layout_constraintBottom_toBottomOf=\"parent\"\n            app:layout_constraintEnd_toEndOf=\"parent\"\n            app:layout_constraintStart_toStartOf=\"parent\"\n            app:layout_constraintTop_toTopOf=\"parent\"\n            tools:text=\"Fri, 12 Jun\" />\n\n        <ImageButton\n            android:id=\"@+id/button_next_day\"\n            android:layout_width=\"48dp\"\n            android:layout_height=\"48dp\"\n            android:background=\"@null\"\n            android:clickable=\"true\"\n            android:contentDescription=\"@string/next_day\"\n            android:focusable=\"true\"\n            android:src=\"@drawable/chevron_right_fill0_wght400_grad0_opsz24\"\n            app:layout_constraintBottom_toBottomOf=\"parent\"\n            app:layout_constraintEnd_toEndOf=\"parent\"\n            app:layout_constraintTop_toTopOf=\"parent\"\n            app:tint=\"?attr/colorOnBackground\" />\n\n    </androidx.constraintlayout.widget.ConstraintLayout>\n\n</LinearLayout>"
  },
  {
    "path": "app/src/main/res/layout/fragment_stats_details.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<androidx.core.widget.NestedScrollView xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    android:clipToPadding=\"false\"\n    android:padding=\"24dp\"\n    tools:context=\".stats.presentation.StatsDetailsFragment\">\n\n    <LinearLayout\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:orientation=\"vertical\">\n\n        <androidx.fragment.app.FragmentContainerView\n            android:id=\"@+id/fragment_chart\"\n            android:name=\"pl.bartek537.forest.stats.presentation.StatsChartFragment\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            tools:layout=\"@layout/fragment_stats_chart\" />\n\n        <androidx.cardview.widget.CardView\n            style=\"@style/Widget.Material3.CardView.Filled\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:layout_marginTop=\"36dp\"\n            app:cardBackgroundColor=\"?attr/colorSecondaryContainer\"\n            app:cardCornerRadius=\"24dp\">\n\n            <LinearLayout\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:divider=\"@drawable/shape_divider\"\n                android:orientation=\"vertical\"\n                android:showDividers=\"middle\">\n\n                <androidx.constraintlayout.widget.ConstraintLayout\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"wrap_content\"\n                    android:orientation=\"vertical\"\n                    android:paddingHorizontal=\"16dp\"\n                    android:paddingVertical=\"18dp\">\n\n                    <View\n                        android:id=\"@+id/view_step_background\"\n                        android:layout_width=\"48dp\"\n                        android:layout_height=\"48dp\"\n                        android:background=\"@drawable/shape_circle\"\n                        android:backgroundTint=\"?attr/colorSecondary\"\n                        app:layout_constraintBottom_toBottomOf=\"parent\"\n                        app:layout_constraintStart_toStartOf=\"parent\"\n                        app:layout_constraintTop_toTopOf=\"parent\" />\n\n                    <ImageView\n                        android:layout_width=\"wrap_content\"\n                        android:layout_height=\"wrap_content\"\n                        android:importantForAccessibility=\"no\"\n                        app:layout_constraintBottom_toBottomOf=\"@+id/view_step_background\"\n                        app:layout_constraintEnd_toEndOf=\"@+id/view_step_background\"\n                        app:layout_constraintStart_toStartOf=\"@+id/view_step_background\"\n                        app:layout_constraintTop_toTopOf=\"@+id/view_step_background\"\n                        app:srcCompat=\"@drawable/steps_fill0_wght400_grad0_opsz24\"\n                        app:tint=\"?attr/colorOnSecondary\" />\n\n                    <TextView\n                        android:id=\"@+id/text_step_count\"\n                        android:layout_width=\"wrap_content\"\n                        android:layout_height=\"wrap_content\"\n                        android:layout_marginStart=\"16dp\"\n                        android:layout_marginBottom=\"2dp\"\n                        android:textAppearance=\"?attr/textAppearanceTitleMedium\"\n                        app:layout_constraintBottom_toTopOf=\"@+id/text_step_count_label\"\n                        app:layout_constraintStart_toEndOf=\"@+id/view_step_background\"\n                        app:layout_constraintTop_toTopOf=\"@+id/view_step_background\"\n                        app:layout_constraintVertical_chainStyle=\"packed\"\n                        tools:text=\"6500 steps\" />\n\n                    <TextView\n                        android:id=\"@+id/text_step_count_label\"\n                        android:layout_width=\"wrap_content\"\n                        android:layout_height=\"wrap_content\"\n                        android:text=\"@string/step_count\"\n                        android:textAppearance=\"?attr/textAppearanceBodyMedium\"\n                        app:layout_constraintBottom_toBottomOf=\"@+id/view_step_background\"\n                        app:layout_constraintStart_toStartOf=\"@+id/text_step_count\"\n                        app:layout_constraintTop_toBottomOf=\"@+id/text_step_count\"\n                        app:layout_constraintVertical_chainStyle=\"packed\" />\n\n                </androidx.constraintlayout.widget.ConstraintLayout>\n\n                <androidx.constraintlayout.widget.ConstraintLayout\n                    android:id=\"@+id/view_group_tree\"\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"wrap_content\"\n                    android:orientation=\"vertical\"\n                    android:paddingHorizontal=\"16dp\"\n                    android:paddingVertical=\"18dp\">\n\n                    <View\n                        android:id=\"@+id/view_tree_background\"\n                        android:layout_width=\"48dp\"\n                        android:layout_height=\"48dp\"\n                        android:background=\"@drawable/shape_circle\"\n                        android:backgroundTint=\"?attr/colorSecondary\"\n                        app:layout_constraintBottom_toBottomOf=\"parent\"\n                        app:layout_constraintStart_toStartOf=\"parent\"\n                        app:layout_constraintTop_toTopOf=\"parent\" />\n\n                    <ImageView\n                        android:layout_width=\"wrap_content\"\n                        android:layout_height=\"wrap_content\"\n                        android:importantForAccessibility=\"no\"\n                        app:layout_constraintBottom_toBottomOf=\"@+id/view_tree_background\"\n                        app:layout_constraintEnd_toEndOf=\"@+id/view_tree_background\"\n                        app:layout_constraintStart_toStartOf=\"@+id/view_tree_background\"\n                        app:layout_constraintTop_toTopOf=\"@+id/view_tree_background\"\n                        app:srcCompat=\"@drawable/nature_fill0_wght400_grad0_opsz24\"\n                        app:tint=\"?attr/colorOnSecondary\" />\n\n                    <TextView\n                        android:id=\"@+id/text_tree_collected\"\n                        android:layout_width=\"wrap_content\"\n                        android:layout_height=\"wrap_content\"\n                        android:layout_marginStart=\"16dp\"\n                        android:layout_marginBottom=\"2dp\"\n                        android:text=\"@string/tree_collected\"\n                        android:textAppearance=\"?attr/textAppearanceTitleMedium\"\n                        app:layout_constraintBottom_toTopOf=\"@+id/text_tree_collected_label\"\n                        app:layout_constraintStart_toEndOf=\"@+id/view_tree_background\"\n                        app:layout_constraintTop_toTopOf=\"@+id/view_tree_background\"\n                        app:layout_constraintVertical_chainStyle=\"packed\" />\n\n                    <TextView\n                        android:id=\"@+id/text_tree_collected_label\"\n                        android:layout_width=\"wrap_content\"\n                        android:layout_height=\"wrap_content\"\n                        android:text=\"@string/daily_goal_reached\"\n                        android:textAppearance=\"?attr/textAppearanceBodyMedium\"\n                        app:layout_constraintBottom_toBottomOf=\"@+id/view_tree_background\"\n                        app:layout_constraintStart_toStartOf=\"@+id/text_tree_collected\"\n                        app:layout_constraintTop_toBottomOf=\"@+id/text_tree_collected\"\n                        app:layout_constraintVertical_chainStyle=\"packed\" />\n\n                </androidx.constraintlayout.widget.ConstraintLayout>\n\n            </LinearLayout>\n\n        </androidx.cardview.widget.CardView>\n\n        <androidx.cardview.widget.CardView\n            style=\"@style/Widget.Material3.CardView.Filled\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:layout_marginTop=\"12dp\"\n            app:cardBackgroundColor=\"?attr/colorTertiaryContainer\"\n            app:cardCornerRadius=\"24dp\">\n\n            <androidx.constraintlayout.widget.ConstraintLayout\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:orientation=\"vertical\"\n                android:paddingHorizontal=\"16dp\"\n                android:paddingVertical=\"18dp\">\n\n                <View\n                    android:id=\"@+id/view_calorie_background\"\n                    android:layout_width=\"48dp\"\n                    android:layout_height=\"48dp\"\n                    android:background=\"@drawable/shape_circle\"\n                    android:backgroundTint=\"?attr/colorTertiary\"\n                    app:layout_constraintBottom_toBottomOf=\"parent\"\n                    app:layout_constraintStart_toStartOf=\"parent\"\n                    app:layout_constraintTop_toTopOf=\"parent\" />\n\n                <ImageView\n                    android:layout_width=\"wrap_content\"\n                    android:layout_height=\"wrap_content\"\n                    android:importantForAccessibility=\"no\"\n                    app:layout_constraintBottom_toBottomOf=\"@+id/view_calorie_background\"\n                    app:layout_constraintEnd_toEndOf=\"@+id/view_calorie_background\"\n                    app:layout_constraintStart_toStartOf=\"@+id/view_calorie_background\"\n                    app:layout_constraintTop_toTopOf=\"@+id/view_calorie_background\"\n                    app:srcCompat=\"@drawable/local_fire_department_fill0_wght400_grad0_opsz24\"\n                    app:tint=\"?attr/colorOnTertiary\" />\n\n                <TextView\n                    android:id=\"@+id/text_calorie_burned\"\n                    android:layout_width=\"wrap_content\"\n                    android:layout_height=\"wrap_content\"\n                    android:layout_marginStart=\"16dp\"\n                    android:layout_marginBottom=\"2dp\"\n                    android:textAppearance=\"?attr/textAppearanceTitleMedium\"\n                    app:layout_constraintBottom_toTopOf=\"@+id/text_calorie_burned_label\"\n                    app:layout_constraintStart_toEndOf=\"@+id/view_calorie_background\"\n                    app:layout_constraintTop_toTopOf=\"@+id/view_calorie_background\"\n                    app:layout_constraintVertical_chainStyle=\"packed\"\n                    tools:text=\"210 kcal\" />\n\n                <TextView\n                    android:id=\"@+id/text_calorie_burned_label\"\n                    android:layout_width=\"wrap_content\"\n                    android:layout_height=\"wrap_content\"\n                    android:text=\"@string/calorie_burned\"\n                    android:textAppearance=\"?attr/textAppearanceBodyMedium\"\n                    app:layout_constraintBottom_toBottomOf=\"@+id/view_calorie_background\"\n                    app:layout_constraintStart_toStartOf=\"@+id/text_calorie_burned\"\n                    app:layout_constraintTop_toBottomOf=\"@+id/text_calorie_burned\"\n                    app:layout_constraintVertical_chainStyle=\"packed\" />\n\n            </androidx.constraintlayout.widget.ConstraintLayout>\n\n        </androidx.cardview.widget.CardView>\n\n        <androidx.cardview.widget.CardView\n            style=\"@style/Widget.Material3.CardView.Filled\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:layout_marginTop=\"12dp\"\n            app:cardBackgroundColor=\"?attr/colorPrimaryContainer\"\n            app:cardCornerRadius=\"24dp\">\n\n            <androidx.constraintlayout.widget.ConstraintLayout\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:orientation=\"vertical\"\n                android:paddingHorizontal=\"16dp\"\n                android:paddingVertical=\"18dp\">\n\n                <View\n                    android:id=\"@+id/view_distance_background\"\n                    android:layout_width=\"48dp\"\n                    android:layout_height=\"48dp\"\n                    android:background=\"@drawable/shape_circle\"\n                    android:backgroundTint=\"?attr/colorPrimary\"\n                    app:layout_constraintBottom_toBottomOf=\"parent\"\n                    app:layout_constraintStart_toStartOf=\"parent\"\n                    app:layout_constraintTop_toTopOf=\"parent\" />\n\n                <ImageView\n                    android:layout_width=\"wrap_content\"\n                    android:layout_height=\"wrap_content\"\n                    android:importantForAccessibility=\"no\"\n                    app:layout_constraintBottom_toBottomOf=\"@+id/view_distance_background\"\n                    app:layout_constraintEnd_toEndOf=\"@+id/view_distance_background\"\n                    app:layout_constraintStart_toStartOf=\"@+id/view_distance_background\"\n                    app:layout_constraintTop_toTopOf=\"@+id/view_distance_background\"\n                    app:srcCompat=\"@drawable/conversion_path_fill0_wght400_grad0_opsz24\"\n                    app:tint=\"?attr/colorOnPrimary\" />\n\n                <TextView\n                    android:id=\"@+id/text_distance_travelled\"\n                    android:layout_width=\"wrap_content\"\n                    android:layout_height=\"wrap_content\"\n                    android:layout_marginStart=\"16dp\"\n                    android:layout_marginBottom=\"2dp\"\n                    android:textAppearance=\"?attr/textAppearanceTitleMedium\"\n                    app:layout_constraintBottom_toTopOf=\"@+id/text_distance_travelled_label\"\n                    app:layout_constraintStart_toEndOf=\"@+id/view_distance_background\"\n                    app:layout_constraintTop_toTopOf=\"@+id/view_distance_background\"\n                    app:layout_constraintVertical_chainStyle=\"packed\"\n                    tools:text=\"4.1 km\" />\n\n                <TextView\n                    android:id=\"@+id/text_distance_travelled_label\"\n                    android:layout_width=\"wrap_content\"\n                    android:layout_height=\"wrap_content\"\n                    android:text=\"@string/distance_travelled\"\n                    android:textAppearance=\"?attr/textAppearanceBodyMedium\"\n                    app:layout_constraintBottom_toBottomOf=\"@+id/view_distance_background\"\n                    app:layout_constraintStart_toStartOf=\"@+id/text_distance_travelled\"\n                    app:layout_constraintTop_toBottomOf=\"@+id/text_distance_travelled\"\n                    app:layout_constraintVertical_chainStyle=\"packed\" />\n\n            </androidx.constraintlayout.widget.ConstraintLayout>\n\n        </androidx.cardview.widget.CardView>\n\n        <androidx.cardview.widget.CardView\n            style=\"@style/Widget.Material3.CardView.Filled\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:layout_marginTop=\"12dp\"\n            app:cardBackgroundColor=\"?attr/colorSecondaryContainer\"\n            app:cardCornerRadius=\"24dp\">\n\n            <androidx.constraintlayout.widget.ConstraintLayout\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:orientation=\"vertical\"\n                android:paddingHorizontal=\"16dp\"\n                android:paddingVertical=\"18dp\">\n\n                <View\n                    android:id=\"@+id/view_carbon_dioxide_background\"\n                    android:layout_width=\"48dp\"\n                    android:layout_height=\"48dp\"\n                    android:background=\"@drawable/shape_circle\"\n                    android:backgroundTint=\"?attr/colorSecondary\"\n                    app:layout_constraintBottom_toBottomOf=\"parent\"\n                    app:layout_constraintStart_toStartOf=\"parent\"\n                    app:layout_constraintTop_toTopOf=\"parent\" />\n\n                <ImageView\n                    android:layout_width=\"wrap_content\"\n                    android:layout_height=\"wrap_content\"\n                    android:importantForAccessibility=\"no\"\n                    app:layout_constraintBottom_toBottomOf=\"@+id/view_carbon_dioxide_background\"\n                    app:layout_constraintEnd_toEndOf=\"@+id/view_carbon_dioxide_background\"\n                    app:layout_constraintStart_toStartOf=\"@+id/view_carbon_dioxide_background\"\n                    app:layout_constraintTop_toTopOf=\"@+id/view_carbon_dioxide_background\"\n                    app:srcCompat=\"@drawable/bubble_chart_fill0_wght400_grad0_opsz24\"\n                    app:tint=\"?attr/colorOnSecondary\" />\n\n                <TextView\n                    android:id=\"@+id/text_carbon_dioxide_saved\"\n                    android:layout_width=\"wrap_content\"\n                    android:layout_height=\"wrap_content\"\n                    android:layout_marginStart=\"16dp\"\n                    android:layout_marginBottom=\"2dp\"\n                    android:textAppearance=\"?attr/textAppearanceTitleMedium\"\n                    app:layout_constraintBottom_toTopOf=\"@+id/text_carbon_dioxide_saved_label\"\n                    app:layout_constraintStart_toEndOf=\"@+id/view_carbon_dioxide_background\"\n                    app:layout_constraintTop_toTopOf=\"@+id/view_carbon_dioxide_background\"\n                    app:layout_constraintVertical_chainStyle=\"packed\"\n                    tools:text=\"1.43 kg\" />\n\n                <TextView\n                    android:id=\"@+id/text_carbon_dioxide_saved_label\"\n                    android:layout_width=\"wrap_content\"\n                    android:layout_height=\"wrap_content\"\n                    android:text=\"@string/carbon_dioxide_saved\"\n                    android:textAppearance=\"?attr/textAppearanceBodyMedium\"\n                    app:layout_constraintBottom_toBottomOf=\"@+id/view_carbon_dioxide_background\"\n                    app:layout_constraintStart_toStartOf=\"@+id/text_carbon_dioxide_saved\"\n                    app:layout_constraintTop_toBottomOf=\"@+id/text_carbon_dioxide_saved\"\n                    app:layout_constraintVertical_chainStyle=\"packed\" />\n\n            </androidx.constraintlayout.widget.ConstraintLayout>\n\n        </androidx.cardview.widget.CardView>\n\n    </LinearLayout>\n\n</androidx.core.widget.NestedScrollView>"
  },
  {
    "path": "app/src/main/res/layout/fragment_stats_page_chart.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<FrameLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    android:layoutDirection=\"locale\"\n    tools:context=\".stats.presentation.StatsChartPageFragment\"\n    tools:layout_height=\"200dp\">\n\n    <androidx.recyclerview.widget.RecyclerView\n        android:id=\"@+id/recycler_view_chart\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        android:orientation=\"vertical\"\n        android:overScrollMode=\"never\"\n        android:paddingHorizontal=\"8dp\"\n        app:layoutManager=\"androidx.recyclerview.widget.GridLayoutManager\"\n        app:spanCount=\"7\"\n        tools:listitem=\"@layout/item_chart_bar\" />\n\n</FrameLayout>"
  },
  {
    "path": "app/src/main/res/layout/fragment_stats_summary.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<androidx.swiperefreshlayout.widget.SwipeRefreshLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:id=\"@+id/swipe_refresh_container\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    tools:context=\".stats.presentation.StatsSummaryFragment\">\n\n    <androidx.core.widget.NestedScrollView\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\">\n\n        <LinearLayout\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:orientation=\"vertical\"\n            android:padding=\"24dp\">\n\n            <androidx.cardview.widget.CardView\n                style=\"@style/Widget.Material3.CardView.Filled\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:layout_marginTop=\"12dp\"\n                app:cardBackgroundColor=\"?attr/colorPrimaryContainer\"\n                app:cardCornerRadius=\"24dp\">\n\n                <androidx.constraintlayout.widget.ConstraintLayout\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"wrap_content\"\n                    android:orientation=\"vertical\"\n                    android:paddingHorizontal=\"16dp\"\n                    android:paddingVertical=\"18dp\">\n\n                    <View\n                        android:id=\"@+id/view_tree_background\"\n                        android:layout_width=\"48dp\"\n                        android:layout_height=\"48dp\"\n                        android:background=\"@drawable/shape_circle\"\n                        android:backgroundTint=\"?attr/colorPrimary\"\n                        app:layout_constraintBottom_toBottomOf=\"parent\"\n                        app:layout_constraintStart_toStartOf=\"parent\"\n                        app:layout_constraintTop_toTopOf=\"parent\" />\n\n                    <ImageView\n                        android:layout_width=\"wrap_content\"\n                        android:layout_height=\"wrap_content\"\n                        android:importantForAccessibility=\"no\"\n                        app:layout_constraintBottom_toBottomOf=\"@+id/view_tree_background\"\n                        app:layout_constraintEnd_toEndOf=\"@+id/view_tree_background\"\n                        app:layout_constraintStart_toStartOf=\"@+id/view_tree_background\"\n                        app:layout_constraintTop_toTopOf=\"@+id/view_tree_background\"\n                        app:srcCompat=\"@drawable/nature_fill0_wght400_grad0_opsz24\"\n                        app:tint=\"?attr/colorOnPrimary\" />\n\n                    <TextView\n                        android:id=\"@+id/text_trees_collected\"\n                        android:layout_width=\"wrap_content\"\n                        android:layout_height=\"wrap_content\"\n                        android:layout_marginStart=\"16dp\"\n                        android:layout_marginBottom=\"2dp\"\n                        android:textAppearance=\"?attr/textAppearanceTitleMedium\"\n                        app:layout_constraintBottom_toTopOf=\"@+id/text_trees_collected_label\"\n                        app:layout_constraintStart_toEndOf=\"@+id/view_tree_background\"\n                        app:layout_constraintTop_toTopOf=\"@+id/view_tree_background\"\n                        app:layout_constraintVertical_chainStyle=\"packed\"\n                        tools:text=\"23 trees\" />\n\n                    <TextView\n                        android:id=\"@+id/text_trees_collected_label\"\n                        android:layout_width=\"wrap_content\"\n                        android:layout_height=\"wrap_content\"\n                        android:text=\"@string/trees_collected\"\n                        android:textAppearance=\"?attr/textAppearanceBodyMedium\"\n                        app:layout_constraintBottom_toBottomOf=\"@+id/view_tree_background\"\n                        app:layout_constraintStart_toStartOf=\"@+id/text_trees_collected\"\n                        app:layout_constraintTop_toBottomOf=\"@+id/text_trees_collected\"\n                        app:layout_constraintVertical_chainStyle=\"packed\" />\n\n                </androidx.constraintlayout.widget.ConstraintLayout>\n\n            </androidx.cardview.widget.CardView>\n\n            <androidx.cardview.widget.CardView\n                style=\"@style/Widget.Material3.CardView.Filled\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:layout_marginTop=\"12dp\"\n                app:cardBackgroundColor=\"?attr/colorSecondaryContainer\"\n                app:cardCornerRadius=\"24dp\">\n\n                <androidx.constraintlayout.widget.ConstraintLayout\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"wrap_content\"\n                    android:orientation=\"vertical\"\n                    android:paddingHorizontal=\"16dp\"\n                    android:paddingVertical=\"18dp\">\n\n                    <View\n                        android:id=\"@+id/view_steps_background\"\n                        android:layout_width=\"48dp\"\n                        android:layout_height=\"48dp\"\n                        android:background=\"@drawable/shape_circle\"\n                        android:backgroundTint=\"?attr/colorSecondary\"\n                        app:layout_constraintBottom_toBottomOf=\"parent\"\n                        app:layout_constraintStart_toStartOf=\"parent\"\n                        app:layout_constraintTop_toTopOf=\"parent\" />\n\n                    <ImageView\n                        android:layout_width=\"wrap_content\"\n                        android:layout_height=\"wrap_content\"\n                        android:importantForAccessibility=\"no\"\n                        app:layout_constraintBottom_toBottomOf=\"@+id/view_steps_background\"\n                        app:layout_constraintEnd_toEndOf=\"@+id/view_steps_background\"\n                        app:layout_constraintStart_toStartOf=\"@+id/view_steps_background\"\n                        app:layout_constraintTop_toTopOf=\"@+id/view_steps_background\"\n                        app:srcCompat=\"@drawable/steps_fill0_wght400_grad0_opsz24\"\n                        app:tint=\"?attr/colorOnSecondary\" />\n\n                    <TextView\n                        android:id=\"@+id/text_step_count\"\n                        android:layout_width=\"wrap_content\"\n                        android:layout_height=\"wrap_content\"\n                        android:layout_marginStart=\"16dp\"\n                        android:layout_marginBottom=\"2dp\"\n                        android:textAppearance=\"?attr/textAppearanceTitleMedium\"\n                        app:layout_constraintBottom_toTopOf=\"@+id/text_step_count_label\"\n                        app:layout_constraintStart_toEndOf=\"@+id/view_steps_background\"\n                        app:layout_constraintTop_toTopOf=\"@+id/view_steps_background\"\n                        app:layout_constraintVertical_chainStyle=\"packed\"\n                        tools:text=\"6500 steps\" />\n\n                    <TextView\n                        android:id=\"@+id/text_step_count_label\"\n                        android:layout_width=\"wrap_content\"\n                        android:layout_height=\"wrap_content\"\n                        android:text=\"@string/step_count\"\n                        android:textAppearance=\"?attr/textAppearanceBodyMedium\"\n                        app:layout_constraintBottom_toBottomOf=\"@+id/view_steps_background\"\n                        app:layout_constraintStart_toStartOf=\"@+id/text_step_count\"\n                        app:layout_constraintTop_toBottomOf=\"@+id/text_step_count\"\n                        app:layout_constraintVertical_chainStyle=\"packed\" />\n\n                </androidx.constraintlayout.widget.ConstraintLayout>\n\n            </androidx.cardview.widget.CardView>\n\n            <androidx.cardview.widget.CardView\n                style=\"@style/Widget.Material3.CardView.Filled\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:layout_marginTop=\"12dp\"\n                app:cardBackgroundColor=\"?attr/colorTertiaryContainer\"\n                app:cardCornerRadius=\"24dp\">\n\n                <androidx.constraintlayout.widget.ConstraintLayout\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"wrap_content\"\n                    android:orientation=\"vertical\"\n                    android:paddingHorizontal=\"16dp\"\n                    android:paddingVertical=\"18dp\">\n\n                    <View\n                        android:id=\"@+id/view_calorie_background\"\n                        android:layout_width=\"48dp\"\n                        android:layout_height=\"48dp\"\n                        android:background=\"@drawable/shape_circle\"\n                        android:backgroundTint=\"?attr/colorTertiary\"\n                        app:layout_constraintBottom_toBottomOf=\"parent\"\n                        app:layout_constraintStart_toStartOf=\"parent\"\n                        app:layout_constraintTop_toTopOf=\"parent\" />\n\n                    <ImageView\n                        android:layout_width=\"wrap_content\"\n                        android:layout_height=\"wrap_content\"\n                        android:importantForAccessibility=\"no\"\n                        app:layout_constraintBottom_toBottomOf=\"@+id/view_calorie_background\"\n                        app:layout_constraintEnd_toEndOf=\"@+id/view_calorie_background\"\n                        app:layout_constraintStart_toStartOf=\"@+id/view_calorie_background\"\n                        app:layout_constraintTop_toTopOf=\"@+id/view_calorie_background\"\n                        app:srcCompat=\"@drawable/local_fire_department_fill0_wght400_grad0_opsz24\"\n                        app:tint=\"?attr/colorOnTertiary\" />\n\n                    <TextView\n                        android:id=\"@+id/text_calorie_burned\"\n                        android:layout_width=\"wrap_content\"\n                        android:layout_height=\"wrap_content\"\n                        android:layout_marginStart=\"16dp\"\n                        android:layout_marginBottom=\"2dp\"\n                        android:textAppearance=\"?attr/textAppearanceTitleMedium\"\n                        app:layout_constraintBottom_toTopOf=\"@+id/text_calorie_burned_label\"\n                        app:layout_constraintStart_toEndOf=\"@+id/view_calorie_background\"\n                        app:layout_constraintTop_toTopOf=\"@+id/view_calorie_background\"\n                        app:layout_constraintVertical_chainStyle=\"packed\"\n                        tools:text=\"210 kcal\" />\n\n                    <TextView\n                        android:id=\"@+id/text_calorie_burned_label\"\n                        android:layout_width=\"wrap_content\"\n                        android:layout_height=\"wrap_content\"\n                        android:text=\"@string/calorie_burned\"\n                        android:textAppearance=\"?attr/textAppearanceBodyMedium\"\n                        app:layout_constraintBottom_toBottomOf=\"@+id/view_calorie_background\"\n                        app:layout_constraintStart_toStartOf=\"@+id/text_calorie_burned\"\n                        app:layout_constraintTop_toBottomOf=\"@+id/text_calorie_burned\"\n                        app:layout_constraintVertical_chainStyle=\"packed\" />\n\n                </androidx.constraintlayout.widget.ConstraintLayout>\n\n            </androidx.cardview.widget.CardView>\n\n            <androidx.cardview.widget.CardView\n                style=\"@style/Widget.Material3.CardView.Filled\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:layout_marginTop=\"12dp\"\n                app:cardBackgroundColor=\"?attr/colorPrimaryContainer\"\n                app:cardCornerRadius=\"24dp\">\n\n                <androidx.constraintlayout.widget.ConstraintLayout\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"wrap_content\"\n                    android:orientation=\"vertical\"\n                    android:paddingHorizontal=\"16dp\"\n                    android:paddingVertical=\"18dp\">\n\n                    <View\n                        android:id=\"@+id/view_distance_background\"\n                        android:layout_width=\"48dp\"\n                        android:layout_height=\"48dp\"\n                        android:background=\"@drawable/shape_circle\"\n                        android:backgroundTint=\"?attr/colorPrimary\"\n                        app:layout_constraintBottom_toBottomOf=\"parent\"\n                        app:layout_constraintStart_toStartOf=\"parent\"\n                        app:layout_constraintTop_toTopOf=\"parent\" />\n\n                    <ImageView\n                        android:layout_width=\"wrap_content\"\n                        android:layout_height=\"wrap_content\"\n                        android:importantForAccessibility=\"no\"\n                        app:layout_constraintBottom_toBottomOf=\"@+id/view_distance_background\"\n                        app:layout_constraintEnd_toEndOf=\"@+id/view_distance_background\"\n                        app:layout_constraintStart_toStartOf=\"@+id/view_distance_background\"\n                        app:layout_constraintTop_toTopOf=\"@+id/view_distance_background\"\n                        app:srcCompat=\"@drawable/conversion_path_fill0_wght400_grad0_opsz24\"\n                        app:tint=\"?attr/colorOnPrimary\" />\n\n                    <TextView\n                        android:id=\"@+id/text_distance_travelled\"\n                        android:layout_width=\"wrap_content\"\n                        android:layout_height=\"wrap_content\"\n                        android:layout_marginStart=\"16dp\"\n                        android:layout_marginBottom=\"2dp\"\n                        android:textAppearance=\"?attr/textAppearanceTitleMedium\"\n                        app:layout_constraintBottom_toTopOf=\"@+id/text_distance_travelled_label\"\n                        app:layout_constraintStart_toEndOf=\"@+id/view_distance_background\"\n                        app:layout_constraintTop_toTopOf=\"@+id/view_distance_background\"\n                        app:layout_constraintVertical_chainStyle=\"packed\"\n                        tools:text=\"4.1 km\" />\n\n                    <TextView\n                        android:id=\"@+id/text_distance_travelled_label\"\n                        android:layout_width=\"wrap_content\"\n                        android:layout_height=\"wrap_content\"\n                        android:text=\"@string/distance_travelled\"\n                        android:textAppearance=\"?attr/textAppearanceBodyMedium\"\n                        app:layout_constraintBottom_toBottomOf=\"@+id/view_distance_background\"\n                        app:layout_constraintStart_toStartOf=\"@+id/text_distance_travelled\"\n                        app:layout_constraintTop_toBottomOf=\"@+id/text_distance_travelled\"\n                        app:layout_constraintVertical_chainStyle=\"packed\" />\n\n                </androidx.constraintlayout.widget.ConstraintLayout>\n\n            </androidx.cardview.widget.CardView>\n\n            <androidx.cardview.widget.CardView\n                style=\"@style/Widget.Material3.CardView.Filled\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:layout_marginTop=\"12dp\"\n                app:cardBackgroundColor=\"?attr/colorSecondaryContainer\"\n                app:cardCornerRadius=\"24dp\">\n\n                <androidx.constraintlayout.widget.ConstraintLayout\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"wrap_content\"\n                    android:orientation=\"vertical\"\n                    android:paddingHorizontal=\"16dp\"\n                    android:paddingVertical=\"18dp\">\n\n                    <View\n                        android:id=\"@+id/view_carbon_dioxide_background\"\n                        android:layout_width=\"48dp\"\n                        android:layout_height=\"48dp\"\n                        android:background=\"@drawable/shape_circle\"\n                        android:backgroundTint=\"?attr/colorSecondary\"\n                        app:layout_constraintBottom_toBottomOf=\"parent\"\n                        app:layout_constraintStart_toStartOf=\"parent\"\n                        app:layout_constraintTop_toTopOf=\"parent\" />\n\n                    <ImageView\n                        android:layout_width=\"wrap_content\"\n                        android:layout_height=\"wrap_content\"\n                        android:importantForAccessibility=\"no\"\n                        app:layout_constraintBottom_toBottomOf=\"@+id/view_carbon_dioxide_background\"\n                        app:layout_constraintEnd_toEndOf=\"@+id/view_carbon_dioxide_background\"\n                        app:layout_constraintStart_toStartOf=\"@+id/view_carbon_dioxide_background\"\n                        app:layout_constraintTop_toTopOf=\"@+id/view_carbon_dioxide_background\"\n                        app:srcCompat=\"@drawable/bubble_chart_fill0_wght400_grad0_opsz24\"\n                        app:tint=\"?attr/colorOnSecondary\" />\n\n                    <TextView\n                        android:id=\"@+id/text_carbon_dioxide_saved\"\n                        android:layout_width=\"wrap_content\"\n                        android:layout_height=\"wrap_content\"\n                        android:layout_marginStart=\"16dp\"\n                        android:layout_marginBottom=\"2dp\"\n                        android:textAppearance=\"?attr/textAppearanceTitleMedium\"\n                        app:layout_constraintBottom_toTopOf=\"@+id/text_carbon_dioxide_saved_label\"\n                        app:layout_constraintStart_toEndOf=\"@+id/view_carbon_dioxide_background\"\n                        app:layout_constraintTop_toTopOf=\"@+id/view_carbon_dioxide_background\"\n                        app:layout_constraintVertical_chainStyle=\"packed\"\n                        tools:text=\"1.43 kg\" />\n\n                    <TextView\n                        android:id=\"@+id/text_carbon_dioxide_saved_label\"\n                        android:layout_width=\"wrap_content\"\n                        android:layout_height=\"wrap_content\"\n                        android:text=\"@string/carbon_dioxide_saved\"\n                        android:textAppearance=\"?attr/textAppearanceBodyMedium\"\n                        app:layout_constraintBottom_toBottomOf=\"@+id/view_carbon_dioxide_background\"\n                        app:layout_constraintStart_toStartOf=\"@+id/text_carbon_dioxide_saved\"\n                        app:layout_constraintTop_toBottomOf=\"@+id/text_carbon_dioxide_saved\"\n                        app:layout_constraintVertical_chainStyle=\"packed\" />\n\n                </androidx.constraintlayout.widget.ConstraintLayout>\n\n            </androidx.cardview.widget.CardView>\n\n        </LinearLayout>\n\n    </androidx.core.widget.NestedScrollView>\n\n</androidx.swiperefreshlayout.widget.SwipeRefreshLayout>"
  },
  {
    "path": "app/src/main/res/layout/item_chart_bar.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    android:clickable=\"true\"\n    android:focusable=\"true\"\n    android:orientation=\"vertical\"\n    android:paddingHorizontal=\"6dp\"\n    tools:layout_height=\"161dp\"\n    tools:layout_width=\"50dp\">\n\n    <androidx.constraintlayout.widget.ConstraintLayout\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"0dp\"\n        android:layout_weight=\"1\">\n\n        <View\n            android:id=\"@+id/bar_filled\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"0dp\"\n            android:background=\"@drawable/shape_chart_bar\"\n            app:layout_constraintBottom_toBottomOf=\"parent\"\n            app:layout_constraintHeight_percent=\".5\" />\n\n    </androidx.constraintlayout.widget.ConstraintLayout>\n\n    <TextView\n        android:id=\"@+id/text_supporting\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginTop=\"4dp\"\n        android:textAlignment=\"center\"\n        android:textAppearance=\"?attr/textAppearanceLabelSmall\"\n        tools:text=\"Sat\"\n        tools:textColor=\"?attr/colorAccent\" />\n\n</LinearLayout>"
  },
  {
    "path": "app/src/main/res/menu/bottom_navigation_menu.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<menu xmlns:android=\"http://schemas.android.com/apk/res/android\">\n\n    <item\n        android:id=\"@+id/forestFragment\"\n        android:icon=\"@drawable/forest_fill0_wght400_grad0_opsz24\"\n        android:title=\"@string/forest\" />\n\n    <item\n        android:id=\"@+id/progressFragment\"\n        android:icon=\"@drawable/nature_fill0_wght400_grad0_opsz24\"\n        android:title=\"@string/tree\" />\n\n    <item\n        android:id=\"@+id/statsFragment\"\n        android:icon=\"@drawable/show_chart_fill0_wght400_grad0_opsz24\"\n        android:title=\"@string/stats\" />\n\n</menu>"
  },
  {
    "path": "app/src/main/res/menu/main_menu.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<menu xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\">\n\n    <item\n        android:id=\"@+id/settings\"\n        android:title=\"@string/settings\"\n        app:showAsAction=\"never\" />\n\n</menu>"
  },
  {
    "path": "app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<adaptive-icon xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <background android:drawable=\"@color/ic_launcher_background\"/>\n    <foreground android:drawable=\"@drawable/ic_launcher_foreground\"/>\n</adaptive-icon>"
  },
  {
    "path": "app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<adaptive-icon xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <background android:drawable=\"@color/ic_launcher_background\"/>\n    <foreground android:drawable=\"@drawable/ic_launcher_foreground\"/>\n</adaptive-icon>"
  },
  {
    "path": "app/src/main/res/navigation/nav_graph.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<navigation xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:id=\"@+id/nav_graph\"\n    app:startDestination=\"@id/progressFragment\">\n\n    <fragment\n        android:id=\"@+id/settingsFragment\"\n        android:name=\"pl.bartek537.forest.settings.SettingsFragment\"\n        android:label=\"@string/settings\" />\n\n    <fragment\n        android:id=\"@+id/progressFragment\"\n        android:name=\"pl.bartek537.forest.progress.ProgressFragment\"\n        android:label=\"@string/tree\"\n        tools:layout=\"@layout/fragment_progress\" />\n\n    <fragment\n        android:id=\"@+id/statsFragment\"\n        android:name=\"pl.bartek537.forest.stats.StatsFragment\"\n        android:label=\"@string/stats\"\n        tools:layout=\"@layout/fragment_stats\" />\n\n    <fragment\n        android:id=\"@+id/forestFragment\"\n        android:name=\"pl.bartek537.forest.trees.ForestFragment\"\n        android:label=\"@string/forest\"\n        tools:layout=\"@layout/fragment_forest\" />\n\n</navigation>"
  },
  {
    "path": "app/src/main/res/navigation/onboarding_nav_graph.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<navigation xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:id=\"@+id/onboarding_nav_graph\"\n    app:startDestination=\"@id/activityRecognitionPermissionFragment\">\n\n    <fragment\n        android:id=\"@+id/activityRecognitionPermissionFragment\"\n        android:name=\"pl.bartek537.forest.core.presentation.ActivityRecognitionPermissionFragment\"\n        android:label=\"fragment_activity_recognition_permission\"\n        tools:layout=\"@layout/fragment_activity_recognition_permission\">\n        <action\n            android:id=\"@+id/action_activityRecognitionPermissionFragment_to_mainActivity\"\n            app:destination=\"@id/mainActivity\" />\n    </fragment>\n    <activity\n        android:id=\"@+id/mainActivity\"\n        android:name=\"pl.bartek537.forest.core.presentation.MainActivity\"\n        android:label=\"activity_main\"\n        tools:layout=\"@layout/activity_main\" />\n</navigation>"
  },
  {
    "path": "app/src/main/res/values/colors.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <color name=\"seed\">#646106</color>\n    <color name=\"md_theme_light_primary\">#646100</color>\n    <color name=\"md_theme_light_onPrimary\">#FFFFFF</color>\n    <color name=\"md_theme_light_primaryContainer\">#ECE76D</color>\n    <color name=\"md_theme_light_onPrimaryContainer\">#1E1D00</color>\n    <color name=\"md_theme_light_secondary\">#616042</color>\n    <color name=\"md_theme_light_onSecondary\">#FFFFFF</color>\n    <color name=\"md_theme_light_secondaryContainer\">#E8E4BE</color>\n    <color name=\"md_theme_light_onSecondaryContainer\">#1D1C05</color>\n    <color name=\"md_theme_light_tertiary\">#3E6655</color>\n    <color name=\"md_theme_light_onTertiary\">#FFFFFF</color>\n    <color name=\"md_theme_light_tertiaryContainer\">#C0ECD6</color>\n    <color name=\"md_theme_light_onTertiaryContainer\">#002116</color>\n    <color name=\"md_theme_light_error\">#BA1A1A</color>\n    <color name=\"md_theme_light_errorContainer\">#FFDAD6</color>\n    <color name=\"md_theme_light_onError\">#FFFFFF</color>\n    <color name=\"md_theme_light_onErrorContainer\">#410002</color>\n    <color name=\"md_theme_light_background\">#FFFBFF</color>\n    <color name=\"md_theme_light_onBackground\">#1C1C16</color>\n    <color name=\"md_theme_light_surface\">#FFFBFF</color>\n    <color name=\"md_theme_light_onSurface\">#1C1C16</color>\n    <color name=\"md_theme_light_surfaceVariant\">#E7E3D1</color>\n    <color name=\"md_theme_light_onSurfaceVariant\">#49473A</color>\n    <color name=\"md_theme_light_outline\">#7A7768</color>\n    <color name=\"md_theme_light_inverseOnSurface\">#F4F0E7</color>\n    <color name=\"md_theme_light_inverseSurface\">#31302B</color>\n    <color name=\"md_theme_light_inversePrimary\">#D0CB54</color>\n    <color name=\"md_theme_light_shadow\">#000000</color>\n    <color name=\"md_theme_light_surfaceTint\">#646100</color>\n    <color name=\"md_theme_light_outlineVariant\">#CAC7B5</color>\n    <color name=\"md_theme_light_scrim\">#000000</color>\n    <color name=\"md_theme_dark_primary\">#D0CB54</color>\n    <color name=\"md_theme_dark_onPrimary\">#343200</color>\n    <color name=\"md_theme_dark_primaryContainer\">#4B4900</color>\n    <color name=\"md_theme_dark_onPrimaryContainer\">#ECE76D</color>\n    <color name=\"md_theme_dark_secondary\">#CBC8A4</color>\n    <color name=\"md_theme_dark_onSecondary\">#333118</color>\n    <color name=\"md_theme_dark_secondaryContainer\">#49482C</color>\n    <color name=\"md_theme_dark_onSecondaryContainer\">#E8E4BE</color>\n    <color name=\"md_theme_dark_tertiary\">#A5D0BB</color>\n    <color name=\"md_theme_dark_onTertiary\">#0D3729</color>\n    <color name=\"md_theme_dark_tertiaryContainer\">#264E3E</color>\n    <color name=\"md_theme_dark_onTertiaryContainer\">#C0ECD6</color>\n    <color name=\"md_theme_dark_error\">#FFB4AB</color>\n    <color name=\"md_theme_dark_errorContainer\">#93000A</color>\n    <color name=\"md_theme_dark_onError\">#690005</color>\n    <color name=\"md_theme_dark_onErrorContainer\">#FFDAD6</color>\n    <color name=\"md_theme_dark_background\">#1C1C16</color>\n    <color name=\"md_theme_dark_onBackground\">#E6E2D9</color>\n    <color name=\"md_theme_dark_surface\">#1C1C16</color>\n    <color name=\"md_theme_dark_onSurface\">#E6E2D9</color>\n    <color name=\"md_theme_dark_surfaceVariant\">#49473A</color>\n    <color name=\"md_theme_dark_onSurfaceVariant\">#CAC7B5</color>\n    <color name=\"md_theme_dark_outline\">#949181</color>\n    <color name=\"md_theme_dark_inverseOnSurface\">#1C1C16</color>\n    <color name=\"md_theme_dark_inverseSurface\">#E6E2D9</color>\n    <color name=\"md_theme_dark_inversePrimary\">#646100</color>\n    <color name=\"md_theme_dark_shadow\">#000000</color>\n    <color name=\"md_theme_dark_surfaceTint\">#D0CB54</color>\n    <color name=\"md_theme_dark_outlineVariant\">#49473A</color>\n    <color name=\"md_theme_dark_scrim\">#000000</color>\n</resources>"
  },
  {
    "path": "app/src/main/res/values/ic_launcher_background.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <color name=\"ic_launcher_background\">#EDEDE4</color>\n</resources>"
  },
  {
    "path": "app/src/main/res/values/strings.xml",
    "content": "<resources>\n    <string name=\"app_name\">Forest</string>\n    <string name=\"step_counter_channel\">Step counter</string>\n    <plurals name=\"step_count\">\n        <item quantity=\"one\">%d step today</item>\n        <item quantity=\"other\">%d steps today</item>\n    </plurals>\n    <string name=\"step_counter_stats\">%1$d kcal · %2$.2f km · %3$d%% of your daily goal</string>\n    <string name=\"steps\">steps</string>\n    <string name=\"step_goal\">Goal %s</string>\n\n    <!-- Onboarding -->\n    <string name=\"action_continue\">Continue</string>\n    <string name=\"revoke_permission_rationale\">You can revoke this permission in system settings, but keep in mind the app will stop working</string>\n    <string name=\"data_consent\">All your data is stored locally on your device and will not be shared with anyone</string>\n\n    <string name=\"allow_activity_recognition\">Allow activity recognition</string>\n    <string name=\"activity_recognition_rationale\">This permission is required to detect and count the steps you take.</string>\n\n    <!-- Navigation -->\n    <string name=\"forest\">Forest</string>\n    <string name=\"tree\">Tree</string>\n    <string name=\"stats\">Stats</string>\n\n    <!-- Forest -->\n    <plurals name=\"trees\">\n        <item quantity=\"one\">tree</item>\n        <item quantity=\"other\">trees</item>\n    </plurals>\n\n    <!-- Progress -->\n    <string name=\"carbon_dioxide_saved\">Carbon dioxide saved</string>\n    <string name=\"carbon_dioxide_saved_format\">%.3f kg</string>\n    <string name=\"calorie_burned\">Calorie burned</string>\n    <string name=\"calorie_burned_format\">%d kcal</string>\n    <string name=\"distance_travelled\">Distance travelled</string>\n    <string name=\"distance_travelled_format\">%.2f km</string>\n\n    <!-- Stats -->\n    <string name=\"previous_day\">Previous day</string>\n    <string name=\"next_day\">Next day</string>\n    <string name=\"step_count\">Step count</string>\n    <plurals name=\"step_count_format\">\n        <item quantity=\"one\">%d step</item>\n        <item quantity=\"other\">%d steps</item>\n    </plurals>\n    <string name=\"tree_collected\">Tree collected</string>\n    <string name=\"trees_collected\">Trees collected</string>\n    <plurals name=\"trees_collected_format\">\n        <item quantity=\"one\">%d tree</item>\n        <item quantity=\"other\">%d trees</item>\n    </plurals>\n    <string name=\"daily_goal_reached\">Daily goal reached</string>\n    <string name=\"details\">Details</string>\n    <string name=\"summary\">Summary</string>\n\n    <!-- Preferences -->\n    <string name=\"settings\">Settings</string>\n    <string name=\"goals\">Goals</string>\n    <string name=\"daily_goal\">Daily goal</string>\n    <plurals name=\"daily_goal_summary\">\n        <item quantity=\"one\">%d step</item>\n        <item quantity=\"other\">%d steps</item>\n    </plurals>\n    <string name=\"advanced\">Advanced</string>\n    <string name=\"step_length\">Step length</string>\n    <string name=\"height\">Height</string>\n    <string name=\"weight\">Weight</string>\n    <string name=\"pace\">Pace</string>\n    <string-array name=\"pace_entries\">\n        <item>Slow</item>\n        <item>Normal</item>\n        <item>Fast</item>\n    </string-array>\n    <string-array name=\"pace_values\" translatable=\"false\">\n        <item>0.8</item>\n        <item>1</item>\n        <item>1.2</item>\n    </string-array>\n    <string name=\"about\">About</string>\n    <string name=\"github\" translatable=\"false\">GitHub</string>\n    <string name=\"github_summary\">Check out our GitHub repository and help us improve the app</string>\n    <string name=\"github_repository_url\" translatable=\"false\">https://github.com/bk20dev/forest</string>\n</resources>"
  },
  {
    "path": "app/src/main/res/values/themes.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <!-- Base application theme. -->\n    <style name=\"Base.Theme.Forest\" parent=\"Theme.Material3.DayNight.NoActionBar\">\n        <item name=\"colorPrimary\">@color/md_theme_light_primary</item>\n        <item name=\"colorOnPrimary\">@color/md_theme_light_onPrimary</item>\n        <item name=\"colorPrimaryContainer\">@color/md_theme_light_primaryContainer</item>\n        <item name=\"colorOnPrimaryContainer\">@color/md_theme_light_onPrimaryContainer</item>\n        <item name=\"colorSecondary\">@color/md_theme_light_secondary</item>\n        <item name=\"colorOnSecondary\">@color/md_theme_light_onSecondary</item>\n        <item name=\"colorSecondaryContainer\">@color/md_theme_light_secondaryContainer</item>\n        <item name=\"colorOnSecondaryContainer\">@color/md_theme_light_onSecondaryContainer</item>\n        <item name=\"colorTertiary\">@color/md_theme_light_tertiary</item>\n        <item name=\"colorOnTertiary\">@color/md_theme_light_onTertiary</item>\n        <item name=\"colorTertiaryContainer\">@color/md_theme_light_tertiaryContainer</item>\n        <item name=\"colorOnTertiaryContainer\">@color/md_theme_light_onTertiaryContainer</item>\n        <item name=\"colorError\">@color/md_theme_light_error</item>\n        <item name=\"colorErrorContainer\">@color/md_theme_light_errorContainer</item>\n        <item name=\"colorOnError\">@color/md_theme_light_onError</item>\n        <item name=\"colorOnErrorContainer\">@color/md_theme_light_onErrorContainer</item>\n        <item name=\"android:colorBackground\">@color/md_theme_light_background</item>\n        <item name=\"colorOnBackground\">@color/md_theme_light_onBackground</item>\n        <item name=\"colorSurface\">@color/md_theme_light_surface</item>\n        <item name=\"colorOnSurface\">@color/md_theme_light_onSurface</item>\n        <item name=\"colorSurfaceVariant\">@color/md_theme_light_surfaceVariant</item>\n        <item name=\"colorOnSurfaceVariant\">@color/md_theme_light_onSurfaceVariant</item>\n        <item name=\"colorOutline\">@color/md_theme_light_outline</item>\n        <item name=\"colorOnSurfaceInverse\">@color/md_theme_light_inverseOnSurface</item>\n        <item name=\"colorSurfaceInverse\">@color/md_theme_light_inverseSurface</item>\n        <item name=\"colorPrimaryInverse\">@color/md_theme_light_inversePrimary</item>\n\n        <item name=\"alertDialogTheme\">@style/Theme.Forest.MaterialAlertDialog</item>\n    </style>\n\n    <style name=\"Theme.Forest.MaterialAlertDialog\" parent=\"@style/ThemeOverlay.Material3.MaterialAlertDialog\">\n        <item name=\"dialogCornerRadius\">28dp</item>\n    </style>\n\n    <style name=\"Theme.Forest\" parent=\"Base.Theme.Forest\" />\n</resources>"
  },
  {
    "path": "app/src/main/res/values-night/themes.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <!-- Base application theme. -->\n    <style name=\"Base.Theme.Forest\" parent=\"Theme.Material3.DayNight.NoActionBar\">\n        <item name=\"colorPrimary\">@color/md_theme_dark_primary</item>\n        <item name=\"colorOnPrimary\">@color/md_theme_dark_onPrimary</item>\n        <item name=\"colorPrimaryContainer\">@color/md_theme_dark_primaryContainer</item>\n        <item name=\"colorOnPrimaryContainer\">@color/md_theme_dark_onPrimaryContainer</item>\n        <item name=\"colorSecondary\">@color/md_theme_dark_secondary</item>\n        <item name=\"colorOnSecondary\">@color/md_theme_dark_onSecondary</item>\n        <item name=\"colorSecondaryContainer\">@color/md_theme_dark_secondaryContainer</item>\n        <item name=\"colorOnSecondaryContainer\">@color/md_theme_dark_onSecondaryContainer</item>\n        <item name=\"colorTertiary\">@color/md_theme_dark_tertiary</item>\n        <item name=\"colorOnTertiary\">@color/md_theme_dark_onTertiary</item>\n        <item name=\"colorTertiaryContainer\">@color/md_theme_dark_tertiaryContainer</item>\n        <item name=\"colorOnTertiaryContainer\">@color/md_theme_dark_onTertiaryContainer</item>\n        <item name=\"colorError\">@color/md_theme_dark_error</item>\n        <item name=\"colorErrorContainer\">@color/md_theme_dark_errorContainer</item>\n        <item name=\"colorOnError\">@color/md_theme_dark_onError</item>\n        <item name=\"colorOnErrorContainer\">@color/md_theme_dark_onErrorContainer</item>\n        <item name=\"android:colorBackground\">@color/md_theme_dark_background</item>\n        <item name=\"colorOnBackground\">@color/md_theme_dark_onBackground</item>\n        <item name=\"colorSurface\">@color/md_theme_dark_surface</item>\n        <item name=\"colorOnSurface\">@color/md_theme_dark_onSurface</item>\n        <item name=\"colorSurfaceVariant\">@color/md_theme_dark_surfaceVariant</item>\n        <item name=\"colorOnSurfaceVariant\">@color/md_theme_dark_onSurfaceVariant</item>\n        <item name=\"colorOutline\">@color/md_theme_dark_outline</item>\n        <item name=\"colorOnSurfaceInverse\">@color/md_theme_dark_inverseOnSurface</item>\n        <item name=\"colorSurfaceInverse\">@color/md_theme_dark_inverseSurface</item>\n        <item name=\"colorPrimaryInverse\">@color/md_theme_dark_inversePrimary</item>\n\n        <item name=\"alertDialogTheme\">@style/Theme.Forest.MaterialAlertDialog</item>\n    </style>\n</resources>"
  },
  {
    "path": "app/src/main/res/values-v29/themes.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n\n    <style name=\"Theme.Forest\" parent=\"Base.Theme.Forest\">\n        <!-- Transparent system bars for edge-to-edge. -->\n        <item name=\"android:navigationBarColor\">@android:color/transparent</item>\n        <item name=\"android:statusBarColor\">@android:color/transparent</item>\n        <item name=\"android:windowLightStatusBar\">?attr/isLightTheme</item>\n    </style>\n</resources>"
  },
  {
    "path": "app/src/main/res/xml/backup_rules.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?><!--\n   Sample backup rules file; uncomment and customize as necessary.\n   See https://developer.android.com/guide/topics/data/autobackup\n   for details.\n   Note: This file is ignored for devices older that API 31\n   See https://developer.android.com/about/versions/12/backup-restore\n-->\n<full-backup-content>\n    <!--\n   <include domain=\"sharedpref\" path=\".\"/>\n   <exclude domain=\"sharedpref\" path=\"device.xml\"/>\n-->\n</full-backup-content>"
  },
  {
    "path": "app/src/main/res/xml/data_extraction_rules.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?><!--\n   Sample data extraction rules file; uncomment and customize as necessary.\n   See https://developer.android.com/about/versions/12/backup-restore#xml-changes\n   for details.\n-->\n<data-extraction-rules>\n    <cloud-backup>\n        <!-- TODO: Use <include> and <exclude> to control what is backed up.\n        <include .../>\n        <exclude .../>\n        -->\n    </cloud-backup>\n    <!--\n    <device-transfer>\n        <include .../>\n        <exclude .../>\n    </device-transfer>\n    -->\n</data-extraction-rules>"
  },
  {
    "path": "app/src/main/res/xml/settings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<PreferenceScreen xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\">\n\n    <PreferenceCategory app:title=\"@string/goals\">\n\n        <EditTextPreference\n            app:defaultValue=\"7500\"\n            app:key=\"daily_goal\"\n            app:title=\"@string/daily_goal\" />\n\n    </PreferenceCategory>\n\n    <PreferenceCategory app:title=\"@string/advanced\">\n\n        <EditTextPreference\n            app:defaultValue=\"67\"\n            app:key=\"step_length\"\n            app:title=\"@string/step_length\" />\n\n        <EditTextPreference\n            app:defaultValue=\"182\"\n            app:key=\"height\"\n            app:title=\"@string/height\" />\n\n        <EditTextPreference\n            app:defaultValue=\"70\"\n            app:key=\"weight\"\n            app:title=\"@string/weight\" />\n\n        <ListPreference\n            android:defaultValue=\"1\"\n            app:entries=\"@array/pace_entries\"\n            app:entryValues=\"@array/pace_values\"\n            app:key=\"pace\"\n            app:title=\"@string/pace\" />\n\n    </PreferenceCategory>\n\n    <PreferenceCategory app:title=\"@string/about\">\n\n        <Preference\n            android:summary=\"@string/github_summary\"\n            android:title=\"@string/github\">\n\n            <intent\n                android:action=\"android.intent.action.VIEW\"\n                android:data=\"@string/github_repository_url\" />\n\n        </Preference>\n\n    </PreferenceCategory>\n\n</PreferenceScreen>"
  },
  {
    "path": "app/src/test/java/pl/bartek537/forest/ExampleUnitTest.kt",
    "content": "package pl.bartek537.forest\n\nimport org.junit.Test\n\nimport org.junit.Assert.*\n\n/**\n * Example local unit test, which will execute on the development machine (host).\n *\n * See [testing documentation](http://d.android.com/tools/testing).\n */\nclass ExampleUnitTest {\n    @Test\n    fun addition_isCorrect() {\n        assertEquals(4, 2 + 2)\n    }\n}"
  },
  {
    "path": "build.gradle",
    "content": "plugins {\n    alias libs.plugins.android.application apply false\n    alias libs.plugins.kotlin.android apply false\n    alias libs.plugins.devtools.ksp apply false\n}"
  },
  {
    "path": "gradle/libs.versions.toml",
    "content": "[versions]\nactivity = \"1.11.0\"\nagp = \"8.13.0\"\nappcompat = \"1.7.1\"\nconstraintLayout = \"2.2.1\"\ncoreKtx = \"1.17.0\"\ndesugarJdkLibs = \"2.1.5\"\nespresso = \"3.7.0\"\njunit = \"4.13.2\"\njunitAndroid = \"1.3.0\"\nkoin = \"4.1.1\"\n#noinspection NewerVersionAvailable Version 2.2.20-2.0.2 of com.google.devtools.ksp is not yet available.\nkotlin = \"2.2.10\"\nkotlinKsp = \"2.2.10-2.0.2\"\nlifecycle = \"2.9.3\"\nmaterialDesign = \"1.13.0\"\nnavigation = \"2.9.4\"\npreference = \"1.2.1\"\nroom = \"2.8.0\"\nswipeRefreshLayout = \"1.1.0\"\n\n[libraries]\nandroidx-appcompat = { group = \"androidx.appcompat\", name = \"appcompat\", version.ref = \"appcompat\" }\nandroidx-activity-ktx = { group = \"androidx.activity\", name = \"activity-ktx\", version.ref = \"activity\" }\nandroidx-constraintlayout = { group = \"androidx.constraintlayout\", name = \"constraintlayout\", version.ref = \"constraintLayout\" }\nandroidx-core-ktx = { group = \"androidx.core\", name = \"core-ktx\", version.ref = \"coreKtx\" }\nandroidx-lifecycle-runtime-ktx = { group = \"androidx.lifecycle\", name = \"lifecycle-runtime-ktx\", version.ref = \"lifecycle\" }\nandroidx-lifecycle-service = { group = \"androidx.lifecycle\", name = \"lifecycle-service\", version.ref = \"lifecycle\" }\nandroidx-lifecycle-viewmodel-ktx = { group = \"androidx.lifecycle\", name = \"lifecycle-viewmodel-ktx\", version.ref = \"lifecycle\" }\nandroidx-navigation-fragment-ktx = { group = \"androidx.navigation\", name = \"navigation-fragment-ktx\", version.ref = \"navigation\" }\nandroidx-navigation-ui-ktx = { group = \"androidx.navigation\", name = \"navigation-ui-ktx\", version.ref = \"navigation\" }\nandroidx-preference = { group = \"androidx.preference\", name = \"preference\", version.ref = \"preference\" }\nandroidx-room-ktx = { group = \"androidx.room\", name = \"room-ktx\", version.ref = \"room\" }\nandroidx-room-compiler = { group = \"androidx.room\", name = \"room-compiler\", version.ref = \"room\" }\nandroidx-swiperefreshlayout = { group = \"androidx.swiperefreshlayout\", name = \"swiperefreshlayout\", version.ref = \"swipeRefreshLayout\" }\nandroidx-test-espresso = { group = \"androidx.test.espresso\", name = \"espresso-core\", version.ref = \"espresso\" }\nandroidx-test-junit = { group = \"androidx.test.ext\", name = \"junit\", version.ref = \"junitAndroid\" }\nandroid-material-design = { group = \"com.google.android.material\", name = \"material\", version.ref = \"materialDesign\" }\njunit = { group = \"junit\", name = \"junit\", version.ref = \"junit\" }\nkoin-androidx = { group = \"io.insert-koin\", name = \"koin-android\", version.ref = \"koin\" }\ntools-desugar-jdk-libs = { group = \"com.android.tools\", name = \"desugar_jdk_libs\", version.ref = \"desugarJdkLibs\" }\n\n[plugins]\nandroid-application = { id = \"com.android.application\", version.ref = \"agp\" }\nkotlin-android = { id = \"org.jetbrains.kotlin.android\", version.ref = \"kotlin\" }\ndevtools-ksp = { id = \"com.google.devtools.ksp\", version.ref = \"kotlinKsp\" }\n"
  },
  {
    "path": "gradle/wrapper/gradle-wrapper.properties",
    "content": "distributionBase=GRADLE_USER_HOME\ndistributionPath=wrapper/dists\ndistributionUrl=https\\://services.gradle.org/distributions/gradle-8.14.3-bin.zip\nnetworkTimeout=10000\nvalidateDistributionUrl=true\nzipStoreBase=GRADLE_USER_HOME\nzipStorePath=wrapper/dists\n"
  },
  {
    "path": "gradle.properties",
    "content": "# Project-wide Gradle settings.\n# IDE (e.g. Android Studio) users:\n# Gradle settings configured through the IDE *will override*\n# any settings specified in this file.\n# For more details on how to configure your build environment visit\n# http://www.gradle.org/docs/current/userguide/build_environment.html\n# Specifies the JVM arguments used for the daemon process.\n# The setting is particularly useful for tweaking memory settings.\norg.gradle.jvmargs=-Xmx2048m -Dfile.encoding=UTF-8\n# When configured, Gradle will run in incubating parallel mode.\n# This option should only be used with decoupled projects. More details, visit\n# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects\n# org.gradle.parallel=true\n# AndroidX package structure to make it clearer which packages are bundled with the\n# Android operating system, and which are packaged with your app's APK\n# https://developer.android.com/topic/libraries/support-library/androidx-rn\nandroid.useAndroidX=true\n# Kotlin code style for this project: \"official\" or \"obsolete\":\nkotlin.code.style=official\n# Enables namespacing of each library's R class so that its R class includes only the\n# resources declared in the library itself and none from the library's dependencies,\n# thereby reducing the size of the R class for that library\nandroid.nonTransitiveRClass=true\nandroid.nonFinalResIds=false"
  },
  {
    "path": "gradlew",
    "content": "#!/bin/sh\n\n#\n# Copyright © 2015-2021 the original authors.\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#      https://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n#\n\n##############################################################################\n#\n#   Gradle start up script for POSIX generated by Gradle.\n#\n#   Important for running:\n#\n#   (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is\n#       noncompliant, but you have some other compliant shell such as ksh or\n#       bash, then to run this script, type that shell name before the whole\n#       command line, like:\n#\n#           ksh Gradle\n#\n#       Busybox and similar reduced shells will NOT work, because this script\n#       requires all of these POSIX shell features:\n#         * functions;\n#         * expansions «$var», «${var}», «${var:-default}», «${var+SET}»,\n#           «${var#prefix}», «${var%suffix}», and «$( cmd )»;\n#         * compound commands having a testable exit status, especially «case»;\n#         * various built-in commands including «command», «set», and «ulimit».\n#\n#   Important for patching:\n#\n#   (2) This script targets any POSIX shell, so it avoids extensions provided\n#       by Bash, Ksh, etc; in particular arrays are avoided.\n#\n#       The \"traditional\" practice of packing multiple parameters into a\n#       space-separated string is a well documented source of bugs and security\n#       problems, so this is (mostly) avoided, by progressively accumulating\n#       options in \"$@\", and eventually passing that to Java.\n#\n#       Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS,\n#       and GRADLE_OPTS) rely on word-splitting, this is performed explicitly;\n#       see the in-line comments for details.\n#\n#       There are tweaks for specific operating systems such as AIX, CygWin,\n#       Darwin, MinGW, and NonStop.\n#\n#   (3) This script is generated from the Groovy template\n#       https://github.com/gradle/gradle/blob/HEAD/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt\n#       within the Gradle project.\n#\n#       You can find Gradle at https://github.com/gradle/gradle/.\n#\n##############################################################################\n\n# Attempt to set APP_HOME\n\n# Resolve links: $0 may be a link\napp_path=$0\n\n# Need this for daisy-chained symlinks.\nwhile\n    APP_HOME=${app_path%\"${app_path##*/}\"}  # leaves a trailing /; empty if no leading path\n    [ -h \"$app_path\" ]\ndo\n    ls=$( ls -ld \"$app_path\" )\n    link=${ls#*' -> '}\n    case $link in             #(\n      /*)   app_path=$link ;; #(\n      *)    app_path=$APP_HOME$link ;;\n    esac\ndone\n\n# This is normally unused\n# shellcheck disable=SC2034\nAPP_BASE_NAME=${0##*/}\n# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036)\nAPP_HOME=$( cd \"${APP_HOME:-./}\" > /dev/null && pwd -P ) || exit\n\n# Use the maximum available, or set MAX_FD != -1 to use that value.\nMAX_FD=maximum\n\nwarn () {\n    echo \"$*\"\n} >&2\n\ndie () {\n    echo\n    echo \"$*\"\n    echo\n    exit 1\n} >&2\n\n# OS specific support (must be 'true' or 'false').\ncygwin=false\nmsys=false\ndarwin=false\nnonstop=false\ncase \"$( uname )\" in                #(\n  CYGWIN* )         cygwin=true  ;; #(\n  Darwin* )         darwin=true  ;; #(\n  MSYS* | MINGW* )  msys=true    ;; #(\n  NONSTOP* )        nonstop=true ;;\nesac\n\nCLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar\n\n\n# Determine the Java command to use to start the JVM.\nif [ -n \"$JAVA_HOME\" ] ; then\n    if [ -x \"$JAVA_HOME/jre/sh/java\" ] ; then\n        # IBM's JDK on AIX uses strange locations for the executables\n        JAVACMD=$JAVA_HOME/jre/sh/java\n    else\n        JAVACMD=$JAVA_HOME/bin/java\n    fi\n    if [ ! -x \"$JAVACMD\" ] ; then\n        die \"ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME\n\nPlease set the JAVA_HOME variable in your environment to match the\nlocation of your Java installation.\"\n    fi\nelse\n    JAVACMD=java\n    if ! command -v java >/dev/null 2>&1\n    then\n        die \"ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.\n\nPlease set the JAVA_HOME variable in your environment to match the\nlocation of your Java installation.\"\n    fi\nfi\n\n# Increase the maximum file descriptors if we can.\nif ! \"$cygwin\" && ! \"$darwin\" && ! \"$nonstop\" ; then\n    case $MAX_FD in #(\n      max*)\n        # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked.\n        # shellcheck disable=SC2039,SC3045\n        MAX_FD=$( ulimit -H -n ) ||\n            warn \"Could not query maximum file descriptor limit\"\n    esac\n    case $MAX_FD in  #(\n      '' | soft) :;; #(\n      *)\n        # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked.\n        # shellcheck disable=SC2039,SC3045\n        ulimit -n \"$MAX_FD\" ||\n            warn \"Could not set maximum file descriptor limit to $MAX_FD\"\n    esac\nfi\n\n# Collect all arguments for the java command, stacking in reverse order:\n#   * args from the command line\n#   * the main class name\n#   * -classpath\n#   * -D...appname settings\n#   * --module-path (only if needed)\n#   * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables.\n\n# For Cygwin or MSYS, switch paths to Windows format before running java\nif \"$cygwin\" || \"$msys\" ; then\n    APP_HOME=$( cygpath --path --mixed \"$APP_HOME\" )\n    CLASSPATH=$( cygpath --path --mixed \"$CLASSPATH\" )\n\n    JAVACMD=$( cygpath --unix \"$JAVACMD\" )\n\n    # Now convert the arguments - kludge to limit ourselves to /bin/sh\n    for arg do\n        if\n            case $arg in                                #(\n              -*)   false ;;                            # don't mess with options #(\n              /?*)  t=${arg#/} t=/${t%%/*}              # looks like a POSIX filepath\n                    [ -e \"$t\" ] ;;                      #(\n              *)    false ;;\n            esac\n        then\n            arg=$( cygpath --path --ignore --mixed \"$arg\" )\n        fi\n        # Roll the args list around exactly as many times as the number of\n        # args, so each arg winds up back in the position where it started, but\n        # possibly modified.\n        #\n        # NB: a `for` loop captures its iteration list before it begins, so\n        # changing the positional parameters here affects neither the number of\n        # iterations, nor the values presented in `arg`.\n        shift                   # remove old arg\n        set -- \"$@\" \"$arg\"      # push replacement arg\n    done\nfi\n\n\n# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.\nDEFAULT_JVM_OPTS='\"-Xmx64m\" \"-Xms64m\"'\n\n# Collect all arguments for the java command:\n#   * DEFAULT_JVM_OPTS, JAVA_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments,\n#     and any embedded shellness will be escaped.\n#   * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be\n#     treated as '${Hostname}' itself on the command line.\n\nset -- \\\n        \"-Dorg.gradle.appname=$APP_BASE_NAME\" \\\n        -classpath \"$CLASSPATH\" \\\n        org.gradle.wrapper.GradleWrapperMain \\\n        \"$@\"\n\n# Stop when \"xargs\" is not available.\nif ! command -v xargs >/dev/null 2>&1\nthen\n    die \"xargs is not available\"\nfi\n\n# Use \"xargs\" to parse quoted args.\n#\n# With -n1 it outputs one arg per line, with the quotes and backslashes removed.\n#\n# In Bash we could simply go:\n#\n#   readarray ARGS < <( xargs -n1 <<<\"$var\" ) &&\n#   set -- \"${ARGS[@]}\" \"$@\"\n#\n# but POSIX shell has neither arrays nor command substitution, so instead we\n# post-process each arg (as a line of input to sed) to backslash-escape any\n# character that might be a shell metacharacter, then use eval to reverse\n# that process (while maintaining the separation between arguments), and wrap\n# the whole thing up as a single \"set\" statement.\n#\n# This will of course break if any of these variables contains a newline or\n# an unmatched quote.\n#\n\neval \"set -- $(\n        printf '%s\\n' \"$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS\" |\n        xargs -n1 |\n        sed ' s~[^-[:alnum:]+,./:=@_]~\\\\&~g; ' |\n        tr '\\n' ' '\n    )\" '\"$@\"'\n\nexec \"$JAVACMD\" \"$@\"\n"
  },
  {
    "path": "gradlew.bat",
    "content": "@rem\n@rem Copyright 2015 the original author or authors.\n@rem\n@rem Licensed under the Apache License, Version 2.0 (the \"License\");\n@rem you may not use this file except in compliance with the License.\n@rem You may obtain a copy of the License at\n@rem\n@rem      https://www.apache.org/licenses/LICENSE-2.0\n@rem\n@rem Unless required by applicable law or agreed to in writing, software\n@rem distributed under the License is distributed on an \"AS IS\" BASIS,\n@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n@rem See the License for the specific language governing permissions and\n@rem limitations under the License.\n@rem\n\n@if \"%DEBUG%\"==\"\" @echo off\n@rem ##########################################################################\n@rem\n@rem  Gradle startup script for Windows\n@rem\n@rem ##########################################################################\n\n@rem Set local scope for the variables with windows NT shell\nif \"%OS%\"==\"Windows_NT\" setlocal\n\nset DIRNAME=%~dp0\nif \"%DIRNAME%\"==\"\" set DIRNAME=.\n@rem This is normally unused\nset APP_BASE_NAME=%~n0\nset APP_HOME=%DIRNAME%\n\n@rem Resolve any \".\" and \"..\" in APP_HOME to make it shorter.\nfor %%i in (\"%APP_HOME%\") do set APP_HOME=%%~fi\n\n@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.\nset DEFAULT_JVM_OPTS=\"-Xmx64m\" \"-Xms64m\"\n\n@rem Find java.exe\nif defined JAVA_HOME goto findJavaFromJavaHome\n\nset JAVA_EXE=java.exe\n%JAVA_EXE% -version >NUL 2>&1\nif %ERRORLEVEL% equ 0 goto execute\n\necho.\necho ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.\necho.\necho Please set the JAVA_HOME variable in your environment to match the\necho location of your Java installation.\n\ngoto fail\n\n:findJavaFromJavaHome\nset JAVA_HOME=%JAVA_HOME:\"=%\nset JAVA_EXE=%JAVA_HOME%/bin/java.exe\n\nif exist \"%JAVA_EXE%\" goto execute\n\necho.\necho ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%\necho.\necho Please set the JAVA_HOME variable in your environment to match the\necho location of your Java installation.\n\ngoto fail\n\n:execute\n@rem Setup the command line\n\nset CLASSPATH=%APP_HOME%\\gradle\\wrapper\\gradle-wrapper.jar\n\n\n@rem Execute Gradle\n\"%JAVA_EXE%\" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% \"-Dorg.gradle.appname=%APP_BASE_NAME%\" -classpath \"%CLASSPATH%\" org.gradle.wrapper.GradleWrapperMain %*\n\n:end\n@rem End local scope for the variables with windows NT shell\nif %ERRORLEVEL% equ 0 goto mainEnd\n\n:fail\nrem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of\nrem the _cmd.exe /c_ return code!\nset EXIT_CODE=%ERRORLEVEL%\nif %EXIT_CODE% equ 0 set EXIT_CODE=1\nif not \"\"==\"%GRADLE_EXIT_CONSOLE%\" exit %EXIT_CODE%\nexit /b %EXIT_CODE%\n\n:mainEnd\nif \"%OS%\"==\"Windows_NT\" endlocal\n\n:omega\n"
  },
  {
    "path": "settings.gradle",
    "content": "pluginManagement {\n    repositories {\n        google()\n        mavenCentral()\n        gradlePluginPortal()\n    }\n}\ndependencyResolutionManagement {\n    repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)\n    repositories {\n        google()\n        mavenCentral()\n    }\n}\nrootProject.name = \"Forest\"\ninclude ':app'\n"
  }
]