main 484b191bf6b2 cached
122 files
382.5 KB
147.0k tokens
1 requests
Download .txt
Showing preview only (418K chars total). Download the full file or copy to clipboard to get everything.
Repository: serbelga/Material-Motion-Samples
Branch: main
Commit: 484b191bf6b2
Files: 122
Total size: 382.5 KB

Directory structure:
gitextract_nt8w2kbz/

├── .editorconfig
├── .github/
│   └── workflows/
│       └── android.yml
├── .gitignore
├── LICENSE
├── README.md
├── app/
│   ├── .gitignore
│   ├── build.gradle.kts
│   ├── proguard-rules.pro
│   └── src/
│       └── main/
│           ├── AndroidManifest.xml
│           ├── java/
│           │   └── dev/
│           │       └── sergiobelda/
│           │           └── samples/
│           │               └── materialmotion/
│           │                   ├── MainActivity.kt
│           │                   ├── databinding/
│           │                   │   └── BindingAdapters.kt
│           │                   ├── messages/
│           │                   │   ├── ContactsAdapter.kt
│           │                   │   ├── Messages.kt
│           │                   │   ├── MessagesActivity.kt
│           │                   │   └── MessagesAdapter.kt
│           │                   ├── music/
│           │                   │   ├── AlbumFragment.kt
│           │                   │   ├── AlbumsAdapter.kt
│           │                   │   ├── AlbumsFragment.kt
│           │                   │   ├── ArtistsAdapter.kt
│           │                   │   ├── ArtistsFragment.kt
│           │                   │   ├── MusicActivity.kt
│           │                   │   ├── MusicData.kt
│           │                   │   └── PlaylistsFragment.kt
│           │                   ├── notes/
│           │                   │   ├── AddNoteActivity.kt
│           │                   │   ├── Note.kt
│           │                   │   ├── NoteDetailActivity.kt
│           │                   │   ├── NotesActivity.kt
│           │                   │   └── NotesAdapter.kt
│           │                   ├── planets/
│           │                   │   ├── PlanetFragment.kt
│           │                   │   ├── Planets.kt
│           │                   │   ├── PlanetsActivity.kt
│           │                   │   └── StepAdapter.kt
│           │                   ├── sample/
│           │                   │   ├── SampleItem.kt
│           │                   │   └── SamplesAdapter.kt
│           │                   ├── signin/
│           │                   │   ├── SignInActivity.kt
│           │                   │   ├── SignInFragment.kt
│           │                   │   └── WelcomeFragment.kt
│           │                   └── walkthrough/
│           │                       ├── WalkthroughActivity.kt
│           │                       └── WalkthroughFragment.kt
│           └── res/
│               ├── color/
│               │   └── step_selector.xml
│               ├── drawable/
│               │   ├── circle.xml
│               │   ├── ic_baseline_all_inclusive_24.xml
│               │   ├── ic_baseline_person_outline_24.xml
│               │   ├── ic_baseline_playlist_play_24.xml
│               │   ├── ic_launcher_background.xml
│               │   ├── ic_outline_album_24.xml
│               │   ├── ic_outline_edit_24.xml
│               │   ├── ic_outline_play_arrow_24.xml
│               │   ├── ic_round_account_circle_24.xml
│               │   ├── ic_round_add_24.xml
│               │   ├── ic_round_clear_24.xml
│               │   ├── ic_round_person_24.xml
│               │   ├── ic_round_save_24.xml
│               │   ├── step_selector.xml
│               │   ├── tab_dot.xml
│               │   ├── tab_dot_background.xml
│               │   ├── undraw_celebration.xml
│               │   ├── undraw_drag.xml
│               │   ├── undraw_social_sharing.xml
│               │   └── undraw_winners.xml
│               ├── drawable-v24/
│               │   └── ic_launcher_foreground.xml
│               ├── font/
│               │   ├── metropolis.xml
│               │   ├── metropolis_medium.otf
│               │   ├── metropolis_regular.otf
│               │   └── metropolis_semibold.otf
│               ├── layout/
│               │   ├── add_note_activity.xml
│               │   ├── album_fragment.xml
│               │   ├── albums_fragment.xml
│               │   ├── artists_fragment.xml
│               │   ├── item_album.xml
│               │   ├── item_artist.xml
│               │   ├── item_contact.xml
│               │   ├── item_message.xml
│               │   ├── item_note.xml
│               │   ├── item_sample.xml
│               │   ├── item_step.xml
│               │   ├── main_activity.xml
│               │   ├── messages_activity.xml
│               │   ├── music_activity.xml
│               │   ├── note_detail_activity.xml
│               │   ├── notes_activity.xml
│               │   ├── planet_fragment.xml
│               │   ├── planets_activity.xml
│               │   ├── playlists_fragment.xml
│               │   ├── sign_in_activity.xml
│               │   ├── sign_in_fragment.xml
│               │   ├── walkthrough_activity.xml
│               │   ├── walkthrough_fragment.xml
│               │   └── welcome_fragment.xml
│               ├── menu/
│               │   └── navigation_menu.xml
│               ├── mipmap-anydpi-v26/
│               │   ├── ic_launcher.xml
│               │   └── ic_launcher_round.xml
│               ├── navigation/
│               │   └── nav_graph.xml
│               └── values/
│                   ├── colors.xml
│                   ├── dimens.xml
│                   ├── font_certs.xml
│                   ├── ic_launcher_background.xml
│                   ├── shape.xml
│                   ├── strings.xml
│                   ├── styles.xml
│                   └── type.xml
├── build-logic/
│   ├── .gitignore
│   ├── convention/
│   │   ├── build.gradle.kts
│   │   └── src/
│   │       └── main/
│   │           └── kotlin/
│   │               └── SpotlessConventionPlugin.kt
│   ├── gradle/
│   │   └── wrapper/
│   │       ├── gradle-wrapper.jar
│   │       └── gradle-wrapper.properties
│   ├── gradle.properties
│   ├── gradlew
│   ├── gradlew.bat
│   └── settings.gradle.kts
├── build.gradle.kts
├── gradle/
│   ├── libs.versions.toml
│   └── wrapper/
│       ├── gradle-wrapper.jar
│       └── gradle-wrapper.properties
├── gradle.properties
├── gradlew
├── gradlew.bat
├── renovate.json
├── settings.gradle.kts
└── spotless/
    ├── copyright.kt
    ├── copyright.kts
    └── copyright.xml

================================================
FILE CONTENTS
================================================

================================================
FILE: .editorconfig
================================================
[*.{kt,kts}]
ktlint_standard_backing-property-naming = disabled


================================================
FILE: .github/workflows/android.yml
================================================
name: Android CI

on:
  push:
    branches:
      - main
      - develop
  pull_request:
    branches:
      - main
      - develop

jobs:
  build:

    runs-on: ubuntu-latest

    steps:
    - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
    - name: set up JDK 17
      uses: actions/setup-java@v5
      with:
        java-version: '17'
        distribution: 'temurin'
        cache: gradle

    - name: Grant execute permission for gradlew
      run: chmod +x gradlew
    - name: Build with Gradle
      run: ./gradlew build


================================================
FILE: .gitignore
================================================
*.iml
.gradle
/local.properties
/.idea/caches
/.idea/libraries
/.idea/modules.xml
/.idea/workspace.xml
/.idea/navEditor.xml
/.idea/assetWizardSettings.xml
.DS_Store
/build
/captures
.externalNativeBuild
.cxx
/.idea/
/.kotlin/


================================================
FILE: LICENSE
================================================
                                 Apache License
                           Version 2.0, January 2004
                        http://www.apache.org/licenses/

   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION

   1. Definitions.

      "License" shall mean the terms and conditions for use, reproduction,
      and distribution as defined by Sections 1 through 9 of this document.

      "Licensor" shall mean the copyright owner or entity authorized by
      the copyright owner that is granting the License.

      "Legal Entity" shall mean the union of the acting entity and all
      other entities that control, are controlled by, or are under common
      control with that entity. For the purposes of this definition,
      "control" means (i) the power, direct or indirect, to cause the
      direction or management of such entity, whether by contract or
      otherwise, or (ii) ownership of fifty percent (50%) or more of the
      outstanding shares, or (iii) beneficial ownership of such entity.

      "You" (or "Your") shall mean an individual or Legal Entity
      exercising permissions granted by this License.

      "Source" form shall mean the preferred form for making modifications,
      including but not limited to software source code, documentation
      source, and configuration files.

      "Object" form shall mean any form resulting from mechanical
      transformation or translation of a Source form, including but
      not limited to compiled object code, generated documentation,
      and conversions to other media types.

      "Work" shall mean the work of authorship, whether in Source or
      Object form, made available under the License, as indicated by a
      copyright notice that is included in or attached to the work
      (an example is provided in the Appendix below).

      "Derivative Works" shall mean any work, whether in Source or Object
      form, that is based on (or derived from) the Work and for which the
      editorial revisions, annotations, elaborations, or other modifications
      represent, as a whole, an original work of authorship. For the purposes
      of this License, Derivative Works shall not include works that remain
      separable from, or merely link (or bind by name) to the interfaces of,
      the Work and Derivative Works thereof.

      "Contribution" shall mean any work of authorship, including
      the original version of the Work and any modifications or additions
      to that Work or Derivative Works thereof, that is intentionally
      submitted to Licensor for inclusion in the Work by the copyright owner
      or by an individual or Legal Entity authorized to submit on behalf of
      the copyright owner. For the purposes of this definition, "submitted"
      means any form of electronic, verbal, or written communication sent
      to the Licensor or its representatives, including but not limited to
      communication on electronic mailing lists, source code control systems,
      and issue tracking systems that are managed by, or on behalf of, the
      Licensor for the purpose of discussing and improving the Work, but
      excluding communication that is conspicuously marked or otherwise
      designated in writing by the copyright owner as "Not a Contribution."

      "Contributor" shall mean Licensor and any individual or Legal Entity
      on behalf of whom a Contribution has been received by Licensor and
      subsequently incorporated within the Work.

   2. Grant of Copyright License. Subject to the terms and conditions of
      this License, each Contributor hereby grants to You a perpetual,
      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
      copyright license to reproduce, prepare Derivative Works of,
      publicly display, publicly perform, sublicense, and distribute the
      Work and such Derivative Works in Source or Object form.

   3. Grant of Patent License. Subject to the terms and conditions of
      this License, each Contributor hereby grants to You a perpetual,
      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
      (except as stated in this section) patent license to make, have made,
      use, offer to sell, sell, import, and otherwise transfer the Work,
      where such license applies only to those patent claims licensable
      by such Contributor that are necessarily infringed by their
      Contribution(s) alone or by combination of their Contribution(s)
      with the Work to which such Contribution(s) was submitted. If You
      institute patent litigation against any entity (including a
      cross-claim or counterclaim in a lawsuit) alleging that the Work
      or a Contribution incorporated within the Work constitutes direct
      or contributory patent infringement, then any patent licenses
      granted to You under this License for that Work shall terminate
      as of the date such litigation is filed.

   4. Redistribution. You may reproduce and distribute copies of the
      Work or Derivative Works thereof in any medium, with or without
      modifications, and in Source or Object form, provided that You
      meet the following conditions:

      (a) You must give any other recipients of the Work or
          Derivative Works a copy of this License; and

      (b) You must cause any modified files to carry prominent notices
          stating that You changed the files; and

      (c) You must retain, in the Source form of any Derivative Works
          that You distribute, all copyright, patent, trademark, and
          attribution notices from the Source form of the Work,
          excluding those notices that do not pertain to any part of
          the Derivative Works; and

      (d) If the Work includes a "NOTICE" text file as part of its
          distribution, then any Derivative Works that You distribute must
          include a readable copy of the attribution notices contained
          within such NOTICE file, excluding those notices that do not
          pertain to any part of the Derivative Works, in at least one
          of the following places: within a NOTICE text file distributed
          as part of the Derivative Works; within the Source form or
          documentation, if provided along with the Derivative Works; or,
          within a display generated by the Derivative Works, if and
          wherever such third-party notices normally appear. The contents
          of the NOTICE file are for informational purposes only and
          do not modify the License. You may add Your own attribution
          notices within Derivative Works that You distribute, alongside
          or as an addendum to the NOTICE text from the Work, provided
          that such additional attribution notices cannot be construed
          as modifying the License.

      You may add Your own copyright statement to Your modifications and
      may provide additional or different license terms and conditions
      for use, reproduction, or distribution of Your modifications, or
      for any such Derivative Works as a whole, provided Your use,
      reproduction, and distribution of the Work otherwise complies with
      the conditions stated in this License.

   5. Submission of Contributions. Unless You explicitly state otherwise,
      any Contribution intentionally submitted for inclusion in the Work
      by You to the Licensor shall be under the terms and conditions of
      this License, without any additional terms or conditions.
      Notwithstanding the above, nothing herein shall supersede or modify
      the terms of any separate license agreement you may have executed
      with Licensor regarding such Contributions.

   6. Trademarks. This License does not grant permission to use the trade
      names, trademarks, service marks, or product names of the Licensor,
      except as required for reasonable and customary use in describing the
      origin of the Work and reproducing the content of the NOTICE file.

   7. Disclaimer of Warranty. Unless required by applicable law or
      agreed to in writing, Licensor provides the Work (and each
      Contributor provides its Contributions) on an "AS IS" BASIS,
      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
      implied, including, without limitation, any warranties or conditions
      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
      PARTICULAR PURPOSE. You are solely responsible for determining the
      appropriateness of using or redistributing the Work and assume any
      risks associated with Your exercise of permissions under this License.

   8. Limitation of Liability. In no event and under no legal theory,
      whether in tort (including negligence), contract, or otherwise,
      unless required by applicable law (such as deliberate and grossly
      negligent acts) or agreed to in writing, shall any Contributor be
      liable to You for damages, including any direct, indirect, special,
      incidental, or consequential damages of any character arising as a
      result of this License or out of the use or inability to use the
      Work (including but not limited to damages for loss of goodwill,
      work stoppage, computer failure or malfunction, or any and all
      other commercial damages or losses), even if such Contributor
      has been advised of the possibility of such damages.

   9. Accepting Warranty or Additional Liability. While redistributing
      the Work or Derivative Works thereof, You may choose to offer,
      and charge a fee for, acceptance of support, warranty, indemnity,
      or other liability obligations and/or rights consistent with this
      License. However, in accepting such obligations, You may act only
      on Your own behalf and on Your sole responsibility, not on behalf
      of any other Contributor, and only if You agree to indemnify,
      defend, and hold each Contributor harmless for any liability
      incurred by, or claims asserted against, such Contributor by reason
      of your accepting any such warranty or additional liability.

   END OF TERMS AND CONDITIONS

   APPENDIX: How to apply the Apache License to your work.

      To apply the Apache License to your work, attach the following
      boilerplate notice, with the fields enclosed by brackets "[]"
      replaced with your own identifying information. (Don't include
      the brackets!)  The text should be enclosed in the appropriate
      comment syntax for the file format. We also recommend that a
      file or class name and description of purpose be included on the
      same "printed page" as the copyright notice for easier
      identification within third-party archives.

   Copyright 2021 Sergio Belda Galbis

   Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
   You may obtain a copy of the License at

       http://www.apache.org/licenses/LICENSE-2.0

   Unless required by applicable law or agreed to in writing, software
   distributed under the License is distributed on an "AS IS" BASIS,
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   See the License for the specific language governing permissions and
   limitations under the License.


================================================
FILE: README.md
================================================
<h1 align="center">Material Motion Samples</h1></br>

<h5 align="center">
A collection of samples using Material Components Motion for Android
</h5>

<p align="center">
<img src="https://github.com/serbelga/material_motion_samples/workflows/Android%20CI/badge.svg">
<img src="https://img.shields.io/badge/API-24%2B-brightgreen.svg?style=flat">
</p>

<p align="center">
<img width="260" src="./screenshots/menu.png">
</p>

<h2>Messages</h2>

Use Material Fade transition to show the Floating Action Button and Material Container Transform to transform the FAB into a menu

<p align="center">
  <img align="center" src="./screenshots/fade_fab.gif" width="260">
  <img align="center" width="260" src="./screenshots/fab_to_menu.gif">
</p>

<h2>Notes</h2>

Use Material Container Transform to transform a FAB into an Activity and a Material Card View into an Activity

<p align="center">
  <img align="center" src="./screenshots/fab_to_activity.gif" width="260">
</p>

<h2>Walkthrough</h2>

Use Material Shared Axis X transition to introduce the main features of an Application

<p align="center">
  <img align="center" src="./screenshots/shared_axis_x.gif" width="260">
</p>


<h2>Solar System</h2>

Use Material Shared Axis Y transition in a Material Stepper

<p align="center">
  <img align="center" src="./screenshots/shared_axis_y.gif" width="260">
</p>

<h2>Sign In</h2>

Use Material Shared Axis Z to represent App's hierarchy. For example, a transition between the application when the user logs in or not

<p align="center">
  <img align="center" src="./screenshots/shared_axis_z.gif" width="260">
</p>

<h2>Music</h2>

Use Material Fade Through to switch between views that do not have a strong relationship to each other and Material Container Transform with Android Navigation Component

<p align="center">
  <img align="center" src="./screenshots/fade_through.gif" width="260">
  <img align="center" src="./screenshots/navigation_container_transform.gif" width="260">
</p>


================================================
FILE: app/.gitignore
================================================
/build


================================================
FILE: app/build.gradle.kts
================================================
@Suppress("DSL_SCOPE_VIOLATION")
plugins {
    alias(libs.plugins.androidApplication)
    kotlin("android")
    kotlin("kapt")
    alias(libs.plugins.ksp)
    alias(libs.plugins.navigationSafeArgs)
    id("samples.materialmotion.spotless")
}

android {
    compileSdk = 36

    defaultConfig {
        applicationId = "dev.sergiobelda.samples.materialmotion"
        minSdk = 24
        targetSdk = 36
        versionCode = 1
        versionName = "1.0"

        testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
    }

    buildTypes {
        release {
            isMinifyEnabled = false
            proguardFiles(
                getDefaultProguardFile("proguard-android-optimize.txt"),
                "proguard-rules.pro"
            )
        }
    }

    buildFeatures {
        viewBinding = true
        dataBinding = true
    }
    compileOptions {
        sourceCompatibility = JavaVersion.VERSION_17
        targetCompatibility = JavaVersion.VERSION_17
    }
    kotlin {
        jvmToolchain(17)
    }
    namespace = "dev.sergiobelda.samples.materialmotion"
}

dependencies {
    implementation(libs.androidx.appcompat)
    implementation(libs.androidx.constraintlayout)
    implementation(libs.androidx.core.coreKtx)
    implementation(libs.androidx.navigation.navigationFragmentKtx)
    implementation(libs.androidx.navigation.navigationUiKtx)
    implementation(libs.androidx.paletteKtx)
    implementation(libs.google.material)
    implementation(libs.glide)
    ksp(libs.glide.compiler)
    androidTestImplementation(libs.androidx.test.ext.junit)
    androidTestImplementation(libs.androidx.test.espresso.core)
    testImplementation(libs.junit)
}


================================================
FILE: app/proguard-rules.pro
================================================
# Add project specific ProGuard rules here.
# You can control the set of applied configuration files using the
# proguardFiles setting in build.kts.
#
# For more details, see
#   http://developer.android.com/guide/developing/tools/proguard.html

# If your project uses WebView with JS, uncomment the following
# and specify the fully qualified class name to the JavaScript interface
# class:
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
#   public *;
#}

# Uncomment this to preserve the line number information for
# debugging stack traces.
#-keepattributes SourceFile,LineNumberTable

# If you keep the line number information, uncomment this to
# hide the original source file name.
#-renamesourcefileattribute SourceFile


================================================
FILE: app/src/main/AndroidManifest.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<!--
     Copyright 2021 Sergio Belda
     Licensed under the Apache License, Version 2.0 (the "License");
     you may not use this file except in compliance with the License.
     You may obtain a copy of the License at
          http://www.apache.org/licenses/LICENSE-2.0
     Unless required by applicable law or agreed to in writing, software
     distributed under the License is distributed on an "AS IS" BASIS,
     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     See the License for the specific language governing permissions and
     limitations under the License.
-->

<manifest xmlns:android="http://schemas.android.com/apk/res/android">

    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.POST_NOTIFICATIONS" />

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity
            android:name="dev.sergiobelda.samples.materialmotion.signin.SignInActivity"
            android:screenOrientation="portrait" />
        <activity
            android:name="dev.sergiobelda.samples.materialmotion.walkthrough.WalkthroughActivity"
            android:screenOrientation="portrait" />
        <activity
            android:name="dev.sergiobelda.samples.materialmotion.notes.NoteDetailActivity"
            android:screenOrientation="portrait" />
        <activity
            android:name="dev.sergiobelda.samples.materialmotion.notes.AddNoteActivity"
            android:screenOrientation="portrait" />
        <activity
            android:name="dev.sergiobelda.samples.materialmotion.notes.NotesActivity"
            android:screenOrientation="portrait" />
        <activity
            android:name="dev.sergiobelda.samples.materialmotion.messages.MessagesActivity"
            android:screenOrientation="portrait" />
        <activity
            android:name="dev.sergiobelda.samples.materialmotion.music.MusicActivity"
            android:screenOrientation="portrait" />
        <activity
            android:name="dev.sergiobelda.samples.materialmotion.planets.PlanetsActivity"
            android:screenOrientation="portrait" />
        <activity
            android:name="dev.sergiobelda.samples.materialmotion.MainActivity"
            android:screenOrientation="portrait"
            android:exported="true">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
</manifest>

================================================
FILE: app/src/main/java/dev/sergiobelda/samples/materialmotion/MainActivity.kt
================================================
/*
 * Copyright 2021 Sergio Belda
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package dev.sergiobelda.samples.materialmotion

import android.content.Intent
import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
import androidx.recyclerview.widget.LinearLayoutManager
import dev.sergiobelda.samples.materialmotion.databinding.MainActivityBinding
import dev.sergiobelda.samples.materialmotion.sample.SampleItem
import dev.sergiobelda.samples.materialmotion.sample.SamplesAdapter
import dev.sergiobelda.samples.materialmotion.sample.samples

class MainActivity : AppCompatActivity() {
    private lateinit var binding: MainActivityBinding

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = MainActivityBinding.inflate(layoutInflater)
        setContentView(binding.root)

        val samplesAdapter =
            SamplesAdapter(samples).apply {
                listener =
                    object : SamplesAdapter.OnSampleClickListener {
                        override fun onSampleClick(sampleItem: SampleItem) {
                            startActivity(Intent(this@MainActivity, sampleItem.activity))
                        }
                    }
            }
        binding.recyclerView.apply {
            layoutManager = LinearLayoutManager(this@MainActivity)
            adapter = samplesAdapter
        }
    }
}


================================================
FILE: app/src/main/java/dev/sergiobelda/samples/materialmotion/databinding/BindingAdapters.kt
================================================
/*
 * Copyright 2021 Sergio Belda
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package dev.sergiobelda.samples.materialmotion.databinding

import android.widget.ImageView
import androidx.databinding.BindingAdapter
import com.bumptech.glide.Glide

@BindingAdapter("image_url")
fun imageUrl(
    imageView: ImageView,
    url: String,
) = Glide
    .with(imageView)
    .load(url)
    .into(imageView)


================================================
FILE: app/src/main/java/dev/sergiobelda/samples/materialmotion/messages/ContactsAdapter.kt
================================================
/*
 * Copyright 2021 Sergio Belda
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package dev.sergiobelda.samples.materialmotion.messages

import android.view.LayoutInflater
import android.view.ViewGroup
import androidx.recyclerview.widget.RecyclerView
import dev.sergiobelda.samples.materialmotion.databinding.ItemContactBinding

class ContactsAdapter(
    private val items: List<Contact>,
) : RecyclerView.Adapter<ContactsAdapter.ViewHolder>() {
    override fun onCreateViewHolder(
        parent: ViewGroup,
        viewType: Int,
    ) = ViewHolder(
        ItemContactBinding.inflate(
            LayoutInflater.from(parent.context),
            parent,
            false,
        ),
    )

    override fun getItemCount() = items.size

    override fun onBindViewHolder(
        holder: ViewHolder,
        position: Int,
    ) = holder.bind(items[position])

    inner class ViewHolder(
        val binding: ItemContactBinding,
    ) : RecyclerView.ViewHolder(binding.root) {
        fun bind(contact: Contact) {
            binding.contact = contact
        }
    }
}


================================================
FILE: app/src/main/java/dev/sergiobelda/samples/materialmotion/messages/Messages.kt
================================================
/*
 * Copyright 2021 Sergio Belda
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package dev.sergiobelda.samples.materialmotion.messages

data class Message(
    val id: Int,
    val contact: Contact,
    val body: String,
)

data class Contact(
    val id: Int,
    val name: String,
    val email: String,
    val image: String,
)

val contact1 =
    Contact(
        id = 1,
        name = "Jacob",
        email = "jacob@mail.com",
        image = "https://picsum.photos/id/1012/300/300.jpg",
    )

val contact2 =
    Contact(
        id = 2,
        name = "Sophie",
        email = "sophie@mail.com",
        image = "https://picsum.photos/id/237/300/300.jpg",
    )

val contact3 =
    Contact(
        id = 3,
        name = "Ada",
        email = "ada@mail.com",
        image = "https://picsum.photos/id/786/300/300.jpg",
    )

val contact4 =
    Contact(
        id = 4,
        name = "William",
        email = "william@mail.com",
        image = "https://picsum.photos/id/1035/300/300.jpg",
    )

val message1 =
    Message(
        id = 1,
        contact = contact1,
        body = "Hello Friend",
    )

val message2 =
    Message(
        id = 2,
        contact = contact2,
        body = "Hi!",
    )

val message3 =
    Message(
        id = 3,
        contact = contact3,
        body = "...",
    )

val message4 =
    Message(
        id = 4,
        contact = contact4,
        body = "Hey!",
    )

val contacts = listOf(contact1, contact2, contact3, contact4)

val favContacts = listOf(contact1, contact2, contact3)

val messages = listOf(message1, message2, message3, message4)


================================================
FILE: app/src/main/java/dev/sergiobelda/samples/materialmotion/messages/MessagesActivity.kt
================================================
/*
 * Copyright 2021 Sergio Belda
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package dev.sergiobelda.samples.materialmotion.messages

import android.graphics.Color
import android.os.Bundle
import android.view.MenuItem
import android.view.View
import androidx.appcompat.app.AppCompatActivity
import androidx.interpolator.view.animation.FastOutSlowInInterpolator
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import androidx.transition.TransitionManager
import com.google.android.material.color.MaterialColors
import com.google.android.material.transition.MaterialContainerTransform
import com.google.android.material.transition.MaterialFade
import dev.sergiobelda.samples.materialmotion.R
import dev.sergiobelda.samples.materialmotion.databinding.MessagesActivityBinding

class MessagesActivity : AppCompatActivity() {
    private lateinit var binding: MessagesActivityBinding

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = MessagesActivityBinding.inflate(layoutInflater)
        setContentView(binding.root)

        setSupportActionBar(binding.toolbar)
        supportActionBar?.setDisplayHomeAsUpEnabled(true)
        supportActionBar?.setDisplayShowTitleEnabled(false)
        initClickListeners()
        initRecyclerViews()
        binding.floatingActionButton.post {
            val transition =
                MaterialFade().apply {
                    duration = 2000
                }
            TransitionManager.beginDelayedTransition(findViewById(android.R.id.content), transition)
            binding.floatingActionButton.visibility = View.VISIBLE
        }
    }

    private fun initClickListeners() {
        binding.floatingActionButton.setOnClickListener {
            val transition = buildContainerTransformation()

            transition.startView = binding.floatingActionButton
            transition.endView = binding.card

            transition.addTarget(binding.card)

            TransitionManager.beginDelayedTransition(findViewById(android.R.id.content), transition)
            binding.card.visibility = View.VISIBLE
            binding.fabScrim.visibility = View.VISIBLE

            binding.floatingActionButton.visibility = View.INVISIBLE
        }

        binding.fabScrim.setOnClickListener {
            val transition = buildContainerTransformation()

            transition.startView = binding.card
            transition.endView = binding.floatingActionButton

            transition.addTarget(binding.floatingActionButton)

            TransitionManager.beginDelayedTransition(binding.coordinator, transition)
            binding.card.visibility = View.INVISIBLE
            binding.fabScrim.visibility = View.INVISIBLE

            binding.floatingActionButton.visibility = View.VISIBLE
        }
    }

    private fun initRecyclerViews() {
        binding.recyclerView.layoutManager = LinearLayoutManager(this)
        binding.recyclerView.adapter = MessagesAdapter(messages)
        binding.recyclerView.addOnScrollListener(
            object : RecyclerView.OnScrollListener() {
            /*
            // When scroll down FAB disappears, when scroll up FAB appears
            override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) {
                if (dy > 0) {
                    binding.floatingActionButton.hide()
                } else {
                    binding.floatingActionButton.show()
                }
            }
             */

                // When is dragging FAB disappears, when stops FAB appears
                override fun onScrollStateChanged(
                    recyclerView: RecyclerView,
                    newState: Int,
                ) {
                    if (newState == RecyclerView.SCROLL_STATE_IDLE) {
                        binding.floatingActionButton.show()
                    } else {
                        binding.floatingActionButton.hide()
                    }
                }
            },
        )

        binding.cardRecyclerView.layoutManager = LinearLayoutManager(this)
        binding.cardRecyclerView.adapter = ContactsAdapter(favContacts)
    }

    private fun buildContainerTransformation() =
        MaterialContainerTransform().apply {
            containerColor = MaterialColors.getColor(binding.root, R.attr.colorSecondary)
            scrimColor = Color.TRANSPARENT
            duration = 300
            interpolator = FastOutSlowInInterpolator()
            fadeMode = MaterialContainerTransform.FADE_MODE_IN
        }

    override fun onOptionsItemSelected(item: MenuItem): Boolean =
        when (item.itemId) {
            android.R.id.home -> {
                onBackPressedDispatcher.onBackPressed()
                true
            }

            else -> {
                true
            }
        }
}


================================================
FILE: app/src/main/java/dev/sergiobelda/samples/materialmotion/messages/MessagesAdapter.kt
================================================
/*
 * Copyright 2021 Sergio Belda
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package dev.sergiobelda.samples.materialmotion.messages

import android.view.LayoutInflater
import android.view.ViewGroup
import androidx.recyclerview.widget.RecyclerView
import dev.sergiobelda.samples.materialmotion.databinding.ItemMessageBinding

class MessagesAdapter(
    val items: List<Message>,
) : RecyclerView.Adapter<MessagesAdapter.ViewHolder>() {
    override fun onCreateViewHolder(
        parent: ViewGroup,
        viewType: Int,
    ) = ViewHolder(
        ItemMessageBinding.inflate(
            LayoutInflater.from(parent.context),
            parent,
            false,
        ),
    )

    override fun getItemCount() = items.size

    override fun onBindViewHolder(
        holder: ViewHolder,
        position: Int,
    ) = holder.bind(items[position])

    inner class ViewHolder(
        val binding: ItemMessageBinding,
    ) : RecyclerView.ViewHolder(binding.root) {
        fun bind(message: Message) {
            binding.message = message
        }
    }
}


================================================
FILE: app/src/main/java/dev/sergiobelda/samples/materialmotion/music/AlbumFragment.kt
================================================
/*
 * Copyright 2021 Sergio Belda
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package dev.sergiobelda.samples.materialmotion.music

import android.graphics.Bitmap
import android.graphics.drawable.Drawable
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.databinding.DataBindingUtil
import androidx.fragment.app.Fragment
import androidx.interpolator.view.animation.FastOutSlowInInterpolator
import androidx.navigation.fragment.navArgs
import androidx.palette.graphics.Palette
import com.bumptech.glide.Glide
import com.bumptech.glide.request.target.CustomTarget
import com.bumptech.glide.request.transition.Transition
import com.google.android.material.color.MaterialColors
import com.google.android.material.transition.MaterialContainerTransform
import dev.sergiobelda.samples.materialmotion.R
import dev.sergiobelda.samples.materialmotion.databinding.AlbumFragmentBinding

class AlbumFragment : Fragment() {
    private val args: AlbumFragmentArgs by navArgs()

    private lateinit var binding: AlbumFragmentBinding

    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?,
    ): View {
        binding = DataBindingUtil.inflate(inflater, R.layout.album_fragment, container, false)
        binding.lifecycleOwner = viewLifecycleOwner
        return binding.root
    }

    override fun onViewCreated(
        view: View,
        savedInstanceState: Bundle?,
    ) {
        super.onViewCreated(view, savedInstanceState)
        binding.albumFragmentRoot.transitionName = args.albumId.toString()
        val album = albums.find { it.id == args.albumId }
        binding.album = album

        Glide
            .with(requireContext())
            .asBitmap()
            .load(album?.image)
            .into(
                object : CustomTarget<Bitmap>() {
                    override fun onResourceReady(
                        resource: Bitmap,
                        transition: Transition<in Bitmap>?,
                    ) {
                        val palette = Palette.from(resource).generate()
                        palette.darkVibrantSwatch?.let {
                            binding.collapsingToolbar.setBackgroundColor(it.rgb)
                            val color = requireContext().getColor(R.color.colorOnPrimary)
                            binding.collapsingToolbar.setCollapsedTitleTextColor(color)
                            binding.collapsingToolbar.setExpandedTitleColor(color)
                        } ?: palette.lightVibrantSwatch?.let {
                            binding.collapsingToolbar.setBackgroundColor(it.rgb)
                        }
                    }

                    override fun onLoadCleared(placeholder: Drawable?) {}
                },
            )
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        sharedElementEnterTransition = buildContainerTransform(true)
        sharedElementReturnTransition = buildContainerTransform(false)
    }

    private fun buildContainerTransform(entering: Boolean) =
        MaterialContainerTransform(requireContext(), entering).apply {
            drawingViewId = R.id.nav_host_fragment
            interpolator = FastOutSlowInInterpolator()
            containerColor =
                MaterialColors.getColor(
                    requireActivity().findViewById(android.R.id.content),
                    R.attr.colorSurface,
                )
            fadeMode = MaterialContainerTransform.FADE_MODE_OUT
            duration = 300
        }
}


================================================
FILE: app/src/main/java/dev/sergiobelda/samples/materialmotion/music/AlbumsAdapter.kt
================================================
/*
 * Copyright 2021 Sergio Belda
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package dev.sergiobelda.samples.materialmotion.music

import android.content.Context
import android.graphics.Bitmap
import android.graphics.drawable.Drawable
import android.view.LayoutInflater
import android.view.ViewGroup
import androidx.palette.graphics.Palette
import androidx.recyclerview.widget.RecyclerView
import com.bumptech.glide.Glide
import com.bumptech.glide.request.target.CustomTarget
import com.bumptech.glide.request.transition.Transition
import com.google.android.material.card.MaterialCardView
import dev.sergiobelda.samples.materialmotion.R
import dev.sergiobelda.samples.materialmotion.databinding.ItemAlbumBinding

class AlbumsAdapter(
    private val items: List<Album>,
    private val context: Context,
) : RecyclerView.Adapter<AlbumsAdapter.ViewHolder>() {
    lateinit var albumClickListener: AlbumClickListener

    inner class ViewHolder(
        val binding: ItemAlbumBinding,
    ) : RecyclerView.ViewHolder(binding.root) {
        fun bind(album: Album) {
            binding.album = album
            Glide
                .with(context)
                .asBitmap()
                .load(album.image)
                .into(
                    object : CustomTarget<Bitmap>() {
                        override fun onResourceReady(
                            resource: Bitmap,
                            transition: Transition<in Bitmap>?,
                        ) {
                            val palette = Palette.from(resource).generate()
                            palette.darkVibrantSwatch?.let {
                                binding.albumCard.setCardBackgroundColor(it.rgb)
                                val color = context.getColor(R.color.colorOnPrimary)
                                binding.albumName.setTextColor(color)
                            } ?: palette.lightVibrantSwatch?.let {
                                binding.albumCard.setCardBackgroundColor(it.rgb)
                            }
                        }

                        override fun onLoadCleared(placeholder: Drawable?) {}
                    },
                )
            binding.albumCard.transitionName = album.id.toString()
            binding.albumCard.setOnClickListener {
                albumClickListener.onAlbumClick(album.id, binding.albumCard)
            }
        }
    }

    override fun onCreateViewHolder(
        parent: ViewGroup,
        viewType: Int,
    ) = ViewHolder(
        ItemAlbumBinding.inflate(
            LayoutInflater.from(parent.context),
            parent,
            false,
        ),
    )

    override fun getItemCount() = items.size

    override fun onBindViewHolder(
        holder: ViewHolder,
        position: Int,
    ) = holder.bind(items[position])

    interface AlbumClickListener {
        fun onAlbumClick(
            id: Int,
            cardView: MaterialCardView,
        )
    }
}


================================================
FILE: app/src/main/java/dev/sergiobelda/samples/materialmotion/music/AlbumsFragment.kt
================================================
/*
 * Copyright 2021 Sergio Belda
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package dev.sergiobelda.samples.materialmotion.music

import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.fragment.app.Fragment
import androidx.navigation.fragment.FragmentNavigatorExtras
import androidx.navigation.fragment.findNavController
import androidx.recyclerview.widget.GridLayoutManager
import com.google.android.material.card.MaterialCardView
import com.google.android.material.transition.MaterialFadeThrough
import dev.sergiobelda.samples.materialmotion.databinding.AlbumsFragmentBinding

class AlbumsFragment : Fragment() {
    private var _binding: AlbumsFragmentBinding? = null
    private val binding get() = _binding!!

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        enterTransition = MaterialFadeThrough()
    }

    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?,
    ): View {
        _binding = AlbumsFragmentBinding.inflate(inflater, container, false)
        return binding.root
    }

    override fun onViewCreated(
        view: View,
        savedInstanceState: Bundle?,
    ) {
        super.onViewCreated(view, savedInstanceState)
        postponeEnterTransition()
        binding.recyclerView.post { startPostponedEnterTransition() }

        val adapter = AlbumsAdapter(albums, requireContext())
        adapter.albumClickListener =
            object : AlbumsAdapter.AlbumClickListener {
                override fun onAlbumClick(
                    id: Int,
                    cardView: MaterialCardView,
                ) {
                    val extras =
                        FragmentNavigatorExtras(
                            cardView to id.toString(),
                        )
                    val action = AlbumsFragmentDirections.navToAlbumFragment(id)
                    findNavController().navigate(action, extras)
                }
            }
        binding.recyclerView.layoutManager = GridLayoutManager(requireContext(), 2)
        binding.recyclerView.adapter = adapter
    }
}


================================================
FILE: app/src/main/java/dev/sergiobelda/samples/materialmotion/music/ArtistsAdapter.kt
================================================
/*
 * Copyright 2021 Sergio Belda
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package dev.sergiobelda.samples.materialmotion.music

import android.view.LayoutInflater
import android.view.ViewGroup
import androidx.recyclerview.widget.RecyclerView
import dev.sergiobelda.samples.materialmotion.databinding.ItemArtistBinding

class ArtistsAdapter(
    var items: List<Artist>,
) : RecyclerView.Adapter<ArtistsAdapter.ViewHolder>() {
    override fun onCreateViewHolder(
        parent: ViewGroup,
        viewType: Int,
    ) = ViewHolder(
        ItemArtistBinding.inflate(
            LayoutInflater.from(parent.context),
            parent,
            false,
        ),
    )

    override fun getItemCount() = items.size

    override fun onBindViewHolder(
        holder: ViewHolder,
        position: Int,
    ) = holder.bind(items[position])

    inner class ViewHolder(
        var binding: ItemArtistBinding,
    ) : RecyclerView.ViewHolder(binding.root) {
        fun bind(artist: Artist) {
            binding.artist = artist
        }
    }
}


================================================
FILE: app/src/main/java/dev/sergiobelda/samples/materialmotion/music/ArtistsFragment.kt
================================================
/*
 * Copyright 2021 Sergio Belda
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package dev.sergiobelda.samples.materialmotion.music

import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.fragment.app.Fragment
import androidx.recyclerview.widget.GridLayoutManager
import com.google.android.material.transition.MaterialFadeThrough
import dev.sergiobelda.samples.materialmotion.databinding.ArtistsFragmentBinding

class ArtistsFragment : Fragment() {
    private var _binding: ArtistsFragmentBinding? = null
    private val binding get() = _binding!!

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        enterTransition = MaterialFadeThrough()
    }

    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?,
    ): View {
        _binding = ArtistsFragmentBinding.inflate(inflater, container, false)
        return binding.root
    }

    override fun onViewCreated(
        view: View,
        savedInstanceState: Bundle?,
    ) {
        super.onViewCreated(view, savedInstanceState)
        postponeEnterTransition()
        binding.recyclerView.post { startPostponedEnterTransition() }
        binding.recyclerView.layoutManager = GridLayoutManager(requireContext(), 2)
        binding.recyclerView.adapter = ArtistsAdapter(artists)
    }
}


================================================
FILE: app/src/main/java/dev/sergiobelda/samples/materialmotion/music/MusicActivity.kt
================================================
/*
 * Copyright 2021 Sergio Belda
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package dev.sergiobelda.samples.materialmotion.music

import android.os.Bundle
import android.view.MenuItem
import android.view.View
import androidx.appcompat.app.AppCompatActivity
import androidx.navigation.findNavController
import androidx.navigation.ui.NavigationUI
import dev.sergiobelda.samples.materialmotion.R
import dev.sergiobelda.samples.materialmotion.databinding.MusicActivityBinding

class MusicActivity : AppCompatActivity() {
    private lateinit var binding: MusicActivityBinding

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = MusicActivityBinding.inflate(layoutInflater)
        setContentView(binding.root)
        binding.bottomNavigationView.inflateMenu(R.menu.navigation_menu)
        val navController = findNavController(R.id.nav_host_fragment)
        NavigationUI.setupWithNavController(
            binding.bottomNavigationView,
            navController,
        )
        navController.addOnDestinationChangedListener { _, destination, _ ->
            when (destination.id) {
                R.id.albumFragment -> {
                    binding.appbarLayout.setExpanded(false, true)
                    binding.bottomNavigationView.visibility = View.GONE
                }

                else -> {
                    binding.appbarLayout.setExpanded(true, true)
                    binding.bottomNavigationView.visibility = View.VISIBLE
                }
            }
        }
    }

    override fun onOptionsItemSelected(item: MenuItem): Boolean =
        when (item.itemId) {
            android.R.id.home -> {
                onBackPressedDispatcher.onBackPressed()
                true
            }

            else -> {
                true
            }
        }
}


================================================
FILE: app/src/main/java/dev/sergiobelda/samples/materialmotion/music/MusicData.kt
================================================
/*
 * Copyright 2021 Sergio Belda
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

@file:Suppress("ktlint:standard:max-line-length")

package dev.sergiobelda.samples.materialmotion.music

data class Artist(
    val id: Int,
    val name: String,
    val image: String,
)

data class Album(
    val id: Int,
    val name: String,
    val image: String,
)

val shiroi =
    Album(
        id = 1,
        name = "Shiroi",
        image = "https://img.discogs.com/EI7SfveNHws0ONsXJO9FLEpZFYc=/fit-in/600x536/filters:strip_icc():format(jpeg):mode_rgb():quality(90)/discogs-images/R-12841514-1544304275-9214.jpeg.jpg",
    )

val wywh =
    Album(
        id = 2,
        name = "Wish You Were Here",
        image = "https://img.discogs.com/tQj6wwY11KUz3TUwq8DHOnZdWl0=/fit-in/600x600/filters:strip_icc():format(jpeg):mode_rgb():quality(90)/discogs-images/R-3354750-1477237778-6311.jpeg.jpg",
    )

val jazzmaica =
    Album(
        id = 3,
        name = "Jazzmaica",
        image = "https://img.discogs.com/JQny678Vd6janet-PeNjrlK66z8=/fit-in/600x599/filters:strip_icc():format(jpeg):mode_rgb():quality(90)/discogs-images/R-8489874-1510971569-9261.jpeg.jpg",
    )

val albums = listOf(shiroi, wywh, jazzmaica)

val snarky =
    Artist(
        id = 1,
        name = "Snarky Puppy",
        image = "https://is2-ssl.mzstatic.com/image/thumb/Features20/v4/bf/82/f8/bf82f863-1edd-626a-2d9b-8c76cbabdd83/mzl.pouxzkfo.jpg/1000x1000cc.jpg",
    )

val yussef =
    Artist(
        id = 2,
        name = "Yussef Dayes",
        image = "https://is3-ssl.mzstatic.com/image/thumb/Music123/v4/ca/c7/96/cac7966f-dd10-d016-b146-6d8e8cf8fb70/pr_source.png/1000x1000cc.jpg",
    )

val dubinc =
    Artist(
        id = 3,
        name = "Dub Inc",
        image = "https://is3-ssl.mzstatic.com/image/thumb/Music123/v4/34/75/9f/34759f94-c43b-1861-8fc3-12b2e40198b1/pr_source.png/1000x1000cc.jpg",
    )

val cory =
    Artist(
        id = 4,
        name = "Cory Henry",
        image = "https://is1-ssl.mzstatic.com/image/thumb/Music123/v4/70/5e/fe/705efec8-c546-0534-64fa-77ee0c8fd99d/pr_source.png/1000x1000cc.jpg",
    )

val artists = listOf(cory, dubinc, snarky, yussef)


================================================
FILE: app/src/main/java/dev/sergiobelda/samples/materialmotion/music/PlaylistsFragment.kt
================================================
/*
 * Copyright 2021 Sergio Belda
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package dev.sergiobelda.samples.materialmotion.music

import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.fragment.app.Fragment
import com.google.android.material.transition.MaterialFadeThrough
import dev.sergiobelda.samples.materialmotion.R

class PlaylistsFragment : Fragment() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        enterTransition = MaterialFadeThrough()
    }

    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?,
    ): View = inflater.inflate(R.layout.playlists_fragment, container, false)
}


================================================
FILE: app/src/main/java/dev/sergiobelda/samples/materialmotion/notes/AddNoteActivity.kt
================================================
/*
 * Copyright 2021 Sergio Belda
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package dev.sergiobelda.samples.materialmotion.notes

import android.os.Bundle
import android.view.MenuItem
import android.view.Window
import androidx.appcompat.app.AppCompatActivity
import androidx.interpolator.view.animation.FastOutSlowInInterpolator
import com.google.android.material.color.MaterialColors
import com.google.android.material.transition.platform.MaterialArcMotion
import com.google.android.material.transition.platform.MaterialContainerTransform
import com.google.android.material.transition.platform.MaterialContainerTransformSharedElementCallback
import dev.sergiobelda.samples.materialmotion.R
import dev.sergiobelda.samples.materialmotion.databinding.AddNoteActivityBinding

class AddNoteActivity : AppCompatActivity() {
    private lateinit var binding: AddNoteActivityBinding

    override fun onCreate(savedInstanceState: Bundle?) {
        window.requestFeature(Window.FEATURE_ACTIVITY_TRANSITIONS)
        binding = AddNoteActivityBinding.inflate(layoutInflater)
        binding.coordinator.transitionName = "shared_element_end_root"
        setEnterSharedElementCallback(MaterialContainerTransformSharedElementCallback())
        window.sharedElementEnterTransition = buildContainerTransform()
        window.sharedElementReturnTransition = buildContainerTransform()
        setContentView(binding.coordinator)
        super.onCreate(savedInstanceState)

        setSupportActionBar(binding.toolbar)
        supportActionBar?.setDisplayHomeAsUpEnabled(true)
        supportActionBar?.setHomeAsUpIndicator(R.drawable.ic_round_clear_24)
        supportActionBar?.setDisplayShowTitleEnabled(false)
    }

    private fun buildContainerTransform() =
        MaterialContainerTransform().apply {
            addTarget(binding.coordinator)
            setAllContainerColors(MaterialColors.getColor(binding.root, R.attr.colorSurface))
            pathMotion = MaterialArcMotion()
            duration = 500
            interpolator = FastOutSlowInInterpolator()
            fadeMode = MaterialContainerTransform.FADE_MODE_IN
        }

    override fun onOptionsItemSelected(item: MenuItem): Boolean =
        when (item.itemId) {
            android.R.id.home -> {
                onBackPressedDispatcher.onBackPressed()
                true
            }

            else -> {
                true
            }
        }
}


================================================
FILE: app/src/main/java/dev/sergiobelda/samples/materialmotion/notes/Note.kt
================================================
/*
 * Copyright 2021 Sergio Belda
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

@file:Suppress("ktlint:standard:max-line-length")

package dev.sergiobelda.samples.materialmotion.notes

import androidx.annotation.ColorRes
import dev.sergiobelda.samples.materialmotion.R

data class Note(
    val id: Int,
    val title: String,
    val body: String,
    @ColorRes val colorRes: Int,
)

val note1 =
    Note(
        id = 1,
        title = "ToDo 1",
        body = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus scelerisque placerat nisl, nec semper felis ullamcorper vel. Nullam egestas ante nec tortor egestas mattis. Duis ut diam nec nibh sodales commodo at at diam. Nunc tempor eu lectus ut feugiat. Etiam eget ullamcorper est, at scelerisque lectus. Aliquam erat volutpat. Maecenas est urna, vestibulum non eros non, dignissim feugiat mi. Cras sit amet ex hendrerit, accumsan dolor in, bibendum erat. Maecenas ullamcorper ut risus eget congue. Vestibulum aliquam ipsum ut turpis efficitur, vel malesuada neque aliquam. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Aenean egestas justo id rutrum blandit. Vestibulum id orci libero. Aliquam pharetra sed mauris ac vehicula.",
        colorRes = R.color.blue300,
    )

val note2 =
    Note(
        id = 2,
        title = "ToDo 2",
        body = "Fusce hendrerit enim in eros congue, sed pharetra libero tempus. Integer accumsan euismod nibh non vestibulum. Curabitur finibus imperdiet nunc vel ornare. Ut maximus fringilla sapien in viverra. Aenean a nulla feugiat, hendrerit risus et, congue erat. Ut venenatis lorem sit amet volutpat sollicitudin. Donec ac lorem auctor sem mattis faucibus non ac ante. Phasellus id sem non ante bibendum porta non in tellus. Etiam pellentesque porta luctus.",
        colorRes = R.color.amber300,
    )

val note3 =
    Note(
        id = 3,
        title = "ToDo 3",
        body = "Praesent interdum dictum magna quis pretium. Suspendisse at cursus ante, id rutrum nunc. Nullam at lacinia nibh, nec gravida lectus. Quisque maximus vulputate leo, et sollicitudin turpis luctus pellentesque. Nullam vehicula sagittis magna, consectetur congue neque ullamcorper vel. Praesent sed vulputate nunc. Ut ligula lorem, lobortis tristique interdum at, mollis a dolor. Ut sed fringilla urna, id suscipit justo. Praesent ut tortor pharetra, laoreet metus non, iaculis mi. Duis vel lacus fermentum, porta neque id, ultricies arcu. Nunc interdum, est ac sodales tristique, elit urna feugiat dui, quis venenatis ante lorem ullamcorper mi. Nulla id condimentum lorem. Nunc ac scelerisque felis. Nam semper, mi et ultrices rutrum, neque odio molestie tortor, ac iaculis ante arcu eu elit. Phasellus imperdiet tortor quis aliquam ornare.",
        colorRes = R.color.green300,
    )

val notes = listOf(note1, note2, note3)


================================================
FILE: app/src/main/java/dev/sergiobelda/samples/materialmotion/notes/NoteDetailActivity.kt
================================================
/*
 * Copyright 2021 Sergio Belda
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package dev.sergiobelda.samples.materialmotion.notes

import android.os.Bundle
import android.view.MenuItem
import android.view.Window
import androidx.appcompat.app.AppCompatActivity
import androidx.interpolator.view.animation.FastOutSlowInInterpolator
import com.google.android.material.transition.platform.MaterialContainerTransform
import com.google.android.material.transition.platform.MaterialContainerTransformSharedElementCallback
import dev.sergiobelda.samples.materialmotion.databinding.NoteDetailActivityBinding

class NoteDetailActivity : AppCompatActivity() {
    private lateinit var binding: NoteDetailActivityBinding

    override fun onCreate(savedInstanceState: Bundle?) {
        window.requestFeature(Window.FEATURE_ACTIVITY_TRANSITIONS)
        binding = NoteDetailActivityBinding.inflate(layoutInflater)
        val noteId = intent.getIntExtra("noteId", 0)
        binding.coordinator.transitionName = noteId.toString()
        setEnterSharedElementCallback(MaterialContainerTransformSharedElementCallback())
        window.sharedElementEnterTransition = buildContainerTransform()
        window.sharedElementReturnTransition = buildContainerTransform()
        setContentView(binding.root)
        super.onCreate(savedInstanceState)

        setSupportActionBar(binding.toolbar)
        supportActionBar?.setDisplayHomeAsUpEnabled(true)
        supportActionBar?.setDisplayShowTitleEnabled(false)
        val note = notes.find { it.id == noteId }
        binding.note = note
    }

    private fun buildContainerTransform() =
        MaterialContainerTransform().apply {
            addTarget(binding.coordinator)
            duration = 300
            interpolator = FastOutSlowInInterpolator()
            fadeMode = MaterialContainerTransform.FADE_MODE_IN
        }

    override fun onOptionsItemSelected(item: MenuItem): Boolean =
        when (item.itemId) {
            android.R.id.home -> {
                onBackPressedDispatcher.onBackPressed()
                true
            }

            else -> {
                true
            }
        }
}


================================================
FILE: app/src/main/java/dev/sergiobelda/samples/materialmotion/notes/NotesActivity.kt
================================================
/*
 * Copyright 2021 Sergio Belda
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package dev.sergiobelda.samples.materialmotion.notes

import android.content.Intent
import android.os.Bundle
import android.view.MenuItem
import android.view.Window
import androidx.appcompat.app.AppCompatActivity
import androidx.core.app.ActivityOptionsCompat
import androidx.recyclerview.widget.GridLayoutManager
import com.google.android.material.card.MaterialCardView
import com.google.android.material.transition.platform.MaterialContainerTransformSharedElementCallback
import dev.sergiobelda.samples.materialmotion.databinding.NotesActivityBinding

class NotesActivity : AppCompatActivity() {
    private lateinit var binding: NotesActivityBinding

    override fun onCreate(savedInstanceState: Bundle?) {
        window.requestFeature(Window.FEATURE_ACTIVITY_TRANSITIONS)
        binding = NotesActivityBinding.inflate(layoutInflater)
        setExitSharedElementCallback(MaterialContainerTransformSharedElementCallback())
        window.sharedElementsUseOverlay = false
        setContentView(binding.root)
        super.onCreate(savedInstanceState)
        setSupportActionBar(binding.toolbar)
        supportActionBar?.setDisplayHomeAsUpEnabled(true)
        supportActionBar?.setDisplayShowTitleEnabled(false)
        setClickListeners()
        setRecyclerView()
    }

    private fun setRecyclerView() {
        val adapter = NotesAdapter(notes)
        adapter.noteClickListener =
            object : NotesAdapter.NoteClickListener {
                override fun onNoteClick(
                    id: Int,
                    noteCard: MaterialCardView,
                ) {
                    val intent = Intent(this@NotesActivity, NoteDetailActivity::class.java)
                    val options =
                        ActivityOptionsCompat.makeSceneTransitionAnimation(
                            this@NotesActivity,
                            noteCard,
                            id.toString(),
                        )
                    intent.putExtra("noteId", id)
                    startActivity(intent, options.toBundle())
                }
            }
        binding.recyclerView.layoutManager = GridLayoutManager(this, 2)
        binding.recyclerView.adapter = adapter
    }

    private fun setClickListeners() {
        binding.addNoteFab.setOnClickListener {
            val intent = Intent(this, AddNoteActivity::class.java)
            val options =
                ActivityOptionsCompat.makeSceneTransitionAnimation(
                    this,
                    binding.addNoteFab,
                    "shared_element_end_root",
                )
            startActivity(intent, options.toBundle())
        }
    }

    override fun onOptionsItemSelected(item: MenuItem): Boolean =
        when (item.itemId) {
            android.R.id.home -> {
                onBackPressedDispatcher.onBackPressed()
                true
            }

            else -> {
                true
            }
        }
}


================================================
FILE: app/src/main/java/dev/sergiobelda/samples/materialmotion/notes/NotesAdapter.kt
================================================
/*
 * Copyright 2021 Sergio Belda
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package dev.sergiobelda.samples.materialmotion.notes

import android.view.LayoutInflater
import android.view.ViewGroup
import androidx.recyclerview.widget.RecyclerView
import com.google.android.material.card.MaterialCardView
import dev.sergiobelda.samples.materialmotion.databinding.ItemNoteBinding

class NotesAdapter(
    private val items: List<Note>,
) : RecyclerView.Adapter<NotesAdapter.ViewHolder>() {
    lateinit var noteClickListener: NoteClickListener

    override fun onCreateViewHolder(
        parent: ViewGroup,
        viewType: Int,
    ) = ViewHolder(
        ItemNoteBinding.inflate(
            LayoutInflater.from(parent.context),
            parent,
            false,
        ),
    )

    override fun getItemCount() = items.size

    override fun onBindViewHolder(
        holder: ViewHolder,
        position: Int,
    ) = holder.bind(items[position])

    inner class ViewHolder(
        val binding: ItemNoteBinding,
    ) : RecyclerView.ViewHolder(binding.root) {
        fun bind(note: Note) {
            binding.note = note
            binding.noteCard.transitionName = note.id.toString()
            binding.noteCard.setOnClickListener {
                noteClickListener.onNoteClick(note.id, binding.noteCard)
            }
        }
    }

    interface NoteClickListener {
        fun onNoteClick(
            id: Int,
            noteCard: MaterialCardView,
        )
    }
}


================================================
FILE: app/src/main/java/dev/sergiobelda/samples/materialmotion/planets/PlanetFragment.kt
================================================
/*
 * Copyright 2021 Sergio Belda
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package dev.sergiobelda.samples.materialmotion.planets

import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.databinding.DataBindingUtil
import androidx.fragment.app.Fragment
import dev.sergiobelda.samples.materialmotion.R
import dev.sergiobelda.samples.materialmotion.databinding.PlanetFragmentBinding

private const val ARG_PLANET_ID = "planet_id"

/**
 * A simple [Fragment] subclass.
 * Use the [PlanetFragment.newInstance] factory method to
 * create an instance of this fragment.
 */
class PlanetFragment : Fragment() {
    private lateinit var binding: PlanetFragmentBinding

    private var planetId: Int? = null

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        arguments?.let {
            planetId = it.getInt(ARG_PLANET_ID)
        }
    }

    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?,
    ): View {
        binding = DataBindingUtil.inflate(inflater, R.layout.planet_fragment, container, false)
        binding.lifecycleOwner = viewLifecycleOwner
        return binding.root
    }

    override fun onViewCreated(
        view: View,
        savedInstanceState: Bundle?,
    ) {
        super.onViewCreated(view, savedInstanceState)
        val planet = planets.singleOrNull { it.id == planetId }
        planet?.let {
            binding.planet = it
        }
    }

    companion object {
        /**
         * @param planetId
         * @return A new instance of fragment StepFragment.
         */
        @JvmStatic
        fun newInstance(planetId: Int) =
            PlanetFragment().apply {
                arguments =
                    Bundle().apply {
                        putInt(ARG_PLANET_ID, planetId)
                    }
            }
    }
}


================================================
FILE: app/src/main/java/dev/sergiobelda/samples/materialmotion/planets/Planets.kt
================================================
/*
 * Copyright 2021 Sergio Belda
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

@file:Suppress("ktlint:standard:max-line-length")

package dev.sergiobelda.samples.materialmotion.planets

data class Planet(
    val id: Int,
    val name: String,
    val mainImage: String,
    val description: String,
)

val mercury =
    Planet(
        id = 1,
        name = "Mercury",
        mainImage = "https://solarsystem.nasa.gov/system/resources/detail_files/771_PIA16853.jpg",
        description =
            "The smallest planet in our solar system and nearest to the Sun, Mercury is only slightly larger than Earth's Moon." +
                "\n" +
                "From the surface of Mercury, the Sun would appear more than three times as large as it does when viewed from Earth, and the sunlight would be as much as seven times brighter. Despite its proximity to the Sun, Mercury is not the hottest planet in our solar system – that title belongs to nearby Venus, thanks to its dense atmosphere.",
    )

val venus =
    Planet(
        id = 2,
        name = "Venus",
        mainImage = "https://solarsystem.nasa.gov/system/resources/detail_files/775_PIA00271_detail.jpg",
        description = "Second planet from the Sun and our closest planetary neighbor, Venus is similar in structure and size to Earth, but it is now a very different world. Venus spins slowly in the opposite direction most planets do. Its thick atmosphere traps heat in a runaway greenhouse effect, making it the hottest planet in our solar system—with surface temperatures hot enough to melt lead. Glimpses below the clouds reveal volcanoes and deformed mountains.",
    )

val earth =
    Planet(
        id = 3,
        name = "Earth",
        mainImage = "https://solarsystem.nasa.gov/system/resources/detail_files/2292_as08-14-2383.jpg",
        description =
            "Our home planet is the third planet from the Sun, and the only place we know of so far that’s inhabited by living things." +
                "\n" +
                "While Earth is only the fifth largest planet in the solar system, it is the only world in our solar system with liquid water on the surface. Just slightly larger than nearby Venus, Earth is the biggest of the four planets closest to the Sun, all of which are made of rock and metal.\n" +
                "\n" +
                "The name Earth is at least 1,000 years old. All of the planets, except for Earth, were named after Greek and Roman gods and goddesses. However, the name Earth is a Germanic word, which simply means “the ground.”",
    )

val mars =
    Planet(
        id = 4,
        name = "Mars",
        mainImage = "https://solarsystem.nasa.gov/system/resources/detail_files/948_mars_july18.jpg",
        description =
            "The fourth planet from the Sun, Mars is a dusty, cold, desert world with a very thin atmosphere." +
                "\n" +
                "This dynamic planet has seasons, polar ice caps and weather and canyons and extinct volcanoes, evidence of an even more active past.\n" +
                "\n" +
                "Mars is one of the most explored bodies in our solar system, and it's the only planet where we've sent rovers to roam the alien landscape. NASA currently has three spacecraft in orbit, one rover and one lander on the surface and another rover under construction here on Earth. India and ESA also have spacecraft in orbit above Mars.\n" +
                "\n" +
                "These robotic explorers have found lots of evidence that Mars was much wetter and warmer, with a thicker atmosphere, billions of years ago.",
    )

val jupiter =
    Planet(
        id = 5,
        name = "Jupiter",
        mainImage = "https://solarsystem.nasa.gov/system/resources/detail_files/2486_stsci-h-p1936a_1800.jpg",
        description =
            "Jupiter has a long history surprising scientists—all the way back to 1610 when Galileo Galilei found the first moons beyond Earth. That discovery changed the way we see the universe." +
                "Fifth in line from the Sun, Jupiter is, by far, the largest planet in the solar system – more than twice as massive as all the other planets combined.\n" +
                "\n" +
                "Jupiter's familiar stripes and swirls are actually cold, windy clouds of ammonia and water, floating in an atmosphere of hydrogen and helium. Jupiter’s iconic Great Red Spot is a giant storm bigger than Earth that has raged for hundreds of years.\n" +
                "\n" +
                "One spacecraft — NASA's Juno orbiter — is currently exploring this giant world.",
    )

val saturn =
    Planet(
        id = 6,
        name = "Saturn",
        mainImage = "https://solarsystem.nasa.gov/system/resources/detail_files/2490_stsci-h-p1943a-f_1200.jpg",
        description =
            "Saturn is the sixth planet from the Sun and the second largest planet in our solar system." +
                "\n" +
                "Adorned with thousands of beautiful ringlets, Saturn is unique among the planets. It is not the only planet to have rings—made of chunks of ice and rock—but none are as spectacular or as complicated as Saturn's.\n" +
                "\n" +
                "Like fellow gas giant Jupiter, Saturn is a massive ball made mostly of hydrogen and helium.",
    )

val uranus =
    Planet(
        id = 7,
        name = "Uranus",
        mainImage = "https://solarsystem.nasa.gov/system/resources/detail_files/599_PIA18182.jpg",
        description =
            "The first planet found with the aid of a telescope, Uranus was discovered in 1781 by astronomer William Herschel, although he originally thought it was either a comet or a star." +
                "\n" +
                "It was two years later that the object was universally accepted as a new planet, in part because of observations by astronomer Johann Elert Bode. Herschel tried unsuccessfully to name his discovery Georgium Sidus after King George III. Instead the scientific community accepted Bode's suggestion to name it Uranus, the Greek god of the sky, as suggested by Bode.",
    )

val neptune =
    Planet(
        id = 8,
        name = "Neptune",
        mainImage = "https://solarsystem.nasa.gov/system/resources/detail_files/611_PIA01492.jpg",
        description =
            "Dark, cold and whipped by supersonic winds, ice giant Neptune is the eighth and most distant planet in our solar system." +
                "\n" +
                "More than 30 times as far from the Sun as Earth, Neptune is the only planet in our solar system not visible to the naked eye and the first predicted by mathematics before its discovery. In 2011 Neptune completed its first 165-year orbit since its discovery in 1846.\n" +
                "\n" +
                "NASA's Voyager 2 is the only spacecraft to have visited Neptune up close. It flew past in 1989 on its way out of the solar system.",
    )

val planets = arrayListOf(mercury, venus, earth, mars, jupiter, saturn, uranus, neptune)


================================================
FILE: app/src/main/java/dev/sergiobelda/samples/materialmotion/planets/PlanetsActivity.kt
================================================
/*
 * Copyright 2021 Sergio Belda
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package dev.sergiobelda.samples.materialmotion.planets

import android.os.Bundle
import android.view.MenuItem
import androidx.appcompat.app.AppCompatActivity
import androidx.fragment.app.commit
import androidx.recyclerview.widget.LinearLayoutManager
import com.google.android.material.transition.MaterialSharedAxis
import dev.sergiobelda.samples.materialmotion.R
import dev.sergiobelda.samples.materialmotion.databinding.PlanetsActivityBinding

class PlanetsActivity : AppCompatActivity() {
    private lateinit var binding: PlanetsActivityBinding
    private var selected = 0

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = PlanetsActivityBinding.inflate(layoutInflater)
        setContentView(binding.root)

        setSupportActionBar(binding.toolbar)
        supportActionBar?.setDisplayHomeAsUpEnabled(true)
        supportActionBar?.setDisplayShowTitleEnabled(false)

        val fragment = PlanetFragment.newInstance(planets[selected].id)
        supportFragmentManager.commit {
            add(R.id.fragment_container, fragment, FRAGMENT_TAG)
        }
        setRecyclerView()
    }

    private fun setRecyclerView() {
        val adapter = StepAdapter(planets)
        adapter.stepClickListener =
            object : StepAdapter.StepClickListener {
                override fun onStepClick(position: Int) {
                    val forward = position >= selected
                    selected = position
                    val previousFragment = supportFragmentManager.findFragmentByTag(FRAGMENT_TAG)
                    previousFragment?.exitTransition = buildTransition(forward)
                    val fragment = PlanetFragment.newInstance(planets[selected].id)
                    fragment.enterTransition = buildTransition(forward)
                    supportFragmentManager.commit {
                        replace(R.id.fragment_container, fragment, FRAGMENT_TAG)
                    }
                }
            }
        binding.recyclerView.layoutManager = LinearLayoutManager(this)
        binding.recyclerView.adapter = adapter
    }

    override fun onOptionsItemSelected(item: MenuItem): Boolean =
        when (item.itemId) {
            android.R.id.home -> {
                onBackPressedDispatcher.onBackPressed()
                true
            }

            else -> {
                true
            }
        }

    private fun buildTransition(forward: Boolean) =
        MaterialSharedAxis(MaterialSharedAxis.Y, forward).apply {
            duration = 500
        }

    companion object {
        private const val FRAGMENT_TAG = "PLANET_FRAGMENT"
    }
}


================================================
FILE: app/src/main/java/dev/sergiobelda/samples/materialmotion/planets/StepAdapter.kt
================================================
/*
 * Copyright 2021 Sergio Belda
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package dev.sergiobelda.samples.materialmotion.planets

import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.recyclerview.widget.RecyclerView
import dev.sergiobelda.samples.materialmotion.databinding.ItemStepBinding

class StepAdapter(
    val items: List<Any>,
) : RecyclerView.Adapter<StepAdapter.ViewHolder>() {
    lateinit var stepClickListener: StepClickListener
    private var selected = 0

    override fun onCreateViewHolder(
        parent: ViewGroup,
        viewType: Int,
    ) = ViewHolder(
        ItemStepBinding.inflate(
            LayoutInflater.from(parent.context),
            parent,
            false,
        ),
    )

    override fun getItemCount() = items.size

    override fun onBindViewHolder(
        holder: ViewHolder,
        position: Int,
    ) = holder.bind(position)

    inner class ViewHolder(
        val binding: ItemStepBinding,
    ) : RecyclerView.ViewHolder(binding.root) {
        fun bind(position: Int) {
            if (position == items.size - 1) {
                binding.separator.visibility = View.GONE
            } else {
                binding.separator.visibility = View.VISIBLE
            }
            binding.stepName.isSelected = position == selected
            binding.stepButton.isSelected = position == selected
            binding.stepName.text = position.toString()
            binding.stepButton.setOnClickListener {
                val aux = selected
                selected = position
                stepClickListener.onStepClick(position)
                notifyItemChanged(aux)
                notifyItemChanged(selected)
            }
        }
    }

    interface StepClickListener {
        fun onStepClick(position: Int)
    }
}


================================================
FILE: app/src/main/java/dev/sergiobelda/samples/materialmotion/sample/SampleItem.kt
================================================
/*
 * Copyright 2021 Sergio Belda
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package dev.sergiobelda.samples.materialmotion.sample

import androidx.annotation.StringRes
import dev.sergiobelda.samples.materialmotion.R
import dev.sergiobelda.samples.materialmotion.messages.MessagesActivity
import dev.sergiobelda.samples.materialmotion.music.MusicActivity
import dev.sergiobelda.samples.materialmotion.notes.NotesActivity
import dev.sergiobelda.samples.materialmotion.planets.PlanetsActivity
import dev.sergiobelda.samples.materialmotion.signin.SignInActivity
import dev.sergiobelda.samples.materialmotion.walkthrough.WalkthroughActivity

data class SampleItem(
    @StringRes val nameRes: Int,
    @StringRes val descriptionRes: Int,
    val activity: Class<*>,
)

val messagesSample =
    SampleItem(
        nameRes = R.string.messages,
        descriptionRes = R.string.messages_card_body,
        activity = MessagesActivity::class.java,
    )

val notesSample =
    SampleItem(
        nameRes = R.string.notes,
        descriptionRes = R.string.notes_card_body,
        activity = NotesActivity::class.java,
    )

val walkthroughSample =
    SampleItem(
        nameRes = R.string.walkthrough,
        descriptionRes = R.string.walkthrough_card_body,
        activity = WalkthroughActivity::class.java,
    )

val solarSystemSample =
    SampleItem(
        nameRes = R.string.solar_system,
        descriptionRes = R.string.solar_system_card_body,
        activity = PlanetsActivity::class.java,
    )

val signInSample =
    SampleItem(
        nameRes = R.string.sign_in,
        descriptionRes = R.string.sign_in_card_body,
        activity = SignInActivity::class.java,
    )

val musicSample =
    SampleItem(
        nameRes = R.string.music,
        descriptionRes = R.string.music_card_body,
        activity = MusicActivity::class.java,
    )

val samples =
    arrayListOf(
        messagesSample,
        notesSample,
        walkthroughSample,
        solarSystemSample,
        signInSample,
        musicSample,
    )


================================================
FILE: app/src/main/java/dev/sergiobelda/samples/materialmotion/sample/SamplesAdapter.kt
================================================
/*
 * Copyright 2021 Sergio Belda
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package dev.sergiobelda.samples.materialmotion.sample

import android.view.LayoutInflater
import android.view.ViewGroup
import androidx.recyclerview.widget.RecyclerView
import dev.sergiobelda.samples.materialmotion.databinding.ItemSampleBinding

class SamplesAdapter(
    private val items: List<SampleItem>,
) : RecyclerView.Adapter<SamplesAdapter.ViewHolder>() {
    var listener: OnSampleClickListener? = null

    override fun onCreateViewHolder(
        parent: ViewGroup,
        viewType: Int,
    ) = ViewHolder(
        ItemSampleBinding.inflate(
            LayoutInflater.from(parent.context),
            parent,
            false,
        ),
    )

    override fun getItemCount() = items.size

    override fun onBindViewHolder(
        holder: ViewHolder,
        position: Int,
    ) = holder.bind(items[position])

    inner class ViewHolder(
        val binding: ItemSampleBinding,
    ) : RecyclerView.ViewHolder(binding.root) {
        fun bind(sampleItem: SampleItem) {
            binding.sample = sampleItem
            binding.button.setOnClickListener {
                listener?.onSampleClick(sampleItem)
            }
        }
    }

    interface OnSampleClickListener {
        fun onSampleClick(sampleItem: SampleItem)
    }
}


================================================
FILE: app/src/main/java/dev/sergiobelda/samples/materialmotion/signin/SignInActivity.kt
================================================
/*
 * Copyright 2021 Sergio Belda
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package dev.sergiobelda.samples.materialmotion.signin

import android.os.Bundle
import android.view.Window
import androidx.appcompat.app.AppCompatActivity
import androidx.fragment.app.commit
import dev.sergiobelda.samples.materialmotion.R
import dev.sergiobelda.samples.materialmotion.databinding.SignInActivityBinding

class SignInActivity : AppCompatActivity() {
    private lateinit var binding: SignInActivityBinding

    override fun onCreate(savedInstanceState: Bundle?) {
        window.requestFeature(Window.FEATURE_ACTIVITY_TRANSITIONS)
        super.onCreate(savedInstanceState)
        binding = SignInActivityBinding.inflate(layoutInflater)
        setContentView(binding.root)

        val signInFragment = SignInFragment()
        supportFragmentManager.commit {
            add(R.id.fragment_container, signInFragment)
        }
    }
}


================================================
FILE: app/src/main/java/dev/sergiobelda/samples/materialmotion/signin/SignInFragment.kt
================================================
/*
 * Copyright 2021 Sergio Belda
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package dev.sergiobelda.samples.materialmotion.signin

import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.fragment.app.Fragment
import androidx.fragment.app.commit
import com.google.android.material.transition.MaterialSharedAxis
import dev.sergiobelda.samples.materialmotion.R
import dev.sergiobelda.samples.materialmotion.databinding.SignInFragmentBinding

class SignInFragment : Fragment() {
    private var _binding: SignInFragmentBinding? = null
    private val binding get() = _binding!!

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        exitTransition = buildTransition()
    }

    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?,
    ): View {
        _binding = SignInFragmentBinding.inflate(layoutInflater, container, false)
        return binding.root
    }

    override fun onViewCreated(
        view: View,
        savedInstanceState: Bundle?,
    ) {
        super.onViewCreated(view, savedInstanceState)
        binding.signIn.setOnClickListener {
            val welcomeFragment = WelcomeFragment()
            welcomeFragment.enterTransition = buildTransition()
            parentFragmentManager.commit {
                replace(R.id.fragment_container, welcomeFragment)
            }
        }
    }

    private fun buildTransition() =
        MaterialSharedAxis(MaterialSharedAxis.Z, true).apply {
            duration = 500
        }

    override fun onDestroyView() {
        super.onDestroyView()
        _binding = null
    }
}


================================================
FILE: app/src/main/java/dev/sergiobelda/samples/materialmotion/signin/WelcomeFragment.kt
================================================
/*
 * Copyright 2021 Sergio Belda
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package dev.sergiobelda.samples.materialmotion.signin

import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.fragment.app.Fragment
import androidx.fragment.app.commit
import com.google.android.material.transition.MaterialSharedAxis
import dev.sergiobelda.samples.materialmotion.R
import dev.sergiobelda.samples.materialmotion.databinding.WelcomeFragmentBinding

class WelcomeFragment : Fragment() {
    private var _binding: WelcomeFragmentBinding? = null
    private val binding get() = _binding!!

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        exitTransition = buildTransition()
    }

    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?,
    ): View {
        _binding = WelcomeFragmentBinding.inflate(inflater, container, false)
        return binding.root
    }

    override fun onViewCreated(
        view: View,
        savedInstanceState: Bundle?,
    ) {
        super.onViewCreated(view, savedInstanceState)
        binding.returnButton.setOnClickListener {
            val signInFragment = SignInFragment()
            signInFragment.enterTransition = buildTransition()
            parentFragmentManager.commit {
                replace(R.id.fragment_container, signInFragment)
            }
        }
    }

    private fun buildTransition() =
        MaterialSharedAxis(MaterialSharedAxis.Z, false).apply {
            duration = 500
        }

    override fun onDestroyView() {
        super.onDestroyView()
        _binding = null
    }

    companion object {
        const val TAG = "WelcomeFragment"
    }
}


================================================
FILE: app/src/main/java/dev/sergiobelda/samples/materialmotion/walkthrough/WalkthroughActivity.kt
================================================
/*
 * Copyright 2021 Sergio Belda
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package dev.sergiobelda.samples.materialmotion.walkthrough

import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
import androidx.fragment.app.commit
import androidx.lifecycle.MutableLiveData
import com.google.android.material.transition.MaterialSharedAxis
import dev.sergiobelda.samples.materialmotion.R
import dev.sergiobelda.samples.materialmotion.databinding.WalkthroughActivityBinding

private const val COUNT = 3

class WalkthroughActivity : AppCompatActivity() {
    private lateinit var binding: WalkthroughActivityBinding

    private var selected =
        MutableLiveData<Int>().apply {
            value = 0
        }

    private val titles by lazy {
        arrayListOf(
            getString(R.string.upload_your_photos),
            getString(R.string.share),
            getString(R.string.invite_friends),
        )
    }

    private val bodies by lazy {
        arrayListOf(
            getString(R.string.upload_artistic_photos),
            getString(R.string.share_work_social_networks),
            getString(R.string.enjoy_rewards),
        )
    }

    private val images =
        arrayListOf(
            R.drawable.undraw_drag,
            R.drawable.undraw_social_sharing,
            R.drawable.undraw_winners,
        )

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = WalkthroughActivityBinding.inflate(layoutInflater)
        setContentView(binding.root)

        selected.value?.let {
            val fragment =
                WalkthroughFragment.newInstance(
                    titles[it],
                    bodies[it],
                    images[it],
                )
            supportFragmentManager.commit {
                add(R.id.fragment_container, fragment, FRAGMENT_TAG)
            }
        }

        setDotsTabLayout()
        setClickListeners()
        setSelectedObserver()
    }

    private fun setDotsTabLayout() {
        repeat(COUNT) {
            binding.tabLayout.addTab(binding.tabLayout.newTab())
        }
        binding.tabLayout.touchables.forEach { it.isEnabled = false }
    }

    private fun setClickListeners() {
        binding.backButton.setOnClickListener {
            selected.value?.let {
                selected.value = it - 1
            }
            selectFragment(forward = false)
        }
        binding.nextButton.setOnClickListener {
            selected.value?.let {
                selected.value = it + 1
            }
            selectFragment(forward = true)
        }
    }

    private fun setSelectedObserver() {
        selected.observe(
            this,
            {
                binding.nextButton.isEnabled = it < COUNT - 1
                binding.backButton.isEnabled = it > 0
                binding.tabLayout.apply {
                    selectTab(getTabAt(it))
                }
            },
        )
    }

    private fun selectFragment(forward: Boolean) {
        selected.value?.let {
            val previousFragment = supportFragmentManager.findFragmentByTag(FRAGMENT_TAG)
            previousFragment?.exitTransition = buildTransition(forward)
            val fragment =
                WalkthroughFragment.newInstance(
                    titles[it],
                    bodies[it],
                    images[it],
                )
            fragment.enterTransition = buildTransition(forward)
            supportFragmentManager.commit {
                replace(R.id.fragment_container, fragment, FRAGMENT_TAG)
            }
        }
    }

    private fun buildTransition(forward: Boolean) =
        MaterialSharedAxis(MaterialSharedAxis.X, forward).apply {
            duration = 500
        }

    companion object {
        private const val FRAGMENT_TAG = "WALKTHROUGH_FRAGMENT"
    }
}


================================================
FILE: app/src/main/java/dev/sergiobelda/samples/materialmotion/walkthrough/WalkthroughFragment.kt
================================================
/*
 * Copyright 2021 Sergio Belda
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package dev.sergiobelda.samples.materialmotion.walkthrough

import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.annotation.DrawableRes
import androidx.fragment.app.Fragment
import dev.sergiobelda.samples.materialmotion.databinding.WalkthroughFragmentBinding

private const val ARG_TITLE = "title"
private const val ARG_BODY = "body"
private const val ARG_DRAWABLE_RES = "drawableRes"

/**
 * A simple [Fragment] subclass.
 * Use the [WalkthroughFragment.newInstance] factory method to
 * create an instance of this fragment.
 */
class WalkthroughFragment : Fragment() {
    private var title: String? = null
    private var body: String? = null
    private var drawableRes: Int? = null

    private var _binding: WalkthroughFragmentBinding? = null
    private val binding get() = _binding!!

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        arguments?.let {
            title = it.getString(ARG_TITLE)
            body = it.getString(ARG_BODY)
            drawableRes = it.getInt(ARG_DRAWABLE_RES)
        }
    }

    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?,
    ): View {
        _binding = WalkthroughFragmentBinding.inflate(inflater, container, false)
        return binding.root
    }

    override fun onViewCreated(
        view: View,
        savedInstanceState: Bundle?,
    ) {
        super.onViewCreated(view, savedInstanceState)
        binding.titleTextView.text = title
        binding.bodyTextView.text = body
        drawableRes?.let { binding.imageView.setImageResource(it) }
    }

    override fun onDestroyView() {
        super.onDestroyView()
        _binding = null
    }

    companion object {
        /**
         * Use this factory method to create a new instance of
         * this fragment using the provided parameters.
         *
         * @param body Parameter 1.
         * @param imageRes Parameter 2.
         * @return A new instance of fragment WalkthroughFragment.
         */
        @JvmStatic
        fun newInstance(
            title: String,
            body: String,
            @DrawableRes imageRes: Int,
        ) = WalkthroughFragment().apply {
            arguments =
                Bundle().apply {
                    putString(ARG_TITLE, title)
                    putString(ARG_BODY, body)
                    putInt(ARG_DRAWABLE_RES, imageRes)
                }
        }
    }
}


================================================
FILE: app/src/main/res/color/step_selector.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<!--
     Copyright 2021 Sergio Belda
     Licensed under the Apache License, Version 2.0 (the "License");
     you may not use this file except in compliance with the License.
     You may obtain a copy of the License at
          http://www.apache.org/licenses/LICENSE-2.0
     Unless required by applicable law or agreed to in writing, software
     distributed under the License is distributed on an "AS IS" BASIS,
     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     See the License for the specific language governing permissions and
     limitations under the License.
-->

<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:color="?attr/colorOnPrimary" android:state_selected="true" />
    <item android:color="?attr/colorControlNormal" />
</selector>

================================================
FILE: app/src/main/res/drawable/circle.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<!--
     Copyright 2021 Sergio Belda
     Licensed under the Apache License, Version 2.0 (the "License");
     you may not use this file except in compliance with the License.
     You may obtain a copy of the License at
          http://www.apache.org/licenses/LICENSE-2.0
     Unless required by applicable law or agreed to in writing, software
     distributed under the License is distributed on an "AS IS" BASIS,
     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     See the License for the specific language governing permissions and
     limitations under the License.
-->

<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="oval">

    <solid android:color="?attr/colorPrimary" />

    <size
        android:width="36dp"
        android:height="36dp" />
</shape>

================================================
FILE: app/src/main/res/drawable/ic_baseline_all_inclusive_24.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<!--
     Copyright 2021 Sergio Belda
     Licensed under the Apache License, Version 2.0 (the "License");
     you may not use this file except in compliance with the License.
     You may obtain a copy of the License at
          http://www.apache.org/licenses/LICENSE-2.0
     Unless required by applicable law or agreed to in writing, software
     distributed under the License is distributed on an "AS IS" BASIS,
     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     See the License for the specific language governing permissions and
     limitations under the License.
-->

<vector xmlns:android="http://schemas.android.com/apk/res/android"
    android:width="24dp"
    android:height="24dp"
    android:tint="?attr/colorControlNormal"
    android:viewportWidth="24"
    android:viewportHeight="24">
    <path
        android:fillColor="@android:color/white"
        android:pathData="M18.6,6.62c-1.44,0 -2.8,0.56 -3.77,1.53L12,10.66 10.48,12h0.01L7.8,14.39c-0.64,0.64 -1.49,0.99 -2.4,0.99 -1.87,0 -3.39,-1.51 -3.39,-3.38S3.53,8.62 5.4,8.62c0.91,0 1.76,0.35 2.44,1.03l1.13,1 1.51,-1.34L9.22,8.2C8.2,7.18 6.84,6.62 5.4,6.62 2.42,6.62 0,9.04 0,12s2.42,5.38 5.4,5.38c1.44,0 2.8,-0.56 3.77,-1.53l2.83,-2.5 0.01,0.01L13.52,12h-0.01l2.69,-2.39c0.64,-0.64 1.49,-0.99 2.4,-0.99 1.87,0 3.39,1.51 3.39,3.38s-1.52,3.38 -3.39,3.38c-0.9,0 -1.76,-0.35 -2.44,-1.03l-1.14,-1.01 -1.51,1.34 1.27,1.12c1.02,1.01 2.37,1.57 3.82,1.57 2.98,0 5.4,-2.41 5.4,-5.38s-2.42,-5.37 -5.4,-5.37z" />
</vector>


================================================
FILE: app/src/main/res/drawable/ic_baseline_person_outline_24.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<!--
     Copyright 2021 Sergio Belda
     Licensed under the Apache License, Version 2.0 (the "License");
     you may not use this file except in compliance with the License.
     You may obtain a copy of the License at
          http://www.apache.org/licenses/LICENSE-2.0
     Unless required by applicable law or agreed to in writing, software
     distributed under the License is distributed on an "AS IS" BASIS,
     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     See the License for the specific language governing permissions and
     limitations under the License.
-->

<vector xmlns:android="http://schemas.android.com/apk/res/android"
    android:width="24dp"
    android:height="24dp"
    android:tint="?attr/colorControlNormal"
    android:viewportWidth="24"
    android:viewportHeight="24">
    <path
        android:fillColor="@android:color/white"
        android:pathData="M12,5.9c1.16,0 2.1,0.94 2.1,2.1s-0.94,2.1 -2.1,2.1S9.9,9.16 9.9,8s0.94,-2.1 2.1,-2.1m0,9c2.97,0 6.1,1.46 6.1,2.1v1.1L5.9,18.1L5.9,17c0,-0.64 3.13,-2.1 6.1,-2.1M12,4C9.79,4 8,5.79 8,8s1.79,4 4,4 4,-1.79 4,-4 -1.79,-4 -4,-4zM12,13c-2.67,0 -8,1.34 -8,4v3h16v-3c0,-2.66 -5.33,-4 -8,-4z" />
</vector>


================================================
FILE: app/src/main/res/drawable/ic_baseline_playlist_play_24.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<!--
     Copyright 2021 Sergio Belda
     Licensed under the Apache License, Version 2.0 (the "License");
     you may not use this file except in compliance with the License.
     You may obtain a copy of the License at
          http://www.apache.org/licenses/LICENSE-2.0
     Unless required by applicable law or agreed to in writing, software
     distributed under the License is distributed on an "AS IS" BASIS,
     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     See the License for the specific language governing permissions and
     limitations under the License.
-->

<vector xmlns:android="http://schemas.android.com/apk/res/android"
    android:width="24dp"
    android:height="24dp"
    android:viewportWidth="24"
    android:viewportHeight="24"
    android:tint="?attr/colorControlNormal">
    <path
        android:fillColor="@android:color/white"
        android:pathData="M4,10h12v2L4,12zM4,6h12v2L4,8zM4,14h8v2L4,16zM14,14v6l5,-3z" />
</vector>


================================================
FILE: app/src/main/res/drawable/ic_launcher_background.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<!--
     Copyright 2021 Sergio Belda
     Licensed under the Apache License, Version 2.0 (the "License");
     you may not use this file except in compliance with the License.
     You may obtain a copy of the License at
          http://www.apache.org/licenses/LICENSE-2.0
     Unless required by applicable law or agreed to in writing, software
     distributed under the License is distributed on an "AS IS" BASIS,
     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     See the License for the specific language governing permissions and
     limitations under the License.
-->

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


================================================
FILE: app/src/main/res/drawable/ic_outline_album_24.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<!--
     Copyright 2021 Sergio Belda
     Licensed under the Apache License, Version 2.0 (the "License");
     you may not use this file except in compliance with the License.
     You may obtain a copy of the License at
          http://www.apache.org/licenses/LICENSE-2.0
     Unless required by applicable law or agreed to in writing, software
     distributed under the License is distributed on an "AS IS" BASIS,
     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     See the License for the specific language governing permissions and
     limitations under the License.
-->

<vector xmlns:android="http://schemas.android.com/apk/res/android"
    android:width="24dp"
    android:height="24dp"
    android:viewportWidth="24"
    android:viewportHeight="24"
    android:tint="?attr/colorControlNormal">
    <path
        android:fillColor="@android:color/white"
        android:pathData="M12,2C6.48,2 2,6.48 2,12s4.48,10 10,10 10,-4.48 10,-10S17.52,2 12,2zM12,20c-4.41,0 -8,-3.59 -8,-8s3.59,-8 8,-8 8,3.59 8,8 -3.59,8 -8,8zM12,7.5c-2.49,0 -4.5,2.01 -4.5,4.5s2.01,4.5 4.5,4.5 4.5,-2.01 4.5,-4.5 -2.01,-4.5 -4.5,-4.5zM12,13c-0.55,0 -1,-0.45 -1,-1s0.45,-1 1,-1 1,0.45 1,1 -0.45,1 -1,1z" />
</vector>


================================================
FILE: app/src/main/res/drawable/ic_outline_edit_24.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<!--
     Copyright 2021 Sergio Belda
     Licensed under the Apache License, Version 2.0 (the "License");
     you may not use this file except in compliance with the License.
     You may obtain a copy of the License at
          http://www.apache.org/licenses/LICENSE-2.0
     Unless required by applicable law or agreed to in writing, software
     distributed under the License is distributed on an "AS IS" BASIS,
     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     See the License for the specific language governing permissions and
     limitations under the License.
-->

<vector xmlns:android="http://schemas.android.com/apk/res/android"
    android:width="24dp"
    android:height="24dp"
    android:viewportWidth="24"
    android:viewportHeight="24"
    android:tint="?attr/colorControlNormal">
    <path
        android:fillColor="@android:color/white"
        android:pathData="M14.06,9.02l0.92,0.92L5.92,19L5,19v-0.92l9.06,-9.06M17.66,3c-0.25,0 -0.51,0.1 -0.7,0.29l-1.83,1.83 3.75,3.75 1.83,-1.83c0.39,-0.39 0.39,-1.02 0,-1.41l-2.34,-2.34c-0.2,-0.2 -0.45,-0.29 -0.71,-0.29zM14.06,6.19L3,17.25L3,21h3.75L17.81,9.94l-3.75,-3.75z" />
</vector>


================================================
FILE: app/src/main/res/drawable/ic_outline_play_arrow_24.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<!--
     Copyright 2021 Sergio Belda
     Licensed under the Apache License, Version 2.0 (the "License");
     you may not use this file except in compliance with the License.
     You may obtain a copy of the License at
          http://www.apache.org/licenses/LICENSE-2.0
     Unless required by applicable law or agreed to in writing, software
     distributed under the License is distributed on an "AS IS" BASIS,
     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     See the License for the specific language governing permissions and
     limitations under the License.
-->

<vector xmlns:android="http://schemas.android.com/apk/res/android"
    android:width="24dp"
    android:height="24dp"
    android:viewportWidth="24"
    android:viewportHeight="24"
    android:tint="?attr/colorControlNormal">
    <path
        android:fillColor="@android:color/white"
        android:pathData="M10,8.64L15.27,12 10,15.36V8.64M8,5v14l11,-7L8,5z" />
</vector>


================================================
FILE: app/src/main/res/drawable/ic_round_account_circle_24.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<!--
     Copyright 2021 Sergio Belda
     Licensed under the Apache License, Version 2.0 (the "License");
     you may not use this file except in compliance with the License.
     You may obtain a copy of the License at
          http://www.apache.org/licenses/LICENSE-2.0
     Unless required by applicable law or agreed to in writing, software
     distributed under the License is distributed on an "AS IS" BASIS,
     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     See the License for the specific language governing permissions and
     limitations under the License.
-->

<vector xmlns:android="http://schemas.android.com/apk/res/android"
    android:width="24dp"
    android:height="24dp"
    android:viewportWidth="24"
    android:viewportHeight="24"
    android:tint="?attr/colorControlNormal">
    <path
        android:fillColor="@android:color/white"
        android:pathData="M12,2C6.48,2 2,6.48 2,12s4.48,10 10,10 10,-4.48 10,-10S17.52,2 12,2zM12,5c1.66,0 3,1.34 3,3s-1.34,3 -3,3 -3,-1.34 -3,-3 1.34,-3 3,-3zM12,19.2c-2.5,0 -4.71,-1.28 -6,-3.22 0.03,-1.99 4,-3.08 6,-3.08 1.99,0 5.97,1.09 6,3.08 -1.29,1.94 -3.5,3.22 -6,3.22z" />
</vector>


================================================
FILE: app/src/main/res/drawable/ic_round_add_24.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<!--
     Copyright 2021 Sergio Belda
     Licensed under the Apache License, Version 2.0 (the "License");
     you may not use this file except in compliance with the License.
     You may obtain a copy of the License at
          http://www.apache.org/licenses/LICENSE-2.0
     Unless required by applicable law or agreed to in writing, software
     distributed under the License is distributed on an "AS IS" BASIS,
     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     See the License for the specific language governing permissions and
     limitations under the License.
-->

<vector xmlns:android="http://schemas.android.com/apk/res/android"
    android:width="24dp"
    android:height="24dp"
    android:viewportWidth="24"
    android:viewportHeight="24"
    android:tint="?attr/colorControlNormal">
    <path
        android:fillColor="@android:color/white"
        android:pathData="M18,13h-5v5c0,0.55 -0.45,1 -1,1s-1,-0.45 -1,-1v-5H6c-0.55,0 -1,-0.45 -1,-1s0.45,-1 1,-1h5V6c0,-0.55 0.45,-1 1,-1s1,0.45 1,1v5h5c0.55,0 1,0.45 1,1s-0.45,1 -1,1z" />
</vector>


================================================
FILE: app/src/main/res/drawable/ic_round_clear_24.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<!--
     Copyright 2021 Sergio Belda
     Licensed under the Apache License, Version 2.0 (the "License");
     you may not use this file except in compliance with the License.
     You may obtain a copy of the License at
          http://www.apache.org/licenses/LICENSE-2.0
     Unless required by applicable law or agreed to in writing, software
     distributed under the License is distributed on an "AS IS" BASIS,
     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     See the License for the specific language governing permissions and
     limitations under the License.
-->

<vector xmlns:android="http://schemas.android.com/apk/res/android"
    android:width="24dp"
    android:height="24dp"
    android:viewportWidth="24"
    android:viewportHeight="24"
    android:tint="?attr/colorControlNormal">
    <path
        android:fillColor="@android:color/white"
        android:pathData="M18.3,5.71c-0.39,-0.39 -1.02,-0.39 -1.41,0L12,10.59 7.11,5.7c-0.39,-0.39 -1.02,-0.39 -1.41,0 -0.39,0.39 -0.39,1.02 0,1.41L10.59,12 5.7,16.89c-0.39,0.39 -0.39,1.02 0,1.41 0.39,0.39 1.02,0.39 1.41,0L12,13.41l4.89,4.89c0.39,0.39 1.02,0.39 1.41,0 0.39,-0.39 0.39,-1.02 0,-1.41L13.41,12l4.89,-4.89c0.38,-0.38 0.38,-1.02 0,-1.4z" />
</vector>


================================================
FILE: app/src/main/res/drawable/ic_round_person_24.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<!--
     Copyright 2021 Sergio Belda
     Licensed under the Apache License, Version 2.0 (the "License");
     you may not use this file except in compliance with the License.
     You may obtain a copy of the License at
          http://www.apache.org/licenses/LICENSE-2.0
     Unless required by applicable law or agreed to in writing, software
     distributed under the License is distributed on an "AS IS" BASIS,
     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     See the License for the specific language governing permissions and
     limitations under the License.
-->

<vector xmlns:android="http://schemas.android.com/apk/res/android"
    android:width="24dp"
    android:height="24dp"
    android:viewportWidth="24"
    android:viewportHeight="24"
    android:tint="?attr/colorControlNormal">
    <path
        android:fillColor="@android:color/white"
        android:pathData="M12,12c2.21,0 4,-1.79 4,-4s-1.79,-4 -4,-4 -4,1.79 -4,4 1.79,4 4,4zM12,14c-2.67,0 -8,1.34 -8,4v1c0,0.55 0.45,1 1,1h14c0.55,0 1,-0.45 1,-1v-1c0,-2.66 -5.33,-4 -8,-4z" />
</vector>


================================================
FILE: app/src/main/res/drawable/ic_round_save_24.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<!--
     Copyright 2021 Sergio Belda
     Licensed under the Apache License, Version 2.0 (the "License");
     you may not use this file except in compliance with the License.
     You may obtain a copy of the License at
          http://www.apache.org/licenses/LICENSE-2.0
     Unless required by applicable law or agreed to in writing, software
     distributed under the License is distributed on an "AS IS" BASIS,
     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     See the License for the specific language governing permissions and
     limitations under the License.
-->

<vector xmlns:android="http://schemas.android.com/apk/res/android"
    android:width="24dp"
    android:height="24dp"
    android:viewportWidth="24"
    android:viewportHeight="24"
    android:tint="?attr/colorControlNormal">
    <path
        android:fillColor="@android:color/white"
        android:pathData="M17.59,3.59c-0.38,-0.38 -0.89,-0.59 -1.42,-0.59L5,3c-1.11,0 -2,0.9 -2,2v14c0,1.1 0.9,2 2,2h14c1.1,0 2,-0.9 2,-2L21,7.83c0,-0.53 -0.21,-1.04 -0.59,-1.41l-2.82,-2.83zM12,19c-1.66,0 -3,-1.34 -3,-3s1.34,-3 3,-3 3,1.34 3,3 -1.34,3 -3,3zM13,9L7,9c-1.1,0 -2,-0.9 -2,-2s0.9,-2 2,-2h6c1.1,0 2,0.9 2,2s-0.9,2 -2,2z" />
</vector>


================================================
FILE: app/src/main/res/drawable/step_selector.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<!--
     Copyright 2021 Sergio Belda
     Licensed under the Apache License, Version 2.0 (the "License");
     you may not use this file except in compliance with the License.
     You may obtain a copy of the License at
          http://www.apache.org/licenses/LICENSE-2.0
     Unless required by applicable law or agreed to in writing, software
     distributed under the License is distributed on an "AS IS" BASIS,
     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     See the License for the specific language governing permissions and
     limitations under the License.
-->

<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@drawable/circle" android:state_selected="true" />
</selector>

================================================
FILE: app/src/main/res/drawable/tab_dot.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<!--
     Copyright 2021 Sergio Belda
     Licensed under the Apache License, Version 2.0 (the "License");
     you may not use this file except in compliance with the License.
     You may obtain a copy of the License at
          http://www.apache.org/licenses/LICENSE-2.0
     Unless required by applicable law or agreed to in writing, software
     distributed under the License is distributed on an "AS IS" BASIS,
     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     See the License for the specific language governing permissions and
     limitations under the License.
-->

<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="ring"
    android:innerRadius="0dp"
    android:thickness="4dp"
    android:useLevel="false">
    <size android:height="8dp" />
</shape>

================================================
FILE: app/src/main/res/drawable/tab_dot_background.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<!--
     Copyright 2021 Sergio Belda
     Licensed under the Apache License, Version 2.0 (the "License");
     you may not use this file except in compliance with the License.
     You may obtain a copy of the License at
          http://www.apache.org/licenses/LICENSE-2.0
     Unless required by applicable law or agreed to in writing, software
     distributed under the License is distributed on an "AS IS" BASIS,
     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     See the License for the specific language governing permissions and
     limitations under the License.
-->

<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:innerRadius="0dp"
    android:shape="ring"
    android:thickness="3dp"
    android:useLevel="false">
    <solid android:color="?attr/colorControlHighlight" />
</shape>

================================================
FILE: app/src/main/res/drawable/undraw_celebration.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<!--
     Copyright 2021 Sergio Belda
     Licensed under the Apache License, Version 2.0 (the "License");
     you may not use this file except in compliance with the License.
     You may obtain a copy of the License at
          http://www.apache.org/licenses/LICENSE-2.0
     Unless required by applicable law or agreed to in writing, software
     distributed under the License is distributed on an "AS IS" BASIS,
     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     See the License for the specific language governing permissions and
     limitations under the License.
-->

<vector xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:aapt="http://schemas.android.com/aapt"
    android:width="949.8dp"
    android:height="661.52dp"
    android:viewportWidth="949.8"
    android:viewportHeight="661.52">
    <path
        android:pathData="M95.13,66.03m-46.49,0a46.49,46.49 0,1 1,92.98 0a46.49,46.49 0,1 1,-92.98 0"
        android:fillColor="#0099bf" />
    <path
        android:pathData="M89.45,160.67C108.97,204.76 84.07,255.53 54.76,293.76c-9.81,12.82 -20.64,26.26 -22,42.34 -1.64,19.67 11.68,37.75 27.48,49.57 28.82,21.54 68.18,28.2 102.48,17.33 29.64,-9.39 54.56,-30.6 84.46,-39.15 50,-14.32 103,9.42 145.82,39C423.31,423.76 455.77,449.24 492.31,444.76c25.71,-3.15 47.53,-21.2 62.34,-42.45 7.15,-10.26 13.37,-21.76 23.78,-28.68 6.19,-4.12 13.46,-6.3 20.73,-7.86 66.39,-14.19 136.85,20.44 202.36,2.63 44.25,-12 79.53,-47 101.47,-87.27s32.18,-85.74 40.71,-130.79c6.06,-32 11.09,-66.57 -2.84,-96 -14.74,-31.16 -48.86,-50.05 -83.15,-53.59S789.03,6.98 757.44,20.76c-39.47,17.26 -78.16,41.42 -121.24,41.5 -29.34,0.06 -57.32,-11.2 -85.37,-19.79 -46.9,-14.35 -95.67,-21.48 -144.27,-28.06 -46.53,-6.3 -93.52,-12.16 -140.33,-8.44 -33.12,2.63 -62.37,15.29 -94.51,21.15 -20.95,3.82 -42,1 -62.56,7.4 -25.32,7.92 -51.36,26.27 -52.76,55.17C55.08,117.2 79.1,137.28 89.45,160.67Z"
        android:strokeAlpha="0.1"
        android:fillColor="#0099bf"
        android:fillAlpha="0.1" />
    <path android:pathData="M601.9,199.93c-4.27,-11.13 -15.28,-37.29 -22.53,-32.1 -9.16,6.56 9.16,35.54 9.16,35.54 0.52,5.32 -9.78,16.39 -15.3,21.91 0,-0.44 0,-0.69 0,-0.69a2.4,2.4 0,0 1,-0.24 0.6l-0.46,-0.25a3,3 0,0 1,-0.65 1.19c0,-0.75 -0.05,-1.19 -0.05,-1.19 -1.06,4.49 -19.56,10.18 -19.56,10.18s-0.5,0 -1.36,0c-5.14,0 -18.52,-1.16 -24.72,-11.08a54.86,54.86 0,0 0,-12.13 -14.15,10.33 10.33,0 0,0 -5.75,-2.18c-17.13,-1.1 -31,-9.77 -33.77,-11.62l-0.51,-0.35 -0.11,0.32c-0.65,-0.93 -1.28,-1.92 -1.87,-2.94l0,0 -0.3,-0.55a25.12,25.12 0,0 0,13.85 -22.34c0,-0.17 0,-0.35 0,-0.52a17.11,17.11 0,0 0,2.3 -8.57v-3l3.91,-3.48c1.79,-1.59 3.64,-3.27 4.55,-5.46a6.47,6.47 0,0 0,0.48 -2.8,4.85 4.85,0 0,0 -1.84,-4.34c-3,-2.07 -8,0 -10.17,-2.88 -1,-1.3 -0.82,-3.07 -1.31,-4.6 -1,-3.11 -4.6,-4.79 -7.93,-4.84s-6.52,1.16 -9.72,2.07a57.07,57.07 0,0 1,-20.7 1.94,13.52 13.52,0 0,0 -5.67,0.2 7.81,7.81 0,0 0,-4.6 5.35,12.57 12.57,0 0,0 -0.44,2.74 17.24,17.24 0,0 0,-4.34 11.41v7.69a17.23,17.23 0,0 0,4.15 11.19,25 25,0 0,0 10.47,18.24q0,0.3 0,0.61l0.13,0.08a41.35,41.35 0,0 1,-1.1 7.07l0,-0.51s-14,7.45 -29,7.63h-1.65a11.17,11.17 0,0 0,-8 3c-4.44,4.18 -12.22,10.79 -17,10.79 -1,0 -26.24,4.93 -30.42,5.75l-7.81,-7.65 -0.24,0.45 -0.46,-0.45a19,19 0,0 0,-2.54 0.37c-4,-4.74 -12,-15.76 -13.85,-30.55 0,0 17.27,-19.67 10.92,-38 -5.42,-15.62 -20.35,17.86 -24.59,27.95a8.06,8.06 0,0 0,-0.26 5.55L332.9,227.88a21.21,21.21 0,0 0,-1.11 11l-0.16,0 10.22,13.11s7.69,3.28 19.72,3.22a68.94,68.94 0,0 0,25.74 -4.94h2.37l-0.45,0.17L401.4,250.44l7.74,23.41c-0.26,2.13 -4,31.86 -7,38.51a16.71,16.71 0,0 0,-1.18 7,53.44 53.44,0 0,0 2.23,13.55l6.78,-0.25 -0.26,0.53c-5.74,11.77 -15.33,32.74 -21,52.34l-9.87,20 7.4,89.7h0l0.3,0h0l0.57,0.09h0c0.8,0.12 2,0.3 3.58,0.5l-0.58,1 -16.31,27s-11.63,23.81 14.1,19.32c0,0 9.51,-2.76 13.39,-19l16.92,-15.87s0.79,-10.54 -4,-14.75c-0.3,-4.87 -1.06,-19.09 0.11,-22.51 1.41,-4.14 -6,-51.75 -6,-51.75s26.78,-55.55 43,-56.93a8.89,8.89 0,0 1,3.51 0.46c13.33,4.34 29.48,36.57 34.23,46.6l0,0 0.22,0.46 0,0.09 0.18,0.39 0,0.11 0.16,0.34 0,0.09 0.14,0.31 0,0.07 0.12,0.25 0,0.1 0.09,0.19 0,0.08 0.06,0.14 0,0.08 0,0.09h0l0.05,0.12 2.11,62.45h0l0,0h0l0.21,0.11h0l0.1,0 -0.18,1.29 -0.92,6.45s11.63,24.5 10.92,27.6 7.75,15.53 19.73,12.08S526.9,499.38 526.9,499.38l-11.54,-23.78 -0.51,-1.06a22.68,22.68 0,0 0,3.24 -2.41s-3.52,-25.53 0,-31.05 4.58,-30.71 4.58,-30.71 -2.47,-17.25 -6.7,-24.84l-17.72,-63.25c5.31,4.94 9.44,6.87 12.89,6.74h0.57a8.61,8.61 0,0 0,4.34 -1.08,12.23 12.23,0 0,0 2,-1.41 3.16,3.16 0,0 0,0.33 -0.33l0,0c4.93,-4.14 -5.64,-20.36 -11.63,-30 -5.77,-9.3 2.18,-34.57 2.78,-36.45a9.54,9.54 0,0 1,1.71 -1,10.55 10.55,0 0,1 3.92,-0.85c5.74,0.2 12.8,3.5 21.54,5.16a101.62,101.62 0,0 0,18.39 1.43h0.36c2.45,0 4.67,-0.05 6.47,-0.12a10.93,10.93 0,0 0,4.7 -1.27h0a14.19,14.19 0,0 0,3.34 -2.7l15.34,-17.33 -0.4,0.19a8.62,8.62 0,0 0,0 -6.1l16.21,-28A10.65,10.65 0,0 0,601.9 199.93Z">
        <aapt:attr name="android:fillColor">
            <gradient
                android:startY="543.76"
                android:startX="460.5"
                android:endY="129.76001"
                android:endX="460.5"
                android:type="linear">
                <item
                    android:offset="0"
                    android:color="#3F808080" />
                <item
                    android:offset="0.54"
                    android:color="#1E808080" />
                <item
                    android:offset="1"
                    android:color="#19808080" />
            </gradient>
        </aapt:attr>
    </path>
    <path
        android:pathData="M419.78,505.9l-16.33,15.65c-3.74,16 -12.93,18.71 -12.93,18.71 -24.83,4.42 -13.61,-19 -13.61,-19l15.75,-26.65 1.94,-3.29s11.23,-3.4 18.71,-1.36a6.4,6.4 0,0 1,2.55 1.38C420.55,495.41 419.78,505.9 419.78,505.9Z"
        android:fillColor="#444176" />
    <path
        android:pathData="M520.47,519.85c-11.57,3.4 -19.73,-8.84 -19,-11.91S490.9,480.76 490.9,480.76l0.88,-6.36 0.82,-5.89 19,1.36 1.79,3.76 11.14,23.45S532.04,516.45 520.47,519.85Z"
        android:fillColor="#444176" />
    <path
        android:fillColor="#FF000000"
        android:pathData="M416.04,494c-1.79,3.07 -16.3,1.52 -23.37,0.56l1.94,-3.29s11.23,-3.4 18.71,-1.36a6.4,6.4 0,0 1,2.55 1.38C415.97,492.95 416.04,494 416.04,494Z"
        android:strokeAlpha="0.1"
        android:fillAlpha="0.1" />
    <path
        android:fillColor="#FF000000"
        android:pathData="M513.41,473.61c-9.73,6.48 -20.09,1.58 -21.65,0.77l0.82,-5.89 19,1.36Z"
        android:strokeAlpha="0.1"
        android:fillAlpha="0.1" />
    <path
        android:pathData="M516.05,439.57c-3.4,5.44 0,30.62 0,30.62 -11.23,10.21 -24.49,2.72 -24.49,2.72l-2,-61.57s-22.11,-50.69 -37.76,-49.33 -41.5,56.13 -41.5,56.13 7.14,46.94 5.78,51 0,23.81 0,23.81c-2.38,4.08 -27.21,0 -27.21,0l-7.14,-88.45L391.21,384.76c5.45,-19.32 14.71,-40 20.25,-51.6 2.75,-5.77 4.59,-9.29 4.59,-9.29l18.1,-3.77L492.9,307.92 514.01,384.76c4.08,7.48 6.46,24.49 6.46,24.49S519.45,434.13 516.05,439.57Z"
        android:fillColor="#565387" />
    <path
        android:fillColor="#FF000000"
        android:pathData="M497,472.91l-2,-61.57s-22.11,-50.69 -37.76,-49.33a8.52,8.52 0,0 0,-2.05 0.46c15.26,5.07 34.37,48.87 34.37,48.87l2,61.57a24,24 0,0 0,13.53 2.47A24.07,24.07 0,0 1,497 472.91Z"
        android:strokeAlpha="0.1"
        android:fillAlpha="0.1" />
    <path
        android:fillColor="#FF000000"
        android:pathData="M394.27,492.98l-7.14,-88.45L396.65,384.76c5.45,-19.32 14.71,-40 20.25,-51.6 2.75,-5.77 4.59,-9.29 4.59,-9.29l18.1,-3.77 53.63,-11.15 -0.29,-1.07 -58.78,12.22 -18.1,3.77s-1.84,3.52 -4.59,9.29C405.9,344.76 396.66,365.48 391.21,384.76l-9.52,19.73 7.14,88.45s13.56,2.23 21.6,1.74A160.66,160.66 0,0 1,394.27 492.98Z"
        android:strokeAlpha="0.1"
        android:fillAlpha="0.1" />
    <path
        android:pathData="M352.9,218.97s-19.39,1 -16.67,21.43l5.44,0.68 8.16,-8.84 4.08,-7.48v-1.7Z"
        android:fillColor="#ced2df" />
    <path
        android:fillColor="#FF000000"
        android:pathData="M352.9,218.97s-19.39,1 -16.67,21.43l5.44,0.68 8.16,-8.84 4.08,-7.48v-1.7Z"
        android:strokeAlpha="0.1"
        android:fillAlpha="0.1" />
    <path
        android:pathData="M568.61,226.45s16,8.5 11.91,18.37l-5.1,2 -6.8,-3.74 -1,-8.84 0.68,-6.12Z"
        android:fillColor="#ced2df" />
    <path
        android:fillColor="#FF000000"
        android:pathData="M568.61,226.45s16,8.5 11.91,18.37l-5.1,2 -6.8,-3.74 -1,-8.84 0.68,-6.12Z"
        android:strokeAlpha="0.1"
        android:fillAlpha="0.1" />
    <path
        android:pathData="M452.27,138.68L465.88,138.68A21.09,21.09 0,0 1,486.97 159.77L486.97,159.77A21.09,21.09 0,0 1,465.88 180.86L452.27,180.86A21.09,21.09 0,0 1,431.18 159.77L431.18,159.77A21.09,21.09 0,0 1,452.27 138.68z"
        android:fillColor="#88455e" />
    <path
        android:pathData="M352.77,221.86l-11.91,19 -1,-3.38L323.68,184.76a8.11,8.11 0,0 1,0.25 -5.47c4.09,-9.94 18.51,-43 23.74,-27.55 6.12,18 -10.55,37.42 -10.55,37.42 1.9,15.76 10.75,27.18 14.23,31.14C352.23,221.33 352.77,221.86 352.77,221.86Z"
        android:fillColor="#ec8c9c" />
    <path
        android:pathData="M566.06,230.02s18.71,-17.69 18,-24.83c0,0 -17.69,-28.57 -8.84,-35 7,-5.12 17.63,20.68 21.75,31.65a10.7,10.7 0,0 1,-0.71 9L573.9,250.43Z"
        android:fillColor="#ec8c9c" />
    <path
        android:pathData="M444.95,180.7s3.4,21.77 -6.46,29.94S466.73,218.76 466.73,218.76l13.61,-12.59s-15.65,-14.63 -10.89,-25.51Z"
        android:fillColor="#ec8c9c" />
    <path
        android:fillColor="#FF000000"
        android:pathData="M444.27,205.53s14.63,10.89 29.25,-1.36l23.81,49.33 -1.36,60.21s-49.33,25.51 -69.74,9.87 -3.4,-23.81 -3.4,-23.81l-4.76,-46.26 5.1,-29.94s9.18,-14.29 9.87,-14.29S444.27,205.53 444.27,205.53Z"
        android:strokeAlpha="0.1"
        android:fillAlpha="0.1" />
    <path
        android:pathData="M444.27,204.85S458.9,215.76 473.53,203.49l23.81,49.33 -1.36,60.21s-49.33,25.51 -69.74,9.87 -3.4,-23.81 -3.4,-23.81l-4.76,-46.26 5.1,-29.94s9.18,-14.29 9.87,-14.29S444.27,204.85 444.27,204.85Z"
        android:fillColor="#ebf1f6" />
    <path
        android:fillColor="#FF000000"
        android:pathData="M444.27,199.76s-13.87,7.9 -28.93,7.51a10.66,10.66 0,0 0,-7.69 2.94c-4.29,4.12 -11.8,10.64 -16.45,10.64 -1,0 -29.94,5.78 -29.94,5.78l-7.65,-7.65s-11.4,22.28 -16.84,21.26l9.87,12.93s18.71,8.16 43.2,-1.7h14.29l7.48,23.13s-3.74,31.3 -6.8,38.1 1,20.07 1,20.07l26.87,-1s1.36,-13.27 3.4,-15 -7.14,-60.21 -7.14,-60.21 -6.12,-33 16.33,-44.9Z"
        android:strokeAlpha="0.1"
        android:fillAlpha="0.1" />
    <path
        android:fillColor="#FF000000"
        android:pathData="M434.14,320.14a88.81,88.81 0,0 0,-2.11 12.27l-20.57,0.78c2.75,-5.77 4.59,-9.29 4.59,-9.29Z"
        android:strokeAlpha="0.1"
        android:fillAlpha="0.1" />
    <path
        android:fillColor="#FF000000"
        android:pathData="M352.77,221.86l-11.91,19 -1,-3.38c4.37,-4.34 9.49,-13.41 11.53,-17.19C352.23,221.33 352.77,221.86 352.77,221.86Z"
        android:strokeAlpha="0.1"
        android:fillAlpha="0.1" />
    <path
        android:pathData="M444.27,199.76s-14.56,7.9 -29.61,7.51a10.66,10.66 0,0 0,-7.69 2.94c-4.29,4.12 -11.8,10.64 -16.45,10.64 -1,0 -29.94,5.78 -29.94,5.78L352.9,218.97s-11.4,22.28 -16.84,21.26l9.87,12.93s18.71,8.16 43.2,-1.7h14.29L410.9,274.58s-3.74,31.3 -6.8,38.1 1,20.07 1,20.07l26.87,-1s1.36,-13.27 3.4,-15 -7.14,-60.21 -7.14,-60.21 -6.12,-33 16.33,-44.9Z"
        android:fillColor="#ced2df" />
    <path
        android:fillColor="#FF000000"
        android:pathData="M473.53,197.7s13.88,10.58 32.41,11.8a9.85,9.85 0,0 1,5.55 2.15,53.72 53.72,0 0,1 11.71,14c7.48,12.25 25.85,10.89 25.85,10.89s17.86,-5.61 18.88,-10c0,0 0.51,24 11.74,18.2L564.9,261.76a10.42,10.42 0,0 1,-7.45 3.59c-5.55,0.22 -15.19,0.29 -23.33,-1.29 -12.25,-2.38 -21.09,-8.16 -27.55,-3.06 0,0 -8.5,26.53 -2.72,36.06s16,25.51 11.23,29.6 -10.55,3.74 -20.07,-6.12 -10.55,-26.53 -10.55,-26.53l2.38,-42.86s-9.18,-32.32 -18,-38.78Z"
        android:strokeAlpha="0.1"
        android:fillAlpha="0.1" />
    <path
        android:fillColor="#FF000000"
        android:pathData="M581.02,244.31l-14.81,17.09a10.41,10.41 0,0 1,-3.57 2.66h0a10.37,10.37 0,0 1,-3.86 0.91c-5.55,0.23 -15.19,0.3 -23.33,-1.29 -11.46,-2.23 -19.94,-7.43 -26.28,-3.92a9.3,9.3 0,0 0,-1.28 0.85s-8.5,26.53 -2.72,36.06 16,25.51 11.23,29.6a11,11 0,0 1,-2.66 1.73c-4.28,1.93 -9.59,0.26 -17.41,-7.85 -9.52,-9.87 -10.55,-26.53 -10.55,-26.53L488.16,250.76s-9.18,-32.32 -18,-38.78l3.89,-13.95c2.68,1.82 16.06,10.37 32.6,11.46a9.85,9.85 0,0 1,5.55 2.15,53.76 53.76,0 0,1 11.71,14c7.48,12.25 25.85,10.89 25.85,10.89a99.27,99.27 0,0 0,12.87 -5.12l0,0c2.61,-1.28 4.91,-2.68 6,-4a3,3 0,0 0,0.65 -1.2S569.8,250.09 581.02,244.31Z"
        android:strokeAlpha="0.1"
        android:fillAlpha="0.1" />
    <path
        android:pathData="M580.34,244.65 L565.54,261.76a10.41,10.41 0,0 1,-2.88 2.32h0a10.38,10.38 0,0 1,-4.54 1.25c-5.55,0.23 -15.19,0.3 -23.33,-1.29 -11.05,-2.15 -19.34,-7.07 -25.59,-4.26a9.25,9.25 0,0 0,-2 1.19s-8.5,26.53 -2.72,36.06 16,25.51 11.23,29.6a11.8,11.8 0,0 1,-2 1.39c-4.4,2.43 -9.84,1 -18.09,-7.51 -9.52,-9.87 -10.55,-26.53 -10.55,-26.53l2.38,-42.86s-9.18,-32.32 -18,-38.78l4.08,-14.63 0.49,0.34c2.68,1.82 16.06,10.37 32.6,11.46a9.85,9.85 0,0 1,5.55 2.15,53.76 53.76,0 0,1 11.71,14c7.48,12.25 25.85,10.89 25.85,10.89a99.27,99.27 0,0 0,12.87 -5.12l0,0c3.09,-1.58 5.61,-3.31 6,-4.89 0,0 0,0.31 0,0.86C568.9,231.53 570.4,249.76 580.34,244.65Z"
        android:fillColor="#ced2df" />
    <path
        android:fillColor="#FF000000"
        android:pathData="M469.75,181.21h-25a61.18,61.18 0,0 1,0.47 12,25.7 25.7,0 0,0 26.42,1.9C469.24,190.67 467.78,185.63 469.75,181.21Z"
        android:strokeAlpha="0.1"
        android:fillAlpha="0.1" />
    <path
        android:pathData="M459.92,172.53m-24.83,0a24.83,24.83 0,1 1,49.66 0a24.83,24.83 0,1 1,-49.66 0"
        android:fillColor="#ec8c9c" />
    <path
        android:fillColor="#FF000000"
        android:pathData="M454.76,168.11c2.77,-0.33 5.54,-1.31 8.27,-0.76 2.48,0.5 4.59,2.21 7.07,2.73 4.78,1 9.22,-2.52 12.83,-5.8l7.8,-7.1c1.73,-1.57 3.51,-3.22 4.4,-5.38s0.58,-5 -1.32,-6.36c-2.85,-2 -7.76,0 -9.82,-2.84 -0.93,-1.28 -0.79,-3 -1.27,-4.53 -1,-3.06 -4.44,-4.73 -7.66,-4.77s-6.3,1.14 -9.38,2a54,54 0,0 1,-20 1.91,12.78 12.78,0 0,0 -5.47,0.19 7.65,7.65 0,0 0,-4.44 5.27c-1.54,5.44 1.09,14.21 3.73,19.08S449.49,168.76 454.76,168.11Z"
        android:strokeAlpha="0.1"
        android:fillAlpha="0.1" />
    <path
        android:pathData="M454.76,167.43c2.77,-0.33 5.54,-1.31 8.27,-0.76 2.48,0.5 4.59,2.21 7.07,2.73 4.78,1 9.22,-2.52 12.83,-5.8l7.8,-7.1c1.73,-1.57 3.51,-3.22 4.4,-5.38s0.58,-5 -1.32,-6.36c-2.85,-2 -7.76,0 -9.82,-2.84 -0.93,-1.28 -0.79,-3 -1.27,-4.53 -1,-3.06 -4.44,-4.73 -7.66,-4.77s-6.3,1.14 -9.38,2a54,54 0,0 1,-20 1.91,12.78 12.78,0 0,0 -5.47,0.19 7.65,7.65 0,0 0,-4.44 5.27c-1.54,5.44 1.09,14.21 3.73,19.08S449.49,168.03 454.76,167.43Z"
        android:fillColor="#88455e" />
    <path
        android:fillColor="#FF000000"
        android:pathData="M411.45,274.76s5.44,0.68 8.16,4.08 7.48,4.42 7.48,4.42"
        android:strokeAlpha="0.1"
        android:fillAlpha="0.1" />
    <path
        android:fillColor="#FF000000"
        android:pathData="M362.46,229.85S366.9,239.76 364.16,240.76s-1.7,8.16 -1.7,8.16"
        android:strokeAlpha="0.1"
        android:fillAlpha="0.1" />
    <path
        android:fillColor="#FF000000"
        android:pathData="M363.99,226.45S392.9,220.67 393.9,220.67c4.66,0 12.16,-6.52 16.45,-10.64a10.5,10.5 0,0 1,4.66 -2.59h-0.37a10.66,10.66 0,0 0,-7.69 2.94c-4.29,4.12 -11.8,10.64 -16.45,10.64 -0.81,0 -19.31,3.67 -26.82,5.16Z"
        android:strokeAlpha="0.1"
        android:fillAlpha="0.1" />
    <path
        android:fillColor="#FF000000"
        android:pathData="M444.31,201.19l0,-1.27a72.18,72.18 0,0 1,-22.16 7.09A68.48,68.48 0,0 0,444.31 201.19Z"
        android:strokeAlpha="0.1"
        android:fillAlpha="0.1" />
    <path
        android:fillColor="#FF000000"
        android:pathData="M408.56,332.58s-4.08,-13.27 -1,-20.07 6.8,-38.1 6.8,-38.1L406.9,251.28L392.57,251.28l-0.87,0.34h11.75L410.9,274.76s-3.74,31.3 -6.8,38.1 1,20.07 1,20.07l26.87,-1 0,-0.21Z"
        android:strokeAlpha="0.1"
        android:fillAlpha="0.1" />
    <path
        android:fillColor="#FF000000"
        android:pathData="M516.05,321.19a11.8,11.8 0,0 1,-2 1.39c-4.4,2.43 -9.84,1 -18.09,-7.51 -7.56,-7.83 -9.76,-20 -10.35,-24.61l-0.2,3.52s1,16.67 10.55,26.53c8.25,8.54 13.69,9.94 18.09,7.51a11.8,11.8 0,0 0,2 -1.39c1.43,-1.23 1.51,-3.54 0.76,-6.42A3.15,3.15 0,0 1,516.05 321.19Z"
        android:strokeAlpha="0.1"
        android:fillAlpha="0.1" />
    <path
        android:fillColor="#FF000000"
        android:pathData="M575.53,245.16 L565.9,256.29a10.41,10.41 0,0 1,-2.88 2.32h0a10.38,10.38 0,0 1,-4.54 1.25c-5.55,0.23 -15.19,0.3 -23.33,-1.29 -11.05,-2.15 -19.34,-7.07 -25.59,-4.26a9.25,9.25 0,0 0,-2 1.19s-5.49,17.14 -4.65,28.81c0.65,-10.91 4.65,-23.37 4.65,-23.37a9.25,9.25 0,0 1,2 -1.19c6.26,-2.81 14.54,2.11 25.59,4.26 8.14,1.58 17.77,1.51 23.33,1.29a10.38,10.38 0,0 0,4.54 -1.25h0A10.41,10.41 0,0 0,565.9 261.76l14.81,-17.09A5.83,5.83 0,0 1,575.53 245.16Z"
        android:strokeAlpha="0.1"
        android:fillAlpha="0.1" />
    <path android:pathData="M140.64,367.65a0.77,0.77 0,0 0,0.91 0.12A3.1,3.1 0,0 1,140.64 367.65Z"></path>
    <path android:pathData="M242.55,202c-1.8,-0.52 -4.37,-1.37 -7.46,-2.45a39.12,39.12 0,0 0,6.91 -13.92l-0.26,0.1c0.09,-0.31 0.18,-0.61 0.26,-0.93 -5.93,2.41 -12.49,-1.67 -16.67,-6.91s-7,-11.74 -11.58,-16.56a53,53 0,0 0,-6.14 -5.29c-1.35,-1 -2.8,-2.13 -4.45,-2.18 -2.67,-0.08 -4.76,2.54 -7.33,3.31a10,10 0,0 1,-5.11 -0.19c-6.63,-1.52 -13,-4.33 -19.77,-5.07a23.17,23.17 0,0 0,-10.73 1.21c-3.4,1.29 -4.95,3.86 -7.7,5.92 -3,2.21 -8.86,2.16 -12.35,2.55a88.5,88.5 0,0 1,-12.76 0.53,29.87 29.87,0 0,0 -7.34,0.27c-5.07,1.11 -9.14,5.14 -12.94,9a6.67,6.67 0,0 0,-2.14 3.35,4.23 4.23,0 0,0 0,1.11 7.21,7.21 0,0 0,0.51 2.95,39 39,0 0,0 4.91,9.77c1.55,2.22 3.36,4.31 4.24,6.94a13.47,13.47 0,0 1,0.65 4,29.09 29.09,0 0,1 -0.45,4.3 54,54 0,0 1,-3.29 11.45,20.8 20.8,0 0,0 -1.92,6 9.56,9.56 0,0 0,0 1.28c-0.25,6.6 6.41,11.35 7.7,17.91a10.7,10.7 0,0 1,0.19 1.65c-0.14,4.09 -2.47,8.09 -5.91,9.68 0.3,0.12 0.61,0.22 0.92,0.32a8.34,8.34 0,0 1,-0.92 0.5c0.63,0.24 1.27,0.45 1.92,0.62a44.6,44.6 0,0 0,-9.71 12C92.26,286.76 13.9,328.95 13.9,328.95l1.16,0.66 -0.94,0.61c-6.78,4.51 -22.69,17.66 -8.31,34.29 0,0 11.23,-17.72 19.1,-25.27 0.35,-0.34 0.7,-0.65 1,-0.94a2.3,2.3 0,0 1,0.3 1.82l51.52,-28.95s18.31,-12.82 23.42,-15.71a42.15,42.15 0,0 1,11.61 -5l-0.6,0.25a23.52,23.52 0,0 1,5.91 -0.84c9.12,0.14 19,6.82 22.25,33.27 4.36,35.42 2.34,41.81 0.94,42.68a2.57,2.57 0,0 1,-0.51 -0.09,0.87 0.87,0 0,0 0.14,0.1 2.68,2.68 0,0 1,-0.56 -0.1,0.8 0.8,0 0,0 0.76,0.18 0.71,0.71 0,0 0,0.57 -0.07h0a5.92,5.92 0,0 0,0.69 0q0,0.49 -0.07,1c-0.07,0 -0.41,0.19 0,0.21h0c-0.11,2 -0.1,4.17 0,6.44 -4.53,0.25 -9.06,0.52 -13,0.76l0.35,-1.87 0.16,-0.84c3.48,-0.28 6.78,-1.3 7.17,-4.12 0.85,-6.2 -7.66,-9.51 -14.9,-9.92s-50.66,2.48 -50.66,2.48 -6.51,8.43 14.14,11q0.92,0.48 1.91,1c8.09,4.61 19.06,13.1 24.32,17.28l0.73,0.58L110.14,391.76c12.77,2.89 25.12,51.69 31.93,74s21.71,21.5 34.06,18.19c11.57,-3.1 13,-36.7 13.19,-40.92v-0.43L209.9,468.02l1.56,1.93q0.9,0.47 1.78,0.88c15.58,7.41 32.79,-6.8 27.9,-23 -4.95,-16.33 -12.63,-40.48 -17.75,-50.69 -4.29,-8.55 -9.83,-22.75 -13.19,-31.64a10.68,10.68 0,0 0,1.27 -0.61s-0.08,-0.4 -0.21,-1.13l0.21,-0.11s-5,-25.72 -5.22,-44q0,-0.48 0,-1c0,-0.2 0,-0.4 0,-0.59 3.72,-0.85 6.08,-1.18 6.08,-1.18l0.07,-0.8 -0.43,0.09 2.07,-23.69s7.6,-16.17 1.78,-22.9a14.14,14.14 0,0 1,-3.41 -7c-1,-6.19 0,-16.52 13.55,-25.1 20.86,-13.23 29,-24 29,-24S255.32,205.76 242.55,202ZM201.12,218.44L201.12,207.49c3.87,-0.19 7.82,0.26 11.71,0a29.63,29.63 0,0 0,5.65 -0.95l0.94,0.65A103,103 0,0 1,201.12 218.44ZM141.97,390.08c1.53,1.06 3.07,2.16 4.58,3.27 0.94,5.4 1.77,9.21 1.83,9.48A74.86,74.86 0,0 0,141.97 390.08Z"></path>
    <path
        android:pathData="M175.03,381.08l-0.9,4.89 -0.69,3.74 -1.26,6.84 -12.22,8.55s-1.1,-0.94 -2.92,-2.43c-5,-4.12 -15.53,-12.48 -23.26,-17a26,26 0,0 0,-6.39 -2.95Z"
        android:fillColor="#ffbdc6" />
    <path
        android:fillColor="#FF000000"
        android:pathData="M175.03,381.08l-0.9,4.89a38,38 0,0 1,-8.06 -0.41l-28.51,0.41c-1.35,-0.08 -2.61,-0.19 -3.79,-0.31a26,26 0,0 0,-6.39 -2.95Z"
        android:strokeAlpha="0.1"
        android:fillAlpha="0.1" />
    <path
        android:pathData="M166.07,384.76s14.26,2.44 15.07,-3.67S173.81,371.76 166.9,371.3 118.42,373.76 118.42,373.76s-7.33,9.77 19.14,11.4Z"
        android:fillColor="#7679b4" />
    <path
        android:fillColor="#FF000000"
        android:pathData="M175.03,381.08l-0.9,4.89 -0.69,3.74 -1.26,6.84 -12.22,8.55s-1.1,-0.94 -2.92,-2.43c-5,-4.12 -15.53,-12.48 -23.26,-17a26,26 0,0 0,-6.39 -2.95Z"
        android:strokeAlpha="0.1"
        android:fillAlpha="0.1" />
    <path
        android:fillColor="#FF000000"
        android:pathData="M175.03,381.08l-0.9,4.89a38,38 0,0 1,-8.06 -0.41l-28.51,0.41c-1.35,-0.08 -2.61,-0.19 -3.79,-0.31a26,26 0,0 0,-6.39 -2.95Z"
        android:strokeAlpha="0.1"
        android:fillAlpha="0.1" />
    <path
        android:fillColor="#FF000000"
        android:pathData="M166.07,384.76s14.26,2.44 15.07,-3.67S173.81,371.76 166.9,371.3 118.42,373.76 118.42,373.76s-7.33,9.77 19.14,11.4Z"
        android:strokeAlpha="0.1"
        android:fillAlpha="0.1" />
    <path
        android:pathData="M122.69,183.95h74.53v88.38h-74.53z"
        android:fillColor="#a66477" />
    <path
        android:fillColor="#FF000000"
        android:pathData="M122.69,183.95h74.53v88.38h-74.53z"
        android:strokeAlpha="0.1"
        android:fillAlpha="0.1" />
    <path
        android:pathData="M35.33,335.26c-1.23,0.31 -2.79,1.49 -4.54,3.21 -7.53,7.44 -18.27,24.89 -18.27,24.89 -13.76,-16.38 1.47,-29.33 8,-33.78 1.58,-1.08 2.64,-1.66 2.64,-1.66Z"
        android:fillColor="#ffbdc6" />
    <path
        android:pathData="M174.22,211.85s3.67,25.66 16.29,31.77 -16.29,17.51 -16.29,17.51l-39.51,-14.66s22.4,-7.33 17.92,-28.92Z"
        android:fillColor="#ffbdc6" />
    <path
        android:pathData="M131.9,366.21l-0.9,4.89 -0.69,3.74 -1.26,6.84 -12.22,8.55s-1.1,-0.94 -2.92,-2.43c-5,-4.12 -15.53,-12.48 -23.26,-17a26,26 0,0 0,-6.39 -2.95Z"
        android:fillColor="#ffbdc6" />
    <path
        android:fillColor="#FF000000"
        android:pathData="M131.9,366.21l-0.9,4.89a38,38 0,0 1,-8.06 -0.41l-28.51,0.41c-1.35,-0.08 -2.61,-0.19 -3.79,-0.31a26,26 0,0 0,-6.39 -2.95Z"
        android:strokeAlpha="0.1"
        android:fillAlpha="0.1" />
    <path
        android:pathData="M122.9,369.88s14.26,2.44 15.07,-3.67 -7.33,-9.37 -14.26,-9.77 -48.47,2.44 -48.47,2.44 -7.33,9.77 19.14,11.4Z"
        android:fillColor="#7679b4" />
    <path
        android:fillColor="#FF000000"
        android:pathData="M130.27,374.85l-1.26,6.84 -12.22,8.55s-1.1,-0.94 -2.92,-2.43l16.16,-13.25Z"
        android:strokeAlpha="0.1"
        android:fillAlpha="0.1" />
    <path
        android:pathData="M210.9,468.09q-0.84,-0.41 -1.7,-0.87l-1.49,-1.9 -19.68,-25L188.03,440.76c-0.13,4.15 -1.55,37.25 -12.61,40.3 -11.81,3.26 -26.07,4.07 -32.58,-17.92s-18.33,-70.05 -30.55,-72.9l18.12,-14.87s12,14 16.9,27.48c-0.18,-0.86 -8.47,-39.57 -1.63,-46.41h59.46s9.16,26.14 15.48,39.1c4.9,10.06 12.25,33.84 17,49.93C242.32,461.39 225.9,475.39 210.9,468.09Z"
        android:fillColor="#7679b4" />
    <path
        android:fillColor="#FF000000"
        android:pathData="M209.24,363.76c-9.17,5.43 -49.49,3.22 -62.63,2.34l-3.57,-0.26c-0.39,0 0.06,-0.22 0.06,-0.22l0.37,-3.7 9.77,-24.84L205.58,306.76c-1.06,3.19 -1.42,8.08 -1.33,13.69C204.51,338.43 209.24,363.76 209.24,363.76Z"
        android:strokeAlpha="0.1"
        android:fillAlpha="0.1" />
    <path
        android:pathData="M209.24,362.55c-9.17,5.43 -49.49,3.22 -62.63,2.34l-3.57,-0.26 -0.59,0 0.65,-0.17 3.22,-0.85 6.92,-27.7 52.34,-30.34c-1.06,3.19 -1.42,8.08 -1.33,13.69C204.51,337.21 209.24,362.55 209.24,362.55Z"
        android:fillColor="#f2f1f2" />
    <path
        android:fillColor="#FF000000"
        android:pathData="M204.25,319.22c-10.64,2.45 -34.06,9.66 -43.06,27 -6,11.58 -11,16.55 -14.57,18.63l-3.57,-0.26 0.06,-0.22 3.22,-0.85 6.92,-27.7 52.34,-30.34C204.51,308.76 204.16,313.61 204.25,319.22Z"
        android:strokeAlpha="0.1"
        android:fillAlpha="0.1" />
    <path
        android:fillColor="#FF000000"
        android:pathData="M23.11,327.93l12.22,7.33c-1.23,0.31 -2.79,1.49 -4.54,3.21 -1,-3 -7.42,-7.12 -10.32,-8.88C22.05,328.51 23.11,327.93 23.11,327.93Z"
        android:strokeAlpha="0.1"
        android:fillAlpha="0.1" />
    <path
        android:fillColor="#FF000000"
        android:pathData="M140.9,365.1a0.73,0.73 0,0 1,-0.86 -0.11A2.94,2.94 0,0 0,140.9 365.1Z"
        android:strokeAlpha="0.1"
        android:fillAlpha="0.1" />
    <path
        android:pathData="M168.51,241.99s-11,1.22 -18.74,-6.92c0,0 -32.58,9.37 -43.58,30.55s-85.94,62.72 -85.94,62.72 13,7.33 11.81,11l49.28,-28.51s17.51,-12.63 22.4,-15.48 31.77,-20.36 37.47,27.29 0,42 0,42 8.15,2.85 20,-20 48.47,-28.1 48.47,-28.1l2,-24s7.27,-15.92 1.7,-22.56a14.1,14.1 0,0 1,-3.26 -6.89c-0.93,-6.1 0,-16.27 13,-24.72 20,-13 27.7,-23.62 27.7,-23.62s0.41,-7.74 -11.81,-11.4 -61.91,-23.62 -61.91,-23.62l-1.63,6.92 39.1,27.7s-19.55,15.88 -35,15.48C179.51,229.76 182.36,241.58 168.51,241.99Z"
        android:fillColor="#565388" />
    <path
        android:fillColor="#FF000000"
        android:pathData="M176.06,223.02a80,80 0,0 1,-2.25 -10L152.22,218.76a23.8,23.8 0,0 1,-0.49 12.45,23.22 23.22,0 0,0 24.33,-8.2Z"
        android:strokeAlpha="0.1"
        android:fillAlpha="0.1" />
    <path
        android:pathData="M158.13,207.57m-23.22,0a23.22,23.22 0,1 1,46.44 0a23.22,23.22 0,1 1,-46.44 0"
        android:fillColor="#ffbdc6" />
    <path
        android:fillColor="#FF000000"
        android:pathData="M170.47,154.76c6.44,0.73 12.57,3.5 18.91,5a9.34,9.34 0,0 0,4.89 0.19c2.46,-0.76 4.46,-3.34 7,-3.26 1.57,0 3,1.12 4.26,2.15a51.11,51.11 0,0 1,5.87 5.21c4.37,4.75 7.09,11.15 11.08,16.31s10.28,9.18 15.95,6.81c-3.85,15 -16.49,26.47 -30.15,27.4 -5.45,0.37 -11,-0.76 -16.31,0.84a14.28,14.28 0,0 1,-4.12 1c-3,0 -5.48,-2.79 -7.38,-5.5 -4.44,-6.38 -8,-13.62 -13,-19.43 -1.65,-1.92 -3.6,-3.75 -5.93,-4.1s-4.48,0.76 -6.56,1.84c-3.43,1.78 -6.94,3.62 -9.6,6.66s-4.34,7.59 -3.24,11.71c0.59,2.22 1.95,4.22 2,6.55 0,3.7 -3.22,6.41 -3.87,10a38.6,38.6 0,0 0,-0.16 4.56c-0.29,4.94 -3.51,9 -6.89,12.09 -1.31,1.21 -2.77,2.5 -3.15,4.37 -0.26,1.27 0,2.62 -0.17,3.91 -0.49,3.21 -3.69,4.83 -6.52,5.25a18.9,18.9 0,0 1,-9.78 -1.16c4,-1.87 6.39,-7.2 5.47,-12 -1.26,-6.61 -7.9,-11.35 -7.34,-18.09a20.93,20.93 0,0 1,1.84 -5.95,54.45 54.45,0 0,0 3.14,-11.28 19.11,19.11 0,0 0,-0.19 -9c-0.85,-2.59 -2.58,-4.65 -4.06,-6.84a38.82,38.82 0,0 1,-4.7 -9.63,6.75 6.75,0 0,1 -0.45,-3.18 6.59,6.59 0,0 1,2 -3.3c3.64,-3.81 7.54,-7.78 12.38,-8.88a27.76,27.76 0,0 1,7 -0.27,82.24 82.24,0 0,0 12.21,-0.52c3.34,-0.39 9,-0.34 11.82,-2.52 2.63,-2 4.12,-4.55 7.37,-5.83A21.57,21.57 0,0 1,170.47 154.76Z"
        android:strokeAlpha="0.1"
        android:fillAlpha="0.1" />
    <path
        android:fillColor="#FF000000"
        android:pathData="M183.38,394.52s13.44,26.47 9.37,34.62"
        android:strokeAlpha="0.1"
        android:fillAlpha="0.1" />
    <path
        android:fillColor="#FF000000"
        android:pathData="M207.75,465.32l-19.68,-25L188.07,440.76s-1.14,-8.08 2.61,-5.36c8.21,5.94 21.35,15.68 21.63,17.36S209.65,461.18 207.75,465.32Z"
        android:strokeAlpha="0.1"
        android:fillAlpha="0.1" />
    <path
        android:fillColor="#FF000000"
        android:pathData="M179.9,229.76s1.66,6.88 -3.71,10.32c8.27,-1.42 8.63,-7.85 8.38,-10.65A26.06,26.06 0,0 1,179.9 229.76Z"
        android:strokeAlpha="0.1"
        android:fillAlpha="0.1" />
    <path
        android:fillColor="#FF000000"
        android:pathData="M25.15,326.71s74.94,-41.54 85.94,-62.72c7.89,-15.2 26.9,-24.31 37,-28.25 -7.37,2.47 -32.17,11.94 -41.49,29.88 -11,21.18 -85.94,62.72 -85.94,62.72Z"
        android:strokeAlpha="0.1"
        android:fillAlpha="0.1" />
    <path
        android:fillColor="#FF000000"
        android:pathData="M194.48,226.53c12.75,-4 24.94,-13.87 24.94,-13.87l-39.1,-27.7 0.89,-3.8 -3.74,-1.5 -1.63,6.92 39.1,27.7A94.35,94.35 0,0 1,194.48 226.53Z"
        android:strokeAlpha="0.1"
        android:fillAlpha="0.1" />
    <path
        android:fillColor="#FF000000"
        android:pathData="M194.73,320.39a96.88,96.88 0,0 1,15.33 -3.87l0.07,-0.79A103.76,103.76 0,0 0,194.73 320.39Z"
        android:strokeAlpha="0.1"
        android:fillAlpha="0.1" />
    <path
        android:fillColor="#FF000000"
        android:pathData="M147.34,363.06h-0.36a0.73,0.73 0,0 1,-0.86 -0.11,3 3,0 0,0 0.86,0.11c1.34,-0.78 3.35,-6.86 -0.86,-42.06 -4.5,-37.58 -22.16,-34.63 -31.83,-30.31 9.88,-2.72 23.48,-0.37 27.35,31.94 4.21,35.2 2.2,41.29 0.86,42.06A9,9 0,0 0,147.34 363.06Z"
        android:strokeAlpha="0.1"
        android:fillAlpha="0.1" />
    <path
        android:fillColor="#FF000000"
        android:pathData="M142.5,364.7a3,3 0,0 1,-0.86 -0.11A0.73,0.73 0,0 0,142.5 364.7Z"
        android:strokeAlpha="0.1"
        android:fillAlpha="0.1" />
    <path
        android:pathData="M170.47,153.97c6.44,0.73 12.57,3.5 18.91,5a9.34,9.34 0,0 0,4.89 0.19c2.46,-0.76 4.46,-3.34 7,-3.26 1.57,0 3,1.12 4.26,2.15a51.11,51.11 0,0 1,5.87 5.21c4.37,4.75 7.09,11.15 11.08,16.31s10.28,9.18 15.95,6.81c-3.85,15 -16.49,26.47 -30.15,27.4 -5.45,0.37 -11,-0.76 -16.31,0.84a14.28,14.28 0,0 1,-4.12 1c-3,0 -5.48,-2.79 -7.38,-5.5 -4.44,-6.38 -8,-13.62 -13,-19.43 -1.65,-1.92 -3.6,-3.75 -5.93,-4.1s-4.48,0.76 -6.56,1.84c-3.43,1.78 -6.94,3.62 -9.6,6.66s-4.34,7.59 -3.24,11.71c0.59,2.22 1.95,4.22 2,6.55 0,3.7 -3.22,6.41 -3.87,10a38.6,38.6 0,0 0,-0.16 4.56c-0.29,4.94 -3.51,9 -6.89,12.09 -1.31,1.21 -2.77,2.5 -3.15,4.37 -0.26,1.27 0,2.62 -0.17,3.91 -0.49,3.21 -3.69,4.83 -6.52,5.25a18.9,18.9 0,0 1,-9.78 -1.16c4,-1.87 6.39,-7.2 5.47,-12 -1.26,-6.61 -7.9,-11.35 -7.34,-18.09a20.93,20.93 0,0 1,1.84 -5.95,54.45 54.45,0 0,0 3.14,-11.28 19.11,19.11 0,0 0,-0.19 -9c-0.85,-2.59 -2.58,-4.65 -4.06,-6.84a38.82,38.82 0,0 1,-4.7 -9.63,6.75 6.75,0 0,1 -0.45,-3.18 6.59,6.59 0,0 1,2 -3.3c3.64,-3.81 7.54,-7.78 12.38,-8.88a27.76,27.76 0,0 1,7 -0.27,82.24 82.24,0 0,0 12.21,-0.52c3.34,-0.39 9,-0.34 11.82,-2.52 2.63,-2 4.12,-4.55 7.37,-5.83A21.57,21.57 0,0 1,170.47 153.97Z"
        android:fillColor="#a66477" />
    <path android:pathData="M833.5,101.85h0c0,-0.13 0,-0.25 0,-0.37s0,-0.26 -0.06,-0.38h-0.16c0,-0.27 0,-0.54 0,-0.83 -0.4,-9.27 -13.22,-29 -18.36,-23.24 -4.5,5.06 2.29,17.86 5.75,23.62l0.31,0.52 -0.17,-0.11s-14.31,42.68 -16,44.34 -13.47,35.22 -29,39c-3.07,0.73 -5.62,1.39 -7.76,2l0.17,-0.57c1,-3.27 2.23,-6.36 2.73,-10s0,-8.05 -1.84,-9.82c-0.9,-0.88 -2,-1 -2.74,-2.4a11.08,11.08 0,0 1,-0.76 -3.85l-1.32,-16.18 0.92,-0.28c5.56,-1.78 10.95,-6 11.58,-11.68a6,6 0,0 1,-0.59 0.19,10.13 10.13,0 0,0 0.17,-1c-4.67,1.84 -9,-3 -13.5,-5.17 -7.41,-3.63 -15.88,-0.21 -23.53,0.62 -8.67,0.95 -16.9,-2.65 -25.76,-2 -4.82,0.37 -10.18,3.64 -9.92,8.39 0.15,2.61 2,4.82 2.76,7.32 1.92,6.05 -2.35,12.12 -6.09,17.28 -2.46,3.39 -4.82,7.52 -5.24,11.5 -8.61,-9 -17.92,-19.4 -19,-23.31L651.18,102.76s-0.59,0.63 -1.54,1.56c-0.15,-0.46 -0.33,-1 -0.53,-1.54 -3.18,-8.91 -12.18,-30.5 -23.59,-26.54s4.73,26.09 11.75,34.91l1,1.22a3.16,3.16 0,0 1,-1.78 -0.08l27.78,47.65s5.05,9.12 9.68,11.6c0,0 34.51,43.51 34.93,52.21S724.4,255.66 724.4,255.66s5.05,37.71 -3.79,44.34h0.11l0.07,0L720.9,300l0.1,0 0.2,0 0.13,0 0.13,0 0.17,0 0.14,0 0.2,0 0.1,0c-0.42,0.41 -0.85,0.86 -1.29,1.35 -6.55,7.26 -14.92,22.82 -3.48,49.28 16.83,39 19.36,54.28 19.36,54.28s-32,1.66 -38.3,2.9c-5.58,1.1 -27.27,1.87 -32.23,2 -1.77,-2.06 -7,-6.62 -14.06,0 -8.84,8.29 -15.15,36 -15.15,36s-3.37,22.38 8,16.57c0,0 13.47,-18.65 17.25,-19.48 1.88,-0.41 3.87,-3.18 5.39,-5.85l0.08,0.05h0c0.09,0 0.46,-0.2 1.06,-0.44h0c2.8,-1.11 10.51,-3.78 16.59,-2.45 3.33,0.73 17.61,0.9 32.58,0.86 -3.38,8.1 -9.44,29 -9.44,29S705.9,483.56 714.3,482.76c6,-0.59 15.2,-15.92 20,-24.67 3.48,-2.55 13.45,-11.69 20.82,-11l49.66,-19.06s11.78,-6.63 5.47,-28.59c-5,-17.46 -19.23,-53.2 -24.85,-67.13h0l-0.17,-0.36c-1.36,-3.37 -2.18,-5.37 -2.18,-5.37h0a82.19,82.19 0,0 1,-4.51 -19.71c-0.05,-0.53 -0.09,-1.07 -0.13,-1.6a8.84,8.84 0,0 0,1.95 -1.13s-4.63,-46.82 0,-51.8l0,0h0l0.08,-0.09v0l0,-0.06h0l0.08,-0.1h0l0.18,-0.23h0l0.22,-0.28 0,0c0.25,-0.33 0.55,-0.74 0.89,-1.24h0c2.65,-3.88 7.59,-12.74 6.17,-23.2v0q-0.09,-0.68 -0.22,-1.37h0a28.57,28.57 0,0 0,-2.88 -8.12,22.52 22.52,0 0,1 -0.37,-3.21c0,-0.61 0,-1.28 0,-2v-0.12q0,-0.29 0,-0.58v-0.14c0,-0.47 0.08,-1 0.15,-1.44l0,-0.18q0,-0.27 0.09,-0.55l0,-0.23c0,-0.18 0.08,-0.36 0.12,-0.54l0,-0.19c0.06,-0.24 0.12,-0.48 0.2,-0.72l0,-0.12q0.09,-0.3 0.2,-0.59l0.09,-0.23 0.2,-0.48 0.1,-0.24c0.08,-0.18 0.17,-0.36 0.26,-0.54l0.07,-0.15q0.18,-0.33 0.38,-0.65l0.11,-0.17 0.33,-0.47 0.16,-0.21 0.35,-0.42 0.16,-0.18c0.18,-0.19 0.36,-0.38 0.56,-0.56 5.47,-5 29.88,-41.85 29.88,-41.85s5.89,-8.29 5.89,-13.67C824.14,147.1 834.55,112.4 833.5,101.85ZM767.97,411.6c-0.6,-5.68 -1.2,-12.72 -1.75,-20l9.52,14.84S774.84,410.96 767.97,411.6Z"></path>
    <path
        android:pathData="M668.71,408.46s-5.7,-9 -14.26,-0.81 -14.66,35.43 -14.66,35.43 -3.26,22 7.74,16.29c0,0 13,-18.33 16.7,-19.14s7.74,-11 7.74,-11Z"
        android:fillColor="#493545" />
    <path
        android:pathData="M729.8,430.45s-7.74,-3.67 -10.18,-0.81 -10.59,31.36 -10.59,31.36 -2.44,18.74 5.7,17.92S737.13,448.76 737.13,448.76Z"
        android:fillColor="#493545" />
    <path
        android:fillColor="#FF000000"
        android:pathData="M729.8,430.45s-7.74,-3.67 -10.18,-0.81 -10.59,31.36 -10.59,31.36 -2.44,18.74 5.7,17.92S737.13,448.76 737.13,448.76Z"
        android:strokeAlpha="0.05"
        android:fillAlpha="0.05" />
    <path
        android:pathData="M756.68,375.06l17.51,27.29s-1.22,6.11 -11.81,4.89l-36.25,22.81s-3.15,27.77 6.92,25.25c1.63,-0.41 13,-12.22 21.18,-11.4L802.3,425.16s11.4,-6.52 5.29,-28.1 -26.31,-71.62 -26.31,-71.62l-31.93,17.86Z"
        android:fillColor="#3e3d77" />
    <path
        android:fillColor="#FF000000"
        android:pathData="M756.68,375.06l17.51,27.29s-1.22,6.11 -11.81,4.89l-36.25,22.81s-3.15,27.77 6.92,25.25c1.63,-0.41 13,-12.22 21.18,-11.4L802.3,425.16s11.4,-6.52 5.29,-28.1 -26.31,-71.62 -26.31,-71.62l-31.93,17.86Z"
        android:strokeAlpha="0.05"
        android:fillAlpha="0.05" />
    <path
        android:pathData="M767.68,415.38c2.44,15.48 -11.4,16.7 -11.4,16.7s-62.32,1.22 -69.65,-0.41 -17.11,2.85 -17.11,2.85c-12.63,-7.74 -2.44,-26.88 -2.44,-26.88s26.07,-0.81 32.18,-2S736.32,402.76 736.32,402.76s-2.44,-15.07 -18.74,-53.35c-11.07,-26 -3,-41.3 3.37,-48.43a26.82,26.82 0,0 1,5.59 -4.92l50.1,2.44a65,65 0,0 0,0.28 7.57,80.62 80.62,0 0,0 6.65,25c-2.85,0 -21.18,17.11 -21.18,17.11S765.23,399.91 767.68,415.38Z"
        android:fillColor="#3e3d77" />
    <path
        android:fillColor="#FF000000"
        android:pathData="M670.74,409.27s26.07,-0.81 32.18,-2 37.06,-2.85 37.06,-2.85 -2.44,-15.07 -18.74,-53.35c-11.07,-26 -3,-41.3 3.37,-48.43a26.82,26.82 0,0 1,5.59 -4.92l46.42,2.26c0,-0.48 0,-1 0,-1.45l-50.1,-2.44a26.82,26.82 0,0 0,-5.59 4.92c-6.34,7.14 -14.44,22.43 -3.37,48.43C733.9,387.69 736.32,402.76 736.32,402.76s-31,1.63 -37.06,2.85 -32.18,2 -32.18,2S656.9,426.76 669.52,434.53c0,0 0.38,-0.18 1,-0.44C662.13,425.46 670.74,409.27 670.74,409.27Z"
        android:strokeAlpha="0.1"
        android:fillAlpha="0.1" />
    <path
        android:pathData="M720.02,146.57h25.25v63.94h-25.25z"
        android:fillColor="#493545" />
    <path
        android:fillColor="#FF000000"
        android:pathData="M720.02,146.57h25.25v63.94h-25.25z"
        android:strokeAlpha="0.1"
        android:fillAlpha="0.1" />
    <path
        android:pathData="M759.71,137.19c0.87,0.24 1.85,0.27 2.44,1.47a9,9 0,0 1,0.59 3l1.59,19.76a11,11 0,0 0,0.74 3.78c0.67,1.34 1.78,1.5 2.65,2.36 1.75,1.74 2.26,6.1 1.78,9.65s-1.69,6.59 -2.64,9.8c-1.36,4.6 -2.26,9.77 -4.17,13.65s-5.38,6 -7.62,2.74 -1.94,-9.84 -2.36,-15.23c-0.7,-9 -4.21,-16.76 -4.45,-25.82 -0.2,-7.33 1.77,-14.17 3,-21.12 0.88,-4.77 0.93,-10.56 2.21,-14.85C754.54,131.48 756.58,136.33 759.71,137.19Z"
        android:fillColor="#493545" />
    <path
        android:fillColor="#FF000000"
        android:pathData="M759.71,137.19c0.87,0.24 1.85,0.27 2.44,1.47a9,9 0,0 1,0.59 3l1.59,19.76a11,11 0,0 0,0.74 3.78c0.67,1.34 1.78,1.5 2.65,2.36 1.75,1.74 2.26,6.1 1.78,9.65s-1.69,6.59 -2.64,9.8c-1.36,4.6 -2.26,9.77 -4.17,13.65s-5.38,6 -7.62,2.74 -1.94,-9.84 -2.36,-15.23c-0.7,-9 -4.21,-16.76 -4.45,-25.82 -0.2,-7.33 1.77,-14.17 3,-21.12 0.88,-4.77 0.93,-10.56 2.21,-14.85C754.54,131.48 756.58,136.33 759.71,137.19Z"
        android:strokeAlpha="0.1"
        android:fillAlpha="0.1" />
    <path
        android:pathData="M652.82,109.1l-9.77,8.15s-1.16,-1.36 -2.89,-3.56c-6.79,-8.67 -22.4,-30.42 -11.37,-34.31s19.75,17.32 22.83,26.08C652.4,107.68 652.82,109.1 652.82,109.1Z"
        android:fillColor="#c77485" />
    <path
        android:pathData="M829.18,106.25c-4.07,6.11 -9.77,0 -9.77,0s-0.73,-1.09 -1.76,-2.85c-3.35,-5.67 -9.92,-18.24 -5.57,-23.22 5,-5.69 17.39,13.73 17.77,22.84A5.42,5.42 0,0 1,829.18 106.25Z"
        android:fillColor="#c77485" />
    <path
        android:pathData="M728.98,172.23s8.15,26.07 5.7,33.8S752.2,222.76 752.2,222.76h22.81s8.15,-16.7 6.11,-21.59 -19.55,-8.55 -19.55,-8.55 -10.18,0 -9.77,-27.29Z"
        android:fillColor="#c77485" />
    <path
        android:fillColor="#FF000000"
        android:pathData="M652.82,109.1l-9.77,8.15s-1.16,-1.36 -2.89,-3.56c3.55,-0.63 9.06,-5.81 11.47,-8.23C652.4,107.68 652.82,109.1 652.82,109.1Z"
        android:strokeAlpha="0.1"
        android:fillAlpha="0.1" />
    <path
        android:fillColor="#FF000000"
        android:pathData="M829.18,106.25c-4.07,6.11 -9.77,0 -9.77,0s-0.73,-1.09 -1.76,-2.85l0.13,-0.41c2.64,1.89 10.85,0.28 12.07,0A5.42,5.42 0,0 1,829.18 106.25Z"
        android:strokeAlpha="0.1"
        android:fillAlpha="0.1" />
    <path
        android:fillColor="#FF000000"
        android:pathData="M776.9,306.06c-12.6,5.75 -53.54,-4.49 -56,-5.1a26.82,26.82 0,0 1,5.59 -4.92l50.1,2.44A65,65 0,0 0,776.9 306.06Z"
        android:strokeAlpha="0.1"
        android:fillAlpha="0.1" />
    <path
        android:pathData="M734.28,194.63s-9.77,3.26 -23.62,-9.37c0,0 -31,-30.55 -33,-37.88l-24,-42s-10.18,11 -14.26,9.37l26.88,46.84s4.89,9 9.37,11.4c0,0 33.4,42.77 33.8,51.32S724.5,255.76 724.5,255.76s4.89,37.06 -3.67,43.58c0,0 47.65,12.22 57.83,4.07 0,0 -4.48,-46 0,-50.91 0,0 13.85,-16.29 4.48,-34.21 0,0 -2,-9.77 3.26,-14.66s28.92,-41.14 28.92,-41.14 5.7,-8.15 5.7,-13.44c0,0 10.59,-35.84 9,-45.21 0,0 -9.37,2 -12.22,0 0,0 -13.85,42 -15.48,43.58s-13,34.62 -28.1,38.29 -17.51,5.29 -17.51,5.29 29.32,18.33 15.07,26.47S734.28,194.63 734.28,194.63Z"
        android:fillColor="#ffaac4" />
    <path
        android:fillColor="#FF000000"
        android:pathData="M752.79,178.5a77.83,77.83 0,0 1,-0.59 -11.57l-22.81,6.92a30.76,30.76 0,0 1,1.43 4.68c2.61,1.15 6.13,3.87 9.16,3.87A20.77,20.77 0,0 0,752.79 178.5Z"
        android:strokeAlpha="0.1"
        android:fillAlpha="0.1" />
    <path
        android:pathData="M739.57,160.01m-21.18,0a21.18,21.18 0,1 1,42.36 0a21.18,21.18 0,1 1,-42.36 0"
        android:fillColor="#c77485" />
    <path
        android:fillColor="#FF000000"
        android:pathData="M714.37,127.38c-4.66,0.36 -9.86,3.58 -9.6,8.25 0.14,2.57 1.9,4.74 2.67,7.2 1.85,5.95 -2.27,11.92 -5.89,17s-7,11.81 -3.9,17.19a42.39,42.39 0,0 0,2.86 3.73c3.83,5.17 3.78,12.15 5.48,18.36a32.21,32.21 0,0 0,37.84 23,20.14 20.14,0 0,1 -4.25,-13.62c0.23,-3.56 1.38,-7.28 0,-10.57 -1.78,-4.23 -7,-5.9 -9.69,-9.6s-2.51,-8.83 -1.21,-13.24 3.55,-8.5 4.63,-13a39.16,39.16 0,0 1,1 -3.89c1.88,-5.34 7.5,-8.44 13,-9.77s11.28,-1.41 16.65,-3.16 10.59,-5.85 11.21,-11.48c-4.52,1.81 -8.71,-2.91 -13.07,-5.08 -7.18,-3.56 -15.37,-0.21 -22.77,0.61C730.9,130.25 722.9,126.76 714.37,127.38Z"
        android:strokeAlpha="0.1"
        android:fillAlpha="0.1" />
    <path
        android:pathData="M713.96,126.57c-4.66,0.36 -9.86,3.58 -9.6,8.25 0.14,2.57 1.9,4.74 2.67,7.2 1.85,5.95 -2.27,11.92 -5.89,17s-7,11.81 -3.9,17.19a42.39,42.39 0,0 0,2.86 3.73c3.83,5.17 3.78,12.15 5.48,18.36a32.21,32.21 0,0 0,37.84 23,20.14 20.14,0 0,1 -4.25,-13.62c0.23,-3.56 1.38,-7.28 0,-10.57 -1.78,-4.23 -7,-5.9 -9.69,-9.6s-2.51,-8.83 -1.21,-13.24 3.55,-8.5 4.63,-13a39.16,39.16 0,0 1,1 -3.89c1.88,-5.34 7.5,-8.44 13,-9.77s11.28,-1.41 16.65,-3.16 10.59,-5.85 11.21,-11.48c-4.52,1.81 -8.71,-2.91 -13.07,-5.08 -7.18,-3.56 -15.37,-0.21 -22.77,0.61C730.51,129.43 722.54,125.9 713.96,126.57Z"
        android:fillColor="#493545" />
    <path
        android:fillColor="#FF000000"
        android:pathData="M760.55,207.06s8.48,7.57 10.15,10.91"
        android:strokeAlpha="0.1"
        android:fillAlpha="0.1" />
    <path
        android:fillColor="#FF000000"
        android:pathData="M778.9,252.27s-10.59,0 -15.48,1.22 -16.7,0 -16.7,0"
        android:strokeAlpha="0.1"
        android:fillAlpha="0.1" />
    <path
        android:fillColor="#FF000000"
        android:pathData="M771.75,217.44a10.18,10.18 0,0 1,-2.93 1.12,11.2 11.2,0 0,0 7.82,-1.12c14.26,-8.15 -15.07,-26.47 -15.07,-26.47h-4.89S786.01,209.3 771.75,217.44Z"
        android:strokeAlpha="0.1"
        android:fillAlpha="0.1" />
    <path
        android:fillColor="#FF000000"
        android:pathData="M830.09,104.55c0,-0.26 -0.06,-0.51 -0.1,-0.74a47.84,47.84 0,0 1,-5.07 0.77A22.46,22.46 0,0 0,830.09 104.55Z"
        android:strokeAlpha="0.1"
        android:fillAlpha="0.1" />
    <path
        android:fillColor="#FF000000"
        android:pathData="M725.73,299.31c8.55,-6.52 3.67,-43.58 3.67,-43.58s-14.66,-22.81 -15.07,-31.36 -33.8,-51.32 -33.8,-51.32c-4.48,-2.44 -9.37,-11.4 -9.37,-11.4s-27.7,-45.21 -31.77,-46.84l26.88,46.84s4.89,9 9.37,11.4c0,0 33.4,42.77 33.8,51.32S724.5,255.76 724.5,255.76s4.89,37.06 -3.67,43.58c0,0 29.29,7.51 46.85,6.83C750.08,305.55 725.73,299.31 725.73,299.31Z"
        android:strokeAlpha="0.1"
        android:fillAlpha="0.1" />
    <path
        android:fillColor="#FF000000"
        android:pathData="M734.52,194.95l-0.24,-0.31a6.44,6.44 0,0 1,-0.85 0.19C733.81,194.88 734.17,194.92 734.52,194.95Z"
        android:strokeAlpha="0.1"
        android:fillAlpha="0.1" />
    <path
        android:fillColor="#FF000000"
        android:pathData="M829.99,103.76l-0.25,0.05c-0.43,12.51 -9.11,41.9 -9.11,41.9 0,5.29 -5.7,13.44 -5.7,13.44s-23.62,36.25 -28.92,41.14 -3.26,14.66 -3.26,14.66l0.05,0.1c-0.16,-3.29 0.24,-8.39 3.61,-11.51 5.29,-4.89 28.92,-41.14 28.92,-41.14s5.7,-8.15 5.7,-13.44C821.03,149.02 831.62,113.18 829.99,103.76Z"
        android:strokeAlpha="0.1"
        android:fillAlpha="0.1" />
    <path
        android:fillColor="#FF000000"
        android:pathData="M778.27,249.21c0.61,3.46 0.2,-0.2 0.41,3.26 0,0 10,-11.73 7.27,-26.23C786.77,239.2 778.27,249.21 778.27,249.21Z"
        android:strokeAlpha="0.1"
        android:fillAlpha="0.1" />
    <path
        android:pathData="M42.12,620.44a427.67,41.08 0,1 0,855.34 0a427.67,41.08 0,1 0,-855.34 0z"
        android:strokeAlpha="0.1"
        android:fillColor="#0099bf"
        android:fillAlpha="0.1" />
    <path
        android:pathData="M304.01,578.76s-14.56,-49.45 2.73,-85.84a78.1,78.1 0,0 0,6.32 -49,131.35 131.35,0 0,0 -6.94,-23"
        android:strokeWidth="2"
        android:fillColor="#00000000"
        android:strokeColor="#535461" />
    <path
        android:pathData="M316.9,397.94c0,6.06 -11,23.63 -11,23.63s-11,-17.57 -11,-23.63a11,11 0,1 1,21.94 0Z"
        android:fillColor="#0099bf" />
    <path
        android:pathData="M335.01,431.5c-3.29,5.09 -22.05,13.87 -22.05,13.87s0.34,-20.71 3.63,-25.8a11,11 0,1 1,18.42 11.93Z"
        android:fillColor="#0099bf" />
    <path
        android:pathData="M334.22,488.87c-5.41,2.73 -26,0.84 -26,0.84s10.75,-17.71 16.16,-20.44a11,11 0,1 1,9.88 19.59Z"
        android:fillColor="#0099bf" />
    <path
        android:pathData="M323.85,532.13c-4.87,3.6 -25.53,5.23 -25.53,5.23s7.6,-19.27 12.48,-22.88a11,11 0,0 1,13 17.64Z"
        android:fillColor="#0099bf" />
    <path
        android:pathData="M289.9,446.55c4.35,4.22 24.6,8.6 24.6,8.6s-5,-20.11 -9.31,-24.34A11,11 0,1 0,289.9 446.55Z"
        android:fillColor="#0099bf" />
    <path
        android:pathData="M278.43,497.31c5.41,2.73 26,0.84 26,0.84S293.72,480.44 288.31,477.76a11,11 0,0 0,-9.88 19.59Z"
        android:fillColor="#0099bf" />
    <path
        android:pathData="M274.03,548.17c4.87,3.6 25.53,5.23 25.53,5.23s-7.6,-19.27 -12.48,-22.88a11,11 0,1 0,-13 17.64Z"
        android:fillColor="#0099bf" />
    <path
        android:pathData="M316.9,397.94c0,6.06 -11,23.63 -11,23.63s-11,-17.57 -11,-23.63a11,11 0,1 1,21.94 0Z"
        android:strokeAlpha="0.1"
        android:fillColor="#0099bf"
        android:fillAlpha="0.1" />
    <path
        android:pathData="M335.01,431.5c-3.29,5.09 -22.05,13.87 -22.05,13.87s0.34,-20.71 3.63,-25.8a11,11 0,1 1,18.42 11.93Z"
        android:strokeAlpha="0.1"
        android:fillColor="#0099bf"
        android:fillAlpha="0.1" />
    <path
        android:pathData="M334.22,488.87c-5.41,2.73 -26,0.84 -26,0.84s10.75,-17.71 16.16,-20.44a11,11 0,1 1,9.88 19.59Z"
        android:strokeAlpha="0.1"
        android:fillColor="#0099bf"
        android:fillAlpha="0.1" />
    <path
        android:pathData="M323.85,532.13c-4.87,3.6 -25.53,5.23 -25.53,5.23s7.6,-19.27 12.48,-22.88a11,11 0,0 1,13 17.64Z"
        android:strokeAlpha="0.1"
        android:fillColor="#0099bf"
        android:fillAlpha="0.1" />
    <path
        android:pathData="M289.9,446.55c4.35,4.22 24.6,8.6 24.6,8.6s-5,-20.11 -9.31,-24.34A11,11 0,1 0,289.9 446.55Z"
        android:strokeAlpha="0.1"
        android:fillColor="#0099bf"
        android:fillAlpha="0.1" />
    <path
        android:pathData="M278.43,497.31c5.41,2.73 26,0.84 26,0.84S293.72,480.44 288.31,477.76a11,11 0,0 0,-9.88 19.59Z"
        android:strokeAlpha="0.1"
        android:fillColor="#0099bf"
        android:fillAlpha="0.1" />
    <path
        android:pathData="M274.03,548.17c4.87,3.6 25.53,5.23 25.53,5.23s-7.6,-19.27 -12.48,-22.88a11,11 0,1 0,-13 17.64Z"
        android:strokeAlpha="0.1"
        android:fillColor="#0099bf"
        android:fillAlpha="0.1" />
    <path
        android:pathData="M598.65,579.47s-14.56,-49.45 2.73,-85.84a78.1,78.1 0,0 0,6.32 -49,131.35 131.35,0 0,0 -6.94,-23"
        android:strokeWidth="2"
        android:fillColor="#00000000"
        android:strokeColor="#535461" />
    <path
        android:pathData="M611.52,398.64c0,6.06 -11,23.63 -11,23.63s-11,-17.57 -11,-23.63a11,11 0,0 1,21.94 0Z"
        android:fillColor="#0099bf" />
    <path
        android:pathData="M629.66,432.2c-3.29,5.09 -22.05,13.87 -22.05,13.87s0.34,-20.71 3.63,-25.8a11,11 0,1 1,18.42 11.93Z"
        android:fillColor="#0099bf" />
    <path
        android:pathData="M628.9,489.57c-5.41,2.73 -26,0.84 -26,0.84s10.75,-17.71 16.16,-20.44A11,11 0,1 1,628.9 489.57Z"
        android:fillColor="#0099bf" />
    <path
        android:pathData="M618.49,532.83c-4.87,3.6 -25.53,5.23 -25.53,5.23s7.6,-19.27 12.48,-22.88a11,11 0,0 1,13 17.64Z"
        android:fillColor="#0099bf" />
    <path
        android:pathData="M584.56,447.25c4.35,4.22 24.6,8.6 24.6,8.6s-5,-20.11 -9.31,-24.34a11,11 0,1 0,-15.29 15.74Z"
        android:fillColor="#0099bf" />
    <path
        android:pathData="M573.07,498.01c5.41,2.73 26,0.84 26,0.84s-10.75,-17.71 -16.16,-20.44a11,11 0,0 0,-9.88 19.59Z"
        android:fillColor="#0099bf" />
    <path
        android:pathData="M568.68,548.87c4.87,3.6 25.53,5.23 25.53,5.23s-7.6,-19.27 -12.48,-22.88a11,11 0,0 0,-13 17.64Z"
        android:fillColor="#0099bf" />
    <path
        android:pathData="M611.52,398.64c0,6.06 -11,23.63 -11,23.63s-11,-17.57 -11,-23.63a11,11 0,0 1,21.94 0Z"
        android:strokeAlpha="0.1"
        android:fillColor="#0099bf"
        android:fillAlpha="0.1" />
    <path
        android:pathData="M629.66,432.2c-3.29,5.09 -22.05,13.87 -22.05,13.87s0.34,-20.71 3.63,-25.8a11,11 0,1 1,18.42 11.93Z"
        android:strokeAlpha="0.1"
        android:fillColor="#0099bf"
        android:fillAlpha="0.1" />
    <path
        android:pathData="M628.9,489.57c-5.41,2.73 -26,0.84 -26,0.84s10.75,-17.71 16.16,-20.44A11,11 0,1 1,628.9 489.57Z"
        android:strokeAlpha="0.1"
        android:fillColor="#0099bf"
        android:fillAlpha="0.1" />
    <path
        android:pathData="M618.49,532.83c-4.87,3.6 -25.53,5.23 -25.53,5.23s7.6,-19.27 12.48,-22.88a11,11 0,0 1,13 17.64Z"
        android:strokeAlpha="0.1"
        android:fillColor="#0099bf"
        android:fillAlpha="0.1" />
    <path
        android:pathData="M584.56,447.25c4.35,4.22 24.6,8.6 24.6,8.6s-5,-20.11 -9.31,-24.34a11,11 0,1 0,-15.29 15.74Z"
        android:strokeAlpha="0.1"
        android:fillColor="#0099bf"
        android:fillAlpha="0.1" />
    <path
        android:pathData="M573.07,498.01c5.41,2.73 26,0.84 26,0.84s-10.75,-17.71 -16.16,-20.44a11,11 0,0 0,-9.88 19.59Z"
        android:strokeAlpha="0.1"
        android:fillColor="#0099bf"
        android:fillAlpha="0.1" />
    <path
        android:pathData="M568.68,548.87c4.87,3.6 25.53,5.23 25.53,5.23s-7.6,-19.27 -12.48,-22.88a11,11 0,0 0,-13 17.64Z"
        android:strokeAlpha="0.1"
        android:fillColor="#0099bf"
        android:fillAlpha="0.1" />
    <path
        android:pathData="M669.9,15.31h-6.28a4.4,4.4 0,1 0,0 -8.79L612.7,6.52a4.4,4.4 0,0 0,0 8.79h6.28a4.4,4.4 0,0 0,0 8.79h-8.79a4.4,4.4 0,1 0,0 8.79h50.88a4.4,4.4 0,1 0,0 -8.79L669.9,24.1a4.4,4.4 0,0 0,0 -8.79Z"
        android:strokeAlpha="0.5"
        android:fillColor="#dee3f3"
        android:fillAlpha="0.5" />
    <path
        android:pathData="M375.68,40.95L370.9,40.95a3.35,3.35 0,1 0,0 -6.69L332.18,34.26a3.35,3.35 0,0 0,0 6.69h4.78a3.35,3.35 0,1 0,0 6.69h-6.69a3.35,3.35 0,1 0,0 6.69h38.72a3.35,3.35 0,1 0,0 -6.69h6.69a3.35,3.35 0,0 0,0 -6.69Z"
        android:strokeAlpha="0.5"
        android:fillColor="#dee3f3"
        android:fillAlpha="0.5" />
    <path
        android:strokeWidth="1"
        android:pathData="M50.68,514.76s17.5,34.35 3.24,53.14 1.3,70 1.3,70"
        android:fillColor="#00000000"
        android:strokeColor="#0099bf" />
    <path
        android:pathData="M55.9,504.02c0,6.62 -4.86,12 -4.86,12s-4.86,-5.37 -4.86,-12 4.86,-12 4.86,-12S55.9,497.4 55.9,504.02Z"
        android:fillColor="#0099bf" />
    <path
        android:strokeWidth="1"
        android:pathData="M59.75,514.76s-17.5,34.35 -3.24,53.14 -1.3,70 -1.3,70"
        android:fillColor="#00000000"
        android:strokeColor="#0099bf" />
    <path
        android:pathData="M54.57,504.02c0,6.62 4.86,12 4.86,12s4.86,-5.37 4.86,-12 -4.86,-12 -4.86,-12S54.57,497.4 54.57,504.02Z"
        android:fillColor="#0099bf" />
    <path
        android:fillColor="#FF000000"
        android:pathData="M54.57,504.02c0,6.62 4.86,12 4.86,12s4.86,-5.37 4.86,-12 -4.86,-12 -4.86,-12S54.57,497.4 54.57,504.02Z"
        android:strokeAlpha="0.1"
        android:fillAlpha="0.1" />
    <path
        android:strokeWidth="1"
        android:pathData="M66.9,514.76s17.5,34.35 3.24,53.14 1.3,70 1.3,70"
        android:fillColor="#00000000"
        android:strokeColor="#0099bf" />
    <path
        android:pathData="M72.07,504.02c0,6.62 -4.86,12 -4.86,12s-4.86,-5.37 -4.86,-12 4.86,-12 4.86,-12S72.07,497.4 72.07,504.02Z"
        android:fillColor="#0099bf" />
    <path
        android:pathData="M69.34,531.54c-4.59,4.77 -11.82,5.27 -11.82,5.27s0.22,-7.24 4.81,-12 11.82,-5.27 11.82,-5.27S73.9,526.76 69.34,531.54Z"
        android:fillColor="#0099bf" />
    <path
        android:pathData="M69.8,555.24c-4.59,4.77 -11.82,5.27 -11.82,5.27s0.22,-7.24 4.81,-12 11.82,-5.27 11.82,-5.27S74.39,550.46 69.8,555.24Z"
        android:fillColor="#0099bf" />
    <path
        android:pathData="M44.9,568.27c4.34,5 4.19,12.24 4.19,12.24s-7.19,-0.87 -11.53,-5.87 -4.19,-12.24 -4.19,-12.24S40.56,563.27 44.9,568.27Z"
        android:fillColor="#0099bf" />
    <path
        android:pathData="M48.9,517.76c5.52,3.66 7.31,10.68 7.31,10.68s-7.16,1.09 -12.68,-2.57 -7.31,-10.68 -7.31,-10.68S43.41,514.08 48.9,517.76Z"
        android:fillColor="#0099bf" />
    <path
        android:fillColor="#FF000000"
        android:pathData="M48.9,517.76c5.52,3.66 7.31,10.68 7.31,10.68s-7.16,1.09 -12.68,-2.57 -7.31,-10.68 -7.31,-10.68S43.41,514.08 48.9,517.76Z"
        android:strokeAlpha="0.1"
        android:fillAlpha="0.1" />
    <path
        android:strokeWidth="1"
        android:pathData="M75.95,514.76s-17.5,34.35 -3.24,53.14 -1.3,70 -1.3,70"
        android:fillColor="#00000000"
        android:strokeColor="#0099bf" />
    <path
        android:pathData="M70.77,504.02c0,6.62 4.86,12 4.86,12s4.86,-5.37 4.86,-12 -4.86,-12 -4.86,-12S70.77,497.4 70.77,504.02Z"
        android:fillColor="#0099bf" />
    <path
        android:fillColor="#FF000000"
        android:pathData="M70.77,504.02c0,6.62 4.86,12 4.86,12s4.86,-5.37 4.86,-12 -4.86,-12 -4.86,-12S70.77,497.4 70.77,504.02Z"
        android:strokeAlpha="0.1"
        android:fillAlpha="0.1" />
    <path
        android:pathData="M72.17,532.05c-4.65,4.72 -5,12 -5,12s7.23,-0.41 11.88,-5.13 5,-12 5,-12S76.82,527.33 72.17,532.05Z"
        android:fillColor="#0099bf" />
    <path
        android:fillColor="#FF000000"
        android:pathData="M72.17,532.05c-4.65,4.72 -5,12 -5,12s7.23,-0.41 11.88,-5.13 5,-12 5,-12S76.82,527.33 72.17,532.05Z"
        android:strokeAlpha="0.1"
        android:fillAlpha="0.1" />
    <path
        android:pathData="M81.28,564.86c-4.65,4.72 -5,12 -5,12s7.23,-0.41 11.88,-5.13 5,-12 5,-12S85.9,560.14 81.28,564.86Z"
        android:fillColor="#0099bf" />
    <path
        android:strokeWidth="1"
        android:pathData="M67.9,557.65s10.53,-16.6 25.32,-17"
        android:fillColor="#00000000"
        android:strokeColor="#0099bf" />
    <path
        android:strokeWidth="1"
        android:pathData="M59.67,547.62s-10.53,-16.6 -25.32,-17"
        android:fillColor="#00000000"
        android:strokeColor="#0099bf" />
    <path
        android:strokeWidth="1"
        android:pathData="M58.3,571.32s10.53,-16.6 25.32,-17"
        android:fillColor="#00000000"
        android:strokeColor="#0099bf" />
    <path
        android:pathData="M92.71,540.56m-2.73,0a2.73,2.73 0,1 1,5.46 0a2.73,2.73 0,1 1,-5.46 0"
        android:fillColor="#0099bf" />
    <path
        android:pathData="M34.61,530.76m-2.73,0a2.73,2.73 0,1 1,5.46 0a2.73,2.73 0,1 1,-5.46 0"
        android:fillColor="#0099bf" />
    <path
        android:strokeWidth="1"
        android:pathData="M66.05,576.76s-10.53,-16.6 -25.32,-17"
        android:fillColor="#00000000"
        android:strokeColor="#0099bf" />
    <path
        android:pathData="M40.99,559.92m-2.73,0a2.73,2.73 0,1 1,5.46 0a2.73,2.73 0,1 1,-5.46 0"
        android:fillColor="#0099bf" />
    <path
        android:pathData="M83.82,554.46m-2.73,0a2.73,2.73 0,1 1,5.46 0a2.73,2.73 0,1 1,-5.46 0"
        android:fillColor="#0099bf" />
    <path
        android:pathData="M124.28,617.91S98.9,612.83 92.12,606.06 54.9,587.45 51.51,595.91s-45.69,37.23 -16.92,42.31 67.69,6.77 76.15,3.38S124.28,617.91 124.28,617.91Z"
        android:fillColor="#a8a8a8" />
    <path
        android:fillColor="#FF000000"
        android:pathData="M34.59,635.07c28.77,5.08 67.69,6.77 76.15,3.38 6.44,-2.58 10.92,-15 12.69,-20.72l0.85,0.18s-5.08,20.31 -13.54,23.69 -47.38,1.69 -76.15,-3.38c-8.3,-1.47 -10.68,-4.91 -9.78,-9.26C25.51,631.76 28.41,633.98 34.59,635.07Z"
        android:strokeAlpha="0.2"
        android:fillAlpha="0.2" />
    <path
        android:pathData="M894.83,522.54s8.38,11 -3.87,27.5 -22.35,30.51 -18.26,40.83c0,0 18.48,-30.73 33.52,-31.16S911.38,541.01 894.83,522.54Z"
        android:fillColor="#0099bf" />
    <path
        android:fillColor="#FF000000"
        android:pathData="M894.83,522.54a13.57,13.57 0,0 1,1.71 3.44c14.68,17.24 22.49,33.33 8.39,33.74 -13.14,0.38 -28.9,23.87 -32.68,29.81a12.74,12.74 0,0 0,0.45 1.35s18.48,-30.73 33.52,-31.16S911.38,541.01 894.83,522.54Z"
        android:strokeAlpha="0.1"
        android:fillAlpha="0.1" />
    <path
        android:pathData="M910.41,536.5c0,3.86 -0.43,7 -1,7s-1,-3.13 -1,-7 0.54,-2 1.07,-2S910.41,532.65 910.41,536.5Z"
        android:fillColor="#ffd037" />
    <path
        android:pathData="M915.76,541.11c-3.39,1.85 -6.34,3 -6.59,2.49s2.28,-2.35 5.67,-4.19 2.05,-0.5 2.31,0S919.14,539.26 915.76,541.11Z"
        android:fillColor="#ffd037" />
    <path
        android:pathData="M850.57,522.54s-8.38,11 3.87,27.5 22.35,30.51 18.26,40.83c0,0 -18.48,-30.73 -33.52,-31.16S834.02,541.01 850.57,522.54Z"
        android:fillColor="#0099bf" />
    <path
        android:fillColor="#FF000000"
        android:pathData="M850.57,522.54a13.57,13.57 0,0 0,-1.71 3.44c-14.68,17.24 -22.49,33.33 -8.39,33.74 13.14,0.38 28.9,23.87 32.68,29.81a12.74,12.74 0,0 1,-0.45 1.35s-18.48,-30.73 -33.52,-31.16S834.02,541.01 850.57,522.54Z"
        android:strokeAlpha="0.1"
        android:fillAlpha="0.1" />
    <path
        android:pathData="M834.99,536.5c0,3.86 0.43,7 1,7s1,-3.13 1,-7 -0.54,-2 -1.07,-2S834.99,532.65 834.99,536.5Z"
        android:fillColor="#ffd037" />
    <path
        android:pathData="M829.64,541.11c3.39,1.85 6.34,3 6.59,2.49s-2.28,-2.35 -5.67,-4.19 -2.05,-0.5 -2.31,0S826.25,539.26 829.64,541.11Z"
        android:fillColor="#ffd037" />
    <path
        android:pathData="M837.66,589.43s23.43,-0.72 30.49,-5.75 36,-11 37.79,-3 35.21,40.11 8.76,40.32 -61.46,-4.12 -68.51,-8.41S837.66,589.43 837.66,589.43Z"
        android:fillColor="#a8a8a8" />
    <path
        android:fillColor="#FF000000"
        android:pathData="M915.17,618.23c-26.45,0.21 -61.46,-4.12 -68.51,-8.41 -5.37,-3.27 -7.51,-15 -8.22,-20.41l-0.78,0s1.48,18.9 8.53,23.19 42.06,8.63 68.51,8.41c7.64,-0.06 10.27,-2.78 10.13,-6.8C923.77,616.66 920.9,618.18 915.17,618.23Z"
        android:strokeAlpha="0.2"
        android:fillAlpha="0.2" />
    <path
        android:pathData="M177.84,74.64h-6.28a4.4,4.4 0,1 0,0 -8.79L120.68,65.85a4.4,4.4 0,0 0,0 8.79h6.28a4.4,4.4 0,0 0,0 8.79h-8.79a4.4,4.4 0,0 0,0 8.79h50.88a4.4,4.4 0,1 0,0 -8.79h8.79a4.4,4.4 0,0 0,0 -8.79Z"
        android:strokeAlpha="0.5"
        android:fillColor="#dee3f3"
        android:fillAlpha="0.5" />
</vector>


================================================
FILE: app/src/main/res/drawable/undraw_drag.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<!--
     Copyright 2021 Sergio Belda
     Licensed under the Apache License, Version 2.0 (the "License");
     you may not use this file except in compliance with the License.
     You may obtain a copy of the License at
          http://www.apache.org/licenses/LICENSE-2.0
     Unless required by applicable law or agreed to in writing, software
     distributed under the License is distributed on an "AS IS" BASIS,
     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     See the License for the specific language governing permissions and
     limitations under the License.
-->

<vector xmlns:android="http://schemas.android.com/apk/res/android"
    android:width="1070.0669dp"
    android:height="619.3506dp"
    android:viewportWidth="1070.0669"
    android:viewportHeight="619.3506">
    <path
        android:pathData="M549.82,526c-2.77,0 -5.58,-0.04 -8.33,-0.13l0.06,-2c3.95,0.12 7.98,0.16 11.95,0.1l0.03,2Q551.68,526 549.82,526ZM565.56,525.54 L565.45,523.54c3.96,-0.23 7.96,-0.56 11.91,-0.97l0.21,1.99C573.59,524.97 569.55,525.3 565.56,525.54ZM529.47,525.22c-3.99,-0.31 -8.02,-0.71 -11.98,-1.19l0.24,-1.98c3.93,0.48 7.93,0.88 11.89,1.18ZM589.51,523.03 L589.21,521.05c3.93,-0.6 7.89,-1.29 11.77,-2.06l0.39,1.96C597.46,521.73 593.47,522.42 589.51,523.03ZM505.57,522.29c-3.94,-0.67 -7.92,-1.44 -11.82,-2.28l0.42,-1.96c3.87,0.84 7.82,1.6 11.73,2.27ZM613.12,518.33 L612.64,516.39c3.86,-0.95 7.74,-2.01 11.53,-3.13l0.57,1.92C620.92,516.31 617.01,517.37 613.12,518.33ZM482.05,517.19c-3.87,-1.03 -7.76,-2.16 -11.56,-3.36l0.6,-1.91c3.78,1.19 7.64,2.32 11.47,3.34ZM636.2,511.48l-0.66,-1.89c3.74,-1.3 7.51,-2.71 11.19,-4.18l0.74,1.86C643.77,508.75 639.98,510.17 636.2,511.48ZM459.06,509.92c-3.75,-1.38 -7.53,-2.87 -11.23,-4.43l0.78,-1.84c3.67,1.54 7.42,3.02 11.14,4.39ZM658.53,502.55 L657.7,500.73c3.6,-1.63 7.21,-3.38 10.74,-5.18l0.91,1.78C665.8,499.15 662.16,500.9 658.53,502.55ZM436.82,500.56c-3.61,-1.72 -7.23,-3.55 -10.77,-5.44l0.94,-1.76c3.51,1.87 7.1,3.69 10.68,5.4ZM679.93,491.61 L678.94,489.88c3.45,-1.97 6.89,-4.04 10.23,-6.15l1.07,1.69C686.87,487.54 683.41,489.63 679.93,491.61ZM415.55,489.19c-3.43,-2.04 -6.87,-4.2 -10.22,-6.4l1.1,-1.67c3.32,2.19 6.73,4.32 10.14,6.35ZM700.25,478.75L699.11,477.12c3.25,-2.27 6.49,-4.64 9.63,-7.06l1.22,1.59C706.79,474.08 703.53,476.47 700.25,478.75ZM395.43,475.94c-3.23,-2.34 -6.45,-4.8 -9.59,-7.3l1.25,-1.56c3.11,2.48 6.31,4.92 9.51,7.25ZM719.33,464.09 L718.04,462.56c3.03,-2.55 6.04,-5.21 8.95,-7.91l1.36,1.47C725.42,458.84 722.38,461.52 719.33,464.09ZM376.6,460.91c-3.01,-2.63 -5.99,-5.37 -8.88,-8.14l1.38,-1.44c2.86,2.75 5.83,5.47 8.81,8.08ZM737,447.75 L735.58,446.34c2.79,-2.83 5.55,-5.75 8.2,-8.7l1.49,1.34C742.6,441.95 739.82,444.9 737,447.75ZM359.23,444.23c-2.76,-2.9 -5.48,-5.9 -8.1,-8.91l1.51,-1.31c2.59,2.99 5.3,5.96 8.04,8.84ZM753.12,429.85 L751.58,428.58c2.52,-3.07 5,-6.23 7.38,-9.41l1.6,1.2C758.17,423.57 755.66,426.76 753.12,429.85ZM343.45,426.06c-2.48,-3.13 -4.92,-6.36 -7.25,-9.6l1.62,-1.17c2.32,3.22 4.74,6.42 7.19,9.53ZM767.55,410.56 L765.9,409.44c2.23,-3.28 4.41,-6.66 6.49,-10.05l1.71,1.05C772,403.84 769.8,407.25 767.55,410.56ZM329.4,406.53c-2.18,-3.34 -4.31,-6.78 -6.34,-10.22l1.72,-1.02c2.01,3.41 4.13,6.83 6.29,10.14ZM780.17,390.02 L778.42,389.05c1.92,-3.47 3.79,-7.04 5.55,-10.61l1.79,0.89C783.98,382.92 782.1,386.52 780.17,390.02ZM317.2,385.81c-1.87,-3.53 -3.67,-7.14 -5.38,-10.75l1.81,-0.85c1.69,3.58 3.48,7.17 5.33,10.67ZM790.85,368.4 L789.02,367.6c1.59,-3.64 3.12,-7.37 4.55,-11.08l1.87,0.72C794,360.97 792.45,364.73 790.85,368.4ZM306.95,364.08c-1.53,-3.68 -3,-7.44 -4.36,-11.19l1.88,-0.68c1.35,3.72 2.81,7.45 4.33,11.1ZM799.5,345.87 L797.6,345.24c1.25,-3.76 2.43,-7.6 3.5,-11.43l1.93,0.54C801.94,338.2 800.75,342.08 799.5,345.87ZM298.73,341.48c-1.19,-3.81 -2.31,-7.71 -3.32,-11.57l1.93,-0.51c1.01,3.84 2.12,7.7 3.3,11.49ZM806.02,322.69 L804.07,322.24c0.9,-3.85 1.71,-7.79 2.43,-11.7l1.97,0.36C807.74,314.84 806.92,318.8 806.02,322.69ZM292.62,318.2c-0.83,-3.91 -1.59,-7.89 -2.24,-11.83l1.97,-0.33c0.65,3.91 1.4,7.86 2.23,11.74ZM810.37,299.01 L808.39,298.74c0.54,-3.92 0.99,-7.91 1.35,-11.87l1.99,0.18C811.37,291.04 810.92,295.06 810.37,299.01ZM288.68,294.45c-0.47,-3.96 -0.86,-7.99 -1.15,-11.98l2,-0.15c0.29,3.96 0.67,7.96 1.14,11.89ZM812.55,275.04 L810.55,274.95c0.18,-3.96 0.27,-7.98 0.27,-11.95h2C812.82,266.99 812.73,271.04 812.55,275.04ZM286.92,270.43c-0.07,-2.45 -0.1,-4.95 -0.1,-7.43q0,-2.31 0.04,-4.61l2,0.04q-0.04,2.28 -0.04,4.57c0,2.46 0.04,4.95 0.1,7.38ZM810.8,260.21c-0.04,-3.97 -0.17,-7.98 -0.39,-11.95l2,-0.11c0.22,3.99 0.36,8.04 0.4,12.04ZM289.33,246.49l-2,-0.13c0.25,-4 0.59,-8.03 1.02,-12l1.99,0.22C289.92,238.52 289.58,242.52 289.33,246.49ZM809.48,236.35c-0.4,-3.94 -0.9,-7.93 -1.48,-11.86l1.98,-0.29c0.58,3.96 1.09,7.98 1.49,11.95ZM291.91,222.73l-1.98,-0.31c0.61,-3.96 1.32,-7.94 2.12,-11.85l1.96,0.4C293.22,214.85 292.51,218.81 291.91,222.73ZM805.98,212.72c-0.76,-3.9 -1.62,-7.83 -2.56,-11.67l1.94,-0.47c0.94,3.87 1.81,7.83 2.58,11.76ZM296.64,199.32l-1.94,-0.49c0.97,-3.87 2.05,-7.78 3.2,-11.61l1.91,0.58C298.68,191.6 297.61,195.47 296.64,199.32ZM800.33,189.5c-1.12,-3.81 -2.33,-7.64 -3.62,-11.39l1.89,-0.65c1.3,3.78 2.53,7.64 3.65,11.47ZM303.53,176.4l-1.89,-0.66c1.33,-3.78 2.76,-7.58 4.27,-11.29l1.85,0.75C306.27,168.88 304.85,172.65 303.53,176.4ZM792.56,166.91c-1.46,-3.68 -3.02,-7.37 -4.64,-10.98l1.82,-0.82c1.64,3.63 3.21,7.36 4.68,11.06ZM312.51,154.21l-1.82,-0.83c1.67,-3.64 3.45,-7.29 5.28,-10.84l1.78,0.92C315.93,146.98 314.16,150.6 312.51,154.21ZM782.77,145.17c-1.79,-3.53 -3.69,-7.07 -5.64,-10.51l1.74,-0.99c1.97,3.47 3.88,7.04 5.68,10.6ZM323.48,132.94l-1.73,-1c2,-3.46 4.1,-6.93 6.25,-10.31l1.69,1.08C327.55,126.06 325.46,129.5 323.48,132.94ZM771.02,124.41c-2.11,-3.36 -4.33,-6.72 -6.58,-9.96l1.64,-1.14c2.27,3.27 4.5,6.65 6.63,10.04ZM336.36,112.78l-1.63,-1.15c2.31,-3.27 4.72,-6.53 7.17,-9.69l1.58,1.23C341.04,106.3 338.64,109.54 336.36,112.78ZM757.42,104.79c-2.41,-3.16 -4.92,-6.29 -7.46,-9.33l1.53,-1.28c2.56,3.06 5.09,6.22 7.52,9.4ZM351.01,93.89l-1.52,-1.3c2.59,-3.04 5.28,-6.06 8.02,-8.99l1.46,1.36C356.25,87.87 353.58,90.88 351.01,93.89ZM742.08,86.48c-2.69,-2.92 -5.47,-5.82 -8.28,-8.61l1.41,-1.42c2.83,2.81 5.64,5.73 8.34,8.68ZM367.31,76.42 L365.91,74.99c2.86,-2.8 5.82,-5.56 8.8,-8.22l1.33,1.49C373.09,70.9 370.15,73.64 367.31,76.42ZM725.13,69.64c-2.94,-2.67 -5.98,-5.3 -9.04,-7.83l1.28,-1.5
Download .txt
gitextract_nt8w2kbz/

├── .editorconfig
├── .github/
│   └── workflows/
│       └── android.yml
├── .gitignore
├── LICENSE
├── README.md
├── app/
│   ├── .gitignore
│   ├── build.gradle.kts
│   ├── proguard-rules.pro
│   └── src/
│       └── main/
│           ├── AndroidManifest.xml
│           ├── java/
│           │   └── dev/
│           │       └── sergiobelda/
│           │           └── samples/
│           │               └── materialmotion/
│           │                   ├── MainActivity.kt
│           │                   ├── databinding/
│           │                   │   └── BindingAdapters.kt
│           │                   ├── messages/
│           │                   │   ├── ContactsAdapter.kt
│           │                   │   ├── Messages.kt
│           │                   │   ├── MessagesActivity.kt
│           │                   │   └── MessagesAdapter.kt
│           │                   ├── music/
│           │                   │   ├── AlbumFragment.kt
│           │                   │   ├── AlbumsAdapter.kt
│           │                   │   ├── AlbumsFragment.kt
│           │                   │   ├── ArtistsAdapter.kt
│           │                   │   ├── ArtistsFragment.kt
│           │                   │   ├── MusicActivity.kt
│           │                   │   ├── MusicData.kt
│           │                   │   └── PlaylistsFragment.kt
│           │                   ├── notes/
│           │                   │   ├── AddNoteActivity.kt
│           │                   │   ├── Note.kt
│           │                   │   ├── NoteDetailActivity.kt
│           │                   │   ├── NotesActivity.kt
│           │                   │   └── NotesAdapter.kt
│           │                   ├── planets/
│           │                   │   ├── PlanetFragment.kt
│           │                   │   ├── Planets.kt
│           │                   │   ├── PlanetsActivity.kt
│           │                   │   └── StepAdapter.kt
│           │                   ├── sample/
│           │                   │   ├── SampleItem.kt
│           │                   │   └── SamplesAdapter.kt
│           │                   ├── signin/
│           │                   │   ├── SignInActivity.kt
│           │                   │   ├── SignInFragment.kt
│           │                   │   └── WelcomeFragment.kt
│           │                   └── walkthrough/
│           │                       ├── WalkthroughActivity.kt
│           │                       └── WalkthroughFragment.kt
│           └── res/
│               ├── color/
│               │   └── step_selector.xml
│               ├── drawable/
│               │   ├── circle.xml
│               │   ├── ic_baseline_all_inclusive_24.xml
│               │   ├── ic_baseline_person_outline_24.xml
│               │   ├── ic_baseline_playlist_play_24.xml
│               │   ├── ic_launcher_background.xml
│               │   ├── ic_outline_album_24.xml
│               │   ├── ic_outline_edit_24.xml
│               │   ├── ic_outline_play_arrow_24.xml
│               │   ├── ic_round_account_circle_24.xml
│               │   ├── ic_round_add_24.xml
│               │   ├── ic_round_clear_24.xml
│               │   ├── ic_round_person_24.xml
│               │   ├── ic_round_save_24.xml
│               │   ├── step_selector.xml
│               │   ├── tab_dot.xml
│               │   ├── tab_dot_background.xml
│               │   ├── undraw_celebration.xml
│               │   ├── undraw_drag.xml
│               │   ├── undraw_social_sharing.xml
│               │   └── undraw_winners.xml
│               ├── drawable-v24/
│               │   └── ic_launcher_foreground.xml
│               ├── font/
│               │   ├── metropolis.xml
│               │   ├── metropolis_medium.otf
│               │   ├── metropolis_regular.otf
│               │   └── metropolis_semibold.otf
│               ├── layout/
│               │   ├── add_note_activity.xml
│               │   ├── album_fragment.xml
│               │   ├── albums_fragment.xml
│               │   ├── artists_fragment.xml
│               │   ├── item_album.xml
│               │   ├── item_artist.xml
│               │   ├── item_contact.xml
│               │   ├── item_message.xml
│               │   ├── item_note.xml
│               │   ├── item_sample.xml
│               │   ├── item_step.xml
│               │   ├── main_activity.xml
│               │   ├── messages_activity.xml
│               │   ├── music_activity.xml
│               │   ├── note_detail_activity.xml
│               │   ├── notes_activity.xml
│               │   ├── planet_fragment.xml
│               │   ├── planets_activity.xml
│               │   ├── playlists_fragment.xml
│               │   ├── sign_in_activity.xml
│               │   ├── sign_in_fragment.xml
│               │   ├── walkthrough_activity.xml
│               │   ├── walkthrough_fragment.xml
│               │   └── welcome_fragment.xml
│               ├── menu/
│               │   └── navigation_menu.xml
│               ├── mipmap-anydpi-v26/
│               │   ├── ic_launcher.xml
│               │   └── ic_launcher_round.xml
│               ├── navigation/
│               │   └── nav_graph.xml
│               └── values/
│                   ├── colors.xml
│                   ├── dimens.xml
│                   ├── font_certs.xml
│                   ├── ic_launcher_background.xml
│                   ├── shape.xml
│                   ├── strings.xml
│                   ├── styles.xml
│                   └── type.xml
├── build-logic/
│   ├── .gitignore
│   ├── convention/
│   │   ├── build.gradle.kts
│   │   └── src/
│   │       └── main/
│   │           └── kotlin/
│   │               └── SpotlessConventionPlugin.kt
│   ├── gradle/
│   │   └── wrapper/
│   │       ├── gradle-wrapper.jar
│   │       └── gradle-wrapper.properties
│   ├── gradle.properties
│   ├── gradlew
│   ├── gradlew.bat
│   └── settings.gradle.kts
├── build.gradle.kts
├── gradle/
│   ├── libs.versions.toml
│   └── wrapper/
│       ├── gradle-wrapper.jar
│       └── gradle-wrapper.properties
├── gradle.properties
├── gradlew
├── gradlew.bat
├── renovate.json
├── settings.gradle.kts
└── spotless/
    ├── copyright.kt
    ├── copyright.kts
    └── copyright.xml
Condensed preview — 122 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (415K chars).
[
  {
    "path": ".editorconfig",
    "chars": 64,
    "preview": "[*.{kt,kts}]\nktlint_standard_backing-property-naming = disabled\n"
  },
  {
    "path": ".github/workflows/android.yml",
    "chars": 551,
    "preview": "name: Android CI\n\non:\n  push:\n    branches:\n      - main\n      - develop\n  pull_request:\n    branches:\n      - main\n    "
  },
  {
    "path": ".gitignore",
    "chars": 226,
    "preview": "*.iml\n.gradle\n/local.properties\n/.idea/caches\n/.idea/libraries\n/.idea/modules.xml\n/.idea/workspace.xml\n/.idea/navEditor."
  },
  {
    "path": "LICENSE",
    "chars": 11349,
    "preview": "                                 Apache License\n                           Version 2.0, January 2004\n                   "
  },
  {
    "path": "README.md",
    "chars": 1981,
    "preview": "<h1 align=\"center\">Material Motion Samples</h1></br>\n\n<h5 align=\"center\">\nA collection of samples using Material Compone"
  },
  {
    "path": "app/.gitignore",
    "chars": 7,
    "preview": "/build\n"
  },
  {
    "path": "app/build.gradle.kts",
    "chars": 1688,
    "preview": "@Suppress(\"DSL_SCOPE_VIOLATION\")\nplugins {\n    alias(libs.plugins.androidApplication)\n    kotlin(\"android\")\n    kotlin(\""
  },
  {
    "path": "app/proguard-rules.pro",
    "chars": 748,
    "preview": "# Add project specific ProGuard rules here.\n# You can control the set of applied configuration files using the\n# proguar"
  },
  {
    "path": "app/src/main/AndroidManifest.xml",
    "chars": 2847,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n     Copyright 2021 Sergio Belda\n     Licensed under the Apache License, Ver"
  },
  {
    "path": "app/src/main/java/dev/sergiobelda/samples/materialmotion/MainActivity.kt",
    "chars": 1930,
    "preview": "/*\n * Copyright 2021 Sergio Belda\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not u"
  },
  {
    "path": "app/src/main/java/dev/sergiobelda/samples/materialmotion/databinding/BindingAdapters.kt",
    "chars": 918,
    "preview": "/*\n * Copyright 2021 Sergio Belda\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not u"
  },
  {
    "path": "app/src/main/java/dev/sergiobelda/samples/materialmotion/messages/ContactsAdapter.kt",
    "chars": 1593,
    "preview": "/*\n * Copyright 2021 Sergio Belda\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not u"
  },
  {
    "path": "app/src/main/java/dev/sergiobelda/samples/materialmotion/messages/Messages.kt",
    "chars": 2125,
    "preview": "/*\n * Copyright 2021 Sergio Belda\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not u"
  },
  {
    "path": "app/src/main/java/dev/sergiobelda/samples/materialmotion/messages/MessagesActivity.kt",
    "chars": 5410,
    "preview": "/*\n * Copyright 2021 Sergio Belda\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not u"
  },
  {
    "path": "app/src/main/java/dev/sergiobelda/samples/materialmotion/messages/MessagesAdapter.kt",
    "chars": 1585,
    "preview": "/*\n * Copyright 2021 Sergio Belda\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not u"
  },
  {
    "path": "app/src/main/java/dev/sergiobelda/samples/materialmotion/music/AlbumFragment.kt",
    "chars": 4184,
    "preview": "/*\n * Copyright 2021 Sergio Belda\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not u"
  },
  {
    "path": "app/src/main/java/dev/sergiobelda/samples/materialmotion/music/AlbumsAdapter.kt",
    "chars": 3479,
    "preview": "/*\n * Copyright 2021 Sergio Belda\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not u"
  },
  {
    "path": "app/src/main/java/dev/sergiobelda/samples/materialmotion/music/AlbumsFragment.kt",
    "chars": 2757,
    "preview": "/*\n * Copyright 2021 Sergio Belda\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not u"
  },
  {
    "path": "app/src/main/java/dev/sergiobelda/samples/materialmotion/music/ArtistsAdapter.kt",
    "chars": 1572,
    "preview": "/*\n * Copyright 2021 Sergio Belda\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not u"
  },
  {
    "path": "app/src/main/java/dev/sergiobelda/samples/materialmotion/music/ArtistsFragment.kt",
    "chars": 1969,
    "preview": "/*\n * Copyright 2021 Sergio Belda\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not u"
  },
  {
    "path": "app/src/main/java/dev/sergiobelda/samples/materialmotion/music/MusicActivity.kt",
    "chars": 2377,
    "preview": "/*\n * Copyright 2021 Sergio Belda\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not u"
  },
  {
    "path": "app/src/main/java/dev/sergiobelda/samples/materialmotion/music/MusicData.kt",
    "chars": 2682,
    "preview": "/*\n * Copyright 2021 Sergio Belda\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not u"
  },
  {
    "path": "app/src/main/java/dev/sergiobelda/samples/materialmotion/music/PlaylistsFragment.kt",
    "chars": 1326,
    "preview": "/*\n * Copyright 2021 Sergio Belda\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not u"
  },
  {
    "path": "app/src/main/java/dev/sergiobelda/samples/materialmotion/notes/AddNoteActivity.kt",
    "chars": 2945,
    "preview": "/*\n * Copyright 2021 Sergio Belda\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not u"
  },
  {
    "path": "app/src/main/java/dev/sergiobelda/samples/materialmotion/notes/Note.kt",
    "chars": 3384,
    "preview": "/*\n * Copyright 2021 Sergio Belda\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not u"
  },
  {
    "path": "app/src/main/java/dev/sergiobelda/samples/materialmotion/notes/NoteDetailActivity.kt",
    "chars": 2680,
    "preview": "/*\n * Copyright 2021 Sergio Belda\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not u"
  },
  {
    "path": "app/src/main/java/dev/sergiobelda/samples/materialmotion/notes/NotesActivity.kt",
    "chars": 3552,
    "preview": "/*\n * Copyright 2021 Sergio Belda\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not u"
  },
  {
    "path": "app/src/main/java/dev/sergiobelda/samples/materialmotion/notes/NotesAdapter.kt",
    "chars": 2011,
    "preview": "/*\n * Copyright 2021 Sergio Belda\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not u"
  },
  {
    "path": "app/src/main/java/dev/sergiobelda/samples/materialmotion/planets/PlanetFragment.kt",
    "chars": 2499,
    "preview": "/*\n * Copyright 2021 Sergio Belda\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not u"
  },
  {
    "path": "app/src/main/java/dev/sergiobelda/samples/materialmotion/planets/Planets.kt",
    "chars": 7528,
    "preview": "/*\n * Copyright 2021 Sergio Belda\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not u"
  },
  {
    "path": "app/src/main/java/dev/sergiobelda/samples/materialmotion/planets/PlanetsActivity.kt",
    "chars": 3265,
    "preview": "/*\n * Copyright 2021 Sergio Belda\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not u"
  },
  {
    "path": "app/src/main/java/dev/sergiobelda/samples/materialmotion/planets/StepAdapter.kt",
    "chars": 2362,
    "preview": "/*\n * Copyright 2021 Sergio Belda\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not u"
  },
  {
    "path": "app/src/main/java/dev/sergiobelda/samples/materialmotion/sample/SampleItem.kt",
    "chars": 2560,
    "preview": "/*\n * Copyright 2021 Sergio Belda\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not u"
  },
  {
    "path": "app/src/main/java/dev/sergiobelda/samples/materialmotion/sample/SamplesAdapter.kt",
    "chars": 1855,
    "preview": "/*\n * Copyright 2021 Sergio Belda\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not u"
  },
  {
    "path": "app/src/main/java/dev/sergiobelda/samples/materialmotion/signin/SignInActivity.kt",
    "chars": 1449,
    "preview": "/*\n * Copyright 2021 Sergio Belda\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not u"
  },
  {
    "path": "app/src/main/java/dev/sergiobelda/samples/materialmotion/signin/SignInFragment.kt",
    "chars": 2271,
    "preview": "/*\n * Copyright 2021 Sergio Belda\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not u"
  },
  {
    "path": "app/src/main/java/dev/sergiobelda/samples/materialmotion/signin/WelcomeFragment.kt",
    "chars": 2344,
    "preview": "/*\n * Copyright 2021 Sergio Belda\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not u"
  },
  {
    "path": "app/src/main/java/dev/sergiobelda/samples/materialmotion/walkthrough/WalkthroughActivity.kt",
    "chars": 4409,
    "preview": "/*\n * Copyright 2021 Sergio Belda\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not u"
  },
  {
    "path": "app/src/main/java/dev/sergiobelda/samples/materialmotion/walkthrough/WalkthroughFragment.kt",
    "chars": 3161,
    "preview": "/*\n * Copyright 2021 Sergio Belda\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not u"
  },
  {
    "path": "app/src/main/res/color/step_selector.xml",
    "chars": 865,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n     Copyright 2021 Sergio Belda\n     Licensed under the Apache License, Ver"
  },
  {
    "path": "app/src/main/res/drawable/circle.xml",
    "chars": 873,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n     Copyright 2021 Sergio Belda\n     Licensed under the Apache License, Ver"
  },
  {
    "path": "app/src/main/res/drawable/ic_baseline_all_inclusive_24.xml",
    "chars": 1554,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n     Copyright 2021 Sergio Belda\n     Licensed under the Apache License, Ver"
  },
  {
    "path": "app/src/main/res/drawable/ic_baseline_person_outline_24.xml",
    "chars": 1257,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n     Copyright 2021 Sergio Belda\n     Licensed under the Apache License, Ver"
  },
  {
    "path": "app/src/main/res/drawable/ic_baseline_playlist_play_24.xml",
    "chars": 1035,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n     Copyright 2021 Sergio Belda\n     Licensed under the Apache License, Ver"
  },
  {
    "path": "app/src/main/res/drawable/ic_launcher_background.xml",
    "chars": 6217,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n     Copyright 2021 Sergio Belda\n     Licensed under the Apache License, Ver"
  },
  {
    "path": "app/src/main/res/drawable/ic_outline_album_24.xml",
    "chars": 1270,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n     Copyright 2021 Sergio Belda\n     Licensed under the Apache License, Ver"
  },
  {
    "path": "app/src/main/res/drawable/ic_outline_edit_24.xml",
    "chars": 1225,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n     Copyright 2021 Sergio Belda\n     Licensed under the Apache License, Ver"
  },
  {
    "path": "app/src/main/res/drawable/ic_outline_play_arrow_24.xml",
    "chars": 1025,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n     Copyright 2021 Sergio Belda\n     Licensed under the Apache License, Ver"
  },
  {
    "path": "app/src/main/res/drawable/ic_round_account_circle_24.xml",
    "chars": 1226,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n     Copyright 2021 Sergio Belda\n     Licensed under the Apache License, Ver"
  },
  {
    "path": "app/src/main/res/drawable/ic_round_add_24.xml",
    "chars": 1135,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n     Copyright 2021 Sergio Belda\n     Licensed under the Apache License, Ver"
  },
  {
    "path": "app/src/main/res/drawable/ic_round_clear_24.xml",
    "chars": 1298,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n     Copyright 2021 Sergio Belda\n     Licensed under the Apache License, Ver"
  },
  {
    "path": "app/src/main/res/drawable/ic_round_person_24.xml",
    "chars": 1139,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n     Copyright 2021 Sergio Belda\n     Licensed under the Apache License, Ver"
  },
  {
    "path": "app/src/main/res/drawable/ic_round_save_24.xml",
    "chars": 1280,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n     Copyright 2021 Sergio Belda\n     Licensed under the Apache License, Ver"
  },
  {
    "path": "app/src/main/res/drawable/step_selector.xml",
    "chars": 810,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n     Copyright 2021 Sergio Belda\n     Licensed under the Apache License, Ver"
  },
  {
    "path": "app/src/main/res/drawable/tab_dot.xml",
    "chars": 871,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n     Copyright 2021 Sergio Belda\n     Licensed under the Apache License, Ver"
  },
  {
    "path": "app/src/main/res/drawable/tab_dot_background.xml",
    "chars": 895,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n     Copyright 2021 Sergio Belda\n     Licensed under the Apache License, Ver"
  },
  {
    "path": "app/src/main/res/drawable/undraw_celebration.xml",
    "chars": 58317,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n     Copyright 2021 Sergio Belda\n     Licensed under the Apache License, Ver"
  },
  {
    "path": "app/src/main/res/drawable/undraw_drag.xml",
    "chars": 16130,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n     Copyright 2021 Sergio Belda\n     Licensed under the Apache License, Ver"
  },
  {
    "path": "app/src/main/res/drawable/undraw_social_sharing.xml",
    "chars": 15170,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n     Copyright 2021 Sergio Belda\n     Licensed under the Apache License, Ver"
  },
  {
    "path": "app/src/main/res/drawable/undraw_winners.xml",
    "chars": 56385,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n     Copyright 2021 Sergio Belda\n     Licensed under the Apache License, Ver"
  },
  {
    "path": "app/src/main/res/drawable-v24/ic_launcher_foreground.xml",
    "chars": 2352,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n     Copyright 2021 Sergio Belda\n     Licensed under the Apache License, Ver"
  },
  {
    "path": "app/src/main/res/font/metropolis.xml",
    "chars": 1035,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n     Copyright 2021 Sergio Belda\n     Licensed under the Apache License, Ver"
  },
  {
    "path": "app/src/main/res/layout/add_note_activity.xml",
    "chars": 4198,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n     Copyright 2021 Sergio Belda\n     Licensed under the Apache License, Ver"
  },
  {
    "path": "app/src/main/res/layout/album_fragment.xml",
    "chars": 2985,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n     Copyright 2021 Sergio Belda\n     Licensed under the Apache License, Ver"
  },
  {
    "path": "app/src/main/res/layout/albums_fragment.xml",
    "chars": 1134,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n     Copyright 2021 Sergio Belda\n     Licensed under the Apache License, Ver"
  },
  {
    "path": "app/src/main/res/layout/artists_fragment.xml",
    "chars": 1092,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n     Copyright 2021 Sergio Belda\n     Licensed under the Apache License, Ver"
  },
  {
    "path": "app/src/main/res/layout/item_album.xml",
    "chars": 2642,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n     Copyright 2021 Sergio Belda\n     Licensed under the Apache License, Ver"
  },
  {
    "path": "app/src/main/res/layout/item_artist.xml",
    "chars": 2074,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n     Copyright 2021 Sergio Belda\n     Licensed under the Apache License, Ver"
  },
  {
    "path": "app/src/main/res/layout/item_contact.xml",
    "chars": 2202,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n     Copyright 2021 Sergio Belda\n     Licensed under the Apache License, Ver"
  },
  {
    "path": "app/src/main/res/layout/item_message.xml",
    "chars": 4314,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n     Copyright 2021 Sergio Belda\n     Licensed under the Apache License, Ver"
  },
  {
    "path": "app/src/main/res/layout/item_note.xml",
    "chars": 2543,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n     Copyright 2021 Sergio Belda\n     Licensed under the Apache License, Ver"
  },
  {
    "path": "app/src/main/res/layout/item_sample.xml",
    "chars": 2457,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n     Copyright 2021 Sergio Belda\n     Licensed under the Apache License, Ver"
  },
  {
    "path": "app/src/main/res/layout/item_step.xml",
    "chars": 2185,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n     Copyright 2021 Sergio Belda\n     Licensed under the Apache License, Ver"
  },
  {
    "path": "app/src/main/res/layout/main_activity.xml",
    "chars": 3274,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n     Copyright 2021 Sergio Belda\n     Licensed under the Apache License, Ver"
  },
  {
    "path": "app/src/main/res/layout/messages_activity.xml",
    "chars": 4388,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n     Copyright 2021 Sergio Belda\n     Licensed under the Apache License, Ver"
  },
  {
    "path": "app/src/main/res/layout/music_activity.xml",
    "chars": 2819,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n     Copyright 2021 Sergio Belda\n     Licensed under the Apache License, Ver"
  },
  {
    "path": "app/src/main/res/layout/note_detail_activity.xml",
    "chars": 2570,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n     Copyright 2021 Sergio Belda\n     Licensed under the Apache License, Ver"
  },
  {
    "path": "app/src/main/res/layout/notes_activity.xml",
    "chars": 2649,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n     Copyright 2021 Sergio Belda\n     Licensed under the Apache License, Ver"
  },
  {
    "path": "app/src/main/res/layout/planet_fragment.xml",
    "chars": 2759,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n     Copyright 2021 Sergio Belda\n     Licensed under the Apache License, Ver"
  },
  {
    "path": "app/src/main/res/layout/planets_activity.xml",
    "chars": 2901,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n     Copyright 2021 Sergio Belda\n     Licensed under the Apache License, Ver"
  },
  {
    "path": "app/src/main/res/layout/playlists_fragment.xml",
    "chars": 913,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n     Copyright 2021 Sergio Belda\n     Licensed under the Apache License, Ver"
  },
  {
    "path": "app/src/main/res/layout/sign_in_activity.xml",
    "chars": 1179,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n     Copyright 2021 Sergio Belda\n     Licensed under the Apache License, Ver"
  },
  {
    "path": "app/src/main/res/layout/sign_in_fragment.xml",
    "chars": 3967,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n     Copyright 2021 Sergio Belda\n     Licensed under the Apache License, Ver"
  },
  {
    "path": "app/src/main/res/layout/walkthrough_activity.xml",
    "chars": 2575,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n     Copyright 2021 Sergio Belda\n     Licensed under the Apache License, Ver"
  },
  {
    "path": "app/src/main/res/layout/walkthrough_fragment.xml",
    "chars": 2222,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n     Copyright 2021 Sergio Belda\n     Licensed under the Apache License, Ver"
  },
  {
    "path": "app/src/main/res/layout/welcome_fragment.xml",
    "chars": 1722,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n     Copyright 2021 Sergio Belda\n     Licensed under the Apache License, Ver"
  },
  {
    "path": "app/src/main/res/menu/navigation_menu.xml",
    "chars": 1188,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n     Copyright 2021 Sergio Belda\n     Licensed under the Apache License, Ver"
  },
  {
    "path": "app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml",
    "chars": 878,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n     Copyright 2021 Sergio Belda\n     Licensed under the Apache License, Ver"
  },
  {
    "path": "app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml",
    "chars": 878,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n     Copyright 2021 Sergio Belda\n     Licensed under the Apache License, Ver"
  },
  {
    "path": "app/src/main/res/navigation/nav_graph.xml",
    "chars": 1918,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n     Copyright 2021 Sergio Belda\n     Licensed under the Apache License, Ver"
  },
  {
    "path": "app/src/main/res/values/colors.xml",
    "chars": 1385,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n     Copyright 2021 Sergio Belda\n     Licensed under the Apache License, Ver"
  },
  {
    "path": "app/src/main/res/values/dimens.xml",
    "chars": 813,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n     Copyright 2021 Sergio Belda\n     Licensed under the Apache License, Ver"
  },
  {
    "path": "app/src/main/res/values/font_certs.xml",
    "chars": 4192,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n     Copyright 2021 Sergio Belda\n     Licensed under the Apache License, Ver"
  },
  {
    "path": "app/src/main/res/values/ic_launcher_background.xml",
    "chars": 731,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n     Copyright 2021 Sergio Belda\n     Licensed under the Apache License, Ver"
  },
  {
    "path": "app/src/main/res/values/shape.xml",
    "chars": 2379,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n     Copyright 2021 Sergio Belda\n     Licensed under the Apache License, Ver"
  },
  {
    "path": "app/src/main/res/values/strings.xml",
    "chars": 3132,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n     Copyright 2021 Sergio Belda\n     Licensed under the Apache License, Ver"
  },
  {
    "path": "app/src/main/res/values/styles.xml",
    "chars": 2330,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n     Copyright 2021 Sergio Belda\n     Licensed under the Apache License, Ver"
  },
  {
    "path": "app/src/main/res/values/type.xml",
    "chars": 2219,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n     Copyright 2021 Sergio Belda\n     Licensed under the Apache License, Ver"
  },
  {
    "path": "build-logic/.gitignore",
    "chars": 67,
    "preview": "*.iml\n/.idea/\n/build/\n/convention/build/\n/local.properties\n.gradle\n"
  },
  {
    "path": "build-logic/convention/build.gradle.kts",
    "chars": 499,
    "preview": "plugins {\n    `kotlin-dsl`\n}\n\ngroup = \"dev.sergiobelda.samples.materialmotion.buildlogic\"\n\njava {\n    sourceCompatibilit"
  },
  {
    "path": "build-logic/convention/src/main/kotlin/SpotlessConventionPlugin.kt",
    "chars": 2263,
    "preview": "/*\n * Copyright 2022 Sergio Belda\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not u"
  },
  {
    "path": "build-logic/gradle/wrapper/gradle-wrapper.properties",
    "chars": 252,
    "preview": "distributionBase=GRADLE_USER_HOME\ndistributionPath=wrapper/dists\ndistributionUrl=https\\://services.gradle.org/distributi"
  },
  {
    "path": "build-logic/gradle.properties",
    "chars": 27,
    "preview": "kotlin.code.style=official\n"
  },
  {
    "path": "build-logic/gradlew",
    "chars": 8595,
    "preview": "#!/bin/sh\n\n#\n# Copyright © 2015 the original authors.\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\")"
  },
  {
    "path": "build-logic/gradlew.bat",
    "chars": 2896,
    "preview": "@rem\r\n@rem Copyright 2015 the original author or authors.\r\n@rem\r\n@rem Licensed under the Apache License, Version 2.0 (th"
  },
  {
    "path": "build-logic/settings.gradle.kts",
    "chars": 329,
    "preview": "rootProject.name = \"build-logic\"\n\nenableFeaturePreview(\"TYPESAFE_PROJECT_ACCESSORS\")\n\ndependencyResolutionManagement {\n "
  },
  {
    "path": "build.gradle.kts",
    "chars": 294,
    "preview": "@file:Suppress(\"DSL_SCOPE_VIOLATION\")\nplugins {\n    alias(libs.plugins.androidApplication) apply false\n    alias(libs.pl"
  },
  {
    "path": "gradle/libs.versions.toml",
    "chars": 2135,
    "preview": "[versions]\nandroidCore = \"1.17.0\"\nandroidGradlePlugin = \"8.13.2\"\nandroidTestJunit = \"1.3.0\"\nappcompat = \"1.7.1\"\nconstrai"
  },
  {
    "path": "gradle/wrapper/gradle-wrapper.properties",
    "chars": 252,
    "preview": "distributionBase=GRADLE_USER_HOME\ndistributionPath=wrapper/dists\ndistributionUrl=https\\://services.gradle.org/distributi"
  },
  {
    "path": "gradle.properties",
    "chars": 1274,
    "preview": "# Project-wide Gradle settings.\n# IDE (e.g. Android Studio) users:\n# Gradle settings configured through the IDE *will ov"
  },
  {
    "path": "gradlew",
    "chars": 8595,
    "preview": "#!/bin/sh\n\n#\n# Copyright © 2015 the original authors.\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\")"
  },
  {
    "path": "gradlew.bat",
    "chars": 2896,
    "preview": "@rem\r\n@rem Copyright 2015 the original author or authors.\r\n@rem\r\n@rem Licensed under the Apache License, Version 2.0 (th"
  },
  {
    "path": "renovate.json",
    "chars": 272,
    "preview": "{\n  \"enabled\": false,\n  \"$schema\": \"https://docs.renovatebot.com/renovate-schema.json\",\n  \"extends\": [\n    \"config:base\""
  },
  {
    "path": "settings.gradle.kts",
    "chars": 373,
    "preview": "pluginManagement {\n    includeBuild(\"build-logic\")\n    repositories {\n        google()\n        mavenCentral()\n        gr"
  },
  {
    "path": "spotless/copyright.kt",
    "chars": 598,
    "preview": "/*\n * Copyright $YEAR Sergio Belda\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not "
  },
  {
    "path": "spotless/copyright.kts",
    "chars": 598,
    "preview": "/*\n * Copyright $YEAR Sergio Belda\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not "
  },
  {
    "path": "spotless/copyright.xml",
    "chars": 651,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n     Copyright $YEAR Sergio Belda\n     Licensed under the Apache License, Ve"
  }
]

// ... and 5 more files (download for full content)

About this extraction

This page contains the full source code of the serbelga/Material-Motion-Samples GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 122 files (382.5 KB), approximately 147.0k tokens. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!