[
  {
    "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/workspace.xml\n\n# Keystore files\n*.jks\n"
  },
  {
    "path": ".idea/compiler.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"CompilerConfiguration\">\n    <resourceExtensions />\n    <wildcardResourcePatterns>\n      <entry name=\"!?*.java\" />\n      <entry name=\"!?*.form\" />\n      <entry name=\"!?*.class\" />\n      <entry name=\"!?*.groovy\" />\n      <entry name=\"!?*.scala\" />\n      <entry name=\"!?*.flex\" />\n      <entry name=\"!?*.kt\" />\n      <entry name=\"!?*.clj\" />\n      <entry name=\"!?*.aj\" />\n    </wildcardResourcePatterns>\n    <annotationProcessing>\n      <profile default=\"true\" name=\"Default\" enabled=\"false\">\n        <processorPath useClasspath=\"true\" />\n      </profile>\n    </annotationProcessing>\n  </component>\n</project>"
  },
  {
    "path": ".idea/copyright/profiles_settings.xml",
    "content": "<component name=\"CopyrightManager\">\n  <settings default=\"\" />\n</component>"
  },
  {
    "path": ".idea/encodings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"Encoding\">\n    <file url=\"PROJECT\" charset=\"UTF-8\" />\n  </component>\n</project>"
  },
  {
    "path": ".idea/gradle.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"GradleSettings\">\n    <option name=\"linkedExternalProjectsSettings\">\n      <GradleProjectSettings>\n        <option name=\"distributionType\" value=\"DEFAULT_WRAPPED\" />\n        <option name=\"externalProjectPath\" value=\"$PROJECT_DIR$\" />\n        <option name=\"modules\">\n          <set>\n            <option value=\"$PROJECT_DIR$\" />\n            <option value=\"$PROJECT_DIR$/app\" />\n          </set>\n        </option>\n        <option name=\"resolveModulePerSourceSet\" value=\"false\" />\n      </GradleProjectSettings>\n    </option>\n  </component>\n</project>"
  },
  {
    "path": ".idea/libraries/animated_vector_drawable_24_2_0.xml",
    "content": "<component name=\"libraryTable\">\n  <library name=\"animated-vector-drawable-24.2.0\">\n    <CLASSES>\n      <root url=\"file://$PROJECT_DIR$/app/build/intermediates/exploded-aar/com.android.support/animated-vector-drawable/24.2.0/res\" />\n      <root url=\"jar://$PROJECT_DIR$/app/build/intermediates/exploded-aar/com.android.support/animated-vector-drawable/24.2.0/jars/classes.jar!/\" />\n    </CLASSES>\n    <JAVADOC />\n    <SOURCES>\n      <root url=\"jar://$USER_HOME$/AppData/Local/Android/Sdk/extras/android/m2repository/com/android/support/animated-vector-drawable/24.2.0/animated-vector-drawable-24.2.0-sources.jar!/\" />\n    </SOURCES>\n  </library>\n</component>"
  },
  {
    "path": ".idea/libraries/appcompat_v7_24_2_0.xml",
    "content": "<component name=\"libraryTable\">\n  <library name=\"appcompat-v7-24.2.0\">\n    <ANNOTATIONS>\n      <root url=\"jar://$PROJECT_DIR$/app/build/intermediates/exploded-aar/com.android.support/appcompat-v7/24.2.0/annotations.zip!/\" />\n    </ANNOTATIONS>\n    <CLASSES>\n      <root url=\"file://$PROJECT_DIR$/app/build/intermediates/exploded-aar/com.android.support/appcompat-v7/24.2.0/res\" />\n      <root url=\"jar://$PROJECT_DIR$/app/build/intermediates/exploded-aar/com.android.support/appcompat-v7/24.2.0/jars/classes.jar!/\" />\n    </CLASSES>\n    <JAVADOC />\n    <SOURCES>\n      <root url=\"jar://$USER_HOME$/AppData/Local/Android/Sdk/extras/android/m2repository/com/android/support/appcompat-v7/24.2.0/appcompat-v7-24.2.0-sources.jar!/\" />\n    </SOURCES>\n  </library>\n</component>"
  },
  {
    "path": ".idea/libraries/espresso_core_2_2_2.xml",
    "content": "<component name=\"libraryTable\">\n  <library name=\"espresso-core-2.2.2\">\n    <CLASSES>\n      <root url=\"jar://$PROJECT_DIR$/app/build/intermediates/exploded-aar/com.android.support.test.espresso/espresso-core/2.2.2/jars/classes.jar!/\" />\n      <root url=\"file://$PROJECT_DIR$/app/build/intermediates/exploded-aar/com.android.support.test.espresso/espresso-core/2.2.2/res\" />\n    </CLASSES>\n    <JAVADOC />\n    <SOURCES>\n      <root url=\"jar://$USER_HOME$/AppData/Local/Android/Sdk/extras/android/m2repository/com/android/support/test/espresso/espresso-core/2.2.2/espresso-core-2.2.2-sources.jar!/\" />\n    </SOURCES>\n  </library>\n</component>"
  },
  {
    "path": ".idea/libraries/espresso_idling_resource_2_2_2.xml",
    "content": "<component name=\"libraryTable\">\n  <library name=\"espresso-idling-resource-2.2.2\">\n    <CLASSES>\n      <root url=\"jar://$PROJECT_DIR$/app/build/intermediates/exploded-aar/com.android.support.test.espresso/espresso-idling-resource/2.2.2/jars/classes.jar!/\" />\n      <root url=\"file://$PROJECT_DIR$/app/build/intermediates/exploded-aar/com.android.support.test.espresso/espresso-idling-resource/2.2.2/res\" />\n    </CLASSES>\n    <JAVADOC />\n    <SOURCES>\n      <root url=\"jar://$USER_HOME$/AppData/Local/Android/Sdk/extras/android/m2repository/com/android/support/test/espresso/espresso-idling-resource/2.2.2/espresso-idling-resource-2.2.2-sources.jar!/\" />\n    </SOURCES>\n  </library>\n</component>"
  },
  {
    "path": ".idea/libraries/exposed_instrumentation_api_publish_0_5.xml",
    "content": "<component name=\"libraryTable\">\n  <library name=\"exposed-instrumentation-api-publish-0.5\">\n    <CLASSES>\n      <root url=\"file://$PROJECT_DIR$/app/build/intermediates/exploded-aar/com.android.support.test/exposed-instrumentation-api-publish/0.5/res\" />\n      <root url=\"jar://$PROJECT_DIR$/app/build/intermediates/exploded-aar/com.android.support.test/exposed-instrumentation-api-publish/0.5/jars/classes.jar!/\" />\n    </CLASSES>\n    <JAVADOC />\n    <SOURCES>\n      <root url=\"jar://$USER_HOME$/AppData/Local/Android/Sdk/extras/android/m2repository/com/android/support/test/exposed-instrumentation-api-publish/0.5/exposed-instrumentation-api-publish-0.5-sources.jar!/\" />\n    </SOURCES>\n  </library>\n</component>"
  },
  {
    "path": ".idea/libraries/hamcrest_core_1_3.xml",
    "content": "<component name=\"libraryTable\">\n  <library name=\"hamcrest-core-1.3\">\n    <CLASSES>\n      <root url=\"jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.hamcrest/hamcrest-core/1.3/42a25dc3219429f0e5d060061f71acb49bf010a0/hamcrest-core-1.3.jar!/\" />\n    </CLASSES>\n    <JAVADOC />\n    <SOURCES>\n      <root url=\"jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.hamcrest/hamcrest-core/1.3/1dc37250fbc78e23a65a67fbbaf71d2e9cbc3c0b/hamcrest-core-1.3-sources.jar!/\" />\n    </SOURCES>\n  </library>\n</component>"
  },
  {
    "path": ".idea/libraries/hamcrest_integration_1_3.xml",
    "content": "<component name=\"libraryTable\">\n  <library name=\"hamcrest-integration-1.3\">\n    <CLASSES>\n      <root url=\"jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.hamcrest/hamcrest-integration/1.3/5de0c73fef18917cd85d0ab70bb23818685e4dfd/hamcrest-integration-1.3.jar!/\" />\n    </CLASSES>\n    <JAVADOC />\n    <SOURCES />\n  </library>\n</component>"
  },
  {
    "path": ".idea/libraries/hamcrest_library_1_3.xml",
    "content": "<component name=\"libraryTable\">\n  <library name=\"hamcrest-library-1.3\">\n    <CLASSES>\n      <root url=\"jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.hamcrest/hamcrest-library/1.3/4785a3c21320980282f9f33d0d1264a69040538f/hamcrest-library-1.3.jar!/\" />\n    </CLASSES>\n    <JAVADOC />\n    <SOURCES />\n  </library>\n</component>"
  },
  {
    "path": ".idea/libraries/javawriter_2_1_1.xml",
    "content": "<component name=\"libraryTable\">\n  <library name=\"javawriter-2.1.1\">\n    <CLASSES>\n      <root url=\"jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.squareup/javawriter/2.1.1/67ff45d9ae02e583d0f9b3432a5ebbe05c30c966/javawriter-2.1.1.jar!/\" />\n    </CLASSES>\n    <JAVADOC />\n    <SOURCES />\n  </library>\n</component>"
  },
  {
    "path": ".idea/libraries/javax_annotation_api_1_2.xml",
    "content": "<component name=\"libraryTable\">\n  <library name=\"javax.annotation-api-1.2\">\n    <CLASSES>\n      <root url=\"jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/javax.annotation/javax.annotation-api/1.2/479c1e06db31c432330183f5cae684163f186146/javax.annotation-api-1.2.jar!/\" />\n    </CLASSES>\n    <JAVADOC />\n    <SOURCES />\n  </library>\n</component>"
  },
  {
    "path": ".idea/libraries/javax_inject_1.xml",
    "content": "<component name=\"libraryTable\">\n  <library name=\"javax.inject-1\">\n    <CLASSES>\n      <root url=\"jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/javax.inject/javax.inject/1/6975da39a7040257bd51d21a231b76c915872d38/javax.inject-1.jar!/\" />\n    </CLASSES>\n    <JAVADOC />\n    <SOURCES>\n      <root url=\"jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/javax.inject/javax.inject/1/a00123f261762a7c5e0ec916a2c7c8298d29c400/javax.inject-1-sources.jar!/\" />\n    </SOURCES>\n  </library>\n</component>"
  },
  {
    "path": ".idea/libraries/jsr305_2_0_1.xml",
    "content": "<component name=\"libraryTable\">\n  <library name=\"jsr305-2.0.1\">\n    <CLASSES>\n      <root url=\"jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.google.code.findbugs/jsr305/2.0.1/516c03b21d50a644d538de0f0369c620989cd8f0/jsr305-2.0.1.jar!/\" />\n    </CLASSES>\n    <JAVADOC />\n    <SOURCES />\n  </library>\n</component>"
  },
  {
    "path": ".idea/libraries/junit_4_12.xml",
    "content": "<component name=\"libraryTable\">\n  <library name=\"junit-4.12\">\n    <CLASSES>\n      <root url=\"jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/junit/junit/4.12/2973d150c0dc1fefe998f834810d68f278ea58ec/junit-4.12.jar!/\" />\n    </CLASSES>\n    <JAVADOC />\n    <SOURCES>\n      <root url=\"jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/junit/junit/4.12/a6c32b40bf3d76eca54e3c601e5d1470c86fcdfa/junit-4.12-sources.jar!/\" />\n    </SOURCES>\n  </library>\n</component>"
  },
  {
    "path": ".idea/libraries/recyclerview_v7_24_2_0.xml",
    "content": "<component name=\"libraryTable\">\n  <library name=\"recyclerview-v7-24.2.0\">\n    <ANNOTATIONS>\n      <root url=\"jar://$PROJECT_DIR$/app/build/intermediates/exploded-aar/com.android.support/recyclerview-v7/24.2.0/annotations.zip!/\" />\n    </ANNOTATIONS>\n    <CLASSES>\n      <root url=\"file://$PROJECT_DIR$/app/build/intermediates/exploded-aar/com.android.support/recyclerview-v7/24.2.0/res\" />\n      <root url=\"jar://$PROJECT_DIR$/app/build/intermediates/exploded-aar/com.android.support/recyclerview-v7/24.2.0/jars/classes.jar!/\" />\n    </CLASSES>\n    <JAVADOC />\n    <SOURCES>\n      <root url=\"jar://$USER_HOME$/AppData/Local/Android/Sdk/extras/android/m2repository/com/android/support/recyclerview-v7/24.2.0/recyclerview-v7-24.2.0-sources.jar!/\" />\n    </SOURCES>\n  </library>\n</component>"
  },
  {
    "path": ".idea/libraries/rules_0_5.xml",
    "content": "<component name=\"libraryTable\">\n  <library name=\"rules-0.5\">\n    <ANNOTATIONS>\n      <root url=\"jar://$PROJECT_DIR$/app/build/intermediates/exploded-aar/com.android.support.test/rules/0.5/annotations.zip!/\" />\n    </ANNOTATIONS>\n    <CLASSES>\n      <root url=\"jar://$PROJECT_DIR$/app/build/intermediates/exploded-aar/com.android.support.test/rules/0.5/jars/classes.jar!/\" />\n      <root url=\"file://$PROJECT_DIR$/app/build/intermediates/exploded-aar/com.android.support.test/rules/0.5/res\" />\n    </CLASSES>\n    <JAVADOC />\n    <SOURCES>\n      <root url=\"jar://$USER_HOME$/AppData/Local/Android/Sdk/extras/android/m2repository/com/android/support/test/rules/0.5/rules-0.5-sources.jar!/\" />\n    </SOURCES>\n  </library>\n</component>"
  },
  {
    "path": ".idea/libraries/runner_0_5.xml",
    "content": "<component name=\"libraryTable\">\n  <library name=\"runner-0.5\">\n    <ANNOTATIONS>\n      <root url=\"jar://$PROJECT_DIR$/app/build/intermediates/exploded-aar/com.android.support.test/runner/0.5/annotations.zip!/\" />\n    </ANNOTATIONS>\n    <CLASSES>\n      <root url=\"jar://$PROJECT_DIR$/app/build/intermediates/exploded-aar/com.android.support.test/runner/0.5/jars/classes.jar!/\" />\n      <root url=\"file://$PROJECT_DIR$/app/build/intermediates/exploded-aar/com.android.support.test/runner/0.5/res\" />\n    </CLASSES>\n    <JAVADOC />\n    <SOURCES>\n      <root url=\"jar://$USER_HOME$/AppData/Local/Android/Sdk/extras/android/m2repository/com/android/support/test/runner/0.5/runner-0.5-sources.jar!/\" />\n    </SOURCES>\n  </library>\n</component>"
  },
  {
    "path": ".idea/libraries/support_annotations_24_2_0.xml",
    "content": "<component name=\"libraryTable\">\n  <library name=\"support-annotations-24.2.0\">\n    <CLASSES>\n      <root url=\"jar://$USER_HOME$/AppData/Local/Android/Sdk/extras/android/m2repository/com/android/support/support-annotations/24.2.0/support-annotations-24.2.0.jar!/\" />\n    </CLASSES>\n    <JAVADOC />\n    <SOURCES>\n      <root url=\"jar://$USER_HOME$/AppData/Local/Android/Sdk/extras/android/m2repository/com/android/support/support-annotations/24.2.0/support-annotations-24.2.0-sources.jar!/\" />\n    </SOURCES>\n  </library>\n</component>"
  },
  {
    "path": ".idea/libraries/support_compat_24_2_0.xml",
    "content": "<component name=\"libraryTable\">\n  <library name=\"support-compat-24.2.0\">\n    <ANNOTATIONS>\n      <root url=\"jar://$PROJECT_DIR$/app/build/intermediates/exploded-aar/com.android.support/support-compat/24.2.0/annotations.zip!/\" />\n    </ANNOTATIONS>\n    <CLASSES>\n      <root url=\"file://$PROJECT_DIR$/app/build/intermediates/exploded-aar/com.android.support/support-compat/24.2.0/res\" />\n      <root url=\"jar://$PROJECT_DIR$/app/build/intermediates/exploded-aar/com.android.support/support-compat/24.2.0/jars/libs/internal_impl-24.2.0.jar!/\" />\n      <root url=\"jar://$PROJECT_DIR$/app/build/intermediates/exploded-aar/com.android.support/support-compat/24.2.0/jars/classes.jar!/\" />\n    </CLASSES>\n    <JAVADOC />\n    <SOURCES>\n      <root url=\"jar://$USER_HOME$/AppData/Local/Android/Sdk/extras/android/m2repository/com/android/support/support-compat/24.2.0/support-compat-24.2.0-sources.jar!/\" />\n    </SOURCES>\n  </library>\n</component>"
  },
  {
    "path": ".idea/libraries/support_core_ui_24_2_0.xml",
    "content": "<component name=\"libraryTable\">\n  <library name=\"support-core-ui-24.2.0\">\n    <ANNOTATIONS>\n      <root url=\"jar://$PROJECT_DIR$/app/build/intermediates/exploded-aar/com.android.support/support-core-ui/24.2.0/annotations.zip!/\" />\n    </ANNOTATIONS>\n    <CLASSES>\n      <root url=\"jar://$PROJECT_DIR$/app/build/intermediates/exploded-aar/com.android.support/support-core-ui/24.2.0/jars/classes.jar!/\" />\n      <root url=\"file://$PROJECT_DIR$/app/build/intermediates/exploded-aar/com.android.support/support-core-ui/24.2.0/res\" />\n      <root url=\"jar://$PROJECT_DIR$/app/build/intermediates/exploded-aar/com.android.support/support-core-ui/24.2.0/jars/libs/internal_impl-24.2.0.jar!/\" />\n    </CLASSES>\n    <JAVADOC />\n    <SOURCES>\n      <root url=\"jar://$USER_HOME$/AppData/Local/Android/Sdk/extras/android/m2repository/com/android/support/support-core-ui/24.2.0/support-core-ui-24.2.0-sources.jar!/\" />\n    </SOURCES>\n  </library>\n</component>"
  },
  {
    "path": ".idea/libraries/support_core_utils_24_2_0.xml",
    "content": "<component name=\"libraryTable\">\n  <library name=\"support-core-utils-24.2.0\">\n    <CLASSES>\n      <root url=\"jar://$PROJECT_DIR$/app/build/intermediates/exploded-aar/com.android.support/support-core-utils/24.2.0/jars/libs/internal_impl-24.2.0.jar!/\" />\n      <root url=\"jar://$PROJECT_DIR$/app/build/intermediates/exploded-aar/com.android.support/support-core-utils/24.2.0/jars/classes.jar!/\" />\n      <root url=\"file://$PROJECT_DIR$/app/build/intermediates/exploded-aar/com.android.support/support-core-utils/24.2.0/res\" />\n    </CLASSES>\n    <JAVADOC />\n    <SOURCES>\n      <root url=\"jar://$USER_HOME$/AppData/Local/Android/Sdk/extras/android/m2repository/com/android/support/support-core-utils/24.2.0/support-core-utils-24.2.0-sources.jar!/\" />\n    </SOURCES>\n  </library>\n</component>"
  },
  {
    "path": ".idea/libraries/support_fragment_24_2_0.xml",
    "content": "<component name=\"libraryTable\">\n  <library name=\"support-fragment-24.2.0\">\n    <ANNOTATIONS>\n      <root url=\"jar://$PROJECT_DIR$/app/build/intermediates/exploded-aar/com.android.support/support-fragment/24.2.0/annotations.zip!/\" />\n    </ANNOTATIONS>\n    <CLASSES>\n      <root url=\"file://$PROJECT_DIR$/app/build/intermediates/exploded-aar/com.android.support/support-fragment/24.2.0/res\" />\n      <root url=\"jar://$PROJECT_DIR$/app/build/intermediates/exploded-aar/com.android.support/support-fragment/24.2.0/jars/classes.jar!/\" />\n      <root url=\"jar://$PROJECT_DIR$/app/build/intermediates/exploded-aar/com.android.support/support-fragment/24.2.0/jars/libs/internal_impl-24.2.0.jar!/\" />\n    </CLASSES>\n    <JAVADOC />\n    <SOURCES>\n      <root url=\"jar://$USER_HOME$/AppData/Local/Android/Sdk/extras/android/m2repository/com/android/support/support-fragment/24.2.0/support-fragment-24.2.0-sources.jar!/\" />\n    </SOURCES>\n  </library>\n</component>"
  },
  {
    "path": ".idea/libraries/support_media_compat_24_2_0.xml",
    "content": "<component name=\"libraryTable\">\n  <library name=\"support-media-compat-24.2.0\">\n    <ANNOTATIONS>\n      <root url=\"jar://$PROJECT_DIR$/app/build/intermediates/exploded-aar/com.android.support/support-media-compat/24.2.0/annotations.zip!/\" />\n    </ANNOTATIONS>\n    <CLASSES>\n      <root url=\"file://$PROJECT_DIR$/app/build/intermediates/exploded-aar/com.android.support/support-media-compat/24.2.0/res\" />\n      <root url=\"jar://$PROJECT_DIR$/app/build/intermediates/exploded-aar/com.android.support/support-media-compat/24.2.0/jars/classes.jar!/\" />\n      <root url=\"jar://$PROJECT_DIR$/app/build/intermediates/exploded-aar/com.android.support/support-media-compat/24.2.0/jars/libs/internal_impl-24.2.0.jar!/\" />\n    </CLASSES>\n    <JAVADOC />\n    <SOURCES>\n      <root url=\"jar://$USER_HOME$/AppData/Local/Android/Sdk/extras/android/m2repository/com/android/support/support-media-compat/24.2.0/support-media-compat-24.2.0-sources.jar!/\" />\n    </SOURCES>\n  </library>\n</component>"
  },
  {
    "path": ".idea/libraries/support_v4_24_2_0.xml",
    "content": "<component name=\"libraryTable\">\n  <library name=\"support-v4-24.2.0\">\n    <CLASSES>\n      <root url=\"jar://$PROJECT_DIR$/app/build/intermediates/exploded-aar/com.android.support/support-v4/24.2.0/jars/classes.jar!/\" />\n      <root url=\"file://$PROJECT_DIR$/app/build/intermediates/exploded-aar/com.android.support/support-v4/24.2.0/res\" />\n    </CLASSES>\n    <JAVADOC />\n    <SOURCES />\n  </library>\n</component>"
  },
  {
    "path": ".idea/libraries/support_vector_drawable_24_2_0.xml",
    "content": "<component name=\"libraryTable\">\n  <library name=\"support-vector-drawable-24.2.0\">\n    <CLASSES>\n      <root url=\"file://$PROJECT_DIR$/app/build/intermediates/exploded-aar/com.android.support/support-vector-drawable/24.2.0/res\" />\n      <root url=\"jar://$PROJECT_DIR$/app/build/intermediates/exploded-aar/com.android.support/support-vector-drawable/24.2.0/jars/classes.jar!/\" />\n    </CLASSES>\n    <JAVADOC />\n    <SOURCES>\n      <root url=\"jar://$USER_HOME$/AppData/Local/Android/Sdk/extras/android/m2repository/com/android/support/support-vector-drawable/24.2.0/support-vector-drawable-24.2.0-sources.jar!/\" />\n    </SOURCES>\n  </library>\n</component>"
  },
  {
    "path": ".idea/misc.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"EntryPointsManager\">\n    <entry_points version=\"2.0\" />\n  </component>\n  <component name=\"NullableNotNullManager\">\n    <option name=\"myDefaultNullable\" value=\"android.support.annotation.Nullable\" />\n    <option name=\"myDefaultNotNull\" value=\"android.support.annotation.NonNull\" />\n    <option name=\"myNullables\">\n      <value>\n        <list size=\"4\">\n          <item index=\"0\" class=\"java.lang.String\" itemvalue=\"org.jetbrains.annotations.Nullable\" />\n          <item index=\"1\" class=\"java.lang.String\" itemvalue=\"javax.annotation.Nullable\" />\n          <item index=\"2\" class=\"java.lang.String\" itemvalue=\"edu.umd.cs.findbugs.annotations.Nullable\" />\n          <item index=\"3\" class=\"java.lang.String\" itemvalue=\"android.support.annotation.Nullable\" />\n        </list>\n      </value>\n    </option>\n    <option name=\"myNotNulls\">\n      <value>\n        <list size=\"4\">\n          <item index=\"0\" class=\"java.lang.String\" itemvalue=\"org.jetbrains.annotations.NotNull\" />\n          <item index=\"1\" class=\"java.lang.String\" itemvalue=\"javax.annotation.Nonnull\" />\n          <item index=\"2\" class=\"java.lang.String\" itemvalue=\"edu.umd.cs.findbugs.annotations.NonNull\" />\n          <item index=\"3\" class=\"java.lang.String\" itemvalue=\"android.support.annotation.NonNull\" />\n        </list>\n      </value>\n    </option>\n  </component>\n  <component name=\"ProjectLevelVcsManager\" settingsEditedManually=\"false\">\n    <OptionsSetting value=\"true\" id=\"Add\" />\n    <OptionsSetting value=\"true\" id=\"Remove\" />\n    <OptionsSetting value=\"true\" id=\"Checkout\" />\n    <OptionsSetting value=\"true\" id=\"Update\" />\n    <OptionsSetting value=\"true\" id=\"Status\" />\n    <OptionsSetting value=\"true\" id=\"Edit\" />\n    <ConfirmationsSetting value=\"0\" id=\"Add\" />\n    <ConfirmationsSetting value=\"0\" id=\"Remove\" />\n  </component>\n  <component name=\"ProjectRootManager\" version=\"2\" languageLevel=\"JDK_1_7\" default=\"true\" assert-keyword=\"true\" jdk-15=\"true\" project-jdk-name=\"1.8\" project-jdk-type=\"JavaSDK\">\n    <output url=\"file://$PROJECT_DIR$/build/classes\" />\n  </component>\n  <component name=\"ProjectType\">\n    <option name=\"id\" value=\"Android\" />\n  </component>\n  <component name=\"masterDetails\">\n    <states>\n      <state key=\"ProjectJDKs.UI\">\n        <settings>\n          <last-edited>1.8</last-edited>\n          <splitter-proportions>\n            <option name=\"proportions\">\n              <list>\n                <option value=\"0.2\" />\n              </list>\n            </option>\n          </splitter-proportions>\n        </settings>\n      </state>\n    </states>\n  </component>\n</project>"
  },
  {
    "path": ".idea/modules.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"ProjectModuleManager\">\n    <modules>\n      <module fileurl=\"file://$PROJECT_DIR$/DiffUtils.iml\" filepath=\"$PROJECT_DIR$/DiffUtils.iml\" />\n      <module fileurl=\"file://$PROJECT_DIR$/app/app.iml\" filepath=\"$PROJECT_DIR$/app/app.iml\" />\n    </modules>\n  </component>\n</project>"
  },
  {
    "path": ".idea/runConfigurations.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"RunConfigurationProducerService\">\n    <option name=\"ignoredProducers\">\n      <set>\n        <option value=\"org.jetbrains.plugins.gradle.execution.test.runner.AllInPackageGradleConfigurationProducer\" />\n        <option value=\"org.jetbrains.plugins.gradle.execution.test.runner.TestClassGradleConfigurationProducer\" />\n        <option value=\"org.jetbrains.plugins.gradle.execution.test.runner.TestMethodGradleConfigurationProducer\" />\n      </set>\n    </option>\n  </component>\n</project>"
  },
  {
    "path": ".idea/vcs.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"VcsDirectoryMappings\">\n    <mapping directory=\"$PROJECT_DIR$\" vcs=\"Git\" />\n  </component>\n</project>"
  },
  {
    "path": "README.md",
    "content": "#SupportDemos\n本工程最初仅为DiffUtil的一个Demo，后发展为讲解Google Android Support包内那些常用or冷门有用的工具类的合集。\n\n\n\n## 索引：\n合集Blog地址：\n\nhttp://blog.csdn.net/column/details/13763.html  \n\n\n\n### DiffUtil:\n\nDiffUtils是Google官方在support-v7-24.2.0新出的一个工具类，本工程为一个讲解它使用的Demo\n\n博文传送门：\n\nhttp://blog.csdn.net/zxt0601/article/details/52562770\n\n代码地址：\n\nhttps://github.com/mcxtzhang/DiffUtils/tree/master/app/src/main/java/com/mcxtzhang/diffutils/diffutil\n\n入口:\n\nMainActivity.java\n\n---\n\n### SortedList:\n\n关键点：\n**搭配RecyclerView使用，去重，有序，自动定向刷新**\n\n博文传送门：\n\n待补\n\n代码地址：\n\nhttps://github.com/mcxtzhang/DiffUtils/tree/master/app/src/main/java/com/mcxtzhang/diffutils/sortedlist\n\n入口:\n\nSortedListActivity.java\n\n"
  },
  {
    "path": "app/.gitignore",
    "content": "/build\n"
  },
  {
    "path": "app/build.gradle",
    "content": "apply plugin: 'com.android.application'\n\nandroid {\n    compileSdkVersion 24\n    buildToolsVersion \"24.0.2\"\n    defaultConfig {\n        applicationId \"com.mcxtzhang.diffutils\"\n        minSdkVersion 14\n        targetSdkVersion 24\n        versionCode 1\n        versionName \"1.0\"\n        testInstrumentationRunner \"android.support.test.runner.AndroidJUnitRunner\"\n    }\n    buildTypes {\n        release {\n            minifyEnabled false\n            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'\n        }\n    }\n}\n\ndependencies {\n    compile fileTree(dir: 'libs', include: ['*.jar'])\n    androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {\n        exclude group: 'com.android.support', module: 'support-annotations'\n    })\n    compile 'com.android.support:appcompat-v7:24.2.0'\n    testCompile 'junit:junit:4.12'\n    compile 'com.android.support:recyclerview-v7:24.2.0'\n}\n"
  },
  {
    "path": "app/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 C:\\Users\\admin\\AppData\\Local\\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"
  },
  {
    "path": "app/src/androidTest/java/com/mcxtzhang/diffutils/ExampleInstrumentedTest.java",
    "content": "package com.mcxtzhang.diffutils;\n\nimport android.content.Context;\nimport android.support.test.InstrumentationRegistry;\nimport android.support.test.runner.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.mcxtzhang.diffutils\", appContext.getPackageName());\n    }\n}\n"
  },
  {
    "path": "app/src/main/AndroidManifest.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n          package=\"com.mcxtzhang.diffutils\">\n\n    <application\n        android:allowBackup=\"true\"\n        android:icon=\"@mipmap/ic_launcher\"\n        android:label=\"@string/app_name\"\n        android:supportsRtl=\"true\"\n        android:theme=\"@style/AppTheme\">\n        <activity android:name=\".diffutil.MainActivity\">\n        </activity>\n        <activity android:name=\".sortedlist.SortedListActivity\">\n        </activity>\n        <activity android:name=\".LauncherActivity\">\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/mcxtzhang/diffutils/LauncherActivity.java",
    "content": "package com.mcxtzhang.diffutils;\n\nimport android.content.Intent;\nimport android.support.v7.app.AppCompatActivity;\nimport android.os.Bundle;\nimport android.view.View;\n\nimport com.mcxtzhang.diffutils.diffutil.MainActivity;\nimport com.mcxtzhang.diffutils.sortedlist.SortedListActivity;\n\npublic class LauncherActivity extends AppCompatActivity {\n\n    @Override\n    protected void onCreate(Bundle savedInstanceState) {\n        super.onCreate(savedInstanceState);\n        setContentView(R.layout.activity_launcher);\n\n        findViewById(R.id.btnDiff).setOnClickListener(new View.OnClickListener() {\n            @Override\n            public void onClick(View v) {\n                startActivity(new Intent(LauncherActivity.this, MainActivity.class));\n            }\n        });\n\n        findViewById(R.id.btnSortedList).setOnClickListener(new View.OnClickListener() {\n            @Override\n            public void onClick(View v) {\n                startActivity(new Intent(LauncherActivity.this, SortedListActivity.class));\n            }\n        });\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/mcxtzhang/diffutils/diffutil/DiffAdapter.java",
    "content": "package com.mcxtzhang.diffutils.diffutil;\n\nimport android.content.Context;\nimport android.os.Bundle;\nimport android.support.v7.widget.RecyclerView;\nimport android.view.LayoutInflater;\nimport android.view.View;\nimport android.view.ViewGroup;\nimport android.widget.ImageView;\nimport android.widget.TextView;\n\nimport com.mcxtzhang.diffutils.R;\n\nimport java.util.List;\n\n/**\n * 介绍：普普通的adapter，\n * 但是 唯一亮点~\n * public void onBindViewHolder(DiffVH holder, int position, List<Object> payloads)\n * 重写这个方法\n * 作者：zhangxutong\n * 邮箱：zhangxutong@imcoming.com\n * 时间： 2016/9/12.\n */\n\npublic class DiffAdapter extends RecyclerView.Adapter<DiffAdapter.DiffVH> {\n    private final static String TAG = \"zxt\";\n    private List<TestBean> mDatas;\n    private Context mContext;\n    private LayoutInflater mInflater;\n\n    public DiffAdapter(Context mContext, List<TestBean> mDatas) {\n        this.mContext = mContext;\n        this.mDatas = mDatas;\n        mInflater = LayoutInflater.from(mContext);\n    }\n\n    public void setDatas(List<TestBean> mDatas) {\n        this.mDatas = mDatas;\n    }\n\n    @Override\n    public DiffVH onCreateViewHolder(ViewGroup parent, int viewType) {\n        return new DiffVH(mInflater.inflate(R.layout.item_diff, parent, false));\n    }\n\n    @Override\n    public void onBindViewHolder(final DiffVH holder, final int position) {\n        TestBean bean = mDatas.get(position);\n        holder.tv1.setText(bean.getName());\n        holder.tv2.setText(bean.getDesc());\n        holder.iv.setImageResource(bean.getPic());\n    }\n\n    @Override\n    public void onBindViewHolder(DiffVH holder, int position, List<Object> payloads) {\n        if (payloads.isEmpty()) {\n            onBindViewHolder(holder, position);\n        } else {\n            //文艺青年中的文青\n            Bundle payload = (Bundle) payloads.get(0);//取出我们在getChangePayload（）方法返回的bundle\n            TestBean bean = mDatas.get(position);//取出新数据源，（可以不用）\n            for (String key : payload.keySet()) {\n                switch (key) {\n                    case \"KEY_DESC\":\n                        //这里可以用payload里的数据，不过data也是新的 也可以用\n                        holder.tv2.setText(bean.getDesc());\n                        break;\n                    case \"KEY_PIC\":\n                        holder.iv.setImageResource(payload.getInt(key));\n                        break;\n                    default:\n                        break;\n                }\n            }\n        }\n    }\n\n    @Override\n    public int getItemCount() {\n        return mDatas != null ? mDatas.size() : 0;\n    }\n\n    class DiffVH extends RecyclerView.ViewHolder {\n        TextView tv1, tv2;\n        ImageView iv;\n\n        public DiffVH(View itemView) {\n            super(itemView);\n            tv1 = (TextView) itemView.findViewById(R.id.tv1);\n            tv2 = (TextView) itemView.findViewById(R.id.tv2);\n            iv = (ImageView) itemView.findViewById(R.id.iv);\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/mcxtzhang/diffutils/diffutil/DiffCallBack.java",
    "content": "package com.mcxtzhang.diffutils.diffutil;\n\nimport android.os.Bundle;\nimport android.support.annotation.Nullable;\nimport android.support.v7.util.DiffUtil;\nimport android.support.v7.widget.RecyclerView;\n\nimport java.util.List;\n\n/**\n * 介绍：核心类 用来判断 新旧Item是否相等\n * 作者：zhangxutong\n * 邮箱：zhangxutong@imcoming.com\n * 时间： 2016/9/12.\n */\n\npublic class DiffCallBack extends DiffUtil.Callback {\n    private List<TestBean> mOldDatas, mNewDatas;//看名字\n\n    public DiffCallBack(List<TestBean> mOldDatas, List<TestBean> mNewDatas) {\n        this.mOldDatas = mOldDatas;\n        this.mNewDatas = mNewDatas;\n    }\n\n    //老数据集size\n    @Override\n    public int getOldListSize() {\n        return mOldDatas != null ? mOldDatas.size() : 0;\n    }\n\n    //新数据集size\n    @Override\n    public int getNewListSize() {\n        return mNewDatas != null ? mNewDatas.size() : 0;\n    }\n\n    /**\n     * Called by the DiffUtil to decide whether two object represent the same Item.\n     * 被DiffUtil调用，用来判断 两个对象是否是相同的Item。\n     * For example, if your items have unique ids, this method should check their id equality.\n     * 例如，如果你的Item有唯一的id字段，这个方法就 判断id是否相等。\n     * 本例判断name字段是否一致\n     *\n     * @param oldItemPosition The position of the item in the old list\n     * @param newItemPosition The position of the item in the new list\n     * @return True if the two items represent the same object or false if they are different.\n     */\n    @Override\n    public boolean areItemsTheSame(int oldItemPosition, int newItemPosition) {\n        return mOldDatas.get(oldItemPosition).getName().equals(mNewDatas.get(newItemPosition).getName());\n    }\n\n    /**\n     * Called by the DiffUtil when it wants to check whether two items have the same data.\n     * 被DiffUtil调用，用来检查 两个item是否含有相同的数据\n     * DiffUtil uses this information to detect if the contents of an item has changed.\n     * DiffUtil用返回的信息（true false）来检测当前item的内容是否发生了变化\n     * DiffUtil uses this method to check equality instead of {@link Object#equals(Object)}\n     * DiffUtil 用这个方法替代equals方法去检查是否相等。\n     * so that you can change its behavior depending on your UI.\n     * 所以你可以根据你的UI去改变它的返回值\n     * For example, if you are using DiffUtil with a\n     * {@link android.support.v7.widget.RecyclerView.Adapter RecyclerView.Adapter}, you should\n     * return whether the items' visual representations are the same.\n     * 例如，如果你用RecyclerView.Adapter 配合DiffUtil使用，你需要返回Item的视觉表现是否相同。\n     * This method is called only if {@link #areItemsTheSame(int, int)} returns\n     * {@code true} for these items.\n     * 这个方法仅仅在areItemsTheSame()返回true时，才调用。\n     *\n     * @param oldItemPosition The position of the item in the old list\n     * @param newItemPosition The position of the item in the new list which replaces the\n     *                        oldItem\n     * @return True if the contents of the items are the same or false if they are different.\n     */\n    @Override\n    public boolean areContentsTheSame(int oldItemPosition, int newItemPosition) {\n        TestBean beanOld = mOldDatas.get(oldItemPosition);\n        TestBean beanNew = mNewDatas.get(newItemPosition);\n        if (!beanOld.getDesc().equals(beanNew.getDesc())) {\n            return false;//如果有内容不同，就返回false\n        }\n        if (beanOld.getPic() != beanNew.getPic()) {\n            return false;//如果有内容不同，就返回false\n        }\n        return true; //默认两个data内容是相同的\n    }\n\n    /**\n     * When {@link #areItemsTheSame(int, int)} returns {@code true} for two items and\n     * {@link #areContentsTheSame(int, int)} returns false for them, DiffUtil\n     * calls this method to get a payload about the change.\n     * <p>\n     * 当{@link #areItemsTheSame(int, int)} 返回true，且{@link #areContentsTheSame(int, int)} 返回false时，DiffUtils会回调此方法，\n     * 去得到这个Item（有哪些）改变的payload。\n     * <p>\n     * For example, if you are using DiffUtil with {@link RecyclerView}, you can return the\n     * particular field that changed in the item and your\n     * {@link android.support.v7.widget.RecyclerView.ItemAnimator ItemAnimator} can use that\n     * information to run the correct animation.\n     * <p>\n     * 例如，如果你用RecyclerView配合DiffUtils，你可以返回  这个Item改变的那些字段，\n     * {@link android.support.v7.widget.RecyclerView.ItemAnimator ItemAnimator} 可以用那些信息去执行正确的动画\n     * <p>\n     * Default implementation returns {@code null}.\\\n     * 默认的实现是返回null\n     *\n     * @param oldItemPosition The position of the item in the old list\n     * @param newItemPosition The position of the item in the new list\n     * @return A payload object that represents the change between the two items.\n     * 返回 一个 代表着新老item的改变内容的 payload对象，\n     */\n    @Nullable\n    @Override\n    public Object getChangePayload(int oldItemPosition, int newItemPosition) {\n        //实现这个方法 就能成为文艺青年中的文艺青年\n        // 定向刷新中的部分更新\n        // 效率最高\n        //只是没有了ItemChange的白光一闪动画，（反正我也觉得不太重要）\n        TestBean oldBean = mOldDatas.get(oldItemPosition);\n        TestBean newBean = mNewDatas.get(newItemPosition);\n\n        //这里就不用比较核心字段了,一定相等\n        Bundle payload = new Bundle();\n        if (!oldBean.getDesc().equals(newBean.getDesc())) {\n            payload.putString(\"KEY_DESC\", newBean.getDesc());\n        }\n        if (oldBean.getPic() != newBean.getPic()) {\n            payload.putInt(\"KEY_PIC\", newBean.getPic());\n        }\n\n        if (payload.size() == 0)//如果没有变化 就传空\n            return null;\n        return payload;//\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/mcxtzhang/diffutils/diffutil/MainActivity.java",
    "content": "package com.mcxtzhang.diffutils.diffutil;\n\nimport android.os.Bundle;\nimport android.os.Handler;\nimport android.os.Message;\nimport android.support.v7.app.AppCompatActivity;\nimport android.support.v7.util.DiffUtil;\nimport android.support.v7.widget.LinearLayoutManager;\nimport android.support.v7.widget.RecyclerView;\nimport android.view.View;\n\nimport com.mcxtzhang.diffutils.R;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\npublic class MainActivity extends AppCompatActivity {\n    private List<TestBean> mDatas;\n    private RecyclerView mRv;\n    private DiffAdapter mAdapter;\n\n    @Override\n    protected void onCreate(Bundle savedInstanceState) {\n        super.onCreate(savedInstanceState);\n        setContentView(R.layout.activity_main);\n        initData();\n        mRv = (RecyclerView) findViewById(R.id.rv);\n        mRv.setLayoutManager(new LinearLayoutManager(this));\n        mAdapter = new DiffAdapter(this, mDatas);\n        mRv.setAdapter(mAdapter);\n    }\n\n    private void initData() {\n        mDatas = new ArrayList<>();\n        mDatas.add(new TestBean(\"张旭童1\", \"Android\", R.drawable.pic1));\n        mDatas.add(new TestBean(\"张旭童2\", \"Java\", R.drawable.pic2));\n        mDatas.add(new TestBean(\"张旭童3\", \"背锅\", R.drawable.pic3));\n        mDatas.add(new TestBean(\"张旭童4\", \"手撕产品\", R.drawable.pic4));\n        mDatas.add(new TestBean(\"张旭童5\", \"手撕测试\", R.drawable.pic5));\n    }\n\n    /**\n     * 模拟刷新操作\n     *\n     * @param view\n     */\n    public void onRefresh(View view) {\n        try {\n            mNewDatas = new ArrayList<>();\n            for (TestBean bean : mDatas) {\n                mNewDatas.add(bean.clone());//clone一遍旧数据 ，模拟刷新操作\n            }\n            mNewDatas.add(new TestBean(\"赵子龙\", \"帅\", R.drawable.pic6));//模拟新增数据\n            mNewDatas.get(0).setDesc(\"Android+\");\n            mNewDatas.get(0).setPic(R.drawable.pic7);//模拟修改数据\n            TestBean testBean = mNewDatas.get(1);//模拟数据位移\n            mNewDatas.remove(testBean);\n            mNewDatas.add(testBean);\n\n            //新宠\n            //利用DiffUtil.calculateDiff()方法，传入一个规则DiffUtil.Callback对象，和是否检测移动item的 boolean变量，得到DiffUtil.DiffResult 的对象\n            new Thread(new Runnable() {\n                @Override\n                public void run() {\n                    //放在子线程中计算DiffResult\n                    DiffUtil.DiffResult diffResult = DiffUtil.calculateDiff(new DiffCallBack(mDatas, mNewDatas), true);\n                    Message message = mHandler.obtainMessage(H_CODE_UPDATE);\n                    message.obj = diffResult;//obj存放DiffResult\n                    message.sendToTarget();\n                }\n            }).start();\n            //mAdapter.notifyDataSetChanged();//以前普通青年的我们只能这样，现在我们是文艺青年了，有新宠了\n\n        } catch (CloneNotSupportedException e) {\n            e.printStackTrace();\n        }\n    }\n\n    private static final int H_CODE_UPDATE = 1;\n    private List<TestBean> mNewDatas;//增加一个变量暂存newList\n    private Handler mHandler = new Handler() {\n        @Override\n        public void handleMessage(Message msg) {\n            switch (msg.what) {\n                case H_CODE_UPDATE:\n                    //取出Result\n                    DiffUtil.DiffResult diffResult = (DiffUtil.DiffResult) msg.obj;\n                    //利用DiffUtil.DiffResult对象的dispatchUpdatesTo（）方法，传入RecyclerView的Adapter，轻松成为文艺青年\n                    diffResult.dispatchUpdatesTo(mAdapter);\n\n                    //这种方法可以fix add 0 不滑动\n                    /*diffResult.dispatchUpdatesTo(new ListUpdateCallback() {\n                        @Override\n                        public void onInserted(int position, int count) {\n                            mAdapter.notifyItemRangeInserted(position, count);\n                            if (position==0){\n                                mRv.scrollToPosition(0);\n                            }\n                        }\n\n                        @Override\n                        public void onRemoved(int position, int count) {\n                            mAdapter.notifyItemRangeRemoved(position, count);\n                        }\n\n                        @Override\n                        public void onMoved(int fromPosition, int toPosition) {\n                            mAdapter.notifyItemMoved(fromPosition, toPosition);\n                        }\n\n                        @Override\n                        public void onChanged(int position, int count, Object payload) {\n                            mAdapter.notifyItemRangeChanged(position, count, payload);\n                        }\n                    });*/\n\n                    //别忘了将新数据给Adapter\n                    mDatas = mNewDatas;\n                    mAdapter.setDatas(mDatas);\n                    break;\n            }\n        }\n    };\n\n}\n"
  },
  {
    "path": "app/src/main/java/com/mcxtzhang/diffutils/diffutil/TestBean.java",
    "content": "package com.mcxtzhang.diffutils.diffutil;\n\n/**\n * 介绍：一个普通的JavaBean，但是实现了clone方法，仅仅用于写Demo时，模拟刷新从网络获取数据用，\n * 因为使用DiffUtils比较新老数据集差异时，会遍历新老数据集的每个data，要确保他们的内存地址（指针）不一样，否则比较的是新老data是同一个，就一定相同，\n * 实际项目不需要，因为刷新时，数据一般从网络拉取，并且用Gson等解析出来，内存地址一定是不一样的。\n * 作者：zhangxutong\n * 邮箱：zhangxutong@imcoming.com\n * 时间： 2016/9/12.\n */\npublic class TestBean implements Cloneable {\n    private String name;\n    private String desc;\n    private int pic;\n\n    public TestBean(String name, String desc, int pic) {\n        this.name = name;\n        this.desc = desc;\n        this.pic = pic;\n    }\n\n    public int getPic() {\n        return pic;\n    }\n\n    public void setPic(int pic) {\n        this.pic = pic;\n    }\n\n    public String getName() {\n        return name;\n    }\n\n    public void setName(String name) {\n        this.name = name;\n    }\n\n    public String getDesc() {\n        return desc;\n    }\n\n    public void setDesc(String desc) {\n        this.desc = desc;\n    }\n\n    //仅写DEMO 用 实现克隆方法\n    @Override\n    public TestBean clone() throws CloneNotSupportedException {\n        TestBean bean = null;\n        try {\n            bean = (TestBean) super.clone();\n        } catch (CloneNotSupportedException e) {\n            e.printStackTrace();\n        }\n        return bean;\n    }\n}"
  },
  {
    "path": "app/src/main/java/com/mcxtzhang/diffutils/sortedlist/SortedAdapter.java",
    "content": "package com.mcxtzhang.diffutils.sortedlist;\n\nimport android.content.Context;\nimport android.support.v7.util.SortedList;\nimport android.support.v7.widget.RecyclerView;\nimport android.view.LayoutInflater;\nimport android.view.View;\nimport android.view.ViewGroup;\nimport android.widget.ImageView;\nimport android.widget.TextView;\n\nimport com.mcxtzhang.diffutils.R;\n\n/**\n * 介绍：Adapter要修改，\n * 数据源都要从以前的ArrayList->替换为SortedList.\n * 其他的话，倒没有太大变化，\n * 因为SortedList虽然没有继承自List，但是暴漏出API还和List一样的。\n * 作者：zhangxutong\n * 邮箱：mcxtzhang@163.com\n * 主页：http://blog.csdn.net/zxt0601\n * 时间： 2016/11/29.\n */\n\npublic class SortedAdapter extends RecyclerView.Adapter<SortedAdapter.VH> {\n    private final static String TAG = \"zxt\";\n    /**\n     * 数据源替换为SortedList，\n     * 以前可能会用ArrayList。\n     */\n    private SortedList<TestSortBean> mDatas;\n    private Context mContext;\n    private LayoutInflater mInflater;\n\n    public SortedAdapter(Context mContext, SortedList<TestSortBean> mDatas) {\n        this.mContext = mContext;\n        this.mDatas = mDatas;\n        mInflater = LayoutInflater.from(mContext);\n    }\n\n    public void setDatas(SortedList<TestSortBean> mDatas) {\n        this.mDatas = mDatas;\n    }\n\n    @Override\n    public SortedAdapter.VH onCreateViewHolder(ViewGroup parent, int viewType) {\n        return new SortedAdapter.VH(mInflater.inflate(R.layout.item_diff, parent, false));\n    }\n\n    @Override\n    public void onBindViewHolder(final SortedAdapter.VH holder, final int position) {\n        TestSortBean bean = mDatas.get(position);\n        holder.tv1.setText(bean.getName());\n        holder.tv2.setText(bean.getId() + \"\");\n        holder.iv.setImageResource(bean.getIcon());\n    }\n\n    @Override\n    public int getItemCount() {\n        return mDatas != null ? mDatas.size() : 0;\n    }\n\n    class VH extends RecyclerView.ViewHolder {\n        TextView tv1, tv2;\n        ImageView iv;\n\n        public VH(View itemView) {\n            super(itemView);\n            tv1 = (TextView) itemView.findViewById(R.id.tv1);\n            tv2 = (TextView) itemView.findViewById(R.id.tv2);\n            iv = (ImageView) itemView.findViewById(R.id.iv);\n        }\n    }\n}\n\n"
  },
  {
    "path": "app/src/main/java/com/mcxtzhang/diffutils/sortedlist/SortedListActivity.java",
    "content": "package com.mcxtzhang.diffutils.sortedlist;\n\nimport android.os.Bundle;\nimport android.support.v7.app.AppCompatActivity;\nimport android.support.v7.util.SortedList;\nimport android.support.v7.widget.LinearLayoutManager;\nimport android.support.v7.widget.RecyclerView;\nimport android.view.View;\n\nimport com.mcxtzhang.diffutils.R;\n\n/**\n * SortedListDemo\n */\npublic class SortedListActivity extends AppCompatActivity {\n    /**\n     * 数据源替换为SortedList，\n     * 以前可能会用ArrayList。\n     */\n    private SortedList<TestSortBean> mDatas;\n    private RecyclerView mRv;\n    private SortedAdapter mAdapter;\n\n    @Override\n    protected void onCreate(Bundle savedInstanceState) {\n        super.onCreate(savedInstanceState);\n        setContentView(R.layout.activity_sorted_list);\n\n        mRv = (RecyclerView) findViewById(R.id.rv);\n        mRv.setLayoutManager(new LinearLayoutManager(this));\n        //★以前构建Adapter时，一般会将data也一起传入，现在有变化\n        mAdapter = new SortedAdapter(this, null);\n        mRv.setAdapter(mAdapter);\n\n\n        initData();\n\n\n        //mDatas.beginBatchedUpdates();\n        mAdapter.setDatas(mDatas);\n        //mDatas.endBatchedUpdates();\n    }\n\n    private void initData() {\n        //★SortedList初始化的时候，要将Adapter传进来。所以先构建Adapter，再构建SortedList\n        mDatas = new SortedList<>(TestSortBean.class, new SortedListCallback(mAdapter));\n        mDatas.add(new TestSortBean(10, \"Android\", R.drawable.pic1));\n        //★注意这里有一个重复的字段 会自动去重的。\n        mDatas.add(new TestSortBean(10, \"Android重复\", R.drawable.pic1));\n        mDatas.add(new TestSortBean(2, \"Java\", R.drawable.pic2));\n        mDatas.add(new TestSortBean(30, \"背锅\", R.drawable.pic3));\n        mDatas.add(new TestSortBean(4, \"手撕产品\", R.drawable.pic4));\n        mDatas.add(new TestSortBean(50, \"手撕测试\", R.drawable.pic5));\n    }\n\n    /**\n     * 模拟刷新操作\n     *\n     * @param view\n     */\n    public void onRefresh(View view) {\n\n        //add 内部会自动调用  mCallback.onInserted(index, 1); ->notifyItemRangeInserted(index,1);\n        //也就是说我们add一次 它就刷新一次，没有batch操作，有点low\n\n        mDatas.add(new TestSortBean(26, \"温油对待产品\", R.drawable.pic6));//模拟新增\n        mDatas.add(new TestSortBean(12, \"小马可以来点赞了\", R.drawable.pic6));//模拟新增\n        mDatas.add(new TestSortBean(2, \"Python\", R.drawable.pic6));//add进去 重复的会自动修改\n\n        // 如果想batch 就必须用addAll()操作，感觉这算一个限制。\n        //addAll 也分两种\n        //第一种 以可变参数addAll\n        //mDatas.addAll(new TestSortBean(26, \"帅\", R.drawable.pic6),new TestSortBean(27, \"帅\", R.drawable.pic6));\n        //第二种 集合形式\n/*\n        List<TestSortBean> temp = new ArrayList<>();\n        temp.add(new TestSortBean(26, \"帅\", R.drawable.pic6));\n        temp.add(new TestSortBean(28, \"帅\", R.drawable.pic6));\n        mDatas.addAll(temp);\n*/\n\n\n        //刷新时，服务器给我们的一般都是一个List\n        //直接addAll 要先clear， 会闪屏\n/*        List<TestSortBean> newDatas = new ArrayList<>();\n        for (int i = 0; i < mDatas.size(); i++) {\n            try {\n                newDatas.add(mDatas.get(i).clone());//clone一遍旧数据 ，模拟刷新操作\n            } catch (CloneNotSupportedException e) {\n                e.printStackTrace();\n            }\n        }\n        newDatas.add(new TestSortBean(29, \"帅\", R.drawable.pic6));//模拟新增数据\n        newDatas.get(0).setName(\"Android+\");\n        newDatas.get(0).setIcon(R.drawable.pic7);//模拟修改数据\n        TestSortBean testBean = newDatas.get(1);//模拟数据位移\n        newDatas.remove(testBean);\n        newDatas.add(testBean);\n        mDatas.clear();\n        mDatas.addAll(newDatas);*/\n\n\n        new Thread(new Runnable() {\n            @Override\n            public void run() {\n                //每次add都会计算一次 想放在子线程中\n                //然而这是肯定不行的，上文提过，每次add 会自动 mAdapter.notifyItemRangeInserted(position, count);\n                //这一点就不如DiffUtil啦。\n                //android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.\n                /*mDatas.add(new TestSortBean(26, \"帅\", R.drawable.pic6));//模拟新增数据\n                mDatas.add(new TestSortBean(27, \"帅\", R.drawable.pic6));//模拟新增数据*/\n            }\n        }).start();\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/mcxtzhang/diffutils/sortedlist/SortedListCallback.java",
    "content": "package com.mcxtzhang.diffutils.sortedlist;\n\nimport android.support.v7.widget.RecyclerView;\nimport android.support.v7.widget.util.SortedListAdapterCallback;\n\n/**\n * 介绍：比较规则Callback。\n * 和DiffUtil.Callback。写法套路一毛一样。\n * 而且比DiffUtil.Callback简单。\n * 因为不用传数据集进来，每次直接给你Item比较。\n *\n * 作者：zhangxutong\n * 邮箱：mcxtzhang@163.com\n * 主页：http://blog.csdn.net/zxt0601\n * 时间： 2016/11/29.\n */\n\npublic class SortedListCallback extends SortedListAdapterCallback<TestSortBean> {\n    /**\n     * Creates a {@link SortedList.Callback} that will forward data change events to the provided\n     * Adapter.\n     *\n     * @param adapter The Adapter instance which should receive events from the SortedList.\n     */\n    public SortedListCallback(RecyclerView.Adapter adapter) {\n        super(adapter);\n    }\n\n    /**\n     * 把它当成equals 方法就好\n     */\n    @Override\n    public int compare(TestSortBean o1, TestSortBean o2) {\n        return o1.getId() - o2.getId();\n    }\n\n    /**\n     * 和DiffUtil方法一致，不再赘述\n     */\n    @Override\n    public boolean areItemsTheSame(TestSortBean item1, TestSortBean item2) {\n        return item1.getId() == item2.getId();\n    }\n    /**\n     * 和DiffUtil方法一致，不再赘述\n     */\n    @Override\n    public boolean areContentsTheSame(TestSortBean oldItem, TestSortBean newItem) {\n        //默认相同 有一个不同就是不同\n        if (oldItem.getId() != newItem.getId()) {\n            return false;\n        }\n        if (oldItem.getName().equals(newItem.getName())) {\n            return false;\n        }\n        if (oldItem.getIcon() != newItem.getIcon()) {\n            return false;\n        }\n        return true;\n    }\n\n\n}\n"
  },
  {
    "path": "app/src/main/java/com/mcxtzhang/diffutils/sortedlist/TestSortBean.java",
    "content": "package com.mcxtzhang.diffutils.sortedlist;\n\n/**\n * 介绍：\n * 作者：zhangxutong\n * 邮箱：mcxtzhang@163.com\n * 主页：http://blog.csdn.net/zxt0601\n * 时间： 2016/11/29.\n */\n\npublic class TestSortBean implements Cloneable{\n    private int id;\n    private String name;\n    private int icon;\n\n    //仅写DEMO 用 实现克隆方法\n    @Override\n    public TestSortBean clone() throws CloneNotSupportedException {\n        TestSortBean bean = null;\n        try {\n            bean = (TestSortBean) super.clone();\n        } catch (CloneNotSupportedException e) {\n            e.printStackTrace();\n        }\n        return bean;\n    }\n\n    @Override\n    public String toString() {\n        return \"TestSortBean{\" +\n                \"icon='\" + icon + '\\'' +\n                \", name='\" + name + '\\'' +\n                \", id=\" + id +\n                '}';\n    }\n\n    public TestSortBean(int id, String name, int icon) {\n        this.id = id;\n        this.name = name;\n        this.icon = icon;\n    }\n\n    public int getId() {\n        return id;\n    }\n\n    public TestSortBean setId(int id) {\n        this.id = id;\n        return this;\n    }\n\n    public String getName() {\n        return name;\n    }\n\n    public TestSortBean setName(String name) {\n        this.name = name;\n        return this;\n    }\n\n    public int getIcon() {\n        return icon;\n    }\n\n    public TestSortBean setIcon(int icon) {\n        this.icon = icon;\n        return this;\n    }\n}\n"
  },
  {
    "path": "app/src/main/res/layout/activity_launcher.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout\n    xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:id=\"@+id/activity_launcher\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    android:orientation=\"vertical\"\n    android:paddingBottom=\"@dimen/activity_vertical_margin\"\n    android:paddingLeft=\"@dimen/activity_horizontal_margin\"\n    android:paddingRight=\"@dimen/activity_horizontal_margin\"\n    android:paddingTop=\"@dimen/activity_vertical_margin\"\n    tools:context=\"com.mcxtzhang.diffutils.LauncherActivity\">\n\n    <Button\n        android:id=\"@+id/btnDiff\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:text=\"DiffUtil例子\"/>\n\n\n    <Button\n        android:id=\"@+id/btnSortedList\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:text=\"SortedList例子\"/>\n\n\n</LinearLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/activity_main.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:id=\"@+id/activity_main\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    android:paddingBottom=\"@dimen/activity_vertical_margin\"\n    android:paddingLeft=\"@dimen/activity_horizontal_margin\"\n    android:paddingRight=\"@dimen/activity_horizontal_margin\"\n    android:paddingTop=\"@dimen/activity_vertical_margin\">\n\n    <android.support.v7.widget.RecyclerView\n        android:id=\"@+id/rv\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\" />\n\n    <Button\n        android:id=\"@+id/btnRefresh\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_alignParentRight=\"true\"\n        android:onClick=\"onRefresh\"\n        android:text=\"模拟刷新\" />\n</RelativeLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/activity_sorted_list.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n                xmlns:tools=\"http://schemas.android.com/tools\"\n                android:id=\"@+id/activity_main\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"match_parent\"\n                android:paddingBottom=\"@dimen/activity_vertical_margin\"\n                android:paddingLeft=\"@dimen/activity_horizontal_margin\"\n                android:paddingRight=\"@dimen/activity_horizontal_margin\"\n                android:paddingTop=\"@dimen/activity_vertical_margin\">\n\n    <android.support.v7.widget.RecyclerView\n        android:id=\"@+id/rv\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\" />\n\n    <Button\n        android:id=\"@+id/btnRefresh\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_alignParentRight=\"true\"\n        android:onClick=\"onRefresh\"\n        android:text=\"模拟刷新\" />\n</RelativeLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/item_diff.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"120dp\"\n    android:layout_marginBottom=\"1dp\"\n    android:background=\"@color/colorAccent\"\n    android:orientation=\"vertical\">\n\n    <TextView\n        android:id=\"@+id/tv1\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        tools:text=\"第一个\" />\n\n    <TextView\n        android:id=\"@+id/tv2\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        tools:text=\"我的存在只为了证明定向刷新中的定向刷新\" />\n\n    <ImageView\n        android:id=\"@+id/iv\"\n        android:layout_width=\"70dp\"\n        android:layout_height=\"70dp\" />\n\n</LinearLayout>"
  },
  {
    "path": "app/src/main/res/values/colors.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <color name=\"colorPrimary\">#3F51B5</color>\n    <color name=\"colorPrimaryDark\">#303F9F</color>\n    <color name=\"colorAccent\">#FF4081</color>\n</resources>\n"
  },
  {
    "path": "app/src/main/res/values/dimens.xml",
    "content": "<resources>\n    <!-- Default screen margins, per the Android Design guidelines. -->\n    <dimen name=\"activity_horizontal_margin\">16dp</dimen>\n    <dimen name=\"activity_vertical_margin\">16dp</dimen>\n</resources>\n"
  },
  {
    "path": "app/src/main/res/values/strings.xml",
    "content": "<resources>\n    <string name=\"app_name\">DiffUtils</string>\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.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": "app/src/main/res/values-w820dp/dimens.xml",
    "content": "<resources>\n    <!-- Example customization of dimensions originally defined in res/values/dimens.xml\n         (such as screen margins) for screens with more than 820dp of available width. This\n         would include 7\" and 10\" devices in landscape (~960dp and ~1280dp respectively). -->\n    <dimen name=\"activity_horizontal_margin\">64dp</dimen>\n</resources>\n"
  },
  {
    "path": "app/src/test/java/com/mcxtzhang/diffutils/ExampleUnitTest.java",
    "content": "package com.mcxtzhang.diffutils;\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": "build.gradle",
    "content": "// Top-level build file where you can add configuration options common to all sub-projects/modules.\n\nbuildscript {\n    repositories {\n        jcenter()\n    }\n    dependencies {\n        classpath 'com.android.tools.build:gradle:2.2.2'\n\n        // NOTE: Do not place your application dependencies here; they belong\n        // in the individual module build.gradle files\n    }\n}\n\nallprojects {\n    repositories {\n        jcenter()\n    }\n}\n\ntask clean(type: Delete) {\n    delete rootProject.buildDir\n}\n"
  },
  {
    "path": "gradle/wrapper/gradle-wrapper.properties",
    "content": "#Mon Dec 28 10:00:20 PST 2015\ndistributionBase=GRADLE_USER_HOME\ndistributionPath=wrapper/dists\nzipStoreBase=GRADLE_USER_HOME\nzipStorePath=wrapper/dists\ndistributionUrl=https\\://services.gradle.org/distributions/gradle-2.14.1-all.zip\n"
  },
  {
    "path": "gradle.properties",
    "content": "# Project-wide Gradle settings.\n\n# IDE (e.g. Android Studio) users:\n# Gradle settings configured through the IDE *will override*\n# any settings specified in this file.\n\n# For more details on how to configure your build environment visit\n# http://www.gradle.org/docs/current/userguide/build_environment.html\n\n# Specifies the JVM arguments used for the daemon process.\n# The setting is particularly useful for tweaking memory settings.\norg.gradle.jvmargs=-Xmx1536m\n\n# When configured, Gradle will run in incubating parallel mode.\n# This option should only be used with decoupled projects. More details, visit\n# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects\n# org.gradle.parallel=true\n"
  },
  {
    "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\n@rem ##########################################################################\n@rem\n@rem  Gradle startup script for Windows\n@rem\n@rem ##########################################################################\n\n@rem Set local scope for the variables with windows NT shell\nif \"%OS%\"==\"Windows_NT\" setlocal\n\n@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.\nset DEFAULT_JVM_OPTS=\n\nset DIRNAME=%~dp0\nif \"%DIRNAME%\" == \"\" set DIRNAME=.\nset APP_BASE_NAME=%~n0\nset APP_HOME=%DIRNAME%\n\n@rem Find java.exe\nif defined JAVA_HOME goto findJavaFromJavaHome\n\nset JAVA_EXE=java.exe\n%JAVA_EXE% -version >NUL 2>&1\nif \"%ERRORLEVEL%\" == \"0\" goto init\n\necho.\necho ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.\necho.\necho Please set the JAVA_HOME variable in your environment to match the\necho location of your Java installation.\n\ngoto fail\n\n:findJavaFromJavaHome\nset JAVA_HOME=%JAVA_HOME:\"=%\nset JAVA_EXE=%JAVA_HOME%/bin/java.exe\n\nif exist \"%JAVA_EXE%\" goto init\n\necho.\necho ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%\necho.\necho Please set the JAVA_HOME variable in your environment to match the\necho location of your Java installation.\n\ngoto fail\n\n:init\n@rem Get command-line arguments, handling Windowz variants\n\nif not \"%OS%\" == \"Windows_NT\" goto win9xME_args\nif \"%@eval[2+2]\" == \"4\" goto 4NT_args\n\n:win9xME_args\n@rem Slurp the command line arguments.\nset CMD_LINE_ARGS=\nset _SKIP=2\n\n:win9xME_args_slurp\nif \"x%~1\" == \"x\" goto execute\n\nset CMD_LINE_ARGS=%*\ngoto execute\n\n:4NT_args\n@rem Get arguments from the 4NT Shell from JP Software\nset CMD_LINE_ARGS=%$\n\n:execute\n@rem Setup the command line\n\nset CLASSPATH=%APP_HOME%\\gradle\\wrapper\\gradle-wrapper.jar\n\n@rem Execute Gradle\n\"%JAVA_EXE%\" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% \"-Dorg.gradle.appname=%APP_BASE_NAME%\" -classpath \"%CLASSPATH%\" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%\n\n:end\n@rem End local scope for the variables with windows NT shell\nif \"%ERRORLEVEL%\"==\"0\" goto mainEnd\n\n:fail\nrem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of\nrem the _cmd.exe /c_ return code!\nif  not \"\" == \"%GRADLE_EXIT_CONSOLE%\" exit 1\nexit /b 1\n\n:mainEnd\nif \"%OS%\"==\"Windows_NT\" endlocal\n\n:omega\n"
  },
  {
    "path": "settings.gradle",
    "content": "include ':app'\n"
  }
]