[
  {
    "path": ".gitignore",
    "content": ".idea/\n# 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/workspace.xml\n\n# Keystore files\n*.jks\n"
  },
  {
    "path": "LICENSE",
    "content": "MIT License\n\nCopyright (c) 2017 Amar Jain\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": "# StickyScrollView\nSticky header and footer for android ScrollView.\n\n[![](https://jitpack.io/v/amarjain07/StickyScrollView.svg)](https://jitpack.io/#amarjain07/StickyScrollView)\n\n### Install\n\nAdd jitpack to your root's `build.gradle`\n```groovy\nallprojects {\n    repositories {\n\t    maven { url \"https://jitpack.io\" }\n\t}\n}\n```\n\nAdd the dependency\n```groovy\ndependencies {\n    implementation 'com.github.amarjain07:StickyScrollView:<latest-version>'\n}\n```\n\n### Usage\n```xml\n<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<com.amar.library.ui.StickyScrollView\n    android:id=\"@+id/scrollView\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    app:stickyHeader=\"@+id/title\"\n    app:stickyFooter=\"@+id/buttons\">\n    <LinearLayout\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:orientation=\"vertical\">\n        <LinearLayout\n            android:id=\"@+id/title\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:background=\"@android:color/white\"\n            android:orientation=\"vertical\"\n            android:padding=\"15dp\">\n            ...\n        </LinearLayout>\n        <LinearLayout\n            android:id=\"@+id/buttons\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\">\n            ...\n        </LinearLayout>\n    </LinearLayout>\n</com.amar.library.ui.StickyScrollView>\n```\n\n### Demo\n![StickyScrollViewGif](demo/StickyScroll.gif)\n\nLicense\n-------\n\n    MIT License\n\n    Copyright (c) 2017 Amar Jain\n\n    Permission is hereby granted, free of charge, to any person obtaining a copy\n    of this software and associated documentation files (the \"Software\"), to deal\n    in the Software without restriction, including without limitation the rights\n    to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n    copies of the Software, and to permit persons to whom the Software is\n    furnished to do so, subject to the following conditions:\n\n    The above copyright notice and this permission notice shall be included in all\n    copies or substantial portions of the Software.\n\n    THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n    IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n    FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n    AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n    LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n    OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n    SOFTWARE.\n"
  },
  {
    "path": "build.gradle",
    "content": "// Top-level build file where you can add configuration options common to all sub-projects/modules.\nbuildscript {\n    apply from: 'dependencies.gradle'\n\n    repositories {\n        mavenCentral()\n        google()\n    }\n    dependencies {\n        classpath \"com.android.tools.build:gradle:$gradlePluginVersion\"\n        classpath \"org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlinVersion\"\n    }\n}\n\nallprojects {\n    repositories {\n        mavenCentral()\n        google()\n        maven { url 'https://jitpack.io' }\n    }\n}\n\ntask clean(type: Delete) {\n    delete rootProject.buildDir\n}"
  },
  {
    "path": "dependencies.gradle",
    "content": "ext {\n    gradlePluginVersion = '7.0.4'\n    projectMinSdkVersion = 16\n    compileVersionSdk = 30\n    targetSdkVersion = compileVersionSdk\n    projectVersionCode = 1\n    projectVersionName = \"0.0.1\"\n\n    kotlinVersion = '1.6.10'\n    kotlinSdk = \"org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlinVersion\"\n\n    androidXCoreVersion = '1.3.2'\n    androidXVersion = '1.1.0'\n    androidXCompatVersion = '1.2.0'\n    androidXConstraintLayoutVersion = '2.0.4'\n    androidXMultidexVersion = '2.0.0'\n    androidSupportV4Version = \"1.0.0\"\n    droid = [\n            androidSupportV4        : \"androidx.legacy:legacy-support-v4:$androidSupportV4Version\",\n            androidCardview         : \"androidx.cardview:cardview:$androidSupportV4Version\",\n            fragment                : \"androidx.fragment:fragment:$androidSupportV4Version\",\n\n            androidAppCompatV7      : \"androidx.appcompat:appcompat:$androidXCompatVersion\",\n            coreX                   : \"androidx.core:core-ktx:$androidXCoreVersion\",\n\n            androidDesign           : \"com.google.android.material:material:$androidXVersion\",\n            androidRecyclerview     : \"androidx.recyclerview:recyclerview:$androidXVersion\",\n            androidSupportAnnotation: \"androidx.annotation:annotation:$androidXVersion\",\n            \n            androidConstraint       : \"androidx.constraintlayout:constraintlayout:$androidXConstraintLayoutVersion\",\n            androidMultidex         : \"androidx.multidex:multidex:$androidXMultidexVersion\",\n            databinding             : \"androidx.databinding:databinding-common:$gradlePluginVersion\",\n            databindingBase         : \"androidx.databinding:databinding-runtime:$gradlePluginVersion\"\n    ]\n\n    // Only include dependencies to be added to the library/AAR\n    internalLibs = [\n            androidAppCompatV7      : \"androidx.appcompat:appcompat:$androidXCompatVersion\",\n            coreX                   : \"androidx.core:core-ktx:$androidXCoreVersion\"\n    ]\n\n    daggerVersion = '2.29.1'\n    di = [\n            dagger       : \"com.google.dagger:dagger:$daggerVersion\",\n            daggerAndroid: \"com.google.dagger:dagger-android-support:$daggerVersion\"\n    ]\n\n    glideVersion = \"4.12.0\"\n    externalLibs = [\n            glide        : \"com.github.bumptech.glide:glide:$glideVersion\"\n    ]\n\n    kaptLibs = [\n            daggerCompiler        : \"com.google.dagger:dagger-compiler:$daggerVersion\",\n            daggerAndroidProcessor: \"com.google.dagger:dagger-android-processor:$daggerVersion\",\n            glideProcessor        : \"com.github.bumptech.glide:compiler:$glideVersion\"\n    ]\n\n    junit5 = \"5.6.2\"\n    mockitoVersion = \"3.2.4\"\n    mockitoKotlinVersion = \"1.6.0\"\n    archCoreTesting = \"2.1.0\"\n    testLibs = [\n            junitJupiterApi   : \"org.junit.jupiter:junit-jupiter-api:$junit5\",\n            junitJupiterEngine: \"org.junit.jupiter:junit-jupiter-engine:$junit5\",\n            junitJupiterParams: \"org.junit.jupiter:junit-jupiter-params:$junit5\",\n            mockito           : \"org.mockito:mockito-core:$mockitoVersion\",\n            mokitoKotlin      : \"com.nhaarman:mockito-kotlin:$mockitoKotlinVersion\",\n            coreTesting       : \"androidx.arch.core:core-testing:$archCoreTesting\"\n    ]\n    mockitoAndroid = \"org.mockito:mockito-android:\" + mockitoVersion\n\n    espressoVersion = \"3.2.0\"\n    testVersion = \"1.2.0\"\n    junitTestVersion = \"1.1.1\"\n    mockWebServerVersion = \"3.12.1\"\n    idlingResourceVersion = \"1.0.0\"\n    uiTestLibs = [\n            espressoCore   : \"androidx.test.espresso:espresso-core:$espressoVersion\",\n            espressoContrib: \"androidx.test.espresso:espresso-contrib:$espressoVersion\",\n            espressoIntents: \"androidx.test.espresso:espresso-intents:$espressoVersion\",\n            testRunner     : \"androidx.test:runner:$testVersion\",\n            testRules      : \"androidx.test:rules:$testVersion\",\n            junitTest      : \"androidx.test.ext:junit:$junitTestVersion\",\n            mockWebServer  : \"com.squareup.okhttp3:mockwebserver:$mockWebServerVersion\",\n            idlingResource : \"com.jakewharton.espresso:okhttp3-idling-resource:$idlingResourceVersion\"\n    ]\n}"
  },
  {
    "path": "gradle/wrapper/gradle-wrapper.properties",
    "content": "#Thu Jul 09 18:59:02 IST 2020\ndistributionBase=GRADLE_USER_HOME\ndistributionPath=wrapper/dists\nzipStoreBase=GRADLE_USER_HOME\nzipStorePath=wrapper/dists\ndistributionUrl=https\\://services.gradle.org/distributions/gradle-7.0.2-all.zip\n"
  },
  {
    "path": "gradle.properties",
    "content": "android.enableJetifier=true\nandroid.useAndroidX=true"
  },
  {
    "path": "gradlew",
    "content": "#!/usr/bin/env bash\n\n##############################################################################\n##\n##  Gradle start up script for UN*X\n##\n##############################################################################\n\n# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.\nDEFAULT_JVM_OPTS=\"\"\n\nAPP_NAME=\"Gradle\"\nAPP_BASE_NAME=`basename \"$0\"`\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\ncase \"`uname`\" in\n  CYGWIN* )\n    cygwin=true\n    ;;\n  Darwin* )\n    darwin=true\n    ;;\n  MINGW* )\n    msys=true\n    ;;\nesac\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\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\" ] ; 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# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules\nfunction splitJvmOpts() {\n    JVM_OPTS=(\"$@\")\n}\neval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS\nJVM_OPTS[${#JVM_OPTS[*]}]=\"-Dorg.gradle.appname=$APP_BASE_NAME\"\n\nexec \"$JAVACMD\" \"${JVM_OPTS[@]}\" -classpath \"$CLASSPATH\" org.gradle.wrapper.GradleWrapperMain \"$@\"\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\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\nset DIRNAME=%~dp0\r\nif \"%DIRNAME%\" == \"\" set DIRNAME=.\r\nset APP_BASE_NAME=%~n0\r\nset APP_HOME=%DIRNAME%\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 Windowz variants\r\n\r\nif not \"%OS%\" == \"Windows_NT\" goto win9xME_args\r\nif \"%@eval[2+2]\" == \"4\" goto 4NT_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\ngoto execute\r\n\r\n:4NT_args\r\n@rem Get arguments from the 4NT Shell from JP Software\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": "jitpack.yml",
    "content": "jdk:\n  - openjdk11"
  },
  {
    "path": "library/build.gradle",
    "content": "plugins {\n    id 'com.android.library'\n    id 'kotlin-android'\n}\napply from: 'publish.gradle'\n\nandroid {\n    compileSdkVersion compileVersionSdk\n\n    defaultConfig {\n        minSdkVersion projectMinSdkVersion\n        targetSdkVersion targetSdkVersion\n\n        testInstrumentationRunner \"android.support.test.runner.AndroidJUnitRunner\"\n        consumerProguardFiles 'consumer-rules.pro'\n        vectorDrawables.useSupportLibrary = true\n    }\n\n    buildTypes {\n        release {\n            minifyEnabled false\n            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'\n        }\n    }\n}\n\ndependencies {\n    implementation kotlinSdk\n    internalLibs.values().forEach { implementation it }\n    testLibs.values().forEach { testImplementation it }\n    uiTestLibs.values().forEach { androidTestImplementation it }\n}"
  },
  {
    "path": "library/proguard-rules.pro",
    "content": "# Add project specific ProGuard rules here.\n# By default, the flags in this file are appended to flags specified\n# in /Users/m02256/Library/Android/sdk/tools/proguard/proguard-android.txt\n# You can edit the include path and order by changing the proguardFiles\n# directive in build.gradle.\n#\n# For more details, see\n#   http://developer.android.com/guide/developing/tools/proguard.html\n\n# Add any project specific keep options here:\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": "library/publish.gradle",
    "content": "apply plugin: 'maven-publish'\n\nafterEvaluate {\n    publishing {\n        publications {\n            release(MavenPublication) {\n                from components.release\n                groupId = 'weekend.coder'\n                artifactId = 'sticky-scrollview'\n                version = '1.0.4'\n            }\n        }\n    }\n}"
  },
  {
    "path": "library/src/androidTest/java/com/amar/library/ExampleInstrumentedTest.java",
    "content": "package com.amar.library;\n\nimport android.content.Context;\nimport androidx.test.platform.app.InstrumentationRegistry;\nimport androidx.test.ext.junit.runners.AndroidJUnit4;\n\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\n\nimport static org.junit.Assert.*;\n\n/**\n * Instrumentation test, which will execute on an Android device.\n *\n * @see <a href=\"http://d.android.com/tools/testing\">Testing documentation</a>\n */\n@RunWith(AndroidJUnit4.class)\npublic class ExampleInstrumentedTest {\n    @Test\n    public void useAppContext() throws Exception {\n        // Context of the app under test.\n        Context appContext = InstrumentationRegistry.getTargetContext();\n\n        assertEquals(\"com.amar.library.test\", appContext.getPackageName());\n    }\n}\n"
  },
  {
    "path": "library/src/main/AndroidManifest.xml",
    "content": "<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    package=\"com.amar.library\" />\n"
  },
  {
    "path": "library/src/main/java/com/amar/library/provider/ResourceProvider.kt",
    "content": "package com.amar.library.provider\n\nimport android.content.Context\nimport android.util.AttributeSet\nimport androidx.annotation.StyleableRes\nimport androidx.core.content.res.use\nimport com.amar.library.provider.interfaces.IResourceProvider\n\ninternal class ResourceProvider(private val context: Context, private val attrs: AttributeSet?, @StyleableRes private val styleRes: IntArray) :\n    IResourceProvider {\n    override fun getResourcesByIds(@StyleableRes vararg styleResIds: Int): Array<Int> {\n        context.obtainStyledAttributes(attrs, styleRes).use { typedArray ->\n            return mutableListOf<Int>().apply {\n                styleResIds.forEach { styleResId -> add(typedArray.getResourceId(styleResId, 0)) }\n            }.toTypedArray()\n        }\n    }\n}"
  },
  {
    "path": "library/src/main/java/com/amar/library/provider/ScreenInfoProvider.kt",
    "content": "package com.amar.library.provider\n\nimport android.content.Context\nimport android.graphics.Point\nimport com.amar.library.provider.interfaces.IScreenInfoProvider\n\ninternal class ScreenInfoProvider(private val mContext: Context) : IScreenInfoProvider {\n    private val deviceDimension: Point\n        get() {\n            val lPoint = Point()\n            val metrics = mContext.resources.displayMetrics\n            lPoint.x = metrics.widthPixels\n            lPoint.y = metrics.heightPixels\n            return lPoint\n        }\n    override val screenHeight: Int\n        get() = deviceDimension.y\n    override val screenWidth: Int\n        get() = deviceDimension.x\n\n    override val navigationBarHeight: Int\n        get() {\n            val resourceId: Int =\n                mContext.resources.getIdentifier(\"navigation_bar_height\", \"dimen\", \"android\")\n            return if (resourceId > 0) {\n                mContext.resources.getDimensionPixelSize(resourceId)\n            } else 0\n        }\n}"
  },
  {
    "path": "library/src/main/java/com/amar/library/provider/interfaces/IResourceProvider.kt",
    "content": "package com.amar.library.provider.interfaces\n\nimport androidx.annotation.StyleableRes\n\ninternal interface IResourceProvider {\n    fun getResourcesByIds(@StyleableRes vararg styleResId: Int): Array<Int>\n}"
  },
  {
    "path": "library/src/main/java/com/amar/library/provider/interfaces/IScreenInfoProvider.kt",
    "content": "package com.amar.library.provider.interfaces\n\ninternal interface IScreenInfoProvider {\n    val screenHeight: Int\n    val screenWidth: Int\n    val navigationBarHeight: Int\n}"
  },
  {
    "path": "library/src/main/java/com/amar/library/ui/PropertySetter.kt",
    "content": "package com.amar.library.ui\n\nimport android.os.Build\nimport android.view.View\nimport androidx.core.view.ViewCompat\n\ninternal object PropertySetter {\n    fun setTranslationZ(view: View?, translationZ: Float) {\n        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {\n            view?.let {\n                ViewCompat.setTranslationZ(it, translationZ)\n            }\n        } else if (translationZ != 0f) {\n            view?.bringToFront()\n            if (view?.parent != null) {\n                (view.parent as View).invalidate()\n            }\n        }\n    }\n}"
  },
  {
    "path": "library/src/main/java/com/amar/library/ui/StickyScrollView.kt",
    "content": "package com.amar.library.ui\n\nimport android.content.Context\nimport android.os.Build\nimport android.os.Bundle\nimport android.os.Parcelable\nimport android.util.AttributeSet\nimport android.view.View\nimport androidx.annotation.IdRes\nimport androidx.core.widget.NestedScrollView\nimport com.amar.library.R\nimport com.amar.library.provider.ResourceProvider\nimport com.amar.library.provider.ScreenInfoProvider\nimport com.amar.library.provider.interfaces.IResourceProvider\nimport com.amar.library.provider.interfaces.IScreenInfoProvider\nimport com.amar.library.ui.interfaces.IScrollViewListener\nimport com.amar.library.ui.presentation.IStickyScrollPresentation\nimport com.amar.library.ui.presenter.StickyScrollPresenter\nimport android.view.ViewTreeObserver.OnGlobalLayoutListener as OnGlobalLayoutListener1\n\nclass StickyScrollView @JvmOverloads constructor(\n    context: Context,\n    attributeSet: AttributeSet? = null,\n    defStyleAttr: Int = 0\n) : NestedScrollView(context, attributeSet, defStyleAttr) {\n    private var scrollViewListener: IScrollViewListener? = null\n    private var stickyFooterView: View? = null\n    private var stickyHeaderView: View? = null\n    private var mStickyScrollPresenter: StickyScrollPresenter\n\n    init {\n        val screenInfoProvider: IScreenInfoProvider = ScreenInfoProvider(context)\n        val resourceProvider: IResourceProvider =\n            ResourceProvider(context, attributeSet, R.styleable.StickyScrollView)\n        mStickyScrollPresenter = StickyScrollPresenter(StickyScrollPresentation(), screenInfoProvider, resourceProvider)\n        onLayoutUpdate {\n            mStickyScrollPresenter.onGlobalLayoutChange(\n                R.styleable.StickyScrollView_stickyHeader,\n                R.styleable.StickyScrollView_stickyFooter\n            )\n        }\n    }\n\n    override fun onLayout(changed: Boolean, l: Int, t: Int, r: Int, b: Int) {\n        super.onLayout(changed, l, t, r, b)\n        if (!changed) {\n            mStickyScrollPresenter.recomputeFooterLocation(getFooterTop())\n        }\n        stickyHeaderView?.let {\n            mStickyScrollPresenter.recomputeHeaderLocation(it.top)\n        }\n    }\n\n    override fun onScrollChanged(mScrollX: Int, mScrollY: Int, oldX: Int, oldY: Int) {\n        super.onScrollChanged(mScrollX, mScrollY, oldX, oldY)\n        mStickyScrollPresenter.onScroll(mScrollY)\n        scrollViewListener?.onScrollChanged(mScrollX, mScrollY, oldX, oldY)\n    }\n\n    override fun onOverScrolled(scrollX: Int, scrollY: Int, clampedX: Boolean, clampedY: Boolean) {\n        super.onOverScrolled(scrollX, scrollY, clampedX, clampedY)\n        scrollViewListener?.onScrollStopped(clampedY)\n    }\n\n    override fun onSaveInstanceState(): Parcelable {\n        val bundle = Bundle()\n        bundle.putParcelable(STATE_SUPER, super.onSaveInstanceState())\n        bundle.putBoolean(STATE_SCROLL, mStickyScrollPresenter.mScrolled)\n        bundle.putInt(STATE_NAV_BAR_HEIGHT, mStickyScrollPresenter.mNavigationBarInitialHeight)\n        return bundle\n    }\n\n    override fun onRestoreInstanceState(state: Parcelable) {\n        if (state is Bundle) {\n            mStickyScrollPresenter.mNavigationBarInitialHeight = state.getInt(STATE_NAV_BAR_HEIGHT)\n            mStickyScrollPresenter.mScrolled = state.getBoolean(STATE_SCROLL)\n            super.onRestoreInstanceState(state.getParcelable(STATE_SUPER))\n            return\n        }\n        super.onRestoreInstanceState(state)\n    }\n\n    val isFooterSticky: Boolean\n        get() = mStickyScrollPresenter.isFooterSticky\n    val isHeaderSticky: Boolean\n        get() = mStickyScrollPresenter.isHeaderSticky\n\n    fun setHeaderView(@IdRes id: Int) {\n        stickyHeaderView = findViewById(id)\n        stickyHeaderView?.onLayoutUpdate { initialiseHeader() }\n    }\n\n    fun setFooterView(@IdRes id: Int) {\n        stickyFooterView = findViewById(id)\n        stickyFooterView?.onLayoutUpdate { initialiseFooter() }\n    }\n\n    fun setScrollViewListener(scrollViewListener: IScrollViewListener) {\n        this.scrollViewListener = scrollViewListener\n    }\n\n    private fun initialiseHeader(){\n        mStickyScrollPresenter.initStickyHeader(stickyHeaderView?.top)\n    }\n\n    private fun initialiseFooter(){\n        mStickyScrollPresenter.initStickyFooter(\n            stickyFooterView?.measuredHeight,\n            getFooterTop()\n        )\n    }\n\n    private fun getRelativeTop(myView: View): Int {\n        return if (myView.parent === myView.rootView) {\n            myView.top\n        } else {\n            myView.top + getRelativeTop(myView.parent as View)\n        }\n    }\n\n    private fun getFooterTop(): Int {\n        return stickyFooterView?.let {\n            return getRelativeTop(it) - it.topCutOutHeight()\n        } ?: 0\n    }\n\n    private inner class StickyScrollPresentation: IStickyScrollPresentation {\n        override val currentScrollYPos: Int\n            get() = scrollY\n\n        override fun freeHeader() {\n            stickyHeaderView?.let {\n                it.translationY = 0f\n                PropertySetter.setTranslationZ(it, 0f)\n            }\n        }\n\n        override fun freeFooter() {\n            stickyFooterView?.translationY = 0f\n        }\n\n        override fun stickHeader(translationY: Int) {\n            stickyHeaderView?.let {\n                it.translationY = translationY.toFloat()\n                PropertySetter.setTranslationZ(it, 1f)\n            }\n        }\n\n        override fun stickFooter(translationY: Int) {\n            stickyFooterView?.translationY = translationY.toFloat()\n        }\n\n        override fun initHeaderView(@IdRes id: Int) {\n            stickyHeaderView = findViewById(id)\n            stickyHeaderView?.post { initialiseHeader() }\n        }\n\n        override fun initFooterView(@IdRes id: Int) {\n            stickyFooterView = findViewById(id)\n            stickyFooterView?.post { initialiseFooter() }\n        }\n    }\n\n    private fun View.topCutOutHeight(): Int {\n        return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {\n            rootWindowInsets.displayCutout?.safeInsetTop ?: 0\n        } else {\n            0\n        }\n    }\n\n    private fun View.onLayoutUpdate(action: () -> Unit) {\n        viewTreeObserver.addOnGlobalLayoutListener(object : OnGlobalLayoutListener1 {\n            override fun onGlobalLayout() {\n                action.invoke()\n                viewTreeObserver.removeOnGlobalLayoutListener(this)\n            }\n        })\n    }\n\n    companion object {\n        private const val STATE_SCROLL = \"scroll_state\"\n        private const val STATE_SUPER = \"super_state\"\n        private const val STATE_NAV_BAR_HEIGHT = \"nav_bar_height_state\"\n    }\n}"
  },
  {
    "path": "library/src/main/java/com/amar/library/ui/interfaces/IScrollViewListener.kt",
    "content": "package com.amar.library.ui.interfaces\n\ninterface IScrollViewListener {\n    fun onScrollChanged(l: Int, t: Int, oldl: Int, oldt: Int){}\n    fun onScrollStopped(isStopped: Boolean){}\n}"
  },
  {
    "path": "library/src/main/java/com/amar/library/ui/presentation/IStickyScrollPresentation.kt",
    "content": "package com.amar.library.ui.presentation\n\ninterface IStickyScrollPresentation {\n    val currentScrollYPos: Int\n    fun freeHeader()\n    fun freeFooter()\n    fun stickHeader(translationY: Int)\n    fun stickFooter(translationY: Int)\n    fun initHeaderView(id: Int)\n    fun initFooterView(id: Int)\n}"
  },
  {
    "path": "library/src/main/java/com/amar/library/ui/presenter/StickyScrollPresenter.kt",
    "content": "package com.amar.library.ui.presenter\n\nimport androidx.annotation.StyleableRes\nimport com.amar.library.provider.interfaces.IResourceProvider\nimport com.amar.library.provider.interfaces.IScreenInfoProvider\nimport com.amar.library.ui.presentation.IStickyScrollPresentation\n\ninternal class StickyScrollPresenter(\n    stickyScrollPresentation: IStickyScrollPresentation,\n    private val screenInfoProvider: IScreenInfoProvider,\n    typedArrayResourceProvider: IResourceProvider\n) {\n    private val mTypedArrayResourceProvider: IResourceProvider = typedArrayResourceProvider\n    private val mStickyScrollPresentation: IStickyScrollPresentation = stickyScrollPresentation\n    private val mDeviceHeight: Int = screenInfoProvider.screenHeight\n    private var mStickyFooterHeight = 0\n    private var mStickyFooterInitialTranslation = 0\n    private var mStickyFooterInitialLocation = 0\n    private var mStickyHeaderInitialLocation = 0\n    private var navBarHeightDiff = 0\n    var mNavigationBarInitialHeight = screenInfoProvider.navigationBarHeight\n    var isFooterSticky = false\n        private set\n    var isHeaderSticky = false\n        private set\n    var mScrolled = false\n    fun onGlobalLayoutChange(@StyleableRes headerRes: Int, @StyleableRes footerRes: Int) {\n        val currentNavBarHeight = screenInfoProvider.navigationBarHeight\n        navBarHeightDiff = mNavigationBarInitialHeight - currentNavBarHeight\n        mNavigationBarInitialHeight = currentNavBarHeight\n        val resources = mTypedArrayResourceProvider.getResourcesByIds(headerRes, footerRes)\n        val headerId = resources[0]\n        if (headerId != 0) {\n            mStickyScrollPresentation.initHeaderView(headerId)\n        }\n        val footerId = resources[1]\n        if (footerId != 0) {\n            mStickyScrollPresentation.initFooterView(footerId)\n        }\n    }\n\n    fun initStickyFooter(measuredHeight: Int?, initialStickyFooterLocation: Int) {\n        measuredHeight?.let {\n            mStickyFooterHeight = it\n        }\n        mStickyFooterInitialLocation = initialStickyFooterLocation - navBarHeightDiff\n        mStickyFooterInitialTranslation =\n            mDeviceHeight - mStickyFooterInitialLocation - mStickyFooterHeight\n        if (mStickyFooterInitialLocation > mDeviceHeight - mStickyFooterHeight) {\n            mStickyScrollPresentation.stickFooter(mStickyFooterInitialTranslation)\n            isFooterSticky = true\n        }\n    }\n\n    fun initStickyHeader(headerTop: Int?) {\n        if (headerTop == null) {\n            mStickyHeaderInitialLocation = 0\n            return\n        }\n        mStickyHeaderInitialLocation = headerTop\n    }\n\n    fun onScroll(scrollY: Int) {\n        mScrolled = true\n        handleFooterStickiness(scrollY)\n        handleHeaderStickiness(scrollY)\n    }\n\n    private fun handleFooterStickiness(scrollY: Int) {\n        isFooterSticky = if (scrollY > mStickyFooterInitialLocation - mDeviceHeight + mStickyFooterHeight) {\n            mStickyScrollPresentation.freeFooter()\n            false\n        } else {\n            mStickyScrollPresentation.stickFooter(mStickyFooterInitialTranslation + scrollY)\n            true\n        }\n    }\n\n    private fun handleHeaderStickiness(scrollY: Int) {\n        isHeaderSticky = if (scrollY > mStickyHeaderInitialLocation) {\n            mStickyScrollPresentation.stickHeader(scrollY - mStickyHeaderInitialLocation)\n            true\n        } else {\n            mStickyScrollPresentation.freeHeader()\n            false\n        }\n    }\n\n    fun recomputeFooterLocation(footerTop: Int) {\n        if (mScrolled) {\n            mStickyFooterInitialLocation = footerTop - navBarHeightDiff\n            mStickyFooterInitialTranslation = mDeviceHeight - mStickyFooterInitialLocation - mStickyFooterHeight\n        } else {\n            initStickyFooter(mStickyFooterHeight, footerTop)\n        }\n        handleFooterStickiness(mStickyScrollPresentation.currentScrollYPos)\n    }\n\n    fun recomputeHeaderLocation(headerTop: Int) {\n        initStickyHeader(headerTop)\n        handleHeaderStickiness(mStickyScrollPresentation.currentScrollYPos)\n    }\n}"
  },
  {
    "path": "library/src/main/res/values/attrs.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <declare-styleable name=\"StickyScrollView\">\n        <attr name=\"stickyFooter\" format=\"reference\" />\n        <attr name=\"stickyHeader\" format=\"reference\" />\n    </declare-styleable>\n</resources>"
  },
  {
    "path": "library/src/main/res/values/strings.xml",
    "content": "<resources>\n    <string name=\"app_name\">library</string>\n</resources>\n"
  },
  {
    "path": "library/src/test/java/com/amar/library/ExampleUnitTest.java",
    "content": "package com.amar.library;\n\nimport org.junit.Test;\n\nimport static org.junit.Assert.*;\n\n/**\n * Example local unit test, which will execute on the development machine (host).\n *\n * @see <a href=\"http://d.android.com/tools/testing\">Testing documentation</a>\n */\npublic class ExampleUnitTest {\n    @Test\n    public void addition_isCorrect() throws Exception {\n        assertEquals(4, 2 + 2);\n    }\n}"
  },
  {
    "path": "sample/build.gradle",
    "content": "plugins {\n    id 'com.android.application'\n    id 'kotlin-android'\n}\n\nandroid {\n    compileSdkVersion compileVersionSdk\n\n    defaultConfig {\n        applicationId \"com.amar.hack\"\n        minSdkVersion projectMinSdkVersion\n        targetSdkVersion targetSdkVersion\n        versionCode projectVersionCode\n        versionName projectVersionName\n\n        multiDexEnabled true\n    }\n\n    buildTypes {\n        release {\n            minifyEnabled false\n            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'\n        }\n    }\n\n    compileOptions {\n        sourceCompatibility = JavaVersion.VERSION_11\n        targetCompatibility = JavaVersion.VERSION_11\n    }\n}\n\ndependencies {\n    implementation kotlinSdk\n    implementation project(':library')\n    droid.values().forEach { implementation it }\n    externalLibs.values().forEach { implementation it }\n    testLibs.values().forEach { testImplementation it }\n    uiTestLibs.values().forEach { androidTestImplementation it }\n}"
  },
  {
    "path": "sample/proguard-rules.pro",
    "content": "# Add project specific ProGuard rules here.\n# By default, the flags in this file are appended to flags specified\n# in /Users/m02256/Library/Android/sdk/tools/proguard/proguard-android.txt\n# You can edit the include path and order by changing the proguardFiles\n# directive in build.gradle.\n#\n# For more details, see\n#   http://developer.android.com/guide/developing/tools/proguard.html\n\n# Add any project specific keep options here:\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": "sample/src/androidTest/java/com/amar/sample/ExampleInstrumentedTest.java",
    "content": "package com.amar.sample;\n\nimport android.content.Context;\nimport androidx.test.platform.app.InstrumentationRegistry;\nimport androidx.test.ext.junit.runners.AndroidJUnit4;\n\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\n\nimport static org.junit.Assert.*;\n\n/**\n * Instrumentation test, which will execute on an Android device.\n *\n * @see <a href=\"http://d.android.com/tools/testing\">Testing documentation</a>\n */\n@RunWith(AndroidJUnit4.class)\npublic class ExampleInstrumentedTest {\n    @Test\n    public void useAppContext() throws Exception {\n        // Context of the app under test.\n        Context appContext = InstrumentationRegistry.getTargetContext();\n\n        assertEquals(\"com.amar.hack\", appContext.getPackageName());\n    }\n}\n"
  },
  {
    "path": "sample/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.amar.sample\">\n\n    <application\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=\".ViewPagerActivity\"\n            android:exported=\"false\"\n            android:label=\"ViewPager Screen\" />\n        <activity\n            android:name=\".MainActivity\"\n            android:exported=\"true\"\n            android:label=\"Home Screen\">\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": "sample/src/main/java/com/amar/sample/MainActivity.kt",
    "content": "package com.amar.sample\n\nimport android.content.Intent\nimport android.os.Bundle\nimport android.util.TypedValue\nimport android.view.View\nimport android.widget.ImageView\nimport android.widget.LinearLayout\nimport android.widget.Toast\nimport androidx.appcompat.app.AppCompatActivity\nimport com.amar.library.ui.StickyScrollView\nimport com.amar.library.ui.interfaces.IScrollViewListener\n\nclass MainActivity : AppCompatActivity(), View.OnClickListener {\n    private var scrollView: StickyScrollView? = null\n    private var mainShoeView: ImageView? = null\n    private var redShoeVisible = true\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n        setContentView(R.layout.activity_main)\n        scrollView = findViewById<View>(R.id.scrollView) as StickyScrollView\n        val titleHeader = findViewById<View>(R.id.title)\n        scrollView?.setScrollViewListener(object: IScrollViewListener{\n            override fun onScrollChanged(l: Int, t: Int, oldl: Int, oldt: Int) {\n                if(scrollView?.isHeaderSticky == true) {\n                    titleHeader.setBackgroundResource(android.R.color.white)\n                } else {\n                    titleHeader.setBackgroundResource(android.R.color.transparent)\n                }\n            }\n        })\n        findViewById<View>(R.id.buy).setOnClickListener(this)\n        findViewById<View>(R.id.save).setOnClickListener(this)\n        findViewById<View>(R.id.title).setOnClickListener(this)\n        findViewById<View>(R.id.other_product).setOnClickListener(this)\n        mainShoeView = findViewById(R.id.main_shoe_picture)\n        scrollView?.setFooterView(R.id.buttons)\n    }\n\n    override fun onClick(v: View) {\n        when (v.id) {\n            R.id.buy -> {\n                startActivity(Intent(this, ViewPagerActivity::class.java))\n            }\n            R.id.save -> Toast.makeText(\n                this,\n                if (scrollView!!.isFooterSticky) \"Footer is Sticky\" else \"Footer is not sticky\",\n                Toast.LENGTH_SHORT\n            ).show()\n            R.id.title -> Toast.makeText(\n                this,\n                if (scrollView!!.isHeaderSticky) \"Header is Sticky\" else \"Header is not sticky\",\n                Toast.LENGTH_SHORT\n            ).show()\n            R.id.other_product -> switchShoeViews()\n        }\n    }\n\n    private fun switchShoeViews() {\n        if (redShoeVisible) {\n            redShoeVisible = false\n            mainShoeView!!.setImageResource(R.drawable.similar_1)\n            val params = mainShoeView!!.layoutParams as LinearLayout.LayoutParams\n            params.height = dpToPixel(420).toInt()\n            mainShoeView!!.layoutParams = params\n        } else {\n            redShoeVisible = true\n            mainShoeView!!.setImageResource(R.drawable.nike)\n            val params = mainShoeView!!.layoutParams as LinearLayout.LayoutParams\n            params.height = dpToPixel(520).toInt()\n            mainShoeView!!.layoutParams = params\n        }\n    }\n\n    private fun dpToPixel(pixel: Int): Float {\n        val r = resources\n        return TypedValue.applyDimension(\n            TypedValue.COMPLEX_UNIT_DIP,\n            pixel.toFloat(),\n            r.displayMetrics\n        )\n    }\n}"
  },
  {
    "path": "sample/src/main/java/com/amar/sample/PageFragment.kt",
    "content": "package com.amar.sample\n\nimport android.os.Bundle\nimport android.view.LayoutInflater\nimport android.view.View\nimport android.view.ViewGroup\nimport androidx.fragment.app.Fragment\nimport com.amar.library.ui.StickyScrollView\n\nclass PageFragment : Fragment() {\n    override fun onCreateView(\n        inflater: LayoutInflater,\n        container: ViewGroup?,\n        savedInstanceState: Bundle?\n    ): View {\n        val view = inflater.inflate(R.layout.activity_main, container, false)\n        view.findViewById<StickyScrollView>(R.id.scrollView).setFooterView(R.id.buttons)\n        return view\n    }\n}"
  },
  {
    "path": "sample/src/main/java/com/amar/sample/ViewPagerActivity.kt",
    "content": "package com.amar.sample\n\nimport androidx.appcompat.app.AppCompatActivity\nimport android.os.Bundle\nimport androidx.fragment.app.Fragment\nimport androidx.fragment.app.FragmentActivity\nimport androidx.viewpager2.adapter.FragmentStateAdapter\nimport androidx.viewpager2.widget.ViewPager2\n\nclass ViewPagerActivity : AppCompatActivity() {\n\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n        setContentView(R.layout.activity_view_pager)\n        val viewPager: ViewPager2 = findViewById(R.id.pager)\n        viewPager.adapter = CustomPagerAdapter(this)\n    }\n\n    private inner class CustomPagerAdapter(fa: FragmentActivity) : FragmentStateAdapter(fa) {\n        override fun getItemCount(): Int = 2\n        override fun createFragment(position: Int): Fragment = PageFragment()\n    }\n}"
  },
  {
    "path": "sample/src/main/res/layout/activity_main.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<com.amar.library.ui.StickyScrollView xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:id=\"@+id/scrollView\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    app:stickyHeader=\"@+id/title\"\n    tools:context=\"com.amar.sample.MainActivity\">\n\n    <LinearLayout\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:orientation=\"vertical\">\n\n        <ImageView\n            android:id=\"@+id/main_shoe_picture\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"520dp\"\n            android:contentDescription=\"@string/app_name\"\n            android:src=\"@drawable/nike\" />\n\n        <View\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"0.1dp\"\n            android:background=\"@android:color/darker_gray\" />\n\n        <LinearLayout\n            android:id=\"@+id/title\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:background=\"@android:color/white\"\n            android:orientation=\"vertical\"\n            android:padding=\"15dp\">\n\n            <TextView\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:text=\"@string/product_title\"\n                android:textStyle=\"bold\" />\n\n            <TextView\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:text=\"@string/product_description_goes_here\"\n                android:textStyle=\"italic\" />\n        </LinearLayout>\n\n        <View\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"0.1dp\"\n            android:background=\"@android:color/darker_gray\" />\n\n        <LinearLayout\n            android:id=\"@+id/other_product\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:background=\"@color/colorAccent\"\n            android:orientation=\"vertical\"\n            android:padding=\"15dp\">\n\n            <TextView\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:text=\"@string/check_other_product\"\n                android:textStyle=\"bold\" />\n\n            <TextView\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:text=\"@string/other_product_info_goes_here\"\n                android:textStyle=\"italic\" />\n        </LinearLayout>\n\n        <View\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"0.1dp\"\n            android:background=\"@android:color/darker_gray\" />\n\n        <LinearLayout\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:orientation=\"vertical\"\n            android:padding=\"15dp\">\n\n            <TextView\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:text=\"@string/product_similar\"\n                android:textStyle=\"bold\" />\n\n            <TextView\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:text=\"@string/similar_items_go_here\"\n                android:textStyle=\"italic\" />\n        </LinearLayout>\n\n        <LinearLayout\n            android:id=\"@+id/buttons\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\">\n\n            <TextView\n                android:id=\"@+id/save\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"match_parent\"\n                android:layout_weight=\"1\"\n                android:background=\"#535766\"\n                android:gravity=\"center\"\n                android:padding=\"15dp\"\n                android:text=\"@string/save\"\n                android:textColor=\"@android:color/white\"\n                android:textSize=\"14sp\"\n                app:drawableLeftCompat=\"@mipmap/ic_wishlist\" />\n\n            <TextView\n                android:id=\"@+id/buy\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"match_parent\"\n                android:layout_weight=\"1\"\n                android:background=\"#0BC6A0\"\n                android:gravity=\"center\"\n                android:maxLines=\"1\"\n                android:text=\"@string/buy\"\n                android:textColor=\"@android:color/white\"\n                android:textSize=\"14sp\"\n                app:drawableLeftCompat=\"@mipmap/ic_bag\" />\n        </LinearLayout>\n\n        <LinearLayout\n            android:id=\"@+id/other_footer\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:orientation=\"vertical\"\n            android:background=\"@android:color/white\"\n            android:padding=\"15dp\">\n\n            <TextView\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:text=\"@string/other_product_related_info_goes_here\"\n                android:textStyle=\"bold\" />\n\n            <TextView\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:text=\"@string/you_can_add_more_data_here\"\n                android:textStyle=\"italic\" />\n        </LinearLayout>\n\n        <View\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"0.1dp\"\n            android:background=\"@android:color/darker_gray\" />\n\n        <TextView\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:padding=\"15dp\"\n            android:text=\"@string/more_colors\"\n            android:textStyle=\"bold\" />\n\n        <LinearLayout\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:orientation=\"horizontal\">\n\n            <ImageView\n                android:layout_width=\"0dp\"\n                android:layout_height=\"220dp\"\n                android:layout_weight=\"1\"\n                android:contentDescription=\"@string/app_name\"\n                android:src=\"@drawable/similar_1\" />\n\n            <ImageView\n                android:layout_width=\"0dp\"\n                android:layout_height=\"620dp\"\n                android:layout_weight=\"1\"\n                android:contentDescription=\"@string/app_name\"\n                android:src=\"@drawable/similar_2\" />\n        </LinearLayout>\n    </LinearLayout>\n</com.amar.library.ui.StickyScrollView>"
  },
  {
    "path": "sample/src/main/res/layout/activity_view_pager.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<androidx.viewpager2.widget.ViewPager2 xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:id=\"@+id/pager\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\" />"
  },
  {
    "path": "sample/src/main/res/layout/view_page.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<androidx.constraintlayout.widget.ConstraintLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    android:padding=\"16dp\"\n    android:background=\"@android:color/holo_green_light\">\n\n    <TextView\n        android:id=\"@+id/page_title\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        app:layout_constraintBottom_toBottomOf=\"parent\"\n        app:layout_constraintLeft_toLeftOf=\"parent\"\n        app:layout_constraintRight_toRightOf=\"parent\"\n        app:layout_constraintTop_toTopOf=\"parent\"\n        tools:text=\"Page Title\" />\n\n</androidx.constraintlayout.widget.ConstraintLayout>"
  },
  {
    "path": "sample/src/main/res/values/colors.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <color name=\"colorPrimary\">#009688</color>\n    <color name=\"colorPrimaryDark\">#00796B</color>\n    <color name=\"colorAccent\">#80CBC4</color>\n</resources>\n"
  },
  {
    "path": "sample/src/main/res/values/strings.xml",
    "content": "<resources>\n    <string name=\"app_name\">StickyScrollView</string>\n    <string name=\"product_title\">Product Title</string>\n    <string name=\"product_description_goes_here\">Product Description goes here</string>\n    <string name=\"check_other_product\">Check other product</string>\n    <string name=\"other_product_info_goes_here\">Other product info goes here</string>\n    <string name=\"product_similar\">Product Similar</string>\n    <string name=\"similar_items_go_here\">Similar items go here</string>\n    <string name=\"save\">SAVE</string>\n    <string name=\"buy\">BUY</string>\n    <string name=\"other_product_related_info_goes_here\">Other product related info goes here!</string>\n    <string name=\"you_can_add_more_data_here\">You can add more data here</string>\n    <string name=\"more_colors\">More colors</string>\n</resources>\n"
  },
  {
    "path": "sample/src/main/res/values/styles.xml",
    "content": "<resources>\n\n    <!-- Base application theme. -->\n    <style name=\"AppTheme\" parent=\"Theme.AppCompat.Light.DarkActionBar\">\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": "sample/src/test/java/com/amar/sample/ExampleUnitTest.java",
    "content": "package com.amar.sample;\n\nimport org.junit.Test;\n\nimport static org.junit.Assert.*;\n\n/**\n * Example local unit test, which will execute on the development machine (host).\n *\n * @see <a href=\"http://d.android.com/tools/testing\">Testing documentation</a>\n */\npublic class ExampleUnitTest {\n    @Test\n    public void addition_isCorrect() throws Exception {\n        assertEquals(4, 2 + 2);\n    }\n}"
  },
  {
    "path": "settings.gradle",
    "content": "include ':sample', ':library'\n"
  }
]