[
  {
    "path": ".gitignore",
    "content": "# Built application files\n*.apk\n*.ap_\n\n# Files for the ART/Dalvik VM\n*.dex\n\n# Java class files\n*.class\n\n# Generated files\nbin/\ngen/\nout/\n\n# Gradle files\n.gradle/\nbuild/\n\n# Local configuration file (sdk path, etc)\nlocal.properties\n\n# Proguard folder generated by Eclipse\nproguard/\n\n# Log Files\n*.log\n\n# Android Studio Navigation editor temp files\n.navigation/\n\n# Android Studio captures folder\ncaptures/\n\n# IntelliJ\n*.iml\n.idea/\n\n# Keystore files\n# Uncomment the following line if you do not want to check your keystore files in.\n#*.jks\n\n# External native build folder generated in Android Studio 2.2 and later\n.externalNativeBuild\n\n# Google Services (e.g. APIs or Firebase)\ngoogle-services.json\n\n# Freeline\nfreeline.py\nfreeline/\nfreeline_project_description.json\n\n# fastlane\nfastlane/report.xml\nfastlane/Preview.html\nfastlane/screenshots\nfastlane/test_output\nfastlane/readme.md\n\n# DS Store\n*.DS_Store"
  },
  {
    "path": "LICENSE.md",
    "content": "MIT License\n\nCopyright (c) 2018 10Clouds\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "README.md",
    "content": "# Fluid Bottom Navigation  [![Build Status](https://app.bitrise.io/app/339f26db491c854d/status.svg?token=DM799a3_NFuYxusOX-zoKA&branch=master)](https://app.bitrise.io/app/339f26db491c854d)  [![Download library](https://api.bintray.com/packages/10clouds-android/fluidbottomnavigation/fluid-bottom-navigation/images/download.svg)](https://bintray.com/10clouds-android/fluidbottomnavigation/fluid-bottom-navigation)\n\n\n\n## Sample\n<p align=\"center\">\n  <img src=\"static/sample.gif\" alt=\"Sample Fluid Bottom Navigation\"/>\n</p>\n\n\n## Installation\nUse the JitPack package repository.\n\nAdd `jitpack.io` repository to your root `build.gradle` file:\n```groovy\nallprojects {\n    repositories {\n        ...\n        maven { url 'https://jitpack.io' }\n    }\n}\n```\n\nNext add library to your project `build.gradle` file:\n**Gradle:**\n```groovy\nimplementation 'com.github.10clouds:FluidBottomNavigation-android:{last_release_version}'\n```\n\n## Usage\nPlace **FluidBottomNavigation** in your layout:\n```xml\n<com.tenclouds.fluidbottomnavigation.FluidBottomNavigation\n            android:id=\"@+id/fluidBottomNavigation\"\n            android:layout_height=\"wrap_content\"\n            android:layout_width=\"0dp\" />\n```\nthen set navigation items to component:\n```kotlin\nfluidBottomNavigation.items =\n                listOf(\n                        FluidBottomNavigationItem(\n                                getString(R.string.news),\n                                ContextCompat.getDrawable(this, R.drawable.ic_news)),\n                        FluidBottomNavigationItem(\n                                getString(R.string.inbox),\n                                ContextCompat.getDrawable(this, R.drawable.ic_inbox)),\n                        FluidBottomNavigationItem(\n                                getString(R.string.calendar),\n                                ContextCompat.getDrawable(this, R.drawable.ic_calendar)),\n                        FluidBottomNavigationItem(\n                                getString(R.string.chat),\n                                ContextCompat.getDrawable(this, R.drawable.ic_chat)),\n                        FluidBottomNavigationItem(\n                                getString(R.string.profile),\n                                ContextCompat.getDrawable(this, R.drawable.ic_profile)))\n```\n**Application with example is in [app folder](https://github.com/10clouds/FluidBottomNavigation-android/tree/master/app)**\n\n## Customization\nYou can customize component from XML layout file, using attributes: \n```\napp:accentColor=\"@color/accentColor\"\napp:backColor=\"@color/backColor\"\napp:iconColor=\"@color/iconColor\"\napp:iconSelectedColor=\"@color/iconSelectedColor\"\napp:textColor=\"@color/textColor\"\n```\nor from Java/Kotlin code:\n```kotlin \nfluidBottomNavigation.accentColor = ContextCompat.getColor(this, R.color.accentColor)\nfluidBottomNavigation.backColor = ContextCompat.getColor(this, R.color.backColor)\nfluidBottomNavigation.textColor = ContextCompat.getColor(this, R.color.textColor)\nfluidBottomNavigation.iconColor = ContextCompat.getColor(this, R.color.iconColor)\nfluidBottomNavigation.iconSelectedColor = ContextCompat.getColor(this, R.color.iconSelectedColor)\n```\n\n---\nLibrary made by **[Jakub Jodełka](https://github.com/jakubjodelka)**"
  },
  {
    "path": "app/.gitignore",
    "content": "/build\n"
  },
  {
    "path": "app/build.gradle",
    "content": "apply plugin: 'com.android.application'\napply plugin: 'kotlin-android'\napply plugin: 'kotlin-android-extensions'\n\nandroid {\n    compileSdkVersion 29\n\n    defaultConfig {\n        applicationId \"com.tenclouds.fluidbottomnavigationexample\"\n        minSdkVersion 15\n        targetSdkVersion 29\n        versionCode 1\n        versionName \"1.0\"\n        vectorDrawables.useSupportLibrary = true\n    }\n\n    buildTypes {\n        release {\n            minifyEnabled false\n            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'\n        }\n    }\n}\n\ndependencies {\n    implementation fileTree(dir: 'libs', include: ['*.jar'])\n    implementation project(\":fluidbottomnavigation\")\n\n    implementation \"org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version\"\n    implementation \"androidx.core:core:$androidx_version\"\n    implementation \"androidx.core:core-ktx:$androidx_version\"\n    implementation \"androidx.appcompat:appcompat:$androidx_version\"\n    implementation \"androidx.constraintlayout:constraintlayout:$constraint_version\"\n}\n"
  },
  {
    "path": "app/proguard-rules.pro",
    "content": "# Add project specific ProGuard rules here.\n# You can control the set of applied configuration files using the\n# proguardFiles setting in build.gradle.\n#\n# For more details, see\n#   http://developer.android.com/guide/developing/tools/proguard.html\n\n# If your project uses WebView with JS, uncomment the following\n# and specify the fully qualified class name to the JavaScript interface\n# class:\n#-keepclassmembers class fqcn.of.javascript.interface.for.webview {\n#   public *;\n#}\n\n# Uncomment this to preserve the line number information for\n# debugging stack traces.\n#-keepattributes SourceFile,LineNumberTable\n\n# If you keep the line number information, uncomment this to\n# hide the original source file name.\n#-renamesourcefileattribute SourceFile\n"
  },
  {
    "path": "app/src/main/AndroidManifest.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n          package=\"com.tenclouds.fluidbottomnavigationexample\">\n\n    <application\n            android:allowBackup=\"true\"\n            android:icon=\"@mipmap/ic_launcher\"\n            android:label=\"@string/app_name\"\n            android:roundIcon=\"@mipmap/ic_launcher_round\"\n            android:supportsRtl=\"true\"\n            android:theme=\"@style/AppTheme\">\n        <activity\n                android:name=\".MainActivity\"\n                android:label=\"@string/app_name\">\n            <intent-filter>\n                <action android:name=\"android.intent.action.MAIN\"/>\n\n                <category android:name=\"android.intent.category.LAUNCHER\"/>\n            </intent-filter>\n        </activity>\n    </application>\n\n</manifest>"
  },
  {
    "path": "app/src/main/java/com/tenclouds/fluidbottomnavigationexample/MainActivity.kt",
    "content": "package com.tenclouds.fluidbottomnavigationexample\n\nimport android.os.Bundle\nimport androidx.appcompat.app.AppCompatActivity\nimport androidx.core.content.ContextCompat\nimport com.tenclouds.fluidbottomnavigation.FluidBottomNavigationItem\nimport kotlinx.android.synthetic.main.activity_main.*\n\nclass MainActivity : AppCompatActivity() {\n\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n        setContentView(R.layout.activity_main)\n\n        fluidBottomNavigation.accentColor = ContextCompat.getColor(this, R.color.colorPrimaryDark)\n        fluidBottomNavigation.backColor = ContextCompat.getColor(this, R.color.colorPrimaryDark)\n        fluidBottomNavigation.textColor = ContextCompat.getColor(this, R.color.colorPrimaryDark)\n        fluidBottomNavigation.iconColor = ContextCompat.getColor(this, R.color.colorPrimary)\n        fluidBottomNavigation.iconSelectedColor = ContextCompat.getColor(this, R.color.iconSelectedColor)\n\n        fluidBottomNavigation.items =\n                listOf(\n                        FluidBottomNavigationItem(\n                                getString(R.string.news),\n                                ContextCompat.getDrawable(this, R.drawable.ic_news)),\n                        FluidBottomNavigationItem(\n                                getString(R.string.inbox),\n                                ContextCompat.getDrawable(this, R.drawable.ic_inbox)),\n                        FluidBottomNavigationItem(\n                                getString(R.string.calendar),\n                                ContextCompat.getDrawable(this, R.drawable.ic_calendar)),\n                        FluidBottomNavigationItem(\n                                getString(R.string.chat),\n                                ContextCompat.getDrawable(this, R.drawable.ic_chat)),\n                        FluidBottomNavigationItem(\n                                getString(R.string.profile),\n                                ContextCompat.getDrawable(this, R.drawable.ic_profile)))\n    }\n}"
  },
  {
    "path": "app/src/main/res/drawable/background.xml",
    "content": "<shape xmlns:android=\"http://schemas.android.com/apk/res/android\" android:shape=\"rectangle\" >\n\n    <gradient\n            android:angle=\"90\"\n            android:endColor=\"@color/colorPrimary\"\n            android:startColor=\"@color/colorPrimaryDark\"\n            android:type=\"linear\" />\n</shape>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_calendar.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"20dp\"\n    android:height=\"20dp\"\n    android:viewportWidth=\"20\"\n    android:viewportHeight=\"20\">\n\n    <group\n            android:translateX=\"-960.000000\"\n            android:translateY=\"-789.000000\">\n        <path\n            android:fillColor=\"#ABAEFF\"\n            android:strokeWidth=\"1\"\n            android:pathData=\"M963.333333,809 L976.666667,809 C978.507616,809 980,807.507616 980,805.666667 L980,792.333333 C980,790.492384 978.507616,789 976.666667,789 L963.333333,789 C961.492384,789 960,790.492384 960,792.333333 L960,805.666667 C960,807.507616 961.492384,809 963.333333,809 Z M976.666667,807.333333 L963.333333,807.333333 C962.412859,807.333333 961.666667,806.587141 961.666667,805.666667 L961.666667,795.666667 L978.333333,795.666667 L978.333333,805.666667 C978.333333,806.587141 977.587141,807.333333 976.666667,807.333333 Z M963.333333,790.666667 L976.666667,790.666667 C977.587141,790.666667 978.333333,791.412859 978.333333,792.333333 L978.333333,794 L961.666667,794 L961.666667,792.333333 C961.666667,791.412859 962.412859,790.666667 963.333333,790.666667 Z M965,802.333333 C964.539763,802.333333 964.166667,801.960237 964.166667,801.5 C964.166667,801.039763 964.539763,800.666667 965,800.666667 C965.460237,800.666667 965.833333,801.039763 965.833333,801.5 C965.833333,801.960237 965.460237,802.333333 965,802.333333 Z M965,805.666667 C964.539763,805.666667 964.166667,805.293571 964.166667,804.833333 C964.166667,804.373096 964.539763,804 965,804 C965.460237,804 965.833333,804.373096 965.833333,804.833333 C965.833333,805.293571 965.460237,805.666667 965,805.666667 Z M968.333333,802.333333 C967.873096,802.333333 967.5,801.960237 967.5,801.5 C967.5,801.039763 967.873096,800.666667 968.333333,800.666667 C968.793571,800.666667 969.166667,801.039763 969.166667,801.5 C969.166667,801.960237 968.793571,802.333333 968.333333,802.333333 Z M968.333333,805.666667 C967.873096,805.666667 967.5,805.293571 967.5,804.833333 C967.5,804.373096 967.873096,804 968.333333,804 C968.793571,804 969.166667,804.373096 969.166667,804.833333 C969.166667,805.293571 968.793571,805.666667 968.333333,805.666667 Z M971.666667,802.333333 C971.206429,802.333333 970.833333,801.960237 970.833333,801.5 C970.833333,801.039763 971.206429,800.666667 971.666667,800.666667 C972.126904,800.666667 972.5,801.039763 972.5,801.5 C972.5,801.960237 972.126904,802.333333 971.666667,802.333333 Z M971.666667,805.666667 C971.206429,805.666667 970.833333,805.293571 970.833333,804.833333 C970.833333,804.373096 971.206429,804 971.666667,804 C972.126904,804 972.5,804.373096 972.5,804.833333 C972.5,805.293571 972.126904,805.666667 971.666667,805.666667 Z M975,802.333333 C974.539763,802.333333 974.166667,801.960237 974.166667,801.5 C974.166667,801.039763 974.539763,800.666667 975,800.666667 C975.460237,800.666667 975.833333,801.039763 975.833333,801.5 C975.833333,801.960237 975.460237,802.333333 975,802.333333 Z M968.333333,799 C967.873096,799 967.5,798.626904 967.5,798.166667 C967.5,797.706429 967.873096,797.333333 968.333333,797.333333 C968.793571,797.333333 969.166667,797.706429 969.166667,798.166667 C969.166667,798.626904 968.793571,799 968.333333,799 Z M971.666667,799 C971.206429,799 970.833333,798.626904 970.833333,798.166667 C970.833333,797.706429 971.206429,797.333333 971.666667,797.333333 C972.126904,797.333333 972.5,797.706429 972.5,798.166667 C972.5,798.626904 972.126904,799 971.666667,799 Z M975,799 C974.539763,799 974.166667,798.626904 974.166667,798.166667 C974.166667,797.706429 974.539763,797.333333 975,797.333333 C975.460237,797.333333 975.833333,797.706429 975.833333,798.166667 C975.833333,798.626904 975.460237,799 975,799 Z\" />\n    </group>\n</vector>"
  },
  {
    "path": "app/src/main/res/drawable/ic_chat.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"20dp\"\n    android:height=\"20dp\"\n    android:viewportWidth=\"20\"\n    android:viewportHeight=\"20\">\n\n    <group\n            android:translateX=\"-1029.000000\"\n            android:translateY=\"-788.000000\">\n        <path\n            android:fillColor=\"#ABAEFF\"\n            android:strokeWidth=\"1\"\n            android:pathData=\"M1038.79705,788.000005 C1035.29837,788.002135 1032.06643,789.870068 1030.31801,792.900546 C1028.56959,795.931024 1028.57016,799.663938 1030.3195,802.693883 L1029.04195,806.518373 C1028.94412,806.811733 1029.02045,807.135189 1029.23912,807.353857 C1029.45779,807.572525 1029.78124,807.648858 1030.0746,807.551026 L1033.89909,806.273475 C1037.46539,808.33826 1041.94259,807.950333 1045.1006,805.302919 C1048.25861,802.655506 1049.42209,798.314753 1048.01152,794.44279 C1046.60094,790.570827 1042.91795,787.995671 1038.79705,788.000005 Z M1038.79705,805.959189 C1037.25458,805.956013 1035.74457,805.515889 1034.44195,804.689801 C1034.31067,804.608508 1034.15962,804.564747 1034.00521,804.563271 C1033.91666,804.564539 1033.82872,804.57828 1033.74399,804.604087 L1031.10726,805.48572 L1031.98889,802.848985 C1032.06712,802.61532 1032.03562,802.358818 1031.90317,802.151026 C1029.91565,799.000045 1030.31356,794.903204 1032.87028,792.193579 C1035.42701,789.483954 1039.49386,788.849034 1042.75485,790.650395 C1046.01583,792.451756 1047.64356,796.232353 1046.71108,799.839207 C1045.7786,803.446061 1042.52249,805.964034 1038.79705,805.959189 Z M1035.53175,795.346944 C1035.98259,795.346944 1036.34807,795.712426 1036.34807,796.163271 C1036.34807,796.614115 1036.71355,796.979597 1037.1644,796.979597 C1037.61524,796.979597 1037.98073,796.614115 1037.98073,796.163271 C1037.98073,794.810737 1036.88428,793.714291 1035.53175,793.714291 C1034.17921,793.714291 1033.08277,794.810737 1033.08277,796.163271 C1033.08277,796.614115 1033.44825,796.979597 1033.89909,796.979597 C1034.34994,796.979597 1034.71542,796.614115 1034.71542,796.163271 C1034.71542,795.712426 1035.0809,795.346944 1035.53175,795.346944 Z M1042.06236,793.714291 C1040.70982,793.714291 1039.61338,794.810737 1039.61338,796.163271 C1039.61338,796.614115 1039.97886,796.979597 1040.4297,796.979597 C1040.88055,796.979597 1041.24603,796.614115 1041.24603,796.163271 C1041.24603,795.712426 1041.61151,795.346944 1042.06236,795.346944 C1042.5132,795.346944 1042.87868,795.712426 1042.87868,796.163271 C1042.87868,796.614115 1043.24417,796.979597 1043.69501,796.979597 C1044.14586,796.979597 1044.51134,796.614115 1044.51134,796.163271 C1044.51134,794.810737 1043.41489,793.714291 1042.06236,793.714291 Z M1041.48685,799.669393 L1041.00521,800.146944 C1039.76902,801.325565 1037.82509,801.325565 1036.58889,800.146944 L1036.10726,799.669393 C1035.78337,799.392024 1035.30057,799.410673 1034.99904,799.712199 C1034.69752,800.013725 1034.67887,800.496528 1034.95624,800.820414 L1035.43379,801.302046 C1037.29191,803.157977 1040.3022,803.157977 1042.16032,801.302046 L1042.63787,800.820414 C1042.91524,800.496528 1042.89659,800.013725 1042.59506,799.712199 C1042.29354,799.410673 1041.81073,799.392024 1041.48685,799.669393 Z\" />\n    </group>\n</vector>"
  },
  {
    "path": "app/src/main/res/drawable/ic_inbox.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"20dp\"\n    android:height=\"20dp\"\n    android:viewportWidth=\"20\"\n    android:viewportHeight=\"20\">\n\n    <group\n            android:translateX=\"-892.000000\"\n            android:translateY=\"-789.000000\">\n        <path\n            android:fillColor=\"#ABAEFF\"\n            android:strokeWidth=\"1\"\n            android:pathData=\"M909.5,793.166667 L908.666667,793.166667 L908.666667,791.5 C908.666667,790.119288 907.547379,789 906.166667,789 L897.833333,789 C896.452621,789 895.333333,790.119288 895.333333,791.5 L895.333333,793.166667 L894.5,793.166667 C893.119288,793.166667 892,794.285955 892,795.666667 L892,806.5 C892,807.880712 893.119288,809 894.5,809 L909.5,809 C910.880712,809 912,807.880712 912,806.5 L912,795.666667 C912,794.285955 910.880712,793.166667 909.5,793.166667 Z M909.5,794.833333 C909.960237,794.833333 910.333333,795.206429 910.333333,795.666667 L910.333333,800.666667 L908.666667,800.666667 L908.666667,794.833333 L909.5,794.833333 Z M897,791.5 C897,791.039763 897.373096,790.666667 897.833333,790.666667 L906.166667,790.666667 C906.626904,790.666667 907,791.039763 907,791.5 L907,800.666667 L905.333333,800.666667 C904.973966,800.66634 904.654867,800.896427 904.541667,801.2375 L903.9,803.166667 L900.1,803.166667 L899.458333,801.2375 C899.345133,800.896427 899.026034,800.66634 898.666667,800.666667 L897,800.666667 L897,791.5 Z M894.5,794.833333 L895.333333,794.833333 L895.333333,800.666667 L893.666667,800.666667 L893.666667,795.666667 C893.666667,795.206429 894.039763,794.833333 894.5,794.833333 Z M909.5,807.333333 L894.5,807.333333 C894.039763,807.333333 893.666667,806.960237 893.666667,806.5 L893.666667,802.333333 L898.066667,802.333333 L898.708333,804.2625 C898.821534,804.603573 899.140632,804.83366 899.5,804.833333 L904.5,804.833333 C904.859368,804.83366 905.178466,804.603573 905.291667,804.2625 L905.933333,802.333333 L910.333333,802.333333 L910.333333,806.5 C910.333333,806.960237 909.960237,807.333333 909.5,807.333333 Z M899.5,794.833333 C899.039763,794.833333 898.666667,794.460237 898.666667,794 C898.666667,793.539763 899.039763,793.166667 899.5,793.166667 L904.5,793.166667 C904.960237,793.166667 905.333333,793.539763 905.333333,794 C905.333333,794.460237 904.960237,794.833333 904.5,794.833333 L899.5,794.833333 Z M899.5,798.166667 C899.039763,798.166667 898.666667,797.793571 898.666667,797.333333 C898.666667,796.873096 899.039763,796.5 899.5,796.5 L904.5,796.5 C904.960237,796.5 905.333333,796.873096 905.333333,797.333333 C905.333333,797.793571 904.960237,798.166667 904.5,798.166667 L899.5,798.166667 Z\" />\n    </group>\n</vector>"
  },
  {
    "path": "app/src/main/res/drawable/ic_news.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"22dp\"\n    android:height=\"20dp\"\n    android:viewportWidth=\"22\"\n    android:viewportHeight=\"20\">\n\n    <group\n            android:translateX=\"-814.000000\"\n            android:translateY=\"-754.000000\">\n        <path\n            android:fillColor=\"#ABAEFF\"\n            android:strokeWidth=\"1\"\n            android:pathData=\"M817.181818,774 L832.636364,774 C834.409091,774 835.818182,772.590909 835.818182,770.818182 L835.818182,755.818182 C835.818182,754.818182 835,754 834,754 L820.363636,754 C819.363636,754 818.545455,754.818182 818.545455,755.818182 L818.545455,760.363636 L815.818182,760.363636 C814.818182,760.363636 814,761.181818 814,762.181818 L814,770.818182 C814,772.590909 815.409091,774 817.181818,774 Z M815.818182,770.818182 L815.818182,762.181818 L818.545455,762.181818 L818.545455,770.818182 C818.545455,771.590909 817.954545,772.181818 817.181818,772.181818 C816.409091,772.181818 815.818182,771.590909 815.818182,770.818182 Z M834,770.818182 C834,771.590909 833.409091,772.181818 832.636364,772.181818 L820.045455,772.181818 C820.272727,771.772727 820.363636,771.272727 820.363636,770.818182 L820.363636,755.818182 L834,755.818182 L834,770.818182 Z M823.090909,763.090909 L831.272727,763.090909 C831.772727,763.090909 832.181818,762.681818 832.181818,762.181818 L832.181818,758.545455 C832.181818,758.045455 831.772727,757.636364 831.272727,757.636364 L823.090909,757.636364 C822.590909,757.636364 822.181818,758.045455 822.181818,758.545455 L822.181818,762.181818 C822.181818,762.681818 822.590909,763.090909 823.090909,763.090909 Z M824,759.454545 L830.363636,759.454545 L830.363636,761.272727 L824,761.272727 L824,759.454545 Z M823.090909,766.727273 L831.272727,766.727273 C831.772727,766.727273 832.181818,766.318182 832.181818,765.818182 C832.181818,765.318182 831.772727,764.909091 831.272727,764.909091 L823.090909,764.909091 C822.590909,764.909091 822.181818,765.318182 822.181818,765.818182 C822.181818,766.318182 822.590909,766.727273 823.090909,766.727273 Z M823.090909,770.363636 L828.545455,770.363636 C829.045455,770.363636 829.454545,769.954545 829.454545,769.454545 C829.454545,768.954545 829.045455,768.545455 828.545455,768.545455 L823.090909,768.545455 C822.590909,768.545455 822.181818,768.954545 822.181818,769.454545 C822.181818,769.954545 822.590909,770.363636 823.090909,770.363636 Z\" />\n    </group>\n</vector>"
  },
  {
    "path": "app/src/main/res/drawable/ic_profile.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"20dp\"\n    android:height=\"20dp\"\n    android:viewportWidth=\"20\"\n    android:viewportHeight=\"20\">\n\n    <group\n            android:translateX=\"-1099.000000\"\n            android:translateY=\"-788.000000\">\n        <path\n            android:fillColor=\"#ABAEFF\"\n            android:strokeWidth=\"1\"\n            android:pathData=\"M1109,788 C1103.47715,788 1099,792.477153 1099,798 C1099,803.522847 1103.47715,808 1109,808 C1114.52285,808 1119,803.522847 1119,798 C1119,792.477153 1114.52285,788 1109,788 Z M1104.83333,805.204167 L1104.83333,804.666667 C1104.83333,802.36548 1106.69881,800.5 1109,800.5 C1111.30119,800.5 1113.16667,802.36548 1113.16667,804.666667 L1113.16667,805.204167 C1110.59278,806.709298 1107.40722,806.709298 1104.83333,805.204167 Z M1106.5,796.333333 C1106.5,794.952621 1107.61929,793.833333 1109,793.833333 C1110.38071,793.833333 1111.5,794.952621 1111.5,796.333333 C1111.5,797.714045 1110.38071,798.833333 1109,798.833333 C1107.61929,798.833333 1106.5,797.714045 1106.5,796.333333 Z M1114.7875,803.979167 C1114.55928,802.061761 1113.397,800.381536 1111.68333,799.491667 C1112.62016,798.709781 1113.16318,797.553571 1113.16667,796.333333 C1113.16667,794.032147 1111.30119,792.166667 1109,792.166667 C1106.69881,792.166667 1104.83333,794.032147 1104.83333,796.333333 C1104.83682,797.553571 1105.37984,798.709781 1106.31667,799.491667 C1104.603,800.381536 1103.44072,802.061761 1103.2125,803.979167 C1100.76814,801.619713 1100.0008,798.012624 1101.27312,794.862523 C1102.54544,791.712422 1105.60266,789.650061 1109,789.650061 C1112.39734,789.650061 1115.45456,791.712422 1116.72688,794.862523 C1117.9992,798.012624 1117.23186,801.619713 1114.7875,803.979167 Z\" />\n    </group>\n</vector>"
  },
  {
    "path": "app/src/main/res/layout/activity_main.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<androidx.constraintlayout.widget.ConstraintLayout\n        xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        xmlns:tools=\"http://schemas.android.com/tools\"\n        xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n        android:id=\"@+id/container\"\n        android:background=\"@drawable/background\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        tools:context=\".MainActivity\">\n\n    <com.tenclouds.fluidbottomnavigation.FluidBottomNavigation\n            android:id=\"@+id/fluidBottomNavigation\"\n            android:layout_height=\"wrap_content\"\n            android:layout_width=\"0dp\"\n            app:layout_constraintLeft_toLeftOf=\"parent\"\n            app:layout_constraintRight_toRightOf=\"parent\"\n            app:layout_constraintBottom_toBottomOf=\"parent\"\n            app:height=\"54dp\"\n            app:accentColor=\"@color/colorPrimaryDark\"\n            app:backColor=\"@color/backColor\"\n            app:iconColor=\"@color/colorPrimary\"\n            app:iconSelectedColor=\"@color/iconSelectedColor\"\n            app:textColor=\"@color/colorPrimaryDark\"\n            />\n</androidx.constraintlayout.widget.ConstraintLayout>"
  },
  {
    "path": "app/src/main/res/values/colors.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <color name=\"colorPrimary\">#6167E6</color>\n    <color name=\"colorPrimaryDark\">#3C42D5</color>\n    <color name=\"colorAccent\">#FF4081</color>\n</resources>\n"
  },
  {
    "path": "app/src/main/res/values/strings.xml",
    "content": "<resources>\n    <string name=\"app_name\">Fluid Bottom Navigation Example</string>\n    <string name=\"news\">News</string>\n    <string name=\"inbox\">Inbox</string>\n    <string name=\"calendar\">Calendar</string>\n    <string name=\"chat\">Chat</string>\n    <string name=\"profile\">Profile</string>\n\n</resources>\n"
  },
  {
    "path": "app/src/main/res/values/styles.xml",
    "content": "<resources>\n\n    <!-- Base application theme. -->\n    <style name=\"AppTheme\" parent=\"Theme.AppCompat.Light.NoActionBar\">\n        <!-- Customize your theme here. -->\n        <item name=\"colorPrimary\">@color/colorPrimary</item>\n        <item name=\"colorPrimaryDark\">@color/colorPrimaryDark</item>\n        <item name=\"colorAccent\">@color/colorAccent</item>\n    </style>\n\n</resources>\n"
  },
  {
    "path": "build.gradle",
    "content": "buildscript {\n    ext.kotlin_version = '1.3.61'\n    ext.androidx_version = \"1.1.0\"\n    ext.constraint_version = '2.0.0-beta4'\n\n    repositories {\n        google()\n        jcenter()\n    }\n\n    dependencies {\n        classpath 'com.android.tools.build:gradle:3.5.3'\n        classpath \"org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version\"\n    }\n}\n\nallprojects {\n    repositories {\n        google()\n        jcenter()\n        mavenCentral()\n    }\n}\n\ntask clean(type: Delete) {\n    delete rootProject.buildDir\n}"
  },
  {
    "path": "fluidbottomnavigation/.gitignore",
    "content": "/build\n"
  },
  {
    "path": "fluidbottomnavigation/build.gradle",
    "content": "apply plugin: 'com.android.library'\napply plugin: 'kotlin-android'\napply plugin: 'kotlin-android-extensions'\n\napply from: 'script/version.gradle'\n\nandroid {\n    compileSdkVersion 29\n\n    defaultConfig {\n        minSdkVersion 15\n        targetSdkVersion 29\n        versionCode getLibraryVersionCode()\n        versionName getLibraryVersionName()\n        vectorDrawables.useSupportLibrary = true\n    }\n\n    buildTypes {\n        release {\n            minifyEnabled false\n            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'\n        }\n        debug {\n            minifyEnabled false\n        }\n    }\n\n    testOptions {\n        unitTests {\n            includeAndroidResources = true\n        }\n    }\n}\n\ndependencies {\n    implementation fileTree(dir: 'libs', include: ['*.jar'])\n\n    implementation \"org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version\"\n    implementation \"androidx.core:core:$androidx_version\"\n    implementation \"androidx.core:core-ktx:$androidx_version\"\n    implementation \"androidx.appcompat:appcompat:$androidx_version\"\n    implementation \"androidx.constraintlayout:constraintlayout:$constraint_version\"\n\n    testImplementation 'junit:junit:4.12'\n    testImplementation 'org.mockito:mockito-core:2.23.4'\n    testImplementation \"com.nhaarman.mockitokotlin2:mockito-kotlin:2.1.0\"\n    testImplementation \"org.robolectric:robolectric:4.3\"\n}\n"
  },
  {
    "path": "fluidbottomnavigation/proguard-rules.pro",
    "content": "# Add project specific ProGuard rules here.\n# You can control the set of applied configuration files using the\n# proguardFiles setting in build.gradle.\n#\n# For more details, see\n#   http://developer.android.com/guide/developing/tools/proguard.html\n\n# If your project uses WebView with JS, uncomment the following\n# and specify the fully qualified class name to the JavaScript interface\n# class:\n#-keepclassmembers class fqcn.of.javascript.interface.for.webview {\n#   public *;\n#}\n\n# Uncomment this to preserve the line number information for\n# debugging stack traces.\n#-keepattributes SourceFile,LineNumberTable\n\n# If you keep the line number information, uncomment this to\n# hide the original source file name.\n#-renamesourcefileattribute SourceFile\n"
  },
  {
    "path": "fluidbottomnavigation/script/version.gradle",
    "content": "ext {\n    getLibraryVersionName = { ->\n        return \"1.2\"\n    }\n    getLibraryVersionCode = { ->\n        return 120\n    }\n}"
  },
  {
    "path": "fluidbottomnavigation/src/main/AndroidManifest.xml",
    "content": "<manifest package=\"com.tenclouds.fluidbottomnavigation\"/>\n"
  },
  {
    "path": "fluidbottomnavigation/src/main/java/com/tenclouds/fluidbottomnavigation/Consts.kt",
    "content": "package com.tenclouds.fluidbottomnavigation\n\ninternal const val DEFAULT_SELECTED_TAB_POSITION = 0\n\ninternal const val EXTRA_SELECTED_TAB_POSITION = \"EXTRA_SELECTED_TAB_POSITION\"\ninternal const val EXTRA_SELECTED_SUPER_STATE = \"EXTRA_SELECTED_SUPER_STATE\"\n\ninternal const val KEY_FRAME_IN_MS = ((1f / 24f) * 1000).toLong()\n\ninternal const val ITEMS_CLICKS_DEBOUNCE = 250L"
  },
  {
    "path": "fluidbottomnavigation/src/main/java/com/tenclouds/fluidbottomnavigation/FluidBottomNavigation.kt",
    "content": "package com.tenclouds.fluidbottomnavigation\n\nimport android.content.Context\nimport android.graphics.Typeface\nimport android.os.Build\nimport android.os.Bundle\nimport android.os.Parcelable\nimport android.os.SystemClock\nimport android.util.AttributeSet\nimport android.util.TypedValue\nimport android.view.Gravity\nimport android.view.LayoutInflater\nimport android.view.View\nimport android.view.ViewGroup\nimport android.widget.FrameLayout\nimport android.widget.LinearLayout\nimport androidx.annotation.VisibleForTesting\nimport androidx.core.content.ContextCompat\nimport androidx.core.content.res.ResourcesCompat\nimport com.tenclouds.fluidbottomnavigation.extension.calculateHeight\nimport com.tenclouds.fluidbottomnavigation.extension.setTintColor\nimport com.tenclouds.fluidbottomnavigation.listener.OnTabSelectedListener\nimport kotlinx.android.synthetic.main.item.view.*\nimport kotlin.math.abs\n\nclass FluidBottomNavigation : FrameLayout {\n\n    constructor(context: Context) : super(context) {\n        init(null)\n    }\n\n    constructor(context: Context, attrs: AttributeSet) : super(context, attrs) {\n        init(attrs)\n    }\n\n    constructor(context: Context, attrs: AttributeSet, defStyleAttr: Int) : super(context, attrs, defStyleAttr) {\n        init(attrs)\n    }\n\n    var items: List<FluidBottomNavigationItem> = listOf()\n        set(value) {\n            check(value.size >= 3) { resources.getString(R.string.exception_not_enough_items) }\n            check(value.size <= 5) { resources.getString(R.string.exception_too_many_items) }\n\n            field = value\n            drawLayout()\n        }\n\n    var onTabSelectedListener: OnTabSelectedListener? = null\n\n    var accentColor: Int = ContextCompat.getColor(context, R.color.accentColor)\n    var backColor: Int = ContextCompat.getColor(context, R.color.backColor)\n    var iconColor: Int = ContextCompat.getColor(context, R.color.textColor)\n    var iconSelectedColor: Int = ContextCompat.getColor(context, R.color.iconColor)\n    var textColor: Int = ContextCompat.getColor(context, R.color.iconSelectedColor)\n    var textFont: Typeface = ResourcesCompat.getFont(context, R.font.rubik_regular)\n            ?: Typeface.DEFAULT\n\n    val selectedTabItem: FluidBottomNavigationItem? get() = items[selectedTabPosition]\n\n    private var bottomBarHeight = resources.getDimension(R.dimen.fluidBottomNavigationHeightWithOpacity).toInt()\n    private var bottomBarWidth = 0\n\n    @VisibleForTesting\n    internal var isVisible = true\n\n    private var selectedTabPosition = DEFAULT_SELECTED_TAB_POSITION\n        set(value) {\n            field = value\n            onTabSelectedListener?.onTabSelected(value)\n        }\n\n    private var backgroundView: View? = null\n    private val views: MutableList<View> = ArrayList()\n    private var lastItemClickTimestamp = 0L\n\n    private fun init(attrs: AttributeSet?) {\n        getAttributesOrDefaultValues(attrs)\n        clipToPadding = false\n        layoutParams =\n                ViewGroup.LayoutParams(\n                        ViewGroup.LayoutParams.MATCH_PARENT,\n                        bottomBarHeight)\n    }\n\n    fun selectTab(position: Int) {\n        if (position == selectedTabPosition) return\n\n        if (views.size > 0) {\n            views[selectedTabPosition].animateDeselectItemView()\n            views[position].animateSelectItemView()\n        }\n\n        this.selectedTabPosition = position\n    }\n\n    fun show() {\n        if (isVisible.not()) {\n            animateShow()\n            isVisible = true\n        }\n    }\n\n    fun hide() {\n        if (isVisible) {\n            animateHide()\n            isVisible = false\n        }\n    }\n\n    private fun drawLayout() {\n        bottomBarHeight = resources.getDimension(R.dimen.fluidBottomNavigationHeightWithOpacity).toInt()\n        backgroundView = View(context)\n\n        removeAllViews()\n        views.clear()\n\n        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {\n            LayoutParams(\n                    ViewGroup.LayoutParams.MATCH_PARENT,\n                    calculateHeight(bottomBarHeight)\n            ).let {\n                addView(backgroundView, it)\n            }\n        }\n\n        post { requestLayout() }\n\n        LinearLayout(context)\n                .apply {\n                    orientation = LinearLayout.HORIZONTAL\n                    gravity = Gravity.CENTER\n                }\n                .let { linearLayoutContainer ->\n                    val layoutParams =\n                            LayoutParams(\n                                    ViewGroup.LayoutParams.MATCH_PARENT,\n                                    bottomBarHeight,\n                                    Gravity.BOTTOM)\n                    addView(linearLayoutContainer, layoutParams)\n                    post {\n                        bottomBarWidth = width\n                        drawItemsViews(linearLayoutContainer)\n                    }\n                }\n    }\n\n    private fun drawItemsViews(linearLayout: LinearLayout) {\n        if (bottomBarWidth == 0 || items.isEmpty()) {\n            return\n        }\n\n        val inflater = context.getSystemService(Context.LAYOUT_INFLATER_SERVICE) as LayoutInflater\n\n        val itemViewHeight = resources.getDimension(R.dimen.fluidBottomNavigationHeightWithOpacity)\n        val itemViewWidth = (bottomBarWidth / items.size)\n\n        for (itemPosition in items.indices) {\n            inflater\n                    .inflate(R.layout.item, this, false)\n                    .let {\n                        views.add(it)\n                        linearLayout\n                                .addView(it,\n                                        LayoutParams(\n                                                itemViewWidth,\n                                                itemViewHeight.toInt()))\n                    }\n            drawItemView(itemPosition)\n        }\n    }\n\n    private fun drawItemView(position: Int) {\n        val view = views[position]\n        val item = items[position]\n\n        with(view) {\n            if (items.size > 3) {\n                container.setPadding(0, 0, 0, container.paddingBottom)\n            }\n\n            with(icon) {\n                selectColor = iconSelectedColor\n                deselectColor = iconColor\n\n                setImageDrawable(item.drawable)\n                if (selectedTabPosition == position)\n                    views[position].animateSelectItemView()\n                else\n                    setTintColor(deselectColor)\n            }\n            with(title) {\n                typeface = textFont\n                setTextColor(this@FluidBottomNavigation.textColor)\n                text = item.title\n                setTextSize(\n                        TypedValue.COMPLEX_UNIT_PX,\n                        resources.getDimension(R.dimen.fluidBottomNavigationTextSize))\n            }\n            with(circle) {\n                setTintColor(accentColor)\n            }\n            with(rectangle) {\n                setTintColor(accentColor)\n            }\n\n            backgroundContainer.setOnClickListener {\n                val nowTimestamp = SystemClock.uptimeMillis()\n                if (abs(lastItemClickTimestamp - nowTimestamp) > ITEMS_CLICKS_DEBOUNCE) {\n                    selectTab(position)\n                    lastItemClickTimestamp = nowTimestamp\n                }\n            }\n        }\n    }\n\n    fun getTabsSize() = items.size\n\n    private fun getAttributesOrDefaultValues(attrs: AttributeSet?) {\n        if (attrs != null) {\n            with(context\n                    .obtainStyledAttributes(\n                            attrs,\n                            R.styleable.FluidBottomNavigation,\n                            0, 0)) {\n                selectedTabPosition = getInt(\n                        R.styleable.FluidBottomNavigation_defaultTabPosition,\n                        DEFAULT_SELECTED_TAB_POSITION)\n                accentColor = getColor(\n                        R.styleable.FluidBottomNavigation_accentColor,\n                        ContextCompat.getColor(context, R.color.accentColor))\n                backColor = getColor(\n                        R.styleable.FluidBottomNavigation_backColor,\n                        ContextCompat.getColor(context, R.color.backColor))\n                iconColor = getColor(\n                        R.styleable.FluidBottomNavigation_iconColor,\n                        ContextCompat.getColor(context, R.color.iconColor))\n                textColor = getColor(\n                        R.styleable.FluidBottomNavigation_textColor,\n                        ContextCompat.getColor(context, R.color.iconSelectedColor))\n                iconSelectedColor = getColor(\n                        R.styleable.FluidBottomNavigation_iconSelectedColor,\n                        ContextCompat.getColor(context, R.color.iconSelectedColor))\n                textFont = ResourcesCompat.getFont(\n                        context,\n                        getResourceId(\n                                R.styleable.FluidBottomNavigation_textFont,\n                                R.font.rubik_regular)) ?: Typeface.DEFAULT\n                recycle()\n            }\n        }\n    }\n\n    fun getSelectedTabPosition() = this.selectedTabPosition\n\n    override fun onSaveInstanceState() =\n            Bundle()\n                    .apply {\n                        putInt(EXTRA_SELECTED_TAB_POSITION, selectedTabPosition)\n                        putParcelable(EXTRA_SELECTED_SUPER_STATE, super.onSaveInstanceState())\n                    }\n\n    override fun onRestoreInstanceState(state: Parcelable?) =\n            if (state is Bundle?) {\n                selectedTabPosition = state\n                        ?.getInt(EXTRA_SELECTED_TAB_POSITION) ?: DEFAULT_SELECTED_TAB_POSITION\n                state?.getParcelable(EXTRA_SELECTED_SUPER_STATE)\n            } else {\n                state\n            }\n                    .let {\n                        super.onRestoreInstanceState(it)\n                    }\n}\n"
  },
  {
    "path": "fluidbottomnavigation/src/main/java/com/tenclouds/fluidbottomnavigation/FluidBottomNavigationAnimations.kt",
    "content": "package com.tenclouds.fluidbottomnavigation\n\nimport android.animation.AnimatorSet\nimport android.view.View\nimport androidx.interpolator.view.animation.LinearOutSlowInInterpolator\nimport com.tenclouds.fluidbottomnavigation.extension.translationYAnimator\nimport kotlinx.android.synthetic.main.item.view.*\n\ninternal fun View.animateSelectItemView() =\n        AnimatorSet()\n                .apply {\n                    playTogether(\n                            circle.selectAnimator,\n                            icon.selectAnimator,\n                            title.selectAnimator,\n                            rectangle.selectAnimator,\n                            topContainer.selectAnimator)\n                }\n                .start()\n\ninternal fun View.animateDeselectItemView() =\n        AnimatorSet()\n                .apply {\n                    playTogether(\n                            circle.deselectAnimator,\n                            icon.deselectAnimator,\n                            title.deselectAnimator,\n                            rectangle.deselectAnimator,\n                            topContainer.deselectAnimator)\n                }\n                .start()\n\ninternal fun View.animateShow() =\n        AnimatorSet()\n                .apply {\n                    play(translationYAnimator(\n                            height.toFloat(),\n                            0f,\n                            3 * KEY_FRAME_IN_MS,\n                            LinearOutSlowInInterpolator()))\n                }\n                .start()\n\ninternal fun View.animateHide() =\n        AnimatorSet()\n                .apply {\n                    play(translationYAnimator(\n                            0f,\n                            height.toFloat(),\n                            3 * KEY_FRAME_IN_MS,\n                            LinearOutSlowInInterpolator()))\n                }\n                .start()"
  },
  {
    "path": "fluidbottomnavigation/src/main/java/com/tenclouds/fluidbottomnavigation/FluidBottomNavigationItem.kt",
    "content": "package com.tenclouds.fluidbottomnavigation\n\nimport android.graphics.drawable.Drawable\n\ndata class FluidBottomNavigationItem(val title: String,\n                                     val drawable: Drawable? = null)"
  },
  {
    "path": "fluidbottomnavigation/src/main/java/com/tenclouds/fluidbottomnavigation/extension/AnimatorExtensions.kt",
    "content": "package com.tenclouds.fluidbottomnavigation.extension\n\nimport android.animation.ArgbEvaluator\nimport android.animation.ValueAnimator\nimport android.view.View\nimport android.view.animation.Interpolator\nimport android.view.animation.LinearInterpolator\nimport android.widget.ImageView\n\ninternal fun View?.scaleAnimator(from: Float = this?.scaleX ?: 0f,\n                                 to: Float,\n                                 animationDuration: Long,\n                                 animationInterpolator: Interpolator = LinearInterpolator()) =\n        ValueAnimator.ofFloat(from, to)\n                .apply {\n                    duration = animationDuration\n                    interpolator = animationInterpolator\n                    addUpdateListener {\n                        this@scaleAnimator?.scaleX = animatedValue as Float\n                        this@scaleAnimator?.scaleY = animatedValue as Float\n                    }\n                }\n\ninternal fun View?.scaleYAnimator(from: Float = this?.scaleX ?: 0f,\n                                  to: Float,\n                                  animationDuration: Long,\n                                  animationInterpolator: Interpolator = LinearInterpolator()) =\n        ValueAnimator.ofFloat(from, to)\n                .apply {\n                    duration = animationDuration\n                    interpolator = animationInterpolator\n                    addUpdateListener {\n                        this@scaleYAnimator?.scaleY = animatedValue as Float\n                    }\n                }\n\ninternal fun View?.translationYAnimator(from: Float = 0f,\n                                        to: Float,\n                                        animationDuration: Long,\n                                        animationInterpolator: Interpolator = LinearInterpolator()) =\n        ValueAnimator.ofFloat(from, to)\n                .apply {\n                    duration = animationDuration\n                    interpolator = animationInterpolator\n                    addUpdateListener {\n                        this@translationYAnimator?.translationY = it.animatedValue as Float\n                    }\n                }\n\ninternal fun View?.alphaAnimator(from: Float = 1f,\n                                 to: Float,\n                                 animationDuration: Long,\n                                 animationInterpolator: Interpolator = LinearInterpolator()) =\n        ValueAnimator.ofFloat(from, to)\n                .apply {\n                    duration = animationDuration\n                    interpolator = animationInterpolator\n                    addUpdateListener {\n                        this@alphaAnimator?.alpha = it.animatedValue as Float\n                    }\n                }\n\ninternal fun ImageView?.tintAnimator(from: Int,\n                                     to: Int,\n                                     animationDuration: Long,\n                                     animationInterpolator: Interpolator = LinearInterpolator()) =\n        ValueAnimator.ofObject(ArgbEvaluator(), from, to)\n                .apply {\n                    duration = animationDuration\n                    interpolator = animationInterpolator\n                    addUpdateListener {\n                        this@tintAnimator?.setTintColor(it.animatedValue as Int)\n                    }\n                }\n"
  },
  {
    "path": "fluidbottomnavigation/src/main/java/com/tenclouds/fluidbottomnavigation/extension/InterpolatorExtensions.kt",
    "content": "package com.tenclouds.fluidbottomnavigation.extension\n\nimport androidx.core.view.animation.PathInterpolatorCompat\n\ninternal val interpolators = arrayOf(\n        arrayOf(0.250f, 0.000f, 0.000f, 1.000f).toInterpolator(),\n        arrayOf(0.200f, 0.000f, 0.800f, 1.000f).toInterpolator(),\n        arrayOf(0.420f, 0.000f, 0.580f, 1.000f).toInterpolator(),\n        arrayOf(0.270f, 0.000f, 0.000f, 1.000f).toInterpolator(),\n        arrayOf(0.500f, 0.000f, 0.500f, 1.000f).toInterpolator())\n\nprivate fun Array<Float>.toInterpolator() = PathInterpolatorCompat.create(this[0], this[1], this[2], this[3])"
  },
  {
    "path": "fluidbottomnavigation/src/main/java/com/tenclouds/fluidbottomnavigation/extension/ViewExtensions.kt",
    "content": "package com.tenclouds.fluidbottomnavigation.extension\n\nimport android.annotation.TargetApi\nimport android.content.Context\nimport android.content.res.ColorStateList\nimport android.os.Build\nimport android.util.DisplayMetrics\nimport android.view.Display\nimport android.view.View\nimport android.view.WindowManager\nimport android.widget.ImageView\nimport androidx.core.widget.ImageViewCompat\nimport com.tenclouds.fluidbottomnavigation.FluidBottomNavigation\n\ninternal fun View.visible() {\n    this.visibility = View.VISIBLE\n}\n\ninternal fun View.invisible() {\n    this.visibility = View.INVISIBLE\n}\n\ninternal fun View.gone() {\n    this.visibility = View.GONE\n}\n\ninternal fun ImageView.setTintColor(color: Int) =\n        ImageViewCompat.setImageTintList(\n                this,\n                ColorStateList.valueOf(color))\n\n@TargetApi(Build.VERSION_CODES.LOLLIPOP)\ninternal fun FluidBottomNavigation.calculateHeight(layoutHeight: Int): Int {\n    var navigationLayoutHeight = layoutHeight\n    var navigationBarHeight = 0\n\n    resources.getIdentifier(\n            \"navigation_bar_height\",\n            \"dimen\",\n            \"android\"\n    )\n            .let {\n                if (it > 0)\n                    navigationBarHeight = resources.getDimensionPixelSize(it)\n            }\n\n    intArrayOf(android.R.attr.windowTranslucentNavigation)\n            .let {\n                with(context.theme\n                        .obtainStyledAttributes(it)) {\n                    val translucentNavigation = getBoolean(0, true)\n                    if (isInImmersiveMode(context) && !translucentNavigation) {\n                        navigationLayoutHeight += navigationBarHeight\n                    }\n                    recycle()\n                }\n            }\n\n    return navigationLayoutHeight\n}\n\nprivate fun isInImmersiveMode(context: Context) =\n        with((context.getSystemService(Context.WINDOW_SERVICE) as WindowManager).defaultDisplay) {\n            val realMetrics = getRealMetrics()\n            val metrics = getMetrics()\n            realMetrics.widthPixels > metrics.widthPixels\n                    || realMetrics.heightPixels > metrics.heightPixels\n        }\n\nprivate fun Display.getMetrics() =\n        DisplayMetrics().also { this.getMetrics(it) }\n\nprivate fun Display.getRealMetrics() =\n        DisplayMetrics()\n                .let {\n                    when {\n                        Build.VERSION.SDK_INT >= 17 -> it.also { this.getRealMetrics(it) }\n                        Build.VERSION.SDK_INT >= 15 ->\n                            try {\n                                val getRawHeight = Display::class.java.getMethod(\"getRawHeight\")\n                                val getRawWidth = Display::class.java.getMethod(\"getRawWidth\")\n                                DisplayMetrics()\n                                        .apply {\n                                            widthPixels = getRawWidth.invoke(this) as Int\n                                            heightPixels = getRawHeight.invoke(this) as Int\n                                        }\n                            } catch (e: Exception) {\n                                DisplayMetrics()\n                                        .apply {\n                                            @Suppress(\"DEPRECATION\")\n                                            widthPixels = this@getRealMetrics.width\n                                            @Suppress(\"DEPRECATION\")\n                                            heightPixels = this@getRealMetrics.height\n                                        }\n                            }\n                        else -> DisplayMetrics()\n                                .apply {\n                                    @Suppress(\"DEPRECATION\")\n                                    widthPixels = this@getRealMetrics.width\n                                    @Suppress(\"DEPRECATION\")\n                                    heightPixels = this@getRealMetrics.height\n                                }\n                    }\n                }"
  },
  {
    "path": "fluidbottomnavigation/src/main/java/com/tenclouds/fluidbottomnavigation/listener/OnTabSelectedListener.kt",
    "content": "package com.tenclouds.fluidbottomnavigation.listener\n\n\ninterface OnTabSelectedListener {\n\n    fun onTabSelected(position: Int)\n}"
  },
  {
    "path": "fluidbottomnavigation/src/main/java/com/tenclouds/fluidbottomnavigation/view/AnimatedView.kt",
    "content": "package com.tenclouds.fluidbottomnavigation.view\n\nimport android.animation.Animator\nimport android.content.Context\nimport com.tenclouds.fluidbottomnavigation.R\n\ninternal interface AnimatedView {\n\n    val selectAnimator: Animator\n    val deselectAnimator: Animator\n\n    fun getItemTransitionYValue(context: Context) =\n            -(context.resources?.getDimension(R.dimen.fluidBottomNavigationItemTranslationY) ?: 0f)\n\n    fun getItemOvershootTransitionYValue(context: Context) =\n            getItemTransitionYValue(context) * 11 / 10\n}"
  },
  {
    "path": "fluidbottomnavigation/src/main/java/com/tenclouds/fluidbottomnavigation/view/CircleView.kt",
    "content": "package com.tenclouds.fluidbottomnavigation.view\n\nimport android.animation.AnimatorSet\nimport android.content.Context\nimport android.util.AttributeSet\nimport androidx.appcompat.widget.AppCompatImageView\nimport com.tenclouds.fluidbottomnavigation.KEY_FRAME_IN_MS\nimport com.tenclouds.fluidbottomnavigation.extension.interpolators\nimport com.tenclouds.fluidbottomnavigation.extension.scaleAnimator\nimport com.tenclouds.fluidbottomnavigation.extension.translationYAnimator\n\ninternal class CircleView @JvmOverloads constructor(context: Context,\n                                                    attrs: AttributeSet? = null,\n                                                    defStyleAttr: Int = 0)\n    : AppCompatImageView(context, attrs, defStyleAttr), AnimatedView {\n\n    init {\n        scaleY = 0f\n        scaleX = 0f\n    }\n\n    override val selectAnimator by lazy {\n        AnimatorSet()\n                .apply {\n                    playTogether(\n                            selectScaleAnimator,\n                            selectMoveAnimator)\n                }\n    }\n\n    override val deselectAnimator by lazy {\n        AnimatorSet()\n                .apply {\n                    playTogether(\n                            deselectScaleAnimator,\n                            deselectMoveAnimator)\n                }\n    }\n\n    private val selectScaleAnimator =\n            AnimatorSet()\n                    .apply {\n                        playSequentially(\n                                scaleAnimator(0.0f, 1.0f, 7 * KEY_FRAME_IN_MS, interpolators[0]),\n                                scaleAnimator(1.0f, 0.33f, 4 * KEY_FRAME_IN_MS, interpolators[2]),\n                                scaleAnimator(0.33f, 1.2f, 7 * KEY_FRAME_IN_MS, interpolators[1]),\n                                scaleAnimator(1.2f, 0.8f, 3 * KEY_FRAME_IN_MS, interpolators[1]),\n                                scaleAnimator(0.8f, 1.0f, 3 * KEY_FRAME_IN_MS, interpolators[1]))\n                    }\n\n    private val selectMoveAnimator =\n            AnimatorSet()\n                    .apply {\n                        playSequentially(\n                                translationYAnimator(\n                                        0f,\n                                        getItemOvershootTransitionYValue(context),\n                                        7 * KEY_FRAME_IN_MS,\n                                        interpolators[0]),\n                                translationYAnimator(\n                                        getItemOvershootTransitionYValue(context),\n                                        getItemTransitionYValue(context),\n                                        3 * KEY_FRAME_IN_MS,\n                                        interpolators[4]))\n                        startDelay = 11 * KEY_FRAME_IN_MS\n                    }\n\n    private val deselectScaleAnimator =\n            AnimatorSet()\n                    .apply {\n                        playSequentially(\n                                scaleAnimator(1.0f, 0.8f, 3 * KEY_FRAME_IN_MS, interpolators[1]),\n                                scaleAnimator(0.8f, 1.2f, 3 * KEY_FRAME_IN_MS, interpolators[1]),\n                                scaleAnimator(1.2f, 0.33f, 7 * KEY_FRAME_IN_MS, interpolators[1]),\n                                scaleAnimator(0.33f, 1.0f, 6 * KEY_FRAME_IN_MS, interpolators[2]),\n                                scaleAnimator(1.0f, 0.0f, 7 * KEY_FRAME_IN_MS, interpolators[0]))\n                    }\n\n    private val deselectMoveAnimator =\n            AnimatorSet()\n                    .apply {\n                        playSequentially(\n                                translationYAnimator(\n                                        getItemTransitionYValue(context),\n                                        getItemOvershootTransitionYValue(context),\n                                        3 * KEY_FRAME_IN_MS,\n                                        interpolators[4]),\n                                translationYAnimator(\n                                        getItemOvershootTransitionYValue(context),\n                                        0f,\n                                        7 * KEY_FRAME_IN_MS,\n                                        interpolators[0]))\n                        startDelay = 6 * KEY_FRAME_IN_MS\n                    }\n}\n"
  },
  {
    "path": "fluidbottomnavigation/src/main/java/com/tenclouds/fluidbottomnavigation/view/IconView.kt",
    "content": "package com.tenclouds.fluidbottomnavigation.view\n\nimport android.animation.Animator\nimport android.animation.AnimatorSet\nimport android.content.Context\nimport android.util.AttributeSet\nimport androidx.appcompat.widget.AppCompatImageView\nimport com.tenclouds.fluidbottomnavigation.KEY_FRAME_IN_MS\nimport com.tenclouds.fluidbottomnavigation.extension.*\n\ninternal class IconView @JvmOverloads constructor(context: Context,\n                                                  attrs: AttributeSet? = null,\n                                                  defStyleAttr: Int = 0)\n    : AppCompatImageView(context, attrs, defStyleAttr), AnimatedView {\n\n    init {\n        scaleX = 0.9f\n        scaleY = 0.9f\n    }\n\n    var selectColor = 0\n    var deselectColor = 0\n\n    override val selectAnimator by lazy {\n        AnimatorSet()\n                .apply {\n                    playTogether(\n                            selectScaleAnimator,\n                            selectMoveAnimator,\n                            selectTintAnimator)\n                    addListener(object : Animator.AnimatorListener {\n                        override fun onAnimationRepeat(animation: Animator?) = Unit\n                        override fun onAnimationEnd(animation: Animator?) = Unit\n                        override fun onAnimationCancel(animation: Animator?) = Unit\n                        override fun onAnimationStart(animation: Animator?) {\n                            deselectTintAnimator.cancel()\n                            setTintColor(selectColor)\n                        }\n                    })\n                }\n    }\n\n    override val deselectAnimator by lazy {\n        AnimatorSet()\n                .apply {\n                    playTogether(\n                            deselectScaleAnimator,\n                            deselectMoveAnimator,\n                            deselectTintAnimator)\n                }\n    }\n\n    private val selectScaleAnimator =\n            AnimatorSet()\n                    .apply {\n                        playSequentially(\n                                scaleAnimator(0.9f, 1.1f, 7 * KEY_FRAME_IN_MS, interpolators[0]),\n                                scaleAnimator(1.1f, 0.84f, 4 * KEY_FRAME_IN_MS, interpolators[0]),\n                                scaleAnimator(0.84f, 0.9f, 4 * KEY_FRAME_IN_MS, interpolators[3]))\n                    }\n\n    private val selectMoveAnimator =\n            AnimatorSet()\n                    .apply {\n                        playSequentially(\n                                translationYAnimator(\n                                        0f,\n                                        getItemOvershootTransitionYValue(context),\n                                        7 * KEY_FRAME_IN_MS,\n                                        interpolators[0]),\n                                translationYAnimator(\n                                        getItemOvershootTransitionYValue(context),\n                                        getItemTransitionYValue(context),\n                                        3 * KEY_FRAME_IN_MS,\n                                        interpolators[4]))\n                        startDelay = 11 * KEY_FRAME_IN_MS\n                    }\n\n    private val selectTintAnimator by lazy {\n        AnimatorSet()\n                .apply {\n                    play(tintAnimator(\n                            deselectColor,\n                            selectColor,\n                            3 * KEY_FRAME_IN_MS))\n                }\n    }\n\n    private val deselectScaleAnimator =\n            AnimatorSet()\n                    .apply {\n                        playSequentially(\n                                scaleAnimator(0.9f, 0.84f, 4 * KEY_FRAME_IN_MS, interpolators[3]),\n                                scaleAnimator(0.84f, 1.1f, 4 * KEY_FRAME_IN_MS, interpolators[0]),\n                                scaleAnimator(1.1f, 0.9f, 7 * KEY_FRAME_IN_MS, interpolators[0]))\n                    }\n\n    private val deselectMoveAnimator =\n            AnimatorSet()\n                    .apply {\n                        playSequentially(\n                                translationYAnimator(\n                                        getItemTransitionYValue(context),\n                                        getItemOvershootTransitionYValue(context),\n                                        3 * KEY_FRAME_IN_MS,\n                                        interpolators[4]),\n                                translationYAnimator(\n                                        getItemOvershootTransitionYValue(context),\n                                        0f,\n                                        7 * KEY_FRAME_IN_MS,\n                                        interpolators[0]))\n                        startDelay = 6 * KEY_FRAME_IN_MS\n                    }\n\n    private val deselectTintAnimator by lazy {\n        AnimatorSet()\n                .apply {\n                    play(tintAnimator(\n                            selectColor,\n                            deselectColor,\n                            3 * KEY_FRAME_IN_MS))\n                    startDelay = 19 * KEY_FRAME_IN_MS\n                }\n    }\n}\n"
  },
  {
    "path": "fluidbottomnavigation/src/main/java/com/tenclouds/fluidbottomnavigation/view/RectangleView.kt",
    "content": "package com.tenclouds.fluidbottomnavigation.view\n\nimport android.animation.Animator\nimport android.animation.AnimatorSet\nimport android.content.Context\nimport android.util.AttributeSet\nimport androidx.appcompat.widget.AppCompatImageView\nimport com.tenclouds.fluidbottomnavigation.KEY_FRAME_IN_MS\nimport com.tenclouds.fluidbottomnavigation.extension.interpolators\nimport com.tenclouds.fluidbottomnavigation.extension.scaleYAnimator\nimport com.tenclouds.fluidbottomnavigation.extension.translationYAnimator\n\ninternal class RectangleView @JvmOverloads constructor(context: Context,\n                                              attrs: AttributeSet? = null,\n                                              defStyleAttr: Int = 0)\n    : AppCompatImageView(context, attrs, defStyleAttr), AnimatedView {\n\n    init {\n        scaleY = 0f\n    }\n\n    override val selectAnimator by lazy {\n        AnimatorSet()\n                .apply {\n                    playTogether(\n                            selectScaleAnimator,\n                            selectMoveAnimator)\n                    addListener(object : Animator.AnimatorListener {\n                        override fun onAnimationRepeat(animation: Animator?) = Unit\n                        override fun onAnimationEnd(animation: Animator?) = Unit\n                        override fun onAnimationCancel(animation: Animator?) = Unit\n                        override fun onAnimationStart(animation: Animator?) {\n                            deselectMoveAnimator.cancel()\n                            deselectScaleAnimator.cancel()\n                            scaleY = 0f\n                        }\n                    })\n                }\n    }\n\n    override val deselectAnimator by lazy {\n        AnimatorSet()\n                .apply {\n                    playTogether(\n                            deselectScaleAnimator,\n                            deselectMoveAnimator)\n                    addListener(object : Animator.AnimatorListener {\n                        override fun onAnimationRepeat(animation: Animator?) = Unit\n                        override fun onAnimationEnd(animation: Animator?) = Unit\n                        override fun onAnimationCancel(animation: Animator?) = Unit\n                        override fun onAnimationStart(animation: Animator?) {\n                            selectAnimator.cancel()\n                        }\n                    })\n                }\n    }\n\n    private val selectScaleAnimator =\n            AnimatorSet()\n                    .apply {\n                        playSequentially(\n                                scaleYAnimator(0.0f, 0.8f, 3 * KEY_FRAME_IN_MS, interpolators[1]),\n                                scaleYAnimator(0.8f, 0.0f, 5 * KEY_FRAME_IN_MS, interpolators[1]))\n                        startDelay = 11 * KEY_FRAME_IN_MS\n                    }\n\n    private val selectMoveAnimator =\n            AnimatorSet()\n                    .apply {\n                        play(\n                                translationYAnimator(\n                                        0f,\n                                        getItemTransitionYValue(context),\n                                        5 * KEY_FRAME_IN_MS,\n                                        interpolators[1]))\n                        startDelay = 14 * KEY_FRAME_IN_MS\n                    }\n\n    private val deselectScaleAnimator =\n            AnimatorSet()\n                    .apply {\n                        playSequentially(\n                                scaleYAnimator(0.0f, 0.8f, 5 * KEY_FRAME_IN_MS, interpolators[1]),\n                                scaleYAnimator(0.8f, 0.0f, 3 * KEY_FRAME_IN_MS, interpolators[1]))\n                        startDelay = 4 * KEY_FRAME_IN_MS\n                    }\n\n    private val deselectMoveAnimator =\n            AnimatorSet()\n                    .apply {\n                        play(\n                                translationYAnimator(\n                                        getItemDeselectTransitionYValue(context),\n                                        0f,\n                                        2 * KEY_FRAME_IN_MS,\n                                        interpolators[1]))\n                        startDelay = 4 * KEY_FRAME_IN_MS\n                    }\n\n    private fun getItemDeselectTransitionYValue(context: Context) =\n            getItemTransitionYValue(context) * 3 / 5\n}\n"
  },
  {
    "path": "fluidbottomnavigation/src/main/java/com/tenclouds/fluidbottomnavigation/view/TitleView.kt",
    "content": "package com.tenclouds.fluidbottomnavigation.view\n\nimport android.animation.AnimatorSet\nimport android.content.Context\nimport android.util.AttributeSet\nimport androidx.appcompat.widget.AppCompatTextView\nimport androidx.interpolator.view.animation.LinearOutSlowInInterpolator\nimport com.tenclouds.fluidbottomnavigation.KEY_FRAME_IN_MS\nimport com.tenclouds.fluidbottomnavigation.extension.alphaAnimator\nimport com.tenclouds.fluidbottomnavigation.extension.interpolators\nimport com.tenclouds.fluidbottomnavigation.extension.translationYAnimator\n\ninternal class TitleView @JvmOverloads constructor(context: Context,\n                                                   attrs: AttributeSet? = null,\n                                                   defStyleAttr: Int = 0)\n    : AppCompatTextView(context, attrs, defStyleAttr), AnimatedView {\n\n    override val selectAnimator by lazy {\n        AnimatorSet()\n                .apply {\n                    playTogether(\n                            selectMoveAnimator,\n                            selectAlphaAnimator)\n                }\n    }\n\n    override val deselectAnimator by lazy {\n        AnimatorSet()\n                .apply {\n                    playTogether(\n                            deselectMoveAnimator,\n                            deselectAlphaAnimator)\n                }\n    }\n\n    private val selectMoveAnimator =\n            AnimatorSet()\n                    .apply {\n                        playSequentially(\n                                translationYAnimator(\n                                        0f,\n                                        getItemOvershootTransitionYValue(context),\n                                        7 * KEY_FRAME_IN_MS,\n                                        interpolators[0]),\n                                translationYAnimator(\n                                        getItemOvershootTransitionYValue(context),\n                                        getItemTransitionYValue(context),\n                                        3 * KEY_FRAME_IN_MS,\n                                        interpolators[4]))\n                        startDelay = 11 * KEY_FRAME_IN_MS\n                    }\n\n    private val selectAlphaAnimator =\n            AnimatorSet()\n                    .apply {\n                        play(alphaAnimator(0f, 1f, 8 * KEY_FRAME_IN_MS, LinearOutSlowInInterpolator()))\n                        startDelay = 14 * KEY_FRAME_IN_MS\n                    }\n\n\n    private val deselectMoveAnimator =\n            AnimatorSet()\n                    .apply {\n                        playSequentially(\n                                translationYAnimator(\n                                        getItemTransitionYValue(context),\n                                        getItemOvershootTransitionYValue(context),\n                                        3 * KEY_FRAME_IN_MS,\n                                        interpolators[4]),\n                                translationYAnimator(\n                                        getItemOvershootTransitionYValue(context),\n                                        0f,\n                                        11 * KEY_FRAME_IN_MS,\n                                        interpolators[0]))\n                        startDelay = 4 * KEY_FRAME_IN_MS\n                    }\n\n    private val deselectAlphaAnimator =\n            AnimatorSet()\n                    .apply {\n                        play(alphaAnimator(1f, 0f, 8 * KEY_FRAME_IN_MS, LinearOutSlowInInterpolator()))\n                        startDelay = 7 * KEY_FRAME_IN_MS\n                    }\n}"
  },
  {
    "path": "fluidbottomnavigation/src/main/java/com/tenclouds/fluidbottomnavigation/view/TopContainerView.kt",
    "content": "package com.tenclouds.fluidbottomnavigation.view\n\nimport android.animation.AnimatorSet\nimport android.content.Context\nimport android.util.AttributeSet\nimport androidx.appcompat.widget.AppCompatImageView\nimport androidx.core.content.ContextCompat\nimport com.tenclouds.fluidbottomnavigation.KEY_FRAME_IN_MS\nimport com.tenclouds.fluidbottomnavigation.R\nimport com.tenclouds.fluidbottomnavigation.extension.interpolators\nimport com.tenclouds.fluidbottomnavigation.extension.scaleAnimator\nimport com.tenclouds.fluidbottomnavigation.extension.translationYAnimator\n\ninternal class TopContainerView @JvmOverloads constructor(context: Context,\n                                                          attrs: AttributeSet? = null,\n                                                          defStyleAttr: Int = 0)\n    : AppCompatImageView(context, attrs, defStyleAttr), AnimatedView {\n\n    init {\n        setImageDrawable(ContextCompat.getDrawable(context, R.drawable.top))\n        translationY = 100f\n    }\n\n    override val selectAnimator by lazy {\n        AnimatorSet()\n                .apply {\n                    playTogether(\n                            selectScaleAnimator,\n                            selectMoveAnimator)\n                }\n    }\n\n    override val deselectAnimator by lazy {\n        AnimatorSet()\n                .apply {\n                    playTogether(\n                            deselectScaleAnimator,\n                            deselectMoveAnimator)\n                }\n    }\n\n    private val selectScaleAnimator =\n            AnimatorSet()\n                    .apply {\n                        playSequentially(\n                                scaleAnimator(1.0f, 1.25f, 6 * KEY_FRAME_IN_MS, interpolators[1]),\n                                scaleAnimator(1.25f, 0.85f, 3 * KEY_FRAME_IN_MS, interpolators[1]),\n                                scaleAnimator(0.85f, 1.0f, 3 * KEY_FRAME_IN_MS, interpolators[1]))\n                        startDelay = 11 * KEY_FRAME_IN_MS\n                    }\n\n    private val selectMoveAnimator =\n            AnimatorSet()\n                    .apply {\n                        play(translationYAnimator(\n                                100f,\n                                getItemTransitionYValue(context),\n                                7 * KEY_FRAME_IN_MS,\n                                interpolators[0]))\n                        startDelay = 12 * KEY_FRAME_IN_MS\n                    }\n\n    private val deselectScaleAnimator =\n            AnimatorSet()\n                    .apply {\n                        playSequentially(\n                                scaleAnimator(1.0f, 0.85f, 3 * KEY_FRAME_IN_MS, interpolators[1]),\n                                scaleAnimator(0.85f, 1.25f, 3 * KEY_FRAME_IN_MS, interpolators[1]),\n                                scaleAnimator(1.25f, 1.0f, 7 * KEY_FRAME_IN_MS, interpolators[1]))\n                    }\n\n    private val deselectMoveAnimator =\n            AnimatorSet()\n                    .apply {\n                        play(translationYAnimator(\n                                getItemTransitionYValue(context),\n                                100f,\n                                10 * KEY_FRAME_IN_MS,\n                                interpolators[0]))\n                        startDelay = 8 * KEY_FRAME_IN_MS\n                    }\n\n    override fun getItemTransitionYValue(context: Context): Float {\n        return -super.getItemTransitionYValue(context) * 1 / 6\n    }\n}"
  },
  {
    "path": "fluidbottomnavigation/src/main/res/drawable/circle.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<shape\n        xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        android:shape=\"oval\">\n\n    <solid\n            android:color=\"#000\"/>\n\n    <size\n            android:width=\"48dp\"\n            android:height=\"48dp\"/>\n</shape>"
  },
  {
    "path": "fluidbottomnavigation/src/main/res/drawable/rectangle.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<shape\n        xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        android:shape=\"rectangle\">\n\n    <corners\n            android:radius=\"48dp\"/>\n\n    <solid\n            android:color=\"#000\"/>\n\n    <size\n            android:width=\"48dp\"\n            android:height=\"96dp\"/>\n</shape>"
  },
  {
    "path": "fluidbottomnavigation/src/main/res/drawable/top.xml",
    "content": "<vector\n        xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        android:name=\"vector\"\n        android:width=\"118dp\"\n        android:height=\"46dp\"\n        android:viewportWidth=\"118\"\n        android:viewportHeight=\"46\">\n    <path\n            android:pathData=\"M 85 15 C 94 29 95 33 118 33 L 118 46 L 0 46 L 0 33 C 23 33 24 29 33 15 C 36.522 8.881 42.094 4.198 48.727 1.78 C 55.361 -0.637 62.639 -0.637 69.273 1.78 C 75.906 4.198 81.478 8.881 85 15 Z\"\n            android:fillColor=\"#ffffff\"\n            android:strokeWidth=\"1\"\n            android:fillType=\"evenOdd\"/>\n</vector>\n"
  },
  {
    "path": "fluidbottomnavigation/src/main/res/layout/item.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<androidx.constraintlayout.widget.ConstraintLayout\n        xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        xmlns:tools=\"http://schemas.android.com/tools\"\n        xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n        android:id=\"@+id/container\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"@dimen/fluidBottomNavigationHeightWithOpacity\"\n        android:background=\"@android:color/transparent\">\n\n    <com.tenclouds.fluidbottomnavigation.view.TopContainerView\n            android:id=\"@+id/topContainer\"\n            android:layout_width=\"@dimen/fluidBottomNavigationTopContainerWidth\"\n            android:layout_height=\"wrap_content\"\n            app:layout_constraintTop_toTopOf=\"parent\"\n            app:layout_constraintLeft_toLeftOf=\"parent\"\n            app:layout_constraintRight_toRightOf=\"parent\"\n            android:layout_marginRight=\"@dimen/fluidBottomNavigationTopContainerMarginLeftRight\"\n            android:layout_marginEnd=\"@dimen/fluidBottomNavigationTopContainerMarginLeftRight\"\n            />\n\n    <androidx.constraintlayout.widget.ConstraintLayout\n            android:id=\"@+id/backgroundContainer\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"@dimen/fluidBottomNavigationHeight\"\n            android:background=\"@android:color/white\"\n            app:layout_constraintTop_toTopOf=\"parent\"\n            app:layout_constraintLeft_toLeftOf=\"parent\"\n            app:layout_constraintRight_toRightOf=\"parent\"\n            android:layout_marginTop=\"@dimen/fluidBottomNavigationBackgroundMarginTop\"\n            />\n\n    <com.tenclouds.fluidbottomnavigation.view.RectangleView\n            android:id=\"@+id/rectangle\"\n            android:layout_width=\"@dimen/fluidBottomNavigationCircleSize\"\n            android:layout_height=\"@dimen/fluidBottomNavigationCircleSize\"\n            app:layout_constraintLeft_toLeftOf=\"parent\"\n            app:layout_constraintRight_toRightOf=\"parent\"\n            app:layout_constraintTop_toTopOf=\"parent\"\n            android:src=\"@drawable/rectangle\"\n            android:layout_marginTop=\"@dimen/fluidBottomNavigationRectangleMarginTop\"\n            />\n\n    <com.tenclouds.fluidbottomnavigation.view.CircleView\n            android:id=\"@+id/circle\"\n            android:layout_width=\"@dimen/fluidBottomNavigationCircleSize\"\n            android:layout_height=\"@dimen/fluidBottomNavigationCircleSize\"\n            app:layout_constraintLeft_toLeftOf=\"parent\"\n            app:layout_constraintRight_toRightOf=\"parent\"\n            app:layout_constraintTop_toTopOf=\"parent\"\n            android:src=\"@drawable/circle\"\n            android:layout_marginTop=\"@dimen/fluidBottomNavigationCircleMarginTop\"\n            />\n\n    <com.tenclouds.fluidbottomnavigation.view.IconView\n            android:id=\"@+id/icon\"\n            android:layout_width=\"@dimen/fluidBottomNavigationIconSize\"\n            android:layout_height=\"@dimen/fluidBottomNavigationIconSize\"\n            app:layout_constraintLeft_toLeftOf=\"parent\"\n            app:layout_constraintRight_toRightOf=\"parent\"\n            app:layout_constraintTop_toTopOf=\"parent\"\n            android:layout_marginTop=\"@dimen/fluidBottomNavigationIconMarginTop\"\n            tools:src=\"@android:drawable/btn_star\"\n            />\n\n    <com.tenclouds.fluidbottomnavigation.view.TitleView\n            android:id=\"@+id/title\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_marginTop=\"@dimen/fluidBottomNavigationTitleMarginTop\"\n            android:lines=\"1\"\n            android:textColor=\"@color/textColor\"\n            app:layout_constraintTop_toBottomOf=\"@id/icon\"\n            app:layout_constraintLeft_toLeftOf=\"parent\"\n            app:layout_constraintRight_toRightOf=\"parent\"\n            android:textSize=\"@dimen/fluidBottomNavigationTextSize\"\n            tools:text=\"Label One\"/>\n\n</androidx.constraintlayout.widget.ConstraintLayout>\n"
  },
  {
    "path": "fluidbottomnavigation/src/main/res/values/attrs.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <declare-styleable name=\"FluidBottomNavigation\">\n        <attr name=\"defaultTabPosition\" format=\"integer\"/>\n        <attr name=\"accentColor\" format=\"color\"/>\n        <attr name=\"backColor\" format=\"color\"/>\n        <attr name=\"iconColor\" format=\"color\"/>\n        <attr name=\"iconSelectedColor\" format=\"color\"/>\n        <attr name=\"textColor\" format=\"color\"/>\n        <attr name=\"textFont\" format=\"string\"/>\n    </declare-styleable>\n</resources>"
  },
  {
    "path": "fluidbottomnavigation/src/main/res/values/colors.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <color name=\"accentColor\">#303F9F</color>\n    <color name=\"backColor\">#FFFFFF</color>\n    <color name=\"textColor\">#303F9F</color>\n    <color name=\"iconColor\">#3F51B5</color>\n    <color name=\"iconSelectedColor\">#FFFFFF</color>\n</resources>"
  },
  {
    "path": "fluidbottomnavigation/src/main/res/values/dimens.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <dimen name=\"fluidBottomNavigationHeight\">56dp</dimen>\n    <dimen name=\"fluidBottomNavigationHeightWithOpacity\">80dp</dimen>\n\n    <dimen name=\"fluidBottomNavigationTopContainerMarginLeftRight\">1dp</dimen>\n    <dimen name=\"fluidBottomNavigationTopContainerWidth\">88dp</dimen>\n\n    <dimen name=\"fluidBottomNavigationCircleSize\">36dp</dimen>\n    <dimen name=\"fluidBottomNavigationIconSize\">18dp</dimen>\n\n    <dimen name=\"fluidBottomNavigationCircleMarginTop\">37dp</dimen>\n    <dimen name=\"fluidBottomNavigationIconMarginTop\">46dp</dimen>\n    <dimen name=\"fluidBottomNavigationBackgroundMarginTop\">32dp</dimen>\n    <dimen name=\"fluidBottomNavigationRectangleMarginTop\">28dp</dimen>\n    <dimen name=\"fluidBottomNavigationTitleMarginTop\">14dp</dimen>\n\n    <dimen name=\"fluidBottomNavigationTextSize\">12sp</dimen>\n    <dimen name=\"fluidBottomNavigationItemTranslationY\">22dp</dimen>\n</resources>\n"
  },
  {
    "path": "fluidbottomnavigation/src/main/res/values/strings.xml",
    "content": "<resources>\n    <string name=\"exception_not_enough_items\">Items list should have minimum 3 items</string>\n    <string name=\"exception_too_many_items\">Items list should have maximum 5 items</string>\n</resources>\n"
  },
  {
    "path": "fluidbottomnavigation/src/test/java/com/tenclouds/fluidbottomnavigation/FluidBottomNavigationTest.kt",
    "content": "package com.tenclouds.fluidbottomnavigation\n\nimport android.app.Activity\nimport com.nhaarman.mockitokotlin2.verify\nimport com.tenclouds.fluidbottomnavigation.listener.OnTabSelectedListener\nimport com.tenclouds.fluidbottomnavigation.util.ShadowResourcesCompat\nimport org.junit.Assert.*\nimport org.junit.Before\nimport org.junit.Test\nimport org.junit.runner.RunWith\nimport org.mockito.Mockito.mock\nimport org.robolectric.Robolectric\nimport org.robolectric.RobolectricTestRunner\nimport org.robolectric.annotation.Config\n\n@RunWith(RobolectricTestRunner::class)\n@Config(\n        packageName = \"com.tenclouds.fluidbottomnavigation\",\n        sdk = [21],\n        shadows = [(ShadowResourcesCompat::class)])\nclass FluidBottomNavigationTest {\n\n    private lateinit var fluidBottomNavigation: FluidBottomNavigation\n    private val controller = Robolectric.buildActivity(Activity::class.java).create().start()\n    private val fluidBottomNavigationItems =\n            listOf(\n                    FluidBottomNavigationItem(\"Tab1\"),\n                    FluidBottomNavigationItem(\"Tab2\"),\n                    FluidBottomNavigationItem(\"Tab3\"))\n    private val onTabSelectedListener = mock(OnTabSelectedListener::class.java)\n\n    @Before\n    fun setup() {\n        fluidBottomNavigation =\n                FluidBottomNavigation(controller.get())\n                        .apply {\n                            items = fluidBottomNavigationItems\n                            onTabSelectedListener = this@FluidBottomNavigationTest.onTabSelectedListener\n                        }\n    }\n\n    @Test\n    fun `selected tab position and item sets after context recreate`() {\n        fluidBottomNavigation.selectTab(1)\n        controller.configurationChange()\n        assertEquals(1, fluidBottomNavigation.getSelectedTabPosition())\n        fluidBottomNavigation.selectTab(2)\n        controller.configurationChange()\n        assertEquals(2, fluidBottomNavigation.getSelectedTabPosition())\n        fluidBottomNavigation.selectTab(0)\n        controller.configurationChange()\n        assertEquals(0, fluidBottomNavigation.getSelectedTabPosition())\n    }\n\n    @Test\n    fun `selectTab invokes onTabSelected on OnTabSelectedListener`() {\n        fluidBottomNavigation.selectTab(1)\n        verify(onTabSelectedListener).onTabSelected(1)\n        fluidBottomNavigation.selectTab(2)\n        verify(onTabSelectedListener).onTabSelected(2)\n        fluidBottomNavigation.selectTab(0)\n        verify(onTabSelectedListener).onTabSelected(0)\n    }\n\n    @Test\n    fun `selectTab changes selected tab position`() {\n        fluidBottomNavigation.selectTab(1)\n        assertEquals(1, fluidBottomNavigation.getSelectedTabPosition())\n        fluidBottomNavigation.selectTab(2)\n        assertEquals(2, fluidBottomNavigation.getSelectedTabPosition())\n        fluidBottomNavigation.selectTab(0)\n        assertEquals(0, fluidBottomNavigation.getSelectedTabPosition())\n    }\n\n    @Test\n    fun `selectTab changes selected tab item`() {\n        fluidBottomNavigation.selectTab(1)\n        assertEquals(fluidBottomNavigationItems[1], fluidBottomNavigation.selectedTabItem)\n        fluidBottomNavigation.selectTab(2)\n        assertEquals(fluidBottomNavigationItems[2], fluidBottomNavigation.selectedTabItem)\n        fluidBottomNavigation.selectTab(0)\n        assertEquals(fluidBottomNavigationItems[0], fluidBottomNavigation.selectedTabItem)\n    }\n\n    @Test\n    fun `hide hides navigation`() {\n        fluidBottomNavigation.isVisible = true\n        fluidBottomNavigation.hide()\n        assertFalse(fluidBottomNavigation.isVisible)\n    }\n\n    @Test\n    fun `show shows navigation`() {\n        fluidBottomNavigation.isVisible = false\n        fluidBottomNavigation.show()\n        assertTrue(fluidBottomNavigation.isVisible)\n    }\n\n    @Test\n    fun `getTabsSize returns correct items size`() {\n        assertEquals(fluidBottomNavigationItems.size, fluidBottomNavigation.getTabsSize())\n    }\n}"
  },
  {
    "path": "fluidbottomnavigation/src/test/java/com/tenclouds/fluidbottomnavigation/util/ShadowResourcesCompat.java",
    "content": "package com.tenclouds.fluidbottomnavigation.util;\n\nimport android.content.Context;\nimport android.graphics.Typeface;\nimport android.support.annotation.FontRes;\nimport android.support.annotation.NonNull;\n\nimport androidx.core.content.res.ResourcesCompat;\n\nimport org.robolectric.annotation.Implementation;\nimport org.robolectric.annotation.Implements;\n\nimport java.util.HashMap;\nimport java.util.Map;\nimport java.util.function.Function;\n\n/**\n * Mocks out ResourcesCompat so getFont won't actually attempt to look up the FontRes as a real\n * resource, because of issues with Robolectric.\n * <p>\n * See: https://github.com/robolectric/robolectric/issues/3590\n */\n@Implements(ResourcesCompat.class)\npublic class ShadowResourcesCompat {\n    private static Map<Integer, Typeface> FONT_MAP = new HashMap<>();\n\n    @Implementation\n    public static Typeface getFont(@NonNull Context context,\n                                   @FontRes int id) {\n        return FONT_MAP.computeIfAbsent(id, new Function<Integer, Typeface>() {\n            @Override\n            public Typeface apply(Integer integer) {\n                return ShadowResourcesCompat.buildTypeface(integer);\n            }\n        });\n    }\n\n    private static Typeface buildTypeface(@FontRes int id) {\n        return Typeface.DEFAULT;\n    }\n}"
  },
  {
    "path": "gradle/wrapper/gradle-wrapper.properties",
    "content": "distributionBase=GRADLE_USER_HOME\ndistributionPath=wrapper/dists\nzipStoreBase=GRADLE_USER_HOME\nzipStorePath=wrapper/dists\ndistributionUrl=https\\://services.gradle.org/distributions/gradle-5.6.2-all.zip\n"
  },
  {
    "path": "gradle.properties",
    "content": "android.useAndroidX=true\nandroid.enableJetifier=true\n\norg.gradle.jvmargs=-Xmx1536m"
  },
  {
    "path": "gradlew",
    "content": "#!/usr/bin/env sh\n\n##############################################################################\n##\n##  Gradle start up script for UN*X\n##\n##############################################################################\n\n# Attempt to set APP_HOME\n# Resolve links: $0 may be a link\nPRG=\"$0\"\n# Need this for relative symlinks.\nwhile [ -h \"$PRG\" ] ; do\n    ls=`ls -ld \"$PRG\"`\n    link=`expr \"$ls\" : '.*-> \\(.*\\)$'`\n    if expr \"$link\" : '/.*' > /dev/null; then\n        PRG=\"$link\"\n    else\n        PRG=`dirname \"$PRG\"`\"/$link\"\n    fi\ndone\nSAVED=\"`pwd`\"\ncd \"`dirname \\\"$PRG\\\"`/\" >/dev/null\nAPP_HOME=\"`pwd -P`\"\ncd \"$SAVED\" >/dev/null\n\nAPP_NAME=\"Gradle\"\nAPP_BASE_NAME=`basename \"$0\"`\n\n# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.\nDEFAULT_JVM_OPTS=\"\"\n\n# Use the maximum available, or set MAX_FD != -1 to use that value.\nMAX_FD=\"maximum\"\n\nwarn () {\n    echo \"$*\"\n}\n\ndie () {\n    echo\n    echo \"$*\"\n    echo\n    exit 1\n}\n\n# OS specific support (must be 'true' or 'false').\ncygwin=false\nmsys=false\ndarwin=false\nnonstop=false\ncase \"`uname`\" in\n  CYGWIN* )\n    cygwin=true\n    ;;\n  Darwin* )\n    darwin=true\n    ;;\n  MINGW* )\n    msys=true\n    ;;\n  NONSTOP* )\n    nonstop=true\n    ;;\nesac\n\nCLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar\n\n# Determine the Java command to use to start the JVM.\nif [ -n \"$JAVA_HOME\" ] ; then\n    if [ -x \"$JAVA_HOME/jre/sh/java\" ] ; then\n        # IBM's JDK on AIX uses strange locations for the executables\n        JAVACMD=\"$JAVA_HOME/jre/sh/java\"\n    else\n        JAVACMD=\"$JAVA_HOME/bin/java\"\n    fi\n    if [ ! -x \"$JAVACMD\" ] ; then\n        die \"ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME\n\nPlease set the JAVA_HOME variable in your environment to match the\nlocation of your Java installation.\"\n    fi\nelse\n    JAVACMD=\"java\"\n    which java >/dev/null 2>&1 || die \"ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.\n\nPlease set the JAVA_HOME variable in your environment to match the\nlocation of your Java installation.\"\nfi\n\n# Increase the maximum file descriptors if we can.\nif [ \"$cygwin\" = \"false\" -a \"$darwin\" = \"false\" -a \"$nonstop\" = \"false\" ] ; then\n    MAX_FD_LIMIT=`ulimit -H -n`\n    if [ $? -eq 0 ] ; then\n        if [ \"$MAX_FD\" = \"maximum\" -o \"$MAX_FD\" = \"max\" ] ; then\n            MAX_FD=\"$MAX_FD_LIMIT\"\n        fi\n        ulimit -n $MAX_FD\n        if [ $? -ne 0 ] ; then\n            warn \"Could not set maximum file descriptor limit: $MAX_FD\"\n        fi\n    else\n        warn \"Could not query maximum file descriptor limit: $MAX_FD_LIMIT\"\n    fi\nfi\n\n# For Darwin, add options to specify how the application appears in the dock\nif $darwin; then\n    GRADLE_OPTS=\"$GRADLE_OPTS \\\"-Xdock:name=$APP_NAME\\\" \\\"-Xdock:icon=$APP_HOME/media/gradle.icns\\\"\"\nfi\n\n# For Cygwin, switch paths to Windows format before running java\nif $cygwin ; then\n    APP_HOME=`cygpath --path --mixed \"$APP_HOME\"`\n    CLASSPATH=`cygpath --path --mixed \"$CLASSPATH\"`\n    JAVACMD=`cygpath --unix \"$JAVACMD\"`\n\n    # We build the pattern for arguments to be converted via cygpath\n    ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`\n    SEP=\"\"\n    for dir in $ROOTDIRSRAW ; do\n        ROOTDIRS=\"$ROOTDIRS$SEP$dir\"\n        SEP=\"|\"\n    done\n    OURCYGPATTERN=\"(^($ROOTDIRS))\"\n    # Add a user-defined pattern to the cygpath arguments\n    if [ \"$GRADLE_CYGPATTERN\" != \"\" ] ; then\n        OURCYGPATTERN=\"$OURCYGPATTERN|($GRADLE_CYGPATTERN)\"\n    fi\n    # Now convert the arguments - kludge to limit ourselves to /bin/sh\n    i=0\n    for arg in \"$@\" ; do\n        CHECK=`echo \"$arg\"|egrep -c \"$OURCYGPATTERN\" -`\n        CHECK2=`echo \"$arg\"|egrep -c \"^-\"`                                 ### Determine if an option\n\n        if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then                    ### Added a condition\n            eval `echo args$i`=`cygpath --path --ignore --mixed \"$arg\"`\n        else\n            eval `echo args$i`=\"\\\"$arg\\\"\"\n        fi\n        i=$((i+1))\n    done\n    case $i in\n        (0) set -- ;;\n        (1) set -- \"$args0\" ;;\n        (2) set -- \"$args0\" \"$args1\" ;;\n        (3) set -- \"$args0\" \"$args1\" \"$args2\" ;;\n        (4) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" ;;\n        (5) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" ;;\n        (6) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" \"$args5\" ;;\n        (7) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" \"$args5\" \"$args6\" ;;\n        (8) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" \"$args5\" \"$args6\" \"$args7\" ;;\n        (9) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" \"$args5\" \"$args6\" \"$args7\" \"$args8\" ;;\n    esac\nfi\n\n# Escape application args\nsave () {\n    for i do printf %s\\\\n \"$i\" | sed \"s/'/'\\\\\\\\''/g;1s/^/'/;\\$s/\\$/' \\\\\\\\/\" ; done\n    echo \" \"\n}\nAPP_ARGS=$(save \"$@\")\n\n# Collect all arguments for the java command, following the shell quoting and substitution rules\neval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS \"\\\"-Dorg.gradle.appname=$APP_BASE_NAME\\\"\" -classpath \"\\\"$CLASSPATH\\\"\" org.gradle.wrapper.GradleWrapperMain \"$APP_ARGS\"\n\n# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong\nif [ \"$(uname)\" = \"Darwin\" ] && [ \"$HOME\" = \"$PWD\" ]; then\n  cd \"$(dirname \"$0\")\"\nfi\n\nexec \"$JAVACMD\" \"$@\"\n"
  },
  {
    "path": "gradlew.bat",
    "content": "@if \"%DEBUG%\" == \"\" @echo off\r\n@rem ##########################################################################\r\n@rem\r\n@rem  Gradle startup script for Windows\r\n@rem\r\n@rem ##########################################################################\r\n\r\n@rem Set local scope for the variables with windows NT shell\r\nif \"%OS%\"==\"Windows_NT\" setlocal\r\n\r\nset DIRNAME=%~dp0\r\nif \"%DIRNAME%\" == \"\" set DIRNAME=.\r\nset APP_BASE_NAME=%~n0\r\nset APP_HOME=%DIRNAME%\r\n\r\n@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.\r\nset DEFAULT_JVM_OPTS=\r\n\r\n@rem Find java.exe\r\nif defined JAVA_HOME goto findJavaFromJavaHome\r\n\r\nset JAVA_EXE=java.exe\r\n%JAVA_EXE% -version >NUL 2>&1\r\nif \"%ERRORLEVEL%\" == \"0\" goto init\r\n\r\necho.\r\necho ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.\r\necho.\r\necho Please set the JAVA_HOME variable in your environment to match the\r\necho location of your Java installation.\r\n\r\ngoto fail\r\n\r\n:findJavaFromJavaHome\r\nset JAVA_HOME=%JAVA_HOME:\"=%\r\nset JAVA_EXE=%JAVA_HOME%/bin/java.exe\r\n\r\nif exist \"%JAVA_EXE%\" goto init\r\n\r\necho.\r\necho ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%\r\necho.\r\necho Please set the JAVA_HOME variable in your environment to match the\r\necho location of your Java installation.\r\n\r\ngoto fail\r\n\r\n:init\r\n@rem Get command-line arguments, handling Windows variants\r\n\r\nif not \"%OS%\" == \"Windows_NT\" goto win9xME_args\r\n\r\n:win9xME_args\r\n@rem Slurp the command line arguments.\r\nset CMD_LINE_ARGS=\r\nset _SKIP=2\r\n\r\n:win9xME_args_slurp\r\nif \"x%~1\" == \"x\" goto execute\r\n\r\nset CMD_LINE_ARGS=%*\r\n\r\n:execute\r\n@rem Setup the command line\r\n\r\nset CLASSPATH=%APP_HOME%\\gradle\\wrapper\\gradle-wrapper.jar\r\n\r\n@rem Execute Gradle\r\n\"%JAVA_EXE%\" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% \"-Dorg.gradle.appname=%APP_BASE_NAME%\" -classpath \"%CLASSPATH%\" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%\r\n\r\n:end\r\n@rem End local scope for the variables with windows NT shell\r\nif \"%ERRORLEVEL%\"==\"0\" goto mainEnd\r\n\r\n:fail\r\nrem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of\r\nrem the _cmd.exe /c_ return code!\r\nif  not \"\" == \"%GRADLE_EXIT_CONSOLE%\" exit 1\r\nexit /b 1\r\n\r\n:mainEnd\r\nif \"%OS%\"==\"Windows_NT\" endlocal\r\n\r\n:omega\r\n"
  },
  {
    "path": "settings.gradle",
    "content": "include ':app', ':fluidbottomnavigation'\n"
  }
]