[
  {
    "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.idea/tasks.xml\n.idea/gradle.xml\n.idea/dictionaries\n.idea/libraries\n\n# Keystore files\n*.jks\n\n# External native build folder generated in Android Studio 2.2 and later\n.externalNativeBuild\n\n# Google Services (e.g. APIs or Firebase)\ngoogle-services.json\n\n# Freeline\nfreeline.py\nfreeline/\nfreeline_project_description.json\n"
  },
  {
    "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/inspectionProfiles/Project_Default.xml",
    "content": "<component name=\"InspectionProjectProfileManager\">\n  <profile version=\"1.0\">\n    <option name=\"myName\" value=\"Project Default\" />\n    <inspection_tool class=\"JavaDoc\" enabled=\"true\" level=\"WARNING\" enabled_by_default=\"true\">\n      <option name=\"TOP_LEVEL_CLASS_OPTIONS\">\n        <value>\n          <option name=\"ACCESS_JAVADOC_REQUIRED_FOR\" value=\"none\" />\n          <option name=\"REQUIRED_TAGS\" value=\"\" />\n        </value>\n      </option>\n      <option name=\"INNER_CLASS_OPTIONS\">\n        <value>\n          <option name=\"ACCESS_JAVADOC_REQUIRED_FOR\" value=\"none\" />\n          <option name=\"REQUIRED_TAGS\" value=\"\" />\n        </value>\n      </option>\n      <option name=\"METHOD_OPTIONS\">\n        <value>\n          <option name=\"ACCESS_JAVADOC_REQUIRED_FOR\" value=\"none\" />\n          <option name=\"REQUIRED_TAGS\" value=\"@return@param@throws or @exception\" />\n        </value>\n      </option>\n      <option name=\"FIELD_OPTIONS\">\n        <value>\n          <option name=\"ACCESS_JAVADOC_REQUIRED_FOR\" value=\"none\" />\n          <option name=\"REQUIRED_TAGS\" value=\"\" />\n        </value>\n      </option>\n      <option name=\"IGNORE_DEPRECATED\" value=\"false\" />\n      <option name=\"IGNORE_JAVADOC_PERIOD\" value=\"true\" />\n      <option name=\"IGNORE_DUPLICATED_THROWS\" value=\"false\" />\n      <option name=\"IGNORE_POINT_TO_ITSELF\" value=\"false\" />\n      <option name=\"myAdditionalJavadocTags\" value=\"parma\" />\n    </inspection_tool>\n  </profile>\n</component>"
  },
  {
    "path": ".idea/misc.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\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=\"ProjectRootManager\" version=\"2\" languageLevel=\"JDK_1_7\" default=\"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$/Discover.iml\" filepath=\"$PROJECT_DIR$/Discover.iml\" />\n      <module fileurl=\"file://$PROJECT_DIR$/app/app.iml\" filepath=\"$PROJECT_DIR$/app/app.iml\" />\n      <module fileurl=\"file://$PROJECT_DIR$/librarys/http/http.iml\" filepath=\"$PROJECT_DIR$/librarys/http/http.iml\" />\n      <module fileurl=\"file://$PROJECT_DIR$/librarys/jiaozivideoplayer/jiaozivideoplayer.iml\" filepath=\"$PROJECT_DIR$/librarys/jiaozivideoplayer/jiaozivideoplayer.iml\" />\n      <module fileurl=\"file://$PROJECT_DIR$/librarys/librarys.iml\" filepath=\"$PROJECT_DIR$/librarys/librarys.iml\" />\n      <module fileurl=\"file://$PROJECT_DIR$/librarys/xrecyclerview/xrecyclerview.iml\" filepath=\"$PROJECT_DIR$/librarys/xrecyclerview/xrecyclerview.iml\" />\n      <module fileurl=\"file://$PROJECT_DIR$/librarys/zmenu/zmenu.iml\" filepath=\"$PROJECT_DIR$/librarys/zmenu/zmenu.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": "LICENSE",
    "content": "                                 Apache License\n                           Version 2.0, January 2004\n                        http://www.apache.org/licenses/\n\n   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \"License\" shall mean the terms and conditions for use, reproduction,\n      and distribution as defined by Sections 1 through 9 of this document.\n\n      \"Licensor\" shall mean the copyright owner or entity authorized by\n      the copyright owner that is granting the License.\n\n      \"Legal Entity\" shall mean the union of the acting entity and all\n      other entities that control, are controlled by, or are under common\n      control with that entity. For the purposes of this definition,\n      \"control\" means (i) the power, direct or indirect, to cause the\n      direction or management of such entity, whether by contract or\n      otherwise, or (ii) ownership of fifty percent (50%) or more of the\n      outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity\n      exercising permissions granted by this License.\n\n      \"Source\" form shall mean the preferred form for making modifications,\n      including but not limited to software source code, documentation\n      source, and configuration files.\n\n      \"Object\" form shall mean any form resulting from mechanical\n      transformation or translation of a Source form, including but\n      not limited to compiled object code, generated documentation,\n      and conversions to other media types.\n\n      \"Work\" shall mean the work of authorship, whether in Source or\n      Object form, made available under the License, as indicated by a\n      copyright notice that is included in or attached to the work\n      (an example is provided in the Appendix below).\n\n      \"Derivative Works\" shall mean any work, whether in Source or Object\n      form, that is based on (or derived from) the Work and for which the\n      editorial revisions, annotations, elaborations, or other modifications\n      represent, as a whole, an original work of authorship. For the purposes\n      of this License, Derivative Works shall not include works that remain\n      separable from, or merely link (or bind by name) to the interfaces of,\n      the Work and Derivative Works thereof.\n\n      \"Contribution\" shall mean any work of authorship, including\n      the original version of the Work and any modifications or additions\n      to that Work or Derivative Works thereof, that is intentionally\n      submitted to Licensor for inclusion in the Work by the copyright owner\n      or by an individual or Legal Entity authorized to submit on behalf of\n      the copyright owner. For the purposes of this definition, \"submitted\"\n      means any form of electronic, verbal, or written communication sent\n      to the Licensor or its representatives, including but not limited to\n      communication on electronic mailing lists, source code control systems,\n      and issue tracking systems that are managed by, or on behalf of, the\n      Licensor for the purpose of discussing and improving the Work, but\n      excluding communication that is conspicuously marked or otherwise\n      designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity\n      on behalf of whom a Contribution has been received by Licensor and\n      subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      copyright license to reproduce, prepare Derivative Works of,\n      publicly display, publicly perform, sublicense, and distribute the\n      Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      (except as stated in this section) patent license to make, have made,\n      use, offer to sell, sell, import, and otherwise transfer the Work,\n      where such license applies only to those patent claims licensable\n      by such Contributor that are necessarily infringed by their\n      Contribution(s) alone or by combination of their Contribution(s)\n      with the Work to which such Contribution(s) was submitted. If You\n      institute patent litigation against any entity (including a\n      cross-claim or counterclaim in a lawsuit) alleging that the Work\n      or a Contribution incorporated within the Work constitutes direct\n      or contributory patent infringement, then any patent licenses\n      granted to You under this License for that Work shall terminate\n      as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the\n      Work or Derivative Works thereof in any medium, with or without\n      modifications, and in Source or Object form, provided that You\n      meet the following conditions:\n\n      (a) You must give any other recipients of the Work or\n          Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices\n          stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works\n          that You distribute, all copyright, patent, trademark, and\n          attribution notices from the Source form of the Work,\n          excluding those notices that do not pertain to any part of\n          the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its\n          distribution, then any Derivative Works that You distribute must\n          include a readable copy of the attribution notices contained\n          within such NOTICE file, excluding those notices that do not\n          pertain to any part of the Derivative Works, in at least one\n          of the following places: within a NOTICE text file distributed\n          as part of the Derivative Works; within the Source form or\n          documentation, if provided along with the Derivative Works; or,\n          within a display generated by the Derivative Works, if and\n          wherever such third-party notices normally appear. The contents\n          of the NOTICE file are for informational purposes only and\n          do not modify the License. You may add Your own attribution\n          notices within Derivative Works that You distribute, alongside\n          or as an addendum to the NOTICE text from the Work, provided\n          that such additional attribution notices cannot be construed\n          as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and\n      may provide additional or different license terms and conditions\n      for use, reproduction, or distribution of Your modifications, or\n      for any such Derivative Works as a whole, provided Your use,\n      reproduction, and distribution of the Work otherwise complies with\n      the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise,\n      any Contribution intentionally submitted for inclusion in the Work\n      by You to the Licensor shall be under the terms and conditions of\n      this License, without any additional terms or conditions.\n      Notwithstanding the above, nothing herein shall supersede or modify\n      the terms of any separate license agreement you may have executed\n      with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade\n      names, trademarks, service marks, or product names of the Licensor,\n      except as required for reasonable and customary use in describing the\n      origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or\n      agreed to in writing, Licensor provides the Work (and each\n      Contributor provides its Contributions) on an \"AS IS\" BASIS,\n      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n      implied, including, without limitation, any warranties or conditions\n      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n      PARTICULAR PURPOSE. You are solely responsible for determining the\n      appropriateness of using or redistributing the Work and assume any\n      risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory,\n      whether in tort (including negligence), contract, or otherwise,\n      unless required by applicable law (such as deliberate and grossly\n      negligent acts) or agreed to in writing, shall any Contributor be\n      liable to You for damages, including any direct, indirect, special,\n      incidental, or consequential damages of any character arising as a\n      result of this License or out of the use or inability to use the\n      Work (including but not limited to damages for loss of goodwill,\n      work stoppage, computer failure or malfunction, or any and all\n      other commercial damages or losses), even if such Contributor\n      has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing\n      the Work or Derivative Works thereof, You may choose to offer,\n      and charge a fee for, acceptance of support, warranty, indemnity,\n      or other liability obligations and/or rights consistent with this\n      License. However, in accepting such obligations, You may act only\n      on Your own behalf and on Your sole responsibility, not on behalf\n      of any other Contributor, and only if You agree to indemnify,\n      defend, and hold each Contributor harmless for any liability\n      incurred by, or claims asserted against, such Contributor by reason\n      of your accepting any such warranty or additional liability.\n\n   END OF TERMS AND CONDITIONS\n\n   APPENDIX: How to apply the Apache License to your work.\n\n      To apply the Apache License to your work, attach the following\n      boilerplate notice, with the fields enclosed by brackets \"[]\"\n      replaced with your own identifying information. (Don't include\n      the brackets!)  The text should be enclosed in the appropriate\n      comment syntax for the file format. We also recommend that a\n      file or class name and description of purpose be included on the\n      same \"printed page\" as the copyright notice for easier\n      identification within third-party archives.\n\n   Copyright [yyyy] [name of copyright owner]\n\n   Licensed under the Apache License, Version 2.0 (the \"License\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n       http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License.\n"
  },
  {
    "path": "README.md",
    "content": "# Discover\n一款模仿Tumblr UI，使用开眼api开发的符合Material Desgin阅读类的开源项目。项目采取的是MVVM-DataBinding + Rxjava2 + Retrofit架构开发。\n\n# 截图\n<img src=\"screenshot/1.gif\" width=\"160\" height=\"300\"><img src=\"screenshot/2.gif\" width=\"160\" height=\"300\"><img src=\"screenshot/3.gif\" width=\"160\" height=\"300\">\n\n# Thanks\n[JiaoZiVideoPlayer](https://github.com/lipangit/JiaoZiVideoPlayer)\n[开眼视频](http://www.kaiyanapp.com/)\n# 声明\n大部分api 数据都是来自开眼视频，数据接口均属于非正常渠道获取，请勿用于商业用途，原作公司拥有所有权利。\n"
  },
  {
    "path": "app/.gitignore",
    "content": "/build\n"
  },
  {
    "path": "app/build.gradle",
    "content": "apply plugin: 'com.android.application'\n\nandroid {\n    compileSdkVersion 26\n    buildToolsVersion '26.0.2'\n    defaultConfig {\n        applicationId \"com.example.discover\"\n        minSdkVersion 19\n        targetSdkVersion 26\n        versionCode 1\n        versionName \"1.0\"\n        testInstrumentationRunner \"android.support.test.runner.AndroidJUnitRunner\"\n\n        renderscriptTargetApi 19\n        renderscriptSupportModeEnabled true\n    }\n    buildTypes {\n        release {\n            minifyEnabled false\n            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'\n        }\n    }\n\n    dataBinding {\n        enabled = true\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 project(':librarys:http')\n    compile project(':librarys:jiaozivideoplayer')\n    compile project(':librarys:xrecyclerview')\n    compile project(':librarys:zmenu')\n\n    compile 'com.android.support:appcompat-v7:26.1.0'\n    compile 'com.android.support.constraint:constraint-layout:1.0.2'\n    compile 'com.github.bumptech.glide:glide:3.7.0'\n    compile 'org.litepal.android:core:1.6.1'\n    compile 'com.android.support:cardview-v7:26.1.0'\n\n    compile 'com.trello.rxlifecycle2:rxlifecycle:2.2.1'\n    compile 'com.trello.rxlifecycle2:rxlifecycle-components:2.2.1'\n\n    compile 'com.jakewharton.rxbinding2:rxbinding-design:2.0.0'\n    compile 'com.jakewharton.rxbinding2:rxbinding-support-v4:2.0.0'\n    compile 'com.jakewharton.rxbinding2:rxbinding-appcompat-v7:2.0.0'\n    compile 'com.jakewharton.rxbinding2:rxbinding-recyclerview-v7:2.0.0'\n\n    compile 'com.github.mmin18:realtimeblurview:1.1.0'\n    compile 'com.wang.avi:library:2.1.3'\n    compile 'com.hyman:flowlayout-lib:1.1.2'\n    testCompile 'junit:junit:4.12'\n\n    implementation 'com.github.chrisbanes:PhotoView:2.1.3'\n\n    debugCompile   'com.squareup.leakcanary:leakcanary-android:1.5'\n    releaseCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.5'\n    testCompile    'com.squareup.leakcanary:leakcanary-android-no-op:1.5'\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 G:\\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": "app/src/androidTest/java/com/example/discover/ExampleInstrumentedTest.java",
    "content": "package com.example.discover;\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.example.discover\", 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.example.discover\">\n\n    <uses-permission android:name=\"android.permission.INTERNET\" />\n    <uses-permission android:name=\"android.permission.WRITE_EXTERNAL_STORAGE\" />\n    <uses-permission android:name=\"android.permission.READ_EXTERNAL_STORAGE\" />\n\n    <application\n        android:name=\".app.DiscoverApplication\"\n        android:allowBackup=\"true\"\n        android:hardwareAccelerated=\"true\"\n        android:icon=\"@mipmap/ic_launcher\"\n        android:label=\"@string/app_name\"\n        android:roundIcon=\"@mipmap/ic_launcher_round\"\n        android:supportsRtl=\"true\"\n        android:theme=\"@style/AppTheme\">\n        <activity\n            android:name=\".MainActivity\"\n            android:configChanges=\"orientation|screenSize|keyboardHidden\">\n            <intent-filter>\n                <action android:name=\"android.intent.action.MAIN\" />\n\n                <category android:name=\"android.intent.category.LAUNCHER\" />\n            </intent-filter>\n        </activity>\n        <activity\n            android:name=\".TestActivity\"\n            android:configChanges=\"orientation|screenSize|keyboardHidden\" />\n        <activity\n            android:name=\".AuthorHomeActivity\"\n            android:configChanges=\"orientation|screenSize|keyboardHidden\" />\n        <activity\n            android:name=\".SearchActivity\"\n            android:theme=\"@style/LightTheme\" />\n        <activity\n            android:name=\".ResultActivity\"\n            android:theme=\"@style/LightTheme\" />\n        <activity android:name=\".VideoDetailActivity\"\n            android:configChanges=\"orientation|screenSize|keyboardHidden\"/>\n\n        <activity android:name=\".ViewBigImageActivity\"\n            android:screenOrientation=\"portrait\"/>\n    </application>\n\n</manifest>"
  },
  {
    "path": "app/src/main/assets/litepal.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<litepal>\n    <!--\n    \tDefine the database name of your application.\n    \tBy default each database name should be end with .db.\n    \tIf you didn't name your database end with .db,\n    \tLitePal would plus the suffix automatically for you.\n    \tFor example:\n    \t<dbname value=\"demo\" />\n    -->\n    <dbname value=\"Collection\" />\n\n    <!--\n    \tDefine the version of your database. Each time you want\n    \tto upgrade your database, the verstags tag would helps.\n    \tModify the models you defined in the mapptags tag, and just\n    \tmake the version value plus one, the upgrade of database\n    \twill be processed automatically without concern.\n\t\t\tFor example:\n    \t<version value=\"1\" />\n    -->\n    <version value=\"9\" />\n\n    <!--\n    \tDefine your models in the list with mapptags tag, LitePal will\n    \tcreate tables for each mapping class. The supported fields\n    \tdefined in models will be mapped into columns.\n    \tFor example:\n    \t<list>\n    \t\t<mapping class=\"com.test.model.Reader\" />\n    \t\t<mapping class=\"com.test.model.Magazine\" />\n    \t</list>\n    -->\n    <list>\n        <mapping class=\"com.example.discover.bean.LitePalBean.LikeVideo\"/>\n        <mapping class=\"com.example.discover.bean.LitePalBean.LabelType\"/>\n        <mapping class=\"com.example.discover.bean.LitePalBean.Follow\"/>\n        <mapping class=\"com.example.discover.bean.LitePalBean.SearchTag\"/>\n    </list>\n\n    <!--\n        Define where the .db file should be. \"internal\" means the .db file\n        will be stored in the database folder of internal storage which no\n        one can access. \"external\" means the .db file will be stored in the\n        path to the directory on the primary external storage device where\n        the application can place persistent files it owns which everyone\n        can access. \"internal\" will act as default.\n        For example:\n        <storage value=\"external\" />\n    -->\n\n</litepal>"
  },
  {
    "path": "app/src/main/java/com/example/discover/AuthorHomeActivity.java",
    "content": "package com.example.discover;\n\nimport android.databinding.DataBindingUtil;\nimport android.graphics.Color;\nimport android.support.design.widget.AppBarLayout;\nimport android.support.design.widget.TabLayout;\nimport android.support.v4.view.ViewPager;\nimport android.support.v7.app.AppCompatActivity;\nimport android.os.Bundle;\nimport android.view.View;\nimport android.widget.Toast;\n\nimport com.bumptech.glide.Glide;\nimport com.example.discover.adapter.MyFragmentPagerAdapter;\nimport com.example.discover.databinding.ActivityAuthorHomeBinding;\nimport com.example.discover.ui.DiscoverFragment;\nimport com.example.discover.ui.Search.Author.ItemFragment;\nimport com.example.discover.utils.DebugUtil;\nimport com.example.discover.utils.LitePalUtil;\nimport com.jakewharton.rxbinding2.view.RxView;\n\nimport java.util.ArrayList;\nimport java.util.List;\nimport java.util.concurrent.TimeUnit;\n\nimport cn.jzvd.JZVideoPlayer;\nimport io.reactivex.functions.Consumer;\n\npublic class AuthorHomeActivity extends AppCompatActivity {\n\n    private ActivityAuthorHomeBinding binding;\n    private int authorId;\n    private List<android.support.v4.app.Fragment> fragmentList;\n    private List<String> titleList;\n\n    @Override\n    protected void onCreate(Bundle savedInstanceState) {\n        super.onCreate(savedInstanceState);\n        binding = DataBindingUtil.setContentView(this, R.layout.activity_author_home);\n\n        init();\n        initFragmentList();\n        loadViewPager();\n    }\n\n    private void init() {\n        authorId = getIntent().getIntExtra(\"AuthorId\", 0);\n        boolean isFollowing = getIntent().getBooleanExtra(\"Following\", false);\n        final String authorName = getIntent().getStringExtra(\"AuthorName\");\n        final String authorDesc = getIntent().getStringExtra(\"AuthorDesc\");\n        final String authorIcon = getIntent().getStringExtra(\"AuthorIcon\");\n        final String authorBack = getIntent().getStringExtra(\"AuthorBack\");\n        final int color = getIntent().getIntExtra(\"Color\", 0);\n\n        //填充基本数据\n        binding.tvName.setText(authorName);\n        binding.toolbarId.setText(authorName);\n        binding.tvDesc.setText(authorDesc);\n        Glide.with(this).load(authorIcon).into(binding.ivHead);\n        Glide.with(this).load(authorBack).into(binding.ivBackground);\n        binding.blurView.setOverlayColor(color);\n        binding.tabItem.setBackgroundColor(color);\n        binding.supView.setBackgroundColor(color);\n        binding.ivHead.setBorderColor(color);\n        binding.llText.setBackgroundColor(color);\n        if (isFollowing) {\n            binding.attention.setVisibility(View.GONE);\n        }\n        //渐变\n        binding.appBarLayout.addOnOffsetChangedListener(new AppBarLayout.OnOffsetChangedListener() {\n            @Override\n            public void onOffsetChanged(AppBarLayout appBarLayout, int verticalOffset) {\n                DebugUtil.debug(\"appbartest\",appBarLayout.getY() + \"//\" + appBarLayout.getTotalScrollRange() + \"//\" + verticalOffset);\n\n                float offsetAlpha = (appBarLayout.getY() / appBarLayout.getTotalScrollRange());\n                binding.blurView.setAlpha( 2 * (offsetAlpha * -1));\n                binding.ivHead.setAlpha(1 - 3 * (offsetAlpha * - 1));\n            }\n        });\n        //点击事件\n        binding.ivBack.setOnClickListener(new View.OnClickListener() {\n            @Override\n            public void onClick(View v) {\n                onBackPressed();\n            }\n        });\n\n        RxView.clicks(binding.attention)\n                .throttleFirst(1, TimeUnit.SECONDS)\n                .subscribe(new Consumer<Object>() {\n                    @Override\n                    public void accept(Object o) throws Exception {\n                        //点击关注\n                        binding.attention.setVisibility(View.GONE);\n                        LitePalUtil.addToFollow(authorId, authorName, authorDesc, authorIcon, color, authorBack);\n                        Toast.makeText(AuthorHomeActivity.this, \"你关注了作者\", Toast.LENGTH_SHORT).show();\n                        //待完善\n                    }\n                });\n    }\n\n\n    private void initFragmentList() {\n        fragmentList = new ArrayList<>();\n        fragmentList.add(ItemFragment.newInstance(\"date\", authorId)); //按日期排序\n        fragmentList.add(ItemFragment.newInstance(\"shareCount\", authorId)); //按时间排序\n\n        titleList = new ArrayList<>();\n        titleList.add(\"按时间\");\n        titleList.add(\"按热度\");\n    }\n\n    private void loadViewPager() {\n\n        MyFragmentPagerAdapter adapter = new MyFragmentPagerAdapter(getSupportFragmentManager(), fragmentList, titleList);\n        binding.vpContent.setAdapter(adapter);\n        binding.vpContent.setOffscreenPageLimit(2);\n        binding.tabItem.setTabMode(TabLayout.MODE_FIXED);\n        binding.tabItem.setupWithViewPager(binding.vpContent);\n    }\n\n    @Override\n    protected void onDestroy() {\n        JZVideoPlayer.releaseAllVideos();\n        super.onDestroy();\n    }\n\n\n    @Override\n    public void onBackPressed() {\n        //全屏播放时退出全屏\n        if (JZVideoPlayer.backPress()) {\n            return;\n        }\n\n        System.gc();\n        super.onBackPressed();\n    }\n\n}\n"
  },
  {
    "path": "app/src/main/java/com/example/discover/MainActivity.java",
    "content": "package com.example.discover;\n\nimport android.databinding.DataBindingUtil;\nimport android.os.Bundle;\nimport android.os.Handler;\nimport android.os.Message;\nimport android.support.design.widget.Snackbar;\nimport android.support.v4.app.Fragment;\nimport android.support.v4.view.ViewPager;\nimport android.support.v7.app.AppCompatActivity;\nimport android.util.Log;\nimport android.view.KeyEvent;\nimport android.view.View;\nimport android.widget.ImageView;\nimport android.widget.Toast;\n\nimport com.example.discover.adapter.MyFragmentPagerAdapter;\nimport com.example.discover.databinding.ActivityMainBinding;\nimport com.example.discover.ui.DiscoverFragment;\nimport com.example.discover.ui.Personal.PersonalFragment;\nimport com.example.discover.ui.Search.SearchFragment;\nimport com.example.discover.ui.Video.VideoFragment;\nimport com.example.discover.ui.Welfare.WelFareFragment;\nimport com.example.zmenu.PUtils;\nimport com.example.zmenu.SnakeButtonLayout;\nimport com.jakewharton.rxbinding2.view.RxView;\n\n\nimport org.litepal.tablemanager.Connector;\n\nimport java.util.ArrayList;\nimport java.util.List;\nimport java.util.concurrent.TimeUnit;\n\nimport cn.jzvd.JZVideoPlayer;\nimport io.reactivex.functions.Consumer;\n\npublic class MainActivity extends AppCompatActivity {\n\n    private ActivityMainBinding mBinding;\n    private ViewPager mViewPager;\n    private ImageView mBottomItem1, mBottomItem2, mBottomItem3, mBottomItem4;\n    private List<Fragment> fragmentList;\n    private List<Integer> imageList;//XMenu的图片\n    private List<Integer> colorList;//XMenu的颜色\n    private static boolean isExit = false;\n    private static Handler mHandler = new Handler(new Handler.Callback() {\n        @Override\n        public boolean handleMessage(Message message) {\n            isExit = false;\n            return true;\n        }\n    });\n\n    @Override\n    protected void onCreate(Bundle savedInstanceState) {\n        super.onCreate(savedInstanceState);\n\n        //初始化XMenu(自己做的一个自定义控件 https://github.com/monkeywiiu/Xmenu)\n        initXMenu();\n        mBinding = DataBindingUtil.setContentView(this, R.layout.activity_main);\n        initBinding();\n        initFragmentList();\n        loadViewPager();\n        initBottomBar();\n\n        //创建litepal数据库\n        Connector.getDatabase();\n    }\n\n    public void initXMenu(){\n        initXMenuResource();\n        //设置图片和颜色\n        if (imageList != null && colorList != null){\n           PUtils.getInstance().setImagesAndColors(imageList, colorList);\n        }\n\n        //设置xMenu可见\n        PUtils.getInstance().setVisible(true);\n\n        //设置悬浮按钮的margin\n        PUtils.getInstance().setMargin((int) getResources().getDimension(R.dimen.xMenuMarginRight),\n                (int) getResources().getDimension(R.dimen.xMenuMarginBottom));\n\n\n    }\n    public void initXMenuResource() {\n        imageList = new ArrayList<>();\n        colorList = new ArrayList<>();\n        imageList.add(R.drawable.image1);\n        imageList.add(R.drawable.image2);\n        imageList.add(R.drawable.image3);\n        imageList.add(R.drawable.image4);\n        imageList.add(R.drawable.image5);\n        imageList.add(R.drawable.image6);\n\n        colorList.add(R.color.background1);\n        colorList.add(R.color.background2);\n        colorList.add(R.color.background3);\n        colorList.add(R.color.background4);\n        colorList.add(R.color.background5);\n        colorList.add(R.color.background6);\n    }\n\n    public void initBinding() {\n        mViewPager = mBinding.mainViewpager;\n        mBottomItem1 = mBinding.bottomBar.one;\n        mBottomItem2 = mBinding.bottomBar.two;\n        mBottomItem3 = mBinding.bottomBar.three;\n        mBottomItem4 = mBinding.bottomBar.four;\n\n        mBinding.snakeButton.setClickable(true);\n        mBinding.snakeButton.setOnTopViewClickListener(new SnakeButtonLayout.onTopViewClickListener() {\n            @Override\n            public void onclick() {\n                Toast.makeText(MainActivity.this, \"click\", Toast.LENGTH_SHORT).show();\n            }\n        });\n    }\n\n    public void initFragmentList() {\n        fragmentList = new ArrayList<>();\n        fragmentList.add(new VideoFragment()); //开眼视频页面\n        fragmentList.add(new SearchFragment());\n        fragmentList.add(new WelFareFragment());\n        fragmentList.add(new PersonalFragment());\n    }\n\n    public void loadViewPager(){\n        MyFragmentPagerAdapter adapter = new MyFragmentPagerAdapter(getSupportFragmentManager(), fragmentList);\n        mViewPager.setAdapter(adapter);\n        mViewPager.setOffscreenPageLimit(3);\n        mViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {\n            @Override\n            public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {\n\n            }\n\n            @Override\n            public void onPageSelected(int position) {\n                if (position == 0) {\n                    mBottomItem1.setSelected(true);\n                    mBottomItem2.setSelected(false);\n                    mBottomItem3.setSelected(false);\n                    mBottomItem4.setSelected(false);\n                } else if (position == 1) {\n                    mBottomItem2.setSelected(true);\n                    mBottomItem1.setSelected(false);\n                    mBottomItem3.setSelected(false);\n                    mBottomItem4.setSelected(false);\n                } else if (position == 2) {\n                    mBottomItem3.setSelected(true);\n                    mBottomItem1.setSelected(false);\n                    mBottomItem2.setSelected(false);\n                    mBottomItem4.setSelected(false);\n                } else if (position == 3) {\n                    mBottomItem4.setSelected(true);\n                    mBottomItem1.setSelected(false);\n                    mBottomItem2.setSelected(false);\n                    mBottomItem3.setSelected(false);\n                }\n            }\n\n            @Override\n            public void onPageScrollStateChanged(int state) {\n\n            }\n        });\n    }\n\n    public void initBottomBar() {\n        //设置bottom点击选中事件\n        mBottomItem1.setSelected(true);\n        mBottomItem1.setOnClickListener(new View.OnClickListener() {\n            @Override\n            public void onClick(View v) {\n\n                mBottomItem1.setSelected(true);\n                mBottomItem2.setSelected(false);\n                mBottomItem3.setSelected(false);\n                mBottomItem4.setSelected(false);\n                mViewPager.setCurrentItem(0);\n            }\n        });\n\n        mBottomItem2.setOnClickListener(new View.OnClickListener() {\n            @Override\n            public void onClick(View v) {\n\n                mBottomItem2.setSelected(true);\n                mBottomItem1.setSelected(false);\n                mBottomItem3.setSelected(false);\n                mBottomItem4.setSelected(false);\n                mViewPager.setCurrentItem(1);\n            }\n        });\n\n        mBottomItem3.setOnClickListener(new View.OnClickListener() {\n            @Override\n            public void onClick(View v) {\n\n                mBottomItem3.setSelected(true);\n                mBottomItem1.setSelected(false);\n                mBottomItem2.setSelected(false);\n                mBottomItem4.setSelected(false);\n                mViewPager.setCurrentItem(2);\n            }\n        });\n\n        mBottomItem4.setOnClickListener(new View.OnClickListener() {\n            @Override\n            public void onClick(View v) {\n                mBottomItem4.setSelected(true);\n                mBottomItem1.setSelected(false);\n                mBottomItem2.setSelected(false);\n                mBottomItem3.setSelected(false);\n                mViewPager.setCurrentItem(3);\n            }\n        });\n    }\n\n    @Override\n    public void onBackPressed() {\n        //全屏播放时退出全屏\n        if (JZVideoPlayer.backPress()) {\n            return;\n        }\n\n        super.onBackPressed();\n    }\n\n    @Override\n    public boolean onKeyDown(int keyCode, KeyEvent event) {\n\n        if (keyCode == KeyEvent.KEYCODE_BACK) {\n            if (!JZVideoPlayer.backPress()) {\n                exit();\n            }\n\n\n            return true;\n        }\n        return super.onKeyDown(keyCode, event);\n    }\n\n    //双击退出\n    private void exit() {\n\n        if (!isExit) {\n            isExit = true;\n            Snackbar snackbar = Snackbar.make(mViewPager, \"再按一次后退键退出程序\", Snackbar.LENGTH_SHORT);\n            snackbar.getView().setBackgroundResource(R.color.colorAccent);\n            snackbar.show();\n            // 利用handler延迟发送更改状态信息\n            mHandler.sendEmptyMessageDelayed(0, 2000);\n        } else {\n            this.finish();\n        }\n    }\n\n}\n"
  },
  {
    "path": "app/src/main/java/com/example/discover/ResultActivity.java",
    "content": "package com.example.discover;\n\nimport android.content.Intent;\nimport android.os.Handler;\nimport android.support.v7.app.ActionBar;\nimport android.support.v7.app.AppCompatActivity;\nimport android.os.Bundle;\nimport android.support.v7.widget.LinearLayoutManager;\nimport android.support.v7.widget.RecyclerView;\nimport android.support.v7.widget.Toolbar;\nimport android.util.Pair;\nimport android.view.MenuItem;\nimport android.widget.ImageButton;\nimport android.widget.TextView;\n\nimport com.example.discover.adapter.ResultAdapter;\nimport com.example.discover.bean.DetailBean.ItemList;\nimport com.example.discover.bean.ResultBean;\nimport com.example.discover.http.RequestListener;\nimport com.example.discover.model.SearchModel;\nimport com.example.discover.utils.DebugUtil;\nimport com.jakewharton.rxbinding2.support.v7.widget.RxRecyclerView;\nimport com.jakewharton.rxbinding2.view.RxView;\nimport com.trello.rxlifecycle2.components.support.RxAppCompatActivity;\n\nimport java.util.ArrayList;\nimport java.util.List;\nimport java.util.concurrent.TimeUnit;\n\nimport io.reactivex.functions.Consumer;\n\npublic class ResultActivity extends RxAppCompatActivity {\n\n    private  String keyword;\n    private int start = 1;\n    private boolean loading = false;\n    private ResultAdapter adapter;\n    private List<ItemList> resultList = new ArrayList<>();\n    @Override\n    protected void onCreate(Bundle savedInstanceState) {\n        super.onCreate(savedInstanceState);\n        setContentView(R.layout.activity_result);\n        keyword = getIntent().getStringExtra(SearchActivity.KEYWORD);\n        init();\n        initRecyclerView();\n        showResult();\n    }\n\n    public void init() {\n        //设置toolbar\n        Toolbar toolbar = findViewById(R.id.toolbar);\n        TextView titleView = findViewById(R.id.title);\n        setSupportActionBar(toolbar);\n        ActionBar ab = getSupportActionBar();\n        if (ab != null)\n            ab.setDisplayHomeAsUpEnabled(true);\n        titleView.setText(keyword);\n\n        ImageButton searchBtn = findViewById(R.id.search_btn);\n        RxView.clicks(searchBtn)\n                .throttleFirst(1, TimeUnit.SECONDS)\n                .subscribe(new Consumer<Object>() {\n\n                    @Override\n                    public void accept(Object o) throws Exception {\n                        Intent intent = new Intent(ResultActivity.this, SearchActivity.class);\n                        startActivity(intent);\n                    }\n                });\n    }\n\n    public void initRecyclerView() {\n        RecyclerView resultRecyclerView = findViewById(R.id.rv_result);\n        final LinearLayoutManager layoutManager = new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false);\n        resultRecyclerView.setLayoutManager(layoutManager);\n        adapter = new ResultAdapter(this, resultList);\n        resultRecyclerView.setAdapter(adapter);\n\n        //上拉加载\n        resultRecyclerView.setOnScrollListener(new RecyclerView.OnScrollListener() {\n            @Override\n            public void onScrolled(RecyclerView recyclerView, int dx, int dy) {\n                super.onScrolled(recyclerView, dx, dy);\n                int lastVisibleItem = layoutManager.findLastVisibleItemPosition();\n                int totalItemCount = layoutManager.getItemCount();\n                DebugUtil.debug(\"resultTest\", lastVisibleItem + \"  \" + totalItemCount);\n                if (lastVisibleItem == totalItemCount - 5 && !loading) {\n\n                    loading = true;\n                    new Handler().postDelayed(new Runnable() {\n                        @Override\n                        public void run() {\n\n                            showResult();\n                        }\n                    }, 1000);\n\n                }\n            }\n        });\n    }\n    public void showResult() {\n        SearchModel.showResult(this, keyword, start, new RequestListener() {\n            @Override\n            public void onSuccess(Object object) {\n                ResultBean resultBean = (ResultBean) object;\n                DebugUtil.debug(\"resultTest\", \"size\" + resultBean.getItemList().size() +\"start\" +start);\n                resultList.addAll(resultBean.getItemList());\n                adapter.notifyDataSetChanged();\n                loading = false;\n                start += resultBean.getItemList().size();\n            }\n\n            @Override\n            public void onFailed(Throwable t) {\n\n                DebugUtil.debug(\"resultsss\", \"\" + \"failed\");\n            }\n\n            @Override\n            public void onCompleted() {\n\n            }\n        });\n    }\n    @Override\n    public boolean onOptionsItemSelected(MenuItem item) {\n        if (item.getItemId() == android.R.id.home) {\n            finish();\n            return true;\n        }\n        return super.onOptionsItemSelected(item);\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/example/discover/SearchActivity.java",
    "content": "package com.example.discover;\n\nimport android.content.Intent;\nimport android.support.v7.app.ActionBar;\nimport android.support.v7.app.AppCompatActivity;\nimport android.os.Bundle;\nimport android.support.v7.widget.LinearLayoutManager;\nimport android.support.v7.widget.RecyclerView;\nimport android.support.v7.widget.Toolbar;\nimport android.view.KeyEvent;\nimport android.view.MenuItem;\nimport android.view.View;\nimport android.widget.EditText;\nimport android.widget.ImageButton;\nimport android.widget.Toast;\n\nimport com.example.discover.adapter.SearchTagAdapter;\nimport com.example.discover.bean.DetailBean.Data;\nimport com.example.discover.bean.LitePalBean.SearchTag;\nimport com.example.discover.http.RequestListener;\nimport com.example.discover.model.SearchModel;\nimport com.example.discover.utils.DebugUtil;\nimport com.jakewharton.rxbinding2.view.RxView;\nimport com.trello.rxlifecycle2.components.support.RxAppCompatActivity;\n\nimport org.litepal.crud.DataSupport;\n\nimport java.util.ArrayList;\nimport java.util.List;\nimport java.util.concurrent.TimeUnit;\n\nimport io.reactivex.functions.Consumer;\n\npublic class SearchActivity extends RxAppCompatActivity {\n\n    public static String KEYWORD = \"keyword\";\n    private RecyclerView mTagRecyclerView;\n    private EditText searchEdit;\n    private SearchTagAdapter adapter;\n    @Override\n    protected void onCreate(Bundle savedInstanceState) {\n        super.onCreate(savedInstanceState);\n        setContentView(R.layout.activity_search);\n        initRecyclerView();\n        init();\n        loadTrendingTag();\n        onKeyListener();\n    }\n\n    private void init() {\n        List<String> tagList = new ArrayList<>();\n        searchEdit = findViewById(R.id.search_edit);\n        Toolbar toolbar = findViewById(R.id.toolbar);\n        setSupportActionBar(toolbar);\n        ActionBar ab = getSupportActionBar();\n        if (ab != null)\n            ab.setDisplayHomeAsUpEnabled(true);\n\n        ImageButton clearButton = findViewById(R.id.clear_btn);\n        final EditText searchEdit = findViewById(R.id.search_edit);\n        RxView.clicks(clearButton)\n                .throttleFirst(1, TimeUnit.SECONDS)\n                .subscribe(new Consumer<Object>() {\n                    @Override\n                    public void accept(Object o) throws Exception {\n                        searchEdit.setText(\"\");\n                    }\n                });\n        //获取5个最新的搜索记录；\n\n        if (DataSupport.count(SearchTag.class) > 0) {\n            tagList.add(\"new\");\n            List<SearchTag> list = DataSupport.limit(5).order(\"id desc\").find(SearchTag.class);\n            if (list != null) {\n\n                for (SearchTag tag : list) {\n                    tagList.add(tag.getTag());\n                }\n\n                //只保留5个tag\n                DataSupport.deleteAll(SearchTag.class);\n                for (int i = tagList.size() - 1; i > 0; i--) {\n                    SearchTag searchTag = new SearchTag();\n                    searchTag.setTag(tagList.get(i));\n                    searchTag.save();\n                }\n            }\n        }\n\n        setAdapter(tagList);\n\n    }\n\n    private void initRecyclerView() {\n        LinearLayoutManager manager = new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false);\n        mTagRecyclerView = findViewById(R.id.rv_hot_tag);\n        mTagRecyclerView.setLayoutManager(manager);\n    }\n\n    private void setAdapter(List<String> list) {\n        adapter = new SearchTagAdapter(this);\n        DebugUtil.debug(\"trend\", list.size() + \"\");\n        adapter.setItemClickListener(new SearchTagAdapter.onItemClickListener() {\n            @Override\n            public void onItemClick(String s) {\n                toResultActivity(s);\n            }\n        });\n        mTagRecyclerView.setAdapter(adapter);\n        adapter.addAll(list);\n        adapter.notifyDataSetChanged();\n    }\n    private void loadTrendingTag() {\n        SearchModel.showTrendingTag(this, new RequestListener() {\n            @Override\n            public void onSuccess(Object object) {\n                List<String> list = (List<String>) object;\n                List<String> tagList2 = new ArrayList<>();\n                tagList2.add(\"recommend\");\n                tagList2.addAll(list);\n                adapter.addAll(tagList2);\n                adapter.notifyDataSetChanged();\n            }\n\n            @Override\n            public void onFailed(Throwable t) {\n\n                t.printStackTrace();\n                DebugUtil.debug(\"trend\", \"failed\");\n            }\n\n            @Override\n            public void onCompleted() {\n\n            }\n        });\n    }\n\n    private void onKeyListener() {\n\n        searchEdit.setOnKeyListener(new View.OnKeyListener() {\n            @Override\n            public boolean onKey(View v, int keyCode, KeyEvent event) {\n                if (event.getAction() != KeyEvent.ACTION_DOWN) return true;\n\n                if (keyCode == KeyEvent.KEYCODE_ENTER) {\n                    if (searchEdit.getText().toString().isEmpty()) {\n                        Toast.makeText(SearchActivity.this, \"搜索不能为空\", Toast.LENGTH_SHORT).show();\n                    } else {\n                        search(searchEdit.getText().toString());\n                    }\n                } else if (keyCode == KeyEvent.KEYCODE_BACK) {\n                    finish();\n                }\n\n                return false;\n            }\n        });\n    }\n\n    private void search(String key) {\n\n        DataSupport.deleteAll(SearchTag.class, \"tag = ?\", key);\n        SearchTag tag = new SearchTag();\n        tag.setTag(key);\n        tag.save();\n\n        toResultActivity(key);\n    }\n    @Override\n    public boolean onOptionsItemSelected(MenuItem item) {\n        if (item.getItemId() == android.R.id.home) {\n            finish();\n            return true;\n        }\n        return super.onOptionsItemSelected(item);\n    }\n\n    public void toResultActivity(String key) {\n        Intent intent = new Intent(this, ResultActivity.class);\n        intent.putExtra(KEYWORD, key);\n        intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);\n        startActivity(intent);\n        finish();\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/example/discover/TestActivity.java",
    "content": "package com.example.discover;\n\nimport android.os.Bundle;\nimport android.support.annotation.Nullable;\nimport android.support.v7.app.AppCompatActivity;\nimport android.widget.TextView;\n\n/**\n * Created by monkeyWiiu on 2018/1/8.\n */\n\npublic class TestActivity extends AppCompatActivity {\n    @Override\n    protected void onCreate(@Nullable Bundle savedInstanceState) {\n        super.onCreate(savedInstanceState);\n        setContentView(R.layout.activity_test);\n\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/example/discover/VideoDetailActivity.java",
    "content": "package com.example.discover;\n\nimport android.databinding.DataBindingUtil;\nimport android.os.Handler;\nimport android.os.Bundle;\nimport android.support.v7.widget.LinearLayoutManager;\nimport android.support.v7.widget.RecyclerView;\nimport android.view.LayoutInflater;\nimport android.view.View;\nimport android.widget.ImageButton;\nimport android.widget.ImageView;\n\nimport com.bumptech.glide.Glide;\nimport com.example.discover.adapter.ReplyAdapter;\nimport com.example.discover.app.Constant;\nimport com.example.discover.app.DiscoverApplication;\nimport com.example.discover.bean.DetailBean.ItemList;\nimport com.example.discover.bean.DetailBean.Replies;\nimport com.example.discover.bean.DetailBean.ReplyList;\nimport com.example.discover.databinding.ItemMovieDetailHeaderBinding;\nimport com.example.discover.http.RequestListener;\nimport com.example.discover.model.ReplyModel;\nimport com.example.discover.utils.DebugUtil;\nimport com.example.discover.utils.IntentManager;\nimport com.example.discover.utils.LitePalUtil;\nimport com.jakewharton.rxbinding2.view.RxView;\nimport com.squareup.leakcanary.RefWatcher;\nimport com.trello.rxlifecycle2.components.support.RxAppCompatActivity;\n\nimport java.util.ArrayList;\nimport java.util.List;\nimport java.util.concurrent.TimeUnit;\n\nimport cn.jzvd.JZVideoPlayer;\nimport cn.jzvd.JZVideoPlayerStandard;\nimport io.reactivex.functions.Consumer;\n\npublic class VideoDetailActivity extends RxAppCompatActivity {\n\n    private ItemList item;\n    private ItemMovieDetailHeaderBinding headerBinding;\n    private ReplyAdapter replyAdapter;\n    private LinearLayoutManager linearLayoutManager;\n    private List<ReplyList> replyLists = new ArrayList<>();\n    private boolean firstRequest = true;\n    private boolean loading = false;\n    private int lastSequence;\n    private RecyclerView replies;\n\n    @Override\n    protected void onCreate(Bundle savedInstanceState) {\n        super.onCreate(savedInstanceState);\n        setContentView(R.layout.activity_video_detail);\n\n        init();\n        initJZPlayer();\n        loadReply();\n    }\n\n    public void init() {\n\n        item = (ItemList) getIntent().getSerializableExtra(\"item\");\n        replies = findViewById(R.id.rv_replies);\n        linearLayoutManager = new LinearLayoutManager(this, LinearLayoutManager.VERTICAL,false);\n        replies.setLayoutManager(linearLayoutManager);\n        View view =DataBindingUtil.inflate(LayoutInflater.from(this), R.layout.item_movie_detail_header, replies, false).getRoot();\n        headerBinding = DataBindingUtil.getBinding(view);\n        headerBinding.setItem(item);\n\n        RxView.clicks(headerBinding.authorContent)\n                .throttleFirst(1, TimeUnit.SECONDS)\n                .subscribe(new Consumer<Object>() {\n                    @Override\n                    public void accept(Object o) throws Exception {\n\n                        JZVideoPlayer.releaseAllVideos();\n                        IntentManager.fromDetailtoAuthor(headerBinding.authorContent.getContext(), item);\n                    }\n                });\n        replyAdapter = new ReplyAdapter(replyLists, view);\n        replies.setAdapter(replyAdapter);\n\n        //上拉加载\n        replies.setOnScrollListener(new RecyclerView.OnScrollListener() {\n            @Override\n            public void onScrolled(RecyclerView recyclerView, int dx, int dy) {\n                super.onScrolled(recyclerView, dx, dy);\n                int lastVisibleItem = linearLayoutManager.findLastVisibleItemPosition();\n                int totalItemCount = linearLayoutManager.getItemCount();\n                if (lastVisibleItem == totalItemCount - 5 && !loading) {\n\n                    loading = true;\n                    new Handler().postDelayed(new Runnable() {\n                        @Override\n                        public void run() {\n\n                            loadReply();\n                        }\n                    }, 1000);\n\n                }\n            }\n        });\n\n        //点击收藏\n\n        headerBinding.collect.setOnClickListener(new View.OnClickListener() {\n            @Override\n            public void onClick(View v) {\n                if (item.getTag() == null) {\n                    headerBinding.collect.setImageDrawable(getResources().getDrawable(R.drawable.ic_heart_full_24dp_pink));\n                    //入库\n                    LitePalUtil.addVideoToFavor(item.getData().getId(), item.getData().getTitle(), item.getData().getDescription(),\n                            item.getData().getPlayUrl(), item.getData().getCover().getDetail(),item.getData().getAuthor().getName(),\n                            item.getData().getAuthor().getId(),item.getData().getAuthor().getIcon(),item.getData().getAuthor().getDescription(),\n                            (int) Constant.LabelMap.get(item.getData().getCategory()), item.getData().getCategory(), 0);\n                    item.setTag(\"true\");\n                } else if (\"true\".equals(item.getTag())){\n                    headerBinding.collect.setImageDrawable(getResources().getDrawable(R.drawable.ic_heart_hollow_24dp));\n                    //出库\n                    LitePalUtil.deleteVideoFromFavor(item.getData().getId());\n                    item.setTag(null);\n                }\n\n            }\n        });\n\n    }\n    public void initJZPlayer() {\n        JZVideoPlayerStandard videoPlayerStandard = findViewById(R.id.jz_player);\n\n        Glide.with(this).load(item.getData().getCover().getDetail())\n                .crossFade(800)\n                .placeholder(R.drawable.cross_image)\n                .error(R.drawable.cross_image)\n                .into(videoPlayerStandard.thumbImageView);\n        videoPlayerStandard.setUp(item.getData().getPlayUrl(), JZVideoPlayer.SCREEN_WINDOW_NORMAL, \"\");\n        videoPlayerStandard.backButton.setVisibility(View.VISIBLE);\n\n        videoPlayerStandard.backButton.setOnClickListener(new View.OnClickListener() {\n            @Override\n            public void onClick(View v) {\n                onBackPressed();\n            }\n        });\n    }\n\n    public void loadReply() {\n        ReplyModel.showReplies(this, firstRequest, lastSequence, item.getData().getId(), new RequestListener() {\n            @Override\n            public void onSuccess(Object object) {\n\n\n                Replies reply = (Replies) object;\n                DebugUtil.debug(\"replylistss\", reply.getReplyList().size() + \"\");\n                if (reply.getReplyList().size() > 0) {\n                    replyLists.addAll(reply.getReplyList());\n                    replyAdapter.notifyDataSetChanged();\n                    lastSequence = reply.getReplyList().get(reply.getReplyList().size() - 1).getSequence();\n                    firstRequest = false;\n                    loading =false;\n                }\n            }\n\n            @Override\n            public void onFailed(Throwable t) {\n\n            }\n\n            @Override\n            public void onCompleted() {\n\n            }\n        });\n    }\n\n    @Override\n    protected void onDestroy() {\n        DebugUtil.debug(\"desss\", \"1\");\n        //\n\n        setContentView(R.layout.null_layout);\n        RefWatcher refWatcher = DiscoverApplication.getRefWatcher(this);\n        refWatcher.watch(this);\n        super.onDestroy();\n    }\n\n    @Override\n    public void onBackPressed() {\n        //全屏播放时退出全屏\n        if (JZVideoPlayer.backPress()) {\n            return;\n        }\n        toFinish();\n        super.onBackPressed();\n    }\n\n    public void toFinish() {\n        DebugUtil.debug(\"ffff\", \"111\");\n        replyLists = null;\n        replyAdapter = null;\n        System.gc();\n    }\n\n\n}\n"
  },
  {
    "path": "app/src/main/java/com/example/discover/ViewBigImageActivity.java",
    "content": "package com.example.discover;\n\nimport android.app.Activity;\nimport android.content.Context;\nimport android.content.Intent;\nimport android.content.pm.PackageManager;\nimport android.graphics.Bitmap;\nimport android.graphics.BitmapFactory;\nimport android.net.Uri;\nimport android.os.Bundle;\nimport android.os.Environment;\nimport android.provider.MediaStore;\nimport android.support.v4.app.ActivityCompat;\nimport android.support.v4.app.FragmentActivity;\nimport android.support.v4.view.PagerAdapter;\nimport android.support.v4.view.ViewPager;\nimport android.support.v4.view.ViewPager.OnPageChangeListener;\nimport android.util.Log;\nimport android.view.LayoutInflater;\nimport android.view.View;\nimport android.view.ViewGroup;\nimport android.widget.ImageView;\nimport android.widget.ProgressBar;\nimport android.widget.TextView;\nimport android.widget.Toast;\n\nimport com.bumptech.glide.Glide;\nimport com.bumptech.glide.load.resource.drawable.GlideDrawable;\nimport com.bumptech.glide.request.FutureTarget;\nimport com.bumptech.glide.request.RequestListener;\nimport com.bumptech.glide.request.target.Target;\nimport com.example.discover.utils.DebugUtil;\nimport com.github.chrisbanes.photoview.OnOutsidePhotoTapListener;\nimport com.github.chrisbanes.photoview.OnPhotoTapListener;\nimport com.github.chrisbanes.photoview.PhotoView;\n\nimport java.io.File;\nimport java.io.FileNotFoundException;\nimport java.io.FileOutputStream;\nimport java.io.IOException;\nimport java.util.List;\nimport java.util.concurrent.ExecutionException;\n\n\n\n/**\n * 查看大图，拖拽退出\n * Created by monkeyWiiu on 2018/2/3.\n */\npublic class ViewBigImageActivity extends FragmentActivity implements OnPageChangeListener, OnPhotoTapListener, OnOutsidePhotoTapListener {\n\n    private static String[] PERMISSIONS_STORAGE = {\n            \"android.permission.READ_EXTERNAL_STORAGE\",\n            \"android.permission.WRITE_EXTERNAL_STORAGE\" };\n    // 保存图片\n    private TextView tv_save_big_image;\n    // 接收传过来的uri地址\n    List<String> imageuri;\n    // 接收穿过来当前选择的图片的数量\n    int code;\n    // 用于判断是头像还是文章图片 1:头像 2：文章大图\n    int selet;\n\n    // 用于管理图片的滑动\n    ViewPager very_image_viewpager;\n    // 当前页数\n    private int page;\n\n    /**\n     * 显示当前图片的页数\n     */\n    TextView very_image_viewpager_text;\n    /**\n     * 用于判断是否是加载本地图片\n     */\n    private boolean isLocal;\n\n    ViewPagerAdapter adapter;\n\n    /**\n     * 本应用图片的id\n     */\n    private int imageId;\n    /**\n     * 是否是本应用中的图片\n     */\n    private boolean isApp;\n\n    @Override\n    protected void onCreate(Bundle savedInstanceState) {\n        super.onCreate(savedInstanceState);\n        setContentView(R.layout.activity_view_big_image);\n\n        verifyStoragePermissions(this);\n        getView();\n    }\n\n    public static void verifyStoragePermissions(Activity activity) {\n\n        try {\n            int permission = ActivityCompat.checkSelfPermission(activity, \"android.permission.WRITE_EXTERNAL_STORAGE\");\n            if (permission != PackageManager.PERMISSION_GRANTED) {\n                ActivityCompat.requestPermissions(activity, PERMISSIONS_STORAGE, 1);\n            }\n        } catch (Exception e) {\n            e.printStackTrace();\n        }\n    }\n    /**\n     * 保存图片至相册\n     */\n    public static void saveImageToGallery(Context context, Bitmap bmp) {\n        // 首先保存图片\n        File appDir = new File(Environment.getExternalStorageDirectory(), \"云阅相册\");\n        if (!appDir.exists()) {\n            appDir.mkdirs();\n        }\n\n        String fileName = System.currentTimeMillis() + \".jpg\";\n        File file = new File(appDir, fileName);\n        try {\n            FileOutputStream fos = new FileOutputStream(file);\n            bmp.compress(Bitmap.CompressFormat.JPEG, 100, fos);\n\n            fos.flush();\n            fos.close();\n        } catch (IOException e) {\n\n            e.printStackTrace();\n        }\n\n        // 其次把文件插入到系统图库\n        try {\n            MediaStore.Images.Media.insertImage(context.getContentResolver(),\n                    file.getAbsolutePath(), fileName, null);\n        } catch (FileNotFoundException e) {\n            e.printStackTrace();\n        }\n        // 最后通知图库更新\n        context.sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.parse(\"file://\" + file.getAbsoluteFile())));\n    }\n\n\n    /**\n     * Glide 获得图片缓存路径\n     */\n    private String getImagePath(String imgUrl) {\n        String path = null;\n        FutureTarget<File> future = Glide.with(ViewBigImageActivity.this)\n                .load(imgUrl)\n                .downloadOnly(500, 500);\n        try {\n            File cacheFile = future.get();\n            path = cacheFile.getAbsolutePath();\n        } catch (InterruptedException | ExecutionException e) {\n            e.printStackTrace();\n        }\n        return path;\n    }\n\n\n    /*\n     * 接收控件\n     */\n    private void getView() {\n        /************************* 接收控件 ***********************/\n        very_image_viewpager_text = (TextView) findViewById(R.id.very_image_viewpager_text);\n        tv_save_big_image = (TextView) findViewById(R.id.tv_save_big_image);\n        very_image_viewpager = (ViewPager) findViewById(R.id.very_image_viewpager);\n\n        tv_save_big_image.setOnClickListener(new View.OnClickListener() {\n            @Override\n            public void onClick(View view) {\n\n                Toast.makeText(ViewBigImageActivity.this, \"开始下载图片\", Toast.LENGTH_SHORT).show();\n                if (isApp) {// 本地图片\n                    Bitmap bitmap = BitmapFactory.decodeResource(getResources(), imageId);\n                    if (bitmap != null) {\n                        saveImageToGallery(ViewBigImageActivity.this, bitmap);\n                        Toast.makeText(ViewBigImageActivity.this, \"保存成功\", Toast.LENGTH_SHORT).show();\n//                        Toast.makeText(ViewBigImageActivity.this, \"保存成功\", Toast.LENGTH_SHORT).show();\n                    }\n\n                } else {// 网络图片\n                    final BitmapFactory.Options bmOptions = new BitmapFactory.Options();\n                    new Thread(new Runnable() {\n                        @Override\n                        public void run() {\n                            // 子线程获得图片路径\n                            final String imagePath = getImagePath(imageuri.get(page));\n                            Log.d(\"imagePathand\", imagePath + \"..\" + imageuri.get(page));\n                            // 主线程更新\n                            ViewBigImageActivity.this.runOnUiThread(new Runnable() {\n                                @Override\n                                public void run() {\n                                    if (imagePath != null) {\n                                        Bitmap bitmap = BitmapFactory.decodeFile(imagePath, bmOptions);\n                                        if (bitmap != null) {\n\n                                            saveImageToGallery(ViewBigImageActivity.this, bitmap);\n                                            Toast.makeText(ViewBigImageActivity.this, \"已保存至\"+Environment.getExternalStorageDirectory().getAbsolutePath()+\"/云阅相册\", Toast.LENGTH_SHORT).show();\n//                                            Toast.makeText(ViewBigImageActivity.this, \"保存成功\", Toast.LENGTH_SHORT).show();\n                                        }\n                                    }\n                                }\n                            });\n                        }\n                    }).start();\n                }\n            }\n        });\n        /************************* 接收传值 ***********************/\n        Bundle bundle = getIntent().getExtras();\n        code = bundle.getInt(\"code\");\n        selet = bundle.getInt(\"selet\");\n        isLocal = bundle.getBoolean(\"isLocal\", false);\n        imageuri = bundle.getStringArrayList(\"imageuri\");\n        /**是否是本应用中的图片*/\n        isApp = bundle.getBoolean(\"isApp\", false);\n        /**本应用图片的id*/\n        imageId = bundle.getInt(\"id\", 0);\n\n        /**\n         * 给viewpager设置适配器\n         */\n        if (isApp) {\n            MyPageAdapter myPageAdapter = new MyPageAdapter();\n            very_image_viewpager.setAdapter(myPageAdapter);\n            very_image_viewpager.setEnabled(false);\n        } else {\n            adapter = new ViewPagerAdapter();\n            very_image_viewpager.setAdapter(adapter);\n            very_image_viewpager.setCurrentItem(code);\n            page = code;\n            very_image_viewpager.setOnPageChangeListener(this);\n            very_image_viewpager.setEnabled(false);\n            // 设定当前的页数和总页数\n            if (selet == 2) {\n                very_image_viewpager_text.setText((code + 1) + \" / \" + imageuri.size());\n            }\n        }\n    }\n\n\n\n\n    /**\n     * 本应用图片适配器\n     */\n\n    class MyPageAdapter extends PagerAdapter {\n\n        @Override\n        public int getCount() {\n            return 1;\n        }\n\n        @Override\n        public boolean isViewFromObject(View view, Object object) {\n            return view == object;\n        }\n\n        @Override\n        public Object instantiateItem(ViewGroup container, int position) {\n            View view = getLayoutInflater().inflate(R.layout.viewpager_very_image, container, false);\n            PhotoView zoom_image_view =  view.findViewById(R.id.zoom_image_view);\n            ProgressBar spinner = (ProgressBar) view.findViewById(R.id.loading);\n            spinner.setVisibility(View.GONE);\n            if (imageId != 0) {\n                zoom_image_view.setImageResource(imageId);\n            }\n            zoom_image_view.setOnPhotoTapListener(ViewBigImageActivity.this);\n            container.addView(view, 0);\n            return view;\n        }\n\n        @Override\n        public void destroyItem(ViewGroup container, int position, Object object) {\n            View view = (View) object;\n            container.removeView(view);\n        }\n    }\n\n    /**\n     * ViewPager的适配器\n     *\n     * @author guolin\n     */\n    class ViewPagerAdapter extends PagerAdapter {\n\n        LayoutInflater inflater;\n\n        ViewPagerAdapter() {\n            inflater = getLayoutInflater();\n        }\n\n        @Override\n        public Object instantiateItem(ViewGroup container, int position) {\n            View view = inflater.inflate(R.layout.viewpager_very_image, container, false);\n            final PhotoView zoom_image_view = (PhotoView) view.findViewById(R.id.zoom_image_view);\n            final ProgressBar spinner = (ProgressBar) view.findViewById(R.id.loading);\n            // 保存网络图片的路径\n            String adapter_image_Entity = (String) getItem(position);\n            //TODO\n            String imageUrl;\n            if (isLocal) {\n                imageUrl = \"file://\" + adapter_image_Entity;\n                tv_save_big_image.setVisibility(View.GONE);\n            } else {\n                imageUrl = adapter_image_Entity;\n            }\n\n            spinner.setVisibility(View.VISIBLE);\n            spinner.setClickable(false);\n            Glide.with(ViewBigImageActivity.this).load(imageUrl)\n                    .crossFade(700)\n                    .listener(new RequestListener<String, GlideDrawable>() {\n                        @Override\n                        public boolean onException(Exception e, String model, Target<GlideDrawable> target, boolean isFirstResource) {\n                            Toast.makeText(getApplicationContext(), \"资源加载异常\", Toast.LENGTH_SHORT).show();\n                            spinner.setVisibility(View.GONE);\n                            return false;\n                        }\n\n                        //这个用于监听图片是否加载完成\n                        @Override\n                        public boolean onResourceReady(GlideDrawable resource, String model, Target<GlideDrawable> target, boolean isFromMemoryCache, boolean isFirstResource) {\n//                            Toast.makeText(getApplicationContext(), \"图片加载完成\", Toast.LENGTH_SHORT).show();\n                            spinner.setVisibility(View.GONE);\n\n                            /**这里应该是加载成功后图片的高*/\n                            int height = zoom_image_view.getHeight();\n\n                            int wHeight = getWindowManager().getDefaultDisplay().getHeight();\n                            if (height > wHeight) {\n                                zoom_image_view.setScaleType(ImageView.ScaleType.CENTER_CROP);\n                            } else {\n                                zoom_image_view.setScaleType(ImageView.ScaleType.FIT_CENTER);\n                            }\n                            return false;\n                        }\n                    }).into(zoom_image_view);\n\n            zoom_image_view.setOnPhotoTapListener(ViewBigImageActivity.this);\n            container.addView(view, 0);\n            return view;\n        }\n\n        @Override\n        public int getCount() {\n            if (imageuri == null || imageuri.size() == 0) {\n                return 0;\n            }\n            return imageuri.size();\n        }\n\n        @Override\n        public boolean isViewFromObject(View arg0, Object arg1) {\n            return arg0 == arg1;\n        }\n\n        @Override\n        public void destroyItem(ViewGroup container, int position, Object object) {\n            View view = (View) object;\n            container.removeView(view);\n        }\n\n        Object getItem(int position) {\n            return imageuri.get(position);\n        }\n    }\n\n    /**\n     * 下面是对Viewpager的监听\n     */\n    @Override\n    public void onPageScrollStateChanged(int arg0) {\n    }\n\n    @Override\n    public void onPageScrolled(int arg0, float arg1, int arg2) {\n    }\n\n    /**\n     * 本方法主要监听viewpager滑动的时候的操作\n     */\n    @Override\n    public void onPageSelected(int arg0) {\n        // 每当页数发生改变时重新设定一遍当前的页数和总页数\n        very_image_viewpager_text.setText((arg0 + 1) + \" / \" + imageuri.size());\n        page = arg0;\n    }\n\n\n\n    @Override\n    public void onPhotoTap(ImageView view, float x, float y) {\n\n        DebugUtil.debug(\"232323\", \"11\");\n        onBackPressed();\n    }\n\n\n    @Override\n    public void onOutsidePhotoTap(ImageView imageView) {\n\n    }\n\n    @Override\n    public void onBackPressed() {\n        System.gc();\n        super.onBackPressed();\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/example/discover/adapter/AuthorPopAdapter.java",
    "content": "package com.example.discover.adapter;\n\nimport android.content.Context;\nimport android.content.Intent;\nimport android.view.ViewGroup;\nimport android.widget.Toast;\n\nimport com.example.discover.AuthorHomeActivity;\nimport com.example.discover.R;\nimport com.example.discover.app.Constant;\nimport com.example.discover.base.baseadapter.BaseRecyclerAdapter;\nimport com.example.discover.base.baseadapter.BaseViewHolder;\nimport com.example.discover.bean.DetailBean.ItemList;\nimport com.example.discover.databinding.AuthorCardBinding;\nimport com.example.discover.utils.IntentManager;\nimport com.jakewharton.rxbinding2.view.RxView;\n\nimport java.util.concurrent.TimeUnit;\n\nimport io.reactivex.functions.Consumer;\n\n/**\n * Created by monkeyWiiu on 2018/1/18.\n */\n\npublic class AuthorPopAdapter extends BaseRecyclerAdapter<ItemList> {\n\n    public AuthorPopAdapter(Context context) {\n        super(context);\n    }\n\n    @Override\n    public BaseViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {\n        return new AuthorCardHolder(parent, R.layout.author_card);\n    }\n\n    public class AuthorCardHolder extends BaseViewHolder<ItemList, AuthorCardBinding> {\n        public AuthorCardHolder(ViewGroup parent, int layoutId) {\n            super(parent, layoutId);\n        }\n\n        @Override\n        public void fillHolder(final ItemList object, int position) {\n\n\n            RxView.clicks(itemViewBinding.cvEnter)\n                    .throttleFirst(1, TimeUnit.SECONDS)\n                    .subscribe(new Consumer<Object>() {\n                        @Override\n                        public void accept(Object o) throws Exception {\n                            //toAuthorHomeActivity(object);\n                            IntentManager.toAuthorHomeActivity(mContext, object);\n                        }\n                    });\n            setBackGroundColor(itemViewBinding, object);\n            itemViewBinding.setItemList(object);\n        }\n    }\n\n    @Override\n    public int getItemCount() {\n        return mData.size();\n    }\n\n    public void setBackGroundColor(AuthorCardBinding binding, ItemList object) {\n        if (object.getData().getItemList().size() > 0) {\n            int color;\n            color = (Integer) Constant.LabelMap.get(object.getData().getItemList().get(0).getData().getCategory());\n            binding.cvAuthor.setCardBackgroundColor(color);\n            binding.cvImage.setCardBackgroundColor(color);\n            binding.civAvatar.setBorderColor(color);\n        }\n    }\n\n}\n"
  },
  {
    "path": "app/src/main/java/com/example/discover/adapter/CategoryPopAdapter.java",
    "content": "package com.example.discover.adapter;\n\nimport android.app.Activity;\nimport android.app.ActivityOptions;\nimport android.content.Context;\nimport android.content.Intent;\nimport android.support.v4.app.ActivityCompat;\nimport android.support.v4.app.ActivityOptionsCompat;\nimport android.util.Pair;\nimport android.view.View;\nimport android.view.ViewGroup;\n\nimport com.example.discover.R;\nimport com.example.discover.VideoDetailActivity;\nimport com.example.discover.base.baseadapter.BaseRecyclerAdapter;\nimport com.example.discover.base.baseadapter.BaseViewHolder;\nimport com.example.discover.bean.DetailBean.ItemList;\nimport com.example.discover.databinding.CategoryCardBinding;\nimport com.example.discover.utils.IntentManager;\nimport com.jakewharton.rxbinding2.view.RxView;\n\nimport java.util.concurrent.TimeUnit;\n\nimport io.reactivex.functions.Consumer;\n\n/**\n * Created by monkeyWiiu on 2018/1/18.\n */\n\npublic class CategoryPopAdapter extends BaseRecyclerAdapter<ItemList> {\n    public CategoryPopAdapter(Context context ) {\n        super(context);\n    }\n\n\n    @Override\n    public BaseViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {\n        return new CateGoryCardHolder(parent, R.layout.category_card);\n    }\n\n    public class CateGoryCardHolder extends BaseViewHolder<ItemList, CategoryCardBinding> {\n        public CateGoryCardHolder(ViewGroup parent, int layoutId) {\n            super(parent, layoutId);\n        }\n\n        @Override\n        public void fillHolder(final ItemList object, int position) {\n            //itemViewBinding.tvText.setText(object.getData().getTitle());\n            itemViewBinding.setItemList(object);\n            RxView.clicks(itemViewBinding.videoAlbum)\n                    .throttleFirst(1, TimeUnit.SECONDS)\n                    .subscribe(new Consumer<Object>() {\n\n                        @Override\n                        public void accept(Object o) throws Exception {\n                            IntentManager.toVideoDetailActivity((Activity) mContext, object, itemViewBinding.videoAlbum);\n\n                        }\n                    });\n\n        }\n    }\n\n    @Override\n    public int getItemCount() {\n        return mData.size();\n    }\n\n    /*private void toVideoDetailActivity(ItemList item, View view) {\n        Intent intent = new Intent(mContext, VideoDetailActivity.class);\n        intent.putExtra(\"item\", item);\n        ActivityOptions options = ActivityOptions.makeSceneTransitionAnimation(\n                mContext,\n                Pair.create(view, mContext.getString(R.string.transition_shot)),\n                Pair.create(view, mContext.getString(R.string.transition_shot_background))\n        );\n        mContext.startActivity(intent, options.toBundle());\n    }*/\n}\n"
  },
  {
    "path": "app/src/main/java/com/example/discover/adapter/FollowRecyclerAdapter.java",
    "content": "package com.example.discover.adapter;\n\nimport android.content.Context;\nimport android.content.Intent;\nimport android.view.View;\nimport android.view.ViewGroup;\n\nimport com.example.discover.AuthorHomeActivity;\nimport com.example.discover.R;\nimport com.example.discover.app.Constant;\nimport com.example.discover.base.BaseFragment;\nimport com.example.discover.base.baseadapter.BaseRecyclerAdapter;\nimport com.example.discover.base.baseadapter.BaseViewHolder;\nimport com.example.discover.bean.DetailBean.ItemList;\nimport com.example.discover.bean.LitePalBean.Follow;\nimport com.example.discover.databinding.FooterItemVideoBinding;\nimport com.example.discover.databinding.ItemFollowBinding;\nimport com.example.discover.utils.DebugUtil;\nimport com.example.discover.view.CustomView.FollowPopupWindow;\n\nimport org.litepal.crud.DataSupport;\n\n/**\n * Created by monkeyWiiu on 2018/1/26.\n */\n\npublic class FollowRecyclerAdapter extends BaseRecyclerAdapter<Follow> {\n\n    private final static int TYPE_CONTENT = 2;\n    private final static int TYPE_FOOTER = 3;\n    private FooterItemVideoBinding mFooterBinding;\n    private final static int LOAD_MORE = 1;\n    private final static int NO_MORE = 0;\n    private final static int STATE_NORMAL = -1;\n    private int mState = STATE_NORMAL;\n    public FollowRecyclerAdapter(Context context) {\n        super(context);\n    }\n\n    @Override\n    public int getItemViewType(int position) {\n        if (position + 1 == getItemCount()) {\n            return TYPE_FOOTER;\n        } else {\n            return TYPE_CONTENT;\n        }\n    }\n\n    @Override\n    public BaseViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {\n        if (viewType == TYPE_CONTENT) {\n            return new FollowHolder(parent, R.layout.item_follow);\n        } else {\n            return new FooterHolder(parent, R.layout.footer_item_video);\n        }\n\n    }\n\n    public class FollowHolder extends BaseViewHolder<Follow, ItemFollowBinding> {\n        public FollowHolder(ViewGroup parent, int layoutId) {\n            super(parent, layoutId);\n        }\n\n        @Override\n        public void fillHolder(final Follow object, final int position) {\n\n            itemViewBinding.setFollow(object);\n            itemViewBinding.selector.setOnClickListener(new View.OnClickListener() {\n                @Override\n                public void onClick(View v) {\n                    FollowPopupWindow window = new FollowPopupWindow(v.getContext());\n                    window.showPopupWindow(itemViewBinding.selector);\n                    window.setPopItemClickListener(new FollowPopupWindow.PopItemClickListener() {\n                        @Override\n                        public void ItemClick() {\n                            DataSupport.deleteAll(Follow.class, \"authorId = ?\", String.valueOf(object.getAuthorId()));\n                            delete(position);\n                        }\n                    });\n                }\n            });\n\n            itemViewBinding.followItem.setOnClickListener(new View.OnClickListener() {\n                @Override\n                public void onClick(View v) {\n                    toAuthorHomeActivity(object);\n                }\n            });\n\n        }\n    }\n\n    private void toAuthorHomeActivity(Follow follow) {\n\n        Intent intent = new Intent(mContext, AuthorHomeActivity.class);\n        intent.putExtra(\"AuthorId\", follow.getAuthorId());\n        intent.putExtra(\"AuthorName\", follow.getAuthorName());\n        intent.putExtra(\"AuthorIcon\", follow.getIconUrl());\n        intent.putExtra(\"AuthorDesc\", follow.getAuthorDesc());\n        intent.putExtra(\"Color\", follow.getBackgroundColor());\n        intent.putExtra(\"AuthorBack\", follow.getBackgroundImage());\n        intent.putExtra(\"Following\", true);\n        mContext.startActivity(intent);\n    }\n\n    public class FooterHolder extends BaseViewHolder<Object, FooterItemVideoBinding> {\n        public FooterHolder(ViewGroup parent, int layoutId) {\n            super(parent, layoutId);\n        }\n\n        @Override\n        public void fillHolder(Object object, int position) {\n            mFooterBinding = itemViewBinding;\n            //itemViewBinding.loading.show();\n        }\n    }\n\n    public void updateStateLoad(boolean loading) {\n\n        if (loading) {\n            this.mState = LOAD_MORE;\n        }else {\n            this.mState = NO_MORE;\n        }\n    }\n\n    public boolean isLoading() {\n        if (this.mState == LOAD_MORE) {\n            return true;\n        } else\n            return false;\n    }\n\n    public void hideLoading() {\n        mFooterBinding.loading.hide();\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/example/discover/adapter/ItemHelper.java",
    "content": "package com.example.discover.adapter;\n\n/**\n * Created by monkeyWiiu on 2018/1/14.\n */\n\npublic interface ItemHelper {\n\n        void onItemMove(int fromPosition, int toPosition);\n\n        void onItemDismiss(int position);\n}\n"
  },
  {
    "path": "app/src/main/java/com/example/discover/adapter/LabelChooseAdapter.java",
    "content": "package com.example.discover.adapter;\n\nimport android.content.Context;\nimport android.support.v7.widget.CardView;\nimport android.support.v7.widget.RecyclerView;\nimport android.view.LayoutInflater;\nimport android.view.View;\nimport android.view.ViewGroup;\nimport android.widget.TextView;\n\nimport com.example.discover.R;\nimport com.example.discover.app.Constant;\nimport com.example.discover.bean.LitePalBean.LabelType;\nimport com.example.discover.view.CustomView.LabelView;\n\nimport org.litepal.crud.DataSupport;\nimport org.w3c.dom.Text;\n\nimport java.util.HashMap;\nimport java.util.LinkedHashMap;\nimport java.util.List;\nimport java.util.zip.Inflater;\n\n/**\n * Created by monkeyWiiu on 2018/1/13.\n */\n\npublic class LabelChooseAdapter extends RecyclerView.Adapter<LabelChooseAdapter.MyViewHolder> {\n\n    private List<LabelType> savedList;\n    private HashMap mMap;\n    private List<String> mKeyList;\n    private Context mContext;\n    private ItemClickListener mListener;\n    public interface ItemClickListener {\n        void itemClick(String labelType);\n    }\n\n    public void setItemClickListener(ItemClickListener listener) {\n        this.mListener = listener;\n    }\n    public LabelChooseAdapter(List<String> list, HashMap map, Context context) {\n        this.mKeyList = list;\n        this.mMap = map;\n        this.mContext = context;\n    }\n\n    @Override\n    public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {\n        View view = LayoutInflater.from(mContext).inflate(R.layout.label_view, parent, false);\n        MyViewHolder viewHolder = new MyViewHolder(view);\n        return viewHolder;\n    }\n\n    @Override\n    public void onBindViewHolder(MyViewHolder holder, final int position) {\n        holder.labelView.setCardBackgroundColor((int)mMap.get(mKeyList.get(position)));\n        holder.textLabel.setText(mKeyList.get(position));\n\n        holder.labelView.setOnClickListener(new View.OnClickListener() {\n            @Override\n            public void onClick(View v) {\n                /*savedList = DataSupport.findAll(LabelType.class);\n                for (LabelType label : savedList) {\n                    if (mKeyList.get(position).equals(label.getType())) {\n                        return;\n                    }\n                }\n                LabelType label = new LabelType();\n                label.setType(mKeyList.get(position));\n                label.save();*/\n                mListener.itemClick(mKeyList.get(position));\n            }\n        });\n    }\n\n\n\n    @Override\n    public int getItemCount() {\n        return mMap.size();\n    }\n\n\n    public class MyViewHolder extends RecyclerView.ViewHolder {\n\n        private TextView textLabel;\n        private CardView labelView;\n        private MyViewHolder(View itemView) {\n            super(itemView);\n            textLabel = itemView.findViewById(R.id.tv_label);\n            labelView = itemView.findViewById(R.id.cv_choose_label);\n        }\n    }\n\n}\n"
  },
  {
    "path": "app/src/main/java/com/example/discover/adapter/LikeVideoRecyclerAdapter.java",
    "content": "package com.example.discover.adapter;\n\nimport android.content.Context;\nimport android.view.View;\nimport android.view.ViewGroup;\n\nimport com.bumptech.glide.Glide;\nimport com.example.discover.R;\nimport com.example.discover.base.baseadapter.BaseRecyclerAdapter;\nimport com.example.discover.base.baseadapter.BaseViewHolder;\nimport com.example.discover.bean.LitePalBean.LikeVideo;\nimport com.example.discover.databinding.FooterItemVideoBinding;\nimport com.example.discover.databinding.LikeVideoCardBinding;\nimport com.example.discover.utils.DebugUtil;\nimport com.example.discover.utils.IntentManager;\nimport com.example.discover.utils.ShareUtil;\n\nimport cn.jzvd.JZVideoPlayer;\n\n/**\n * Created by monkeyWiiu on 2018/1/5.\n */\n\npublic class LikeVideoRecyclerAdapter extends BaseRecyclerAdapter<LikeVideo> {\n\n\n    private final static int TYPE_CONTENT = 2;\n    private final static int TYPE_FOOTER = 3;\n    private final static int LOAD_MORE = 1;\n    private final static int NO_MORE = 0;\n    private final static int STATE_NORMAL = -1;\n    private int mState = STATE_NORMAL;\n    private FooterItemVideoBinding mFooterBinding;\n\n    public MyDeleteClickListener deleteListener;\n\n    public interface MyDeleteClickListener {\n        void onDelete(int position, int id);\n    }\n\n    public void setOnClickListener(MyDeleteClickListener listener){\n        this.deleteListener = listener;\n    }\n\n    public LikeVideoRecyclerAdapter(Context context) {\n        super(context);\n    }\n\n    @Override\n    public BaseViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {\n        if (viewType == TYPE_CONTENT) {\n            return new LikeVideoHolder(parent, R.layout.like_video_card);\n        } else {\n            return  new FooterHolder(parent, R.layout.footer_item_video);\n        }\n    }\n\n    @Override\n    public int getItemViewType(int position) {\n        if (position + 1 == getItemCount()) {\n            return TYPE_FOOTER;\n        } else {\n            return TYPE_CONTENT;\n        }\n    }\n\n\n\n    public class LikeVideoHolder extends BaseViewHolder<LikeVideo, LikeVideoCardBinding> {\n        public LikeVideoHolder(ViewGroup parent, int layoutId) {\n            super(parent, layoutId);\n        }\n\n        @Override\n        public void fillHolder(LikeVideo likeVideo, int position) {\n            if (likeVideo != null) {\n                itemViewBinding.tvDesc.setText(likeVideo.getDescription());\n                itemViewBinding.jzVideoPlayer.setUp(likeVideo.getPlayUrl(), JZVideoPlayer.SCREEN_WINDOW_NORMAL, likeVideo.getTitle());\n                itemViewBinding.tvLabel.setText(likeVideo.getLabelText());\n                itemViewBinding.cvLabel.setCardBackgroundColor(likeVideo.getLabelColor());\n                Glide.with(mContext).load(likeVideo.getImageUrl())\n                        .crossFade(800)\n                        .placeholder(R.drawable.cross_image)\n                        .error(R.drawable.cross_image)\n                        .into(itemViewBinding.jzVideoPlayer.thumbImageView);\n                /*if (likeVideo.getSize() > 0) {\n                    itemViewBinding.tvVideoSize.setText(\"视频大小\" + likeVideo.getSize() + \"MB\");\n                }*/\n                Glide.with(mContext).load(likeVideo.getAuthorIcon())\n                        .error(R.drawable.cross_image)\n                        .into(itemViewBinding.headIcon);\n            }\n            //设置点击事件\n            setOnClick(itemViewBinding, likeVideo, position, likeVideo.getId());\n        }\n    }\n\n    public class FooterHolder extends BaseViewHolder<Object, FooterItemVideoBinding> {\n        public FooterHolder(ViewGroup parent, int layoutId) {\n            super(parent, layoutId);\n        }\n\n        @Override\n        public void fillHolder(Object object, int position) {\n            mFooterBinding = itemViewBinding;\n            DebugUtil.debug(\"loading11\", \"yun\");\n            //itemViewBinding.loading.show();\n        }\n    }\n\n    public void setOnClick(LikeVideoCardBinding binding, final LikeVideo likeVideo, final int position, final int videoId) {\n        //点击分享\n        final String shareText = likeVideo.getTitle() + likeVideo.getPlayUrl() + mContext.getString(R.string.share_from);\n        binding.ivShare.setOnClickListener(new View.OnClickListener() {\n            @Override\n            public void onClick(View v) {\n                ShareUtil.share(mContext, shareText);\n            }\n        });\n        //点击删除item\n        binding.ivClose.setOnClickListener(new View.OnClickListener() {\n            @Override\n            public void onClick(View v) {\n                deleteListener.onDelete(position, videoId);\n            }\n        });\n        //主页\n        binding.headIcon.setOnClickListener(new View.OnClickListener() {\n            @Override\n            public void onClick(View v) {\n                IntentManager.fromPersonalToAuthor(mContext, likeVideo);\n            }\n        });\n        //点击下载\n    }\n    public void updateStateLoad(boolean loading) {\n\n        if (loading) {\n            this.mState = LOAD_MORE;\n        }else {\n            this.mState = NO_MORE;\n        }\n    }\n\n    public boolean isLoading() {\n        if (this.mState == LOAD_MORE) {\n            return true;\n        } else\n            return false;\n    }\n\n    public void hideLoading() {\n        mFooterBinding.loading.hide();\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/example/discover/adapter/MyFragmentPagerAdapter.java",
    "content": "package com.example.discover.adapter;\n\nimport android.content.Context;\nimport android.support.v4.app.Fragment;\nimport android.support.v4.app.FragmentManager;\nimport android.support.v4.app.FragmentPagerAdapter;\n\nimport java.util.List;\n\n/**\n * Created by Administrator on 2017/12/5 0005.\n */\n\npublic class MyFragmentPagerAdapter extends FragmentPagerAdapter {\n\n    private List<Fragment> mFragmentList;\n    private List<String> mTitleList;\n\n    public MyFragmentPagerAdapter(FragmentManager fm) {\n        super(fm);\n    }\n\n    public MyFragmentPagerAdapter(FragmentManager fm, List<Fragment> list) {\n        super(fm);\n        mFragmentList = list;\n    }\n    public MyFragmentPagerAdapter(FragmentManager fm, List<Fragment> list, List<String> titleList) {\n        super(fm);\n        mFragmentList = list;\n        mTitleList = titleList;\n    }\n\n    @Override\n    public Fragment getItem(int position) {\n        return mFragmentList.get(position);\n    }\n\n    @Override\n    public int getCount() {\n        return mFragmentList.size();\n    }\n\n    @Override\n    public CharSequence getPageTitle(int position) {\n        if (mTitleList != null) {\n            return mTitleList.get(position);\n        } else\n            return \"\";\n    }\n\n}\n"
  },
  {
    "path": "app/src/main/java/com/example/discover/adapter/PopReplyAdapter.java",
    "content": "package com.example.discover.adapter;\n\nimport android.databinding.DataBindingUtil;\nimport android.support.v7.widget.RecyclerView;\nimport android.view.LayoutInflater;\nimport android.view.ViewGroup;\n\nimport com.example.discover.R;\nimport com.example.discover.bean.DetailBean.ReplyList;\nimport com.example.discover.databinding.ItemReplyBinding;\n\nimport java.util.List;\n\n/**\n * Created by monkeyWiiu on 2018/2/1.\n */\n\npublic class PopReplyAdapter extends RecyclerView.Adapter<PopReplyAdapter.Holder> {\n\n    private List<ReplyList> datas;\n\n    public PopReplyAdapter(List<ReplyList> datas) {\n        this.datas = datas;\n    }\n    @Override\n    public Holder onCreateViewHolder(ViewGroup parent, int viewType) {\n        return new Holder(parent, R.layout.item_reply);\n    }\n\n    @Override\n    public void onBindViewHolder(Holder holder, int position) {\n\n        holder.replyBinding.setReply(datas.get(position));\n        holder.replyBinding.executePendingBindings();\n    }\n\n\n    @Override\n    public int getItemCount() {\n        return datas.size();\n    }\n\n    public class Holder extends RecyclerView.ViewHolder {\n        public ItemReplyBinding replyBinding;\n        public Holder(ViewGroup parent, int layoutId) {\n            super(DataBindingUtil.inflate(LayoutInflater.from(parent.getContext()),layoutId, parent, false).getRoot());\n            replyBinding = DataBindingUtil.getBinding(itemView);\n        }\n\n\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/example/discover/adapter/ReplyAdapter.java",
    "content": "package com.example.discover.adapter;\n\nimport android.databinding.DataBindingUtil;\nimport android.support.v7.widget.RecyclerView;\nimport android.text.format.DateUtils;\nimport android.view.LayoutInflater;\nimport android.view.View;\nimport android.view.ViewGroup;\nimport android.widget.ImageView;\nimport android.widget.TextView;\n\nimport com.bumptech.glide.Glide;\nimport com.example.discover.R;\nimport com.example.discover.bean.DetailBean.ReplyList;\nimport com.example.discover.databinding.ItemReplyBinding;\n\nimport java.util.List;\n\n/**\n * Created by monkeyWiiu on 2018/1/30.\n */\n\npublic class ReplyAdapter extends RecyclerView.Adapter {\n\n    private final static int HEADER = 0;\n    private final static int REPLY = 1;\n\n    private View description;\n    private List<ReplyList> datas;\n\n\n    public ReplyAdapter(List<ReplyList> data, View description) {\n        datas = data;\n        this.description = description;\n    }\n    @Override\n    public int getItemViewType(int position) {\n        if (position == 0) {\n            return HEADER;\n        } else\n            return REPLY;\n    }\n\n    @Override\n    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {\n        switch (viewType) {\n            case HEADER:\n                return new SimpleViewHolder(description);\n\n            case REPLY:\n\n                return new Holder(parent, R.layout.item_reply);\n            default:\n                return null;\n        }\n    }\n\n    @Override\n    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {\n\n        if (getItemViewType(position) == REPLY) {\n\n            Holder replyHolder = (Holder)holder;\n            replyHolder.replyBinding.setReply(datas.get(position -1));\n            replyHolder.replyBinding.executePendingBindings();\n        }\n    }\n\n    @Override\n    public int getItemCount() {\n        int count = 1;\n        if (datas.size() > 0) count += datas.size();\n        return count;\n    }\n\n    public class Holder extends RecyclerView.ViewHolder {\n        public ItemReplyBinding replyBinding;\n        public Holder(ViewGroup parent, int layoutId) {\n            super(DataBindingUtil.inflate(LayoutInflater.from(parent.getContext()),layoutId, parent, false).getRoot());\n            replyBinding = DataBindingUtil.getBinding(itemView);\n        }\n\n\n    }\n\n    static class SimpleViewHolder extends RecyclerView.ViewHolder {\n\n        public SimpleViewHolder(View itemView) {\n            super(itemView);\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/example/discover/adapter/ResultAdapter.java",
    "content": "package com.example.discover.adapter;\n\nimport android.app.Activity;\nimport android.app.ActivityOptions;\nimport android.content.Context;\nimport android.content.Intent;\nimport android.databinding.DataBindingUtil;\nimport android.support.v7.widget.RecyclerView;\nimport android.util.Pair;\nimport android.view.LayoutInflater;\nimport android.view.View;\nimport android.view.ViewGroup;\nimport android.widget.FrameLayout;\nimport android.widget.RelativeLayout;\nimport android.widget.TextView;\n\nimport com.bumptech.glide.Glide;\nimport com.bumptech.glide.load.engine.DiskCacheStrategy;\nimport com.example.discover.R;\nimport com.example.discover.VideoDetailActivity;\nimport com.example.discover.bean.DetailBean.ItemList;\nimport com.example.discover.databinding.CategoryCardBinding;\nimport com.example.discover.utils.DebugUtil;\nimport com.example.discover.utils.DensityUtil;\nimport com.example.discover.utils.IntentManager;\nimport com.jakewharton.rxbinding2.view.RxView;\n\nimport java.util.ArrayList;\nimport java.util.List;\nimport java.util.concurrent.TimeUnit;\nimport java.util.zip.Inflater;\n\nimport io.reactivex.functions.Consumer;\n\n/**\n * Created by monkeyWiiu on 2018/1/29.\n */\n\npublic class ResultAdapter extends RecyclerView.Adapter<ResultAdapter.Holder> {\n\n    private List<ItemList> lists ;\n    private Activity mContext;\n\n    public ResultAdapter(Activity context, List<ItemList> lists) {\n        this.mContext = context;\n        this.lists = lists;\n    }\n    @Override\n    public Holder onCreateViewHolder(ViewGroup parent, int viewType) {\n        return new Holder(parent, R.layout.category_card);\n    }\n\n    @Override\n    public void onBindViewHolder(final Holder holder, final int position) {\n        holder.itemViewBinding.setItemList(lists.get(position));\n        //当数据改变时，binding会在下一帧去改变数据，如果我们需要立即改变，就去调用executePendingBindings方法。\n        holder.itemViewBinding.executePendingBindings();\n\n        RxView.clicks(holder.itemViewBinding.videoAlbum)\n                .throttleFirst(1, TimeUnit.SECONDS)\n                .subscribe(new Consumer<Object>() {\n                    @Override\n                    public void accept(Object o) throws Exception {\n\n                        IntentManager.toVideoDetailActivity(mContext, lists.get(position), holder.itemViewBinding.videoAlbum);\n                    }\n                });\n    }\n\n    @Override\n    public int getItemCount() {\n        return lists.size();\n    }\n\n    public class Holder extends RecyclerView.ViewHolder {\n\n       private CategoryCardBinding itemViewBinding;\n\n       private Holder(ViewGroup parent, int layoutId) {\n\n            super(DataBindingUtil.inflate(LayoutInflater.from(parent.getContext()),layoutId, parent, false).getRoot());\n            itemViewBinding = DataBindingUtil.getBinding(itemView);\n            RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, DensityUtil.dip2px(200));\n            itemViewBinding.videoAlbum.setLayoutParams(layoutParams);\n\n           DebugUtil.debug(\"rerere\", \"bbb\");\n        }\n    }\n\n\n\n}\n\n\n"
  },
  {
    "path": "app/src/main/java/com/example/discover/adapter/SearchRecyclerAdapter.java",
    "content": "package com.example.discover.adapter;\n\nimport android.content.Context;\nimport android.view.ViewGroup;\n\nimport com.example.discover.R;\nimport com.example.discover.base.baseadapter.BaseRecyclerAdapter;\nimport com.example.discover.base.baseadapter.BaseViewHolder;\nimport com.example.discover.bean.DetailBean.ItemList;\nimport com.example.discover.bean.DetailBean.SectionList;\nimport com.example.discover.databinding.RecommendAuthorBinding;\nimport com.example.discover.databinding.RecommendCategoryBinding;\nimport com.example.discover.utils.DebugUtil;\n\nimport java.util.List;\n\n/**\n * Created by monkeyWiiu on 2018/1/18.\n */\n\npublic class SearchRecyclerAdapter extends BaseRecyclerAdapter<Object> {\n\n    private static int TYPE_AUTHOR = 0;\n    private static int TYPE_CATEGORY = 1;\n\n    public SearchRecyclerAdapter(Context context) {\n        super(context);\n    }\n\n\n    @Override\n    public BaseViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {\n        if (viewType == TYPE_AUTHOR) {\n            return new AuthorBindingHolder(parent, R.layout.recommend_author);\n        } else if (viewType == TYPE_CATEGORY) {\n            return new CategoryBindingHolder(parent, R.layout.recommend_category);\n        } else {\n            return null;\n        }\n    }\n\n    @Override\n    public int getItemViewType(int position) {\n        if (position == 0) {\n            return  TYPE_AUTHOR;\n        } else {\n            return TYPE_CATEGORY;\n        }\n    }\n\n\n    public class AuthorBindingHolder extends BaseViewHolder<List<ItemList>, RecommendAuthorBinding>{\n        public AuthorBindingHolder(ViewGroup parent, int layoutId) {\n            super(parent, layoutId);\n        }\n\n        @Override\n        public void fillHolder(List<ItemList> object, int position) {\n\n            DebugUtil.debug(\"objjt\", object.size() + \"\");\n            itemViewBinding.setData(object);\n        }\n    }\n\n    public class CategoryBindingHolder extends BaseViewHolder<SectionList, RecommendCategoryBinding> {\n        private CategoryBindingHolder(ViewGroup parent, int layoutId) {\n            super(parent, layoutId);\n        }\n\n        @Override\n        public void fillHolder(SectionList object, int position) {\n\n            if (object.getItemList().size() > 0) {\n                itemViewBinding.tvCategory.setText(object.getItemList().get(0).getData().getCategory());\n            }\n            itemViewBinding.setData(object.getItemList());\n        }\n\n    }\n\n\n\n    @Override\n    public int getItemCount() {\n        return mData.size();\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/example/discover/adapter/SearchTagAdapter.java",
    "content": "package com.example.discover.adapter;\n\nimport android.content.Context;\nimport android.content.Intent;\nimport android.view.View;\nimport android.view.ViewGroup;\nimport android.widget.Toast;\n\nimport com.example.discover.R;\nimport com.example.discover.ResultActivity;\nimport com.example.discover.SearchActivity;\nimport com.example.discover.base.baseadapter.BaseRecyclerAdapter;\nimport com.example.discover.base.baseadapter.BaseViewHolder;\nimport com.example.discover.bean.DetailBean.Data;\nimport com.example.discover.bean.LitePalBean.SearchTag;\nimport com.example.discover.databinding.SearchTagBinding;\nimport com.example.discover.databinding.TagHeaderNewBinding;\nimport com.example.discover.databinding.TagHeaderRecoBinding;\nimport com.example.discover.utils.DebugUtil;\nimport com.zhy.view.flowlayout.TagFlowLayout;\n\nimport org.litepal.crud.DataSupport;\n\nimport java.util.List;\n\n/**\n * Created by monkeyWiiu on 2018/1/28.\n */\n\npublic class SearchTagAdapter extends BaseRecyclerAdapter<String> {\n\n    private static int HEADER_ONE = 0;\n    private static int HEADER_TWO = 1;\n    private static int TAG = 3;\n    private onItemClickListener itemClickListener;\n    public interface onItemClickListener {\n        void onItemClick(String s);\n    }\n\n    public void setItemClickListener(onItemClickListener listener) {\n        this.itemClickListener = listener;\n    }\n    public SearchTagAdapter(Context context) {\n        super(context);\n    }\n\n    @Override\n    public int getItemViewType(int position) {\n        if (\"new\".equals(mData.get(position))) {\n            return HEADER_ONE;\n        } else if (\"recommend\".equals(mData.get(position))) {\n            return HEADER_TWO;\n        }else {\n            return TAG;\n        }\n    }\n\n    @Override\n    public BaseViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {\n        if (viewType == HEADER_ONE) {\n            return new HeaderOneHolder(parent, R.layout.tag_header_new);\n        } else if (viewType == TAG) {\n            return new SearchTagHolder(parent, R.layout.search_tag);\n        } else if (viewType == HEADER_TWO) {\n            return new HeaderTwoHolder(parent, R.layout.tag_header_reco);\n        }\n        return null;\n    }\n\n    public class HeaderOneHolder extends BaseViewHolder<Object, TagHeaderNewBinding> {\n        private HeaderOneHolder(ViewGroup parent, int layoutId) {\n            super(parent, layoutId);\n        }\n\n        @Override\n        public void fillHolder(Object object, int position) {\n\n        }\n    }\n\n    public class HeaderTwoHolder extends BaseViewHolder<Object, TagHeaderRecoBinding> {\n\n        private HeaderTwoHolder(ViewGroup parent, int layoutId) {\n            super(parent, layoutId);\n        }\n\n        @Override\n        public void fillHolder(Object object, int position) {\n\n        }\n    }\n\n    public class SearchTagHolder extends BaseViewHolder<String, SearchTagBinding> {\n\n        private SearchTagHolder(ViewGroup parent, int layoutId) {\n            super(parent, layoutId);\n        }\n\n        @Override\n        public void fillHolder(final String object, final int position) {\n            itemViewBinding.tvTag.setText(object);\n\n            if (position < DataSupport.count(SearchTag.class) + 1) {\n                DebugUtil.debug(\"tagposition\", position + \"//\" + object);\n                itemViewBinding.delete.setVisibility(View.VISIBLE);\n                itemViewBinding.delete.setOnClickListener(new View.OnClickListener() {\n                    @Override\n                    public void onClick(View v) {\n\n                        delete(position);\n                        DataSupport.deleteAll(SearchTag.class, \"tag = ?\", object);\n                        if (DataSupport.count(SearchTag.class) == 0) {\n                            delete(0);\n                        }\n                    }\n                });\n            } else {\n                itemViewBinding.delete.setVisibility(View.GONE);\n            }\n\n            itemViewBinding.itemTag.setOnClickListener(new View.OnClickListener() {\n                @Override\n                public void onClick(View v) {\n\n                    itemClickListener.onItemClick(object);\n\n                }\n            });\n        }\n\n    }\n\n\n    @Override\n    public int getItemCount() {\n        return mData.size();\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/example/discover/adapter/SelectTypeRecyclerAdapter.java",
    "content": "package com.example.discover.adapter;\n\nimport android.content.Context;\nimport android.support.v7.widget.CardView;\nimport android.support.v7.widget.RecyclerView;\nimport android.view.LayoutInflater;\nimport android.view.View;\nimport android.view.ViewGroup;\nimport android.widget.TextView;\n\nimport com.example.discover.R;\nimport com.example.discover.app.Constant;\nimport com.example.discover.view.CustomView.LabelView;\n\nimport java.util.List;\n\n/**\n * Created by monkeyWiiu on 2018/1/13.\n */\n\npublic class SelectTypeRecyclerAdapter extends RecyclerView.Adapter<SelectTypeRecyclerAdapter.MyViewHolder> {\n\n    private List<String> mLabelList;\n    private Context mContext;\n\n    private ItemClickListener mListener;\n    public interface ItemClickListener {\n        void onLongItemLClick(int position);\n    }\n\n    public void setItemCLickListener(ItemClickListener listener) {\n        this.mListener = listener;\n    }\n\n    public SelectTypeRecyclerAdapter(List<String> list, Context context) {\n        this.mLabelList = list;\n        mContext = context;\n    }\n    @Override\n    public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {\n        View view = LayoutInflater.from(mContext).inflate(R.layout.select_label_view, parent, false);\n        MyViewHolder viewHolder = new MyViewHolder(view);\n        return viewHolder;\n    }\n\n    @Override\n    public void onBindViewHolder(MyViewHolder holder, final int position) {\n        holder.labelView.setCardBackgroundColor((int) Constant.LabelMap.get(mLabelList.get(position)));\n        holder.textLabel.setText(mLabelList.get(position));\n        holder.labelView.setOnLongClickListener(new View.OnLongClickListener() {\n            @Override\n            public boolean onLongClick(View v) {\n                mListener.onLongItemLClick(position);\n                return false;\n            }\n        });\n    }\n\n    @Override\n    public int getItemCount() {\n        return mLabelList.size();\n    }\n\n    /**\n     * 拖拽移位\n     *\n     */\n    /*@Override\n    public void onItemMove(int fromPosition, int toPosition) {\n\n        String prev = mLabelList.remove(fromPosition);\n        mLabelList.add(toPosition > fromPosition ? toPosition - 1 : toPosition, prev);\n        notifyItemMoved(fromPosition, toPosition);\n\n    }\n\n    @Override\n    public void onItemDismiss(int position) {\n\n    }*/\n\n    public class MyViewHolder extends RecyclerView.ViewHolder {\n\n        private TextView textLabel;\n        private CardView labelView;\n        public MyViewHolder(View itemView) {\n            super(itemView);\n            textLabel = itemView.findViewById(R.id.tv_label);\n            labelView = itemView.findViewById(R.id.cv_select_label);\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/example/discover/adapter/VideoRecyclerAdapter.java",
    "content": "package com.example.discover.adapter;\n\nimport android.content.Context;\nimport android.view.View;\nimport android.view.ViewGroup;\nimport android.widget.LinearLayout;\n\n\nimport com.bumptech.glide.Glide;\nimport com.example.discover.R;\nimport com.example.discover.app.Constant;\nimport com.example.discover.base.baseadapter.BaseRecyclerAdapter;\nimport com.example.discover.base.baseadapter.BaseViewHolder;\nimport com.example.discover.bean.DetailBean.ItemList;\nimport com.example.discover.databinding.FooterItemVideoBinding;\nimport com.example.discover.databinding.VideoCardBinding;\nimport com.example.discover.model.HotVideoModel;\nimport com.example.discover.utils.DebugUtil;\nimport com.example.discover.utils.DensityUtil;\nimport com.example.discover.utils.IntentManager;\nimport com.example.discover.utils.LitePalUtil;\nimport com.example.discover.utils.ShareUtil;\nimport com.example.discover.view.CustomView.ReplyPopupWindow;\nimport com.jakewharton.rxbinding2.view.RxView;\n\nimport java.util.LinkedHashMap;\nimport java.util.concurrent.TimeUnit;\n\nimport cn.jzvd.JZVideoPlayer;\nimport cn.jzvd.JZVideoPlayerStandard;\nimport io.reactivex.functions.Consumer;\n\n/**\n * Created by Administrator on 2017/12/14 0014.\n */\n\npublic class VideoRecyclerAdapter extends BaseRecyclerAdapter<ItemList> {\n    private boolean isAuthor = false;\n    private int LOAD_MORE = 1;\n    private final static int NO_MORE = 0;\n    private final static int STATE_NORMAL = -1;\n    private final static int TYPE_FOOTER = 3;\n    private final static int TYPE_CONTENT = 2;\n    private  int mState = STATE_NORMAL;\n    private int width = DensityUtil.getScreenWidth(mContext);//屏宽\n    private FooterItemVideoBinding mFooterBinding;\n\n    public VideoRecyclerAdapter(Context context) {\n        super(context);\n    }\n\n    public void setAuthor(boolean isAuthor) {\n        this.isAuthor = isAuthor;\n    }\n    @Override\n    public BaseViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {\n        if (viewType == TYPE_CONTENT) {\n            return new VideoHolder(parent, R.layout.video_card);\n        }else {\n            return new FooterHolder(parent, R.layout.footer_item_video);\n        }\n    }\n\n    @Override\n    public int getItemViewType(int position) {\n\n        if (position + 1 == getItemCount()) {\n            DebugUtil.debug(\"footer\", \"true\");\n            return TYPE_FOOTER;\n        } else {\n            return TYPE_CONTENT;\n        }\n\n    }\n\n    public void updateStateLoad(boolean loading) {\n        if (loading) {\n            this.mState = LOAD_MORE;\n        }else {\n            this.mState = NO_MORE;\n        }\n    }\n\n    public boolean isLoading() {\n        if (this.mState == LOAD_MORE) {\n            return true;\n        } else\n            return false;\n    }\n\n    public void hideLoading() {\n        mFooterBinding.loading.hide();\n    }\n\n    public class VideoHolder extends BaseViewHolder<ItemList, VideoCardBinding> {\n        private VideoHolder(ViewGroup parent, int layoutId) {\n            super(parent, layoutId);\n        }\n        @Override\n        public void fillHolder(final ItemList list, final int position) {\n            //填充基础数据\n            //int videoSize = 0;\n            itemViewBinding.videoTitle.setText(list.getData().getTitle());\n            itemViewBinding.videoDesc.setText(list.getData().getDescription());\n            if (list.getData().getCover() != null) {\n                Glide.with(mContext).load(list.getData().getCover().getDetail())\n                        .crossFade(800)\n                        .placeholder(R.drawable.cross_image)\n                        .error(R.drawable.cross_image)\n                        .into(itemViewBinding.jzVideoPlayer.thumbImageView);\n            }\n\n            if (!isAuthor && list.getData().getAuthor() != null) {\n                Glide.with(mContext).load(list.getData().getAuthor().getIcon())\n                        .error(R.drawable.cross_image)\n                        .into(itemViewBinding.headIcon);\n            } else {\n                itemViewBinding.headIcon.setVisibility(View.GONE);\n            }\n            itemViewBinding.tvLabel.setText(list.getData().getCategory());\n            itemViewBinding.cvLabel.setCardBackgroundColor((int)Constant.LabelMap.get(list.getData().getCategory()));\n            //填充播放链接，playinfo有时候没有，playurl常有\n            if (list.getData().getPlayinfo().size() > 0) {\n                //设置窗口比列\n                int x = list.getData().getPlayinfo().get(0).getWidth();//获取视频的width\n                int y = list.getData().getPlayinfo().get(0).getHeight();//获取视频的height\n                int height = width * y / x; //根据视频比列获得视频控件的高\n                LinearLayout.LayoutParams layoutParams =  new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, height);\n                itemViewBinding.jzVideoPlayer.setLayoutParams(layoutParams);\n\n                //videoSize = list.getData().getPlayinfo().get(0).getUrlList().get(2).getSize()/1024/1024;\n                //itemViewBinding.tvVideoSize.setText(\"视频大小约\" + videoSize+ \"MB\");\n\n\n                if (list.getData().getPlayinfo().size() == 1) { //标清||高清\n\n                    itemViewBinding.jzVideoPlayer.setUp(list.getData().getPlayinfo().get(0).getUrlList().get(2).getUrl(),\n                            JZVideoPlayer.SCREEN_WINDOW_NORMAL, \"\");\n                } else if (list.getData().getPlayinfo().size() > 1) { //标清&&高清\n\n                    LinkedHashMap map = new LinkedHashMap();\n                    Object[] objects = new Object[1];\n                    for (int i = 0; i < list.getData().getPlayinfo().size(); i ++) {\n                        map.put(list.getData().getPlayinfo().get(i).getName(),\n                                list.getData().getPlayinfo().get(i).getUrlList().get(2).getUrl());\n                    }\n                    objects[0] = map;\n                    itemViewBinding.jzVideoPlayer.setUp(objects , 0,\n                            JZVideoPlayerStandard.SCREEN_WINDOW_NORMAL, \"\");\n                }\n            } else {    //防止playinfo没有数据时播放地址无效\n\n                if (list.getData().getPlayUrl() != null) {\n\n                    itemViewBinding.jzVideoPlayer.setUp(list.getData().getPlayUrl(), JZVideoPlayer.SCREEN_WINDOW_NORMAL, \"\");\n                }\n            }\n\n            if (\"true\".equals(list.getTag())) {\n                itemViewBinding.ivCollect.setImageDrawable(mContext.getResources().getDrawable(R.drawable.collected));\n            } else if (list.getTag() == null) {\n                itemViewBinding.ivCollect.setImageDrawable(mContext.getResources().getDrawable(R.drawable.collect));\n            }\n            //设置点击事件\n            setOnClick(list, itemViewBinding, position, 0);\n\n        }\n    }\n\n    public class FooterHolder extends BaseViewHolder<Object, FooterItemVideoBinding> {\n        public FooterHolder(ViewGroup parent, int layoutId) {\n            super(parent, layoutId);\n        }\n\n        @Override\n        public void fillHolder(Object object, int position) {\n            DebugUtil.debug(\"loadingm\", \"11\");\n            mFooterBinding = itemViewBinding;\n            itemViewBinding.loading.show();\n        }\n    }\n\n    private void setOnClick(final ItemList list, final VideoCardBinding binding, final int position, final int vSize) {\n\n        boolean isCollect = false;\n        final String shareText = list.getData().getTitle() + list.getData().getWebUrl().getForWeibo() + mContext.getString(R.string.share_from);\n        //点击分享 RXVIEW\n        binding.ivShare.setOnClickListener(new View.OnClickListener() {\n            @Override\n            public void onClick(View v) {\n\n                ShareUtil.share(mContext, shareText);\n            }\n        });\n\n        //展开评论\n        RxView.clicks(binding.ivComment)\n                .throttleFirst(1, TimeUnit.SECONDS)\n                .subscribe(new Consumer<Object>() {\n                    @Override\n                    public void accept(Object o) throws Exception {\n                        ReplyPopupWindow replyPopupWindow = new ReplyPopupWindow(mContext, list.getData().getId());\n                        replyPopupWindow.showPopupWindow(binding.ivComment);\n                    }\n                });\n        //点击收藏\n        binding.ivCollect.setOnClickListener(new View.OnClickListener() {\n            @Override\n            public void onClick(View v) {\n\n                binding.ivCollect.setImageDrawable(mContext.getResources().getDrawable(R.drawable.collect));\n                if (list.getTag() == null) {\n\n                    binding.ivCollect.setImageDrawable(mContext.getResources().getDrawable(R.drawable.collected));\n                    //存入数据库\n                    LitePalUtil.addVideoToFavor(list.getData().getId(), list.getData().getTitle(), list.getData().getDescription(),\n                           list.getData().getPlayUrl(), list.getData().getCover().getDetail(), list.getData().getAuthor().getName(),\n                            list.getData().getAuthor().getId(), list.getData().getAuthor().getIcon(), list.getData().getAuthor().getDescription(),\n                            (int)Constant.LabelMap.get(list.getData().getCategory()), list.getData().getCategory(), vSize);\n                    list.setTag(\"true\");\n                } else  if (\"true\".equals(list.getTag())) {\n\n                    binding.ivCollect.setImageDrawable(mContext.getResources().getDrawable(R.drawable.collect));\n                    LitePalUtil.deleteVideoFromFavor(list.getData().getId());\n                    list.setTag(null);\n                }\n            }\n        });\n        //跳转主页\n        RxView.clicks(binding.headIcon)\n                .throttleFirst(1, TimeUnit.SECONDS)\n                .subscribe(new Consumer<Object>() {\n                    @Override\n                    public void accept(Object o) throws Exception {\n                        IntentManager.fromDetailtoAuthor(mContext, list);\n                    }\n                });\n    }\n\n}\n"
  },
  {
    "path": "app/src/main/java/com/example/discover/adapter/WelfareAdapter.java",
    "content": "package com.example.discover.adapter;\n\nimport android.content.Context;\nimport android.support.v7.widget.RecyclerView;\nimport android.support.v7.widget.StaggeredGridLayoutManager;\nimport android.view.View;\nimport android.view.ViewGroup;\n\nimport com.example.discover.R;\nimport com.example.discover.base.baseadapter.BaseRecyclerAdapter;\nimport com.example.discover.base.baseadapter.BaseViewHolder;\nimport com.example.discover.bean.GankBean;\nimport com.example.discover.databinding.FooterItemVideoBinding;\nimport com.example.discover.databinding.ItemWelfareBinding;\nimport com.example.discover.utils.DebugUtil;\n\n/**\n * Created by monkeyWiiu on 2018/2/3.\n */\n\npublic class WelfareAdapter extends BaseRecyclerAdapter<GankBean.ResultBean> {\n\n    private int LOAD_MORE = 1;\n    private final static int TYPE_FOOTER = 3;\n    private final static int TYPE_CONTENT = 2;\n    private final static int STATE_NORMAL = -1;\n    private final static int NO_MORE = 0;\n    private  int mState = STATE_NORMAL;\n    private FooterItemVideoBinding mFooterBinding;\n\n    public WelfareAdapter(Context context) {\n        super(context);\n    }\n\n    @Override\n    public int getItemViewType(int position) {\n\n        if (position + 1 == getItemCount()) {\n            DebugUtil.debug(\"footer\", \"true\");\n            return TYPE_FOOTER;\n        } else {\n            return TYPE_CONTENT;\n        }\n\n    }\n    @Override\n    public BaseViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {\n        if (viewType == TYPE_CONTENT) {\n            return new ContentHolder(parent, R.layout.item_welfare);\n        }else {\n            return new FooterHolder(parent, R.layout.footer_item_video);\n        }\n    }\n\n    public class ContentHolder extends BaseViewHolder<GankBean.ResultBean, ItemWelfareBinding> {\n        public ContentHolder(ViewGroup parent, int layoutId) {\n            super(parent, layoutId);\n        }\n\n        @Override\n        public void fillHolder(final GankBean.ResultBean object, final int position) {\n            itemViewBinding.setData(object);\n            itemViewBinding.executePendingBindings();\n            itemView.setOnClickListener(new View.OnClickListener() {\n                @Override\n                public void onClick(View v) {\n                    if (listener != null) {\n                        listener.onClick(itemViewBinding.ivWelfare, object, position);\n                    }\n\n                }\n            });\n        }\n    }\n\n    public class FooterHolder extends BaseViewHolder<Object, FooterItemVideoBinding> {\n        public FooterHolder(ViewGroup parent, int layoutId) {\n            super(parent, layoutId);\n        }\n\n        @Override\n        public void fillHolder(Object object, int position) {\n            DebugUtil.debug(\"loadingm\", \"11\");\n            mFooterBinding = itemViewBinding;\n            itemViewBinding.loading.show();\n        }\n    }\n\n    public boolean isLoading() {\n        if (this.mState == LOAD_MORE) {\n            return true;\n        } else\n            return false;\n    }\n\n    public void hideLoading() {\n        mFooterBinding.loading.hide();\n    }\n\n    public void updateStateLoad(boolean loading) {\n        if (loading) {\n            this.mState = LOAD_MORE;\n        }else {\n            this.mState = NO_MORE;\n        }\n    }\n\n    @Override\n    public void onViewAttachedToWindow(BaseViewHolder holder) {\n        super.onViewAttachedToWindow(holder);\n        if (isStaggeredGridLayout(holder)) {\n            handleLayoutIfStaggeredGridLayout(holder, holder.getLayoutPosition());\n        }\n    }\n\n    private boolean isStaggeredGridLayout(RecyclerView.ViewHolder holder) {\n        ViewGroup.LayoutParams layoutParams = holder.itemView.getLayoutParams();\n        if (layoutParams != null && layoutParams instanceof StaggeredGridLayoutManager.LayoutParams) {\n            return true;\n        }\n        return false;\n    }\n\n    protected void handleLayoutIfStaggeredGridLayout(RecyclerView.ViewHolder holder, int position) {\n        if (isFooter(position)) {\n            StaggeredGridLayoutManager.LayoutParams p = (StaggeredGridLayoutManager.LayoutParams) holder.itemView.getLayoutParams();\n            p.setFullSpan(true);\n        }\n    }\n\n    public boolean isFooter(int position) {\n        if (position + 1 == getItemCount()) {\n            DebugUtil.debug(\"footer\", \"true\");\n            return  true;\n        } else\n            return false;\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/example/discover/app/Constant.java",
    "content": "package com.example.discover.app;\n\nimport com.example.discover.R;\n\nimport java.util.ArrayList;\nimport java.util.HashMap;\nimport java.util.LinkedHashMap;\nimport java.util.List;\n\n/**\n * Created by Administrator on 2017/12/12 0012.\n */\n\npublic class Constant {\n\n\n    public static final String EYE_VIDEO = \"eye_video\";\n    public static final String EYE_FIND = \"eye_find\";\n    public static final String GANK_WELFARE = \"gank_welfare\";\n    public static final HashMap LabelMap = new HashMap() {{\n        put(\"萌宠\", DiscoverApplication.getDiscoverApplication().getBaseContext().getResources().getColor(R.color.colorLabelCre));\n        put(\"搞笑\", DiscoverApplication.getDiscoverApplication().getBaseContext().getResources().getColor(R.color.colorLabelMusic));\n        put(\"游戏\", DiscoverApplication.getDiscoverApplication().getBaseContext().getResources().getColor(R.color.colorLabelTravel));\n        put(\"科普\", DiscoverApplication.getDiscoverApplication().getBaseContext().getResources().getColor(R.color.colorLabelScience));\n        put(\"集锦\", DiscoverApplication.getDiscoverApplication().getBaseContext().getResources().getColor(R.color.colorLabelFunny));\n        put(\"生活\", DiscoverApplication.getDiscoverApplication().getBaseContext().getResources().getColor(R.color.colorLabelFashion));\n        put(\"综艺\", DiscoverApplication.getDiscoverApplication().getBaseContext().getResources().getColor(R.color.colorLabelSport));\n        put(\"开胃\", DiscoverApplication.getDiscoverApplication().getBaseContext().getResources().getColor(R.color.colorLabelAnim));\n        put(\"预告\", DiscoverApplication.getDiscoverApplication().getBaseContext().getResources().getColor(R.color.colorLabelAd));\n        put(\"广告\", DiscoverApplication.getDiscoverApplication().getBaseContext().getResources().getColor(R.color.colorLabelAppetizing));\n        put(\"记录\", DiscoverApplication.getDiscoverApplication().getBaseContext().getResources().getColor(R.color.colorLabelLife));\n        put(\"时尚\", DiscoverApplication.getDiscoverApplication().getBaseContext().getResources().getColor(R.color.colorLabelDrama));\n        put(\"创意\", DiscoverApplication.getDiscoverApplication().getBaseContext().getResources().getColor(R.color.colorLabelNotice));\n        put(\"运动\", DiscoverApplication.getDiscoverApplication().getBaseContext().getResources().getColor(R.color.colorLabelVariety));\n        put(\"旅行\", DiscoverApplication.getDiscoverApplication().getBaseContext().getResources().getColor(R.color.colorLabelRecord));\n        put(\"剧情\", DiscoverApplication.getDiscoverApplication().getBaseContext().getResources().getColor(R.color.colorLabelGame));\n        put(\"动画\", DiscoverApplication.getDiscoverApplication().getBaseContext().getResources().getColor(R.color.colorLabelPet));\n        put(\"音乐\", DiscoverApplication.getDiscoverApplication().getBaseContext().getResources().getColor(R.color.colorLabelVariety));\n    }};\n\n    public static final List<String> videoTypeList = new ArrayList<String>() {{\n        add(\"萌宠\");\n        add(\"搞笑\");\n        add(\"游戏\");\n        add(\"科普\");\n        add(\"集锦\");\n        add(\"生活\");\n        add(\"综艺\");\n        add(\"开胃\");\n        add(\"预告\");\n        add(\"广告\");\n        add(\"记录\");\n        add(\"时尚\");\n        add(\"创意\");\n        add(\"运动\");\n        add(\"旅行\");\n        add(\"剧情\");\n        add(\"动画\");\n        add(\"音乐\");\n\n    }};\n\n}\n"
  },
  {
    "path": "app/src/main/java/com/example/discover/app/DiscoverApplication.java",
    "content": "package com.example.discover.app;\n\nimport android.app.Application;\nimport android.content.Context;\n\nimport com.example.discover.utils.DebugUtil;\nimport com.example.http.HttpUtils;\nimport com.squareup.haha.perflib.Instance;\nimport com.squareup.leakcanary.LeakCanary;\nimport com.squareup.leakcanary.RefWatcher;\n\nimport org.litepal.LitePal;\n\n/**\n * Created by Administrator on 2017/12/9 0009.\n */\n\npublic class DiscoverApplication extends Application {\n    private static DiscoverApplication discoverApplication;\n\n    private RefWatcher refWatcher;\n    public static DiscoverApplication getDiscoverApplication() {\n        return discoverApplication;\n    }\n    \n    @Override\n    public void onCreate() {\n        super.onCreate();\n        LitePal.initialize(this);\n        discoverApplication = this;\n        HttpUtils.getInstance().init(this, DebugUtil.DEBUG);\n        refWatcher = LeakCanary.install(this);\n    }\n\n    public static RefWatcher getRefWatcher(Context context) {\n\n        DiscoverApplication application = (DiscoverApplication) context.getApplicationContext();\n        return application.refWatcher;\n    }\n\n\n\n}\n"
  },
  {
    "path": "app/src/main/java/com/example/discover/base/BaseFragment.java",
    "content": "package com.example.discover.base;\n\nimport android.databinding.DataBindingUtil;\nimport android.databinding.ViewDataBinding;\nimport android.os.Bundle;\nimport android.support.annotation.Nullable;\nimport android.support.v4.app.Fragment;\nimport android.view.LayoutInflater;\nimport android.view.View;\nimport android.view.ViewGroup;\nimport android.widget.RelativeLayout;\n\nimport com.example.discover.R;\nimport com.jakewharton.rxbinding2.view.RxView;\nimport com.trello.rxlifecycle2.components.support.RxFragment;\nimport com.wang.avi.AVLoadingIndicatorView;\n\nimport java.util.concurrent.TimeUnit;\n\nimport io.reactivex.disposables.CompositeDisposable;\nimport io.reactivex.functions.Consumer;\n\n\n/**\n * Created by Administrator on 2017/12/5 0005.\n */\n\npublic abstract class BaseFragment<SV extends ViewDataBinding> extends RxFragment {\n\n    public SV bindingView;\n    public RelativeLayout container;\n    public AVLoadingIndicatorView avLoading;\n    private RelativeLayout rlLoading;\n    private RelativeLayout rlError;\n    public boolean isVisibile = false;\n    @Nullable\n    @Override\n    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {\n        View ll = inflater.inflate(R.layout.fragment_base, null);\n        bindingView = DataBindingUtil.inflate(getActivity().getLayoutInflater(), setContentView(), null, false);\n        RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT, RelativeLayout.LayoutParams.MATCH_PARENT);\n        bindingView.getRoot().setLayoutParams(params);\n        container = ll.findViewById(R.id.container);\n        container.addView(bindingView.getRoot());\n        return ll;\n    }\n\n    @Override\n    public void setUserVisibleHint(boolean isVisibleToUser) {\n        super.setUserVisibleHint(isVisibleToUser);\n        if (getUserVisibleHint()) {\n            isVisibile = true;\n            onVisible();\n        } else {\n            isVisibile = false;\n        }\n    }\n\n    @Override\n    public void onActivityCreated(@Nullable Bundle savedInstanceState) {\n        super.onActivityCreated(savedInstanceState);\n        avLoading = (AVLoadingIndicatorView) getView(R.id.av_loading);\n        rlLoading = (RelativeLayout) getView(R.id.rl_loading);\n        rlError = (RelativeLayout) getView(R.id.rl_error);\n        showLoading();\n        RxView.clicks(rlError)\n                .throttleFirst(1, TimeUnit.SECONDS)\n                .subscribe(new Consumer<Object>() {\n                    @Override\n                    public void accept(Object o) throws Exception {\n                        Refresh();\n                    }\n                });\n\n    }\n\n    public View getView(int id) {\n        return getView().findViewById(id);\n    }\n\n    public void onVisible() {\n        loadData();\n    }\n    public void onInvisible(){}\n    protected void loadData(){};\n    public abstract int setContentView();\n\n\n\n    @Override\n    public void onDestroy() {\n        super.onDestroy();\n    }\n\n    /**\n     * 加载中的状态\n     */\n    protected void showLoading() {\n        if (rlLoading.getVisibility() == View.GONE) {\n            rlLoading.setVisibility(View.VISIBLE);\n        }\n        if (rlError.getVisibility() == View.VISIBLE) {\n            rlError.setVisibility(View.GONE);\n        }\n    }\n    /**\n     * 加载完成的状态\n     */\n    protected void showContentView() {\n        if (rlError.getVisibility() == View.VISIBLE) {\n            rlLoading.setVisibility(View.GONE);\n        }\n        if (rlLoading.getVisibility() == View.VISIBLE) {\n            rlLoading.setVisibility(View.GONE);\n        }\n    }\n    /**\n     * 加载失败\n     */\n    protected void Error() {\n        if (rlError.getVisibility() == View.GONE) {\n            rlError.setVisibility(View.VISIBLE);\n        }\n    }\n    /**\n     * 加载失败重新加载\n     */\n\n    protected void Refresh() {\n\n    }\n/*\n    //显示loading\n    public void showLoading() {\n        avLoading.show();\n    }\n\n    //隐藏loading\n    public void stopLoading() {\n        avLoading.hide();\n    }\n    */\n\n\n}\n"
  },
  {
    "path": "app/src/main/java/com/example/discover/base/baseadapter/BaseRecyclerAdapter.java",
    "content": "package com.example.discover.base.baseadapter;\n\nimport android.content.Context;\nimport android.support.v7.widget.RecyclerView;\n\nimport com.example.discover.utils.DebugUtil;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\n/**\n * Created by Administrator on 2017/12/13 0013.\n */\n\npublic abstract class BaseRecyclerAdapter<T> extends RecyclerView.Adapter<BaseViewHolder> {\n\n    protected OnItemClickListener<T> listener;\n    protected OnItemLongClickListener<T> onItemLongClickListener;\n    public List<T> mData = new ArrayList<>();\n    public Context mContext;\n\n    public BaseRecyclerAdapter(Context context) {\n        mContext = context;\n    }\n\n    @Override\n    public void onBindViewHolder(BaseViewHolder holder, int position) {\n        DebugUtil.debug(\"position11\", position + \"\");\n        if (position == mData.size()) {\n            holder.baseFillHolder(null, position);\n            return;\n        }\n        holder.baseFillHolder(mData.get(position), position);\n\n    }\n\n    @Override\n    public int getItemCount() {\n        //考虑有footer的情况\n        return mData.size() + 1;\n    }\n\n    public void addAll(List<T> data) {\n        this.mData.addAll(data);\n        DebugUtil.debug(\"listSize\", data.size() + \"\");\n    }\n\n\n    public void add(T data) {\n        this.mData.add(data);\n    }\n    public void clear() {\n        this.mData.clear();\n    }\n\n    public void delete(int position) {\n        if (this.mData != null && this.mData.size() > position) {\n            this.mData.remove(position);\n        }\n        notifyItemRemoved(position);\n        notifyItemRangeChanged(position, mData.size() - position);\n\n    }\n\n    public void setOnItemClickListener(OnItemClickListener<T> listener) {\n        this.listener = listener;\n    }\n\n    public void setOnItemLongClickListener(OnItemLongClickListener<T> onItemLongClickListener) {\n        this.onItemLongClickListener = onItemLongClickListener;\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/example/discover/base/baseadapter/BaseViewHolder.java",
    "content": "package com.example.discover.base.baseadapter;\n\nimport android.databinding.DataBindingUtil;\nimport android.databinding.ViewDataBinding;\nimport android.support.v7.widget.RecyclerView;\nimport android.view.LayoutInflater;\nimport android.view.ViewGroup;\n\n/**\n * Created by Administrator on 2017/12/13 0013.\n */\n\npublic abstract class BaseViewHolder<T,H extends ViewDataBinding> extends RecyclerView.ViewHolder {\n\n    public H itemViewBinding;\n    public BaseViewHolder(ViewGroup parent, int layoutId) {\n        super(DataBindingUtil.inflate(LayoutInflater.from(parent.getContext()),layoutId, parent, false).getRoot());\n        itemViewBinding = DataBindingUtil.getBinding(itemView);\n\n    }\n\n    public abstract void fillHolder(T object, int position);\n\n    /**\n     * 当数据改变时，binding会在下一帧去改变数据，如果我们需要立即改变，就去调用executePendingBindings方法。\n     */\n    public void baseFillHolder(T object, int position) {\n        fillHolder(object, position);\n        itemViewBinding.executePendingBindings();\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/example/discover/base/baseadapter/OnItemClickListener.java",
    "content": "package com.example.discover.base.baseadapter;\n\nimport android.view.View;\n\n/**\n * Created by jingbin on 2016/3/2.\n */\npublic interface OnItemClickListener<T> {\n    public void onClick(View view, T t, int position);\n}\n"
  },
  {
    "path": "app/src/main/java/com/example/discover/base/baseadapter/OnItemLongClickListener.java",
    "content": "package com.example.discover.base.baseadapter;\n\n/**\n * Created by jingbin on 16/7/4.\n */\npublic interface OnItemLongClickListener<T> {\n    public void onLongClick(T t, int position);\n}\n"
  },
  {
    "path": "app/src/main/java/com/example/discover/bean/AuthorDetailBean.java",
    "content": "package com.example.discover.bean;\n\nimport com.example.discover.bean.DetailBean.ItemList;\n\nimport java.io.Serializable;\nimport java.util.List;\n\n/**\n * Created by monkeyWiiu on 2018/1/25.\n */\n\npublic class AuthorDetailBean implements Serializable {\n\n    private List<ItemList> itemList;\n\n    public List<ItemList> getItemList() {\n        return itemList;\n    }\n\n    public void setItemList(List<ItemList> itemList) {\n        this.itemList = itemList;\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/example/discover/bean/DetailBean/ACacheFindList.java",
    "content": "package com.example.discover.bean.DetailBean;\n\nimport java.io.Serializable;\nimport java.util.ArrayList;\nimport java.util.List;\n\n/**\n * Created by monkeyWiiu on 2018/1/18.\n */\n\npublic class ACacheFindList  implements Serializable {\n    private List<SectionList> scrollCardSection = new ArrayList<>() ;\n    private List<SectionList> videoSection = new ArrayList<>() ;\n    private List<SectionList> authorSection = new ArrayList<>() ;\n\n    public List<SectionList> getScrollCardSection() {\n        return scrollCardSection;\n    }\n\n    public void setScrollCardSection(List<SectionList> scrollCardSection) {\n        this.scrollCardSection = scrollCardSection;\n    }\n\n    public List<SectionList> getVideoSection() {\n        return videoSection;\n    }\n\n    public void setVideoSection(List<SectionList> videoSection) {\n        this.videoSection = videoSection;\n    }\n\n    public List<SectionList> getAuthorSection() {\n        return authorSection;\n    }\n\n    public void setAuthorSection(List<SectionList> authorSection) {\n        this.authorSection = authorSection;\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/example/discover/bean/DetailBean/Author.java",
    "content": "package com.example.discover.bean.DetailBean;\n\nimport java.io.Serializable;\n\n/**\n * Created by monkeyWiiu on 2018/1/17.\n */\n\npublic class Author implements Serializable {\n    public int id;\n    public String icon;\n    public String name;\n    public String description;\n    public int videoNum;\n\n    public int getId() {\n        return id;\n    }\n\n    public void setId(int id) {\n        this.id = id;\n    }\n\n    public String getIcon() {\n        return icon;\n    }\n\n    public void setIcon(String icon) {\n        this.icon = icon;\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 getDescription() {\n        return description;\n    }\n\n    public void setDescription(String description) {\n        this.description = description;\n    }\n\n    public int getVideoNum() {\n        return videoNum;\n    }\n\n    public void setVideoNum(int videoNum) {\n        this.videoNum = videoNum;\n    }\n\n\n}\n\n"
  },
  {
    "path": "app/src/main/java/com/example/discover/bean/DetailBean/CategoryInfo.java",
    "content": "package com.example.discover.bean.DetailBean;\n\nimport java.io.Serializable;\n\n/**\n * Created by monkeyWiiu on 2018/1/17.\n */\n\npublic class CategoryInfo implements Serializable {\n\n    public String dataType;\n    public int id;\n    public String name;\n    public String description;\n    public String headerImage;\n\n    public String getDataType() {\n        return dataType;\n    }\n\n    public void setDataType(String dataType) {\n        this.dataType = dataType;\n    }\n\n    public int getId() {\n        return id;\n    }\n\n    public void setId(int id) {\n        this.id = id;\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 getDescription() {\n        return description;\n    }\n\n    public void setDescription(String description) {\n        this.description = description;\n    }\n\n    public String getHeaderImage() {\n        return headerImage;\n    }\n\n    public void setHeaderImage(String headerImage) {\n        this.headerImage = headerImage;\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/example/discover/bean/DetailBean/Cover.java",
    "content": "package com.example.discover.bean.DetailBean;\n\nimport java.io.Serializable;\n\n/**\n * Created by monkeyWiiu on 2018/1/17.\n */\n\npublic class Cover implements Serializable {\n    public String feed;\n    public String detail;\n    public String blurred;\n\n    public String getFeed() {\n        return feed;\n    }\n\n    public void setFeed(String feed) {\n        this.feed = feed;\n    }\n\n    public String getDetail() {\n        return detail;\n    }\n\n    public void setDetail(String detail) {\n        this.detail = detail;\n    }\n\n    public String getBlurred() {\n        return blurred;\n    }\n\n    public void setBlurred(String blurred) {\n        this.blurred = blurred;\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/example/discover/bean/DetailBean/Data.java",
    "content": "package com.example.discover.bean.DetailBean;\n\nimport java.io.Serializable;\nimport java.util.List;\n\n/**\n * Created by monkeyWiiu on 2018/1/17.\n */\n\npublic class Data implements Serializable {\n    public String dataType;\n    public int id;\n    public String title;\n    public String text;\n    public String description;\n    public String image;\n    public String actionUrl;\n    public boolean shade;\n    public Cover cover;\n    public String playUrl;\n    public String category;\n    public long duration;\n    public Header header;\n    public List<ItemList> itemList;\n    public Author author;\n    public String icon;\n    public List<Tags> tags;\n    public List<PlayInfo> playInfo;\n    public WebUrl webUrl;\n\n    public int getId() {\n        return id;\n    }\n\n    public String getActionUrl() {\n        return actionUrl;\n    }\n\n    public String getDescription() {\n        return description;\n    }\n\n    public String getTitle() {\n        return title;\n    }\n\n    public String getIcon() {\n        return icon;\n    }\n\n    public List<ItemList> getItemList() {\n        return itemList;\n    }\n\n    public String getPlayUrl() {\n        return playUrl;\n    }\n\n    public Author getAuthor() {\n        return author;\n    }\n\n    public Cover getCover() {\n        return cover;\n    }\n\n    public Header getHeader() {\n        return header;\n    }\n\n    public long getDuration() {\n        return duration;\n    }\n\n    public String getCategory() {\n        return category;\n    }\n\n    public String getDataType() {\n        return dataType;\n    }\n\n    public String getImage() {\n        return image;\n    }\n\n    public String getText() {\n        return text;\n    }\n\n    public List<PlayInfo> getPlayinfo() {\n        return playInfo;\n    }\n\n    public WebUrl getWebUrl() {\n        return webUrl;\n    }\n\n    public List<Tags> getTags() {\n        return tags;\n    }\n\n    public void setId(int id) {\n        this.id = id;\n    }\n\n    public void setActionUrl(String actionUrl) {\n        this.actionUrl = actionUrl;\n    }\n\n    public void setDescription(String description) {\n        this.description = description;\n    }\n\n    public void setTitle(String title) {\n        this.title = title;\n    }\n\n    public void setIcon(String icon) {\n        this.icon = icon;\n    }\n\n    public void setItemList(List<ItemList> itemList) {\n        this.itemList = itemList;\n    }\n\n    public void setPlayUrl(String playUrl) {\n        this.playUrl = playUrl;\n    }\n\n    public void setAuthor(Author author) {\n        this.author = author;\n    }\n\n    public void setCategory(String category) {\n        this.category = category;\n    }\n\n    public void setCover(Cover cover) {\n        this.cover = cover;\n    }\n\n    public void setDataType(String dataType) {\n        this.dataType = dataType;\n    }\n\n    public void setDuration(long duration) {\n        this.duration = duration;\n    }\n\n    public void setHeader(Header header) {\n        this.header = header;\n    }\n\n    public void setImage(String image) {\n        this.image = image;\n    }\n\n    public void setShade(boolean shade) {\n        this.shade = shade;\n    }\n\n    public void setText(String text) {\n        this.text = text;\n    }\n\n    public void setPlayinfo(List<PlayInfo> list) {\n        this.playInfo = list;\n    }\n\n    public void setWebUrl(WebUrl webUrl) {\n        this.webUrl = webUrl;\n    }\n\n    public void setTags(List<Tags> tags) {\n        this.tags = tags;\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/example/discover/bean/DetailBean/FindCategory.java",
    "content": "package com.example.discover.bean.DetailBean;\n\nimport java.io.Serializable;\nimport java.util.List;\n\n/**\n * Created by monkeyWiiu on 2018/1/17.\n */\n\npublic class FindCategory implements Serializable{\n    public CategoryInfo categoryInfo;\n    public List<SectionList> sectionList;\n\n    public CategoryInfo getCategoryInfo() {\n        return categoryInfo;\n    }\n\n    public void setCategoryInfo(CategoryInfo categoryInfo) {\n        this.categoryInfo = categoryInfo;\n    }\n\n    public List<SectionList> getSectionList() {\n        return sectionList;\n    }\n\n    public void setSectionList(List<SectionList> sectionList) {\n        this.sectionList = sectionList;\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/example/discover/bean/DetailBean/Footer.java",
    "content": "package com.example.discover.bean.DetailBean;\n\nimport java.io.Serializable;\n\n/**\n * Created by monkeyWiiu on 2018/1/17.\n */\n\npublic class Footer implements Serializable {\n\n    public String type;\n    public Data data;\n\n    public String getType() {\n        return type;\n    }\n\n    public void setType(String type) {\n        this.type = type;\n    }\n\n    public Data getData() {\n        return data;\n    }\n\n    public void setData(Data data) {\n        this.data = data;\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/example/discover/bean/DetailBean/Header.java",
    "content": "package com.example.discover.bean.DetailBean;\n\nimport java.io.Serializable;\n\n/**\n * Created by monkeyWiiu on 2018/1/17.\n */\n\npublic class Header implements Serializable {\n    public int id;\n    public String icon;\n    public String title;\n    public String subTitle;\n    public String description;\n    public String actionUrl;\n    public Data data;\n\n    public int getId() {\n        return id;\n    }\n\n    public void setId(int id) {\n        this.id = id;\n    }\n\n    public String getIcon() {\n        return icon;\n    }\n\n    public void setIcon(String icon) {\n        this.icon = icon;\n    }\n\n    public String getTitle() {\n        return title;\n    }\n\n    public void setTitle(String title) {\n        this.title = title;\n    }\n\n    public String getSubTitle() {\n        return subTitle;\n    }\n\n    public void setSubTitle(String subTitle) {\n        this.subTitle = subTitle;\n    }\n\n    public String getDescription() {\n        return description;\n    }\n\n    public void setDescription(String description) {\n        this.description = description;\n    }\n\n    public String getActionUrl() {\n        return actionUrl;\n    }\n\n    public void setActionUrl(String actionUrl) {\n        this.actionUrl = actionUrl;\n    }\n\n    public Data getData() {\n        return data;\n    }\n\n    public void setData(Data data) {\n        this.data = data;\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/example/discover/bean/DetailBean/ItemList.java",
    "content": "package com.example.discover.bean.DetailBean;\n\nimport java.io.Serializable;\n\n/**\n * Created by monkeyWiiu on 2018/1/17.\n */\n\npublic class ItemList implements Serializable{\n    private String type;\n    private Data data;\n\n    private String tag;\n    public String getType() {\n        return type;\n    }\n\n    public void setType(String type) {\n        this.type = type;\n    }\n\n    public Data getData() {\n        return data;\n    }\n\n    public void setData(Data data) {\n        this.data = data;\n    }\n\n    public String getTag() {\n        return tag;\n    }\n\n    public void setTag(String tag) {\n        this.tag = tag;\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/example/discover/bean/DetailBean/PlayInfo.java",
    "content": "package com.example.discover.bean.DetailBean;\n\nimport java.io.Serializable;\nimport java.util.List;\n\n/**\n * Created by monkeyWiiu on 2018/1/23.\n */\n\npublic class PlayInfo implements Serializable {\n\n    /**\n     * height : 720\n     * width : 1280\n     * urlList : [{\"name\":\"aliyun\",\"url\":\"http://baobab.kaiyanapp.com/api/v1/playUrl?vid=66374&editionType=high&source=aliyun\",\"size\":14871277},{\"name\":\"qcloud\",\"url\":\"http://baobab.kaiyanapp.com/api/v1/playUrl?vid=66374&editionType=high&source=qcloud\",\"size\":14871277},{\"name\":\"ucloud\",\"url\":\"http://baobab.kaiyanapp.com/api/v1/playUrl?vid=66374&editionType=high&source=ucloud\",\"size\":14871277}]\n     * name : 高清\n     * type : high\n     * url : http://baobab.kaiyanapp.com/api/v1/playUrl?vid=66374&editionType=high&source=aliyun\n     */\n\n    private int height;\n    private int width;\n    private String name;\n    private String type;\n    private String url;\n    private List<UrlList> urlList;\n\n    public int getHeight() {\n        return height;\n    }\n\n    public void setHeight(int height) {\n        this.height = height;\n    }\n\n    public int getWidth() {\n        return width;\n    }\n\n    public void setWidth(int width) {\n        this.width = width;\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 getType() {\n        return type;\n    }\n\n    public void setType(String type) {\n        this.type = type;\n    }\n\n    public String getUrl() {\n        return url;\n    }\n\n    public void setUrl(String url) {\n        this.url = url;\n    }\n\n    public List<UrlList> getUrlList() {\n        return urlList;\n    }\n\n    public void setUrlList(List<UrlList> urlList) {\n        this.urlList = urlList;\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/example/discover/bean/DetailBean/Replies.java",
    "content": "package com.example.discover.bean.DetailBean;\n\nimport java.io.Serializable;\nimport java.util.List;\n\n/**\n * @author zsj\n */\n\npublic class Replies implements Serializable{\n\n    private List<ReplyList> replyList;\n\n    public List<ReplyList> getReplyList() {\n        return replyList;\n    }\n\n    public void setReplyList(List<ReplyList> replyList) {\n        this.replyList = replyList;\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/example/discover/bean/DetailBean/ReplyList.java",
    "content": "package com.example.discover.bean.DetailBean;\n\nimport java.io.Serializable;\n\n/**\n * @author zsj\n */\n\npublic class ReplyList implements Serializable {\n\n    public long id;\n    public int videoId;\n    public String videoTitle;\n    public int sequence;\n    public String message;\n    public long createTime;\n    public User user;\n    public int likeCount;\n\n    public long getId() {\n        return id;\n    }\n\n    public void setId(long id) {\n        this.id = id;\n    }\n\n    public int getVideoId() {\n        return videoId;\n    }\n\n    public void setVideoId(int videoId) {\n        this.videoId = videoId;\n    }\n\n    public int getLikeCount() {\n        return likeCount;\n    }\n\n    public void setLikeCount(int likeCount) {\n        this.likeCount = likeCount;\n    }\n\n    public int getSequence() {\n        return sequence;\n    }\n\n    public void setSequence(int sequence) {\n        this.sequence = sequence;\n    }\n\n    public long getCreateTime() {\n        return createTime;\n    }\n\n    public void setCreateTime(long createTime) {\n        this.createTime = createTime;\n    }\n\n    public String getMessage() {\n        return message;\n    }\n\n    public void setMessage(String message) {\n        this.message = message;\n    }\n\n    public String getVideoTitle() {\n        return videoTitle;\n    }\n\n    public void setVideoTitle(String videoTitle) {\n        this.videoTitle = videoTitle;\n    }\n\n    public void setUser(User user) {\n        this.user = user;\n    }\n\n    public User getUser() {\n        return user;\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/example/discover/bean/DetailBean/SectionList.java",
    "content": "package com.example.discover.bean.DetailBean;\n\nimport java.io.Serializable;\nimport java.util.List;\n\n/**\n * Created by monkeyWiiu on 2018/1/17.\n */\n\npublic class SectionList implements Serializable {\n    public int id;\n    public String type;\n    public Header header;\n    public List<ItemList> itemList;\n    public Footer footer;\n\n    public int getId() {\n        return id;\n    }\n\n    public void setId(int id) {\n        this.id = id;\n    }\n\n    public String getType() {\n        return type;\n    }\n\n    public void setType(String type) {\n        this.type = type;\n    }\n\n    public Header getHeader() {\n        return header;\n    }\n\n    public void setHeader(Header header) {\n        this.header = header;\n    }\n\n    public List<ItemList> getItemList() {\n        return itemList;\n    }\n\n    public void setItemList(List<ItemList> itemList) {\n        this.itemList = itemList;\n    }\n\n    public Footer getFooter() {\n        return footer;\n    }\n\n    public void setFooter(Footer footer) {\n        this.footer = footer;\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/example/discover/bean/DetailBean/Tags.java",
    "content": "package com.example.discover.bean.DetailBean;\n\nimport java.io.Serializable;\n\n/**\n * Created by monkeyWiiu on 2018/1/19.\n */\n\npublic class Tags implements Serializable {\n    private String name;\n    private String headerImage;\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 getHeaderImage() {\n        return headerImage;\n    }\n\n    public void setHeaderImage(String headerImage) {\n        this.headerImage = headerImage;\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/example/discover/bean/DetailBean/UrlList.java",
    "content": "package com.example.discover.bean.DetailBean;\n\nimport java.io.Serializable;\n\n/**\n * Created by monkeyWiiu on 2018/1/23.\n */\n\npublic class UrlList implements Serializable {\n\n    /**\n     * name : aliyun\n     * url : http://baobab.kaiyanapp.com/api/v1/playUrl?vid=66374&editionType=high&source=aliyun\n     * size : 14871277\n     */\n\n    private String name;\n    private String url;\n    private int size;\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 getUrl() {\n        return url;\n    }\n\n    public void setUrl(String url) {\n        this.url = url;\n    }\n\n    public int getSize() {\n        return size;\n    }\n\n    public void setSize(int size) {\n        this.size = size;\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/example/discover/bean/DetailBean/User.java",
    "content": "package com.example.discover.bean.DetailBean;\n\nimport java.io.Serializable;\n\n/**\n * @author zsj\n */\n\npublic class User implements Serializable {\n\n    public int uid;\n    public String nickname;\n    public String avatar;\n\n    public int getUid() {\n        return uid;\n    }\n\n    public void setUid(int uid) {\n        this.uid = uid;\n    }\n\n    public String getNickname() {\n        return nickname;\n    }\n\n    public void setNickname(String nickname) {\n        this.nickname = nickname;\n    }\n\n    public String getAvatar() {\n        return avatar;\n    }\n\n    public void setAvatar(String avatar) {\n        this.avatar = avatar;\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/example/discover/bean/DetailBean/WebUrl.java",
    "content": "package com.example.discover.bean.DetailBean;\n\nimport java.io.Serializable;\n\n/**\n * Created by monkeyWiiu on 2018/1/23.\n */\n\npublic class WebUrl implements Serializable {\n\n    private String raw;\n    private String forWeibo;\n\n    public String getRaw() {\n        return raw;\n    }\n\n    public void setRaw(String raw) {\n        this.raw = raw;\n    }\n\n    public String getForWeibo() {\n        return forWeibo;\n    }\n\n    public void setForWeibo(String forWeibo) {\n        this.forWeibo = forWeibo;\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/example/discover/bean/GankBean.java",
    "content": "package com.example.discover.bean;\n\nimport java.io.Serializable;\nimport java.util.List;\n\n/**\n * Created by monkeyWiiu on 2018/2/3.\n */\n\npublic class GankBean implements Serializable {\n\n    private boolean error;\n    /**\n     * _id : 5832662b421aa929b0f34e99\n     * createdAt : 2016-11-21T11:12:43.567Z\n     * desc :  深入Android渲染机制\n     * publishedAt : 2016-11-24T11:40:53.615Z\n     * source : web\n     * type : Android\n     * url : http://blog.csdn.net/ccj659/article/details/53219288\n     * used : true\n     * who : Chauncey\n     */\n\n    private List<ResultBean> results;\n\n    public static class ResultBean implements Serializable {\n\n\n        private String _id;\n        private String createdAt;\n        private String desc;\n        private String publishedAt;\n        private String source;\n        private String type;\n        private String url;\n        private boolean used;\n        private String who;\n        private List<String> images;\n\n        public String get_id() {\n            return _id;\n        }\n\n        public String getCreatedAt() {\n            return createdAt;\n        }\n\n        public String getDesc() {\n            return desc;\n        }\n\n        public String getPublishedAt() {\n            return publishedAt;\n        }\n\n        public String getSource() {\n            return source;\n        }\n\n        public String getType() {\n            return type;\n        }\n\n        public String getUrl() {\n            return url;\n        }\n\n        public boolean isUsed() {\n            return used;\n        }\n\n        public String getWho() {\n            return who;\n        }\n\n        @Override\n        public String toString() {\n            return \"ResultsBean{\" +\n                    \"who='\" + who + '\\'' +\n                    \", used=\" + used +\n                    \", url='\" + url + '\\'' +\n                    \", type='\" + type + '\\'' +\n                    \", source='\" + source + '\\'' +\n                    \", publishedAt='\" + publishedAt + '\\'' +\n                    \", desc='\" + desc + '\\'' +\n                    \", createdAt='\" + createdAt + '\\'' +\n                    \", _id='\" + _id + '\\'' +\n                    '}';\n        }\n\n        public List<String> getImages() {\n            return images;\n        }\n    }\n\n    public boolean isError() {\n        return error;\n    }\n\n    public List<ResultBean> getResults() {\n        return results;\n    }\n\n}\n"
  },
  {
    "path": "app/src/main/java/com/example/discover/bean/HotEyeBean.java",
    "content": "package com.example.discover.bean;\n\nimport com.example.discover.bean.DetailBean.ItemList;\n\nimport java.io.Serializable;\nimport java.util.List;\n\n/**\n * Created by Administrator on 2017/12/9 0009.\n */\n\npublic class HotEyeBean implements Serializable {\n\n\n    private List<ItemList> itemList;\n\n    public List<ItemList> getItemList() {\n        return itemList;\n    }\n\n    public void setItemList(List<ItemList> itemList) {\n        this.itemList = itemList;\n    }\n\n\n}\n"
  },
  {
    "path": "app/src/main/java/com/example/discover/bean/LitePalBean/Follow.java",
    "content": "package com.example.discover.bean.LitePalBean;\n\nimport org.litepal.crud.DataSupport;\n\n/**\n * Created by monkeyWiiu on 2018/1/25.\n */\n\npublic class Follow extends DataSupport {\n    private int id;\n    public int authorId;\n    public String authorName;\n    public String authorDesc;\n    public String iconUrl;\n    private int backgroundColor;\n\n    private String backgroundImage;\n    public int getId() {\n        return id;\n    }\n\n    public void setId(int id) {\n        this.id = id;\n    }\n\n    public int getAuthorId() {\n        return authorId;\n    }\n\n    public void setAuthorId(int authorId) {\n        this.authorId = authorId;\n    }\n\n    public String getAuthorName() {\n        return authorName;\n    }\n\n    public void setAuthorName(String authorName) {\n        this.authorName = authorName;\n    }\n\n    public String getAuthorDesc() {\n        return authorDesc;\n    }\n\n    public void setAuthorDesc(String authorDesc) {\n        this.authorDesc = authorDesc;\n    }\n\n    public String getIconUrl() {\n        return iconUrl;\n    }\n\n    public void setIconUrl(String iconUrl) {\n        this.iconUrl = iconUrl;\n    }\n\n    public int getBackgroundColor() {\n        return backgroundColor;\n    }\n\n    public void setBackgroundColor(int backgroundColor) {\n        this.backgroundColor = backgroundColor;\n    }\n\n    public String getBackgroundImage() {\n        return backgroundImage;\n    }\n\n    public void setBackgroundImage(String backgroundImage) {\n        this.backgroundImage = backgroundImage;\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/example/discover/bean/LitePalBean/LabelType.java",
    "content": "package com.example.discover.bean.LitePalBean;\n\nimport org.litepal.crud.DataSupport;\n\n/**\n * Created by monkeyWiiu on 2018/1/13.\n */\n\npublic class LabelType extends DataSupport {\n    private String type;\n\n\n    public String getType() {\n        return type;\n    }\n\n    public void setType(String type) {\n        this.type = type;\n    }\n\n\n}\n"
  },
  {
    "path": "app/src/main/java/com/example/discover/bean/LitePalBean/LikeVideo.java",
    "content": "package com.example.discover.bean.LitePalBean;\n\nimport org.litepal.crud.DataSupport;\n\n/**\n * Created by monkeyWiiu on 2017/12/31.\n * id : 不变,与表中数据绑定\n */\n\npublic class LikeVideo extends DataSupport {\n    private int id;\n    private int videoId;\n    private String title;\n    private String description;\n    private String playUrl;\n    private String imageUrl;\n    private String authorName;\n    private int authorId;\n    private String authorIcon;\n    private String authorDesc;\n    private int labelColor;\n    private String labelText;\n    private int size;\n\n\n    public int getId() {\n        return id;\n    }\n\n    public void setId(int id) {\n        this.id = id;\n    }\n\n    public int getVideoId() {\n        return videoId;\n    }\n\n    public void setVideoId(int videoId) {\n        this.videoId = videoId;\n    }\n\n    public String getTitle() {\n        return title;\n    }\n\n    public void setTitle(String title) {\n        this.title = title;\n    }\n\n    public String getDescription() {\n        return description;\n    }\n\n    public void setDescription(String description) {\n        this.description = description;\n    }\n\n    public String getPlayUrl() {\n        return playUrl;\n    }\n\n    public void setPlayUrl(String playUrl) {\n        this.playUrl = playUrl;\n    }\n\n    public String getImageUrl() {\n        return imageUrl;\n    }\n\n    public void setImageUrl(String imageUrl) {\n        this.imageUrl = imageUrl;\n    }\n\n\n    public String getAuthorName() {\n        return authorName;\n    }\n\n    public void setAuthorName(String auhtorName) {\n        this.authorName = auhtorName;\n    }\n\n    public int getAuthorId() {\n        return authorId;\n    }\n\n    public void setAuthorId(int auhtorId) {\n        this.authorId = auhtorId;\n    }\n\n    public String getAuthorDesc() {\n        return authorDesc;\n    }\n\n    public void setAuthorDesc(String authorDesc) {\n        this.authorDesc = authorDesc;\n    }\n\n    public String getAuthorIcon() {\n        return authorIcon;\n    }\n\n    public void setAuthorIcon(String authorIcon) {\n        this.authorIcon = authorIcon;\n    }\n\n    public int getLabelColor() {\n        return labelColor;\n    }\n\n    public void setLabelColor(int labelColor) {\n        this.labelColor = labelColor;\n    }\n\n    public String getLabelText() {\n        return labelText;\n    }\n\n    public void setLabelText(String labelText) {\n        this.labelText = labelText;\n    }\n\n    public int getSize() {\n        return size;\n    }\n\n    public void setSize(int size) {\n        this.size = size;\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/example/discover/bean/LitePalBean/SearchTag.java",
    "content": "package com.example.discover.bean.LitePalBean;\n\n\nimport org.litepal.crud.DataSupport;\n\n/**\n * Created by monkeyWiiu on 2018/1/28.\n */\n\npublic class SearchTag extends DataSupport {\n\n    private String tag;\n\n    public String getTag() {\n        return tag;\n    }\n\n    public void setTag(String tag) {\n        this.tag = tag;\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/example/discover/bean/ResultBean.java",
    "content": "package com.example.discover.bean;\n\nimport com.example.discover.SearchActivity;\nimport com.example.discover.bean.DetailBean.ItemList;\n\nimport java.io.Serializable;\nimport java.util.List;\n\n/**\n * Created by monkeyWiiu on 2018/1/29.\n */\n\npublic class ResultBean implements Serializable {\n\n\n    private List<ItemList> itemList;\n\n    public List<ItemList> getItemList() {\n        return itemList;\n    }\n\n    public void setItemList(List<ItemList> itemList) {\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/example/discover/bean/TestBean.java",
    "content": "package com.example.discover.bean;\n\nimport java.util.List;\n\n/**\n * Created by Administrator on 2017/12/14 0014.\n */\n\npublic class TestBean {\n\n\n    /**\n     * itemList : [{\"type\":\"video\",\"data\":{\"dataType\":\"VideoBeanForClient\",\"id\":66374,\"title\":\"太阳死亡后会变成什么，膨胀的红色巨人\",\"slogan\":null,\"description\":\"有一天我们的太阳也会死亡吗？答案是的，但是我们不必担心，因为人类可能无法活到太阳死亡的那一天，或者在此之前，我们已经离开太阳系。\",\"provider\":{\"name\":\"PGC\",\"alias\":\"PGC\",\"icon\":\"\"},\"category\":\"科普\",\"author\":{\"id\":2098,\"icon\":\"http://img.kaiyanapp.com/608dafdede807bd3748b582a32dc0a33.png?imageMogr2/quality/60/format/jpg\",\"name\":\"火星人俱乐部\",\"description\":\"科普趣味生活，亲子科学实验；北大老师陪你趣学科学；\",\"link\":\"\",\"latestReleaseTime\":1513237731000,\"videoNum\":62,\"adTrack\":null,\"follow\":{\"itemType\":\"author\",\"itemId\":2098,\"followed\":false},\"shield\":{\"itemType\":\"author\",\"itemId\":2098,\"shielded\":false},\"approvedNotReadyVideoCount\":0,\"ifPgc\":true},\"cover\":{\"feed\":\"http://img.kaiyanapp.com/9f4a7de9c2244499a95de914f22d76b4.png?imageMogr2/quality/60/format/jpg\",\"detail\":\"http://img.kaiyanapp.com/9f4a7de9c2244499a95de914f22d76b4.png?imageMogr2/quality/60/format/jpg\",\"blurred\":\"http://img.kaiyanapp.com/1661e0b22a0768be62510bcc934b2ac6.jpeg?imageMogr2/quality/60/format/jpg\",\"sharing\":null,\"homepage\":null},\"playUrl\":\"http://baobab.kaiyanapp.com/api/v1/playUrl?vid=66374&editionType=default&source=aliyun\",\"thumbPlayUrl\":null,\"duration\":137,\"webUrl\":{\"raw\":\"http://www.eyepetizer.net/detail.html?vid=66374\",\"forWeibo\":\"http://www.eyepetizer.net/detail.html?vid=66374\"},\"releaseTime\":1513237731000,\"library\":\"DEFAULT\",\"playInfo\":[{\"height\":720,\"width\":1280,\"urlList\":[{\"name\":\"aliyun\",\"url\":\"http://baobab.kaiyanapp.com/api/v1/playUrl?vid=66374&editionType=high&source=aliyun\",\"size\":14871277},{\"name\":\"qcloud\",\"url\":\"http://baobab.kaiyanapp.com/api/v1/playUrl?vid=66374&editionType=high&source=qcloud\",\"size\":14871277},{\"name\":\"ucloud\",\"url\":\"http://baobab.kaiyanapp.com/api/v1/playUrl?vid=66374&editionType=high&source=ucloud\",\"size\":14871277}],\"name\":\"高清\",\"type\":\"high\",\"url\":\"http://baobab.kaiyanapp.com/api/v1/playUrl?vid=66374&editionType=high&source=aliyun\"}],\"consumption\":{\"collectionCount\":0,\"shareCount\":2,\"replyCount\":0},\"campaign\":null,\"waterMarks\":null,\"adTrack\":null,\"tags\":[{\"id\":484,\"name\":\"干货\",\"actionUrl\":\"eyepetizer://tag/484/?title=%E5%B9%B2%E8%B4%A7\",\"adTrack\":null,\"desc\":null,\"bgPicture\":\"http://img.kaiyanapp.com/27856a0c2855246c31c19f7a8fd814ce.jpeg?imageMogr2/quality/60/format/jpg\",\"headerImage\":\"http://img.kaiyanapp.com/27856a0c2855246c31c19f7a8fd814ce.jpeg?imageMogr2/quality/60/format/jpg\",\"tagRecType\":\"NORMAL\"},{\"id\":546,\"name\":\"宇宙\",\"actionUrl\":\"eyepetizer://tag/546/?title=%E5%AE%87%E5%AE%99\",\"adTrack\":null,\"desc\":null,\"bgPicture\":\"http://img.kaiyanapp.com/7052c0f6e4267111b023d2541b1a7f07.jpeg?imageMogr2/quality/60/format/jpg\",\"headerImage\":\"http://img.kaiyanapp.com/7052c0f6e4267111b023d2541b1a7f07.jpeg?imageMogr2/quality/60/format/jpg\",\"tagRecType\":\"NORMAL\"},{\"id\":44,\"name\":\"科普\",\"actionUrl\":\"eyepetizer://tag/44/?title=%E7%A7%91%E6%99%AE\",\"adTrack\":null,\"desc\":null,\"bgPicture\":\"http://img.kaiyanapp.com/f2e7359e81e217782f32cc3d482b3284.jpeg?imageMogr2/quality/60/format/jpg\",\"headerImage\":\"http://img.kaiyanapp.com/f2e7359e81e217782f32cc3d482b3284.jpeg?imageMogr2/quality/60/format/jpg\",\"tagRecType\":\"NORMAL\"}],\"type\":\"NORMAL\",\"titlePgc\":\"太阳死亡后会变成什么，膨胀的红色巨人\",\"descriptionPgc\":\"有一天我们的太阳也会死亡吗？答案是的，但是我们不必担心，因为人类可能无法活到太阳死亡的那一天，或者在此之前，我们已经离开太阳系。\",\"remark\":\"太阳死亡后会变成什么？\",\"idx\":0,\"shareAdTrack\":null,\"favoriteAdTrack\":null,\"webAdTrack\":null,\"date\":1513237731000,\"promotion\":null,\"label\":null,\"labelList\":[],\"descriptionEditor\":\"\",\"collected\":false,\"played\":false,\"subtitles\":[],\"lastViewTime\":null,\"playlists\":null,\"src\":null},\"tag\":null,\"id\":0,\"adIndex\":-1},{\"type\":\"video\",\"data\":{\"dataType\":\"VideoBeanForClient\",\"id\":66371,\"title\":\"Coronation Street 宣传广告：从今以后\",\"slogan\":null,\"description\":\"由 ITV Coronation Street 带来的广告，展示了从以前到现在的工作场景，希望能够一直陪伴着他们所爱的人。\",\"provider\":{\"name\":\"定制来源\",\"alias\":\"CustomSrc\",\"icon\":\"\"},\"category\":\"广告\",\"author\":{\"id\":938,\"icon\":\"http://img.kaiyanapp.com/e44ed5fcfa424ba35761ce5f1339bc16.jpeg?imageMogr2/quality/60/format/jpg\",\"name\":\"欧美广告精选\",\"description\":\"持续推送新奇、有趣、大开眼界的欧美创意广告\",\"link\":\"\",\"latestReleaseTime\":1513237624000,\"videoNum\":194,\"adTrack\":null,\"follow\":{\"itemType\":\"author\",\"itemId\":938,\"followed\":false},\"shield\":{\"itemType\":\"author\",\"itemId\":938,\"shielded\":false},\"approvedNotReadyVideoCount\":0,\"ifPgc\":true},\"cover\":{\"feed\":\"http://img.kaiyanapp.com/3c7f944f41df332164c73454abc51725.png?imageMogr2/quality/60/format/jpg\",\"detail\":\"http://img.kaiyanapp.com/3c7f944f41df332164c73454abc51725.png?imageMogr2/quality/60/format/jpg\",\"blurred\":\"http://img.kaiyanapp.com/d772b37fa86071c42ac9154e7fb21d4c.png?imageMogr2/quality/60/format/jpg\",\"sharing\":null,\"homepage\":null},\"playUrl\":\"http://baobab.kaiyanapp.com/api/v1/playUrl?vid=66371&editionType=default&source=aliyun\",\"thumbPlayUrl\":null,\"duration\":72,\"webUrl\":{\"raw\":\"http://www.eyepetizer.net/detail.html?vid=66371\",\"forWeibo\":\"http://www.eyepetizer.net/detail.html?vid=66371\"},\"releaseTime\":1513237624000,\"library\":\"DEFAULT\",\"playInfo\":[{\"height\":720,\"width\":1280,\"urlList\":[{\"name\":\"aliyun\",\"url\":\"http://baobab.kaiyanapp.com/api/v1/playUrl?vid=66371&editionType=high&source=aliyun\",\"size\":10993795},{\"name\":\"qcloud\",\"url\":\"http://baobab.kaiyanapp.com/api/v1/playUrl?vid=66371&editionType=high&source=qcloud\",\"size\":10993795},{\"name\":\"ucloud\",\"url\":\"http://baobab.kaiyanapp.com/api/v1/playUrl?vid=66371&editionType=high&source=ucloud\",\"size\":10993795}],\"name\":\"高清\",\"type\":\"high\",\"url\":\"http://baobab.kaiyanapp.com/api/v1/playUrl?vid=66371&editionType=high&source=aliyun\"}],\"consumption\":{\"collectionCount\":2,\"shareCount\":2,\"replyCount\":0},\"campaign\":null,\"waterMarks\":null,\"adTrack\":null,\"tags\":[{\"id\":711,\"name\":\"欧美\",\"actionUrl\":\"eyepetizer://tag/711/?title=%E6%AC%A7%E7%BE%8E\",\"adTrack\":null,\"desc\":null,\"bgPicture\":\"http://img.kaiyanapp.com/0cb9ec0ade8d938be0452e8ca2d621d0.jpeg?imageMogr2/quality/60/format/jpg\",\"headerImage\":\"http://img.kaiyanapp.com/0cb9ec0ade8d938be0452e8ca2d621d0.jpeg?imageMogr2/quality/60/format/jpg\",\"tagRecType\":\"NORMAL\"},{\"id\":136,\"name\":\"温情\",\"actionUrl\":\"eyepetizer://tag/136/?title=%E6%B8%A9%E6%83%85\",\"adTrack\":null,\"desc\":null,\"bgPicture\":\"http://img.kaiyanapp.com/0bc1dc78c631eae017ee69418303adc5.jpeg?imageMogr2/quality/100\",\"headerImage\":\"http://img.kaiyanapp.com/0bc1dc78c631eae017ee69418303adc5.jpeg?imageMogr2/quality/100\",\"tagRecType\":\"NORMAL\"},{\"id\":16,\"name\":\"广告\",\"actionUrl\":\"eyepetizer://tag/16/?title=%E5%B9%BF%E5%91%8A\",\"adTrack\":null,\"desc\":null,\"bgPicture\":\"http://img.kaiyanapp.com/e41e74fe73882b552de00d95d56748d2.jpeg?imageMogr2/quality/60\",\"headerImage\":\"http://img.kaiyanapp.com/3054658dbd559ac42c4c282e9cab7a32.jpeg?imageMogr2/quality/100\",\"tagRecType\":\"NORMAL\"},{\"id\":2,\"name\":\"创意\",\"actionUrl\":\"eyepetizer://tag/2/?title=%E5%88%9B%E6%84%8F\",\"adTrack\":null,\"desc\":\"创意十足的style\",\"bgPicture\":\"http://img.kaiyanapp.com/e6eee049dd13fe8ce0712a6f2648d7e2.jpeg?imageMogr2/quality/100\",\"headerImage\":\"http://img.kaiyanapp.com/fdefdb34cbe3d2ac9964d306febe9025.jpeg?imageMogr2/quality/100\",\"tagRecType\":\"NORMAL\"}],\"type\":\"NORMAL\",\"titlePgc\":\"Coronation Street 宣传广告：从今以后\",\"descriptionPgc\":\"由 ITV Coronation Street 带来的广告，展示了从以前到现在的工作场景，希望能够一直陪伴着他们所爱的人。\",\"remark\":null,\"idx\":0,\"shareAdTrack\":null,\"favoriteAdTrack\":null,\"webAdTrack\":null,\"date\":1513237624000,\"promotion\":null,\"label\":null,\"labelList\":[],\"descriptionEditor\":\"\",\"collected\":false,\"played\":false,\"subtitles\":[],\"lastViewTime\":null,\"playlists\":null,\"src\":null},\"tag\":null,\"id\":0,\"adIndex\":-1}]\n     * count : 2\n     * total : 0\n     * nextPageUrl : http://baobab.kaiyanapp.com/api/v4/discovery/hot?start=42&num=2\n     * adExist : false\n     */\n\n    private int count;\n    private int total;\n    private String nextPageUrl;\n    private boolean adExist;\n    private List<ItemListBean> itemList;\n\n    public int getCount() {\n        return count;\n    }\n\n    public void setCount(int count) {\n        this.count = count;\n    }\n\n    public int getTotal() {\n        return total;\n    }\n\n    public void setTotal(int total) {\n        this.total = total;\n    }\n\n    public String getNextPageUrl() {\n        return nextPageUrl;\n    }\n\n    public void setNextPageUrl(String nextPageUrl) {\n        this.nextPageUrl = nextPageUrl;\n    }\n\n    public boolean isAdExist() {\n        return adExist;\n    }\n\n    public void setAdExist(boolean adExist) {\n        this.adExist = adExist;\n    }\n\n    public List<ItemListBean> getItemList() {\n        return itemList;\n    }\n\n    public void setItemList(List<ItemListBean> itemList) {\n        this.itemList = itemList;\n    }\n\n    public static class ItemListBean {\n        /**\n         * type : video\n         * data : {\"dataType\":\"VideoBeanForClient\",\"id\":66374,\"title\":\"太阳死亡后会变成什么，膨胀的红色巨人\",\"slogan\":null,\"description\":\"有一天我们的太阳也会死亡吗？答案是的，但是我们不必担心，因为人类可能无法活到太阳死亡的那一天，或者在此之前，我们已经离开太阳系。\",\"provider\":{\"name\":\"PGC\",\"alias\":\"PGC\",\"icon\":\"\"},\"category\":\"科普\",\"author\":{\"id\":2098,\"icon\":\"http://img.kaiyanapp.com/608dafdede807bd3748b582a32dc0a33.png?imageMogr2/quality/60/format/jpg\",\"name\":\"火星人俱乐部\",\"description\":\"科普趣味生活，亲子科学实验；北大老师陪你趣学科学；\",\"link\":\"\",\"latestReleaseTime\":1513237731000,\"videoNum\":62,\"adTrack\":null,\"follow\":{\"itemType\":\"author\",\"itemId\":2098,\"followed\":false},\"shield\":{\"itemType\":\"author\",\"itemId\":2098,\"shielded\":false},\"approvedNotReadyVideoCount\":0,\"ifPgc\":true},\"cover\":{\"feed\":\"http://img.kaiyanapp.com/9f4a7de9c2244499a95de914f22d76b4.png?imageMogr2/quality/60/format/jpg\",\"detail\":\"http://img.kaiyanapp.com/9f4a7de9c2244499a95de914f22d76b4.png?imageMogr2/quality/60/format/jpg\",\"blurred\":\"http://img.kaiyanapp.com/1661e0b22a0768be62510bcc934b2ac6.jpeg?imageMogr2/quality/60/format/jpg\",\"sharing\":null,\"homepage\":null},\"playUrl\":\"http://baobab.kaiyanapp.com/api/v1/playUrl?vid=66374&editionType=default&source=aliyun\",\"thumbPlayUrl\":null,\"duration\":137,\"webUrl\":{\"raw\":\"http://www.eyepetizer.net/detail.html?vid=66374\",\"forWeibo\":\"http://www.eyepetizer.net/detail.html?vid=66374\"},\"releaseTime\":1513237731000,\"library\":\"DEFAULT\",\"playInfo\":[{\"height\":720,\"width\":1280,\"urlList\":[{\"name\":\"aliyun\",\"url\":\"http://baobab.kaiyanapp.com/api/v1/playUrl?vid=66374&editionType=high&source=aliyun\",\"size\":14871277},{\"name\":\"qcloud\",\"url\":\"http://baobab.kaiyanapp.com/api/v1/playUrl?vid=66374&editionType=high&source=qcloud\",\"size\":14871277},{\"name\":\"ucloud\",\"url\":\"http://baobab.kaiyanapp.com/api/v1/playUrl?vid=66374&editionType=high&source=ucloud\",\"size\":14871277}],\"name\":\"高清\",\"type\":\"high\",\"url\":\"http://baobab.kaiyanapp.com/api/v1/playUrl?vid=66374&editionType=high&source=aliyun\"}],\"consumption\":{\"collectionCount\":0,\"shareCount\":2,\"replyCount\":0},\"campaign\":null,\"waterMarks\":null,\"adTrack\":null,\"tags\":[{\"id\":484,\"name\":\"干货\",\"actionUrl\":\"eyepetizer://tag/484/?title=%E5%B9%B2%E8%B4%A7\",\"adTrack\":null,\"desc\":null,\"bgPicture\":\"http://img.kaiyanapp.com/27856a0c2855246c31c19f7a8fd814ce.jpeg?imageMogr2/quality/60/format/jpg\",\"headerImage\":\"http://img.kaiyanapp.com/27856a0c2855246c31c19f7a8fd814ce.jpeg?imageMogr2/quality/60/format/jpg\",\"tagRecType\":\"NORMAL\"},{\"id\":546,\"name\":\"宇宙\",\"actionUrl\":\"eyepetizer://tag/546/?title=%E5%AE%87%E5%AE%99\",\"adTrack\":null,\"desc\":null,\"bgPicture\":\"http://img.kaiyanapp.com/7052c0f6e4267111b023d2541b1a7f07.jpeg?imageMogr2/quality/60/format/jpg\",\"headerImage\":\"http://img.kaiyanapp.com/7052c0f6e4267111b023d2541b1a7f07.jpeg?imageMogr2/quality/60/format/jpg\",\"tagRecType\":\"NORMAL\"},{\"id\":44,\"name\":\"科普\",\"actionUrl\":\"eyepetizer://tag/44/?title=%E7%A7%91%E6%99%AE\",\"adTrack\":null,\"desc\":null,\"bgPicture\":\"http://img.kaiyanapp.com/f2e7359e81e217782f32cc3d482b3284.jpeg?imageMogr2/quality/60/format/jpg\",\"headerImage\":\"http://img.kaiyanapp.com/f2e7359e81e217782f32cc3d482b3284.jpeg?imageMogr2/quality/60/format/jpg\",\"tagRecType\":\"NORMAL\"}],\"type\":\"NORMAL\",\"titlePgc\":\"太阳死亡后会变成什么，膨胀的红色巨人\",\"descriptionPgc\":\"有一天我们的太阳也会死亡吗？答案是的，但是我们不必担心，因为人类可能无法活到太阳死亡的那一天，或者在此之前，我们已经离开太阳系。\",\"remark\":\"太阳死亡后会变成什么？\",\"idx\":0,\"shareAdTrack\":null,\"favoriteAdTrack\":null,\"webAdTrack\":null,\"date\":1513237731000,\"promotion\":null,\"label\":null,\"labelList\":[],\"descriptionEditor\":\"\",\"collected\":false,\"played\":false,\"subtitles\":[],\"lastViewTime\":null,\"playlists\":null,\"src\":null}\n         * tag : null\n         * id : 0\n         * adIndex : -1\n         */\n\n        private String type;\n        private DataBean data;\n        private Object tag;\n        private int id;\n        private int adIndex;\n\n        public String getType() {\n            return type;\n        }\n\n        public void setType(String type) {\n            this.type = type;\n        }\n\n        public DataBean getData() {\n            return data;\n        }\n\n        public void setData(DataBean data) {\n            this.data = data;\n        }\n\n        public Object getTag() {\n            return tag;\n        }\n\n        public void setTag(Object tag) {\n            this.tag = tag;\n        }\n\n        public int getId() {\n            return id;\n        }\n\n        public void setId(int id) {\n            this.id = id;\n        }\n\n        public int getAdIndex() {\n            return adIndex;\n        }\n\n        public void setAdIndex(int adIndex) {\n            this.adIndex = adIndex;\n        }\n\n        public static class DataBean {\n            /**\n             * dataType : VideoBeanForClient\n             * id : 66374\n             * title : 太阳死亡后会变成什么，膨胀的红色巨人\n             * slogan : null\n             * description : 有一天我们的太阳也会死亡吗？答案是的，但是我们不必担心，因为人类可能无法活到太阳死亡的那一天，或者在此之前，我们已经离开太阳系。\n             * provider : {\"name\":\"PGC\",\"alias\":\"PGC\",\"icon\":\"\"}\n             * category : 科普\n             * author : {\"id\":2098,\"icon\":\"http://img.kaiyanapp.com/608dafdede807bd3748b582a32dc0a33.png?imageMogr2/quality/60/format/jpg\",\"name\":\"火星人俱乐部\",\"description\":\"科普趣味生活，亲子科学实验；北大老师陪你趣学科学；\",\"link\":\"\",\"latestReleaseTime\":1513237731000,\"videoNum\":62,\"adTrack\":null,\"follow\":{\"itemType\":\"author\",\"itemId\":2098,\"followed\":false},\"shield\":{\"itemType\":\"author\",\"itemId\":2098,\"shielded\":false},\"approvedNotReadyVideoCount\":0,\"ifPgc\":true}\n             * cover : {\"feed\":\"http://img.kaiyanapp.com/9f4a7de9c2244499a95de914f22d76b4.png?imageMogr2/quality/60/format/jpg\",\"detail\":\"http://img.kaiyanapp.com/9f4a7de9c2244499a95de914f22d76b4.png?imageMogr2/quality/60/format/jpg\",\"blurred\":\"http://img.kaiyanapp.com/1661e0b22a0768be62510bcc934b2ac6.jpeg?imageMogr2/quality/60/format/jpg\",\"sharing\":null,\"homepage\":null}\n             * playUrl : http://baobab.kaiyanapp.com/api/v1/playUrl?vid=66374&editionType=default&source=aliyun\n             * thumbPlayUrl : null\n             * duration : 137\n             * webUrl : {\"raw\":\"http://www.eyepetizer.net/detail.html?vid=66374\",\"forWeibo\":\"http://www.eyepetizer.net/detail.html?vid=66374\"}\n             * releaseTime : 1513237731000\n             * library : DEFAULT\n             * playInfo : [{\"height\":720,\"width\":1280,\"urlList\":[{\"name\":\"aliyun\",\"url\":\"http://baobab.kaiyanapp.com/api/v1/playUrl?vid=66374&editionType=high&source=aliyun\",\"size\":14871277},{\"name\":\"qcloud\",\"url\":\"http://baobab.kaiyanapp.com/api/v1/playUrl?vid=66374&editionType=high&source=qcloud\",\"size\":14871277},{\"name\":\"ucloud\",\"url\":\"http://baobab.kaiyanapp.com/api/v1/playUrl?vid=66374&editionType=high&source=ucloud\",\"size\":14871277}],\"name\":\"高清\",\"type\":\"high\",\"url\":\"http://baobab.kaiyanapp.com/api/v1/playUrl?vid=66374&editionType=high&source=aliyun\"}]\n             * consumption : {\"collectionCount\":0,\"shareCount\":2,\"replyCount\":0}\n             * campaign : null\n             * waterMarks : null\n             * adTrack : null\n             * tags : [{\"id\":484,\"name\":\"干货\",\"actionUrl\":\"eyepetizer://tag/484/?title=%E5%B9%B2%E8%B4%A7\",\"adTrack\":null,\"desc\":null,\"bgPicture\":\"http://img.kaiyanapp.com/27856a0c2855246c31c19f7a8fd814ce.jpeg?imageMogr2/quality/60/format/jpg\",\"headerImage\":\"http://img.kaiyanapp.com/27856a0c2855246c31c19f7a8fd814ce.jpeg?imageMogr2/quality/60/format/jpg\",\"tagRecType\":\"NORMAL\"},{\"id\":546,\"name\":\"宇宙\",\"actionUrl\":\"eyepetizer://tag/546/?title=%E5%AE%87%E5%AE%99\",\"adTrack\":null,\"desc\":null,\"bgPicture\":\"http://img.kaiyanapp.com/7052c0f6e4267111b023d2541b1a7f07.jpeg?imageMogr2/quality/60/format/jpg\",\"headerImage\":\"http://img.kaiyanapp.com/7052c0f6e4267111b023d2541b1a7f07.jpeg?imageMogr2/quality/60/format/jpg\",\"tagRecType\":\"NORMAL\"},{\"id\":44,\"name\":\"科普\",\"actionUrl\":\"eyepetizer://tag/44/?title=%E7%A7%91%E6%99%AE\",\"adTrack\":null,\"desc\":null,\"bgPicture\":\"http://img.kaiyanapp.com/f2e7359e81e217782f32cc3d482b3284.jpeg?imageMogr2/quality/60/format/jpg\",\"headerImage\":\"http://img.kaiyanapp.com/f2e7359e81e217782f32cc3d482b3284.jpeg?imageMogr2/quality/60/format/jpg\",\"tagRecType\":\"NORMAL\"}]\n             * type : NORMAL\n             * titlePgc : 太阳死亡后会变成什么，膨胀的红色巨人\n             * descriptionPgc : 有一天我们的太阳也会死亡吗？答案是的，但是我们不必担心，因为人类可能无法活到太阳死亡的那一天，或者在此之前，我们已经离开太阳系。\n             * remark : 太阳死亡后会变成什么？\n             * idx : 0\n             * shareAdTrack : null\n             * favoriteAdTrack : null\n             * webAdTrack : null\n             * date : 1513237731000\n             * promotion : null\n             * label : null\n             * labelList : []\n             * descriptionEditor :\n             * collected : false\n             * played : false\n             * subtitles : []\n             * lastViewTime : null\n             * playlists : null\n             * src : null\n             */\n\n            private String dataType;\n            private int id;\n            private String title;\n            private Object slogan;\n            private String description;\n            private ProviderBean provider;\n            private String category;\n            private AuthorBean author;\n            private CoverBean cover;\n            private String playUrl;\n            private Object thumbPlayUrl;\n            private int duration;\n            private WebUrlBean webUrl;\n            private long releaseTime;\n            private String library;\n            private ConsumptionBean consumption;\n            private Object campaign;\n            private Object waterMarks;\n            private Object adTrack;\n            private String type;\n            private String titlePgc;\n            private String descriptionPgc;\n            private String remark;\n            private int idx;\n            private Object shareAdTrack;\n            private Object favoriteAdTrack;\n            private Object webAdTrack;\n            private long date;\n            private Object promotion;\n            private Object label;\n            private String descriptionEditor;\n            private boolean collected;\n            private boolean played;\n            private Object lastViewTime;\n            private Object playlists;\n            private Object src;\n            private List<PlayInfoBean> playInfo;\n            private List<TagsBean> tags;\n            private List<?> labelList;\n            private List<?> subtitles;\n\n            public String getDataType() {\n                return dataType;\n            }\n\n            public void setDataType(String dataType) {\n                this.dataType = dataType;\n            }\n\n            public int getId() {\n                return id;\n            }\n\n            public void setId(int id) {\n                this.id = id;\n            }\n\n            public String getTitle() {\n                return title;\n            }\n\n            public void setTitle(String title) {\n                this.title = title;\n            }\n\n            public Object getSlogan() {\n                return slogan;\n            }\n\n            public void setSlogan(Object slogan) {\n                this.slogan = slogan;\n            }\n\n            public String getDescription() {\n                return description;\n            }\n\n            public void setDescription(String description) {\n                this.description = description;\n            }\n\n            public ProviderBean getProvider() {\n                return provider;\n            }\n\n            public void setProvider(ProviderBean provider) {\n                this.provider = provider;\n            }\n\n            public String getCategory() {\n                return category;\n            }\n\n            public void setCategory(String category) {\n                this.category = category;\n            }\n\n            public AuthorBean getAuthor() {\n                return author;\n            }\n\n            public void setAuthor(AuthorBean author) {\n                this.author = author;\n            }\n\n            public CoverBean getCover() {\n                return cover;\n            }\n\n            public void setCover(CoverBean cover) {\n                this.cover = cover;\n            }\n\n            public String getPlayUrl() {\n                return playUrl;\n            }\n\n            public void setPlayUrl(String playUrl) {\n                this.playUrl = playUrl;\n            }\n\n            public Object getThumbPlayUrl() {\n                return thumbPlayUrl;\n            }\n\n            public void setThumbPlayUrl(Object thumbPlayUrl) {\n                this.thumbPlayUrl = thumbPlayUrl;\n            }\n\n            public int getDuration() {\n                return duration;\n            }\n\n            public void setDuration(int duration) {\n                this.duration = duration;\n            }\n\n            public WebUrlBean getWebUrl() {\n                return webUrl;\n            }\n\n            public void setWebUrl(WebUrlBean webUrl) {\n                this.webUrl = webUrl;\n            }\n\n            public long getReleaseTime() {\n                return releaseTime;\n            }\n\n            public void setReleaseTime(long releaseTime) {\n                this.releaseTime = releaseTime;\n            }\n\n            public String getLibrary() {\n                return library;\n            }\n\n            public void setLibrary(String library) {\n                this.library = library;\n            }\n\n            public ConsumptionBean getConsumption() {\n                return consumption;\n            }\n\n            public void setConsumption(ConsumptionBean consumption) {\n                this.consumption = consumption;\n            }\n\n            public Object getCampaign() {\n                return campaign;\n            }\n\n            public void setCampaign(Object campaign) {\n                this.campaign = campaign;\n            }\n\n            public Object getWaterMarks() {\n                return waterMarks;\n            }\n\n            public void setWaterMarks(Object waterMarks) {\n                this.waterMarks = waterMarks;\n            }\n\n            public Object getAdTrack() {\n                return adTrack;\n            }\n\n            public void setAdTrack(Object adTrack) {\n                this.adTrack = adTrack;\n            }\n\n            public String getType() {\n                return type;\n            }\n\n            public void setType(String type) {\n                this.type = type;\n            }\n\n            public String getTitlePgc() {\n                return titlePgc;\n            }\n\n            public void setTitlePgc(String titlePgc) {\n                this.titlePgc = titlePgc;\n            }\n\n            public String getDescriptionPgc() {\n                return descriptionPgc;\n            }\n\n            public void setDescriptionPgc(String descriptionPgc) {\n                this.descriptionPgc = descriptionPgc;\n            }\n\n            public String getRemark() {\n                return remark;\n            }\n\n            public void setRemark(String remark) {\n                this.remark = remark;\n            }\n\n            public int getIdx() {\n                return idx;\n            }\n\n            public void setIdx(int idx) {\n                this.idx = idx;\n            }\n\n            public Object getShareAdTrack() {\n                return shareAdTrack;\n            }\n\n            public void setShareAdTrack(Object shareAdTrack) {\n                this.shareAdTrack = shareAdTrack;\n            }\n\n            public Object getFavoriteAdTrack() {\n                return favoriteAdTrack;\n            }\n\n            public void setFavoriteAdTrack(Object favoriteAdTrack) {\n                this.favoriteAdTrack = favoriteAdTrack;\n            }\n\n            public Object getWebAdTrack() {\n                return webAdTrack;\n            }\n\n            public void setWebAdTrack(Object webAdTrack) {\n                this.webAdTrack = webAdTrack;\n            }\n\n            public long getDate() {\n                return date;\n            }\n\n            public void setDate(long date) {\n                this.date = date;\n            }\n\n            public Object getPromotion() {\n                return promotion;\n            }\n\n            public void setPromotion(Object promotion) {\n                this.promotion = promotion;\n            }\n\n            public Object getLabel() {\n                return label;\n            }\n\n            public void setLabel(Object label) {\n                this.label = label;\n            }\n\n            public String getDescriptionEditor() {\n                return descriptionEditor;\n            }\n\n            public void setDescriptionEditor(String descriptionEditor) {\n                this.descriptionEditor = descriptionEditor;\n            }\n\n            public boolean isCollected() {\n                return collected;\n            }\n\n            public void setCollected(boolean collected) {\n                this.collected = collected;\n            }\n\n            public boolean isPlayed() {\n                return played;\n            }\n\n            public void setPlayed(boolean played) {\n                this.played = played;\n            }\n\n            public Object getLastViewTime() {\n                return lastViewTime;\n            }\n\n            public void setLastViewTime(Object lastViewTime) {\n                this.lastViewTime = lastViewTime;\n            }\n\n            public Object getPlaylists() {\n                return playlists;\n            }\n\n            public void setPlaylists(Object playlists) {\n                this.playlists = playlists;\n            }\n\n            public Object getSrc() {\n                return src;\n            }\n\n            public void setSrc(Object src) {\n                this.src = src;\n            }\n\n            public List<PlayInfoBean> getPlayInfo() {\n                return playInfo;\n            }\n\n            public void setPlayInfo(List<PlayInfoBean> playInfo) {\n                this.playInfo = playInfo;\n            }\n\n            public List<TagsBean> getTags() {\n                return tags;\n            }\n\n            public void setTags(List<TagsBean> tags) {\n                this.tags = tags;\n            }\n\n            public List<?> getLabelList() {\n                return labelList;\n            }\n\n            public void setLabelList(List<?> labelList) {\n                this.labelList = labelList;\n            }\n\n            public List<?> getSubtitles() {\n                return subtitles;\n            }\n\n            public void setSubtitles(List<?> subtitles) {\n                this.subtitles = subtitles;\n            }\n\n            public static class ProviderBean {\n                /**\n                 * name : PGC\n                 * alias : PGC\n                 * icon :\n                 */\n\n                private String name;\n                private String alias;\n                private String icon;\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 getAlias() {\n                    return alias;\n                }\n\n                public void setAlias(String alias) {\n                    this.alias = alias;\n                }\n\n                public String getIcon() {\n                    return icon;\n                }\n\n                public void setIcon(String icon) {\n                    this.icon = icon;\n                }\n            }\n\n            public static class AuthorBean {\n                /**\n                 * id : 2098\n                 * icon : http://img.kaiyanapp.com/608dafdede807bd3748b582a32dc0a33.png?imageMogr2/quality/60/format/jpg\n                 * name : 火星人俱乐部\n                 * description : 科普趣味生活，亲子科学实验；北大老师陪你趣学科学；\n                 * link :\n                 * latestReleaseTime : 1513237731000\n                 * videoNum : 62\n                 * adTrack : null\n                 * follow : {\"itemType\":\"author\",\"itemId\":2098,\"followed\":false}\n                 * shield : {\"itemType\":\"author\",\"itemId\":2098,\"shielded\":false}\n                 * approvedNotReadyVideoCount : 0\n                 * ifPgc : true\n                 */\n\n                private int id;\n                private String icon;\n                private String name;\n                private String description;\n                private String link;\n                private long latestReleaseTime;\n                private int videoNum;\n                private Object adTrack;\n                private FollowBean follow;\n                private ShieldBean shield;\n                private int approvedNotReadyVideoCount;\n                private boolean ifPgc;\n\n                public int getId() {\n                    return id;\n                }\n\n                public void setId(int id) {\n                    this.id = id;\n                }\n\n                public String getIcon() {\n                    return icon;\n                }\n\n                public void setIcon(String icon) {\n                    this.icon = icon;\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 getDescription() {\n                    return description;\n                }\n\n                public void setDescription(String description) {\n                    this.description = description;\n                }\n\n                public String getLink() {\n                    return link;\n                }\n\n                public void setLink(String link) {\n                    this.link = link;\n                }\n\n                public long getLatestReleaseTime() {\n                    return latestReleaseTime;\n                }\n\n                public void setLatestReleaseTime(long latestReleaseTime) {\n                    this.latestReleaseTime = latestReleaseTime;\n                }\n\n                public int getVideoNum() {\n                    return videoNum;\n                }\n\n                public void setVideoNum(int videoNum) {\n                    this.videoNum = videoNum;\n                }\n\n                public Object getAdTrack() {\n                    return adTrack;\n                }\n\n                public void setAdTrack(Object adTrack) {\n                    this.adTrack = adTrack;\n                }\n\n                public FollowBean getFollow() {\n                    return follow;\n                }\n\n                public void setFollow(FollowBean follow) {\n                    this.follow = follow;\n                }\n\n                public ShieldBean getShield() {\n                    return shield;\n                }\n\n                public void setShield(ShieldBean shield) {\n                    this.shield = shield;\n                }\n\n                public int getApprovedNotReadyVideoCount() {\n                    return approvedNotReadyVideoCount;\n                }\n\n                public void setApprovedNotReadyVideoCount(int approvedNotReadyVideoCount) {\n                    this.approvedNotReadyVideoCount = approvedNotReadyVideoCount;\n                }\n\n                public boolean isIfPgc() {\n                    return ifPgc;\n                }\n\n                public void setIfPgc(boolean ifPgc) {\n                    this.ifPgc = ifPgc;\n                }\n\n                public static class FollowBean {\n                    /**\n                     * itemType : author\n                     * itemId : 2098\n                     * followed : false\n                     */\n\n                    private String itemType;\n                    private int itemId;\n                    private boolean followed;\n\n                    public String getItemType() {\n                        return itemType;\n                    }\n\n                    public void setItemType(String itemType) {\n                        this.itemType = itemType;\n                    }\n\n                    public int getItemId() {\n                        return itemId;\n                    }\n\n                    public void setItemId(int itemId) {\n                        this.itemId = itemId;\n                    }\n\n                    public boolean isFollowed() {\n                        return followed;\n                    }\n\n                    public void setFollowed(boolean followed) {\n                        this.followed = followed;\n                    }\n                }\n\n                public static class ShieldBean {\n                    /**\n                     * itemType : author\n                     * itemId : 2098\n                     * shielded : false\n                     */\n\n                    private String itemType;\n                    private int itemId;\n                    private boolean shielded;\n\n                    public String getItemType() {\n                        return itemType;\n                    }\n\n                    public void setItemType(String itemType) {\n                        this.itemType = itemType;\n                    }\n\n                    public int getItemId() {\n                        return itemId;\n                    }\n\n                    public void setItemId(int itemId) {\n                        this.itemId = itemId;\n                    }\n\n                    public boolean isShielded() {\n                        return shielded;\n                    }\n\n                    public void setShielded(boolean shielded) {\n                        this.shielded = shielded;\n                    }\n                }\n            }\n\n            public static class CoverBean {\n                /**\n                 * feed : http://img.kaiyanapp.com/9f4a7de9c2244499a95de914f22d76b4.png?imageMogr2/quality/60/format/jpg\n                 * detail : http://img.kaiyanapp.com/9f4a7de9c2244499a95de914f22d76b4.png?imageMogr2/quality/60/format/jpg\n                 * blurred : http://img.kaiyanapp.com/1661e0b22a0768be62510bcc934b2ac6.jpeg?imageMogr2/quality/60/format/jpg\n                 * sharing : null\n                 * homepage : null\n                 */\n\n                private String feed;\n                private String detail;\n                private String blurred;\n                private Object sharing;\n                private Object homepage;\n\n                public String getFeed() {\n                    return feed;\n                }\n\n                public void setFeed(String feed) {\n                    this.feed = feed;\n                }\n\n                public String getDetail() {\n                    return detail;\n                }\n\n                public void setDetail(String detail) {\n                    this.detail = detail;\n                }\n\n                public String getBlurred() {\n                    return blurred;\n                }\n\n                public void setBlurred(String blurred) {\n                    this.blurred = blurred;\n                }\n\n                public Object getSharing() {\n                    return sharing;\n                }\n\n                public void setSharing(Object sharing) {\n                    this.sharing = sharing;\n                }\n\n                public Object getHomepage() {\n                    return homepage;\n                }\n\n                public void setHomepage(Object homepage) {\n                    this.homepage = homepage;\n                }\n            }\n\n            public static class WebUrlBean {\n                /**\n                 * raw : http://www.eyepetizer.net/detail.html?vid=66374\n                 * forWeibo : http://www.eyepetizer.net/detail.html?vid=66374\n                 */\n\n                private String raw;\n                private String forWeibo;\n\n                public String getRaw() {\n                    return raw;\n                }\n\n                public void setRaw(String raw) {\n                    this.raw = raw;\n                }\n\n                public String getForWeibo() {\n                    return forWeibo;\n                }\n\n                public void setForWeibo(String forWeibo) {\n                    this.forWeibo = forWeibo;\n                }\n            }\n\n            public static class ConsumptionBean {\n                /**\n                 * collectionCount : 0\n                 * shareCount : 2\n                 * replyCount : 0\n                 */\n\n                private int collectionCount;\n                private int shareCount;\n                private int replyCount;\n\n                public int getCollectionCount() {\n                    return collectionCount;\n                }\n\n                public void setCollectionCount(int collectionCount) {\n                    this.collectionCount = collectionCount;\n                }\n\n                public int getShareCount() {\n                    return shareCount;\n                }\n\n                public void setShareCount(int shareCount) {\n                    this.shareCount = shareCount;\n                }\n\n                public int getReplyCount() {\n                    return replyCount;\n                }\n\n                public void setReplyCount(int replyCount) {\n                    this.replyCount = replyCount;\n                }\n            }\n\n            public static class PlayInfoBean {\n                /**\n                 * height : 720\n                 * width : 1280\n                 * urlList : [{\"name\":\"aliyun\",\"url\":\"http://baobab.kaiyanapp.com/api/v1/playUrl?vid=66374&editionType=high&source=aliyun\",\"size\":14871277},{\"name\":\"qcloud\",\"url\":\"http://baobab.kaiyanapp.com/api/v1/playUrl?vid=66374&editionType=high&source=qcloud\",\"size\":14871277},{\"name\":\"ucloud\",\"url\":\"http://baobab.kaiyanapp.com/api/v1/playUrl?vid=66374&editionType=high&source=ucloud\",\"size\":14871277}]\n                 * name : 高清\n                 * type : high\n                 * url : http://baobab.kaiyanapp.com/api/v1/playUrl?vid=66374&editionType=high&source=aliyun\n                 */\n\n                private int height;\n                private int width;\n                private String name;\n                private String type;\n                private String url;\n                private List<UrlListBean> urlList;\n\n                public int getHeight() {\n                    return height;\n                }\n\n                public void setHeight(int height) {\n                    this.height = height;\n                }\n\n                public int getWidth() {\n                    return width;\n                }\n\n                public void setWidth(int width) {\n                    this.width = width;\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 getType() {\n                    return type;\n                }\n\n                public void setType(String type) {\n                    this.type = type;\n                }\n\n                public String getUrl() {\n                    return url;\n                }\n\n                public void setUrl(String url) {\n                    this.url = url;\n                }\n\n                public List<UrlListBean> getUrlList() {\n                    return urlList;\n                }\n\n                public void setUrlList(List<UrlListBean> urlList) {\n                    this.urlList = urlList;\n                }\n\n                public static class UrlListBean {\n                    /**\n                     * name : aliyun\n                     * url : http://baobab.kaiyanapp.com/api/v1/playUrl?vid=66374&editionType=high&source=aliyun\n                     * size : 14871277\n                     */\n\n                    private String name;\n                    private String url;\n                    private int size;\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 getUrl() {\n                        return url;\n                    }\n\n                    public void setUrl(String url) {\n                        this.url = url;\n                    }\n\n                    public int getSize() {\n                        return size;\n                    }\n\n                    public void setSize(int size) {\n                        this.size = size;\n                    }\n                }\n            }\n\n            public static class TagsBean {\n                /**\n                 * id : 484\n                 * name : 干货\n                 * actionUrl : eyepetizer://tag/484/?title=%E5%B9%B2%E8%B4%A7\n                 * adTrack : null\n                 * desc : null\n                 * bgPicture : http://img.kaiyanapp.com/27856a0c2855246c31c19f7a8fd814ce.jpeg?imageMogr2/quality/60/format/jpg\n                 * headerImage : http://img.kaiyanapp.com/27856a0c2855246c31c19f7a8fd814ce.jpeg?imageMogr2/quality/60/format/jpg\n                 * tagRecType : NORMAL\n                 */\n\n                private int id;\n                private String name;\n                private String actionUrl;\n                private Object adTrack;\n                private Object desc;\n                private String bgPicture;\n                private String headerImage;\n                private String tagRecType;\n\n                public int getId() {\n                    return id;\n                }\n\n                public void setId(int id) {\n                    this.id = id;\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 getActionUrl() {\n                    return actionUrl;\n                }\n\n                public void setActionUrl(String actionUrl) {\n                    this.actionUrl = actionUrl;\n                }\n\n                public Object getAdTrack() {\n                    return adTrack;\n                }\n\n                public void setAdTrack(Object adTrack) {\n                    this.adTrack = adTrack;\n                }\n\n                public Object getDesc() {\n                    return desc;\n                }\n\n                public void setDesc(Object desc) {\n                    this.desc = desc;\n                }\n\n                public String getBgPicture() {\n                    return bgPicture;\n                }\n\n                public void setBgPicture(String bgPicture) {\n                    this.bgPicture = bgPicture;\n                }\n\n                public String getHeaderImage() {\n                    return headerImage;\n                }\n\n                public void setHeaderImage(String headerImage) {\n                    this.headerImage = headerImage;\n                }\n\n                public String getTagRecType() {\n                    return tagRecType;\n                }\n\n                public void setTagRecType(String tagRecType) {\n                    this.tagRecType = tagRecType;\n                }\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/example/discover/http/HttpClient.java",
    "content": "package com.example.discover.http;\n\nimport com.example.discover.bean.AuthorDetailBean;\nimport com.example.discover.bean.DetailBean.FindCategory;\nimport com.example.discover.bean.DetailBean.ItemList;\nimport com.example.discover.bean.DetailBean.Replies;\nimport com.example.discover.bean.GankBean;\nimport com.example.discover.bean.HotEyeBean;\nimport com.example.discover.bean.ResultBean;\nimport com.example.http.HttpUtils;\n\nimport java.util.List;\n\nimport io.reactivex.Flowable;\nimport retrofit2.http.GET;\nimport retrofit2.http.Path;\nimport retrofit2.http.Query;\n\n\n/**\n * Created by Administrator on 2017/12/9 0009.\n */\n\npublic interface HttpClient {\n    class Builder {\n        public static HttpClient getEyeService() {\n            return HttpUtils.getInstance().getEyeServer(HttpClient.class);\n        }\n\n        public static HttpClient getGankService() {\n            return HttpUtils.getInstance().getGankServer(HttpClient.class);\n        }\n    }\n\n    /**\n     *\n     * @param start 从多少开始，如从“0”开始\n     * @param num   一次请求的数目（从start开始计算）\n     * @return\n     */\n    @GET(\"v4/discovery/hot\")\n    Flowable<HotEyeBean> getEyeHot(@Query(\"start\") int start, @Query(\"num\") int num);\n\n    /**\n     *\n     * @param id = 2创意4开胃6旅行8预告10动画12剧情14广告18运动20音乐22记录24时尚26萌宠28搞笑30游戏32科普34集锦36生活38综艺\n     * @return\n     */\n    @GET(\"v3/categories/detail\")\n    Flowable<FindCategory> getEyeCateGory(@Query(\"id\") int id);\n\n    @GET(\"v3/pgc/videos\")\n    Flowable<AuthorDetailBean> getAuthorRelated(@Query(\"start\") int start, @Query(\"pgcId\") int id, @Query(\"strategy\") String strategy);\n\n    @GET(\"v3/queries/hot\")\n    Flowable<List<String>> getTrendingTag();\n\n    @GET(\"v1/search?num=10\")\n    Flowable<ResultBean> getResult(@Query(\"query\") String key, @Query(\"start\") int start);\n\n    @GET(\"v1/replies/video\")\n    Flowable<Replies> fetchReplies(@Query(\"id\") int id);\n\n    @GET(\"v1/replies/video?num=10\")\n    Flowable<Replies> fetchReplies(@Query(\"id\") int id, @Query(\"lastId\") int lastId);\n\n\n    @GET(\"data/{type}/{number}/{page}\")\n    Flowable<GankBean> getGankData(@Path(\"type\") String id, @Path(\"number\") int number, @Path(\"page\") int page);\n}\n"
  },
  {
    "path": "app/src/main/java/com/example/discover/http/RequestListener.java",
    "content": "package com.example.discover.http;\n\nimport io.reactivex.disposables.Disposable;\n\n/**\n * Created by Administrator on 2017/12/12 0012.\n */\n\npublic interface RequestListener {\n    void onSuccess(Object object);\n\n    void onFailed(Throwable t);\n\n    void onCompleted();\n}\n"
  },
  {
    "path": "app/src/main/java/com/example/discover/http/cahe/ACache.java",
    "content": "/**\n * Copyright (c) 2012-2013, Michael Yang 杨福海 (www.yangfuhai.com).\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage com.example.discover.http.cahe;\n\nimport android.content.Context;\nimport android.graphics.Bitmap;\nimport android.graphics.BitmapFactory;\nimport android.graphics.Canvas;\nimport android.graphics.PixelFormat;\nimport android.graphics.drawable.BitmapDrawable;\nimport android.graphics.drawable.Drawable;\n\nimport org.json.JSONArray;\nimport org.json.JSONObject;\n\nimport java.io.BufferedReader;\nimport java.io.BufferedWriter;\nimport java.io.ByteArrayInputStream;\nimport java.io.ByteArrayOutputStream;\nimport java.io.File;\nimport java.io.FileOutputStream;\nimport java.io.FileReader;\nimport java.io.FileWriter;\nimport java.io.IOException;\nimport java.io.ObjectInputStream;\nimport java.io.ObjectOutputStream;\nimport java.io.RandomAccessFile;\nimport java.io.Serializable;\nimport java.util.Collections;\nimport java.util.HashMap;\nimport java.util.Map;\nimport java.util.Map.Entry;\nimport java.util.Set;\nimport java.util.concurrent.atomic.AtomicInteger;\nimport java.util.concurrent.atomic.AtomicLong;\n\n/**\n * @author Michael Yang（www.yangfuhai.com） update at 2013.08.07\n */\npublic class ACache {\n\tpublic static final int TIME_HOUR = 60 * 60;\n\tpublic static final int TIME_DAY = TIME_HOUR * 24;\n\tprivate static final int MAX_SIZE = 1000 * 1000 * 50; // 50 mb\n\tprivate static final int MAX_COUNT = Integer.MAX_VALUE; // 不限制存放数据的数量\n\tprivate static Map<String, ACache> mInstanceMap = new HashMap<String, ACache>();\n\tprivate ACacheManager mCache;\n\n\tpublic static ACache get(Context ctx) {\n\t\treturn get(ctx, \"ACache\");\n\t}\n\n\tpublic static ACache get(Context ctx, String cacheName) {\n\t\tFile f = new File(ctx.getCacheDir(), cacheName);\n\t\treturn get(f, MAX_SIZE, MAX_COUNT);\n\t}\n\n\tpublic static ACache get(File cacheDir) {\n\t\treturn get(cacheDir, MAX_SIZE, MAX_COUNT);\n\t}\n\n\tpublic static ACache get(Context ctx, long max_zise, int max_count) {\n\t\tFile f = new File(ctx.getCacheDir(), \"ACache\");\n\t\treturn get(f, max_zise, max_count);\n\t}\n\n\tpublic static ACache get(File cacheDir, long max_zise, int max_count) {\n\t\tACache manager = mInstanceMap.get(cacheDir.getAbsoluteFile() + myPid());\n\t\tif (manager == null) {\n\t\t\tmanager = new ACache(cacheDir, max_zise, max_count);\n\t\t\tmInstanceMap.put(cacheDir.getAbsolutePath() + myPid(), manager);\n\t\t}\n\t\treturn manager;\n\t}\n\n\tprivate static String myPid() {\n\t\treturn \"_\" + android.os.Process.myPid();\n\t}\n\n\tprivate ACache(File cacheDir, long max_size, int max_count) {\n\t\tif (!cacheDir.exists() && !cacheDir.mkdirs()) {\n\t\t\tthrow new RuntimeException(\"can't make dirs in \"\n\t\t\t\t\t+ cacheDir.getAbsolutePath());\n\t\t}\n\t\tmCache = new ACacheManager(cacheDir, max_size, max_count);\n\t}\n\n\t// =======================================\n\t// ============ String数据 读写 ==============\n\t// =======================================\n\t/**\n\t * 保存 String数据 到 缓存中\n\t * \n\t * @param key\n\t *            保存的key\n\t * @param value\n\t *            保存的String数据\n\t */\n\tpublic void put(String key, String value) {\n\t\tFile file = mCache.newFile(key);\n\t\tBufferedWriter out = null;\n\t\ttry {\n\t\t\tout = new BufferedWriter(new FileWriter(file), 1024);\n\t\t\tout.write(value);\n\t\t} catch (IOException e) {\n\t\t\te.printStackTrace();\n\t\t} finally {\n\t\t\tif (out != null) {\n\t\t\t\ttry {\n\t\t\t\t\tout.flush();\n\t\t\t\t\tout.close();\n\t\t\t\t} catch (IOException e) {\n\t\t\t\t\te.printStackTrace();\n\t\t\t\t}\n\t\t\t}\n\t\t\tmCache.put(file);\n\t\t}\n\t}\n\n\t/**\n\t * 保存 String数据 到 缓存中\n\t * \n\t * @param key\n\t *            保存的key\n\t * @param value\n\t *            保存的String数据\n\t * @param saveTime\n\t *            保存的时间，单位：秒\n\t */\n\tpublic void put(String key, String value, int saveTime) {\n\t\tput(key, Utils.newStringWithDateInfo(saveTime, value));\n\t}\n\n\t/**\n\t * 读取 String数据\n\t * \n\t * @param key\n\t * @return String 数据\n\t */\n\tpublic String getAsString(String key) {\n\t\tFile file = mCache.get(key);\n\t\tif (!file.exists())\n\t\t\treturn null;\n\t\tboolean removeFile = false;\n\t\tBufferedReader in = null;\n\t\ttry {\n\t\t\tin = new BufferedReader(new FileReader(file));\n\t\t\tString readString = \"\";\n\t\t\tString currentLine;\n\t\t\twhile ((currentLine = in.readLine()) != null) {\n\t\t\t\treadString += currentLine;\n\t\t\t}\n\t\t\tif (!Utils.isDue(readString)) {\n\t\t\t\treturn Utils.clearDateInfo(readString);\n\t\t\t} else {\n\t\t\t\tremoveFile = true;\n\t\t\t\treturn null;\n\t\t\t}\n\t\t} catch (IOException e) {\n\t\t\te.printStackTrace();\n\t\t\treturn null;\n\t\t} finally {\n\t\t\tif (in != null) {\n\t\t\t\ttry {\n\t\t\t\t\tin.close();\n\t\t\t\t} catch (IOException e) {\n\t\t\t\t\te.printStackTrace();\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (removeFile)\n\t\t\t\tremove(key);\n\t\t}\n\t}\n\n\t// =======================================\n\t// ============= JSONObject 数据 读写 ==============\n\t// =======================================\n\t/**\n\t * 保存 JSONObject数据 到 缓存中\n\t * \n\t * @param key\n\t *            保存的key\n\t * @param value\n\t *            保存的JSON数据\n\t */\n\tpublic void put(String key, JSONObject value) {\n\t\tput(key, value.toString());\n\t}\n\n\t/**\n\t * 保存 JSONObject数据 到 缓存中\n\t * \n\t * @param key\n\t *            保存的key\n\t * @param value\n\t *            保存的JSONObject数据\n\t * @param saveTime\n\t *            保存的时间，单位：秒\n\t */\n\tpublic void put(String key, JSONObject value, int saveTime) {\n\t\tput(key, value.toString(), saveTime);\n\t}\n\n\t/**\n\t * 读取JSONObject数据\n\t * \n\t * @param key\n\t * @return JSONObject数据\n\t */\n\tpublic JSONObject getAsJSONObject(String key) {\n\t\tString JSONString = getAsString(key);\n\t\ttry {\n\t\t\tJSONObject obj = new JSONObject(JSONString);\n\t\t\treturn obj;\n\t\t} catch (Exception e) {\n\t\t\te.printStackTrace();\n\t\t\treturn null;\n\t\t}\n\t}\n\n\t// =======================================\n\t// ============ JSONArray 数据 读写 =============\n\t// =======================================\n\t/**\n\t * 保存 JSONArray数据 到 缓存中\n\t * \n\t * @param key\n\t *            保存的key\n\t * @param value\n\t *            保存的JSONArray数据\n\t */\n\tpublic void put(String key, JSONArray value) {\n\t\tput(key, value.toString());\n\t}\n\n\t/**\n\t * 保存 JSONArray数据 到 缓存中\n\t * \n\t * @param key\n\t *            保存的key\n\t * @param value\n\t *            保存的JSONArray数据\n\t * @param saveTime\n\t *            保存的时间，单位：秒\n\t */\n\tpublic void put(String key, JSONArray value, int saveTime) {\n\t\tput(key, value.toString(), saveTime);\n\t}\n\n\t/**\n\t * 读取JSONArray数据\n\t * \n\t * @param key\n\t * @return JSONArray数据\n\t */\n\tpublic JSONArray getAsJSONArray(String key) {\n\t\tString JSONString = getAsString(key);\n\t\ttry {\n\t\t\tJSONArray obj = new JSONArray(JSONString);\n\t\t\treturn obj;\n\t\t} catch (Exception e) {\n\t\t\te.printStackTrace();\n\t\t\treturn null;\n\t\t}\n\t}\n\n\t// =======================================\n\t// ============== byte 数据 读写 =============\n\t// =======================================\n\t/**\n\t * 保存 byte数据 到 缓存中\n\t * \n\t * @param key\n\t *            保存的key\n\t * @param value\n\t *            保存的数据\n\t */\n\tpublic void put(String key, byte[] value) {\n\t\tFile file = mCache.newFile(key);\n\t\tFileOutputStream out = null;\n\t\ttry {\n\t\t\tout = new FileOutputStream(file);\n\t\t\tout.write(value);\n\t\t} catch (Exception e) {\n\t\t\te.printStackTrace();\n\t\t} finally {\n\t\t\tif (out != null) {\n\t\t\t\ttry {\n\t\t\t\t\tout.flush();\n\t\t\t\t\tout.close();\n\t\t\t\t} catch (IOException e) {\n\t\t\t\t\te.printStackTrace();\n\t\t\t\t}\n\t\t\t}\n\t\t\tmCache.put(file);\n\t\t}\n\t}\n\n\t/**\n\t * 保存 byte数据 到 缓存中\n\t * \n\t * @param key\n\t *            保存的key\n\t * @param value\n\t *            保存的数据\n\t * @param saveTime\n\t *            保存的时间，单位：秒\n\t */\n\tpublic void put(String key, byte[] value, int saveTime) {\n\t\tput(key, Utils.newByteArrayWithDateInfo(saveTime, value));\n\t}\n\n\t/**\n\t * 获取 byte 数据\n\t * \n\t * @param key\n\t * @return byte 数据\n\t */\n\tpublic byte[] getAsBinary(String key) {\n\t\tRandomAccessFile RAFile = null;\n\t\tboolean removeFile = false;\n\t\ttry {\n\t\t\tFile file = mCache.get(key);\n\t\t\tif (!file.exists())\n\t\t\t\treturn null;\n\t\t\tRAFile = new RandomAccessFile(file, \"r\");\n\t\t\tbyte[] byteArray = new byte[(int) RAFile.length()];\n\t\t\tRAFile.read(byteArray);\n\t\t\tif (!Utils.isDue(byteArray)) {\n\t\t\t\treturn Utils.clearDateInfo(byteArray);\n\t\t\t} else {\n\t\t\t\tremoveFile = true;\n\t\t\t\treturn null;\n\t\t\t}\n\t\t} catch (Exception e) {\n\t\t\te.printStackTrace();\n\t\t\treturn null;\n\t\t} finally {\n\t\t\tif (RAFile != null) {\n\t\t\t\ttry {\n\t\t\t\t\tRAFile.close();\n\t\t\t\t} catch (IOException e) {\n\t\t\t\t\te.printStackTrace();\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (removeFile)\n\t\t\t\tremove(key);\n\t\t}\n\t}\n\n\t// =======================================\n\t// ============= 序列化 数据 读写 ===============\n\t// =======================================\n\t/**\n\t * 保存 Serializable数据 到 缓存中\n\t * \n\t * @param key\n\t *            保存的key\n\t * @param value\n\t *            保存的value\n\t */\n\tpublic void put(String key, Serializable value) {\n\t\tput(key, value, -1);\n\t}\n\n\t/**\n\t * 保存 Serializable数据到 缓存中\n\t * \n\t * @param key\n\t *            保存的key\n\t * @param value\n\t *            保存的value\n\t * @param saveTime\n\t *            保存的时间，单位：秒\n\t */\n\tpublic void put(String key, Serializable value, int saveTime) {\n\t\tByteArrayOutputStream baos = null;\n\t\tObjectOutputStream oos = null;\n\t\ttry {\n\t\t\tbaos = new ByteArrayOutputStream();\n\t\t\toos = new ObjectOutputStream(baos);\n\t\t\toos.writeObject(value);\n\t\t\tbyte[] data = baos.toByteArray();\n\t\t\tif (saveTime != -1) {\n\t\t\t\tput(key, data, saveTime);\n\t\t\t} else {\n\t\t\t\tput(key, data);\n\t\t\t}\n\t\t} catch (Exception e) {\n\t\t\te.printStackTrace();\n\t\t} finally {\n\t\t\ttry {\n\t\t\t\toos.close();\n\t\t\t} catch (IOException e) {\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * 读取 Serializable数据\n\t * \n\t * @param key\n\t * @return Serializable 数据\n\t */\n\tpublic Object getAsObject(String key) {\n\t\tbyte[] data = getAsBinary(key);\n\t\tif (data != null) {\n\t\t\tByteArrayInputStream bais = null;\n\t\t\tObjectInputStream ois = null;\n\t\t\ttry {\n\t\t\t\tbais = new ByteArrayInputStream(data);\n\t\t\t\tois = new ObjectInputStream(bais);\n\t\t\t\tObject reObject = ois.readObject();\n\t\t\t\treturn reObject;\n\t\t\t} catch (Exception e) {\n\t\t\t\te.printStackTrace();\n\t\t\t\treturn null;\n\t\t\t} finally {\n\t\t\t\ttry {\n\t\t\t\t\tif (bais != null)\n\t\t\t\t\t\tbais.close();\n\t\t\t\t} catch (IOException e) {\n\t\t\t\t\te.printStackTrace();\n\t\t\t\t}\n\t\t\t\ttry {\n\t\t\t\t\tif (ois != null)\n\t\t\t\t\t\tois.close();\n\t\t\t\t} catch (IOException e) {\n\t\t\t\t\te.printStackTrace();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn null;\n\n\t}\n\n\t// =======================================\n\t// ============== bitmap 数据 读写 =============\n\t// =======================================\n\t/**\n\t * 保存 bitmap 到 缓存中\n\t * \n\t * @param key\n\t *            保存的key\n\t * @param value\n\t *            保存的bitmap数据\n\t */\n\tpublic void put(String key, Bitmap value) {\n\t\tput(key, Utils.Bitmap2Bytes(value));\n\t}\n\n\t/**\n\t * 保存 bitmap 到 缓存中\n\t * \n\t * @param key\n\t *            保存的key\n\t * @param value\n\t *            保存的 bitmap 数据\n\t * @param saveTime\n\t *            保存的时间，单位：秒\n\t */\n\tpublic void put(String key, Bitmap value, int saveTime) {\n\t\tput(key, Utils.Bitmap2Bytes(value), saveTime);\n\t}\n\n\t/**\n\t * 读取 bitmap 数据\n\t * \n\t * @param key\n\t * @return bitmap 数据\n\t */\n\tpublic Bitmap getAsBitmap(String key) {\n\t\tif (getAsBinary(key) == null) {\n\t\t\treturn null;\n\t\t}\n\t\treturn Utils.Bytes2Bimap(getAsBinary(key));\n\t}\n\n\t// =======================================\n\t// ============= drawable 数据 读写 =============\n\t// =======================================\n\t/**\n\t * 保存 drawable 到 缓存中\n\t * \n\t * @param key\n\t *            保存的key\n\t * @param value\n\t *            保存的drawable数据\n\t */\n\tpublic void put(String key, Drawable value) {\n\t\tput(key, Utils.drawable2Bitmap(value));\n\t}\n\n\t/**\n\t * 保存 drawable 到 缓存中\n\t * \n\t * @param key\n\t *            保存的key\n\t * @param value\n\t *            保存的 drawable 数据\n\t * @param saveTime\n\t *            保存的时间，单位：秒\n\t */\n\tpublic void put(String key, Drawable value, int saveTime) {\n\t\tput(key, Utils.drawable2Bitmap(value), saveTime);\n\t}\n\n\t/**\n\t * 读取 Drawable 数据\n\t * \n\t * @param key\n\t * @return Drawable 数据\n\t */\n\tpublic Drawable getAsDrawable(String key) {\n\t\tif (getAsBinary(key) == null) {\n\t\t\treturn null;\n\t\t}\n\t\treturn Utils.bitmap2Drawable(Utils.Bytes2Bimap(getAsBinary(key)));\n\t}\n\n\t/**\n\t * 获取缓存文件\n\t * \n\t * @param key\n\t * @return value 缓存的文件\n\t */\n\tpublic File file(String key) {\n\t\tFile f = mCache.newFile(key);\n\t\tif (f.exists())\n\t\t\treturn f;\n\t\treturn null;\n\t}\n\n\t/**\n\t * 移除某个key\n\t * \n\t * @param key\n\t * @return 是否移除成功\n\t */\n\tpublic boolean remove(String key) {\n\t\treturn mCache.remove(key);\n\t}\n\n\t/**\n\t * 清除所有数据\n\t */\n\tpublic void clear() {\n\t\tmCache.clear();\n\t}\n\n\t/**\n\t * @title 缓存管理器\n\t * @author 杨福海（michael） www.yangfuhai.com\n\t * @version 1.0\n\t */\n\tpublic class ACacheManager {\n\t\tprivate final AtomicLong cacheSize;\n\t\tprivate final AtomicInteger cacheCount;\n\t\tprivate final long sizeLimit;\n\t\tprivate final int countLimit;\n\t\tprivate final Map<File, Long> lastUsageDates = Collections\n\t\t\t\t.synchronizedMap(new HashMap<File, Long>());\n\t\tprotected File cacheDir;\n\n\t\tprivate ACacheManager(File cacheDir, long sizeLimit, int countLimit) {\n\t\t\tthis.cacheDir = cacheDir;\n\t\t\tthis.sizeLimit = sizeLimit;\n\t\t\tthis.countLimit = countLimit;\n\t\t\tcacheSize = new AtomicLong();\n\t\t\tcacheCount = new AtomicInteger();\n\t\t\tcalculateCacheSizeAndCacheCount();\n\t\t}\n\n\t\t/**\n\t\t * 计算 cacheSize和cacheCount\n\t\t */\n\t\tprivate void calculateCacheSizeAndCacheCount() {\n\t\t\tnew Thread(new Runnable() {\n\t\t\t\t@Override\n\t\t\t\tpublic void run() {\n\t\t\t\t\tint size = 0;\n\t\t\t\t\tint count = 0;\n\t\t\t\t\tFile[] cachedFiles = cacheDir.listFiles();\n\t\t\t\t\tif (cachedFiles != null) {\n\t\t\t\t\t\tfor (File cachedFile : cachedFiles) {\n\t\t\t\t\t\t\tsize += calculateSize(cachedFile);\n\t\t\t\t\t\t\tcount += 1;\n\t\t\t\t\t\t\tlastUsageDates.put(cachedFile,\n\t\t\t\t\t\t\t\t\tcachedFile.lastModified());\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcacheSize.set(size);\n\t\t\t\t\t\tcacheCount.set(count);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}).start();\n\t\t}\n\n\t\tprivate void put(File file) {\n\t\t\tint curCacheCount = cacheCount.get();\n\t\t\twhile (curCacheCount + 1 > countLimit) {\n\t\t\t\tlong freedSize = removeNext();\n\t\t\t\tcacheSize.addAndGet(-freedSize);\n\n\t\t\t\tcurCacheCount = cacheCount.addAndGet(-1);\n\t\t\t}\n\t\t\tcacheCount.addAndGet(1);\n\n\t\t\tlong valueSize = calculateSize(file);\n\t\t\tlong curCacheSize = cacheSize.get();\n\t\t\twhile (curCacheSize + valueSize > sizeLimit) {\n\t\t\t\tlong freedSize = removeNext();\n\t\t\t\tcurCacheSize = cacheSize.addAndGet(-freedSize);\n\t\t\t}\n\t\t\tcacheSize.addAndGet(valueSize);\n\n\t\t\tLong currentTime = System.currentTimeMillis();\n\t\t\tfile.setLastModified(currentTime);\n\t\t\tlastUsageDates.put(file, currentTime);\n\t\t}\n\n\t\tprivate File get(String key) {\n\t\t\tFile file = newFile(key);\n\t\t\tLong currentTime = System.currentTimeMillis();\n\t\t\tfile.setLastModified(currentTime);\n\t\t\tlastUsageDates.put(file, currentTime);\n\n\t\t\treturn file;\n\t\t}\n\n\t\tprivate File newFile(String key) {\n\t\t\treturn new File(cacheDir, key.hashCode() + \"\");\n\t\t}\n\n\t\tprivate boolean remove(String key) {\n\t\t\tFile image = get(key);\n\t\t\treturn image.delete();\n\t\t}\n\n\t\tprivate void clear() {\n\t\t\tlastUsageDates.clear();\n\t\t\tcacheSize.set(0);\n\t\t\tFile[] files = cacheDir.listFiles();\n\t\t\tif (files != null) {\n\t\t\t\tfor (File f : files) {\n\t\t\t\t\tf.delete();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t/**\n\t\t * 移除旧的文件\n\t\t * \n\t\t * @return\n\t\t */\n\t\tprivate long removeNext() {\n\t\t\tif (lastUsageDates.isEmpty()) {\n\t\t\t\treturn 0;\n\t\t\t}\n\n\t\t\tLong oldestUsage = null;\n\t\t\tFile mostLongUsedFile = null;\n\t\t\tSet<Entry<File, Long>> entries = lastUsageDates.entrySet();\n\t\t\tsynchronized (lastUsageDates) {\n\t\t\t\tfor (Entry<File, Long> entry : entries) {\n\t\t\t\t\tif (mostLongUsedFile == null) {\n\t\t\t\t\t\tmostLongUsedFile = entry.getKey();\n\t\t\t\t\t\toldestUsage = entry.getValue();\n\t\t\t\t\t} else {\n\t\t\t\t\t\tLong lastValueUsage = entry.getValue();\n\t\t\t\t\t\tif (lastValueUsage < oldestUsage) {\n\t\t\t\t\t\t\toldestUsage = lastValueUsage;\n\t\t\t\t\t\t\tmostLongUsedFile = entry.getKey();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tlong fileSize = calculateSize(mostLongUsedFile);\n\t\t\tif (mostLongUsedFile.delete()) {\n\t\t\t\tlastUsageDates.remove(mostLongUsedFile);\n\t\t\t}\n\t\t\treturn fileSize;\n\t\t}\n\n\t\tprivate long calculateSize(File file) {\n\t\t\treturn file.length();\n\t\t}\n\t}\n\n\t/**\n\t * @title 时间计算工具类\n\t * @author 杨福海（michael） www.yangfuhai.com\n\t * @version 1.0\n\t */\n\tprivate static class Utils {\n\n\t\t/**\n\t\t * 判断缓存的String数据是否到期\n\t\t * \n\t\t * @param str\n\t\t * @return true：到期了 false：还没有到期\n\t\t */\n\t\tprivate static boolean isDue(String str) {\n\t\t\treturn isDue(str.getBytes());\n\t\t}\n\n\t\t/**\n\t\t * 判断缓存的byte数据是否到期\n\t\t * \n\t\t * @param data\n\t\t * @return true：到期了 false：还没有到期\n\t\t */\n\t\tprivate static boolean isDue(byte[] data) {\n\t\t\tString[] strs = getDateInfoFromDate(data);\n\t\t\tif (strs != null && strs.length == 2) {\n\t\t\t\tString saveTimeStr = strs[0];\n\t\t\t\twhile (saveTimeStr.startsWith(\"0\")) {\n\t\t\t\t\tsaveTimeStr = saveTimeStr\n\t\t\t\t\t\t\t.substring(1, saveTimeStr.length());\n\t\t\t\t}\n\t\t\t\tlong saveTime = Long.valueOf(saveTimeStr);\n\t\t\t\tlong deleteAfter = Long.valueOf(strs[1]);\n\t\t\t\tif (System.currentTimeMillis() > saveTime + deleteAfter * 1000) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn false;\n\t\t}\n\n\t\tprivate static String newStringWithDateInfo(int second, String strInfo) {\n\t\t\treturn createDateInfo(second) + strInfo;\n\t\t}\n\n\t\tprivate static byte[] newByteArrayWithDateInfo(int second, byte[] data2) {\n\t\t\tbyte[] data1 = createDateInfo(second).getBytes();\n\t\t\tbyte[] retdata = new byte[data1.length + data2.length];\n\t\t\tSystem.arraycopy(data1, 0, retdata, 0, data1.length);\n\t\t\tSystem.arraycopy(data2, 0, retdata, data1.length, data2.length);\n\t\t\treturn retdata;\n\t\t}\n\n\t\tprivate static String clearDateInfo(String strInfo) {\n\t\t\tif (strInfo != null && hasDateInfo(strInfo.getBytes())) {\n\t\t\t\tstrInfo = strInfo.substring(strInfo.indexOf(mSeparator) + 1,\n\t\t\t\t\t\tstrInfo.length());\n\t\t\t}\n\t\t\treturn strInfo;\n\t\t}\n\n\t\tprivate static byte[] clearDateInfo(byte[] data) {\n\t\t\tif (hasDateInfo(data)) {\n\t\t\t\treturn copyOfRange(data, indexOf(data, mSeparator) + 1,\n\t\t\t\t\t\tdata.length);\n\t\t\t}\n\t\t\treturn data;\n\t\t}\n\n\t\tprivate static boolean hasDateInfo(byte[] data) {\n\t\t\treturn data != null && data.length > 15 && data[13] == '-'\n\t\t\t\t\t&& indexOf(data, mSeparator) > 14;\n\t\t}\n\n\t\tprivate static String[] getDateInfoFromDate(byte[] data) {\n\t\t\tif (hasDateInfo(data)) {\n\t\t\t\tString saveDate = new String(copyOfRange(data, 0, 13));\n\t\t\t\tString deleteAfter = new String(copyOfRange(data, 14,\n\t\t\t\t\t\tindexOf(data, mSeparator)));\n\t\t\t\treturn new String[] { saveDate, deleteAfter };\n\t\t\t}\n\t\t\treturn null;\n\t\t}\n\n\t\tprivate static int indexOf(byte[] data, char c) {\n\t\t\tfor (int i = 0; i < data.length; i++) {\n\t\t\t\tif (data[i] == c) {\n\t\t\t\t\treturn i;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn -1;\n\t\t}\n\n\t\tprivate static byte[] copyOfRange(byte[] original, int from, int to) {\n\t\t\tint newLength = to - from;\n\t\t\tif (newLength < 0)\n\t\t\t\tthrow new IllegalArgumentException(from + \" > \" + to);\n\t\t\tbyte[] copy = new byte[newLength];\n\t\t\tSystem.arraycopy(original, from, copy, 0,\n\t\t\t\t\tMath.min(original.length - from, newLength));\n\t\t\treturn copy;\n\t\t}\n\n\t\tprivate static final char mSeparator = ' ';\n\n\t\tprivate static String createDateInfo(int second) {\n\t\t\tString currentTime = System.currentTimeMillis() + \"\";\n\t\t\twhile (currentTime.length() < 13) {\n\t\t\t\tcurrentTime = \"0\" + currentTime;\n\t\t\t}\n\t\t\treturn currentTime + \"-\" + second + mSeparator;\n\t\t}\n\n\t\t/*\n\t\t * Bitmap → byte[]\n\t\t */\n\t\tprivate static byte[] Bitmap2Bytes(Bitmap bm) {\n\t\t\tif (bm == null) {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\tByteArrayOutputStream baos = new ByteArrayOutputStream();\n\t\t\tbm.compress(Bitmap.CompressFormat.PNG, 100, baos);\n\t\t\treturn baos.toByteArray();\n\t\t}\n\n\t\t/*\n\t\t * byte[] → Bitmap\n\t\t */\n\t\tprivate static Bitmap Bytes2Bimap(byte[] b) {\n\t\t\tif (b.length == 0) {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\treturn BitmapFactory.decodeByteArray(b, 0, b.length);\n\t\t}\n\n\t\t/*\n\t\t * Drawable → Bitmap\n\t\t */\n\t\tprivate static Bitmap drawable2Bitmap(Drawable drawable) {\n\t\t\tif (drawable == null) {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\t// 取 drawable 的长宽\n\t\t\tint w = drawable.getIntrinsicWidth();\n\t\t\tint h = drawable.getIntrinsicHeight();\n\t\t\t// 取 drawable 的颜色格式\n\t\t\tBitmap.Config config = drawable.getOpacity() != PixelFormat.OPAQUE ? Bitmap.Config.ARGB_8888\n\t\t\t\t\t: Bitmap.Config.RGB_565;\n\t\t\t// 建立对应 bitmap\n\t\t\tBitmap bitmap = Bitmap.createBitmap(w, h, config);\n\t\t\t// 建立对应 bitmap 的画布\n\t\t\tCanvas canvas = new Canvas(bitmap);\n\t\t\tdrawable.setBounds(0, 0, w, h);\n\t\t\t// 把 drawable 内容画到画布中\n\t\t\tdrawable.draw(canvas);\n\t\t\treturn bitmap;\n\t\t}\n\n\t\t/*\n\t\t * Bitmap → Drawable\n\t\t */\n\t\t@SuppressWarnings(\"deprecation\")\n\t\tprivate static Drawable bitmap2Drawable(Bitmap bm) {\n\t\t\tif (bm == null) {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\treturn new BitmapDrawable(bm);\n\t\t}\n\t}\n\n}\n"
  },
  {
    "path": "app/src/main/java/com/example/discover/model/AuthorVideoModel.java",
    "content": "package com.example.discover.model;\n\nimport com.example.discover.bean.AuthorDetailBean;\nimport com.example.discover.bean.DetailBean.ItemList;\nimport com.example.discover.http.HttpClient;\nimport com.example.discover.http.RequestListener;\nimport com.example.discover.ui.Search.Author.ItemFragment;\n\nimport org.reactivestreams.Subscriber;\nimport org.reactivestreams.Subscription;\n\nimport java.util.List;\n\nimport io.reactivex.android.schedulers.AndroidSchedulers;\nimport io.reactivex.schedulers.Schedulers;\n\n/**\n * Created by monkeyWiiu on 2018/1/25.\n */\n\npublic class AuthorVideoModel {\n\n    public static void showVideo(ItemFragment context, int start, int id, String strategy, final RequestListener listener) {\n        HttpClient.Builder.getEyeService().getAuthorRelated(start, id, strategy)\n                .compose(context.<AuthorDetailBean>bindToLifecycle())\n                .subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread())\n                .subscribe(new Subscriber<AuthorDetailBean>() {\n                    @Override\n                    public void onSubscribe(Subscription s) {\n                        s.request(Long.MAX_VALUE);\n                    }\n\n                    @Override\n                    public void onNext(AuthorDetailBean itemLists) {\n\n                        listener.onSuccess(itemLists);\n                    }\n\n                    @Override\n                    public void onError(Throwable t) {\n\n                        t.printStackTrace();\n                        listener.onFailed(t);\n                    }\n\n                    @Override\n                    public void onComplete() {\n                        listener.onCompleted();\n                    }\n                });\n\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/example/discover/model/GankModel.java",
    "content": "package com.example.discover.model;\n\nimport com.example.discover.bean.GankBean;\nimport com.example.discover.http.HttpClient;\nimport com.example.discover.http.RequestListener;\nimport com.example.discover.utils.DebugUtil;\n\nimport org.reactivestreams.Subscriber;\nimport org.reactivestreams.Subscription;\n\nimport io.reactivex.android.schedulers.AndroidSchedulers;\nimport io.reactivex.schedulers.Schedulers;\n\n/**\n * Created by monkeyWiiu on 2018/2/3.\n */\n\npublic class GankModel {\n\n    public static void loadGank(String id, int num, int page, final RequestListener listener) {\n        HttpClient.Builder.getGankService().getGankData(id, num, page)\n                .subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread())\n                .subscribe(new Subscriber<GankBean>() {\n                    @Override\n                    public void onSubscribe(Subscription s) {\n                        s.request(Long.MAX_VALUE);\n                    }\n\n                    @Override\n                    public void onNext(GankBean gankBean) {\n                        DebugUtil.debug(\"welfaress\", \"successed\");\n                        listener.onSuccess(gankBean);\n                    }\n\n                    @Override\n                    public void onError(Throwable t) {\n                        DebugUtil.debug(\"welfaress\", \"failed\");\n                        listener.onFailed(t);\n                    }\n\n                    @Override\n                    public void onComplete() {\n\n                    }\n                });\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/example/discover/model/HotVideoModel.java",
    "content": "package com.example.discover.model;\n\nimport com.example.discover.bean.HotEyeBean;\nimport com.example.discover.bean.LitePalBean.LikeVideo;\nimport com.example.discover.http.HttpClient;\nimport com.example.discover.http.RequestListener;\nimport com.example.discover.ui.Video.VideoFragment;\nimport com.example.discover.utils.DebugUtil;\n\nimport org.reactivestreams.Subscriber;\nimport org.reactivestreams.Subscription;\n\nimport io.reactivex.android.schedulers.AndroidSchedulers;\nimport io.reactivex.schedulers.Schedulers;\n\n\n/**\n * Created by Administrator on 2017/12/12 0012.\n */\n\npublic class HotVideoModel {\n\n    public static void showVideo(VideoFragment context, int start, int num, final RequestListener listener) {\n\n        DebugUtil.debug(\"test12345\", \"successed111\");\n            HttpClient.Builder.getEyeService().getEyeHot(start, num)\n                    .compose(context.<HotEyeBean>bindToLifecycle())\n                    .subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread())\n                    .subscribe(new Subscriber<HotEyeBean>() {\n                        @Override\n                        public void onSubscribe(Subscription s) {\n\n                            s.request(Long.MAX_VALUE);\n                        }\n\n                        @Override\n                        public void onNext(HotEyeBean hotEyeBean) {\n\n                            listener.onSuccess(hotEyeBean);\n                        }\n\n                        @Override\n                        public void onError(Throwable t) {\n\n                            listener.onFailed(t);\n                        }\n\n                        @Override\n                        public void onComplete() {\n\n                        }\n                    });\n    }\n\n\n}\n"
  },
  {
    "path": "app/src/main/java/com/example/discover/model/ReplyModel.java",
    "content": "package com.example.discover.model;\n\nimport com.example.discover.bean.DetailBean.Replies;\nimport com.example.discover.bean.DetailBean.ReplyList;\nimport com.example.discover.http.HttpClient;\nimport com.example.discover.http.RequestListener;\nimport com.trello.rxlifecycle2.components.support.RxAppCompatActivity;\n\nimport org.reactivestreams.Subscriber;\nimport org.reactivestreams.Subscription;\n\nimport io.reactivex.Flowable;\nimport io.reactivex.android.schedulers.AndroidSchedulers;\nimport io.reactivex.schedulers.Schedulers;\n\n/**\n * Created by monkeyWiiu on 2018/1/30.\n */\n\npublic class ReplyModel {\n\n    public static void showReplies(RxAppCompatActivity activity, boolean clean, int lastSequence, int id, final RequestListener listener) {\n        Flowable<Replies> repliesFlowable;\n        if (clean) {\n            repliesFlowable = HttpClient.Builder.getEyeService().fetchReplies(id);\n        }else {\n            repliesFlowable = HttpClient.Builder.getEyeService().fetchReplies(id, lastSequence);\n        }\n\n        repliesFlowable.compose(activity.<Replies>bindToLifecycle())\n                .subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread())\n                .subscribe(new Subscriber<Replies>() {\n                    @Override\n                    public void onSubscribe(Subscription s) {\n                        s.request(Long.MAX_VALUE);\n                    }\n\n                    @Override\n                    public void onNext(Replies replies) {\n                        listener.onSuccess(replies);\n                    }\n\n                    @Override\n                    public void onError(Throwable t) {\n                        listener.onFailed(t);\n                    }\n\n                    @Override\n                    public void onComplete() {\n\n                    }\n                });\n\n\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/example/discover/model/SearchModel.java",
    "content": "package com.example.discover.model;\n\nimport android.content.Context;\n\nimport com.example.discover.ResultActivity;\nimport com.example.discover.SearchActivity;\nimport com.example.discover.app.Constant;\nimport com.example.discover.bean.DetailBean.FindCategory;\nimport com.example.discover.bean.DetailBean.SectionList;\nimport com.example.discover.bean.ResultBean;\nimport com.example.discover.http.HttpClient;\nimport com.example.discover.http.RequestListener;\nimport com.example.discover.ui.Search.SearchFragment;\nimport com.example.discover.utils.DebugUtil;\n\nimport org.reactivestreams.Publisher;\nimport org.reactivestreams.Subscriber;\nimport org.reactivestreams.Subscription;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\nimport io.reactivex.Flowable;\nimport io.reactivex.android.schedulers.AndroidSchedulers;\nimport io.reactivex.functions.Function;\nimport io.reactivex.functions.Predicate;\nimport io.reactivex.schedulers.Schedulers;\n\n\n/**\n * Created by monkeyWiiu on 2018/1/16.\n */\n\npublic class SearchModel {\n\n\n    public static void showDetail(SearchFragment context, List<Integer> idList, final RequestListener listener) {\n        List<Flowable<FindCategory>> sources = new ArrayList<>();\n\n        for (int id : idList) {\n            sources.add(HttpClient.Builder.getEyeService().getEyeCateGory(id));\n        }\n\n\n        Flowable.mergeDelayError(sources)\n                .compose(context.<FindCategory>bindToLifecycle())\n                .filter(new Predicate<FindCategory>() {\n                    @Override\n                    public boolean test(FindCategory findCategory) throws Exception {\n                        return findCategory != null;\n                    }\n                })\n                .filter(new Predicate<FindCategory>() {\n                    @Override\n                    public boolean test(FindCategory findCategory) throws Exception {\n                        return findCategory.sectionList != null;\n                    }\n                })\n                .flatMap(new Function<FindCategory, Publisher<SectionList>>() {\n                    @Override\n                    public Publisher<SectionList> apply(FindCategory findCategory) throws Exception {\n                        return Flowable.fromIterable(findCategory.sectionList);\n                    }\n                })\n                .subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread())\n                .subscribe(new Subscriber<SectionList>() {\n                    @Override\n                    public void onSubscribe(Subscription s) {\n\n                        s.request(Long.MAX_VALUE);\n                    }\n\n                    @Override\n                    public void onNext(SectionList sectionList) {\n                        DebugUtil.debug(\"searchmodel\", \"chenggon\");\n                        listener.onSuccess(sectionList);\n                    }\n\n                    @Override\n                    public void onError(Throwable t) {\n\n                        DebugUtil.debug(\"searchmodel\", \"failed\");\n                        listener.onFailed(t);\n                    }\n\n                    @Override\n                    public void onComplete() {\n\n                        listener.onCompleted();\n\n                    }\n                });\n    }\n\n    public static void showTrendingTag(SearchActivity context, final RequestListener listener) {\n        HttpClient.Builder.getEyeService().getTrendingTag()\n                .compose(context.<List<String>>bindToLifecycle())\n                .subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread())\n                .subscribe(new Subscriber<List<String>>() {\n                    @Override\n                    public void onSubscribe(Subscription s) {\n                        s.request(Long.MAX_VALUE);\n                    }\n\n                    @Override\n                    public void onNext(List<String> list) {\n                        listener.onSuccess(list);\n                    }\n\n                    @Override\n                    public void onError(Throwable t) {\n                        listener.onFailed(t);\n                    }\n\n                    @Override\n                    public void onComplete() {\n\n                    }\n                });\n    }\n\n    public static void showResult(ResultActivity context, String key, int start, final RequestListener listener) {\n        HttpClient.Builder.getEyeService().getResult(key, start)\n                .compose(context.<ResultBean>bindToLifecycle())\n                .subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread())\n                .subscribe(new Subscriber<ResultBean>() {\n                    @Override\n                    public void onSubscribe(Subscription s) {\n                        s.request(Long.MAX_VALUE);\n                    }\n\n                    @Override\n                    public void onNext(ResultBean resultBean) {\n\n                        listener.onSuccess(resultBean);\n                    }\n\n                    @Override\n                    public void onError(Throwable t) {\n\n                        listener.onFailed(t);\n                    }\n\n                    @Override\n                    public void onComplete() {\n\n                    }\n                });\n    }\n}\n\n"
  },
  {
    "path": "app/src/main/java/com/example/discover/ui/DiscoverFragment.java",
    "content": "package com.example.discover.ui;\n\nimport android.content.Intent;\nimport android.os.Bundle;\nimport android.support.annotation.Nullable;\nimport android.view.View;\n\nimport com.example.discover.R;\nimport com.example.discover.TestActivity;\nimport com.example.discover.app.Constant;\nimport com.example.discover.base.BaseFragment;\nimport com.example.discover.bean.HotEyeBean;\nimport com.example.discover.databinding.FragmentDiscoverBinding;\nimport com.example.discover.http.cahe.ACache;\nimport com.example.discover.utils.DebugUtil;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\n/**\n * Created by Administrator on 2017/12/5 0005.\n */\n\npublic class DiscoverFragment extends BaseFragment<FragmentDiscoverBinding> {\n\n    private boolean isPrepare = false;\n\n    private HotEyeBean hotEyeBean;\n    @Override\n    public void onActivityCreated(@Nullable Bundle savedInstanceState) {\n        super.onActivityCreated(savedInstanceState);\n        showContentView();\n        isPrepare = true;\n        loadData();\n\n        bindingView.testText.setText(Test());\n\n    }\n\n    public StringBuffer Test() {\n        StringBuffer text = new StringBuffer();\n        for (int i = 0; i < 2000; i++) {\n\n            text.append(\"你好你好你好\");\n        }\n        return text;\n    }\n    @Override\n    public void loadData() {\n        if (!isPrepare || !isVisibile) {\n            return;\n        }\n        /*ACache cache = ACache.get(getContext());\n        hotEyeBean = (HotEyeBean) cache.getAsObject(Constant.EYE_VIDEO);\n        if (hotEyeBean == null) {\n            DebugUtil.debug(\"test111\", \"null\");\n        }\n        bindingView.text.setText(\"bu\");*/\n\n\n    }\n\n    @Override\n    public int setContentView() {\n        return R.layout.fragment_discover;\n    }\n\n}\n"
  },
  {
    "path": "app/src/main/java/com/example/discover/ui/Personal/PersonalFragment.java",
    "content": "package com.example.discover.ui.Personal;\n\nimport android.os.Bundle;\nimport android.support.annotation.Nullable;\nimport android.support.design.widget.TabLayout;\nimport android.support.v4.app.Fragment;\n\nimport com.example.discover.R;\nimport com.example.discover.adapter.MyFragmentPagerAdapter;\nimport com.example.discover.base.BaseFragment;\nimport com.example.discover.databinding.FragmentPersonalBinding;\nimport com.example.discover.ui.Personal.child.FollowFragment;\nimport com.example.discover.ui.Personal.child.LikeFragment;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\n/**\n * Created by monkeyWiiu on 2017/12/30.\n */\n\npublic class PersonalFragment extends BaseFragment<FragmentPersonalBinding> {\n\n    private List<Fragment> fragmentList;\n    private List<String> titleList;\n\n    @Override\n    public void onActivityCreated(@Nullable Bundle savedInstanceState) {\n        super.onActivityCreated(savedInstanceState);\n        initFragmentList();\n        loadViewPager();\n        showContentView();\n    }\n\n    @Override\n    public int setContentView() {\n        return R.layout.fragment_personal;\n    }\n    public void initFragmentList() {\n\n        fragmentList = new ArrayList<>();\n        fragmentList.add(new LikeFragment());\n        fragmentList.add(new FollowFragment());\n\n        titleList = new ArrayList<>();\n        titleList.add(\"喜欢的作品\");\n        titleList.add(\"关注\");\n    }\n\n    public void loadViewPager() {\n        MyFragmentPagerAdapter adapter = new MyFragmentPagerAdapter(getChildFragmentManager(), fragmentList, titleList);\n        bindingView.vpCollect.setAdapter(adapter);\n        bindingView.vpCollect.setOffscreenPageLimit(2);\n        adapter.notifyDataSetChanged();\n        bindingView.tabCollect.setTabMode(TabLayout.MODE_FIXED);\n        bindingView.tabCollect.setupWithViewPager(bindingView.vpCollect);\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/example/discover/ui/Personal/child/FollowFragment.java",
    "content": "package com.example.discover.ui.Personal.child;\n\nimport android.os.Bundle;\nimport android.os.Handler;\nimport android.support.annotation.Nullable;\nimport android.support.v4.widget.SwipeRefreshLayout;\nimport android.support.v7.widget.LinearLayoutManager;\nimport android.support.v7.widget.RecyclerView;\n\nimport com.example.discover.R;\nimport com.example.discover.adapter.FollowRecyclerAdapter;\nimport com.example.discover.base.BaseFragment;\nimport com.example.discover.bean.LitePalBean.Follow;\nimport com.example.discover.bean.LitePalBean.LikeVideo;\nimport com.example.discover.databinding.FragmentFollowBinding;\nimport com.example.discover.utils.DebugUtil;\nimport com.example.zmenu.PUtils;\nimport com.jcodecraeer.xrecyclerview.XRecyclerView;\n\nimport org.litepal.crud.DataSupport;\n\nimport java.util.List;\n\n/**\n * Created by monkeyWiiu on 2018/1/26.\n */\n\npublic class FollowFragment extends BaseFragment<FragmentFollowBinding>{\n\n    private boolean isPrepare = false;\n    private boolean isFirst = true;\n    private int mNum = 15;\n    private int currentId;\n    private int totalNum;\n    private List<Follow> followList;\n    private FollowRecyclerAdapter adapter;\n    private LinearLayoutManager mLayoutManager;\n\n    @Override\n    public void onActivityCreated(@Nullable Bundle savedInstanceState) {\n        super.onActivityCreated(savedInstanceState);\n        initRecyclerView();\n        showContentView();\n        totalNum = DataSupport.findAll(Follow.class).size();\n        isPrepare = true;\n    }\n\n    @Override\n    protected void loadData() {\n        if (!isVisibile || !isPrepare || !isFirst) {\n            return;\n        }\n\n        followList = DataSupport.order(\"id desc\").limit(mNum).find(Follow.class);\n        if (followList != null) {\n            setAdapter(followList);\n        }\n\n\n        //避免重复加载\n        isFirst = false;\n    }\n\n    private void initRecyclerView() {\n        mLayoutManager = new LinearLayoutManager(getContext(), LinearLayoutManager.VERTICAL, false);\n        bindingView.rvFollow.setLayoutManager(mLayoutManager);\n\n        //下拉刷新\n        bindingView.srlRefresh.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {\n            @Override\n            public void onRefresh() {\n                bindingView.rvFollow.postDelayed(new Runnable() {\n                    @Override\n                    public void run() {\n                        followList = DataSupport.order(\"id desc\").limit(mNum).find(Follow.class);\n                        totalNum = DataSupport.findAll(Follow.class).size();\n                        if (followList != null && followList.size() > 0) {\n                            currentId = followList.get(followList.size() - 1).getId();\n                        }\n                        setAdapter(followList);\n                        adapter.notifyDataSetChanged();\n                        bindingView.srlRefresh.setRefreshing(false);\n                    }\n                }, 1000);\n            }\n        });\n\n        //上拉加载更多\n        bindingView.rvFollow.setOnScrollListener(new RecyclerView.OnScrollListener() {\n            @Override\n            public void onScrolled(RecyclerView recyclerView, int dx, int dy) {\n                super.onScrolled(recyclerView, dx, dy);\n                int lastVisibleItem = mLayoutManager.findLastVisibleItemPosition();\n                final int totalItemCount = mLayoutManager.getItemCount();\n                if (lastVisibleItem == totalItemCount - 1 && !adapter.isLoading()) {\n\n                    adapter.updateStateLoad(true);\n                    followList = DataSupport.order(\"id desc\").limit(mNum).where(\"id < ?\", String.valueOf(currentId)).find(Follow.class);\n                    if (followList != null && followList.size() > 0) {\n                        currentId = followList.get(followList.size() - 1).getId();\n                    }\n\n                    new Handler().postDelayed(new Runnable() {\n                        @Override\n                        public void run() {\n                            if (totalItemCount - 1 == totalNum) {\n                                adapter.hideLoading();\n                            }\n                            adapter.updateStateLoad(false);\n                            adapter.addAll(followList);\n                            adapter.notifyDataSetChanged();\n                        }\n                    }, 1000);\n                }\n            }\n\n            //recyclerview滑动时ZMemu自动隐藏\n            @Override\n            public void onScrollStateChanged(RecyclerView recyclerView, int newState) {\n                super.onScrollStateChanged(recyclerView, newState);\n                if (newState == XRecyclerView.SCROLL_STATE_IDLE  && PUtils.getInstance().getViewList() != null) {\n\n                    for (int i = 0; i < PUtils.getInstance().getViewList().size(); i++) {\n                        PUtils.getInstance().getViewList().get(i).show();\n                    }\n                } else {\n                    for (int i = 0; i < PUtils.getInstance().getViewList().size(); i++) {\n                        PUtils.getInstance().getViewList().get(i).hide();\n                    }\n                }\n            }\n        });\n    }\n\n    private void setAdapter(List<Follow> list) {\n\n        adapter = new FollowRecyclerAdapter(getContext());\n        adapter.clear();\n        adapter.addAll(list);\n\n        bindingView.rvFollow.setAdapter(adapter);\n\n    }\n    @Override\n    public int setContentView() {\n        return R.layout.fragment_follow;\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/example/discover/ui/Personal/child/LikeFragment.java",
    "content": "package com.example.discover.ui.Personal.child;\n\nimport android.os.Bundle;\nimport android.os.Handler;\nimport android.support.annotation.Nullable;\nimport android.support.v4.widget.SwipeRefreshLayout;\nimport android.support.v7.widget.LinearLayoutManager;\nimport android.support.v7.widget.RecyclerView;\n\nimport com.example.discover.R;\nimport com.example.discover.adapter.LikeVideoRecyclerAdapter;\nimport com.example.discover.base.BaseFragment;\nimport com.example.discover.bean.LitePalBean.LikeVideo;\nimport com.example.discover.databinding.FragmentPersonalLikeBinding;\nimport com.example.discover.ui.RecyclerViewNoBugLinearLayoutManager;\nimport com.example.discover.utils.DebugUtil;\nimport com.example.zmenu.PUtils;\nimport com.jcodecraeer.xrecyclerview.XRecyclerView;\n\nimport org.litepal.crud.DataSupport;\n\nimport java.util.List;\n\nimport cn.jzvd.JZVideoPlayer;\n\n/**\n * Created by monkeyWiiu on 2017/12/30.\n */\n\npublic class LikeFragment extends BaseFragment<FragmentPersonalLikeBinding> {\n    private boolean isPrepare = false;\n    private List<LikeVideo> likeVideoList;\n    private boolean isFirst = true;\n    private LikeVideoRecyclerAdapter mLikeVideoAdapter;\n    private LinearLayoutManager mLayoutManager;\n    private int mNum = 5;\n    private int currentId;\n    private int largestId;\n    private int totalNum;\n    @Override\n    public void onActivityCreated(@Nullable Bundle savedInstanceState) {\n        super.onActivityCreated(savedInstanceState);\n        isPrepare = true;\n        likeVideoList = DataSupport.order(\"id desc\").limit(mNum).find(LikeVideo.class);\n        if (DataSupport.findLast(LikeVideo.class) != null) {\n            largestId = DataSupport.findLast(LikeVideo.class).getId();\n        }\n        totalNum = DataSupport.findAll(LikeVideo.class).size();\n        initRecyclerView();\n        loadData();\n        showContentView();\n    }\n\n    @Override\n    public void loadData() {\n        if (!isPrepare || !isVisibile || !isFirst) {\n            return;\n        }\n        setAdapter();\n        //避免重复加载\n        isFirst = false;\n\n    }\n\n    public void initRecyclerView() {\n\n        mLikeVideoAdapter = new LikeVideoRecyclerAdapter(getContext());\n        mLayoutManager = new RecyclerViewNoBugLinearLayoutManager(getActivity());\n        mLayoutManager.setOrientation(LinearLayoutManager.VERTICAL);\n        bindingView.rvLikeVideo.setLayoutManager(mLayoutManager);\n        bindingView.srlRefresh.setColorSchemeResources(R.color.background5, R.color.background2, R.color.background4);\n        bindingView.srlRefresh.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {\n            @Override\n            public void onRefresh() {\n                JZVideoPlayer.goOnPlayOnPause();\n                bindingView.rvLikeVideo.postDelayed(new Runnable() {\n                    @Override\n                    public void run() {\n                        likeVideoList = DataSupport.order(\"id desc\").limit(mNum).find(LikeVideo.class);\n                        totalNum = DataSupport.findAll(LikeVideo.class).size();\n                        if (likeVideoList != null && likeVideoList.size() > 0) {\n                            currentId = likeVideoList.get(likeVideoList.size() - 1).getId();\n                            largestId = DataSupport.findLast(LikeVideo.class).getId();\n                        }\n                        setAdapter();\n                        mLikeVideoAdapter.notifyDataSetChanged();\n                        bindingView.srlRefresh.setRefreshing(false);\n                    }\n                }, 1000);\n            }\n        });\n        //上拉加载更多\n        bindingView.rvLikeVideo.setOnScrollListener(new RecyclerView.OnScrollListener() {\n            @Override\n            public void onScrolled(RecyclerView recyclerView, int dx, int dy) {\n                super.onScrolled(recyclerView, dx, dy);\n                int lastVisibleItem = mLayoutManager.findLastVisibleItemPosition();\n                final int totalItemCount = mLayoutManager.getItemCount();\n                if (lastVisibleItem == totalItemCount - 1 && !mLikeVideoAdapter.isLoading()) {\n\n                    mLikeVideoAdapter.updateStateLoad(true);\n                    likeVideoList = DataSupport.order(\"id desc\").limit(mNum).where(\"id < ?\", String.valueOf(currentId)).find(LikeVideo.class);\n                    if (likeVideoList != null && likeVideoList.size() > 0) {\n                        currentId = likeVideoList.get(likeVideoList.size() - 1).getId();\n                        DebugUtil.debug(\"totalTest\", \"currentIdLoad\" + currentId);\n                    }\n\n                    new Handler().postDelayed(new Runnable() {\n                        @Override\n                        public void run() {\n                            DebugUtil.debug(\"likefollowtest\", totalItemCount +\"/\" +totalNum);\n                            if (totalItemCount - 1 == totalNum) {\n                                mLikeVideoAdapter.hideLoading();\n                            }\n                            mLikeVideoAdapter.updateStateLoad(false);\n                            mLikeVideoAdapter.addAll(likeVideoList);\n                            mLikeVideoAdapter.notifyDataSetChanged();\n                        }\n                    }, 1000);\n                }\n            }\n\n\n            //recyclerview滑动时ZMemu自动隐藏\n            @Override\n            public void onScrollStateChanged(RecyclerView recyclerView, int newState) {\n                super.onScrollStateChanged(recyclerView, newState);\n                if (newState == XRecyclerView.SCROLL_STATE_IDLE  && PUtils.getInstance().getViewList() != null) {\n\n                    for (int i = 0; i < PUtils.getInstance().getViewList().size(); i++) {\n                        PUtils.getInstance().getViewList().get(i).show();\n                    }\n                } else {\n                    for (int i = 0; i < PUtils.getInstance().getViewList().size(); i++) {\n                        PUtils.getInstance().getViewList().get(i).hide();\n                    }\n                }\n            }\n        });\n\n        //删除item\n        mLikeVideoAdapter.setOnClickListener(new LikeVideoRecyclerAdapter.MyDeleteClickListener() {\n            @Override\n            public void onDelete(int position, int id) {\n\n                DataSupport.deleteAll(LikeVideo.class, \"id = ?\", String.valueOf(id));\n                totalNum = DataSupport.findAll(LikeVideo.class).size();\n                DebugUtil.debug(\"totalTest\", \"largestId\" + largestId + \"position:\" + position);\n                mLikeVideoAdapter.delete(position);\n            }\n        });\n    }\n\n    public void setAdapter() {\n        mLikeVideoAdapter.clear();\n        mLikeVideoAdapter.addAll(likeVideoList);\n        bindingView.rvLikeVideo.setAdapter(mLikeVideoAdapter);\n    }\n    @Override\n    public int setContentView() {\n        return R.layout.fragment_personal_like;\n    }\n\n\n}\n"
  },
  {
    "path": "app/src/main/java/com/example/discover/ui/RecyclerViewNoBugLinearLayoutManager.java",
    "content": "package com.example.discover.ui;\n\nimport android.content.Context;\nimport android.support.v7.widget.LinearLayoutManager;\nimport android.support.v7.widget.RecyclerView;\nimport android.util.AttributeSet;\n\n/**\n * Created by monkeyWiiu on 2018/1/6.\n */\n\npublic class RecyclerViewNoBugLinearLayoutManager extends LinearLayoutManager{\n\n\n    public RecyclerViewNoBugLinearLayoutManager(Context context) {\n        super(context);\n    }\n\n    public RecyclerViewNoBugLinearLayoutManager(Context context, int orientation, boolean reverseLayout) {\n        super(context, orientation, reverseLayout);\n    }\n\n    public RecyclerViewNoBugLinearLayoutManager(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {\n        super(context, attrs, defStyleAttr, defStyleRes);\n    }\n\n    //避免了RecyclerView可能出现的holder数组越界Bug\n    @Override\n    public void onLayoutChildren(RecyclerView.Recycler recycler, RecyclerView.State state) {\n        try {\n            super.onLayoutChildren(recycler, state);\n        } catch (Exception e) {\n            e.printStackTrace();\n        }\n\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/example/discover/ui/Search/Author/ItemFragment.java",
    "content": "package com.example.discover.ui.Search.Author;\n\nimport android.os.Bundle;\nimport android.os.Handler;\nimport android.support.annotation.Nullable;\nimport android.support.v4.app.Fragment;\nimport android.support.v4.widget.SwipeRefreshLayout;\nimport android.support.v7.widget.LinearLayoutManager;\nimport android.support.v7.widget.RecyclerView;\n\nimport com.example.discover.R;\nimport com.example.discover.adapter.VideoRecyclerAdapter;\nimport com.example.discover.app.Constant;\nimport com.example.discover.base.BaseFragment;\nimport com.example.discover.bean.AuthorDetailBean;\nimport com.example.discover.bean.DetailBean.ItemList;\nimport com.example.discover.bean.HotEyeBean;\nimport com.example.discover.databinding.FragmentVideoBinding;\nimport com.example.discover.http.RequestListener;\nimport com.example.discover.http.cahe.ACache;\nimport com.example.discover.model.AuthorVideoModel;\nimport com.example.discover.model.HotVideoModel;\nimport com.example.discover.ui.RecyclerViewNoBugLinearLayoutManager;\nimport com.example.discover.utils.DebugUtil;\nimport com.example.zmenu.FloatButton;\nimport com.example.zmenu.PUtils;\nimport com.jcodecraeer.xrecyclerview.XRecyclerView;\n\nimport java.util.List;\n\nimport cn.jzvd.JZVideoPlayer;\n\n/**\n * Created by monkeyWiiu on 2018/1/23.\n */\n\npublic class ItemFragment extends BaseFragment<FragmentVideoBinding> {\n\n    private static final String STRATEGY = \"Strategy\";\n    private static final String ID = \"AuthorId\" ;\n    private int id;\n    private int start = 0;\n    private int num = 10;//一次请求的数目\n\n    private String mStrategy;\n    private int mPage = 1;\n    private boolean isPrepare = false;\n    private boolean isFirst = true;\n    private VideoRecyclerAdapter mVideoAdapter;\n    private LinearLayoutManager mLayoutManager;\n\n    public static ItemFragment newInstance(String strategy, int id) {\n        ItemFragment fragment = new ItemFragment();\n        Bundle args = new Bundle();\n        args.putString(STRATEGY, strategy);\n        args.putInt(ID, id);\n        fragment.setArguments(args);\n        return fragment;\n    }\n\n    @Override\n    public void onCreate(@Nullable Bundle savedInstanceState) {\n        super.onCreate(savedInstanceState);\n        if (getArguments() != null) {\n            mStrategy = getArguments().getString(STRATEGY);\n            id = getArguments().getInt(ID);\n        }\n    }\n\n    @Override\n    public void onActivityCreated(@Nullable Bundle savedInstanceState) {\n        super.onActivityCreated(savedInstanceState);\n        initRecyclerView();\n        //准备就绪\n        isPrepare = true;\n        //解决懒加载首页不显示，手动loadData()\n        if (\"date\".equals(mStrategy)) {\n            loadData();\n        }\n\n    }\n\n    @Override\n    public void loadData() {\n        if (!isPrepare || !isVisibile || !isFirst) {\n            return;\n        }\n        loadVideo();\n\n        //避免重复加载\n        isFirst = false;\n    }\n\n    public void loadVideo() {\n        DebugUtil.debug(\"loadvideo\",  \"load\");\n        AuthorVideoModel.showVideo(this, start, id, mStrategy, new RequestListener() {\n            @Override\n            public void onSuccess(Object object) {\n\n                showContentView();\n                AuthorDetailBean detailBean = (AuthorDetailBean) object;\n                List<ItemList> list = detailBean.getItemList();\n                if (mPage == 1) {\n                    if(detailBean != null && detailBean.getItemList() != null&& detailBean.getItemList().size() > 0) {\n\n                        DebugUtil.debug(\"test123456\", \"video\" + detailBean.getItemList().size());\n                        bindingView.srlVideo.setRefreshing(false);\n                        setAdapter(detailBean);\n                    }\n                } else {\n                    if(detailBean != null && detailBean.getItemList() != null&& detailBean.getItemList().size() > 0) {\n                        mVideoAdapter.updateStateLoad(false);\n                        mVideoAdapter.addAll(detailBean.getItemList());\n                        mVideoAdapter.notifyDataSetChanged();\n                    } else {\n                        //数据刷新到底了\n                        mVideoAdapter.hideLoading();\n                    }\n                }\n\n            }\n\n            @Override\n            public void onFailed(Throwable t) {\n\n                DebugUtil.debug(\"loadvideo\",  \"failed\");\n                bindingView.srlVideo.setRefreshing(false);\n                if (mVideoAdapter.getItemCount() == 1) {\n                    Error();\n                }\n            }\n            @Override\n            public void onCompleted() {\n\n            }\n        });\n\n    }\n    @Override\n    public int setContentView() {\n        return R.layout.fragment_video;\n    }\n\n    public void initRecyclerView() {\n        mVideoAdapter = new VideoRecyclerAdapter(getContext());\n        mVideoAdapter.setAuthor(true);\n        mLayoutManager = new RecyclerViewNoBugLinearLayoutManager(getActivity());\n        mLayoutManager.setOrientation(LinearLayoutManager.VERTICAL);\n        bindingView.rvVideo.setLayoutManager(mLayoutManager);\n\n        bindingView.srlVideo.setColorSchemeResources(R.color.background5, R.color.background2, R.color.background4);\n        //上拉刷新\n        bindingView.srlVideo.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {\n            @Override\n            public void onRefresh() {\n                JZVideoPlayer.goOnPlayOnPause();\n                bindingView.srlVideo.postDelayed(new Runnable() {\n                    @Override\n                    public void run() {\n                        mPage = 1;\n                        start = 5;\n                        loadVideo();\n                    }\n                }, 1000);\n            }\n        });\n        //设置recycler滚动监听\n        bindingView.rvVideo.setOnScrollListener(new RecyclerView.OnScrollListener() {\n            //下拉加载更多\n            @Override\n            public void onScrolled(RecyclerView recyclerView, int dx, int dy) {\n                super.onScrolled(recyclerView, dx, dy);\n                int lastVisibleItem = mLayoutManager.findLastVisibleItemPosition();\n                int totalItemCount = mLayoutManager.getItemCount();\n                DebugUtil.debug(\"position1\", lastVisibleItem + \"  \" + totalItemCount);\n                if (lastVisibleItem == totalItemCount - 1 && !mVideoAdapter.isLoading()) {\n                    mVideoAdapter.updateStateLoad(true);\n                    mPage++;\n                    start += num;\n                    new Handler().postDelayed(new Runnable() {\n                        @Override\n                        public void run() {\n                            loadVideo();\n                        }\n                    }, 1000);\n\n                }\n            }\n\n        });\n\n    }\n    public void setAdapter(AuthorDetailBean authorDetailBean) {\n        mVideoAdapter.clear();\n        mVideoAdapter.addAll(authorDetailBean.getItemList());\n        bindingView.rvVideo.setAdapter(mVideoAdapter);\n    }\n\n    @Override\n    public void onPause() {\n        JZVideoPlayer.releaseAllVideos();\n        super.onPause();\n    }\n\n}\n"
  },
  {
    "path": "app/src/main/java/com/example/discover/ui/Search/SearchFragment.java",
    "content": "package com.example.discover.ui.Search;\n\nimport android.content.Intent;\nimport android.graphics.drawable.Drawable;\nimport android.os.Bundle;\nimport android.support.annotation.Nullable;\nimport android.support.design.widget.AppBarLayout;\nimport android.support.design.widget.CoordinatorLayout;\nimport android.support.v4.widget.SwipeRefreshLayout;\nimport android.support.v7.widget.LinearLayoutManager;\nimport android.support.v7.widget.RecyclerView;\nimport android.view.View;\n\nimport com.example.discover.R;\nimport com.example.discover.SearchActivity;\nimport com.example.discover.ViewBigImageActivity;\nimport com.example.discover.adapter.SearchRecyclerAdapter;\nimport com.example.discover.adapter.SelectTypeRecyclerAdapter;\nimport com.example.discover.app.Constant;\nimport com.example.discover.base.BaseFragment;\nimport com.example.discover.bean.DetailBean.ACacheFindList;\nimport com.example.discover.bean.DetailBean.ItemList;\nimport com.example.discover.bean.DetailBean.SectionList;\nimport com.example.discover.bean.LitePalBean.LabelType;\nimport com.example.discover.databinding.FragmentSearchBinding;\nimport com.example.discover.http.RequestListener;\nimport com.example.discover.http.cahe.ACache;\nimport com.example.discover.model.SearchModel;\nimport com.example.discover.ui.RecyclerViewNoBugLinearLayoutManager;\nimport com.example.discover.utils.DebugUtil;\nimport com.example.discover.utils.DensityUtil;\nimport com.example.discover.utils.LitePalUtil;\nimport com.example.discover.view.CustomView.CategoryPopupWindow;\nimport com.example.zmenu.PUtils;\nimport com.jakewharton.rxbinding2.view.RxView;\nimport com.jcodecraeer.xrecyclerview.XRecyclerView;\n\nimport org.litepal.crud.DataSupport;\n\nimport java.util.ArrayList;\nimport java.util.List;\nimport java.util.concurrent.TimeUnit;\n\nimport cn.jzvd.JZVideoPlayer;\nimport io.reactivex.functions.Consumer;\n\n/**\n * Created by monkeyWiiu on 2018/1/12.\n */\n\npublic class SearchFragment extends BaseFragment<FragmentSearchBinding> implements View.OnClickListener {\n\n\n    private boolean isPrepare = false;\n    private boolean isFirst = true;\n    private List<Integer> categoryIdList = new ArrayList<>();\n    private ACacheFindList findList;\n    private List<Object> combineList = new ArrayList<>();\n    private List<ItemList> authorList = new ArrayList<>();\n    private ACache mCache;\n    private RecyclerView sTRecyclerView;\n    private SearchRecyclerAdapter adapter;\n    private List<String> selectLabel;\n    private List<LabelType> savedLabelList;\n    private SelectTypeRecyclerAdapter strAdapter;\n    @Override\n    public int setContentView() {\n        return R.layout.fragment_search;\n    }\n\n    @Override\n    public void onActivityCreated(@Nullable Bundle savedInstanceState) {\n        super.onActivityCreated(savedInstanceState);\n        showContentView();\n\n        mCache = ACache.get(getContext());\n        selectLabel = LitePalUtil.getSelectLabel();\n        init();\n        initSelectTypeRecyclerView();\n        categoryIdList = getCategoryIdList();\n        isPrepare = true;\n\n        initMainRecycler();\n\n    }\n\n    @Override\n    protected void loadData() {\n        if (!isPrepare || !isFirst || !isVisibile) {\n            return;\n        }\n\n        findList = (ACacheFindList) mCache.getAsObject(Constant.EYE_FIND);\n        if (findList != null) {\n            bindingView.rvMain.setVisibility(View.VISIBLE);\n            loadSuccess();\n            setAdapterTest(getPrecessedData());\n        } else {\n            findList = new ACacheFindList();\n            loadDetail();\n        }\n        //避免重复加载\n        isFirst = false;\n    }\n\n    public void initMainRecycler() {\n        LinearLayoutManager linearLayoutManager = new LinearLayoutManager(getActivity());\n        linearLayoutManager.setOrientation(LinearLayoutManager.VERTICAL);\n        bindingView.rvMain.setLayoutManager(linearLayoutManager);\n        bindingView.srlSearchRefresh.setColorSchemeResources(R.color.background5, R.color.background2, R.color.background4);\n        //SwipeRefreshLayout与CoordinatorLayout嵌套刷新，动态设置SwipeRefreshLayout是否可用\n        bindingView.abl.addOnOffsetChangedListener(new AppBarLayout.OnOffsetChangedListener() {\n            @Override\n            public void onOffsetChanged(AppBarLayout appBarLayout, int verticalOffset) {\n\n                if (verticalOffset >= 0) {\n                    bindingView.srlSearchRefresh.setEnabled(true);\n                } else {\n                    bindingView.srlSearchRefresh.setEnabled(false);\n                }\n            }\n        });\n        //上拉刷新\n        bindingView.srlSearchRefresh.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {\n            @Override\n            public void onRefresh() {\n                JZVideoPlayer.goOnPlayOnPause();\n                bindingView.srlSearchRefresh.postDelayed(new Runnable() {\n                    @Override\n                    public void run() {\n                        loadDetail();\n                    }\n                }, 1000);\n            }\n        });\n\n        //recyclerview滑动时ZMemu自动隐藏\n        bindingView.rvMain.setOnScrollListener(new RecyclerView.OnScrollListener() {\n            @Override\n            public void onScrollStateChanged(RecyclerView recyclerView, int newState) {\n                super.onScrollStateChanged(recyclerView, newState);\n\n                if (newState == XRecyclerView.SCROLL_STATE_IDLE  && PUtils.getInstance().getViewList() != null) {\n\n                    for (int i = 0; i < PUtils.getInstance().getViewList().size(); i++) {\n                        PUtils.getInstance().getViewList().get(i).show();\n                    }\n                } else {\n                    for (int i = 0; i < PUtils.getInstance().getViewList().size(); i++) {\n                        PUtils.getInstance().getViewList().get(i).hide();\n                    }\n                }\n            }\n        });\n    }\n\n    public void setAdapterTest(List<Object> objects) {\n        adapter = new SearchRecyclerAdapter(getContext());\n        adapter.clear();\n        adapter.addAll(objects);\n        bindingView.rvMain.setAdapter(adapter);\n        adapter.notifyDataSetChanged();\n    }\n\n    private void init() {\n\n        Drawable drawable = getResources().getDrawable(R.drawable.search_normal);\n        drawable.setBounds(0, 0 , DensityUtil.dip2px(30), DensityUtil.dip2px(30));\n        bindingView.tvSearch.setCompoundDrawables(drawable, null, null, null);\n        bindingView.tvSearch.setOnClickListener(new View.OnClickListener() {\n            @Override\n            public void onClick(View v) {\n                Intent intent = new Intent(getContext(), SearchActivity.class);\n                startActivity(intent);\n            }\n        });\n        bindingView.cvAdd.setOnClickListener(this);\n        //加载失败重新加载\n        RxView.clicks(bindingView.rlError)\n                .throttleFirst(1, TimeUnit.SECONDS)\n                .subscribe(new Consumer<Object>() {\n                    @Override\n                    public void accept(Object o) throws Exception {\n                        showLoading();\n                        loadDetail();\n                    }\n                });\n    }\n\n    private void loadDetail() {\n        categoryIdList = getCategoryIdList();\n        findList = new ACacheFindList();\n        if (categoryIdList.size() > 0) {\n\n            bindingView.rvMain.setVisibility(View.VISIBLE);\n            SearchModel.showDetail(this, categoryIdList, new RequestListener() {\n                @Override\n                public void onSuccess(Object object) {\n                    SectionList find = (SectionList) object;\n\n                    switch (find.getType()) {\n                        case \"horizontalScrollCardSection\":\n                            findList.getScrollCardSection().add(find);\n                            break;\n                        case \"videoListSection\":\n                            findList.getVideoSection().add(find);\n                            break;\n                        case \"authorSection\":\n                            findList.getAuthorSection().add(find);\n                            break;\n                    }\n                }\n                @Override\n                public void onFailed(Throwable throwable) {\n\n                    bindingView.srlSearchRefresh.setRefreshing(false);\n                    loadError();\n                }\n\n                @Override\n                public void onCompleted() {\n\n                    if (findList.getScrollCardSection().size() > 0 || findList.getVideoSection().size() > 0 || findList.getAuthorSection().size() > 0) {\n\n                        loadSuccess();\n                        setAdapterTest(getPrecessedData());\n                        mCache.remove(Constant.EYE_FIND);\n                        mCache.put(Constant.EYE_FIND, findList, 18000);\n                    }\n                }\n            });\n        } else {\n            bindingView.rvMain.setVisibility(View.GONE);\n            clear();\n            loadSuccess();\n        }\n    }\n\n    public void clear() {\n        if (adapter != null) {\n            adapter.clear();\n            adapter.notifyDataSetChanged();\n        }\n\n    }\n    public List<Object> getPrecessedData() {\n\n        authorList.clear();\n        combineList.clear();\n        for (int i = 0; i < findList.getAuthorSection().size(); i++) {\n            authorList.addAll(findList.getAuthorSection().get(i).getItemList());\n        }\n        combineList.add(authorList);\n        combineList.addAll(findList.getVideoSection());\n\n        return combineList;\n    }\n    public void initSelectTypeRecyclerView() {\n\n        sTRecyclerView = bindingView.rvSelectType;\n        //初始化selectTypeRecyclerView\n        strAdapter = new SelectTypeRecyclerAdapter(selectLabel, getContext());\n        LinearLayoutManager layoutManager = new RecyclerViewNoBugLinearLayoutManager(getContext());\n        layoutManager.setOrientation(LinearLayoutManager.HORIZONTAL);\n        sTRecyclerView.setLayoutManager(layoutManager);\n        sTRecyclerView.setAdapter(strAdapter);\n        //长按删除监听\n        strAdapter.setItemCLickListener(new SelectTypeRecyclerAdapter.ItemClickListener() {\n            @Override\n            public void onLongItemLClick(int position) {\n                DebugUtil.debug(\"itemposition\", \"\" + position);\n                DataSupport.deleteAll(LabelType.class, \"type = ?\", selectLabel.get(position));\n                selectLabel.remove(position);\n                strAdapter.notifyItemRemoved(position);\n                strAdapter.notifyItemRangeChanged(position, selectLabel.size() - position);\n            }\n        });\n\n        //设置拖拽监听\n        /*ItemTouchHelper mItemTouchHelper = new ItemTouchHelper(new ItemTouchHelper.Callback() {\n            @Override\n            public int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {\n                final int dragFlags = ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT;\n                final int swipeFlags = ItemTouchHelper.START | ItemTouchHelper.END;\n                return makeMovementFlags(dragFlags, swipeFlags);\n\n            }\n            @Override\n            public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) {\n                //strAdapter.onItemMove(viewHolder.getAdapterPosition(), target.getAdapterPosition());\n                return false;\n            }\n            @Override\n            public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {\n                //strAdapter.onItemDismiss(viewHolder.getAdapterPosition());\n            }\n        });\n        mItemTouchHelper.attachToRecyclerView(sTRecyclerView);*/\n    }\n\n    @Override\n    public void onClick(View v) {\n\n        switch (v.getId()) {\n            case R.id.cv_add:\n                CategoryPopupWindow popupWindow = new CategoryPopupWindow(getContext());\n                popupWindow.showPopupWindow(bindingView.cvAdd);\n                popupWindow.setPopItemClickListener(new CategoryPopupWindow.PopItemClickListener() {\n                    @Override\n                    public void ItemClick(String labelType) {\n                        //存入labelType中没有的type\n                        savedLabelList = DataSupport.findAll(LabelType.class);\n                        for (LabelType label : savedLabelList) {\n                            if (labelType.equals(label.getType())) {\n                                return;\n                            }\n                        }\n                        LabelType label = new LabelType();\n                        label.setType(labelType);\n                        label.save();\n                        //刷新数据\n                        selectLabel.add(DataSupport.findLast(LabelType.class).getType());\n                        strAdapter.notifyDataSetChanged();\n                    }\n                });\n        }\n    }\n\n    public void loadSuccess() {\n        bindingView.srlSearchRefresh.setRefreshing(false);\n        if (bindingView.rlError.getVisibility() == View.VISIBLE) {\n            bindingView.rlError.setVisibility(View.GONE);\n        }\n        if (bindingView.rlSearchLoading.getVisibility() == View.VISIBLE) {\n            bindingView.rlSearchLoading.setVisibility(View.GONE);\n        }\n    }\n\n    public void showLoading() {\n        if (bindingView.rlError.getVisibility() == View.VISIBLE) {\n            bindingView.rlError.setVisibility(View.GONE);\n        }\n        if (bindingView.rlSearchLoading.getVisibility() == View.GONE) {\n            bindingView.rlSearchLoading.setVisibility(View.VISIBLE);\n        }\n    }\n    public void loadError() {\n        if (bindingView.rlError.getVisibility() == View.GONE) {\n            bindingView.rlError.setVisibility(View.VISIBLE);\n        }\n    }\n    private List<Integer> getCategoryIdList() {\n        List<LabelType> labelTypes = DataSupport.findAll(LabelType.class);\n        List<Integer> list = new ArrayList<>();\n        for (LabelType type : labelTypes) {\n            switch (type.getType()) {\n                case \"创意\":\n                    list.add(2);\n                    break;\n                case \"开胃\":\n                    list.add(4);\n                    break;\n                case \"旅行\":\n                    list.add(6);\n                    break;\n                case \"预告\":\n                    list.add(8);\n                    break;\n                case \"动画\":\n                    list.add(10);\n                    break;\n                case \"剧情\":\n                    list.add(12);\n                    break;\n                case \"广告\":\n                    list.add(14);\n                    break;\n                case \"运动\":\n                    list.add(18);\n                    break;\n                case \"音乐\":\n                    list.add(20);\n                    break;\n                case \"记录\":\n                    list.add(22);\n                    break;\n                case \"时尚\":\n                    list.add(24);\n                    break;\n                case \"萌宠\":\n                    list.add(26);\n                    break;\n                case \"搞笑\":\n                    list.add(28);\n                    break;\n                case \"游戏\":\n                    list.add(30);\n                    break;\n                case \"科普\":\n                    list.add(32);\n                    break;\n                case \"集锦\":\n                    list.add(34);\n                    break;\n                case \"生活\":\n                    list.add(36);\n                    break;\n                case \"综艺\":\n                    list.add(38);\n                    break;\n            }\n        }\n        return list;\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/example/discover/ui/Video/VideoFragment.java",
    "content": "package com.example.discover.ui.Video;\n\nimport android.os.Bundle;\nimport android.os.Handler;\nimport android.support.annotation.Nullable;\nimport android.support.v4.widget.SwipeRefreshLayout;\nimport android.support.v7.widget.LinearLayoutManager;\nimport android.support.v7.widget.RecyclerView;\n\nimport com.example.discover.R;\nimport com.example.discover.adapter.VideoRecyclerAdapter;\nimport com.example.discover.app.Constant;\nimport com.example.discover.base.BaseFragment;\nimport com.example.discover.bean.HotEyeBean;\nimport com.example.discover.databinding.FragmentVideoBinding;\nimport com.example.discover.http.RequestListener;\nimport com.example.discover.http.cahe.ACache;\nimport com.example.discover.model.HotVideoModel;\nimport com.example.discover.ui.RecyclerViewNoBugLinearLayoutManager;\nimport com.example.discover.utils.DebugUtil;\nimport com.example.zmenu.FloatButton;\nimport com.example.zmenu.PUtils;\nimport com.jcodecraeer.xrecyclerview.XRecyclerView;\n\nimport java.util.List;\n\nimport cn.jzvd.JZVideoPlayer;\n\n\n/**\n * Created by Administrator on 2017/12/9 0009.\n */\n\npublic class VideoFragment extends BaseFragment<FragmentVideoBinding> {\n\n    private VideoRecyclerAdapter mVideoAdapter;\n    private LinearLayoutManager mLayoutManager;\n    private int start = 5; //前几个数据可能没有video，所以从5开始\n    private int num = 15;\n    private int mPage = 1;\n    private boolean isPrepare = false;\n    private boolean isFirst = true;\n    private HotEyeBean mHotEyeBean;\n    private ACache mCache;\n\n    @Override\n    public void onActivityCreated(@Nullable Bundle savedInstanceState) {\n        super.onActivityCreated(savedInstanceState);\n        mCache = ACache.get(getContext());\n        initRecyclerView();\n\n        //准备就绪\n        isPrepare = true;\n        //解决懒加载首页不显示，手动loadData()\n        loadData();\n    }\n\n    @Override\n    public void loadData() {\n        if (!isPrepare || !isVisibile || !isFirst) {\n            return;\n        }\n        //先从缓存读取数据，如果没有在请求\n        mHotEyeBean = (HotEyeBean) mCache.getAsObject(Constant.EYE_VIDEO);\n        if (mHotEyeBean != null ) {\n            showContentView();\n            setAdapter(mHotEyeBean);\n            DebugUtil.debug(\"test12\", mHotEyeBean.getItemList().get(0).getType());\n        }else {\n            loadVideo();\n        }\n        //避免重复加载\n        isFirst = false;\n    }\n\n    public void loadVideo() {\n        HotVideoModel.showVideo(this, start, num, new RequestListener() {\n            @Override\n            public void onSuccess(Object object) {\n                showContentView();\n\n                HotEyeBean hotEyeBean = (HotEyeBean) object;\n                if (mPage == 1) {\n                    if(hotEyeBean != null && hotEyeBean.getItemList() != null&& hotEyeBean.getItemList().size() > 0) {\n\n                        DebugUtil.debug(\"test1 23456\", \"video\" + hotEyeBean.getItemList().size());\n                        bindingView.srlVideo.setRefreshing(false);\n                        setAdapter(hotEyeBean);\n                        //缓存5小时\n                        mCache.remove(Constant.EYE_VIDEO);\n                        mCache.put(Constant.EYE_VIDEO, hotEyeBean, 18000);\n                    }\n                } else {\n                    if(hotEyeBean != null && hotEyeBean.getItemList() != null&& hotEyeBean.getItemList().size() > 0) {\n                        mVideoAdapter.updateStateLoad(false);\n                        mVideoAdapter.addAll(hotEyeBean.getItemList());\n                        mVideoAdapter.notifyDataSetChanged();\n                    } else {\n                        //数据刷新到底了\n                        mVideoAdapter.hideLoading();\n                    }\n                }\n            }\n\n            @Override\n            public void onFailed(Throwable throwable) {\n\n                bindingView.srlVideo.setRefreshing(false);\n                if (mVideoAdapter.getItemCount() == 1) {\n                    Error();\n                }\n            }\n\n            @Override\n            public void onCompleted() {\n\n            }\n\n        });\n\n    }\n    @Override\n    public int setContentView() {\n        return R.layout.fragment_video;\n    }\n\n    public void initRecyclerView() {\n        mVideoAdapter = new VideoRecyclerAdapter(getContext());\n        mLayoutManager = new RecyclerViewNoBugLinearLayoutManager(getActivity());\n        mLayoutManager.setOrientation(LinearLayoutManager.VERTICAL);\n        bindingView.rvVideo.setLayoutManager(mLayoutManager);\n\n        bindingView.srlVideo.setColorSchemeResources(R.color.background5, R.color.background2, R.color.background4);\n        //上拉刷新\n        bindingView.srlVideo.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {\n            @Override\n            public void onRefresh() {\n                JZVideoPlayer.goOnPlayOnPause();\n                bindingView.srlVideo.postDelayed(new Runnable() {\n                    @Override\n                    public void run() {\n                        mPage = 1;\n                        start = 5;\n                        loadVideo();\n                    }\n                }, 1000);\n            }\n        });\n        //设置recycler滚动监听\n        bindingView.rvVideo.setOnScrollListener(new RecyclerView.OnScrollListener() {\n            //下拉加载更多\n            @Override\n            public void onScrolled(RecyclerView recyclerView, int dx, int dy) {\n                super.onScrolled(recyclerView, dx, dy);\n                int lastVisibleItem = mLayoutManager.findLastVisibleItemPosition();\n                int totalItemCount = mLayoutManager.getItemCount();\n                DebugUtil.debug(\"position1\", lastVisibleItem + \"  \" + totalItemCount);\n                if (lastVisibleItem == totalItemCount - 1 && !mVideoAdapter.isLoading()) {\n                    mVideoAdapter.updateStateLoad(true);\n                    mPage++;\n                    start += num;\n                    new Handler().postDelayed(new Runnable() {\n                        @Override\n                        public void run() {\n                            DebugUtil.debug(\"startpage\", mPage + \"\" + start);\n                            loadVideo();\n                        }\n                    }, 1000);\n\n                }\n            }\n\n            //recyclerview滑动时ZMemu自动隐藏\n            @Override\n            public void onScrollStateChanged(RecyclerView recyclerView, int newState) {\n                super.onScrollStateChanged(recyclerView, newState);\n                if (newState == XRecyclerView.SCROLL_STATE_IDLE  && PUtils.getInstance().getViewList() != null) {\n\n                    for (int i = 0; i < PUtils.getInstance().getViewList().size(); i++) {\n                        PUtils.getInstance().getViewList().get(i).show();\n                    }\n                } else {\n                    for (int i = 0; i < PUtils.getInstance().getViewList().size(); i++) {\n                        PUtils.getInstance().getViewList().get(i).hide();\n                    }\n                }\n            }\n        });\n\n    }\n    public void setAdapter(HotEyeBean hotEyeBean) {\n        mVideoAdapter.clear();\n        mVideoAdapter.addAll(hotEyeBean.getItemList());\n        bindingView.rvVideo.setAdapter(mVideoAdapter);\n    }\n\n    @Override\n    protected void Refresh() {\n        super.Refresh();\n        showLoading();\n        loadVideo();\n    }\n\n    @Override\n    public void onPause() {\n        JZVideoPlayer.releaseAllVideos();\n        super.onPause();\n    }\n\n}\n"
  },
  {
    "path": "app/src/main/java/com/example/discover/ui/Welfare/WelFareFragment.java",
    "content": "package com.example.discover.ui.Welfare;\n\nimport android.os.Bundle;\nimport android.os.Handler;\nimport android.support.annotation.Nullable;\nimport android.support.v7.widget.RecyclerView;\nimport android.support.v7.widget.StaggeredGridLayoutManager;\nimport android.view.View;\n\nimport com.example.discover.R;\nimport com.example.discover.adapter.WelfareAdapter;\nimport com.example.discover.app.Constant;\nimport com.example.discover.base.BaseFragment;\nimport com.example.discover.base.baseadapter.OnItemClickListener;\nimport com.example.discover.bean.GankBean;\nimport com.example.discover.bean.HotEyeBean;\nimport com.example.discover.databinding.FragmentWelfareBinding;\nimport com.example.discover.http.RequestListener;\nimport com.example.discover.http.cahe.ACache;\nimport com.example.discover.model.GankModel;\nimport com.example.discover.utils.DebugUtil;\nimport com.example.discover.utils.IntentManager;\nimport com.example.zmenu.PUtils;\nimport com.jcodecraeer.xrecyclerview.XRecyclerView;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\n/**\n * Created by monkeyWiiu on 2018/2/3.\n */\n\npublic class WelFareFragment extends BaseFragment<FragmentWelfareBinding> {\n\n    private boolean isFirst = true;\n    private boolean isPrepare = false;\n    private int num = 20;\n    private int page = 1;\n    private ACache mCache;\n    private GankBean mgankBean;\n    private WelfareAdapter welfareAdapter;\n    private StaggeredGridLayoutManager layoutManager;\n    private ArrayList<String> imgList = new ArrayList<>();\n    @Override\n    public void onActivityCreated(@Nullable Bundle savedInstanceState) {\n        super.onActivityCreated(savedInstanceState);\n        mCache = ACache.get(getContext());\n        welfareAdapter = new WelfareAdapter(getContext());\n        initRecyclerView();\n        isPrepare = true;\n    }\n\n    @Override\n    public void loadData() {\n        if (!isPrepare || !isVisibile || !isFirst) {\n            return;\n        }\n\n        //先从缓存读取数据，如果没有在请求\n        mgankBean = (GankBean) mCache.getAsObject(Constant.GANK_WELFARE);\n        if (mgankBean != null ) {\n            showContentView();\n            for (int i = 0; i < mgankBean.getResults().size(); i++) {\n                imgList.add(mgankBean.getResults().get(i).getUrl());\n            }\n            setWelfareAdapter(mgankBean);\n            page ++;\n            DebugUtil.debug(\"test12\", mgankBean.getResults().get(0).getType());\n        }else {\n            showWelfare();\n        }\n\n        isFirst = false;\n    }\n\n    public void showWelfare() {\n        GankModel.loadGank(\"福利\", num, page, new RequestListener() {\n            @Override\n            public void onSuccess(Object object) {\n\n                showContentView();\n                GankBean gankBean = (GankBean) object;\n                if (page == 1) {\n\n                    if (gankBean != null && gankBean.getResults() != null && gankBean.getResults().size() > 0) {\n\n                        imgList.clear();\n                        for (int i = 0; i < gankBean.getResults().size(); i++) {\n                            imgList.add(gankBean.getResults().get(i).getUrl());\n                        }\n                        setWelfareAdapter(gankBean);\n                        mCache.remove(Constant.GANK_WELFARE);\n                        mCache.put(Constant.GANK_WELFARE, gankBean, 18000);\n                    }\n\n                } else {\n                    if (gankBean.getResults() != null && gankBean.getResults().size() > 0) {\n\n                        welfareAdapter.updateStateLoad(false);\n                        welfareAdapter.addAll(gankBean.getResults());\n                        welfareAdapter.notifyDataSetChanged();\n                        for (int i = 0; i < gankBean.getResults().size(); i++) {\n                            imgList.add(gankBean.getResults().get(i).getUrl());\n                        }\n                    } else {\n                        //数据刷新到底了\n                        welfareAdapter.hideLoading();\n                    }\n                }\n                DebugUtil.debug(\"welfaress\", gankBean.getResults().size() + \"\");\n\n                page++;\n            }\n\n            @Override\n            public void onFailed(Throwable t) {\n\n            }\n\n            @Override\n            public void onCompleted() {\n\n            }\n        });\n    }\n\n    public void initRecyclerView() {\n        layoutManager = new StaggeredGridLayoutManager(2, StaggeredGridLayoutManager.VERTICAL);\n        bindingView.rvWelfare.setLayoutManager(layoutManager);\n\n        bindingView.rvWelfare.setOnScrollListener(new RecyclerView.OnScrollListener() {\n\n            //recyclerview滑动时ZMemu自动隐藏\n            @Override\n            public void onScrollStateChanged(RecyclerView recyclerView, int newState) {\n                super.onScrollStateChanged(recyclerView, newState);\n                if (newState == XRecyclerView.SCROLL_STATE_IDLE  && PUtils.getInstance().getViewList() != null) {\n\n                    for (int i = 0; i < PUtils.getInstance().getViewList().size(); i++) {\n                        PUtils.getInstance().getViewList().get(i).show();\n                    }\n                } else {\n                    for (int i = 0; i < PUtils.getInstance().getViewList().size(); i++) {\n                        PUtils.getInstance().getViewList().get(i).hide();\n                    }\n                }\n\n\n                int column = layoutManager.getColumnCountForAccessibility(null,null);\n                int[] positions = new int[column];\n                layoutManager.findLastCompletelyVisibleItemPositions(positions);\n\n                if (!welfareAdapter.isLoading()) {\n\n                    for (int i =0; i < positions.length; i++){\n                        if (positions[i] >= layoutManager.getItemCount() - column && layoutManager\n                                .findViewByPosition(positions[i]).getBottom() <=  recyclerView.getHeight()){\n\n                            welfareAdapter.updateStateLoad(true);\n\n                            new Handler().postDelayed(new Runnable() {\n                                @Override\n                                public void run() {\n                                    DebugUtil.debug(\"startpage\", page + \"\");\n                                    showWelfare();\n                                }\n                            }, 1000);\n\n                            break;\n                        }\n                    }\n                }\n\n            }\n        });\n    }\n\n    public void setWelfareAdapter(GankBean result) {\n        welfareAdapter.addAll(result.getResults());\n        bindingView.rvWelfare.setAdapter(welfareAdapter);\n        welfareAdapter.notifyDataSetChanged();\n        welfareAdapter.setOnItemClickListener(new OnItemClickListener<GankBean.ResultBean>() {\n            @Override\n            public void onClick(View view, GankBean.ResultBean resultBean, int position) {\n                DebugUtil.debug(\"wellll\", \"click\");\n                IntentManager.toBigImageActivity(getActivity(), view, position, imgList);\n            }\n        });\n    }\n    @Override\n    public int setContentView() {\n        return R.layout.fragment_welfare;\n    }\n\n\n}\n"
  },
  {
    "path": "app/src/main/java/com/example/discover/utils/BindingUtil.java",
    "content": "package com.example.discover.utils;\n\nimport android.databinding.BindingAdapter;\nimport android.databinding.BindingBuildInfo;\nimport android.support.v7.widget.LinearLayoutManager;\nimport android.support.v7.widget.RecyclerView;\nimport android.text.format.DateUtils;\nimport android.view.View;\nimport android.widget.ImageView;\nimport android.widget.TextView;\n\nimport com.bumptech.glide.Glide;\nimport com.example.discover.R;\nimport com.example.discover.adapter.AuthorPopAdapter;\nimport com.example.discover.adapter.CategoryPopAdapter;\nimport com.example.discover.bean.DetailBean.Data;\nimport com.example.discover.bean.DetailBean.ItemList;\nimport com.example.discover.view.CustomView.CircleImageView;\n\nimport java.util.List;\n\n/**\n * Created by monkeyWiiu on 2018/1/18.\n */\n\npublic class BindingUtil {\n\n    @BindingAdapter(\"authorData\")\n    public static void setAuthorData(RecyclerView view, List<ItemList> lists) {\n        AuthorPopAdapter authorPopAdapter = new AuthorPopAdapter(view.getContext());\n        LinearLayoutManager manager = new LinearLayoutManager(view.getContext()\n                , LinearLayoutManager.HORIZONTAL, false);\n        authorPopAdapter.addAll(lists);\n        view.setLayoutManager(manager);\n        view.setAdapter(authorPopAdapter);\n    }\n\n    @BindingAdapter(\"categoryData\")\n    public static void setCategoryData(RecyclerView view, List<ItemList> list) {\n\n        CategoryPopAdapter categoryPopAdapter = new CategoryPopAdapter(view.getContext());\n        categoryPopAdapter.addAll(list);\n        LinearLayoutManager manager = new LinearLayoutManager(view.getContext()\n                , LinearLayoutManager.HORIZONTAL, false);\n        view.setLayoutManager(manager);\n        view.setAdapter(categoryPopAdapter);\n    }\n\n    @BindingAdapter(\"imageUrl\")\n    public static void setImage(ImageView view, String url) {\n        Glide.with(view.getContext()).load(url)\n                .crossFade(500)\n                .placeholder(R.drawable.cross_image)\n                .error(R.drawable.cross_image)\n                .into(view);\n    }\n\n    @BindingAdapter(\"welfareImageUrl\")\n    public static void setWelfareImage(ImageView view, String url) {\n        Glide.with(view.getContext()).load(url)\n                .crossFade(500)\n                .error(R.drawable.cross_image_welfare)\n                .into(view);\n    }\n    @BindingAdapter(\"circleImageUrl\")\n    public static void setCircleImage(CircleImageView view, String url) {\n        Glide.with(view.getContext()).load(url)\n                .crossFade(800)\n                .dontAnimate()\n                .placeholder(R.drawable.cross_image)\n                .error(R.drawable.close_press)\n                .into(view);\n\n    }\n    @BindingAdapter(\"visibility\")\n    public static void setVisibility(View view, boolean visible) {\n        if (visible) {\n            view.setVisibility(View.VISIBLE);\n        } else {\n            view.setVisibility(View.GONE);\n        }\n    }\n\n    @BindingAdapter(\"authorName\")\n    public static void setAuthorName(TextView v, ItemList item) {\n        if (item.getData().getAuthor() != null) {\n            v.setText(item.getData().getAuthor().getName());\n        } else\n            v.setText(\"\");\n    }\n\n\n    @BindingAdapter(\"time\")\n    public static void setTime(TextView view, Long time) {\n        view.setText(DateUtils.getRelativeTimeSpanString(time,\n                System.currentTimeMillis(),  DateUtils.SECOND_IN_MILLIS).toString().toLowerCase());\n    }\n\n    @BindingAdapter(\"type\")\n    public static void setType(TextView view, Data data) {\n        view.setText(data.getCategory() + \" | \" + TimeUtils.secToTime((int) data.getDuration()));\n    }\n\n}\n"
  },
  {
    "path": "app/src/main/java/com/example/discover/utils/DebugUtil.java",
    "content": "package com.example.discover.utils;\n\nimport android.content.Context;\nimport android.util.Log;\nimport android.widget.Toast;\n\n/**\n * Created by Administrator on 2017/12/6 0006.\n */\n\n//在代码中要打印log,就直接DebugUtil.debug(....).然后如果发布的时候,就直接把这个类的DEBUG 改成false,这样所有的log就不会再打印在控制台.\npublic class DebugUtil {\n    public static final String TAG = \"wuikii\";\n    public static final boolean DEBUG = true;\n    public static void toast(Context context, String content) {\n        Toast.makeText(context, content, Toast.LENGTH_SHORT).show();\n    }\n\n    public static void debug(String tag, String msg) {\n        if (DEBUG) {\n            Log.d(tag, msg);\n        }\n    }\n\n    public static void debug(String msg) {\n        if (DEBUG) {\n            Log.d(TAG, msg);\n        }\n    }\n\n    public static void error(String tag, String error) {\n\n        if (DEBUG) {\n\n            Log.e(tag, error);\n        }\n    }\n\n    public static void error(String error) {\n\n        if (DEBUG) {\n\n            Log.e(TAG, error);\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/example/discover/utils/DensityUtil.java",
    "content": "package com.example.discover.utils;\n\nimport android.content.Context;\nimport android.util.TypedValue;\nimport android.view.WindowManager;\n\nimport com.example.discover.app.DiscoverApplication;\n\n/**\n * Created by monkeyWiiu on 2017/12/20.\n */\n\npublic class DensityUtil {\n\n    public static int getScreenWidth(Context context) {\n        WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);\n        int width = wm.getDefaultDisplay().getWidth();\n        return width;\n    }\n\n    /**\n     * 根据手机的分辨率从 dp 的单位 转成为 px(像素)\n     */\n    public static int dip2px(float dpValue) {\n        final float scale = DiscoverApplication.getDiscoverApplication().getResources().getDisplayMetrics().density;\n        return (int) (dpValue * scale + 0.5f);\n    }\n    /**\n     * 根据手机的分辨率从 px(像素) 的单位 转成为 dp\n     */\n    public static int px2dip(float pxValue) {\n        final float scale = DiscoverApplication.getDiscoverApplication().getResources().getDisplayMetrics().density;\n        return (int) (pxValue / scale + 0.5f);\n    }\n\n    /**\n     * 获取actionBarSize  高度\n     */\n    public static int getActionBarSize() {\n        TypedValue tv = new TypedValue();\n        if (DiscoverApplication.getDiscoverApplication().getApplicationContext().getTheme().resolveAttribute(android.R.attr.actionBarSize, tv, true)) {\n            int actionBarHeight = TypedValue.complexToDimensionPixelSize(tv.data, DiscoverApplication.getDiscoverApplication().getApplicationContext().getResources().getDisplayMetrics());\n\n            return actionBarHeight;\n        } else {\n            return 0;\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/example/discover/utils/IntentManager.java",
    "content": "package com.example.discover.utils;\n\nimport android.app.Activity;\nimport android.app.ActivityOptions;\nimport android.content.Context;\nimport android.content.Intent;\nimport android.os.Bundle;\nimport android.support.v4.app.ActivityCompat;\nimport android.support.v4.app.ActivityOptionsCompat;\nimport android.util.Pair;\nimport android.view.View;\n\nimport com.example.discover.AuthorHomeActivity;\nimport com.example.discover.R;\nimport com.example.discover.ResultActivity;\nimport com.example.discover.VideoDetailActivity;\nimport com.example.discover.ViewBigImageActivity;\nimport com.example.discover.app.Constant;\nimport com.example.discover.bean.DetailBean.ItemList;\nimport com.example.discover.bean.LitePalBean.LikeVideo;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\n/**\n * Created by monkeyWiiu on 2018/1/30.\n */\n\npublic class IntentManager {\n\n    public static void toVideoDetailActivity(Activity context, ItemList item, View view) {\n        Intent intent = new Intent(context, VideoDetailActivity.class);\n        intent.putExtra(\"item\", item);\n        /*ActivityOptions options = ActivityOptions.makeSceneTransitionAnimation(\n                context,\n                Pair.create(view, context.getString(R.string.transition_shot)),\n                Pair.create(view, context.getString(R.string.transition_shot_background))\n        );*/\n        ActivityOptionsCompat optionsCompat = ActivityOptionsCompat.makeSceneTransitionAnimation(\n                context,\n                android.support.v4.util.Pair.create(view, context.getString(R.string.transition_shot)),\n                android.support.v4.util.Pair.create(view, context.getString(R.string.transition_shot_background))\n        );\n        ActivityCompat.startActivity(context, intent, optionsCompat.toBundle());\n        //context.startActivity(intent);\n\n    }\n\n    public static void toAuthorHomeActivity(Context context,ItemList list) {\n        int color = 0;\n        if (list.getData().getItemList().size()  > 0) {\n            color = (Integer) Constant.LabelMap.get(list.getData().getItemList().get(0).getData().getCategory());\n        }\n        Intent intent = new Intent(context, AuthorHomeActivity.class);\n        intent.putExtra(\"AuthorId\", list.getData().getHeader().getId());\n        intent.putExtra(\"AuthorName\", list.getData().getHeader().getTitle());\n        intent.putExtra(\"AuthorIcon\", list.getData().getHeader().getIcon());\n        intent.putExtra(\"AuthorDesc\", list.getData().getHeader().getDescription());\n        intent.putExtra(\"Color\", color);\n        try {\n            intent.putExtra(\"AuthorBack\", list.getData().getItemList().get(0).getData().getTags().get(0).getHeaderImage());\n        } catch (Exception e) {\n            e.printStackTrace();\n        }\n\n        context.startActivity(intent);\n    }\n\n    public static void fromDetailtoAuthor(Context context, ItemList list) {\n        int color = 0;\n        color = (int) Constant.LabelMap.get(list.getData().getCategory());\n        Intent intent = new Intent(context, AuthorHomeActivity.class);\n        intent.putExtra(\"AuthorId\", list.getData().getAuthor().getId());\n        intent.putExtra(\"AuthorName\", list.getData().getAuthor().getName());\n        intent.putExtra(\"AuthorIcon\", list.getData().getAuthor().getIcon());\n        intent.putExtra(\"AuthorDesc\", list.getData().getAuthor().getDescription());\n        intent.putExtra(\"Color\", color);\n        try {\n            intent.putExtra(\"AuthorBack\", list.getData().getTags().get(0).getHeaderImage());\n        } catch (Exception e) {\n            e.printStackTrace();\n        }\n\n        context.startActivity(intent);\n    }\n\n    public static void fromPersonalToAuthor(Context context, LikeVideo likeVideo) {\n\n        Intent intent = new Intent(context, AuthorHomeActivity.class);\n        intent.putExtra(\"AuthorId\", likeVideo.getAuthorId());\n        intent.putExtra(\"AuthorName\", likeVideo.getAuthorName());\n        intent.putExtra(\"AuthorIcon\", likeVideo.getAuthorIcon());\n        intent.putExtra(\"AuthorDesc\", likeVideo.getAuthorDesc());\n        intent.putExtra(\"Color\", likeVideo.getLabelColor());\n        intent.putExtra(\"AuthorBack\", likeVideo.getImageUrl());\n\n\n        context.startActivity(intent);\n    }\n    public static void toBigImageActivity(Activity context, View view, int position, ArrayList<String> imgList) {\n        Bundle bundle = new Bundle();\n        bundle.putInt(\"selet\", 2);// 2,大图显示当前页数，1,头像，不显示页数\n        bundle.putInt(\"code\", position);//第几张\n        bundle.putStringArrayList(\"imageuri\", imgList);\n        ActivityOptionsCompat options = ActivityOptionsCompat.makeSceneTransitionAnimation(\n                context,\n                android.support.v4.util.Pair.create(view, context.getString(R.string.transition_shot)),\n                android.support.v4.util.Pair.create(view, context.getString(R.string.transition_shot_background))\n        );\n        Intent intent = new Intent(context, ViewBigImageActivity.class);\n        intent.putExtras(bundle);\n        ActivityCompat.startActivity(context, intent, options.toBundle());\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/example/discover/utils/LitePalUtil.java",
    "content": "package com.example.discover.utils;\n\nimport com.example.discover.bean.DetailBean.Data;\nimport com.example.discover.bean.LitePalBean.Follow;\nimport com.example.discover.bean.LitePalBean.LabelType;\nimport com.example.discover.bean.LitePalBean.LikeVideo;\nimport com.example.discover.view.CustomView.LabelView;\n\nimport org.litepal.crud.DataSupport;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\n/**\n * Created by monkeyWiiu on 2018/1/13.\n */\n\npublic class LitePalUtil {\n\n    public static List<String> getSelectLabel() {\n        List<LabelType> list = DataSupport.findAll(LabelType.class);\n        List<String> labelList = new ArrayList();\n        for (LabelType labelType : list) {\n            labelList.add(labelType.getType());\n        }\n        return labelList;\n    }\n\n    public static void addVideoToFavor(int id, String title, String desc, String playUrl,\n                                  String imageUrl, String authorName, int authorId, String authorIcon, String authorDesc, int labelColor, String labelText, int size) {\n        LikeVideo likeVideo = new LikeVideo();\n        likeVideo.setId(1);\n        likeVideo.setVideoId(id);\n        likeVideo.setTitle(title);\n        likeVideo.setDescription(desc);\n        likeVideo.setPlayUrl(playUrl);\n        likeVideo.setImageUrl(imageUrl);\n        likeVideo.setAuthorName(authorName);\n        likeVideo.setAuthorId(authorId);\n        likeVideo.setAuthorIcon(authorIcon);\n        likeVideo.setAuthorDesc(authorDesc);\n        likeVideo.setLabelColor(labelColor);\n        likeVideo.setLabelText(labelText);\n        likeVideo.setSize(size);\n        likeVideo.save();\n    }\n\n    public static void deleteVideoFromFavor(int videoId) {\n        DataSupport.deleteAll(LikeVideo.class, \"videoId = ?\", String.valueOf(videoId));\n    }\n\n    public static void addToFollow(int authorId, String authorName, String desc, String iconUrl, int backgroundColor,String backgroundImage) {\n        Follow follow = new Follow();\n        follow.setAuthorId(authorId);\n        follow.setAuthorName(authorName);\n        follow.setAuthorDesc(desc);\n        follow.setIconUrl(iconUrl);\n        follow.setBackgroundColor(backgroundColor);\n        follow.setBackgroundImage(backgroundImage);\n        follow.save();\n    }\n\n    public static void deleteFromFollow(int authorId) {\n        DataSupport.deleteAll(Follow.class, \"authorId = ?\", String.valueOf(authorId));\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/example/discover/utils/ShareUtil.java",
    "content": "package com.example.discover.utils;\n\nimport android.content.Context;\nimport android.content.Intent;\n\nimport com.example.discover.R;\n\n/**\n * Created by monkeyWiiu on 2017/12/29.\n */\n\npublic class ShareUtil {\n\n    public static void share(Context context, String shareText) {\n        Intent intent = new Intent(Intent.ACTION_SEND);\n        intent.setType(\"text/plain\");\n        intent.putExtra(Intent.EXTRA_TEXT, shareText);\n        context.startActivity(Intent.createChooser(intent, context.getString(R.string.action_share)));\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/example/discover/utils/TimeUtils.java",
    "content": "package com.example.discover.utils;\n\n\npublic class TimeUtils {\n\n    private static final String ZERO = \"0\";\n    private static final String COLON_SYMBOL = \":\";\n\n    private TimeUtils() {}\n\n    public static int millsToSec(int mills) {\n        return mills / 1000;\n    }\n\n    public static String secToTime(int time) {\n        String timeStr;\n        int hour = time / 3600;\n        int minute = time / 60 % 60;\n        int second = time % 60;\n        if (hour == 0) {\n            timeStr = unitFormat(minute) + COLON_SYMBOL + unitFormat(second);\n        } else {\n            timeStr = unitFormat(hour) + COLON_SYMBOL +\n                    unitFormat(minute) + COLON_SYMBOL + unitFormat(second);\n        }\n        return timeStr;\n    }\n\n    private static String unitFormat(int i) {\n        String retStr;\n        if (i >= 0 && i < 10) {\n            retStr = ZERO + Integer.toString(i);\n        } else {\n            retStr = String.valueOf(i);\n        }\n        return retStr;\n    }\n\n}\n"
  },
  {
    "path": "app/src/main/java/com/example/discover/view/CustomView/CategoryPopupWindow.java",
    "content": "package com.example.discover.view.CustomView;\n\nimport android.content.Context;\nimport android.support.v7.widget.GridLayoutManager;\nimport android.support.v7.widget.RecyclerView;\nimport android.view.LayoutInflater;\nimport android.view.View;\nimport android.view.ViewGroup;\nimport android.widget.PopupWindow;\n\nimport com.example.discover.R;\nimport com.example.discover.adapter.LabelChooseAdapter;\nimport com.example.discover.app.Constant;\n\n/**\n * Created by monkeyWiiu on 2018/1/13.\n */\n\npublic class CategoryPopupWindow extends PopupWindow {\n\n\n    private PopItemClickListener mListener;\n    public interface PopItemClickListener {\n        void ItemClick(String labelType);\n    }\n\n    public void setPopItemClickListener(PopItemClickListener listener) {\n        this.mListener = listener;\n    }\n    public CategoryPopupWindow(Context context) {\n        LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);\n        View contentView = inflater.inflate(R.layout.category_popup_window, null);\n        // 设置SelectPicPopupWindow的View\n        this.setContentView(contentView);\n        // 设置SelectPicPopupWindow弹出窗体的宽\n        //this.setWidth(DensityUtil.dip2px(300));\n        this.setWidth(ViewGroup.LayoutParams.WRAP_CONTENT);\n        // 设置SelectPicPopupWindow弹出窗体的高\n        this.setHeight(ViewGroup.LayoutParams.WRAP_CONTENT);\n        // 设置SelectPicPopupWindow弹出窗体可点击\n        this.setFocusable(true);\n        this.setOutsideTouchable(true);\n        /*if (Build.VERSION.SDK_INT > 20) {\n            this.setElevation(10f);\n        }*/\n\n        //刷新状态\n        this.update();\n        // 实例化一个ColorDrawable颜色为半透明\n        //ColorDrawable dw = new ColorDrawable();\n        // 点back键和其他地方使其消失,设置了这个才能触发OnDismisslistener ，设置其他控件变化等操作\n        //this.setBackgroundDrawable(dw);\n        // 设置SelectPicPopupWindow弹出窗体动画效果\n        this.setAnimationStyle(R.style.AnimationFadeLT);\n\n        initRecycler(contentView, context);\n    }\n\n    /**\n     * 显示popupWindow\n     *\n     * @param parent\n     */\n    public void showPopupWindow(View parent) {\n        if (!this.isShowing()) {\n            // 以下拉方式显示popupwindow\n            this.showAsDropDown(parent, parent.getLayoutParams().width / 2, 48);\n        } else {\n            this.dismiss();\n        }\n    }\n\n    public void initRecycler(View view, Context context) {\n        RecyclerView rvLabel = view.findViewById(R.id.rv_label_choose);\n        LabelChooseAdapter adapter;adapter = new LabelChooseAdapter(Constant.videoTypeList, Constant.LabelMap, context);\n        adapter.setItemClickListener(new LabelChooseAdapter.ItemClickListener() {\n            @Override\n            public void itemClick(String labelType) {\n                mListener.ItemClick(labelType);\n            }\n        });\n        GridLayoutManager layoutManager = new GridLayoutManager(context, 3, GridLayoutManager.VERTICAL, false);\n        rvLabel.setLayoutManager(layoutManager);\n        rvLabel.setAdapter(adapter);\n    }\n\n}\n"
  },
  {
    "path": "app/src/main/java/com/example/discover/view/CustomView/CircleImageView.java",
    "content": "package com.example.discover.view.CustomView;\n\nimport android.content.Context;\nimport android.content.res.TypedArray;\nimport android.graphics.Bitmap;\nimport android.graphics.BitmapShader;\nimport android.graphics.Canvas;\nimport android.graphics.Color;\nimport android.graphics.ColorFilter;\nimport android.graphics.Matrix;\nimport android.graphics.Outline;\nimport android.graphics.Paint;\nimport android.graphics.Rect;\nimport android.graphics.RectF;\nimport android.graphics.Shader;\nimport android.graphics.drawable.BitmapDrawable;\nimport android.graphics.drawable.ColorDrawable;\nimport android.graphics.drawable.Drawable;\nimport android.net.Uri;\nimport android.os.Build;\nimport android.support.annotation.ColorInt;\nimport android.support.annotation.ColorRes;\nimport android.support.annotation.DrawableRes;\nimport android.support.annotation.RequiresApi;\nimport android.util.AttributeSet;\nimport android.view.View;\nimport android.view.ViewOutlineProvider;\nimport android.widget.ImageView;\n\nimport com.example.discover.R;\n\n/**\n * Created by monkeyWiiu on 2018/1/9.\n */\n\npublic class CircleImageView extends android.support.v7.widget.AppCompatImageView {\n\n    private static final ScaleType SCALE_TYPE = ScaleType.CENTER_CROP;\n\n    private static final Bitmap.Config BITMAP_CONFIG = Bitmap.Config.ARGB_8888;\n    private static final int COLORDRAWABLE_DIMENSION = 2;\n\n    private static final int DEFAULT_BORDER_WIDTH = 0;\n    private static final int DEFAULT_BORDER_COLOR = Color.BLACK;\n    private static final int DEFAULT_CIRCLE_BACKGROUND_COLOR = Color.TRANSPARENT;\n    private static final boolean DEFAULT_BORDER_OVERLAY = false;\n\n    private final RectF mDrawableRect = new RectF();\n    private final RectF mBorderRect = new RectF();\n\n    private final Matrix mShaderMatrix = new Matrix();\n    private final Paint mBitmapPaint = new Paint();\n    private final Paint mBorderPaint = new Paint();\n    private final Paint mCircleBackgroundPaint = new Paint();\n\n    private int mBorderColor = DEFAULT_BORDER_COLOR;\n    private int mBorderWidth = DEFAULT_BORDER_WIDTH;\n    private int mCircleBackgroundColor = DEFAULT_CIRCLE_BACKGROUND_COLOR;\n\n    private Bitmap mBitmap;\n    private BitmapShader mBitmapShader;\n    private int mBitmapWidth;\n    private int mBitmapHeight;\n\n    private float mDrawableRadius;\n    private float mBorderRadius;\n\n    private ColorFilter mColorFilter;\n\n    private boolean mReady;\n    private boolean mSetupPending;\n    private boolean mBorderOverlay;\n    private boolean mDisableCircularTransformation;\n\n    public CircleImageView(Context context) {\n        super(context);\n\n        init();\n    }\n\n    public CircleImageView(Context context, AttributeSet attrs) {\n        this(context, attrs, 0);\n    }\n\n    public CircleImageView(Context context, AttributeSet attrs, int defStyle) {\n        super(context, attrs, defStyle);\n\n        TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.CircleImageView, defStyle, 0);\n\n        mBorderWidth = a.getDimensionPixelSize(R.styleable.CircleImageView_civ_border_width, DEFAULT_BORDER_WIDTH);\n        mBorderColor = a.getColor(R.styleable.CircleImageView_civ_border_color, DEFAULT_BORDER_COLOR);\n        mBorderOverlay = a.getBoolean(R.styleable.CircleImageView_civ_border_overlay, DEFAULT_BORDER_OVERLAY);\n\n        // Look for deprecated civ_fill_color if civ_circle_background_color is not set\n        if (a.hasValue(R.styleable.CircleImageView_civ_circle_background_color)) {\n            mCircleBackgroundColor = a.getColor(R.styleable.CircleImageView_civ_circle_background_color,\n                    DEFAULT_CIRCLE_BACKGROUND_COLOR);\n        } else if (a.hasValue(R.styleable.CircleImageView_civ_fill_color)) {\n            mCircleBackgroundColor = a.getColor(R.styleable.CircleImageView_civ_fill_color,\n                    DEFAULT_CIRCLE_BACKGROUND_COLOR);\n        }\n\n        a.recycle();\n\n        init();\n    }\n\n    private void init() {\n        super.setScaleType(SCALE_TYPE);\n        mReady = true;\n\n        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {\n            setOutlineProvider(new OutlineProvider());\n        }\n\n        if (mSetupPending) {\n            setup();\n            mSetupPending = false;\n        }\n    }\n\n    @Override\n    public ScaleType getScaleType() {\n        return SCALE_TYPE;\n    }\n\n    @Override\n    public void setScaleType(ScaleType scaleType) {\n        if (scaleType != SCALE_TYPE) {\n            throw new IllegalArgumentException(String.format(\"ScaleType %s not supported.\", scaleType));\n        }\n    }\n\n    @Override\n    public void setAdjustViewBounds(boolean adjustViewBounds) {\n        if (adjustViewBounds) {\n            throw new IllegalArgumentException(\"adjustViewBounds not supported.\");\n        }\n    }\n\n    @Override\n    protected void onDraw(Canvas canvas) {\n        if (mDisableCircularTransformation) {\n            super.onDraw(canvas);\n            return;\n        }\n\n        if (mBitmap == null) {\n            return;\n        }\n\n        if (mCircleBackgroundColor != Color.TRANSPARENT) {\n            canvas.drawCircle(mDrawableRect.centerX(), mDrawableRect.centerY(), mDrawableRadius, mCircleBackgroundPaint);\n        }\n        canvas.drawCircle(mDrawableRect.centerX(), mDrawableRect.centerY(), mDrawableRadius, mBitmapPaint);\n        if (mBorderWidth > 0) {\n            canvas.drawCircle(mBorderRect.centerX(), mBorderRect.centerY(), mBorderRadius, mBorderPaint);\n        }\n    }\n\n    @Override\n    protected void onSizeChanged(int w, int h, int oldw, int oldh) {\n        super.onSizeChanged(w, h, oldw, oldh);\n        setup();\n    }\n\n    @Override\n    public void setPadding(int left, int top, int right, int bottom) {\n        super.setPadding(left, top, right, bottom);\n        setup();\n    }\n\n    @Override\n    public void setPaddingRelative(int start, int top, int end, int bottom) {\n        super.setPaddingRelative(start, top, end, bottom);\n        setup();\n    }\n\n    public int getBorderColor() {\n        return mBorderColor;\n    }\n\n    public void setBorderColor(@ColorInt int borderColor) {\n        if (borderColor == mBorderColor) {\n            return;\n        }\n\n        mBorderColor = borderColor;\n        mBorderPaint.setColor(mBorderColor);\n        invalidate();\n    }\n\n    /**\n     * @deprecated Use {@link #setBorderColor(int)} instead\n     */\n    @Deprecated\n    public void setBorderColorResource(@ColorRes int borderColorRes) {\n        setBorderColor(getContext().getResources().getColor(borderColorRes));\n    }\n\n    public int getCircleBackgroundColor() {\n        return mCircleBackgroundColor;\n    }\n\n    public void setCircleBackgroundColor(@ColorInt int circleBackgroundColor) {\n        if (circleBackgroundColor == mCircleBackgroundColor) {\n            return;\n        }\n\n        mCircleBackgroundColor = circleBackgroundColor;\n        mCircleBackgroundPaint.setColor(circleBackgroundColor);\n        invalidate();\n    }\n\n    public void setCircleBackgroundColorResource(@ColorRes int circleBackgroundRes) {\n        setCircleBackgroundColor(getContext().getResources().getColor(circleBackgroundRes));\n    }\n\n    /**\n     * Return the color drawn behind the circle-shaped drawable.\n     *\n     * @return The color drawn behind the drawable\n     *\n     * @deprecated Use {@link #getCircleBackgroundColor()} instead.\n     */\n    @Deprecated\n    public int getFillColor() {\n        return getCircleBackgroundColor();\n    }\n\n    /**\n     * Set a color to be drawn behind the circle-shaped drawable. Note that\n     * this has no effect if the drawable is opaque or no drawable is set.\n     *\n     * @param fillColor The color to be drawn behind the drawable\n     *\n     * @deprecated Use {@link #setCircleBackgroundColor(int)} instead.\n     */\n    @Deprecated\n    public void setFillColor(@ColorInt int fillColor) {\n        setCircleBackgroundColor(fillColor);\n    }\n\n    /**\n     * Set a color to be drawn behind the circle-shaped drawable. Note that\n     * this has no effect if the drawable is opaque or no drawable is set.\n     *\n     * @param fillColorRes The color resource to be resolved to a color and\n     *                     drawn behind the drawable\n     *\n     * @deprecated Use {@link #setCircleBackgroundColorResource(int)} instead.\n     */\n    @Deprecated\n    public void setFillColorResource(@ColorRes int fillColorRes) {\n        setCircleBackgroundColorResource(fillColorRes);\n    }\n\n    public int getBorderWidth() {\n        return mBorderWidth;\n    }\n\n    public void setBorderWidth(int borderWidth) {\n        if (borderWidth == mBorderWidth) {\n            return;\n        }\n\n        mBorderWidth = borderWidth;\n        setup();\n    }\n\n    public boolean isBorderOverlay() {\n        return mBorderOverlay;\n    }\n\n    public void setBorderOverlay(boolean borderOverlay) {\n        if (borderOverlay == mBorderOverlay) {\n            return;\n        }\n\n        mBorderOverlay = borderOverlay;\n        setup();\n    }\n\n    public boolean isDisableCircularTransformation() {\n        return mDisableCircularTransformation;\n    }\n\n    public void setDisableCircularTransformation(boolean disableCircularTransformation) {\n        if (mDisableCircularTransformation == disableCircularTransformation) {\n            return;\n        }\n\n        mDisableCircularTransformation = disableCircularTransformation;\n        initializeBitmap();\n    }\n\n    @Override\n    public void setImageBitmap(Bitmap bm) {\n        super.setImageBitmap(bm);\n        initializeBitmap();\n    }\n\n    @Override\n    public void setImageDrawable(Drawable drawable) {\n        super.setImageDrawable(drawable);\n        initializeBitmap();\n    }\n\n    @Override\n    public void setImageResource(@DrawableRes int resId) {\n        super.setImageResource(resId);\n        initializeBitmap();\n    }\n\n    @Override\n    public void setImageURI(Uri uri) {\n        super.setImageURI(uri);\n        initializeBitmap();\n    }\n\n    @Override\n    public void setColorFilter(ColorFilter cf) {\n        if (cf == mColorFilter) {\n            return;\n        }\n\n        mColorFilter = cf;\n        applyColorFilter();\n        invalidate();\n    }\n\n    @Override\n    public ColorFilter getColorFilter() {\n        return mColorFilter;\n    }\n\n    private void applyColorFilter() {\n        if (mBitmapPaint != null) {\n            mBitmapPaint.setColorFilter(mColorFilter);\n        }\n    }\n\n    private Bitmap getBitmapFromDrawable(Drawable drawable) {\n        if (drawable == null) {\n            return null;\n        }\n\n        if (drawable instanceof BitmapDrawable) {\n            return ((BitmapDrawable) drawable).getBitmap();\n        }\n\n        try {\n            Bitmap bitmap;\n\n            if (drawable instanceof ColorDrawable) {\n                bitmap = Bitmap.createBitmap(COLORDRAWABLE_DIMENSION, COLORDRAWABLE_DIMENSION, BITMAP_CONFIG);\n            } else {\n                bitmap = Bitmap.createBitmap(drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight(), BITMAP_CONFIG);\n            }\n\n            Canvas canvas = new Canvas(bitmap);\n            drawable.setBounds(0, 0, canvas.getWidth(), canvas.getHeight());\n            drawable.draw(canvas);\n            return bitmap;\n        } catch (Exception e) {\n            e.printStackTrace();\n            return null;\n        }\n    }\n\n    private void initializeBitmap() {\n        if (mDisableCircularTransformation) {\n            mBitmap = null;\n        } else {\n            mBitmap = getBitmapFromDrawable(getDrawable());\n        }\n        setup();\n    }\n\n    private void setup() {\n        if (!mReady) {\n            mSetupPending = true;\n            return;\n        }\n\n        if (getWidth() == 0 && getHeight() == 0) {\n            return;\n        }\n\n        if (mBitmap == null) {\n            invalidate();\n            return;\n        }\n\n        mBitmapShader = new BitmapShader(mBitmap, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP);\n\n        mBitmapPaint.setAntiAlias(true);\n        mBitmapPaint.setShader(mBitmapShader);\n\n        mBorderPaint.setStyle(Paint.Style.STROKE);\n        mBorderPaint.setAntiAlias(true);\n        mBorderPaint.setColor(mBorderColor);\n        mBorderPaint.setStrokeWidth(mBorderWidth);\n\n        mCircleBackgroundPaint.setStyle(Paint.Style.FILL);\n        mCircleBackgroundPaint.setAntiAlias(true);\n        mCircleBackgroundPaint.setColor(mCircleBackgroundColor);\n\n        mBitmapHeight = mBitmap.getHeight();\n        mBitmapWidth = mBitmap.getWidth();\n\n        mBorderRect.set(calculateBounds());\n        mBorderRadius = Math.min((mBorderRect.height() - mBorderWidth) / 2.0f, (mBorderRect.width() - mBorderWidth) / 2.0f);\n\n        mDrawableRect.set(mBorderRect);\n        if (!mBorderOverlay && mBorderWidth > 0) {\n            mDrawableRect.inset(mBorderWidth - 1.0f, mBorderWidth - 1.0f);\n        }\n        mDrawableRadius = Math.min(mDrawableRect.height() / 2.0f, mDrawableRect.width() / 2.0f);\n\n        applyColorFilter();\n        updateShaderMatrix();\n        invalidate();\n    }\n\n    private RectF calculateBounds() {\n        int availableWidth  = getWidth() - getPaddingLeft() - getPaddingRight();\n        int availableHeight = getHeight() - getPaddingTop() - getPaddingBottom();\n\n        int sideLength = Math.min(availableWidth, availableHeight);\n\n        float left = getPaddingLeft() + (availableWidth - sideLength) / 2f;\n        float top = getPaddingTop() + (availableHeight - sideLength) / 2f;\n\n        return new RectF(left, top, left + sideLength, top + sideLength);\n    }\n\n    private void updateShaderMatrix() {\n        float scale;\n        float dx = 0;\n        float dy = 0;\n\n        mShaderMatrix.set(null);\n\n        if (mBitmapWidth * mDrawableRect.height() > mDrawableRect.width() * mBitmapHeight) {\n            scale = mDrawableRect.height() / (float) mBitmapHeight;\n            dx = (mDrawableRect.width() - mBitmapWidth * scale) * 0.5f;\n        } else {\n            scale = mDrawableRect.width() / (float) mBitmapWidth;\n            dy = (mDrawableRect.height() - mBitmapHeight * scale) * 0.5f;\n        }\n\n        mShaderMatrix.setScale(scale, scale);\n        mShaderMatrix.postTranslate((int) (dx + 0.5f) + mDrawableRect.left, (int) (dy + 0.5f) + mDrawableRect.top);\n\n        mBitmapShader.setLocalMatrix(mShaderMatrix);\n    }\n\n    @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)\n    private class OutlineProvider extends ViewOutlineProvider {\n\n        @Override\n        public void getOutline(View view, Outline outline) {\n            Rect bounds = new Rect();\n            mBorderRect.roundOut(bounds);\n            outline.setRoundRect(bounds, bounds.width() / 2.0f);\n        }\n\n    }\n\n}\n"
  },
  {
    "path": "app/src/main/java/com/example/discover/view/CustomView/DragFrameLayout.java",
    "content": "package com.example.discover.view.CustomView;\n\nimport android.app.Activity;\nimport android.content.Context;\nimport android.graphics.Canvas;\nimport android.graphics.Color;\nimport android.support.v4.widget.ViewDragHelper;\nimport android.util.AttributeSet;\nimport android.util.Log;\nimport android.view.MotionEvent;\nimport android.view.View;\nimport android.widget.FrameLayout;\n\n/**\n * Created by monkeyWiiu on 2018/2/3.\n */\n\npublic class DragFrameLayout extends FrameLayout {\n    public static final String TAG = \"DragFramlayout\";\n\n    private ViewDragHelper mDragHelper;\n\n    //#00000000\n    public int DEF_BG_COLOR = 0xff000000;\n\n    /**拖动是否进行缩放变化*/\n    private boolean mDragScale=true;\n\n    /**\n     * 拖拽时是否进行缩放操作，默认TRUE\n     * @param dragScale     TRUE：是 FALSE：否\n     */\n    public void setDragScale(boolean dragScale) {\n        mDragScale = dragScale;\n    }\n\n    public DragFrameLayout(Context context, AttributeSet attrs) {\n        super(context, attrs);\n        init();\n    }\n\n    private void init() {\n        if (getContext() instanceof Activity) {\n            ((Activity) getContext()).getWindow().getDecorView().setBackgroundColor(DEF_BG_COLOR);\n        }\n        mDragHelper= ViewDragHelper.create(this,1.0f,new ViewDragHelper.Callback(){\n            @Override\n            public boolean tryCaptureView(View child, int pointerId) {\n                //允许子视图进行拖拽,这里默认都允许\n                return true;\n            }\n            /**是否允许所有方向拖拽*/\n            boolean needDrag;\n            @Override\n            public int clampViewPositionVertical(View child, int top, int dy) {\n                if (needDrag) {\n                    return top;\n                }\n                if (top < 0) {//只允许向下拖拽\n                    top = 0;\n                } else if (top > 100) {//向下拖拽超过100px后，释放允许任何方向拖拽\n                    needDrag = true;\n                }\n                return top;\n            }\n\n            @Override\n            public int clampViewPositionHorizontal(View child, int left, int dx) {\n                return needDrag ? left : 0;\n            }\n\n            /**\n             *\n             * @param changedView   被拖动的View\n             * @param left          水平拖动距离\n             * @param top           垂直拖动距离\n             * @param dx            每次拖拽产生的水平距离x2-x1\n             * @param dy            每次拖拽产生的垂直距离y2-y1\n             */\n            @Override\n            public void onViewPositionChanged(View changedView, int left, int top, int dx, int dy) {\n                super.onViewPositionChanged(changedView, left, top, dx, dy);\n                float present = 1 - (top * 1.0f) / (getHeight());\n\n                if (getContext() instanceof Activity) {\n                    int alpah = Math.min((int) (255 * present), 255);\n                    ((Activity) getContext()).getWindow().getDecorView().setBackgroundColor(Color.argb(alpah, 0, 0, 0));\n                }\n\n                float maxScale = Math.min(present, 1.0f);//Max,1.0f\n                float minScale = Math.max(0.5f, maxScale);//Min,5.0f;\n\n                changedView.setScaleX(minScale);\n                changedView.setScaleY(minScale);\n            }\n            boolean mNeedRelease;\n            @Override\n            public void onViewReleased(View releasedChild, float xvel, float yvel) {\n                super.onViewReleased(releasedChild, xvel, yvel);\n\n                if (mNeedRelease) {\n                    if (getContext() instanceof Activity) {\n                        ((Activity) getContext()).onBackPressed();\n                    }\n                } else {\n                    needDrag = false;\n                    //让视图归位\n                    mDragHelper.settleCapturedViewAt(finalLeft, finalTop);\n                    releasedChild.setScaleX(1.0f);\n                    releasedChild.setScaleY(1.0f);\n                    invalidate();\n                }\n            }\n        });\n\n        mDragHelper = ViewDragHelper.create(this, 1.0f, new ViewDragHelper.Callback() {\n            @Override\n            public boolean tryCaptureView(View child, int pointerId) {\n                return true;\n            }\n\n            @Override\n            public void onViewReleased(View releasedChild, float xvel, float yvel) {\n                super.onViewReleased(releasedChild, xvel, yvel);\n\n                if (mNeedRelease) {\n                    if (getContext() instanceof Activity) {\n                        ((Activity) getContext()).onBackPressed();\n                    }\n                } else {\n                    needDrag = false;\n                    //让视图归位,\n                    mDragHelper.settleCapturedViewAt(finalLeft, finalTop);\n                    if(mDragScale){\n                        releasedChild.setScaleX(1.0f);\n                        releasedChild.setScaleY(1.0f);\n                    }\n                    invalidate();\n                }\n            }\n\n            boolean mNeedRelease;\n\n            @Override\n            public void onViewPositionChanged(View changedView, int left, int top, int dx, int dy) {\n                super.onViewPositionChanged(changedView, left, top, dx, dy);\n\n                mNeedRelease = top > getHeight() * 0.25;//Release\n\n                //ChangeBg\n                float present = 1 - (top * 1.0f) / (getHeight());\n                if (getContext() instanceof Activity) {\n                    int alpah = Math.min((int) (255 * present), 255);\n                    ((Activity) getContext()).getWindow().getDecorView().setBackgroundColor(Color.argb(alpah, 0, 0, 0));\n                }\n                //ChangeScale\n                if(mDragScale){\n                    float maxScale = Math.min(present, 1.0f);//Max,1.0f\n                    float minScale = Math.max(0.5f, maxScale);//Min,5.0f;\n\n//                if(present>1.0f){\n//                    present=1.0f;\n//                }else if(present<0.5f){\n//                    present=0.5f;\n//                }\n                    changedView.setScaleX(minScale);\n                    changedView.setScaleY(minScale);\n                }\n\n\n                Log.i(TAG, \"Top=\" + top + \"Release=\" + getHeight() * 0.25 + \"Present=\" + present);\n            }\n\n            boolean needDrag;\n\n            @Override\n            public int clampViewPositionVertical(View child, int top, int dy) {\n                if (needDrag) {\n                    return top;\n                }\n                if (top < 0) {\n                    top = 0;\n                } else if (top > 100) {//释放允许任何方向拖拽\n                    needDrag = true;\n                }\n                return top;\n            }\n\n            @Override\n            public int clampViewPositionHorizontal(View child, int left, int dx) {\n                return needDrag ? left : 0;\n            }\n\n            @Override\n            public int getViewVerticalDragRange(View child) {\n                return getHeight() / 2;\n            }\n        });\n    }\n\n    int finalLeft;\n    int finalTop;\n\n    @Override\n    protected void onLayout(boolean changed, int left, int top, int right, int bottom) {\n        super.onLayout(changed, left, top, right, bottom);\n\n        finalLeft = getChildAt(0).getLeft();\n        finalTop = getChildAt(0).getTop();\n    }\n\n    @Override\n    public void computeScroll() {\n        if (mDragHelper.continueSettling(true)) {\n            invalidate();\n        }\n    }\n\n    @Override\n    public boolean onInterceptTouchEvent(MotionEvent ev) {\n        return mDragHelper.shouldInterceptTouchEvent(ev);\n    }\n\n    @Override\n    public boolean onTouchEvent(MotionEvent event) {\n        mDragHelper.processTouchEvent(event);\n        return true;\n    }\n\n    @Override\n    protected void onDraw(Canvas canvas) {\n        super.onDraw(canvas);\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/example/discover/view/CustomView/FollowPopupWindow.java",
    "content": "package com.example.discover.view.CustomView;\n\nimport android.content.Context;\nimport android.support.v7.widget.CardView;\nimport android.support.v7.widget.GridLayoutManager;\nimport android.support.v7.widget.RecyclerView;\nimport android.view.LayoutInflater;\nimport android.view.View;\nimport android.view.ViewGroup;\nimport android.widget.PopupWindow;\nimport android.widget.Toast;\n\nimport com.example.discover.R;\nimport com.example.discover.adapter.LabelChooseAdapter;\nimport com.example.discover.app.Constant;\n\n/**\n * Created by monkeyWiiu on 2018/1/26.\n */\n\npublic class FollowPopupWindow extends PopupWindow {\n\n    private PopItemClickListener mListener;\n    public interface PopItemClickListener {\n        void ItemClick();\n    }\n\n    public void setPopItemClickListener(PopItemClickListener listener) {\n        this.mListener = listener;\n    }\n    public FollowPopupWindow(Context context) {\n        LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);\n        View contentView = inflater.inflate(R.layout.follow_popup, null);\n        // 设置SelectPicPopupWindow的View\n        this.setContentView(contentView);\n        // 设置SelectPicPopupWindow弹出窗体的宽\n        this.setWidth(ViewGroup.LayoutParams.WRAP_CONTENT);\n        // 设置SelectPicPopupWindow弹出窗体的高\n        this.setHeight(ViewGroup.LayoutParams.WRAP_CONTENT);\n        // 设置SelectPicPopupWindow弹出窗体可点击\n        this.setFocusable(true);\n        this.setOutsideTouchable(true);\n\n        //刷新状态\n        this.update();\n        // 设置SelectPicPopupWindow弹出窗体动画效果\n        this.setAnimationStyle(R.style.AnimationFadeRT);\n\n        CardView cardView = this.getContentView().findViewById(R.id.cv);\n        cardView.setOnClickListener(new View.OnClickListener() {\n            @Override\n            public void onClick(View v) {\n\n                mListener.ItemClick();\n                hide();\n            }\n        });\n\n\n    }\n\n    /**\n     * 显示popupWindow\n     *\n     * @param parent\n     */\n    public void showPopupWindow(View parent) {\n        if (!this.isShowing()) {\n            // 以下拉方式显示popupwindow\n            this.showAsDropDown(parent,   parent.getLayoutParams().width / 2, 0);\n        } else {\n            this.dismiss();\n        }\n    }\n\n    public void hide() {\n        this.dismiss();\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/example/discover/view/CustomView/HackyViewPager.java",
    "content": "package com.example.discover.view.CustomView;\n\nimport android.content.Context;\nimport android.support.v4.view.ViewPager;\nimport android.util.AttributeSet;\nimport android.view.MotionEvent;\n\n/**\n * Hacky fix for Issue #4 and\n * http://code.google.com/p/android/issues/detail?id=18990\n * <p/>\n * ScaleGestureDetector seems to mess up the touch events, which means that\n * ViewGroups which make use of onInterceptTouchEvent throw a lot of\n * IllegalArgumentException: pointerIndex out of range.\n * <p/>\n * There's not much I can do in my code for now, but we can mask the result by\n * just catching the problem and ignoring it.\n *\n * @author Chris Banes\n */\npublic class HackyViewPager extends ViewPager {\n\t\n    public HackyViewPager(Context context) {\n        super(context);\n    }\n\n    public HackyViewPager(Context context, AttributeSet attrs) {\n        super(context, attrs);\n    }\n\n    @Override\n    public boolean onInterceptTouchEvent(MotionEvent ev) {\n\t\ttry {\n\t\t\treturn super.onInterceptTouchEvent(ev);\n\t\t} catch (IllegalArgumentException e) {\n\t\t\treturn false;\n\t\t}\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/example/discover/view/CustomView/LabelView.java",
    "content": "package com.example.discover.view.CustomView;\n\nimport android.content.Context;\nimport android.content.res.TypedArray;\nimport android.graphics.Canvas;\nimport android.graphics.Color;\nimport android.graphics.Paint;\nimport android.graphics.Rect;\nimport android.graphics.RectF;\nimport android.util.AttributeSet;\nimport android.util.Log;\nimport android.util.TypedValue;\nimport android.view.View;\nimport android.widget.Button;\n\nimport com.example.discover.R;\nimport com.example.discover.utils.DebugUtil;\nimport com.example.discover.utils.DensityUtil;\n\n/**\n * Created by monkeyWiiu on 2017/12/28.\n */\n\npublic class LabelView extends View {\n    /**\n     * 文本\n     */\n    private String mLabelText;\n    /**\n     * 文本的颜色\n     */\n    private int mLabelTextColor;\n    /**\n     * 文本的大小\n     */\n    private int mLabelTextSize;\n    /**\n     * 背景颜色\n     */\n    private int mBackground;\n    /**\n     * 绘制时控制文本绘制的范围\n     */\n    private Rect mBound;\n    private Paint mPaint;\n    private RectF mRectF;\n\n    public LabelView(Context context, AttributeSet attrs) {\n        this(context, attrs, 0);\n    }\n\n    public LabelView(Context context) {\n        this(context, null);\n    }\n\n    /**\n     * 获得我自定义的样式属性\n     *\n     * @param context\n     * @param attrs\n     * @param defStyle\n     */\n    public LabelView(Context context, AttributeSet attrs, int defStyle) {\n        super(context, attrs, defStyle);\n        //默认为黑，否则不设置颜色就为透明不可见\n        mLabelTextColor = Color.BLACK;\n        mBackground = Color.WHITE;\n        /**\n         * 获得我们所定义的自定义样式属性\n         */\n        TypedArray a = context.getTheme().obtainStyledAttributes(attrs, R.styleable.LabelView, defStyle, 0);\n        int n = a.getIndexCount();\n        for (int i = 0; i < n; i++) {\n            int attr = a.getIndex(i);\n            switch (attr) {\n                case R.styleable.LabelView_labelText:\n                    mLabelText = a.getString(attr);\n                    break;\n                case R.styleable.LabelView_labelTextColor:\n                    mLabelTextColor = a.getColor(attr, Color.BLACK);\n                    break;\n                case R.styleable.LabelView_labelTextSize:\n                    //默认设置为16sp, TypeValue也可以把sp转化为px\n                    mLabelTextSize = a.getDimensionPixelSize(attr, (int) TypedValue.applyDimension(\n                            TypedValue.COMPLEX_UNIT_SP, 16, getResources().getDisplayMetrics()));\n                    break;\n                case R.styleable.LabelView_labelBackground:\n                    mBackground = a.getColor(attr, Color.YELLOW);\n                    break;\n            }\n\n        }\n        a.recycle();\n\n        /**\n         * 获得绘制文本的宽和高\n         */\n        mPaint = new Paint();\n        mPaint.setTextSize(mLabelTextSize);\n        // mPaint.setColor(mTitleTextColor);\n        mBound = new Rect();\n        //防止mLabelText空\n        if (mLabelText == null) {\n            mLabelText = \"\";\n        }\n        mPaint.getTextBounds(mLabelText, 0, mLabelText.length(), mBound);\n        mRectF = new RectF();\n\n    }\n\n    @Override\n    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {\n        int widthMode = MeasureSpec.getMode(widthMeasureSpec);\n        int widthSize = MeasureSpec.getSize(widthMeasureSpec);\n        int heightMode = MeasureSpec.getMode(heightMeasureSpec);\n        int heightSize = MeasureSpec.getSize(heightMeasureSpec);\n        int width;\n        int height;\n        if (widthMode == MeasureSpec.EXACTLY) {\n            width = widthSize;\n            DebugUtil.debug(\"tesfsdf\", width + \"\");\n        } else {\n            //动态设置时不起作用\n            mPaint.setTextSize(mLabelTextSize);\n            mPaint.getTextBounds(mLabelText, 0, mLabelText.length(), mBound);\n            float textWidth = mBound.width();\n            int desired = (int) (getPaddingLeft() + textWidth + getPaddingRight());\n            width = desired;\n        }\n\n        if (heightMode == MeasureSpec.EXACTLY) {\n            height = heightSize;\n        } else {\n            //动态设置时不起作用\n            mPaint.setTextSize(mLabelTextSize);\n            mPaint.getTextBounds(mLabelText, 0, mLabelText.length(), mBound);\n            float textHeight = mBound.height();\n            int desired = (int) (getPaddingTop() + textHeight + getPaddingBottom());\n            height = desired;\n        }\n\n        setMeasuredDimension(width, height);\n    }\n\n    @Override\n    protected void onDraw(Canvas canvas) {\n\n        mPaint.getTextBounds(mLabelText, 0, mLabelText.length(), mBound);\n        mPaint.setColor(mBackground);\n        mPaint.setAntiAlias(true);\n        canvas.drawRect(getMeasuredHeight() / 2, 0, getMeasuredWidth() - getMeasuredHeight() / 2, getMeasuredHeight(), mPaint);\n        //左半圆\n        mRectF.left = 0;\n        mRectF.top = 0;\n        mRectF.right = getMeasuredHeight();\n        mRectF.bottom = getMeasuredHeight();\n        canvas.drawArc(mRectF, -90, -180, false, mPaint);\n        //右半圆\n        mRectF.left = getMeasuredWidth() - getMeasuredHeight();\n        mRectF.top = 0;\n        mRectF.right = getMeasuredWidth();\n        mRectF.bottom = getMeasuredHeight();\n        canvas.drawArc(mRectF, -90, 180, false, mPaint);\n\n\n        mPaint.setColor(mLabelTextColor);\n        canvas.drawText(mLabelText, getWidth() / 2 - mBound.width() / 2, getHeight() / 2 + mBound.height() / 2, mPaint);\n    }\n\n    public void setText(String text) {\n\n        mLabelText = text;\n    }\n\n    public void setBackground(int color) {\n\n        mBackground = color;\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/example/discover/view/CustomView/ReplyPopupWindow.java",
    "content": "package com.example.discover.view.CustomView;\n\nimport android.content.Context;\nimport android.os.Handler;\nimport android.support.v7.widget.LinearLayoutManager;\nimport android.support.v7.widget.RecyclerView;\nimport android.view.Gravity;\nimport android.view.LayoutInflater;\nimport android.view.View;\nimport android.view.ViewGroup;\nimport android.widget.FrameLayout;\nimport android.widget.PopupWindow;\n\nimport com.example.discover.R;\nimport com.example.discover.adapter.PopReplyAdapter;\nimport com.example.discover.adapter.ReplyAdapter;\nimport com.example.discover.app.Constant;\nimport com.example.discover.bean.DetailBean.ItemList;\nimport com.example.discover.bean.DetailBean.Replies;\nimport com.example.discover.bean.DetailBean.ReplyList;\nimport com.example.discover.http.HttpClient;\nimport com.example.discover.http.RequestListener;\nimport com.example.discover.model.ReplyModel;\nimport com.example.discover.utils.DebugUtil;\nimport com.example.discover.utils.DensityUtil;\nimport com.jakewharton.rxbinding2.view.RxView;\nimport com.trello.rxlifecycle2.components.support.RxAppCompatActivity;\n\nimport org.reactivestreams.Subscriber;\nimport org.reactivestreams.Subscription;\n\nimport java.util.ArrayList;\nimport java.util.List;\nimport java.util.concurrent.TimeUnit;\n\nimport io.reactivex.Flowable;\nimport io.reactivex.android.schedulers.AndroidSchedulers;\nimport io.reactivex.functions.Consumer;\nimport io.reactivex.schedulers.Schedulers;\n\n/**\n * Created by monkeyWiiu on 2018/2/1.\n */\n\npublic class ReplyPopupWindow extends PopupWindow {\n\n    private int id;\n    private PopReplyAdapter replyAdapter;\n    private LinearLayoutManager linearLayoutManager;\n    private FrameLayout noComment;\n    private FrameLayout avLoading;\n    private FrameLayout reLoading;\n    private RecyclerView replyRecyclerView;\n    private List<ReplyList> replyLists = new ArrayList<>();\n    private boolean firstRequest = true;\n    private boolean loading = false;\n    private int lastSequence;\n    private Subscription mSubscription;\n\n    public ReplyPopupWindow(Context context, int id) {\n\n        this.id = id;\n        //this.id = 25923;\n        LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);\n        View contentView = inflater.inflate(R.layout.reply_popup_window, null);\n        // 设置SelectPicPopupWindow的View\n        this.setContentView(contentView);\n        // 设置SelectPicPopupWindow弹出窗体的宽\n        //this.setWidth(DensityUtil.dip2px(300));\n        this.setWidth(ViewGroup.LayoutParams.MATCH_PARENT);\n        // 设置SelectPicPopupWindow弹出窗体的高\n        this.setHeight(DensityUtil.dip2px((300)));\n        // 设置SelectPicPopupWindow弹出窗体可点击\n        //this.setFocusable(true);\n        this.setOutsideTouchable(true);\n        /*if (Build.VERSION.SDK_INT > 20) {\n            this.setElevation(10f);\n        }*/\n\n        //刷新状态\n        this.update();\n        // 实例化一个ColorDrawable颜色为半透明\n        //ColorDrawable dw = new ColorDrawable();\n        // 点back键和其他地方使其消失,设置了这个才能触发OnDismisslistener ，设置其他控件变化等操作\n        //this.setBackgroundDrawable(dw);\n        // 设置SelectPicPopupWindow弹出窗体动画效果\n        this.setAnimationStyle(R.style.AnimationFadeBT);\n\n        noComment = contentView.findViewById(R.id.no_comment);\n        avLoading = contentView.findViewById(R.id.loading);\n        reLoading = contentView.findViewById(R.id.reloading);\n\n        initRecyclerView(contentView, context);\n        showReplies();\n\n\n        RxView.clicks(reLoading)\n                .throttleFirst(1, TimeUnit.SECONDS)\n                .subscribe(new Consumer<Object>() {\n                    @Override\n                    public void accept(Object o) throws Exception {\n                        showReplies();\n                        DebugUtil.debug(\"eeee\", \"eee\");\n                    }\n                });\n    }\n\n    /**\n     * 显示popupWindow\n     *\n     * @param parent\n     */\n    public void showPopupWindow(View parent) {\n        if (!this.isShowing()) {\n            // 以下拉方式显示popupwindow\n            this.showAtLocation(parent, Gravity.BOTTOM | Gravity.CENTER_HORIZONTAL, 0, 0);\n        } else {\n            this.dismiss();\n        }\n    }\n\n    public void initRecyclerView(View view, Context context) {\n\n\n        replyRecyclerView = view.findViewById(R.id.rv_reply);\n        replyAdapter = new PopReplyAdapter(replyLists);\n        linearLayoutManager = new LinearLayoutManager(context, LinearLayoutManager.VERTICAL,false);\n        replyRecyclerView.setLayoutManager(linearLayoutManager);\n        replyRecyclerView.setAdapter(replyAdapter);\n        //上拉加载\n        replyRecyclerView.setOnScrollListener(new RecyclerView.OnScrollListener() {\n            @Override\n            public void onScrolled(RecyclerView recyclerView, int dx, int dy) {\n                super.onScrolled(recyclerView, dx, dy);\n                int lastVisibleItem = linearLayoutManager.findLastVisibleItemPosition();\n                int totalItemCount = linearLayoutManager.getItemCount();\n                if (lastVisibleItem == totalItemCount - 5 && !loading) {\n\n                    loading = true;\n                    new Handler().postDelayed(new Runnable() {\n                        @Override\n                        public void run() {\n\n                            showReplies();\n                        }\n                    }, 1000);\n\n                }\n            }\n        });\n    }\n    public void showReplies() {\n\n        Flowable<Replies> repliesFlowable;\n        if (firstRequest) {\n            repliesFlowable = HttpClient.Builder.getEyeService().fetchReplies(id);\n        }else {\n            repliesFlowable = HttpClient.Builder.getEyeService().fetchReplies(id, lastSequence);\n        }\n\n        repliesFlowable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread())\n                .subscribe(new Subscriber<Replies>() {\n                    @Override\n                    public void onSubscribe(Subscription s) {\n                        mSubscription = s;\n                        s.request(Long.MAX_VALUE);\n                    }\n\n                    @Override\n                    public void onNext(Replies replies) {\n                        avLoading.setVisibility(View.GONE);\n                        reLoading.setVisibility(View.GONE);\n                        DebugUtil.debug(\"eeee\", \"next\");\n                        if (replies.getReplyList().size() > 0) {\n                            replyLists.addAll(replies.getReplyList());\n                            replyAdapter.notifyDataSetChanged();\n                            lastSequence = replies.getReplyList().get(replies.getReplyList().size() - 1).getSequence();\n                            firstRequest = false;\n                            loading =false;\n                        } else {\n                            noComment.setVisibility(View.VISIBLE);\n                        }\n                    }\n\n                    @Override\n                    public void onError(Throwable t) {\n\n                        DebugUtil.debug(\"eeee\",  \"error\");\n                        avLoading.setVisibility(View.GONE);\n                        if (firstRequest) {\n                            reLoading.setVisibility(View.VISIBLE);\n                        }\n\n                    }\n\n                    @Override\n                    public void onComplete() {\n                        DebugUtil.debug(\"eeee\",  \"ecccr\");\n                        mSubscription.cancel();\n                    }\n                });\n\n\n    }\n    @Override\n    public void dismiss() {\n        //repliesFlowable.un\n        mSubscription.cancel();\n        super.dismiss();\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/example/discover/view/test.java",
    "content": "package com.example.discover.view;\n\n/**\n * Created by monkeyWiiu on 2017/12/28.\n */\n\npublic class test {\n}\n"
  },
  {
    "path": "app/src/main/res/anim/fade_in_bottom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--弹出-->\n<set xmlns:android=\"http://schemas.android.com/apk/res/android\">\n\n    <translate\n        android:duration=\"200\"\n        android:fromYDelta=\"100%p\"\n        android:toYDelta=\"0\" />\n    <alpha\n        android:duration=\"200\"\n        android:fromAlpha=\"0.0\"\n        android:toAlpha=\"1.0\" />\n</set>"
  },
  {
    "path": "app/src/main/res/anim/fade_in_lt.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!-- 左上角扩大-->\n<scale   xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:interpolator=\"@android:anim/accelerate_decelerate_interpolator\"\n    android:fromXScale=\"0.001\"\n    android:toXScale=\"1.0\"\n    android:fromYScale=\"0.001\"\n    android:toYScale=\"1.0\"\n    android:pivotX=\"0%\"\n    android:pivotY=\"0%\"\n    android:duration=\"200\" />"
  },
  {
    "path": "app/src/main/res/anim/fade_in_rt.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--右上角扩大-->\n<scale   xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:interpolator=\"@android:anim/accelerate_decelerate_interpolator\"\n    android:fromXScale=\"0\"\n    android:toXScale=\"1\"\n    android:fromYScale=\"0.001\"\n    android:toYScale=\"1.0\"\n    android:pivotX=\"100%\"\n    android:pivotY=\"0%\"\n    android:duration=\"200\" />"
  },
  {
    "path": "app/src/main/res/anim/fade_out_lb.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--右上角角缩小-->\n<scale   xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:interpolator=\"@android:anim/accelerate_decelerate_interpolator\"\n    android:fromXScale=\"1\"\n    android:toXScale=\"0\"\n    android:fromYScale=\"1.0\"\n    android:toYScale=\"0.001\"\n    android:pivotX=\"100%\"\n    android:pivotY=\"0%\"\n    android:duration=\"200\" />"
  },
  {
    "path": "app/src/main/res/anim/fade_out_rb.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!-- 左上角缩小 -->\n<scale   xmlns:android=\"http://schemas.android.com/apk/res/android\"\nandroid:interpolator=\"@android:anim/accelerate_decelerate_interpolator\"\nandroid:fromXScale=\"1.0\"\nandroid:toXScale=\"0.001\"\nandroid:fromYScale=\"1.0\"\nandroid:toYScale=\"0.001\"\nandroid:pivotX=\"0%\"\nandroid:pivotY=\"0%\"\nandroid:duration=\"200\" />"
  },
  {
    "path": "app/src/main/res/anim/fade_out_top.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--退出-->\n<set xmlns:android=\"http://schemas.android.com/apk/res/android\">\n<translate\n    android:duration=\"200\"\n    android:fromYDelta=\"0\"\n    android:toYDelta=\"50%p\" />\n<alpha\n    android:duration=\"200\"\n    android:fromAlpha=\"1.0\"\n    android:toAlpha=\"0.0\" />\n</set>"
  },
  {
    "path": "app/src/main/res/drawable/bg_save_big_image.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<shape xmlns:android=\"http://schemas.android.com/apk/res/android\">\n\n    <solid android:color=\"#4c000000\" />\n\n    <corners android:radius=\"3dp\" />\n\n    <stroke\n        android:width=\"1dp\"\n        android:color=\"#4cffffff\" />\n\n    <padding\n        android:bottom=\"7dp\"\n        android:left=\"20dp\"\n        android:right=\"20dp\"\n        android:top=\"7dp\" />\n</shape>"
  },
  {
    "path": "app/src/main/res/drawable/corner_view.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<shape xmlns:android=\"http://schemas.android.com/apk/res/android\">\n\n        <solid android:color=\"#ffffffff\" />\n        <corners android:radius=\"3dp\" />\n        <padding android:left=\"5dp\" android:top=\"5dp\"\n            android:right=\"5dp\" android:bottom=\"5dp\" />\n</shape>"
  },
  {
    "path": "app/src/main/res/drawable/ic_arrow_back_white_24px.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        android:width=\"24dp\"\n        android:height=\"24dp\"\n        android:viewportWidth=\"24.0\"\n        android:viewportHeight=\"24.0\">\n    <path\n        android:pathData=\"M20,11H7.83l5.59,-5.59L12,4l-8,8 8,8 1.41,-1.41L7.83,13H20v-2z\"\n        />\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_clear_black_24px.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        android:width=\"24dp\"\n        android:height=\"24dp\"\n        android:viewportWidth=\"24.0\"\n        android:viewportHeight=\"24.0\">\n    <path\n        android:pathData=\"M19,6.41L17.59,5 12,10.59 6.41,5 5,6.41 10.59,12 5,17.59 6.41,19 12,13.41 17.59,19 19,17.59 13.41,12z\"/>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_heart_full_24dp_pink.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<!--\n  Copyright 2015 Google Inc.\n\n  Licensed under the Apache License, Version 2.0 (the \"License\");\n  you may not use this file except in compliance with the License.\n  You may obtain a copy of the License at\n\n       http://www.apache.org/licenses/LICENSE-2.0\n\n  Unless required by applicable law or agreed to in writing, software\n  distributed under the License is distributed on an \"AS IS\" BASIS,\n  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  See the License for the specific language governing permissions and\n  limitations under the License.\n  -->\n\n<vector\n    xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\">\n\n    <path\n        android:pathData=\"M12,21 L10.695,19.853406 C6.06,15.7771117 3,13.0871935 3,9.79564033 C3,7.10572207 5.1735,5 7.95,5 C9.516,5 11.019,5.70626703 12,6.81798365 C12.981,5.70626703 14.484,5 16.05,5 C18.8265,5 21,7.10572207 21,9.79564033 C21,13.0871935 17.94,15.7771117 13.305,19.853406 L12,21 L12,21 Z\"\n\n        />\n\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_heart_hollow_24dp.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n\n<vector\n    xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\">\n\n    <path\n        android:pathData=\"M12,21 L10.695,19.853406 C6.06,15.7771117 3,13.0871935 3,9.79564033 C3,7.10572207 5.1735,5 7.95,5 C9.516,5 11.019,5.70626703 12,6.81798365 C12.981,5.70626703 14.484,5 16.05,5 C18.8265,5 21,7.10572207 21,9.79564033 C21,13.0871935 17.94,15.7771117 13.305,19.853406 L12,21 L12,21 Z\"\n\n        />\n\n</vector>"
  },
  {
    "path": "app/src/main/res/drawable/item_figure.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<selector xmlns:android=\"http://schemas.android.com/apk/res/android\">\n\n    <item android:drawable=\"@drawable/figure_press\" android:state_pressed=\"true\"/>\n    <item android:drawable=\"@drawable/figure_press\" android:state_selected=\"true\"/>\n    <item android:drawable=\"@drawable/figure_normal\" android:state_selected=\"false\" />\n    <item android:drawable=\"@drawable/figure_normal\" android:state_pressed=\"false\"/>\n\n</selector>"
  },
  {
    "path": "app/src/main/res/drawable/item_home.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<selector xmlns:android=\"http://schemas.android.com/apk/res/android\">\n\n    <item android:drawable=\"@drawable/home_press\" android:state_pressed=\"true\"/>\n    <item android:drawable=\"@drawable/home_press\" android:state_selected=\"true\"/>\n    <item android:drawable=\"@drawable/home_normal\" android:state_pressed=\"false\"/>\n    <item android:drawable=\"@drawable/home_normal\" android:state_selected=\"false\"/>\n\n</selector>"
  },
  {
    "path": "app/src/main/res/drawable/item_search.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<selector xmlns:android=\"http://schemas.android.com/apk/res/android\">\n\n    <item android:drawable=\"@drawable/search_press\" android:state_pressed=\"true\"/>\n    <item android:drawable=\"@drawable/search_press\" android:state_selected=\"true\"/>\n    <item android:drawable=\"@drawable/search_normal\" android:state_pressed=\"false\"/>\n    <item android:drawable=\"@drawable/search_normal\" android:state_selected=\"false\"/>\n\n</selector>"
  },
  {
    "path": "app/src/main/res/drawable/item_smile.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<selector xmlns:android=\"http://schemas.android.com/apk/res/android\">\n\n    <item android:drawable=\"@drawable/smile_press\" android:state_pressed=\"true\"/>\n    <item android:drawable=\"@drawable/smile_press\" android:state_selected=\"true\"/>\n    <item android:drawable=\"@drawable/smile_normal\" android:state_pressed=\"false\"/>\n    <item android:drawable=\"@drawable/smile_normal\" android:state_selected=\"false\"/>\n\n</selector>"
  },
  {
    "path": "app/src/main/res/layout/activity_author_home.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<layout\n    xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\">\n\n    <FrameLayout\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\">\n\n\n\n        <android.support.design.widget.CoordinatorLayout\n            xmlns:tools=\"http://schemas.android.com/tools\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"match_parent\"\n           >\n            <android.support.design.widget.AppBarLayout\n                android:id=\"@+id/appBarLayout\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\">\n                <android.support.design.widget.CollapsingToolbarLayout\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"300dp\"\n                    app:layout_scrollFlags=\"scroll|exitUntilCollapsed\"\n                    >\n                    <ImageView\n                        android:id=\"@+id/iv_background\"\n                        android:layout_width=\"match_parent\"\n                        android:layout_height=\"200dp\"\n                        android:scaleType=\"fitXY\"\n                        android:src=\"@drawable/cross_image\"\n                        app:layout_collapseMode=\"parallax\"\n                        app:layout_collapseParallaxMultiplier=\"0.5\"/>\n                    <RelativeLayout\n                        android:layout_width=\"match_parent\"\n                        android:layout_height=\"match_parent\">\n\n                        <LinearLayout\n                            android:id=\"@+id/ll_text\"\n                            android:orientation=\"vertical\"\n                            android:layout_marginTop=\"200dp\"\n                            android:layout_width=\"match_parent\"\n                            android:layout_height=\"match_parent\"\n                            android:gravity=\"center\"\n                            android:background=\"@color/lightWhite\">\n                            <TextView\n                                android:id=\"@+id/tv_name\"\n                                android:layout_width=\"wrap_content\"\n                                android:layout_height=\"wrap_content\"\n                                android:layout_marginTop=\"25dp\"\n                                android:ellipsize=\"end\"\n                                android:singleLine=\"true\"\n                                android:gravity=\"center\"\n                                android:textSize=\"24sp\"\n                                android:textStyle=\"bold\"\n                                android:text=\"liuliuliu\"/>\n\n                            <TextView\n                                android:id=\"@+id/tv_desc\"\n                                android:layout_width=\"wrap_content\"\n                                android:layout_height=\"wrap_content\"\n                                android:ellipsize=\"end\"\n                                android:maxLines=\"2\"\n                                android:gravity=\"center\"\n                                android:textSize=\"16sp\"\n                                android:text=\"alksdfjkldfjkf\"/>\n\n                        </LinearLayout>\n\n                        <com.example.discover.view.CustomView.CircleImageView\n                            android:id=\"@+id/iv_head\"\n                            android:layout_width=\"85dp\"\n                            android:layout_height=\"85dp\"\n                            android:layout_marginTop=\"140dp\"\n                            android:layout_centerHorizontal=\"true\"\n                            android:src=\"@mipmap/head_personal\"\n                            app:civ_border_width=\"3dp\"\n                            app:civ_border_color=\"@color/colorLabelAnim\"/>\n                    </RelativeLayout>\n\n                </android.support.design.widget.CollapsingToolbarLayout>\n\n                <View\n                    android:id=\"@+id/sup_view\"\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"8dp\"\n                    android:visibility=\"visible\"/>\n                <android.support.design.widget.TabLayout\n                    android:id=\"@+id/tab_item\"\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"46dp\"\n                    app:tabIndicatorHeight=\"2dp\"\n                    app:tabIndicatorColor=\"@color/colorLabelAd\"\n                    app:layout_scrollFlags=\"scroll|enterAlways\"\n                    app:tabSelectedTextColor=\"@color/colorLabelAd\"\n                    app:tabTextAppearance=\"@style/MyTabLayoutTextAppearance\"\n                    />\n            </android.support.design.widget.AppBarLayout>\n            <android.support.v4.view.ViewPager\n                android:id=\"@+id/vp_content\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"match_parent\"\n                app:layout_behavior=\"@string/appbar_scrolling_view_behavior\"/>\n        </android.support.design.widget.CoordinatorLayout>\n\n        <android.support.v7.widget.Toolbar\n            android:id=\"@+id/toolbar\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"52dp\"\n            app:contentInsetStart=\"0dp\"\n            app:layout_collapseMode=\"pin\"\n            android:elevation=\"10dp\">\n\n            <FrameLayout\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"match_parent\">\n\n                <ImageView\n                    android:id=\"@+id/iv_toolbar\"\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"match_parent\" />\n\n                <com.github.mmin18.widget.RealtimeBlurView\n                    android:id=\"@+id/blurView\"\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"match_parent\"\n                    app:realtimeBlurRadius=\"20dp\"\n                    app:realtimeOverlayColor=\"#8000\" />\n\n                <LinearLayout\n                    android:orientation=\"horizontal\"\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"match_parent\">\n\n                    <ImageView\n                        android:id=\"@+id/iv_back\"\n                        android:layout_width=\"wrap_content\"\n                        android:layout_height=\"match_parent\"\n                        android:layout_gravity=\"center\"\n                        android:padding=\"15dp\"\n                        android:scaleType=\"centerInside\"\n                        android:background=\"?attr/selectableItemBackgroundBorderless\"\n                        android:focusable=\"true\"\n                        android:clickable=\"true\"\n                        android:src=\"@drawable/back\"/>\n\n                    <TextView\n                        android:id=\"@+id/toolbar_id\"\n                        android:layout_width=\"wrap_content\"\n                        android:layout_height=\"wrap_content\"\n                        android:gravity=\"center_vertical\"\n                        android:layout_gravity=\"center\"\n                        android:textSize=\"16sp\"\n                        android:textColor=\"#ffffff\"\n                        android:text=\"六哥\"/>\n\n                    <TextView\n                        android:id=\"@+id/attention\"\n                        android:layout_width=\"0dp\"\n                        android:layout_height=\"wrap_content\"\n                        android:layout_weight=\"1\"\n                        android:gravity=\"end\"\n                        android:layout_marginEnd=\"10dp\"\n                        android:layout_gravity=\"center\"\n                        android:text=\"关注\"\n                        android:textColor=\"#ffffff\"\n                        android:textStyle=\"bold\"\n                        android:textSize=\"20sp\"\n                        />\n\n                </LinearLayout>\n            </FrameLayout>\n\n        </android.support.v7.widget.Toolbar>\n    </FrameLayout>\n\n</layout>\n\n"
  },
  {
    "path": "app/src/main/res/layout/activity_main.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<layout\n    xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\">\n\n    <android.support.design.widget.CoordinatorLayout\n        android:layout_height=\"match_parent\"\n        android:layout_width=\"match_parent\">\n\n        <FrameLayout\n\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"match_parent\">\n\n            <LinearLayout\n                android:orientation=\"vertical\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"match_parent\">\n\n                <android.support.design.widget.CoordinatorLayout\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"0dp\"\n                    android:layout_weight=\"1\">\n\n                    <android.support.v4.view.ViewPager\n                        android:id=\"@+id/main_viewpager\"\n                        android:layout_width=\"match_parent\"\n                        android:layout_height=\"match_parent\"\n                        />\n                </android.support.design.widget.CoordinatorLayout>\n\n                <include\n                    android:id=\"@+id/bottom_bar\"\n                    layout=\"@layout/bottom_bar\"\n                    />\n            </LinearLayout>\n\n            <com.example.zmenu.SnakeButtonLayout\n                android:id=\"@+id/snake_button\"\n                xmlns:tools=\"http://schemas.android.com/tools\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"match_parent\"\n                tools:context=\"com.example.discover.MainActivity\">\n            </com.example.zmenu.SnakeButtonLayout>\n        </FrameLayout>\n    </android.support.design.widget.CoordinatorLayout>\n\n\n</layout>\n\n"
  },
  {
    "path": "app/src/main/res/layout/activity_result.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    android:orientation=\"vertical\">\n\n    <android.support.v7.widget.Toolbar\n        android:id=\"@+id/toolbar\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:background=\"?attr/colorPrimary\"\n        android:minHeight=\"?attr/actionBarSize\"\n        style=\"@style/LightToolbar\" >\n\n        <TextView\n            android:id=\"@+id/title\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"match_parent\"\n            android:layout_marginEnd=\"48dp\"\n            android:background=\"@null\"\n            android:gravity=\"center_vertical\"\n            android:textSize=\"22sp\"\n            android:textColor=\"@color/pureDark\"\n            android:maxLines=\"1\"\n            />\n\n        <ImageButton\n            android:id=\"@+id/search_btn\"\n            android:layout_width=\"24dp\"\n            android:layout_height=\"24dp\"\n            android:layout_marginEnd=\"16dp\"\n            android:background=\"?selectableItemBackgroundBorderless\"\n            android:layout_gravity=\"end|center_vertical\"\n            android:scaleType=\"centerInside\"\n            android:src=\"@drawable/search_normal\"/>\n\n\n\n    </android.support.v7.widget.Toolbar>\n\n\n    <android.support.v7.widget.RecyclerView\n        android:id=\"@+id/rv_result\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"/>\n\n\n</LinearLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/activity_search.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    android:orientation=\"vertical\">\n\n    <android.support.v7.widget.Toolbar\n        android:id=\"@+id/toolbar\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:background=\"?attr/colorPrimary\"\n        android:minHeight=\"?attr/actionBarSize\"\n        style=\"@style/LightToolbar\" >\n\n        <FrameLayout\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"match_parent\">\n\n            <EditText\n                android:id=\"@+id/search_edit\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"match_parent\"\n                android:hint=\"搜索你感兴趣的视频\"\n                android:layout_marginEnd=\"48dp\"\n                android:background=\"@null\"\n                android:gravity=\"center_vertical\"\n                android:imeOptions=\"actionSearch\"\n                android:inputType=\"text\"\n                android:maxLines=\"1\"\n                android:textColorHint=\"@android:color/black\"/>\n\n            <ImageButton\n                android:id=\"@+id/clear_btn\"\n                android:layout_width=\"24dp\"\n                android:layout_height=\"24dp\"\n                android:layout_marginEnd=\"16dp\"\n                android:scaleType=\"centerInside\"\n                android:background=\"?selectableItemBackgroundBorderless\"\n                android:layout_gravity=\"end|center_vertical\"\n                android:src=\"@drawable/ic_clear_black_24px\"/>\n        </FrameLayout>\n\n    </android.support.v7.widget.Toolbar>\n\n\n    <android.support.v7.widget.RecyclerView\n        android:id=\"@+id/rv_hot_tag\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"/>\n\n\n</LinearLayout>"
  },
  {
    "path": "app/src/main/res/layout/activity_test.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<android.support.constraint.ConstraintLayout\n    xmlns:android=\"http://schemas.android.com/apk/res/android\" android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\">\n\n    <fragment\n        android:id=\"@+id/fragment_test\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        android:name=\"com.example.discover.ui.Personal.PersonalFragment\"/>\n</android.support.constraint.ConstraintLayout>"
  },
  {
    "path": "app/src/main/res/layout/activity_video_detail.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<FrameLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:orientation=\"vertical\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    tools:context=\"com.example.discover.VideoDetailActivity\">\n\n    <View\n        android:id=\"@+id/background\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        android:background=\"@color/lightWhite\"\n        android:transitionName=\"@string/transition_shot_background\"/>\n\n    <android.support.v7.widget.RecyclerView\n        android:id=\"@+id/rv_replies\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\" />\n\n    <cn.jzvd.JZVideoPlayerStandard\n        android:id=\"@+id/jz_player\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"200dp\"\n        android:transitionName=\"@string/transition_shot\"/>\n</FrameLayout>\n\n\n\n\n"
  },
  {
    "path": "app/src/main/res/layout/activity_view_big_image.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<com.example.discover.view.CustomView.DragFrameLayout\n    xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:id=\"@+id/drag\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    android:orientation=\"vertical\">\n\n    <RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\">\n\n        <View\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"match_parent\"\n            android:background=\"#000000\"\n            android:transitionName=\"@string/transition_shot_background\"\n            />\n        <com.example.discover.view.CustomView.HackyViewPager\n            android:id=\"@+id/very_image_viewpager\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"match_parent\"\n            android:transitionName=\"@string/transition_shot\"/>\n\n        <TextView\n            android:id=\"@+id/very_image_viewpager_text\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_alignParentBottom=\"true\"\n            android:layout_centerHorizontal=\"true\"\n            android:layout_marginBottom=\"25dp\"\n            android:textColor=\"#fff\"\n            android:textSize=\"14sp\" />\n\n        <TextView\n            android:id=\"@+id/tv_save_big_image\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_alignParentBottom=\"true\"\n            android:layout_alignParentRight=\"true\"\n            android:layout_marginBottom=\"17dp\"\n            android:layout_marginRight=\"13dp\"\n            android:background=\"@drawable/bg_save_big_image\"\n            android:text=\"保存\"\n            android:textColor=\"#fff\"\n            android:textSize=\"13sp\" />\n\n    </RelativeLayout>\n</com.example.discover.view.CustomView.DragFrameLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/author_card.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<layout xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <data>\n        <variable\n            name=\"itemList\"\n            type=\"com.example.discover.bean.DetailBean.ItemList\"/>\n    </data>\n    <android.support.constraint.ConstraintLayout\n\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_margin=\"10dp\">\n\n        <android.support.v7.widget.CardView\n            android:id=\"@+id/cv_author\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            app:cardBackgroundColor=\"#56ecd0\"\n            app:cardCornerRadius=\"10dp\"\n            app:layout_constraintBottom_toBottomOf=\"parent\"\n            app:layout_constraintEnd_toEndOf=\"parent\"\n            app:layout_constraintStart_toStartOf=\"parent\"\n            app:layout_constraintTop_toTopOf=\"parent\">\n\n            <FrameLayout\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\">\n\n                <LinearLayout\n                    android:id=\"@+id/linearLayout\"\n                    android:layout_width=\"wrap_content\"\n                    android:layout_height=\"wrap_content\"\n                    android:orientation=\"vertical\">\n\n                    <ImageView\n                        android:layout_width=\"match_parent\"\n                        android:layout_height=\"116dp\"\n                        android:scaleType=\"centerCrop\"\n                        imageUrl=\"@{itemList.data.itemList.size() > 0 ? (itemList.data.itemList.get(0).data.tags.size() > 0 ? itemList.data.itemList.get(0).data.tags.get(0).headerImage : null) : null }\"\n                        />\n\n                    <LinearLayout\n                        android:layout_width=\"wrap_content\"\n                        android:layout_height=\"wrap_content\"\n                        android:orientation=\"vertical\">\n\n                        <LinearLayout\n                            android:orientation=\"vertical\"\n                            android:layout_width=\"match_parent\"\n                            android:layout_height=\"wrap_content\"\n                            android:layout_marginTop=\"38dp\"\n                            android:layout_marginEnd=\"8dp\"\n                            android:layout_marginStart=\"8dp\"\n                            android:layout_marginBottom=\"8dp\">\n\n                            <RelativeLayout\n                                android:layout_width=\"match_parent\"\n                                android:layout_height=\"wrap_content\"\n                                android:gravity=\"center\">\n\n                                <TextView\n                                    android:id=\"@+id/tv_name\"\n                                    android:layout_width=\"wrap_content\"\n                                    android:layout_height=\"wrap_content\"\n                                    android:layout_marginBottom=\"2dp\"\n                                    android:ellipsize=\"end\"\n                                    android:singleLine=\"true\"\n                                    android:gravity=\"center\"\n                                    android:text=\"@{itemList.data.header.title}\"\n                                    android:textStyle=\"bold\"\n                                    android:textSize=\"20sp\"/>\n                            </RelativeLayout>\n\n                            <RelativeLayout\n                                android:layout_width=\"match_parent\"\n                                android:layout_height=\"wrap_content\"\n                                android:gravity=\"center\">\n                                <TextView\n                                    android:id=\"@+id/tv_desc\"\n                                    android:layout_width=\"wrap_content\"\n                                    android:layout_height=\"wrap_content\"\n                                    android:ellipsize=\"end\"\n                                    android:singleLine=\"true\"\n                                    android:layout_marginTop=\"2dp\"\n                                    android:text=\"@{itemList.data.header.description}\"\n                                    android:textSize=\"16sp\"\n                                    />\n                            </RelativeLayout>\n                        </LinearLayout>\n\n                        <android.support.v7.widget.CardView\n                            android:id=\"@+id/cv_enter\"\n                            android:layout_width=\"match_parent\"\n                            android:layout_height=\"wrap_content\"\n                            app:cardCornerRadius=\"5dp\"\n                            android:layout_marginEnd=\"8dp\"\n                            android:layout_marginStart=\"8dp\">\n                            <TextView\n                                android:layout_width=\"wrap_content\"\n                                android:layout_height=\"wrap_content\"\n                                android:layout_marginTop=\"8dp\"\n                                android:layout_marginBottom=\"8dp\"\n                                android:layout_gravity=\"center\"\n                                android:text=\"@string/homePageEnter\"/>\n                        </android.support.v7.widget.CardView>\n\n                        <android.support.v7.widget.CardView\n                            android:id=\"@+id/cv_image\"\n                            android:layout_width=\"220dp\"\n                            android:layout_height=\"wrap_content\"\n                            android:layout_margin=\"6dp\"\n                            app:cardCornerRadius=\"10dp\"\n                            app:cardBackgroundColor=\"#56ecd0\"\n                            app:cardElevation=\"0dp\">\n\n                            <LinearLayout\n                                android:layout_width=\"wrap_content\"\n                                android:layout_height=\"wrap_content\"\n                                android:orientation=\"horizontal\">\n\n                                <ImageView\n                                    android:id=\"@+id/iv_left\"\n                                    imageUrl=\"@{itemList.data.itemList.size() > 0 ? itemList.data.itemList.get(0).data.cover.feed : null}\"\n                                    android:layout_width=\"72dp\"\n                                    android:layout_height=\"72dp\"\n                                    android:layout_marginEnd=\"1dp\"\n                                    android:scaleType=\"centerCrop\"\n                                    visibility=\"@{itemList.data.itemList.size() > 0 ? true : false}\"\n                                    />\n\n                                <ImageView\n                                    android:id=\"@+id/iv_center\"\n                                    imageUrl=\"@{itemList.data.itemList.size() > 1 ? itemList.data.itemList.get(1).data.cover.feed : null}\"\n                                    android:layout_width=\"72dp\"\n                                    android:layout_height=\"72dp\"\n                                    android:layout_marginStart=\"1dp\"\n                                    android:layout_marginEnd=\"1dp\"\n                                    android:scaleType=\"centerCrop\"\n                                    visibility=\"@{itemList.data.itemList.size() > 1 ? true : false}\"\n                                    />\n\n                                <ImageView\n                                    android:id=\"@+id/iv_right\"\n                                    imageUrl=\"@{itemList.data.itemList.size() > 2 ? itemList.data.itemList.get(2).data.cover.feed : null}\"\n                                    android:layout_width=\"72dp\"\n                                    android:layout_height=\"72dp\"\n                                    android:layout_marginStart=\"1dp\"\n                                    android:scaleType=\"centerCrop\"\n                                    visibility=\"@{itemList.data.itemList.size() > 2 ? true : false}\"\n                                    />\n                            </LinearLayout>\n\n                        </android.support.v7.widget.CardView>\n                        </LinearLayout>\n\n                    </LinearLayout>\n\n                <com.example.discover.view.CustomView.CircleImageView\n                    android:id=\"@+id/civ_avatar\"\n                    android:layout_width=\"74dp\"\n                    android:layout_height=\"74dp\"\n                    android:layout_gravity=\"center_horizontal\"\n                    android:layout_marginTop=\"62dp\"\n                    app:civ_border_width=\"2dp\"\n                    app:civ_border_color=\"#56ecd0\"\n                    android:scaleType=\"centerCrop\"\n                    circleImageUrl=\"@{itemList.data.header.icon}\"\n                    />\n\n            </FrameLayout>\n\n        </android.support.v7.widget.CardView>\n    </android.support.constraint.ConstraintLayout>\n</layout>\n"
  },
  {
    "path": "app/src/main/res/layout/bottom_bar.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<layout>\n\n    <RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        android:layout_height=\"wrap_content\"\n        android:layout_width=\"match_parent\"\n        android:layout_alignParentBottom=\"true\"\n        android:elevation=\"15dp\"\n        android:background=\"@color/background\"\n        >\n        <LinearLayout\n            android:orientation=\"vertical\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            >\n\n            <LinearLayout\n                android:id=\"@+id/bottom_bar\"\n                android:orientation=\"horizontal\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"?attr/actionBarSize\"\n                >\n\n                <ImageView\n                    android:id=\"@+id/one\"\n                    android:layout_width=\"wrap_content\"\n                    android:layout_height=\"match_parent\"\n                    android:layout_weight=\"1\"\n                    android:padding=\"15dp\"\n                    android:scaleType=\"centerInside\"\n                    android:clickable=\"true\"\n                    android:focusable=\"true\"\n                    android:background=\"?attr/selectableItemBackgroundBorderless\"\n                    android:src=\"@drawable/item_home\"/>\n\n                <ImageView\n                    android:id=\"@+id/two\"\n                    android:layout_width=\"wrap_content\"\n                    android:layout_height=\"match_parent\"\n                    android:layout_weight=\"1\"\n                    android:padding=\"15dp\"\n                    android:scaleType=\"centerInside\"\n                    android:clickable=\"true\"\n                    android:focusable=\"true\"\n                    android:background=\"?attr/selectableItemBackgroundBorderless\"\n                    android:src=\"@drawable/item_search\"/>\n\n                <ImageView\n                    android:id=\"@+id/three\"\n                    android:layout_width=\"wrap_content\"\n                    android:layout_height=\"match_parent\"\n                    android:layout_weight=\"1\"\n                    android:padding=\"15dp\"\n                    android:scaleType=\"centerInside\"\n                    android:clickable=\"true\"\n                    android:focusable=\"true\"\n                    android:background=\"?attr/selectableItemBackgroundBorderless\"\n                    android:src=\"@drawable/item_smile\"/>\n                <ImageView\n                    android:id=\"@+id/four\"\n                    android:layout_width=\"wrap_content\"\n                    android:layout_height=\"match_parent\"\n                    android:layout_weight=\"1\"\n                    android:padding=\"15dp\"\n                    android:scaleType=\"centerInside\"\n                    android:clickable=\"true\"\n                    android:focusable=\"true\"\n                    android:background=\"?attr/selectableItemBackgroundBorderless\"\n                    android:src=\"@drawable/item_figure\"/>\n            </LinearLayout>\n        </LinearLayout>\n    </RelativeLayout>\n\n</layout>\n"
  },
  {
    "path": "app/src/main/res/layout/category_card.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<layout>\n\n    <data>\n        <variable\n            name=\"itemList\"\n            type=\"com.example.discover.bean.DetailBean.ItemList\"/>\n    </data>\n    <RelativeLayout\n        xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n        android:id=\"@+id/video_album\"\n        android:layout_width=\"300dp\"\n        android:layout_height=\"200dp\">\n\n        <ImageView\n            imageUrl=\"@{itemList.data.cover.feed}\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"match_parent\"\n            android:scaleType=\"centerCrop\" />\n\n        <TextView\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_alignParentBottom=\"true\"\n            android:layout_alignParentStart=\"true\"\n            android:text=\"@{itemList.data.title}\"\n            android:textColor=\"@color/lightWhite\"\n            android:textSize=\"14sp\" />\n\n    </RelativeLayout>\n    <!--\n    <android.support.v7.widget.CardView\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        app:cardBackgroundColor=\"#00ff00\">\n\n        <TextView\n            android:id=\"@+id/tv_text\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"match_parent\" />\n    </android.support.v7.widget.CardView>-->\n\n\n\n\n</layout>\n"
  },
  {
    "path": "app/src/main/res/layout/category_popup_window.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<FrameLayout\n    xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    android:layout_width=\"wrap_content\"\n    android:layout_height=\"wrap_content\">\n\n    <android.support.v7.widget.CardView\n\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        app:cardCornerRadius=\"10dp\"\n        android:layout_margin=\"10dp\"\n        app:cardElevation=\"5dp\"\n        >\n\n        <android.support.v7.widget.RecyclerView\n            android:id=\"@+id/rv_label_choose\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:padding=\"20dp\"\n            android:background=\"@color/background\"\n            />\n\n\n    </android.support.v7.widget.CardView>\n</FrameLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/follow_popup.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<android.support.v7.widget.CardView\n    xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    android:id=\"@+id/cv\"\n    android:layout_width=\"wrap_content\"\n    android:layout_height=\"wrap_content\"\n    android:clickable=\"true\"\n    android:focusable=\"true\"\n    app:cardElevation=\"10dp\"\n    app:cardCornerRadius=\"5dp\"\n    >\n\n    <TextView\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:padding=\"5dp\"\n        android:text=\"不再关注\"/>\n\n</android.support.v7.widget.CardView>"
  },
  {
    "path": "app/src/main/res/layout/footer_item_video.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<layout>\n\n    <LinearLayout\n        android:id=\"@+id/ll\"\n        android:orientation=\"vertical\"\n        xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\">\n\n        <com.wang.avi.AVLoadingIndicatorView\n            android:id=\"@+id/loading\"\n            android:layout_width=\"40dp\"\n            android:layout_height=\"40dp\"\n            android:layout_gravity=\"center\"\n            app:indicatorName=\"BallPulseIndicator\"\n            />\n\n    </LinearLayout>\n</layout>\n"
  },
  {
    "path": "app/src/main/res/layout/fragment_base.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<layout xmlns:app=\"http://schemas.android.com/apk/res-auto\">\n\n    <FrameLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        >\n\n        <RelativeLayout\n            android:id=\"@+id/container\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"match_parent\"\n            android:background=\"@color/backgroundDark\">\n\n        </RelativeLayout>\n\n        <RelativeLayout\n            android:id=\"@+id/rl_loading\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"match_parent\"\n            android:gravity=\"center\"\n            android:background=\"@color/background\">\n\n            <com.wang.avi.AVLoadingIndicatorView\n                android:id=\"@+id/av_loading\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                app:indicatorName=\"BallPulseIndicator\"/>\n\n        </RelativeLayout>\n\n        <RelativeLayout\n            android:id=\"@+id/rl_error\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"match_parent\"\n            android:gravity=\"center\"\n            android:background=\"@color/backgroundDark\"\n            android:clickable=\"true\"\n            android:focusable=\"true\"\n            android:visibility=\"gone\">\n\n            <TextView\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:text=\"没网啦，点击重拾\"\n                />\n\n        </RelativeLayout>\n\n    </FrameLayout>\n</layout>\n"
  },
  {
    "path": "app/src/main/res/layout/fragment_discover.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<layout>\n\n    <android.support.v4.widget.NestedScrollView xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n        android:orientation=\"vertical\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        android:background=\"@color/lightWhite\">\n\n\n        <TextView\n            android:id=\"@+id/test_text\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"match_parent\" />\n\n\n    </android.support.v4.widget.NestedScrollView>\n</layout>\n"
  },
  {
    "path": "app/src/main/res/layout/fragment_follow.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<layout\n    xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\">\n\n    <FrameLayout\n\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\">\n        <android.support.v4.widget.SwipeRefreshLayout\n            android:id=\"@+id/srl_refresh\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"match_parent\">\n\n            <android.support.v7.widget.RecyclerView\n                android:id=\"@+id/rv_follow\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"match_parent\"\n                android:background=\"@color/colorLabelAnim\"/>\n\n        </android.support.v4.widget.SwipeRefreshLayout>\n\n    </FrameLayout>\n</layout>\n"
  },
  {
    "path": "app/src/main/res/layout/fragment_personal.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<layout>\n\n    <FrameLayout\n        xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\">\n\n    <android.support.design.widget.CoordinatorLayout\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\">\n\n            <android.support.design.widget.AppBarLayout\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                >\n\n                <android.support.design.widget.CollapsingToolbarLayout\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"250dp\"\n                    app:layout_scrollFlags=\"scroll|enterAlways\">\n\n                    <RelativeLayout\n                        android:id=\"@+id/backdrop\"\n                        android:layout_width=\"match_parent\"\n                        android:layout_height=\"match_parent\"\n                        android:layout_marginTop=\"?attr/actionBarSize\"\n                        app:layout_collapseMode=\"parallax\">\n\n                        <com.example.discover.view.CustomView.CircleImageView\n                            android:id=\"@+id/iv_head\"\n                            android:layout_width=\"85dp\"\n                            android:layout_height=\"85dp\"\n                            android:layout_marginTop=\"30dp\"\n                            android:layout_centerHorizontal=\"true\"\n                            android:src=\"@mipmap/head_personal\"\n                            app:civ_border_width=\"3dp\"\n                            app:civ_border_color=\"@color/colorLabelAnim\"\n                            />\n\n                        <TextView\n                            android:id=\"@+id/tip\"\n                            android:layout_width=\"wrap_content\"\n                            android:layout_height=\"wrap_content\"\n                            android:layout_below=\"@+id/iv_head\"\n                            android:layout_centerHorizontal=\"true\"\n                            android:layout_marginTop=\"20dp\"\n                            android:text=\"我是沙拉 不是能吃的沙拉\" />\n                    </RelativeLayout>\n\n                    <android.support.v7.widget.Toolbar\n                        android:id=\"@+id/toolbar\"\n                        android:layout_width=\"match_parent\"\n                        android:layout_height=\"?attr/actionBarSize\"\n                        app:contentInsetStart=\"0dp\"\n                        app:layout_collapseMode=\"none\"\n                        >\n                        <RelativeLayout\n                            android:layout_width=\"match_parent\"\n                            android:layout_height=\"match_parent\"\n                            android:background=\"@color/backgroundGray\">\n                            <TextView\n                                android:id=\"@+id/tv_title\"\n                                android:layout_width=\"wrap_content\"\n                                android:layout_height=\"wrap_content\"\n                                android:layout_centerInParent=\"true\"\n                                android:text=\"个人中心\"\n                                android:textColor=\"@android:color/background_dark\"\n                                android:textSize=\"18sp\" />\n                        </RelativeLayout>\n                    </android.support.v7.widget.Toolbar>\n\n                </android.support.design.widget.CollapsingToolbarLayout>\n\n                <android.support.design.widget.TabLayout\n                    android:id=\"@+id/tab_collect\"\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"wrap_content\"\n                    android:layout_gravity=\"bottom\"\n                    android:background=\"@color/colorLabelAnim\"\n                    app:tabIndicatorColor=\"@color/colorLabelAd\"\n                    app:tabTextAppearance=\"@style/MyTabLayoutTextAppearance\"\n                    app:tabSelectedTextColor=\"@color/colorLabelAd\"/>\n\n            </android.support.design.widget.AppBarLayout>\n\n            <android.support.v4.view.ViewPager\n                android:id=\"@+id/vp_collect\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"match_parent\"\n\n                app:layout_behavior=\"@string/appbar_scrolling_view_behavior\" />\n\n    </android.support.design.widget.CoordinatorLayout>\n    </FrameLayout>\n\n</layout>\n"
  },
  {
    "path": "app/src/main/res/layout/fragment_personal_like.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<layout>\n\n    <FrameLayout\n        xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\">\n\n        <!--\n        <android.support.v4.widget.NestedScrollView\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\">\n\n            <TextView\n                android:id=\"@+id/tv_test\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"match_parent\"\n                android:text=\"loading\"\n                android:background=\"#ff0000\"/>\n        </android.support.v4.widget.NestedScrollView>-->\n\n        <android.support.v4.widget.SwipeRefreshLayout\n            android:id=\"@+id/srl_refresh\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"match_parent\">\n\n            <android.support.v7.widget.RecyclerView\n                android:id=\"@+id/rv_like_video\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"match_parent\"\n                android:background=\"@color/colorLabelAnim\"\n                >\n\n            </android.support.v7.widget.RecyclerView>\n        </android.support.v4.widget.SwipeRefreshLayout>\n\n\n    </FrameLayout>\n</layout>\n"
  },
  {
    "path": "app/src/main/res/layout/fragment_search.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<layout\n    xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\">\n\n <LinearLayout\n     android:orientation=\"vertical\"\n     android:layout_width=\"match_parent\"\n     android:layout_height=\"match_parent\">\n\n     <TextView\n         android:id=\"@+id/tv_search\"\n         android:layout_width=\"match_parent\"\n         android:layout_height=\"60dp\"\n         android:layout_margin=\"10dp\"\n         android:drawableStart=\"@drawable/search_normal\"\n         android:drawablePadding=\"20dp\"\n         android:hint=\"@string/searchHint\"\n         android:textSize=\"20dp\"\n         android:textStyle=\"bold\"\n         android:background=\"@drawable/corner_view\"\n         android:gravity=\"center_vertical\"\n         />\n\n         <FrameLayout\n             android:layout_width=\"match_parent\"\n             android:layout_height=\"match_parent\">\n\n             <android.support.v4.widget.SwipeRefreshLayout\n                 android:id=\"@+id/srl_search_refresh\"\n                 android:layout_width=\"match_parent\"\n                 android:layout_height=\"match_parent\"\n                 app:layout_behavior=\"@string/appbar_scrolling_view_behavior\">\n\n             <android.support.design.widget.CoordinatorLayout\n                 android:id=\"@+id/llll\"\n                 android:layout_width=\"match_parent\"\n                 android:layout_height=\"match_parent\">\n\n                 <android.support.design.widget.AppBarLayout\n                     android:id=\"@+id/abl\"\n                     android:layout_width=\"match_parent\"\n                     android:layout_height=\"wrap_content\"\n                     android:background=\"@color/backgroundDark\"\n                     >\n\n                     <LinearLayout\n                         android:orientation=\"vertical\"\n                         android:layout_width=\"match_parent\"\n                         android:layout_height=\"wrap_content\"\n                         app:layout_scrollFlags=\"scroll|exitUntilCollapsed\">\n\n                         <TextView\n                             android:layout_width=\"wrap_content\"\n                             android:layout_height=\"wrap_content\"\n                             android:layout_marginBottom=\"5dp\"\n                             android:layout_marginStart=\"15dp\"\n                             android:layout_marginTop=\"5dp\"\n                             android:text=\"@string/followLabel\"\n                             android:textColor=\"@color/followLabelText\"\n                             android:textSize=\"14sp\" />\n\n                         <RelativeLayout\n                             android:layout_width=\"match_parent\"\n                             android:layout_height=\"50dp\"\n                             android:layout_gravity=\"center_vertical\">\n\n                             <android.support.v7.widget.CardView\n                                 android:id=\"@+id/cv_add\"\n                                 android:layout_width=\"50dp\"\n                                 android:layout_height=\"30dp\"\n                                 android:layout_margin=\"10dp\"\n                                 android:clickable=\"true\"\n                                 android:focusable=\"true\"\n                                 android:foreground=\"?attr/selectableItemBackground\"\n                                 app:cardBackgroundColor=\"#687486\"\n                                 app:cardCornerRadius=\"15dp\">\n\n                                 <ImageView\n                                     android:layout_width=\"25dp\"\n                                     android:layout_height=\"25dp\"\n                                     android:layout_gravity=\"center\"\n                                     android:scaleType=\"centerInside\"\n                                     android:src=\"@drawable/add_label\" />\n                             </android.support.v7.widget.CardView>\n\n                             <android.support.v7.widget.RecyclerView\n                                 android:id=\"@+id/rv_select_type\"\n                                 android:layout_width=\"match_parent\"\n                                 android:layout_height=\"match_parent\"\n                                 android:layout_alignParentTop=\"true\"\n                                 android:layout_toEndOf=\"@+id/cv_add\"/>\n                         </RelativeLayout>\n\n                         <TextView\n                             android:layout_width=\"wrap_content\"\n                             android:layout_height=\"wrap_content\"\n                             android:layout_marginBottom=\"5dp\"\n                             android:layout_marginStart=\"15dp\"\n                             android:layout_marginTop=\"10dp\"\n                             android:text=\"@string/videoRecommend\"\n                             android:textColor=\"@color/followLabelText\"\n                             android:textSize=\"14sp\" />\n\n                     </LinearLayout>\n\n                 </android.support.design.widget.AppBarLayout>\n\n                     <android.support.v7.widget.RecyclerView\n                         android:id=\"@+id/rv_main\"\n                         android:layout_width=\"match_parent\"\n                         android:layout_height=\"match_parent\"\n                         android:visibility=\"gone\"\n                         app:layout_behavior=\"@string/appbar_scrolling_view_behavior\" />\n\n             </android.support.design.widget.CoordinatorLayout>\n\n             </android.support.v4.widget.SwipeRefreshLayout>\n             <RelativeLayout\n                 android:id=\"@+id/rl_search_loading\"\n                 android:layout_width=\"match_parent\"\n                 android:layout_height=\"match_parent\"\n                 android:gravity=\"center\"\n                 android:background=\"@color/backgroundDark\">\n\n                 <com.wang.avi.AVLoadingIndicatorView\n                     android:layout_width=\"wrap_content\"\n                     android:layout_height=\"wrap_content\" />\n\n             </RelativeLayout>\n\n             <RelativeLayout\n                 android:id=\"@+id/rl_error\"\n                 android:layout_width=\"match_parent\"\n                 android:layout_height=\"match_parent\"\n                 android:gravity=\"center\"\n                 android:background=\"@color/backgroundDark\"\n                 android:visibility=\"gone\">\n\n                 <TextView\n                     android:layout_width=\"wrap_content\"\n                     android:layout_height=\"wrap_content\"\n                     android:text=\"没网啦，点击重拾\"/>\n\n             </RelativeLayout>\n         </FrameLayout>\n\n\n\n\n </LinearLayout>\n\n\n\n\n\n</layout>\n"
  },
  {
    "path": "app/src/main/res/layout/fragment_video.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<layout 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\n    <android.support.v4.widget.SwipeRefreshLayout\n        android:id=\"@+id/srl_video\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\">\n\n        <android.support.v7.widget.RecyclerView\n            android:id=\"@+id/rv_video\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"match_parent\"\n            android:scrollbarAlwaysDrawVerticalTrack=\"true\"\n            android:scrollbarFadeDuration=\"1\"\n            android:scrollbarSize=\"4dp\"\n            android:scrollbars=\"vertical\" />\n\n    </android.support.v4.widget.SwipeRefreshLayout>\n</layout>\n"
  },
  {
    "path": "app/src/main/res/layout/fragment_welfare.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<layout\n    xmlns:android=\"http://schemas.android.com/apk/res/android\">\n\n    <FrameLayout\n\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\">\n\n        <android.support.v7.widget.RecyclerView\n            android:id=\"@+id/rv_welfare\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"match_parent\"/>\n    </FrameLayout>\n</layout>\n"
  },
  {
    "path": "app/src/main/res/layout/item_follow.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<layout\n    xmlns:android=\"http://schemas.android.com/apk/res/android\">\n\n    <data>\n\n        <variable\n            name=\"follow\"\n            type=\"com.example.discover.bean.LitePalBean.Follow\"/>\n    </data>\n    <FrameLayout\n\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:background=\"@color/lightWhite\"\n        >\n\n        <LinearLayout\n\n            android:id=\"@+id/follow_item\"\n            android:orientation=\"horizontal\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"80dp\"\n            android:background=\"?android:attr/selectableItemBackground\"\n            >\n\n\n            <ImageView\n                android:id=\"@+id/follow_head\"\n                android:layout_width=\"50dp\"\n                android:layout_height=\"50dp\"\n                android:layout_margin=\"15dp\"\n                android:layout_gravity=\"center_vertical\"\n                android:scaleType=\"fitXY\"\n                imageUrl=\"@{follow.iconUrl}\"/>\n\n            <RelativeLayout\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"match_parent\">\n\n\n                <LinearLayout\n                    android:orientation=\"horizontal\"\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"match_parent\">\n\n                    <LinearLayout\n                        android:orientation=\"vertical\"\n                        android:layout_width=\"0dp\"\n                        android:layout_height=\"match_parent\"\n                        android:layout_marginTop=\"15dp\"\n                        android:layout_marginBottom=\"15dp\"\n                        android:layout_weight=\"1\">\n\n                        <TextView\n                            android:id=\"@+id/follow_id\"\n                            android:layout_width=\"match_parent\"\n                            android:layout_height=\"0dp\"\n                            android:layout_weight=\"1\"\n                            android:gravity=\"center_vertical\"\n                            android:singleLine=\"true\"\n                            android:ellipsize=\"end\"\n                            android:textColor=\"#000000\"\n                            android:textSize=\"14sp\"\n                            android:text=\"@{String.valueOf(follow.authorName)}\"\n\n                            />\n                        <TextView\n                            android:id=\"@+id/follow_desc\"\n                            android:layout_width=\"match_parent\"\n                            android:layout_height=\"0dp\"\n                            android:layout_weight=\"1\"\n                            android:gravity=\"center_vertical\"\n                            android:singleLine=\"true\"\n                            android:ellipsize=\"end\"\n                            android:textColor=\"@color/followLabelText\"\n                            android:textSize=\"12sp\"\n                            android:text=\"@{follow.authorDesc}\"/>\n                    </LinearLayout>\n\n                    <ImageView\n                        android:id=\"@+id/selector\"\n                        android:layout_width=\"50dp\"\n                        android:layout_height=\"50dp\"\n                        android:layout_marginStart=\"15dp\"\n                        android:layout_marginTop=\"15dp\"\n                        android:layout_marginBottom=\"15dp\"\n                        android:layout_gravity=\"center_vertical\"\n                        android:src=\"@drawable/figure_normal\"\n                        android:padding=\"10dp\"/>\n                </LinearLayout>\n\n                <View\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"0.5dp\"\n                    android:layout_alignParentBottom=\"true\"\n                    android:background=\"@color/dividingLine\"/>\n\n            </RelativeLayout>\n\n\n        </LinearLayout>\n    </FrameLayout>\n\n</layout>\n"
  },
  {
    "path": "app/src/main/res/layout/item_movie_detail_header.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<layout>\n\n    <data>\n\n        <variable\n            name=\"item\"\n            type=\"com.example.discover.bean.DetailBean.ItemList\"/>\n    </data>\n    <LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n        android:id=\"@+id/content_movie\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:orientation=\"vertical\">\n\n        <Space\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"200dp\"/>\n\n        <TextView\n            android:id=\"@+id/movie_title\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:textSize=\"20sp\"\n            android:paddingStart=\"16dp\"\n            android:paddingTop=\"24dp\"\n            android:paddingEnd=\"16dp\"\n            android:paddingBottom=\"24dp\"\n            android:background=\"@color/light_grey\"\n            android:textColor=\"#212121\"\n            android:text=\"@{item.data.title}\" />\n\n        <RelativeLayout\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\">\n\n            <TextView\n                android:id=\"@+id/movie_type\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:layout_margin=\"16dp\"\n\n                type=\"@{item.data}\" />\n\n            <ImageView\n                android:id=\"@+id/collect\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:layout_margin=\"16dp\"\n                android:clickable=\"true\"\n                android:focusable=\"true\"\n                android:layout_alignParentEnd=\"true\"\n                android:src=\"@drawable/ic_heart_hollow_24dp\"\n\n                />\n        </RelativeLayout>\n\n\n        <TextView\n            android:id=\"@+id/movie_desc\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:layout_marginStart=\"16dp\"\n            android:layout_marginEnd=\"16dp\"\n            android:layout_marginBottom=\"16dp\"\n            android:textSize=\"16sp\"\n            android:text=\"@{item.data.description}\" />\n\n        <FrameLayout\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:background=\"@color/lightWhite\">\n\n            <LinearLayout\n                android:id=\"@+id/author_content\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"48dp\"\n                android:layout_gravity=\"end\"\n                android:gravity=\"center_vertical\"\n                android:orientation=\"horizontal\"\n                android:visibility=\"visible\"\n                android:layout_marginBottom=\"16dp\"\n                android:layout_marginTop=\"16dp\"\n                android:background=\"?attr/selectableItemBackgroundBorderless\"\n                >\n\n                <TextView\n                    android:id=\"@+id/name\"\n                    android:layout_width=\"wrap_content\"\n                    android:layout_height=\"wrap_content\"\n                    android:gravity=\"center_vertical\"\n                    android:layout_marginStart=\"16dp\"\n                    android:textStyle=\"bold\"\n                    android:text=\"@{item.data.author.name}\"/>\n\n                <com.example.discover.view.CustomView.CircleImageView\n                    android:id=\"@+id/author\"\n                    android:layout_width=\"40dp\"\n                    android:layout_height=\"40dp\"\n                    android:layout_margin=\"16dp\"\n                    app:civ_border_width=\"0dp\"\n                    app:civ_border_color=\"#56ecd0\"\n                    android:scaleType=\"centerCrop\"\n                    circleImageUrl=\"@{item.data.author.icon}\"/>\n\n            </LinearLayout>\n        </FrameLayout>\n    </LinearLayout>\n</layout>\n"
  },
  {
    "path": "app/src/main/res/layout/item_reply.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<layout>\n\n    <data>\n\n        <variable\n            name=\"reply\"\n            type=\"com.example.discover.bean.DetailBean.ReplyList\"/>\n    </data>\n    <RelativeLayout 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=\"wrap_content\">\n\n        <com.example.discover.view.CustomView.CircleImageView\n            android:id=\"@+id/movie_avatar\"\n            android:layout_width=\"40dp\"\n            android:layout_height=\"40dp\"\n            android:layout_alignParentStart=\"true\"\n            android:layout_margin=\"16dp\"\n            circleImageUrl=\"@{reply.user.avatar}\"/>\n\n        <TextView\n            android:id=\"@+id/reply_avatar\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_marginEnd=\"8dp\"\n            android:layout_marginTop=\"16dp\"\n            android:layout_toEndOf=\"@+id/movie_avatar\"\n            android:layout_toStartOf=\"@+id/reply_time\"\n            android:textStyle=\"bold\"\n            android:text=\"@{reply.user.nickname}\" />\n\n        <TextView\n            android:id=\"@+id/replay_desc\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_below=\"@+id/reply_avatar\"\n            android:layout_marginEnd=\"16dp\"\n            android:layout_marginTop=\"6dp\"\n            android:layout_marginBottom=\"8dp\"\n            android:layout_toEndOf=\"@+id/movie_avatar\"\n            android:layout_toStartOf=\"@+id/likeCount\"\n            android:text=\"@{reply.message}\" />\n\n        <TextView\n            android:id=\"@+id/reply_time\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_alignParentEnd=\"true\"\n            android:layout_marginEnd=\"16dp\"\n            android:layout_marginTop=\"16dp\"\n            android:textStyle=\"bold\"\n            time=\"@{reply.createTime}\" />\n\n        <LinearLayout\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_below=\"@+id/reply_time\"\n            android:layout_alignParentEnd=\"true\"\n            android:orientation=\"horizontal\">\n\n            <ImageView\n                android:id=\"@+id/love\"\n                android:layout_width=\"24dp\"\n                android:layout_height=\"24dp\"\n                android:layout_marginTop=\"4dp\"\n                android:scaleType=\"centerInside\"\n                android:src=\"@drawable/collected\"\n\n                />\n            <TextView\n                android:id=\"@+id/likeCount\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:gravity=\"center_vertical\"\n                android:layout_marginTop=\"4dp\"\n                android:layout_marginBottom=\"8dp\"\n                android:paddingEnd=\"4dp\"\n                android:paddingStart=\"4dp\"\n                android:text=\"@{String.valueOf(reply.likeCount)}\" />\n        </LinearLayout>\n\n\n    </RelativeLayout>\n</layout>\n"
  },
  {
    "path": "app/src/main/res/layout/item_welfare.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<layout\n    xmlns:android=\"http://schemas.android.com/apk/res/android\">\n\n    <data>\n        <variable\n            name=\"data\"\n            type=\"com.example.discover.bean.GankBean.ResultBean\"/>\n\n    </data>\n    <ImageView\n        android:id=\"@+id/iv_welfare\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"250dp\"\n        android:scaleType=\"centerCrop\"\n        android:adjustViewBounds=\"true\"\n        welfareImageUrl=\"@{data.url}\">\n    </ImageView>\n\n</layout>\n"
  },
  {
    "path": "app/src/main/res/layout/label_view.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<FrameLayout\n    xmlns:android=\"http://schemas.android.com/apk/res/android\"\n\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    android:layout_height=\"wrap_content\"\n    android:layout_width=\"wrap_content\">\n\n    <!--\n    <com.example.discover.view.CustomView.LabelView\n        android:id=\"@+id/lv\"\n        android:layout_width=\"60dp\"\n        android:layout_height=\"30dp\"\n        android:layout_margin=\"10dp\"\n        app:labelTextSize=\"16sp\"\n        app:labelTextColor=\"@color/lightWhite\"\n        android:background=\"?attr/selectableItemBackgroundBorderless\"\n        />-->\n\n    <android.support.v7.widget.CardView\n        android:id=\"@+id/cv_choose_label\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"30dp\"\n        android:layout_margin=\"10dp\"\n        app:cardBackgroundColor=\"#ff0000\"\n        app:cardCornerRadius=\"15dp\"\n        app:cardElevation=\"5dp\"\n        android:focusable=\"true\"\n        android:clickable=\"true\"\n        android:foreground=\"?android:attr/selectableItemBackground\"\n        >\n\n        <TextView\n            android:id=\"@+id/tv_label\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_marginBottom=\"5dp\"\n            android:layout_marginLeft=\"15dp\"\n            android:layout_marginRight=\"15dp\"\n            android:layout_marginTop=\"5dp\"\n            android:gravity=\"center\"\n            android:text=\"运动\"\n            android:textColor=\"#ffffff\"\n            android:textStyle=\"bold\" />\n    </android.support.v7.widget.CardView>\n</FrameLayout>"
  },
  {
    "path": "app/src/main/res/layout/like_video_card.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<layout xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:tools=\"http://schemas.android.com/tools\">\n    <FrameLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n\n        android:id=\"@+id/fl\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\">\n\n        <LinearLayout\n            android:id=\"@+id/ll\"\n            android:orientation=\"vertical\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:background=\"@color/backgroundVideoCard\">\n\n            <android.support.constraint.ConstraintLayout\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"48dp\"\n                android:background=\"@color/backgroundVideoCard\">\n\n\n                <android.support.v7.widget.CardView\n                    android:id=\"@+id/cv_label\"\n                    android:layout_width=\"wrap_content\"\n                    android:layout_height=\"30dp\"\n                    android:layout_marginStart=\"8dp\"\n                    app:layout_constraintBottom_toBottomOf=\"parent\"\n                    app:layout_constraintStart_toStartOf=\"parent\"\n                    app:layout_constraintTop_toTopOf=\"parent\"\n                    app:cardBackgroundColor=\"#ff0000\"\n                    app:cardCornerRadius=\"15dp\"\n                    app:cardElevation=\"5dp\"\n\n                    >\n\n                    <TextView\n                        android:id=\"@+id/tv_label\"\n                        android:layout_width=\"wrap_content\"\n                        android:layout_height=\"wrap_content\"\n                        android:layout_marginBottom=\"5dp\"\n                        android:layout_marginLeft=\"15dp\"\n                        android:layout_marginRight=\"15dp\"\n                        android:layout_marginTop=\"5dp\"\n                        android:gravity=\"center\"\n                        android:text=\"运动\"\n                        android:textColor=\"#ffffff\"\n                        android:textStyle=\"bold\" />\n                </android.support.v7.widget.CardView>\n\n                <ImageView\n                    android:id=\"@+id/iv_close\"\n                    android:layout_width=\"wrap_content\"\n                    android:layout_height=\"32dp\"\n                    android:padding=\"8dp\"\n                    android:layout_marginEnd=\"8dp\"\n                    app:layout_constraintBottom_toBottomOf=\"parent\"\n                    app:layout_constraintEnd_toEndOf=\"parent\"\n                    app:layout_constraintTop_toTopOf=\"parent\"\n                    android:scaleType=\"centerInside\"\n                    android:src=\"@drawable/close\"\n                    android:focusable=\"true\"\n                    android:clickable=\"true\"\n                    android:background=\"?attr/selectableItemBackground\"/>\n\n            </android.support.constraint.ConstraintLayout>\n\n            <cn.jzvd.JZVideoPlayerStandard\n                android:id=\"@+id/jz_video_player\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"200dp\"/>\n            <TextView\n                android:id=\"@+id/tv_desc\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:textSize=\"15sp\"\n                android:padding=\"12dp\"\n                />\n            <View\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"0.5dp\"\n                android:background=\"@color/divisionLine\"/>\n            <android.support.constraint.ConstraintLayout\n                android:orientation=\"horizontal\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                >\n\n                <!--\n                <TextView\n                    android:id=\"@+id/tv_video_size\"\n                    android:layout_width=\"wrap_content\"\n                    android:layout_height=\"wrap_content\"\n                    android:layout_marginStart=\"8dp\"\n                    android:textSize=\"12sp\"\n                    android:typeface=\"serif\"\n                    android:text=\"待填充\"\n                    app:layout_constraintBottom_toBottomOf=\"parent\"\n                    app:layout_constraintStart_toStartOf=\"parent\"\n                    app:layout_constraintTop_toTopOf=\"parent\" />-->\n\n                <com.example.discover.view.CustomView.CircleImageView\n                    android:id=\"@+id/head_icon\"\n                    android:layout_width=\"36dp\"\n                    android:layout_height=\"36dp\"\n                    android:layout_marginBottom=\"2dp\"\n                    android:layout_marginStart=\"16dp\"\n                    android:layout_marginTop=\"2dp\"\n                    app:layout_constraintBottom_toBottomOf=\"parent\"\n                    app:layout_constraintStart_toStartOf=\"parent\"\n                    app:layout_constraintTop_toTopOf=\"parent\" />\n\n                <ImageView\n                    android:id=\"@+id/iv_share\"\n                    android:layout_width=\"wrap_content\"\n                    android:layout_height=\"40dp\"\n                    android:padding=\"8dp\"\n                    android:layout_marginEnd=\"16dp\"\n                    app:layout_constraintBottom_toBottomOf=\"parent\"\n                    app:layout_constraintEnd_toStartOf=\"@+id/iv_download\"\n                    app:layout_constraintTop_toTopOf=\"parent\"\n                    android:src=\"@drawable/share\"\n                    android:scaleType=\"centerInside\"\n                    android:focusable=\"true\"\n                    android:clickable=\"true\"\n                    android:background=\"?attr/selectableItemBackground\"/>\n\n                <ImageView\n                    android:id=\"@+id/iv_download\"\n                    android:layout_width=\"wrap_content\"\n                    android:layout_height=\"40dp\"\n                    android:padding=\"8dp\"\n                    android:layout_marginEnd=\"8dp\"\n                    app:layout_constraintBottom_toBottomOf=\"parent\"\n                    app:layout_constraintEnd_toEndOf=\"parent\"\n                    app:layout_constraintTop_toTopOf=\"parent\"\n                    android:scaleType=\"centerInside\"\n                    android:src=\"@drawable/download\"\n                    android:focusable=\"true\"\n                    android:clickable=\"true\"\n                    android:background=\"?attr/selectableItemBackground\"/>\n            </android.support.constraint.ConstraintLayout>\n            <View\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"15dp\"\n                android:background=\"@color/backgroundGray\"/>\n\n        </LinearLayout>\n\n    </FrameLayout>\n</layout>"
  },
  {
    "path": "app/src/main/res/layout/null_layout.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<FrameLayout\n    xmlns:android=\"http://schemas.android.com/apk/res/android\" android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\">\n\n</FrameLayout>"
  },
  {
    "path": "app/src/main/res/layout/recommend_author.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<layout xmlns:bind=\"http://schemas.android.com/apk/res-auto\">\n\n    <data>\n        <import type=\"com.example.discover.bean.DetailBean.ItemList\"/>\n        <import type=\"java.util.List\"/>\n\n        <variable\n            name=\"data\"\n            type=\"List&lt;ItemList&gt;\"/>\n    </data>\n    <RelativeLayout\n        xmlns:android=\"http://schemas.android.com/apk/res/android\" android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\">\n\n        <android.support.v7.widget.RecyclerView\n            android:id=\"@+id/rv_author\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"match_parent\"\n            authorData=\"@{data}\">\n\n        </android.support.v7.widget.RecyclerView>\n    </RelativeLayout>\n</layout>\n"
  },
  {
    "path": "app/src/main/res/layout/recommend_category.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<layout xmlns:bind=\"http://schemas.android.com/tools\">\n\n    <data>\n        <import type=\"java.util.List\"/>\n        <import type=\"com.example.discover.bean.DetailBean.ItemList\"/>\n        <variable\n            name=\"data\"\n            type=\"List&lt;ItemList&gt;\"/>\n    </data>\n\n    <LinearLayout\n        xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n        android:orientation=\"vertical\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\">\n\n        <TextView\n            android:id=\"@+id/tv_category\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_marginStart=\"15dp\"\n            android:layout_marginTop=\"10dp\"\n            android:layout_marginBottom=\"5dp\"\n            android:gravity=\"left\"\n            android:textSize=\"14sp\"\n            android:textColor=\"@color/followLabelText\"\n            />\n        <android.support.v7.widget.RecyclerView\n            android:id=\"@+id/rv_category\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            categoryData=\"@{data}\">\n\n        </android.support.v7.widget.RecyclerView>\n    </LinearLayout>\n</layout>\n"
  },
  {
    "path": "app/src/main/res/layout/reply_popup_window.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<FrameLayout\n    xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    android:layout_width=\"wrap_content\"\n    android:layout_height=\"wrap_content\">\n\n    <android.support.v7.widget.CardView\n\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"310dp\"\n        android:layout_margin=\"4dp\"\n        app:cardCornerRadius=\"4dp\"\n        app:cardElevation=\"5dp\"\n        >\n\n        <android.support.v7.widget.RecyclerView\n            android:id=\"@+id/rv_reply\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"match_parent\"/>\n\n        <FrameLayout\n            android:id=\"@+id/no_comment\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"match_parent\"\n            android:visibility=\"gone\">\n\n            <TextView\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:layout_gravity=\"center\"\n                android:text=\"@string/noComment\"\n                android:textSize=\"18sp\"\n                android:textColor=\"@color/followLabelText\"/>\n        </FrameLayout>\n\n        <FrameLayout\n            android:id=\"@+id/loading\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"match_parent\">\n            \n            <com.wang.avi.AVLoadingIndicatorView\n                android:layout_width=\"40dp\"\n                android:layout_height=\"40dp\"\n                android:layout_gravity=\"center\"\n                app:indicatorName=\"BallClipRotateIndicator\"\n                app:indicatorColor=\"@color/followLabelText\"/>\n        </FrameLayout>\n\n        <FrameLayout\n            android:id=\"@+id/reloading\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"match_parent\"\n            android:visibility=\"gone\">\n\n            <LinearLayout\n                android:orientation=\"vertical\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:layout_gravity=\"center\">\n\n                <ImageView\n                    android:layout_width=\"40dp\"\n                    android:layout_height=\"40dp\"\n                    android:src=\"@drawable/reloading\"\n                    android:layout_gravity=\"center_horizontal\"/>\n\n                <TextView\n                    android:layout_width=\"wrap_content\"\n                    android:layout_height=\"wrap_content\"\n                    android:layout_gravity=\"center_horizontal\"\n                    android:text=\"重新加载\"/>\n\n            </LinearLayout>\n        </FrameLayout>\n    </android.support.v7.widget.CardView>\n</FrameLayout>\n\n\n\n"
  },
  {
    "path": "app/src/main/res/layout/search_tag.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<layout\n    xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\">\n\n    <FrameLayout\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\">\n\n        <LinearLayout\n            android:id=\"@+id/item_tag\"\n            android:orientation=\"horizontal\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"40dp\"\n            android:background=\"?android:attr/selectableItemBackground\">\n\n            <ImageView\n                android:layout_width=\"22dp\"\n                android:layout_height=\"22dp\"\n                android:layout_gravity=\"center_vertical\"\n                android:layout_marginStart=\"20dp\"\n                android:scaleType=\"centerInside\"\n                android:src=\"@drawable/search_normal\"/>\n            <TextView\n                android:id=\"@+id/tv_tag\"\n                android:layout_width=\"0dp\"\n                android:layout_height=\"wrap_content\"\n                android:layout_weight=\"1\"\n                android:layout_marginStart=\"20dp\"\n                android:textSize=\"18sp\"\n                android:textColor=\"@color/textDark\"\n                android:layout_gravity=\"center_vertical\"\n                />\n\n            <ImageView\n                android:id=\"@+id/delete\"\n                android:layout_width=\"40dp\"\n                android:layout_height=\"40dp\"\n                android:layout_gravity=\"center_vertical\"\n                android:layout_marginEnd=\"15dp\"\n                android:scaleType=\"centerInside\"\n                android:src=\"@drawable/ic_clear_black_24px\"\n                android:background=\"?android:attr/selectableItemBackgroundBorderless\"\n                android:visibility=\"gone\"/>\n        </LinearLayout>\n    </FrameLayout>\n\n</layout>\n"
  },
  {
    "path": "app/src/main/res/layout/select_label_view.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<FrameLayout\n    xmlns:android=\"http://schemas.android.com/apk/res/android\"\n\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    android:layout_height=\"wrap_content\"\n    android:layout_width=\"wrap_content\">\n\n    <android.support.v7.widget.CardView\n        android:id=\"@+id/cv_select_label\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"30dp\"\n        android:layout_marginTop=\"10dp\"\n        android:layout_marginBottom=\"10dp\"\n        android:layout_marginLeft=\"5dp\"\n        android:layout_marginRight=\"5dp\"\n        app:cardBackgroundColor=\"#ff0000\"\n        app:cardCornerRadius=\"15dp\"\n        app:cardElevation=\"5dp\"\n        android:focusable=\"true\"\n        android:clickable=\"true\"\n        android:foreground=\"?android:attr/selectableItemBackground\"\n        >\n\n        <TextView\n            android:id=\"@+id/tv_label\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_marginBottom=\"5dp\"\n            android:layout_marginLeft=\"15dp\"\n            android:layout_marginRight=\"15dp\"\n            android:layout_marginTop=\"5dp\"\n            android:gravity=\"center\"\n            android:text=\"运动\"\n            android:textColor=\"#ffffff\"\n            android:textStyle=\"bold\" />\n    </android.support.v7.widget.CardView>\n</FrameLayout>"
  },
  {
    "path": "app/src/main/res/layout/tag_header_new.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<layout>\n\n    <LinearLayout\n        xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        android:id=\"@+id/item_new\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"40dp\">\n\n        <TextView\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_marginStart=\"20dp\"\n            android:layout_gravity=\"center_vertical\"\n            android:text=\"最新\"/>\n\n    </LinearLayout>\n</layout>\n\n\n\n"
  },
  {
    "path": "app/src/main/res/layout/tag_header_reco.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<layout\n    xmlns:android=\"http://schemas.android.com/apk/res/android\" >\n\n    <LinearLayout\n        android:orientation=\"vertical\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"40dp\">\n\n        <View\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"0.5dp\"\n            android:background=\"@color/dividingLine\"/>\n\n        <FrameLayout\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"match_parent\">\n\n            <TextView\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:layout_marginStart=\"20dp\"\n                android:layout_gravity=\"center_vertical\"\n                android:text=\"推荐的\"\n                android:textSize=\"18sp\" />\n        </FrameLayout>\n\n    </LinearLayout>\n</layout>\n"
  },
  {
    "path": "app/src/main/res/layout/test.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<layout>\n\n    <LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        android:orientation=\"vertical\" android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\">\n\n        <TextView\n            android:id=\"@+id/tv_test\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\" />\n    </LinearLayout>\n</layout>\n"
  },
  {
    "path": "app/src/main/res/layout/test_cardview.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<layout>\n\n    <android.support.constraint.ConstraintLayout\n        xmlns:android=\"http://schemas.android.com/apk/res/android\" android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\">\n\n        <android.support.v7.widget.CardView\n            android:id=\"@+id/cv_test\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"match_parent\">\n\n            <TextView\n                android:id=\"@+id/tv_test\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"match_parent\" />\n        </android.support.v7.widget.CardView>\n    </android.support.constraint.ConstraintLayout>\n</layout>\n"
  },
  {
    "path": "app/src/main/res/layout/video_card.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<layout xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:tools=\"http://schemas.android.com/tools\">\n    <FrameLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n\n        android:id=\"@+id/fl\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\">\n\n        <LinearLayout\n            android:id=\"@+id/ll\"\n            android:orientation=\"vertical\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:background=\"@color/backgroundVideoCard\">\n\n            <android.support.constraint.ConstraintLayout\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"48dp\"\n                android:background=\"@color/backgroundVideoCard\">\n\n                <TextView\n                    android:id=\"@+id/video_title\"\n                    android:layout_width=\"wrap_content\"\n                    android:layout_height=\"match_parent\"\n                    android:layout_marginStart=\"8dp\"\n                    android:padding=\"8dp\"\n                    android:textStyle=\"bold\"\n                    android:gravity=\"center_vertical\"\n                    app:layout_constraintBottom_toBottomOf=\"parent\"\n                    app:layout_constraintStart_toStartOf=\"parent\"\n                    app:layout_constraintTop_toTopOf=\"parent\" />\n\n                <!--\n                <com.example.discover.view.CustomView.LabelView\n                    android:id=\"@+id/lv_type\"\n                    android:layout_width=\"60dp\"\n                    android:layout_height=\"30dp\"\n                    android:layout_marginEnd=\"8dp\"\n                    app:layout_constraintBottom_toBottomOf=\"parent\"\n                    app:layout_constraintEnd_toEndOf=\"parent\"\n                    app:layout_constraintTop_toTopOf=\"parent\"\n                    app:labelTextSize=\"16sp\"\n                    app:labelTextColor=\"@color/lightWhite\"\n                    android:clickable=\"true\"\n                    android:focusable=\"true\"\n                    />-->\n\n                <android.support.v7.widget.CardView\n                    android:id=\"@+id/cv_label\"\n                    android:layout_width=\"wrap_content\"\n                    android:layout_height=\"30dp\"\n                    android:layout_marginEnd=\"8dp\"\n                    app:layout_constraintBottom_toBottomOf=\"parent\"\n                    app:layout_constraintEnd_toEndOf=\"parent\"\n                    app:layout_constraintTop_toTopOf=\"parent\"\n                    app:cardBackgroundColor=\"#ff0000\"\n                    app:cardCornerRadius=\"15dp\"\n                    app:cardElevation=\"5dp\"\n                    >\n\n                    <TextView\n                        android:id=\"@+id/tv_label\"\n                        android:layout_width=\"wrap_content\"\n                        android:layout_height=\"wrap_content\"\n                        android:layout_marginBottom=\"5dp\"\n                        android:layout_marginLeft=\"15dp\"\n                        android:layout_marginRight=\"15dp\"\n                        android:layout_marginTop=\"5dp\"\n                        android:gravity=\"center\"\n                        android:text=\"运动\"\n                        android:textColor=\"#ffffff\"\n                        android:textStyle=\"bold\" />\n                </android.support.v7.widget.CardView>\n\n            </android.support.constraint.ConstraintLayout>\n\n            <cn.jzvd.JZVideoPlayerStandard\n                android:id=\"@+id/jz_video_player\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"200dp\"/>\n            <TextView\n                android:id=\"@+id/video_desc\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:textSize=\"15sp\"\n                android:padding=\"12dp\"\n                />\n            <View\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"0.5dp\"\n                android:background=\"@color/divisionLine\"/>\n            <android.support.constraint.ConstraintLayout\n                android:orientation=\"horizontal\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                >\n\n                <!--\n                <TextView\n                    android:id=\"@+id/tv_video_size\"\n                    android:layout_width=\"wrap_content\"\n                    android:layout_height=\"wrap_content\"\n                    android:layout_marginStart=\"8dp\"\n                    android:textSize=\"12sp\"\n                    android:typeface=\"serif\"\n                    app:layout_constraintBottom_toBottomOf=\"parent\"\n                    app:layout_constraintStart_toStartOf=\"parent\"\n                    app:layout_constraintTop_toTopOf=\"parent\" />-->\n\n                <com.example.discover.view.CustomView.CircleImageView\n                    android:id=\"@+id/head_icon\"\n                    android:layout_width=\"36dp\"\n                    android:layout_height=\"36dp\"\n                    android:layout_marginBottom=\"2dp\"\n                    android:layout_marginStart=\"16dp\"\n                    android:layout_marginTop=\"2dp\"\n                    app:layout_constraintBottom_toBottomOf=\"parent\"\n                    app:layout_constraintStart_toStartOf=\"parent\"\n                    app:layout_constraintTop_toTopOf=\"parent\" />\n\n                <ImageView\n                    android:id=\"@+id/iv_comment\"\n                    android:layout_width=\"40dp\"\n                    android:layout_height=\"40dp\"\n                    android:padding=\"8dp\"\n                    android:layout_marginEnd=\"2dp\"\n                    app:layout_constraintBottom_toBottomOf=\"parent\"\n                    app:layout_constraintEnd_toStartOf=\"@+id/iv_share\"\n                    app:layout_constraintTop_toTopOf=\"parent\"\n                    android:src=\"@drawable/comment\"\n                    android:scaleType=\"centerInside\"\n                    android:focusable=\"true\"\n                    android:clickable=\"true\"\n                    android:background=\"?attr/selectableItemBackground\"/>\n\n                <ImageView\n                    android:id=\"@+id/iv_share\"\n                    android:layout_width=\"40dp\"\n                    android:layout_height=\"40dp\"\n                    android:padding=\"8dp\"\n                    android:layout_marginEnd=\"2dp\"\n                    app:layout_constraintBottom_toBottomOf=\"parent\"\n                    app:layout_constraintEnd_toStartOf=\"@+id/iv_collect\"\n                    app:layout_constraintTop_toTopOf=\"parent\"\n                    android:src=\"@drawable/share\"\n                    android:scaleType=\"centerInside\"\n                    android:focusable=\"true\"\n                    android:clickable=\"true\"\n                    android:background=\"?attr/selectableItemBackground\"/>\n\n                <ImageView\n                    android:id=\"@+id/iv_collect\"\n                    android:layout_width=\"40dp\"\n                    android:layout_height=\"40dp\"\n                    android:padding=\"8dp\"\n                    android:layout_marginEnd=\"8dp\"\n                    app:layout_constraintBottom_toBottomOf=\"parent\"\n                    app:layout_constraintEnd_toEndOf=\"parent\"\n                    app:layout_constraintTop_toTopOf=\"parent\"\n                    android:scaleType=\"centerInside\"\n                    android:src=\"@drawable/collect\"\n                    android:focusable=\"true\"\n                    android:clickable=\"true\"\n                    android:background=\"?attr/selectableItemBackground\"/>\n            </android.support.constraint.ConstraintLayout>\n            <View\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"15dp\"\n                android:background=\"@color/background\"/>\n        </LinearLayout>\n\n    </FrameLayout>\n</layout>\n"
  },
  {
    "path": "app/src/main/res/layout/viewpager_very_image.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<FrameLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:layout_width=\"fill_parent\"\n    android:layout_height=\"fill_parent\"\n    android:background=\"#ff000000\">\n\n    <com.github.chrisbanes.photoview.PhotoView\n        android:id=\"@+id/zoom_image_view\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\" />\n\n\n    <ProgressBar\n        android:id=\"@+id/loading\"\n        android:layout_width=\"30dp\"\n        android:layout_height=\"30dp\"\n        android:layout_gravity=\"center\" />\n\n</FrameLayout>"
  },
  {
    "path": "app/src/main/res/values/attrs.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n\n        <declare-styleable name=\"LabelView\">\n            <attr name=\"labelText\" format=\"string\" />\n            <attr name=\"labelTextColor\" format=\"color\" />\n            <attr name=\"labelTextSize\" format=\"dimension\"/>\n            <attr name=\"labelBackground\" format=\"color\"/>\n        </declare-styleable>\n\n\n    <declare-styleable name=\"CircleImageView\">\n        <attr name=\"civ_border_width\" format=\"dimension\" />\n        <attr name=\"civ_border_color\" format=\"color\" />\n        <attr name=\"civ_border_overlay\" format=\"boolean\" />\n        <attr name=\"civ_fill_color\" format=\"color\" />\n        <attr name=\"civ_circle_background_color\" format=\"color\" />\n    </declare-styleable>\n\n\n</resources>"
  },
  {
    "path": "app/src/main/res/values/colors.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <!-- Theme -->\n    <color name=\"colorPrimary\">#3F51B5</color>\n    <color name=\"colorPrimaryDark\">#303F9F</color>\n    <color name=\"colorAccent\">#FF4081</color>\n    <color name=\"colorBackground\">#383737</color>\n\n\n    <!-- UI Color -->\n    <color name=\"background\">#36465d</color>\n    <color name=\"backgroundDark\">#2f3e53</color>\n    <color name=\"backgroundLight\">#ffffff</color>\n    <color name=\"backgroundVideoCard\">#ffffff</color>\n    <color name=\"divisionLine\">#FFD2CFCF</color>\n    <color name=\"backgroundGray\">#f2f2f2</color>\n    <color name=\"lightWhite\">#FFEEEEEE</color>\n    <color name=\"followLabelText\">#86909E</color>\n    <color name=\"dividingLine\">#c0c2c4</color>\n    <color name=\"pureDark\">#000000</color>\n    <color name=\"textDark\">#2d2d30</color>\n    <color name=\"light_grey\">#fff5f5f5</color>\n\n    <!-- LabelColor -->\n    <color name=\"colorLabelCre\">#a63939</color>\n    <color name=\"colorLabelMusic\">#d47e38</color>\n    <color name=\"colorLabelTravel\">#fac654</color>\n    <color name=\"colorLabelScience\">#bbcf1f</color>\n    <color name=\"colorLabelFunny\">#89f959</color>\n    <color name=\"colorLabelFashion\">#5fe18f</color>\n    <color name=\"colorLabelSport\">#62f5d5</color>\n    <color name=\"colorLabelAnim\">#66bcd9</color>\n    <color name=\"colorLabelAd\">#6599e7</color>\n    <color name=\"colorLabelAppetizing\">#295981</color>\n    <color name=\"colorLabelLife\">#5458cc</color>\n    <color name=\"colorLabelDrama\">#3a4afa</color>\n    <color name=\"colorLabelNotice\">#7e4cd4</color>\n    <color name=\"colorLabelHigh\">#af2ec2</color>\n    <color name=\"colorLabelRecord\">#ca73d4</color>\n    <color name=\"colorLabelGame\">#98cf78</color>\n    <color name=\"colorLabelPet\">#e64570</color>\n    <color name=\"colorLabelVariety\">#e76fc7</color>\n    <color name=\"colorLabelDefault\">#ffffff</color>\n\n    <!-- XMenu Background -->\n    <color name=\"background1\">#1c574c</color>\n    <color name=\"background2\">#00d21c</color>\n    <color name=\"background3\">#eabf3b</color>\n    <color name=\"background4\">#e13f0e</color>\n    <color name=\"background5\">#1068ea</color>\n    <color name=\"background6\">#7f08e7</color>\n\n</resources>\n"
  },
  {
    "path": "app/src/main/res/values/dimens.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <dimen name=\"xMenuMarginRight\">20dp</dimen>\n    <dimen name=\"xMenuMarginBottom\">70dp</dimen>\n</resources>"
  },
  {
    "path": "app/src/main/res/values/strings.xml",
    "content": "<resources>\n    <string name=\"app_name\">Discover</string>\n    <string name=\"action_share\">分享给朋友</string>\n    <string name=\"share_from\">（来自Discover(开眼视频)）</string>\n    <string name=\"searchHint\">  搜索开眼视频</string>\n    <string name=\"followLabel\">你关注的标签</string>\n    <string name=\"videoRecommend\">推荐的视频作者</string>\n    <string name=\"homePageEnter\">进入主页</string>\n    <string name=\"noComment\">暂无评论</string>\n\n    <string name=\"transition_shot\">backdrop</string>\n    <string name=\"transition_shot_background\">transition_shot_background</string>\n\n    <string name=\"heart_full_path_24dp\">M12,21 L10.695,19.853406 C6.06,15.7771117 3,13.0871935 3,9.79564033 C3,7.10572207 5.1735,5 7.95,5 C9.516,5 11.019,5.70626703 12,6.81798365 C12.981,5.70626703 14.484,5 16.05,5 C18.8265,5 21,7.10572207 21,9.79564033 C21,13.0871935 17.94,15.7771117 13.305,19.853406 L12,21 L12,21 Z</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.NoActionBar\">\n        <!-- Customize your theme here. -->\n        <item name=\"colorPrimary\">@color/background</item>\n        <item name=\"colorPrimaryDark\">@color/background</item>\n        <item name=\"colorAccent\">@color/colorAccent</item>\n    </style>\n\n    <style name=\"LightTheme\" parent=\"Theme.AppCompat.Light.NoActionBar\">\n        <item name=\"colorPrimary\">@color/backgroundLight</item>\n        <item name=\"colorPrimaryDark\">@color/lightWhite</item>\n        <item name=\"colorAccent\">@color/colorLabelAd</item>\n\n    </style>\n    <!-- popupWindow的动画式样 -->\n    <style name=\"AnimationFadeLT\">\n        <item name=\"android:windowEnterAnimation\">@anim/fade_in_lt</item>\n        <item name=\"android:windowExitAnimation\">@anim/fade_out_rb</item>\n    </style>\n    <style name=\"AnimationFadeRT\">\n        <item name=\"android:windowEnterAnimation\">@anim/fade_in_rt</item>\n        <item name=\"android:windowExitAnimation\">@anim/fade_out_lb</item>\n    </style>\n    <style name=\"AnimationFadeBT\">\n        <item name=\"android:windowEnterAnimation\">@anim/fade_in_bottom</item>\n        <item name=\"android:windowExitAnimation\">@anim/fade_out_top</item>\n    </style>\n    <style name=\"MyTabLayoutTextAppearance\" parent=\"TextAppearance.AppCompat.Widget.ActionBar.Title\">\n        <item name=\"android:textSize\">16sp</item>\n        <item name=\"android:textColor\">@color/lightWhite</item>\n        <item name=\"android:textStyle\">bold</item>\n    </style>\n\n    <style name=\"LightToolbar\" parent=\"Widget.AppCompat.Toolbar\">\n        <item name=\"theme\">@style/LightToolbarThemeOverlay</item>\n        <item name=\"popupTheme\">@style/ThemeOverlay.AppCompat.Light</item>\n        <item name=\"titleTextColor\">@android:color/black</item>\n    </style>\n\n    <style name=\"LightToolbarThemeOverlay\" parent=\"Widget.AppCompat.ActionBar\">\n        <item name=\"android:colorControlNormal\">@android:color/black</item>\n    </style>\n</resources>\n"
  },
  {
    "path": "app/src/main/res/values-v21/dimens.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n\n\n</resources>"
  },
  {
    "path": "app/src/main/res/values-v21/styles.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n\n    <style name=\"LightToolbarThemeOverlay\" parent=\"Widget.AppCompat.ActionBar\">\n        <item name=\"android:colorControlNormal\">@android:color/black</item>\n    </style>\n\n    <style name=\"LightTheme\" parent=\"Theme.AppCompat.Light.NoActionBar\">\n        <item name=\"colorPrimary\">@color/backgroundLight</item>\n        <item name=\"colorPrimaryDark\">@color/lightWhite</item>\n        <item name=\"colorAccent\">@color/colorLabelAd</item>\n        <item name=\"android:windowContentTransitions\">true</item>\n\n    </style>\n</resources>"
  },
  {
    "path": "app/src/test/java/com/example/discover/ExampleUnitTest.java",
    "content": "package com.example.discover;\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        google()\n    }\n    dependencies {\n        classpath 'com.android.tools.build:gradle:3.0.1'\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        google()\n        maven { url \"https://jitpack.io\" }\n    }\n}\n\ntask clean(type: Delete) {\n    delete rootProject.buildDir\n}\n"
  },
  {
    "path": "gradle/wrapper/gradle-wrapper.properties",
    "content": "#Mon Dec 18 15:30:27 CST 2017\ndistributionBase=GRADLE_USER_HOME\ndistributionPath=wrapper/dists\nzipStoreBase=GRADLE_USER_HOME\nzipStorePath=wrapper/dists\ndistributionUrl=https\\://services.gradle.org/distributions/gradle-4.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": "librarys/http/.gitignore",
    "content": "/build\n"
  },
  {
    "path": "librarys/http/build.gradle",
    "content": "apply plugin: 'com.android.library'\n\nandroid {\n    compileSdkVersion 24\n    buildToolsVersion '26.0.2'\n\n    defaultConfig {\n        minSdkVersion 15\n        targetSdkVersion 26\n        versionCode 1\n        versionName \"1.0\"\n\n        testInstrumentationRunner \"android.support.test.runner.AndroidJUnitRunner\"\n\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(include: ['*.jar'], dir: 'libs')\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:26.+'\n    compile 'com.squareup.retrofit2:retrofit:2.3.0'\n    compile 'com.squareup.retrofit2:converter-gson:2.3.0'\n    compile 'com.squareup.retrofit2:adapter-rxjava2:2.3.0'\n    //compile 'io.reactivex:rxandroid:1.2.1'\n    //compile 'io.reactivex:rxjava:1.2.1'\n    compile 'io.reactivex.rxjava2:rxandroid:2.0.1'\n    compile 'io.reactivex.rxjava2:rxjava:2.0.7'\n    compile 'com.squareup.okhttp3:logging-interceptor:3.4.1'\n    testCompile 'junit:junit:4.12'\n}\n"
  },
  {
    "path": "librarys/http/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 G:\\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": "librarys/http/src/androidTest/java/com/example/http/ExampleInstrumentedTest.java",
    "content": "package com.example.http;\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.example.http.test\", appContext.getPackageName());\n    }\n}\n"
  },
  {
    "path": "librarys/http/src/main/AndroidManifest.xml",
    "content": "<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n\n    package=\"com.example.http\">\n\n    <application android:allowBackup=\"true\" android:label=\"@string/app_name\"\n        android:supportsRtl=\"true\">\n\n    </application>\n\n</manifest>\n"
  },
  {
    "path": "librarys/http/src/main/java/com/example/http/HttpUtils.java",
    "content": "package com.example.http;\n\nimport android.content.Context;\n\nimport java.security.SecureRandom;\nimport java.security.cert.CertificateException;\nimport java.security.cert.X509Certificate;\nimport java.util.concurrent.TimeUnit;\n\nimport javax.net.ssl.HostnameVerifier;\nimport javax.net.ssl.SSLContext;\nimport javax.net.ssl.SSLSession;\nimport javax.net.ssl.SSLSocketFactory;\nimport javax.net.ssl.TrustManager;\nimport javax.net.ssl.X509TrustManager;\n\nimport okhttp3.OkHttpClient;\nimport okhttp3.logging.HttpLoggingInterceptor;\nimport retrofit2.Retrofit;\nimport retrofit2.adapter.rxjava2.RxJava2CallAdapterFactory;\nimport retrofit2.converter.gson.GsonConverterFactory;\n\n/**\n * Created by Administrator on 2017/12/9 0009.\n */\n\npublic class HttpUtils {\n    private static HttpUtils instance ;\n\n    private boolean debug;\n    private Context context;\n    private Object eyeHttp;\n    private Object gankHttp;\n    //天眼API\n    private String EYE_API = \"http://baobab.kaiyanapp.com/api/\";\n    //干货API\n    private final static String API_GANKIO = \"https://gank.io/api/\";\n\n\n    public static HttpUtils getInstance() {\n        if (instance == null) {\n            synchronized (HttpUtils.class) {\n                if (instance == null) {\n                    return new HttpUtils();\n                }\n            }\n\n        }\n        return instance;\n    }\n\n    public <T> T getEyeServer(Class<T> a) {\n        if (eyeHttp == null) {\n            synchronized (HttpUtils.class) {\n                if (eyeHttp == null) {\n                    return getBuilder(EYE_API).build().create(a);\n                }\n            }\n        }\n        return (T) eyeHttp;\n    }\n\n    public <T> T getGankServer(Class<T> a) {\n        if (gankHttp == null) {\n            synchronized (HttpUtils.class) {\n                if (gankHttp == null) {\n                    return  getBuilder(API_GANKIO).build().create(a);\n                }\n            }\n        }\n\n        return (T) gankHttp;\n    }\n    public  void init(Context context, boolean debug) {\n        this.debug = debug;\n        this.context = context;\n    }\n\n    public Retrofit.Builder getBuilder(String url) {\n        Retrofit.Builder builder = new Retrofit.Builder()\n                .baseUrl(url)\n                .client(getClient())\n                .addCallAdapterFactory(RxJava2CallAdapterFactory.create())\n                .addConverterFactory(GsonConverterFactory.create());\n        return builder;\n    }\n\n    public OkHttpClient getClient() {\n        OkHttpClient client = new OkHttpClient();\n        client = getUnsafeOkHttpClient();\n        return client;\n    }\n\n    /**\n     * https请求由于证书验证问题,直接请求一般都会失败.\n     * 一般是做证书验证处理或者忽略证书验证\n     * 这里采用后者\n     */\n    public OkHttpClient getUnsafeOkHttpClient() {\n        try {\n            final TrustManager[] trustAllCerts = new TrustManager[]{new X509TrustManager() {\n                @Override\n                public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {\n                }\n\n                @Override\n                public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {\n                }\n\n                @Override\n                public X509Certificate[] getAcceptedIssuers() {\n                    return new X509Certificate[]{};\n                }\n            }};\n            // Install the all-trusting trust manager\n            SSLContext sslContext = SSLContext.getInstance(\"TLS\");\n            sslContext.init(null, trustAllCerts, new SecureRandom());\n            // Create an ssl socket factory with our all-trusting manager\n            SSLSocketFactory sslSocketFactory = sslContext.getSocketFactory();\n            OkHttpClient.Builder okBuilder = new OkHttpClient.Builder();\n            okBuilder.readTimeout(20, TimeUnit.SECONDS);\n            okBuilder.connectTimeout(10, TimeUnit.SECONDS);\n            okBuilder.writeTimeout(20, TimeUnit.SECONDS);\n            okBuilder.addInterceptor(getInterceptor());\n            okBuilder.sslSocketFactory(sslSocketFactory);\n            okBuilder.hostnameVerifier(new HostnameVerifier() {\n                @Override\n                public boolean verify(String hostname, SSLSession session) {\n                    return true;\n                }\n            });\n\n            return okBuilder.build();\n        } catch (Exception e) {\n            throw new RuntimeException(e);\n        }\n    }\n\n    private HttpLoggingInterceptor getInterceptor() {\n        HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor();\n        /*if (debug) {\n            interceptor.setLevel(HttpLoggingInterceptor.Level.BODY); // 测试\n        } else {\n            interceptor.setLevel(HttpLoggingInterceptor.Level.NONE); // 打包\n        }*/\n        interceptor.setLevel(HttpLoggingInterceptor.Level.BODY);\n        return interceptor;\n    }\n}\n"
  },
  {
    "path": "librarys/http/src/main/res/values/strings.xml",
    "content": "<resources>\n    <string name=\"app_name\">http</string>\n</resources>\n"
  },
  {
    "path": "librarys/http/src/test/java/com/example/http/ExampleUnitTest.java",
    "content": "package com.example.http;\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": "librarys/jiaozivideoplayer/.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": "librarys/jiaozivideoplayer/.idea/copyright/profiles_settings.xml",
    "content": "<component name=\"CopyrightManager\">\n  <settings default=\"\" />\n</component>"
  },
  {
    "path": "librarys/jiaozivideoplayer/.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=\"externalProjectPath\" value=\"$PROJECT_DIR$\" />\n        <option name=\"resolveModulePerSourceSet\" value=\"false\" />\n      </GradleProjectSettings>\n    </option>\n  </component>\n</project>"
  },
  {
    "path": "librarys/jiaozivideoplayer/.idea/misc.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"ProjectRootManager\" version=\"2\" assert-keyword=\"false\" jdk-15=\"false\">\n    <output url=\"file://$PROJECT_DIR$/build/classes\" />\n  </component>\n  <component name=\"ProjectType\">\n    <option name=\"id\" value=\"Android\" />\n  </component>\n</project>"
  },
  {
    "path": "librarys/jiaozivideoplayer/.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$/jiaozivideoplayer.iml\" filepath=\"$PROJECT_DIR$/jiaozivideoplayer.iml\" />\n    </modules>\n  </component>\n</project>"
  },
  {
    "path": "librarys/jiaozivideoplayer/.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": "librarys/jiaozivideoplayer/.idea/workspace.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"ChangeListManager\">\n    <list default=\"true\" id=\"fb4be3aa-e564-4499-aecd-68161c110b6e\" name=\"Default\" comment=\"\" />\n    <ignored path=\"jiaozivideoplayer.iws\" />\n    <ignored path=\".idea/workspace.xml\" />\n    <ignored path=\"$PROJECT_DIR$/build/classes/\" />\n    <option name=\"EXCLUDED_CONVERTED_TO_IGNORED\" value=\"true\" />\n    <option name=\"TRACKING_ENABLED\" value=\"true\" />\n    <option name=\"SHOW_DIALOG\" value=\"false\" />\n    <option name=\"HIGHLIGHT_CONFLICTS\" value=\"true\" />\n    <option name=\"HIGHLIGHT_NON_ACTIVE_CHANGELIST\" value=\"false\" />\n    <option name=\"LAST_RESOLUTION\" value=\"IGNORE\" />\n  </component>\n  <component name=\"CreatePatchCommitExecutor\">\n    <option name=\"PATCH_PATH\" value=\"\" />\n  </component>\n  <component name=\"ExecutionTargetManager\" SELECTED_TARGET=\"default_target\" />\n  <component name=\"ExternalProjectsManager\">\n    <system id=\"GRADLE\">\n      <state>\n        <projects_view />\n      </state>\n    </system>\n  </component>\n  <component name=\"FavoritesManager\">\n    <favorites_list name=\"jiaozivideoplayer\" />\n  </component>\n  <component name=\"GradleLocalSettings\">\n    <option name=\"externalProjectsViewState\">\n      <projects_view />\n    </option>\n  </component>\n  <component name=\"ProjectFrameBounds\">\n    <option name=\"x\" value=\"-8\" />\n    <option name=\"y\" value=\"-8\" />\n    <option name=\"width\" value=\"1932\" />\n    <option name=\"height\" value=\"1056\" />\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=\"RunManager\">\n    <configuration default=\"true\" type=\"Application\" factoryName=\"Application\">\n      <extension name=\"coverage\" enabled=\"false\" merge=\"false\" sample_coverage=\"true\" runner=\"idea\" />\n      <option name=\"MAIN_CLASS_NAME\" />\n      <option name=\"VM_PARAMETERS\" />\n      <option name=\"PROGRAM_PARAMETERS\" />\n      <option name=\"WORKING_DIRECTORY\" value=\"$PROJECT_DIR$\" />\n      <option name=\"ALTERNATIVE_JRE_PATH_ENABLED\" value=\"false\" />\n      <option name=\"ALTERNATIVE_JRE_PATH\" />\n      <option name=\"ENABLE_SWING_INSPECTOR\" value=\"false\" />\n      <option name=\"ENV_VARIABLES\" />\n      <option name=\"PASS_PARENT_ENVS\" value=\"true\" />\n      <module name=\"\" />\n      <envs />\n      <method />\n    </configuration>\n    <configuration default=\"true\" type=\"Remote\" factoryName=\"Remote\">\n      <option name=\"USE_SOCKET_TRANSPORT\" value=\"true\" />\n      <option name=\"SERVER_MODE\" value=\"false\" />\n      <option name=\"SHMEM_ADDRESS\" value=\"javadebug\" />\n      <option name=\"HOST\" value=\"localhost\" />\n      <option name=\"PORT\" value=\"5005\" />\n      <method />\n    </configuration>\n    <configuration default=\"true\" type=\"TestNG\" factoryName=\"TestNG\">\n      <extension name=\"coverage\" enabled=\"false\" merge=\"false\" sample_coverage=\"true\" runner=\"idea\" />\n      <module name=\"\" />\n      <option name=\"ALTERNATIVE_JRE_PATH_ENABLED\" value=\"false\" />\n      <option name=\"ALTERNATIVE_JRE_PATH\" />\n      <option name=\"SUITE_NAME\" />\n      <option name=\"PACKAGE_NAME\" />\n      <option name=\"MAIN_CLASS_NAME\" />\n      <option name=\"METHOD_NAME\" />\n      <option name=\"GROUP_NAME\" />\n      <option name=\"TEST_OBJECT\" value=\"CLASS\" />\n      <option name=\"VM_PARAMETERS\" value=\"-ea\" />\n      <option name=\"PARAMETERS\" />\n      <option name=\"WORKING_DIRECTORY\" value=\"$MODULE_DIR$\" />\n      <option name=\"OUTPUT_DIRECTORY\" />\n      <option name=\"ANNOTATION_TYPE\" />\n      <option name=\"ENV_VARIABLES\" />\n      <option name=\"PASS_PARENT_ENVS\" value=\"true\" />\n      <option name=\"TEST_SEARCH_SCOPE\">\n        <value defaultName=\"singleModule\" />\n      </option>\n      <option name=\"USE_DEFAULT_REPORTERS\" value=\"false\" />\n      <option name=\"PROPERTIES_FILE\" />\n      <envs />\n      <properties />\n      <listeners />\n      <method />\n    </configuration>\n    <configuration name=\"&lt;template&gt;\" type=\"Applet\" default=\"true\" selected=\"false\">\n      <option name=\"MAIN_CLASS_NAME\" />\n      <option name=\"HTML_FILE_NAME\" />\n      <option name=\"HTML_USED\" value=\"false\" />\n      <option name=\"WIDTH\" value=\"400\" />\n      <option name=\"HEIGHT\" value=\"300\" />\n      <option name=\"POLICY_FILE\" value=\"$APPLICATION_HOME_DIR$/bin/appletviewer.policy\" />\n      <option name=\"VM_PARAMETERS\" />\n    </configuration>\n    <configuration name=\"&lt;template&gt;\" type=\"JUnit\" default=\"true\" selected=\"false\">\n      <option name=\"MAIN_CLASS_NAME\" />\n      <option name=\"VM_PARAMETERS\" value=\"-ea\" />\n      <option name=\"PARAMETERS\" />\n      <option name=\"WORKING_DIRECTORY\" value=\"$MODULE_DIR$\" />\n    </configuration>\n    <configuration name=\"&lt;template&gt;\" type=\"#org.jetbrains.idea.devkit.run.PluginConfigurationType\" default=\"true\" selected=\"false\">\n      <option name=\"VM_PARAMETERS\" value=\"-Xmx512m -Xms256m -XX:MaxPermSize=250m -ea\" />\n    </configuration>\n  </component>\n  <component name=\"ShelveChangesManager\" show_recycled=\"false\">\n    <option name=\"remove_strategy\" value=\"false\" />\n  </component>\n  <component name=\"TaskManager\">\n    <task active=\"true\" id=\"Default\" summary=\"Default task\">\n      <changelist id=\"fb4be3aa-e564-4499-aecd-68161c110b6e\" name=\"Default\" comment=\"\" />\n      <created>1512987845548</created>\n      <option name=\"number\" value=\"Default\" />\n      <option name=\"presentableId\" value=\"Default\" />\n      <updated>1512987845548</updated>\n    </task>\n    <servers />\n  </component>\n  <component name=\"ToolWindowManager\">\n    <frame x=\"-8\" y=\"-8\" width=\"1932\" height=\"1056\" extended-state=\"0\" />\n    <editor active=\"false\" />\n    <layout>\n      <window_info id=\"TODO\" active=\"false\" anchor=\"bottom\" auto_hide=\"false\" internal_type=\"DOCKED\" type=\"DOCKED\" visible=\"false\" show_stripe_button=\"true\" weight=\"0.33\" sideWeight=\"0.5\" order=\"6\" side_tool=\"false\" content_ui=\"tabs\" />\n      <window_info id=\"Messages\" active=\"true\" anchor=\"bottom\" auto_hide=\"false\" internal_type=\"DOCKED\" type=\"DOCKED\" visible=\"true\" show_stripe_button=\"true\" weight=\"0.32998884\" sideWeight=\"0.5\" order=\"-1\" side_tool=\"false\" content_ui=\"tabs\" />\n      <window_info id=\"Build Variants\" active=\"false\" anchor=\"left\" auto_hide=\"false\" internal_type=\"DOCKED\" type=\"DOCKED\" visible=\"false\" show_stripe_button=\"true\" weight=\"0.33\" sideWeight=\"0.5\" order=\"-1\" side_tool=\"true\" content_ui=\"tabs\" />\n      <window_info id=\"Image Layers\" active=\"false\" anchor=\"left\" auto_hide=\"false\" internal_type=\"DOCKED\" type=\"DOCKED\" visible=\"false\" show_stripe_button=\"true\" weight=\"0.33\" sideWeight=\"0.5\" order=\"-1\" side_tool=\"false\" content_ui=\"tabs\" />\n      <window_info id=\"Capture Analysis\" active=\"false\" anchor=\"right\" auto_hide=\"false\" internal_type=\"DOCKED\" type=\"DOCKED\" visible=\"false\" show_stripe_button=\"true\" weight=\"0.33\" sideWeight=\"0.5\" order=\"-1\" side_tool=\"false\" content_ui=\"tabs\" />\n      <window_info id=\"Event Log\" active=\"false\" anchor=\"bottom\" auto_hide=\"false\" internal_type=\"DOCKED\" type=\"DOCKED\" visible=\"false\" show_stripe_button=\"true\" weight=\"0.33\" sideWeight=\"0.5\" order=\"-1\" side_tool=\"true\" content_ui=\"tabs\" />\n      <window_info id=\"Android Monitor\" active=\"false\" anchor=\"bottom\" auto_hide=\"false\" internal_type=\"DOCKED\" type=\"DOCKED\" visible=\"false\" show_stripe_button=\"true\" weight=\"0.33\" sideWeight=\"0.5\" order=\"-1\" side_tool=\"false\" content_ui=\"tabs\" />\n      <window_info id=\"Run\" active=\"false\" anchor=\"bottom\" auto_hide=\"false\" internal_type=\"DOCKED\" type=\"DOCKED\" visible=\"false\" show_stripe_button=\"true\" weight=\"0.33\" sideWeight=\"0.5\" order=\"2\" side_tool=\"false\" content_ui=\"tabs\" />\n      <window_info id=\"Version Control\" active=\"false\" anchor=\"bottom\" auto_hide=\"false\" internal_type=\"DOCKED\" type=\"DOCKED\" visible=\"false\" show_stripe_button=\"true\" weight=\"0.33\" sideWeight=\"0.5\" order=\"-1\" side_tool=\"false\" content_ui=\"tabs\" />\n      <window_info id=\"Terminal\" active=\"false\" anchor=\"bottom\" auto_hide=\"false\" internal_type=\"DOCKED\" type=\"DOCKED\" visible=\"false\" show_stripe_button=\"true\" weight=\"0.33\" sideWeight=\"0.5\" order=\"-1\" side_tool=\"false\" content_ui=\"tabs\" />\n      <window_info id=\"Captures\" active=\"false\" anchor=\"left\" auto_hide=\"false\" internal_type=\"DOCKED\" type=\"DOCKED\" visible=\"false\" show_stripe_button=\"true\" weight=\"0.25\" sideWeight=\"0.5\" order=\"2\" side_tool=\"false\" content_ui=\"tabs\" />\n      <window_info id=\"Capture Tool\" active=\"false\" anchor=\"left\" auto_hide=\"false\" internal_type=\"DOCKED\" type=\"DOCKED\" visible=\"false\" show_stripe_button=\"true\" weight=\"0.33\" sideWeight=\"0.5\" order=\"-1\" side_tool=\"false\" content_ui=\"tabs\" />\n      <window_info id=\"Gradle Console\" active=\"false\" anchor=\"bottom\" auto_hide=\"false\" internal_type=\"DOCKED\" type=\"DOCKED\" visible=\"false\" show_stripe_button=\"true\" weight=\"0.33\" sideWeight=\"0.5\" order=\"-1\" side_tool=\"true\" content_ui=\"tabs\" />\n      <window_info id=\"Project\" active=\"false\" anchor=\"left\" auto_hide=\"false\" internal_type=\"DOCKED\" type=\"DOCKED\" visible=\"false\" show_stripe_button=\"true\" weight=\"0.25\" sideWeight=\"0.5\" order=\"0\" side_tool=\"false\" content_ui=\"combo\" />\n      <window_info id=\"Gradle\" active=\"false\" anchor=\"right\" auto_hide=\"false\" internal_type=\"DOCKED\" type=\"DOCKED\" visible=\"false\" show_stripe_button=\"true\" weight=\"0.33\" sideWeight=\"0.5\" order=\"-1\" side_tool=\"false\" content_ui=\"tabs\" />\n      <window_info id=\"Structure\" active=\"false\" anchor=\"left\" auto_hide=\"false\" internal_type=\"DOCKED\" type=\"DOCKED\" visible=\"false\" show_stripe_button=\"true\" weight=\"0.25\" sideWeight=\"0.5\" order=\"1\" side_tool=\"false\" content_ui=\"tabs\" />\n      <window_info id=\"Android Model\" active=\"false\" anchor=\"right\" auto_hide=\"false\" internal_type=\"DOCKED\" type=\"DOCKED\" visible=\"false\" show_stripe_button=\"true\" weight=\"0.33\" sideWeight=\"0.5\" order=\"-1\" side_tool=\"true\" content_ui=\"tabs\" />\n      <window_info id=\"Theme Preview\" active=\"false\" anchor=\"right\" auto_hide=\"false\" internal_type=\"DOCKED\" type=\"DOCKED\" visible=\"false\" show_stripe_button=\"true\" weight=\"0.33\" sideWeight=\"0.5\" order=\"-1\" side_tool=\"false\" content_ui=\"tabs\" />\n      <window_info id=\"Debug\" active=\"false\" anchor=\"bottom\" auto_hide=\"false\" internal_type=\"DOCKED\" type=\"DOCKED\" visible=\"false\" show_stripe_button=\"true\" weight=\"0.4\" sideWeight=\"0.5\" order=\"3\" side_tool=\"false\" content_ui=\"tabs\" />\n      <window_info id=\"Favorites\" active=\"false\" anchor=\"left\" auto_hide=\"false\" internal_type=\"DOCKED\" type=\"DOCKED\" visible=\"false\" show_stripe_button=\"true\" weight=\"0.33\" sideWeight=\"0.5\" order=\"-1\" side_tool=\"true\" content_ui=\"tabs\" />\n      <window_info id=\"Cvs\" active=\"false\" anchor=\"bottom\" auto_hide=\"false\" internal_type=\"DOCKED\" type=\"DOCKED\" visible=\"false\" show_stripe_button=\"true\" weight=\"0.25\" sideWeight=\"0.5\" order=\"4\" side_tool=\"false\" content_ui=\"tabs\" />\n      <window_info id=\"Message\" active=\"false\" anchor=\"bottom\" auto_hide=\"false\" internal_type=\"DOCKED\" type=\"DOCKED\" visible=\"false\" show_stripe_button=\"true\" weight=\"0.33\" sideWeight=\"0.5\" order=\"0\" side_tool=\"false\" content_ui=\"tabs\" />\n      <window_info id=\"Commander\" active=\"false\" anchor=\"right\" auto_hide=\"false\" internal_type=\"DOCKED\" type=\"DOCKED\" visible=\"false\" show_stripe_button=\"true\" weight=\"0.4\" sideWeight=\"0.5\" order=\"0\" side_tool=\"false\" content_ui=\"tabs\" />\n      <window_info id=\"Inspection\" active=\"false\" anchor=\"bottom\" auto_hide=\"false\" internal_type=\"DOCKED\" type=\"DOCKED\" visible=\"false\" show_stripe_button=\"true\" weight=\"0.4\" sideWeight=\"0.5\" order=\"5\" side_tool=\"false\" content_ui=\"tabs\" />\n      <window_info id=\"Hierarchy\" active=\"false\" anchor=\"right\" auto_hide=\"false\" internal_type=\"DOCKED\" type=\"DOCKED\" visible=\"false\" show_stripe_button=\"true\" weight=\"0.25\" sideWeight=\"0.5\" order=\"2\" side_tool=\"false\" content_ui=\"combo\" />\n      <window_info id=\"Find\" active=\"false\" anchor=\"bottom\" auto_hide=\"false\" internal_type=\"DOCKED\" type=\"DOCKED\" visible=\"false\" show_stripe_button=\"true\" weight=\"0.33\" sideWeight=\"0.5\" order=\"1\" side_tool=\"false\" content_ui=\"tabs\" />\n      <window_info id=\"Ant Build\" active=\"false\" anchor=\"right\" auto_hide=\"false\" internal_type=\"DOCKED\" type=\"DOCKED\" visible=\"false\" show_stripe_button=\"true\" weight=\"0.25\" sideWeight=\"0.5\" order=\"1\" side_tool=\"false\" content_ui=\"tabs\" />\n    </layout>\n  </component>\n  <component name=\"Vcs.Log.UiProperties\">\n    <option name=\"RECENTLY_FILTERED_USER_GROUPS\">\n      <collection />\n    </option>\n    <option name=\"RECENTLY_FILTERED_BRANCH_GROUPS\">\n      <collection />\n    </option>\n  </component>\n  <component name=\"VcsContentAnnotationSettings\">\n    <option name=\"myLimit\" value=\"2678400000\" />\n  </component>\n  <component name=\"XDebuggerManager\">\n    <breakpoint-manager />\n    <watches-manager />\n  </component>\n</project>"
  },
  {
    "path": "librarys/jiaozivideoplayer/build.gradle",
    "content": "apply plugin: 'com.android.library'\n\nandroid {\n    compileSdkVersion 26\n    buildToolsVersion '26.0.2'\n\n    defaultConfig {\n        minSdkVersion 16\n        targetSdkVersion 26\n        versionCode 1\n        versionName \"1.0\"\n    }\n    buildTypes {\n        release {\n            minifyEnabled false\n            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'\n        }\n    }\n    lintOptions {\n        abortOnError false\n    }\n}\n\ndependencies {\n\n    testCompile 'junit:junit:4.12'\n    compile 'com.android.support:appcompat-v7:26.+'\n}\n\n\n"
  },
  {
    "path": "librarys/jiaozivideoplayer/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/Nathen/WorkEnv/android-sdk-macosx/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": "librarys/jiaozivideoplayer/src/androidTest/java/cn/jzvd/ApplicationTest.java",
    "content": "package cn.jzvd;\n\nimport android.app.Application;\nimport android.test.ApplicationTestCase;\n\n/**\n * <a href=\"http://d.android.com/tools/testing/testing_android.html\">Testing Fundamentals</a>\n */\npublic class ApplicationTest extends ApplicationTestCase<Application> {\n    public ApplicationTest() {\n        super(Application.class);\n    }\n}\n"
  },
  {
    "path": "librarys/jiaozivideoplayer/src/main/AndroidManifest.xml",
    "content": "<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    package=\"cn.jzvd\">\n\n    <uses-permission android:name=\"android.permission.ACCESS_NETWORK_STATE\" />\n\n</manifest>"
  },
  {
    "path": "librarys/jiaozivideoplayer/src/main/java/cn/jzvd/JZMediaInterface.java",
    "content": "package cn.jzvd;\n\nimport android.view.Surface;\n\n/**\n * Created by Nathen on 2017/11/7.\n * 自定义播放器\n */\npublic abstract class JZMediaInterface {\n\n    public Object currentDataSource;//正在播放的当前url或uri\n    /**\n     * 第一个是url的map\n     * 第二个是loop\n     * 第三个是header\n     * 第四个是context\n     */\n    public Object[] dataSourceObjects;//包含了地址的map（多分辨率用），context，loop，header等\n\n    public abstract void start();\n\n    public abstract void prepare();\n\n    public abstract void pause();\n\n    public abstract boolean isPlaying();\n\n    public abstract void seekTo(long time);\n\n    public abstract void release();\n\n    public abstract long getCurrentPosition();\n\n    public abstract long getDuration();\n\n    public abstract void setSurface(Surface surface);\n}\n"
  },
  {
    "path": "librarys/jiaozivideoplayer/src/main/java/cn/jzvd/JZMediaManager.java",
    "content": "package cn.jzvd;\n\nimport android.graphics.SurfaceTexture;\nimport android.os.Handler;\nimport android.os.HandlerThread;\nimport android.os.Looper;\nimport android.os.Message;\nimport android.util.Log;\nimport android.view.Surface;\nimport android.view.TextureView;\n\n/**\n * 这个类用来和jzvd互相调用，当jzvd需要调用Media的时候调用这个类，当MediaPlayer有回调的时候，通过这个类回调JZVD\n * Created by Nathen on 2017/11/18.\n */\npublic class JZMediaManager implements TextureView.SurfaceTextureListener {\n\n    public static final String TAG = \"JiaoZiVideoPlayer\";\n    public static final int HANDLER_PREPARE = 0;\n    public static final int HANDLER_RELEASE = 2;\n\n    public static JZResizeTextureView textureView;\n    public static SurfaceTexture savedSurfaceTexture;\n    public static Surface surface;\n    public static JZMediaManager jzMediaManager;\n    public int positionInList = -1;\n    public JZMediaInterface jzMediaInterface;\n    public int currentVideoWidth = 0;\n    public int currentVideoHeight = 0;\n\n    public HandlerThread mMediaHandlerThread;\n    public MediaHandler mMediaHandler;\n    public Handler mainThreadHandler;\n\n    public JZMediaManager() {\n        mMediaHandlerThread = new HandlerThread(TAG);\n        mMediaHandlerThread.start();\n        mMediaHandler = new MediaHandler(mMediaHandlerThread.getLooper());\n        mainThreadHandler = new Handler();\n        if (jzMediaInterface == null)\n            jzMediaInterface = new JZMediaSystem();\n    }\n\n    public static JZMediaManager instance() {\n        if (jzMediaManager == null) {\n            jzMediaManager = new JZMediaManager();\n        }\n        return jzMediaManager;\n    }\n\n    public static Object[] getDataSource() {\n        return instance().jzMediaInterface.dataSourceObjects;\n    }\n\n    //这几个方法是不是多余了，为了不让其他地方动MediaInterface的方法\n    public static void setDataSource(Object[] dataSourceObjects) {\n        instance().jzMediaInterface.dataSourceObjects = dataSourceObjects;\n    }\n\n    //正在播放的url或者uri\n    public static Object getCurrentDataSource() {\n        return instance().jzMediaInterface.currentDataSource;\n    }\n\n    public static void setCurrentDataSource(Object currentDataSource) {\n        instance().jzMediaInterface.currentDataSource = currentDataSource;\n    }\n\n    public static long getCurrentPosition() {\n        return instance().jzMediaInterface.getCurrentPosition();\n    }\n\n    public static long getDuration() {\n        return instance().jzMediaInterface.getDuration();\n    }\n\n    public static void seekTo(long time) {\n        instance().jzMediaInterface.seekTo(time);\n    }\n\n    public static void pause() {\n        instance().jzMediaInterface.pause();\n    }\n\n    public static void start() {\n        instance().jzMediaInterface.start();\n    }\n\n    public static boolean isPlaying() {\n        return instance().jzMediaInterface.isPlaying();\n    }\n\n    public void releaseMediaPlayer() {\n        Message msg = new Message();\n        msg.what = HANDLER_RELEASE;\n        mMediaHandler.sendMessage(msg);\n    }\n\n    public void prepare() {\n        releaseMediaPlayer();\n        Message msg = new Message();\n        msg.what = HANDLER_PREPARE;\n        mMediaHandler.sendMessage(msg);\n    }\n\n    @Override\n    public void onSurfaceTextureAvailable(SurfaceTexture surfaceTexture, int i, int i1) {\n        Log.i(TAG, \"onSurfaceTextureAvailable [\" + JZVideoPlayerManager.getCurrentJzvd().hashCode() + \"] \");\n        if (savedSurfaceTexture == null) {\n            savedSurfaceTexture = surfaceTexture;\n            prepare();\n        } else {\n            textureView.setSurfaceTexture(savedSurfaceTexture);\n        }\n    }\n\n    @Override\n    public void onSurfaceTextureSizeChanged(SurfaceTexture surfaceTexture, int i, int i1) {\n\n    }\n\n    @Override\n    public boolean onSurfaceTextureDestroyed(SurfaceTexture surfaceTexture) {\n        return savedSurfaceTexture == null;\n    }\n\n    @Override\n    public void onSurfaceTextureUpdated(SurfaceTexture surfaceTexture) {\n\n    }\n\n\n    public class MediaHandler extends Handler {\n        public MediaHandler(Looper looper) {\n            super(looper);\n        }\n\n        @Override\n        public void handleMessage(Message msg) {\n            super.handleMessage(msg);\n            switch (msg.what) {\n                case HANDLER_PREPARE:\n                    currentVideoWidth = 0;\n                    currentVideoHeight = 0;\n                    jzMediaInterface.prepare();\n                    if (surface != null) {\n                        surface.release();\n                    }\n                    surface = new Surface(savedSurfaceTexture);\n                    jzMediaInterface.setSurface(surface);\n                    break;\n                case HANDLER_RELEASE:\n                    jzMediaInterface.release();\n                    break;\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "librarys/jiaozivideoplayer/src/main/java/cn/jzvd/JZMediaSystem.java",
    "content": "package cn.jzvd;\n\nimport android.media.AudioManager;\nimport android.media.MediaPlayer;\nimport android.view.Surface;\n\nimport java.lang.reflect.Method;\nimport java.util.Map;\n\n/**\n * Created by Nathen on 2017/11/8.\n * 实现系统的播放引擎\n */\npublic class JZMediaSystem extends JZMediaInterface implements MediaPlayer.OnPreparedListener, MediaPlayer.OnCompletionListener, MediaPlayer.OnBufferingUpdateListener, MediaPlayer.OnSeekCompleteListener, MediaPlayer.OnErrorListener, MediaPlayer.OnInfoListener, MediaPlayer.OnVideoSizeChangedListener {\n\n    public MediaPlayer mediaPlayer;\n\n    @Override\n    public void start() {\n        mediaPlayer.start();\n    }\n\n    @Override\n    public void prepare() {\n        try {\n            mediaPlayer = new MediaPlayer();\n            mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);\n            if (dataSourceObjects.length > 1) {\n                mediaPlayer.setLooping((boolean) dataSourceObjects[1]);\n            }\n            mediaPlayer.setOnPreparedListener(JZMediaSystem.this);\n            mediaPlayer.setOnCompletionListener(JZMediaSystem.this);\n            mediaPlayer.setOnBufferingUpdateListener(JZMediaSystem.this);\n            mediaPlayer.setScreenOnWhilePlaying(true);\n            mediaPlayer.setOnSeekCompleteListener(JZMediaSystem.this);\n            mediaPlayer.setOnErrorListener(JZMediaSystem.this);\n            mediaPlayer.setOnInfoListener(JZMediaSystem.this);\n            mediaPlayer.setOnVideoSizeChangedListener(JZMediaSystem.this);\n            Class<MediaPlayer> clazz = MediaPlayer.class;\n            Method method = clazz.getDeclaredMethod(\"setDataSource\", String.class, Map.class);\n            if (dataSourceObjects.length > 2) {\n                method.invoke(mediaPlayer, currentDataSource.toString(), dataSourceObjects[2]);\n            } else {\n                method.invoke(mediaPlayer, currentDataSource.toString(), null);\n            }\n            mediaPlayer.prepareAsync();\n        } catch (Exception e) {\n            e.printStackTrace();\n        }\n    }\n\n    @Override\n    public void pause() {\n        mediaPlayer.pause();\n    }\n\n    @Override\n    public boolean isPlaying() {\n        return mediaPlayer.isPlaying();\n    }\n\n    @Override\n    public void seekTo(long time) {\n        mediaPlayer.seekTo((int) time);\n    }\n\n    @Override\n    public void release() {\n        if (mediaPlayer != null)\n            mediaPlayer.release();\n    }\n\n    @Override\n    public long getCurrentPosition() {\n        return mediaPlayer.getCurrentPosition();\n\n    }\n\n    @Override\n    public long getDuration() {\n        return mediaPlayer.getDuration();\n    }\n\n    @Override\n    public void setSurface(Surface surface) {\n        mediaPlayer.setSurface(surface);\n    }\n\n    @Override\n    public void onPrepared(MediaPlayer mediaPlayer) {\n        mediaPlayer.start();\n        if (currentDataSource.toString().toLowerCase().contains(\"mp3\")) {\n            JZMediaManager.instance().mainThreadHandler.post(new Runnable() {\n                @Override\n                public void run() {\n                    if (JZVideoPlayerManager.getCurrentJzvd() != null) {\n                        JZVideoPlayerManager.getCurrentJzvd().onPrepared();\n                    }\n                }\n            });\n        }\n    }\n\n    @Override\n    public void onCompletion(MediaPlayer mediaPlayer) {\n        JZMediaManager.instance().mainThreadHandler.post(new Runnable() {\n            @Override\n            public void run() {\n                if (JZVideoPlayerManager.getCurrentJzvd() != null) {\n                    JZVideoPlayerManager.getCurrentJzvd().onAutoCompletion();\n                }\n            }\n        });\n    }\n\n    @Override\n    public void onBufferingUpdate(MediaPlayer mediaPlayer, final int percent) {\n        JZMediaManager.instance().mainThreadHandler.post(new Runnable() {\n            @Override\n            public void run() {\n                if (JZVideoPlayerManager.getCurrentJzvd() != null) {\n                    JZVideoPlayerManager.getCurrentJzvd().setBufferProgress(percent);\n                }\n            }\n        });\n    }\n\n    @Override\n    public void onSeekComplete(MediaPlayer mediaPlayer) {\n        JZMediaManager.instance().mainThreadHandler.post(new Runnable() {\n            @Override\n            public void run() {\n                if (JZVideoPlayerManager.getCurrentJzvd() != null) {\n                    JZVideoPlayerManager.getCurrentJzvd().onSeekComplete();\n                }\n            }\n        });\n    }\n\n    @Override\n    public boolean onError(MediaPlayer mediaPlayer, final int what, final int extra) {\n        JZMediaManager.instance().mainThreadHandler.post(new Runnable() {\n            @Override\n            public void run() {\n                if (JZVideoPlayerManager.getCurrentJzvd() != null) {\n                    JZVideoPlayerManager.getCurrentJzvd().onError(what, extra);\n                }\n            }\n        });\n        return true;\n    }\n\n    @Override\n    public boolean onInfo(MediaPlayer mediaPlayer, final int what, final int extra) {\n        JZMediaManager.instance().mainThreadHandler.post(new Runnable() {\n            @Override\n            public void run() {\n                if (JZVideoPlayerManager.getCurrentJzvd() != null) {\n                    if (what == MediaPlayer.MEDIA_INFO_VIDEO_RENDERING_START) {\n                        JZVideoPlayerManager.getCurrentJzvd().onPrepared();\n                    } else {\n                        JZVideoPlayerManager.getCurrentJzvd().onInfo(what, extra);\n                    }\n                }\n            }\n        });\n        return false;\n    }\n\n    @Override\n    public void onVideoSizeChanged(MediaPlayer mediaPlayer, int width, int height) {\n        JZMediaManager.instance().currentVideoWidth = width;\n        JZMediaManager.instance().currentVideoHeight = height;\n        JZMediaManager.instance().mainThreadHandler.post(new Runnable() {\n            @Override\n            public void run() {\n                if (JZVideoPlayerManager.getCurrentJzvd() != null) {\n                    JZVideoPlayerManager.getCurrentJzvd().onVideoSizeChanged();\n                }\n            }\n        });\n    }\n}\n"
  },
  {
    "path": "librarys/jiaozivideoplayer/src/main/java/cn/jzvd/JZResizeTextureView.java",
    "content": "package cn.jzvd;\n\nimport android.content.Context;\nimport android.util.AttributeSet;\nimport android.util.Log;\nimport android.view.TextureView;\nimport android.view.View;\n\n/**\n * <p>参照Android系统的VideoView的onMeasure方法\n * <br>注意!relativelayout中无法全屏，要嵌套一个linearlayout</p>\n * <p>Referring Android system Video View of onMeasure method\n * <br>NOTE! Can not fullscreen relativelayout, to nest a linearlayout</p>\n * Created by Nathen\n * On 2016/06/02 00:01\n */\npublic class JZResizeTextureView extends TextureView {\n    protected static final String TAG = \"JZResizeTextureView\";\n\n    public int currentVideoWidth = 0;\n    public int currentVideoHeight = 0;\n\n    public JZResizeTextureView(Context context) {\n        super(context);\n        currentVideoWidth = 0;\n        currentVideoHeight = 0;\n    }\n\n    public JZResizeTextureView(Context context, AttributeSet attrs) {\n        super(context, attrs);\n        currentVideoWidth = 0;\n        currentVideoHeight = 0;\n    }\n\n    public void setVideoSize(int currentVideoWidth, int currentVideoHeight) {\n        if (this.currentVideoWidth != currentVideoWidth || this.currentVideoHeight != currentVideoHeight) {\n            this.currentVideoWidth = currentVideoWidth;\n            this.currentVideoHeight = currentVideoHeight;\n            requestLayout();\n        }\n    }\n\n    @Override\n    public void setRotation(float rotation) {\n        if (rotation != getRotation()) {\n            super.setRotation(rotation);\n            requestLayout();\n        }\n    }\n\n    @Override\n    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {\n        Log.i(TAG, \"onMeasure \" + \" [\" + this.hashCode() + \"] \");\n        int viewRotation = (int) getRotation();\n        int videoWidth = currentVideoWidth;\n        int videoHeight = currentVideoHeight;\n\n\n        int parentHeight = ((View) getParent()).getMeasuredHeight();\n        int parentWidth = ((View) getParent()).getMeasuredWidth();\n        if (parentWidth != 0 && parentHeight != 0 && videoWidth != 0 && videoHeight != 0) {\n            if (JZVideoPlayer.VIDEO_IMAGE_DISPLAY_TYPE == JZVideoPlayer.VIDEO_IMAGE_DISPLAY_TYPE_FILL_PARENT) {\n                if (viewRotation == 90 || viewRotation == 270) {\n                    int tempSize = parentWidth;\n                    parentWidth = parentHeight;\n                    parentHeight = tempSize;\n                }\n                /**强制充满**/\n                videoHeight = videoWidth * parentHeight / parentWidth;\n            }\n        }\n\n        // 如果判断成立，则说明显示的TextureView和本身的位置是有90度的旋转的，所以需要交换宽高参数。\n        if (viewRotation == 90 || viewRotation == 270) {\n            int tempMeasureSpec = widthMeasureSpec;\n            widthMeasureSpec = heightMeasureSpec;\n            heightMeasureSpec = tempMeasureSpec;\n        }\n\n        int width = getDefaultSize(videoWidth, widthMeasureSpec);\n        int height = getDefaultSize(videoHeight, heightMeasureSpec);\n        if (videoWidth > 0 && videoHeight > 0) {\n\n            int widthSpecMode = MeasureSpec.getMode(widthMeasureSpec);\n            int widthSpecSize = MeasureSpec.getSize(widthMeasureSpec);\n            int heightSpecMode = MeasureSpec.getMode(heightMeasureSpec);\n            int heightSpecSize = MeasureSpec.getSize(heightMeasureSpec);\n\n            Log.i(TAG, \"widthMeasureSpec  [\" + MeasureSpec.toString(widthMeasureSpec) + \"]\");\n            Log.i(TAG, \"heightMeasureSpec [\" + MeasureSpec.toString(heightMeasureSpec) + \"]\");\n\n            if (widthSpecMode == MeasureSpec.EXACTLY && heightSpecMode == MeasureSpec.EXACTLY) {\n                // the size is fixed\n                width = widthSpecSize;\n                height = heightSpecSize;\n                // for compatibility, we adjust size based on aspect ratio\n                if (videoWidth * height < width * videoHeight) {\n                    width = height * videoWidth / videoHeight;\n                } else if (videoWidth * height > width * videoHeight) {\n                    height = width * videoHeight / videoWidth;\n                }\n            } else if (widthSpecMode == MeasureSpec.EXACTLY) {\n                // only the width is fixed, adjust the height to match aspect ratio if possible\n                width = widthSpecSize;\n                height = width * videoHeight / videoWidth;\n                if (heightSpecMode == MeasureSpec.AT_MOST && height > heightSpecSize) {\n                    // couldn't match aspect ratio within the constraints\n                    height = heightSpecSize;\n                    width = height * videoWidth / videoHeight;\n                }\n            } else if (heightSpecMode == MeasureSpec.EXACTLY) {\n                // only the height is fixed, adjust the width to match aspect ratio if possible\n                height = heightSpecSize;\n                width = height * videoWidth / videoHeight;\n                if (widthSpecMode == MeasureSpec.AT_MOST && width > widthSpecSize) {\n                    // couldn't match aspect ratio within the constraints\n                    width = widthSpecSize;\n                    height = width * videoHeight / videoWidth;\n                }\n            } else {\n                // neither the width nor the height are fixed, try to use actual video size\n                width = videoWidth;\n                height = videoHeight;\n                if (heightSpecMode == MeasureSpec.AT_MOST && height > heightSpecSize) {\n                    // too tall, decrease both width and height\n                    height = heightSpecSize;\n                    width = height * videoWidth / videoHeight;\n                }\n                if (widthSpecMode == MeasureSpec.AT_MOST && width > widthSpecSize) {\n                    // too wide, decrease both width and height\n                    width = widthSpecSize;\n                    height = width * videoHeight / videoWidth;\n                }\n            }\n        } else {\n            // no size yet, just adopt the given spec sizes\n        }\n        if (parentWidth != 0 && parentHeight != 0 && videoWidth != 0 && videoHeight != 0) {\n            if (JZVideoPlayer.VIDEO_IMAGE_DISPLAY_TYPE == JZVideoPlayer.VIDEO_IMAGE_DISPLAY_TYPE_ORIGINAL) {\n                /**原图**/\n                height = videoHeight;\n                width = videoWidth;\n            } else if (JZVideoPlayer.VIDEO_IMAGE_DISPLAY_TYPE == JZVideoPlayer.VIDEO_IMAGE_DISPLAY_TYPE_FILL_SCROP) {\n                if (viewRotation == 90 || viewRotation == 270) {\n                    int tempSize = parentWidth;\n                    parentWidth = parentHeight;\n                    parentHeight = tempSize;\n                }\n                /**充满剪切**/\n                if (videoHeight / videoWidth > parentHeight / parentWidth) {\n                    height = parentWidth / width * height;\n                    width = parentWidth;\n                } else if (videoHeight / videoWidth < parentHeight / parentWidth) {\n                    width = parentHeight / height * width;\n                    height = parentHeight;\n                }\n            }\n        }\n        setMeasuredDimension(width, height);\n    }\n}\n"
  },
  {
    "path": "librarys/jiaozivideoplayer/src/main/java/cn/jzvd/JZUserAction.java",
    "content": "package cn.jzvd;\n\n/**\n * Created by Nathen\n * On 2016/04/04 22:13\n */\npublic interface JZUserAction {\n\n    int ON_CLICK_START_ICON = 0;\n    int ON_CLICK_START_ERROR = 1;\n    int ON_CLICK_START_AUTO_COMPLETE = 2;\n\n    int ON_CLICK_PAUSE = 3;\n    int ON_CLICK_RESUME = 4;\n    int ON_SEEK_POSITION = 5;\n    int ON_AUTO_COMPLETE = 6;\n\n    int ON_ENTER_FULLSCREEN = 7;\n    int ON_QUIT_FULLSCREEN = 8;\n    int ON_ENTER_TINYSCREEN = 9;\n    int ON_QUIT_TINYSCREEN = 10;\n\n\n    int ON_TOUCH_SCREEN_SEEK_VOLUME = 11;\n    int ON_TOUCH_SCREEN_SEEK_POSITION = 12;\n\n    void onEvent(int type, Object url, int screen, Object... objects);\n\n}\n"
  },
  {
    "path": "librarys/jiaozivideoplayer/src/main/java/cn/jzvd/JZUserActionStandard.java",
    "content": "package cn.jzvd;\n\n/**\n * Created by Nathen\n * On 2016/04/26 20:53\n */\npublic interface JZUserActionStandard extends JZUserAction {\n\n    int ON_CLICK_START_THUMB = 101;\n    int ON_CLICK_BLANK = 102;\n\n}\n"
  },
  {
    "path": "librarys/jiaozivideoplayer/src/main/java/cn/jzvd/JZUtils.java",
    "content": "package cn.jzvd;\n\nimport android.app.Activity;\nimport android.content.Context;\nimport android.content.ContextWrapper;\nimport android.content.SharedPreferences;\nimport android.net.ConnectivityManager;\nimport android.net.NetworkInfo;\nimport android.support.v7.app.AppCompatActivity;\nimport android.support.v7.view.ContextThemeWrapper;\nimport android.text.TextUtils;\nimport android.util.Log;\nimport android.view.Window;\n\nimport java.util.Formatter;\nimport java.util.Iterator;\nimport java.util.LinkedHashMap;\nimport java.util.Locale;\n\n/**\n * Created by Nathen\n * On 2016/02/21 12:25\n */\npublic class JZUtils {\n    public static final String TAG = \"JiaoZiVideoPlayer\";\n\n    public static String stringForTime(long timeMs) {\n        if (timeMs <= 0 || timeMs >= 24 * 60 * 60 * 1000) {\n            return \"00:00\";\n        }\n        long totalSeconds = timeMs / 1000;\n        int seconds = (int) (totalSeconds % 60);\n        int minutes = (int) ((totalSeconds / 60) % 60);\n        int hours = (int) (totalSeconds / 3600);\n        StringBuilder stringBuilder = new StringBuilder();\n        Formatter mFormatter = new Formatter(stringBuilder, Locale.getDefault());\n        if (hours > 0) {\n            return mFormatter.format(\"%d:%02d:%02d\", hours, minutes, seconds).toString();\n        } else {\n            return mFormatter.format(\"%02d:%02d\", minutes, seconds).toString();\n        }\n    }\n\n    /**\n     * This method requires the caller to hold the permission ACCESS_NETWORK_STATE.\n     *\n     * @param context context\n     * @return if wifi is connected,return true\n     */\n    public static boolean isWifiConnected(Context context) {\n        ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);\n        NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo();\n        return networkInfo != null && networkInfo.getType() == ConnectivityManager.TYPE_WIFI;\n    }\n\n    /**\n     * Get activity from context object\n     *\n     * @param context context\n     * @return object of Activity or null if it is not Activity\n     */\n    public static Activity scanForActivity(Context context) {\n        if (context == null) return null;\n\n        if (context instanceof Activity) {\n            return (Activity) context;\n        } else if (context instanceof ContextWrapper) {\n            return scanForActivity(((ContextWrapper) context).getBaseContext());\n        }\n\n        return null;\n    }\n\n    /**\n     * Get AppCompatActivity from context\n     *\n     * @param context context\n     * @return AppCompatActivity if it's not null\n     */\n    public static AppCompatActivity getAppCompActivity(Context context) {\n        if (context == null) return null;\n        if (context instanceof AppCompatActivity) {\n            return (AppCompatActivity) context;\n        } else if (context instanceof ContextThemeWrapper) {\n            return getAppCompActivity(((ContextThemeWrapper) context).getBaseContext());\n        }\n        return null;\n    }\n\n    public static void setRequestedOrientation(Context context, int orientation) {\n        if (JZUtils.getAppCompActivity(context) != null) {\n            JZUtils.getAppCompActivity(context).setRequestedOrientation(\n                    orientation);\n        } else {\n            JZUtils.scanForActivity(context).setRequestedOrientation(\n                    orientation);\n        }\n    }\n\n    public static Window getWindow(Context context) {\n        if (JZUtils.getAppCompActivity(context) != null) {\n            return JZUtils.getAppCompActivity(context).getWindow();\n        } else {\n            return JZUtils.scanForActivity(context).getWindow();\n        }\n    }\n\n    public static int dip2px(Context context, float dpValue) {\n        final float scale = context.getResources().getDisplayMetrics().density;\n        return (int) (dpValue * scale + 0.5f);\n    }\n\n    public static void saveProgress(Context context, Object url, long progress) {\n        if (!JZVideoPlayer.SAVE_PROGRESS) return;\n        Log.i(TAG, \"saveProgress: \" + progress);\n        if (progress < 5000) {\n            progress = 0;\n        }\n        SharedPreferences spn = context.getSharedPreferences(\"JZVD_PROGRESS\",\n                Context.MODE_PRIVATE);\n        SharedPreferences.Editor editor = spn.edit();\n        editor.putLong(\"newVersion:\" + url.toString(), progress);\n        editor.apply();\n    }\n\n    public static long getSavedProgress(Context context, Object url) {\n        if (!JZVideoPlayer.SAVE_PROGRESS) return 0;\n        SharedPreferences spn;\n        spn = context.getSharedPreferences(\"JZVD_PROGRESS\",\n                Context.MODE_PRIVATE);\n        return spn.getLong(\"newVersion:\" + url.toString(), 0);\n    }\n\n    /**\n     * if url == null, clear all progress\n     *\n     * @param context context\n     * @param url     if url!=null clear this url progress\n     */\n    public static void clearSavedProgress(Context context, String url) {\n        if (TextUtils.isEmpty(url)) {\n            SharedPreferences spn = context.getSharedPreferences(\"JZVD_PROGRESS\",\n                    Context.MODE_PRIVATE);\n            spn.edit().clear().apply();\n        } else {\n            SharedPreferences spn = context.getSharedPreferences(\"JZVD_PROGRESS\",\n                    Context.MODE_PRIVATE);\n            spn.edit().putInt(url, 0).apply();\n        }\n    }\n\n    public static Object getCurrentFromDataSource(Object[] dataSourceObjects, int index) {\n        LinkedHashMap<String, Object> map = (LinkedHashMap) dataSourceObjects[0];\n        if (map != null && map.size() > 0) {\n            return getValueFromLinkedMap(map, index);\n        }\n        return null;\n    }\n\n    public static Object getValueFromLinkedMap(LinkedHashMap<String, Object> map, int index) {\n        int currentIndex = 0;\n        for (Iterator it = map.keySet().iterator(); it.hasNext(); ) {\n            Object key = it.next();\n            if (currentIndex == index) {\n                return map.get(key);\n            }\n            currentIndex++;\n        }\n        return null;\n    }\n\n    public static boolean dataSourceObjectsContainsUri(Object[] dataSourceObjects, Object object) {\n        LinkedHashMap<String, Object> map = (LinkedHashMap) dataSourceObjects[0];\n        if (map != null) {\n            return map.containsValue(object);\n        }\n        return false;\n    }\n\n    public static String getKeyFromDataSource(Object[] dataSourceObjects, int index) {\n        LinkedHashMap<String, Object> map = (LinkedHashMap) dataSourceObjects[0];\n        int currentIndex = 0;\n        for (Iterator it = map.keySet().iterator(); it.hasNext(); ) {\n            Object key = it.next();\n            if (currentIndex == index) {\n                return key.toString();\n            }\n            currentIndex++;\n        }\n        return null;\n    }\n}\n"
  },
  {
    "path": "librarys/jiaozivideoplayer/src/main/java/cn/jzvd/JZVideoPlayer.java",
    "content": "package cn.jzvd;\n\nimport android.annotation.SuppressLint;\nimport android.content.Context;\nimport android.content.pm.ActivityInfo;\nimport android.hardware.Sensor;\nimport android.hardware.SensorEvent;\nimport android.hardware.SensorEventListener;\nimport android.hardware.SensorManager;\nimport android.media.AudioManager;\nimport android.os.Handler;\nimport android.provider.Settings;\nimport android.support.v7.app.ActionBar;\nimport android.support.v7.app.AppCompatActivity;\nimport android.util.AttributeSet;\nimport android.util.Log;\nimport android.view.Gravity;\nimport android.view.MotionEvent;\nimport android.view.View;\nimport android.view.ViewGroup;\nimport android.view.ViewParent;\nimport android.view.Window;\nimport android.view.WindowManager;\nimport android.widget.AbsListView;\nimport android.widget.FrameLayout;\nimport android.widget.ImageView;\nimport android.widget.SeekBar;\nimport android.widget.TextView;\nimport android.widget.Toast;\n\nimport java.lang.reflect.Constructor;\nimport java.util.LinkedHashMap;\nimport java.util.Timer;\nimport java.util.TimerTask;\n\n/**\n * Created by Nathen on 16/7/30.\n */\npublic abstract class JZVideoPlayer extends FrameLayout implements View.OnClickListener, SeekBar.OnSeekBarChangeListener, View.OnTouchListener {\n\n    public static final String TAG = \"JiaoZiVideoPlayer\";\n    public static final int THRESHOLD = 80;\n    public static final int FULL_SCREEN_NORMAL_DELAY = 300;\n\n    public static final int SCREEN_WINDOW_NORMAL = 0;\n    public static final int SCREEN_WINDOW_LIST = 1;\n    public static final int SCREEN_WINDOW_FULLSCREEN = 2;\n    public static final int SCREEN_WINDOW_TINY = 3;\n\n    public static final int CURRENT_STATE_NORMAL = 0;\n    public static final int CURRENT_STATE_PREPARING = 1;\n    public static final int CURRENT_STATE_PREPARING_CHANGING_URL = 2;\n    public static final int CURRENT_STATE_PLAYING = 3;\n    public static final int CURRENT_STATE_PAUSE = 5;\n    public static final int CURRENT_STATE_AUTO_COMPLETE = 6;\n    public static final int CURRENT_STATE_ERROR = 7;\n\n    public static final String URL_KEY_DEFAULT = \"URL_KEY_DEFAULT\";//当播放的地址只有一个的时候的key\n    public static final int VIDEO_IMAGE_DISPLAY_TYPE_ADAPTER = 0;//default\n    public static final int VIDEO_IMAGE_DISPLAY_TYPE_FILL_PARENT = 1;\n    public static final int VIDEO_IMAGE_DISPLAY_TYPE_FILL_SCROP = 2;\n    public static final int VIDEO_IMAGE_DISPLAY_TYPE_ORIGINAL = 3;\n    public static boolean ACTION_BAR_EXIST = true;\n    public static boolean TOOL_BAR_EXIST = true;\n    public static int FULLSCREEN_ORIENTATION = ActivityInfo.SCREEN_ORIENTATION_SENSOR;\n    public static int NORMAL_ORIENTATION = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT;\n    public static boolean SAVE_PROGRESS = true;\n    public static boolean WIFI_TIP_DIALOG_SHOWED = false;\n    public static int VIDEO_IMAGE_DISPLAY_TYPE = 0;\n    public static long CLICK_QUIT_FULLSCREEN_TIME = 0;\n    public static long lastAutoFullscreenTime = 0;\n    public static AudioManager.OnAudioFocusChangeListener onAudioFocusChangeListener = new AudioManager.OnAudioFocusChangeListener() {//是否新建个class，代码更规矩，并且变量的位置也很尴尬\n        @Override\n        public void onAudioFocusChange(int focusChange) {\n            switch (focusChange) {\n                case AudioManager.AUDIOFOCUS_GAIN:\n                    break;\n                case AudioManager.AUDIOFOCUS_LOSS:\n                    releaseAllVideos();\n                    Log.d(TAG, \"AUDIOFOCUS_LOSS [\" + this.hashCode() + \"]\");\n                    break;\n                case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT:\n                    try {\n                        if (JZMediaManager.isPlaying()) {\n                            JZMediaManager.pause();\n                        }\n                    } catch (IllegalStateException e) {\n                        e.printStackTrace();\n                    }\n                    Log.d(TAG, \"AUDIOFOCUS_LOSS_TRANSIENT [\" + this.hashCode() + \"]\");\n                    break;\n                case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK:\n                    break;\n            }\n        }\n    };\n    protected static JZUserAction JZ_USER_EVENT;\n    protected static Timer UPDATE_PROGRESS_TIMER;\n    public int currentState = -1;\n    public int currentScreen = -1;\n    public Object[] objects = null;\n    public long seekToInAdvance = 0;\n    public ImageView startButton;\n    public SeekBar progressBar;\n    public ImageView fullscreenButton;\n    public TextView currentTimeTextView, totalTimeTextView;\n    public ViewGroup textureViewContainer;\n    public ViewGroup topContainer, bottomContainer;\n    public int widthRatio = 0;\n    public int heightRatio = 0;\n    public Object[] dataSourceObjects;//这个参数原封不动直接通过JZMeidaManager传给JZMediaInterface。\n    public int currentUrlMapIndex = 0;\n    public int positionInList = -1;\n    public int videoRotation = 0;\n    protected int mScreenWidth;\n    protected int mScreenHeight;\n    protected AudioManager mAudioManager;\n    protected Handler mHandler;\n    protected ProgressTimerTask mProgressTimerTask;\n    protected boolean mTouchingProgressBar;\n    protected float mDownX;\n    protected float mDownY;\n    protected boolean mChangeVolume;\n    protected boolean mChangePosition;\n    protected boolean mChangeBrightness;\n    protected long mGestureDownPosition;\n    protected int mGestureDownVolume;\n    protected float mGestureDownBrightness;\n    protected long mSeekTimePosition;\n    boolean tmp_test_back = false;\n\n    public JZVideoPlayer(Context context) {\n        super(context);\n        init(context);\n    }\n\n    public JZVideoPlayer(Context context, AttributeSet attrs) {\n        super(context, attrs);\n        init(context);\n    }\n\n    public static void releaseAllVideos() {\n        if ((System.currentTimeMillis() - CLICK_QUIT_FULLSCREEN_TIME) > FULL_SCREEN_NORMAL_DELAY) {\n            Log.d(TAG, \"releaseAllVideos\");\n            JZVideoPlayerManager.completeAll();\n            JZMediaManager.instance().positionInList = -1;\n            JZMediaManager.instance().releaseMediaPlayer();\n        }\n    }\n\n    public static void startFullscreen(Context context, Class _class, String url, Object... objects) {\n        LinkedHashMap map = new LinkedHashMap();\n        map.put(URL_KEY_DEFAULT, url);\n        Object[] dataSourceObjects = new Object[1];\n        dataSourceObjects[0] = map;\n        startFullscreen(context, _class, dataSourceObjects, 0, objects);\n    }\n\n    public static void startFullscreen(Context context, Class _class, Object[] dataSourceObjects, int defaultUrlMapIndex, Object... objects) {\n        hideSupportActionBar(context);\n        JZUtils.setRequestedOrientation(context, FULLSCREEN_ORIENTATION);\n        ViewGroup vp = (JZUtils.scanForActivity(context))//.getWindow().getDecorView();\n                .findViewById(Window.ID_ANDROID_CONTENT);\n        View old = vp.findViewById(R.id.jz_fullscreen_id);\n        if (old != null) {\n            vp.removeView(old);\n        }\n        try {\n            Constructor<JZVideoPlayer> constructor = _class.getConstructor(Context.class);\n            final JZVideoPlayer jzVideoPlayer = constructor.newInstance(context);\n            jzVideoPlayer.setId(R.id.jz_fullscreen_id);\n            FrameLayout.LayoutParams lp = new FrameLayout.LayoutParams(\n                    ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);\n            vp.addView(jzVideoPlayer, lp);\n//            final Animation ra = AnimationUtils.loadAnimation(context, R.anim.start_fullscreen);\n//            jzVideoPlayer.setAnimation(ra);\n            jzVideoPlayer.setUp(dataSourceObjects, defaultUrlMapIndex, JZVideoPlayerStandard.SCREEN_WINDOW_FULLSCREEN, objects);\n            CLICK_QUIT_FULLSCREEN_TIME = System.currentTimeMillis();\n            jzVideoPlayer.startButton.performClick();\n        } catch (InstantiationException e) {\n            e.printStackTrace();\n        } catch (Exception e) {\n            e.printStackTrace();\n        }\n    }\n\n    public static boolean backPress() {\n        Log.i(TAG, \"backPress\");\n        if ((System.currentTimeMillis() - CLICK_QUIT_FULLSCREEN_TIME) < FULL_SCREEN_NORMAL_DELAY)\n            return false;\n\n        if (JZVideoPlayerManager.getSecondFloor() != null) {\n            CLICK_QUIT_FULLSCREEN_TIME = System.currentTimeMillis();\n            if (JZUtils.dataSourceObjectsContainsUri(JZVideoPlayerManager.getFirstFloor().dataSourceObjects, JZMediaManager.getCurrentDataSource())) {\n                JZVideoPlayer jzVideoPlayer = JZVideoPlayerManager.getSecondFloor();\n                jzVideoPlayer.onEvent(jzVideoPlayer.currentScreen == JZVideoPlayerStandard.SCREEN_WINDOW_FULLSCREEN ?\n                        JZUserAction.ON_QUIT_FULLSCREEN :\n                        JZUserAction.ON_QUIT_TINYSCREEN);\n                JZVideoPlayerManager.getFirstFloor().playOnThisJzvd();\n            } else {\n                quitFullscreenOrTinyWindow();\n            }\n            return true;\n        } else if (JZVideoPlayerManager.getFirstFloor() != null &&\n                (JZVideoPlayerManager.getFirstFloor().currentScreen == SCREEN_WINDOW_FULLSCREEN ||\n                        JZVideoPlayerManager.getFirstFloor().currentScreen == SCREEN_WINDOW_TINY)) {//以前我总想把这两个判断写到一起，这分明是两个独立是逻辑\n            CLICK_QUIT_FULLSCREEN_TIME = System.currentTimeMillis();\n            quitFullscreenOrTinyWindow();\n            return true;\n        }\n        return false;\n    }\n\n    public static void quitFullscreenOrTinyWindow() {\n        //直接退出全屏和小窗\n        JZVideoPlayerManager.getFirstFloor().clearFloatScreen();\n        JZMediaManager.instance().releaseMediaPlayer();\n        JZVideoPlayerManager.completeAll();\n    }\n\n    @SuppressLint(\"RestrictedApi\")\n    public static void showSupportActionBar(Context context) {\n        if (ACTION_BAR_EXIST && JZUtils.getAppCompActivity(context) != null) {\n            ActionBar ab = JZUtils.getAppCompActivity(context).getSupportActionBar();\n            if (ab != null) {\n                ab.setShowHideAnimationEnabled(false);\n                ab.show();\n            }\n        }\n        if (TOOL_BAR_EXIST) {\n            JZUtils.getWindow(context).clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);\n        }\n    }\n\n    @SuppressLint(\"RestrictedApi\")\n    public static void hideSupportActionBar(Context context) {\n        if (ACTION_BAR_EXIST && JZUtils.getAppCompActivity(context) != null) {\n            ActionBar ab = JZUtils.getAppCompActivity(context).getSupportActionBar();\n            if (ab != null) {\n                ab.setShowHideAnimationEnabled(false);\n                ab.hide();\n            }\n        }\n        if (TOOL_BAR_EXIST) {\n            JZUtils.getWindow(context).setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,\n                    WindowManager.LayoutParams.FLAG_FULLSCREEN);\n        }\n    }\n\n    public static void clearSavedProgress(Context context, String url) {\n        JZUtils.clearSavedProgress(context, url);\n    }\n\n    public static void setJzUserAction(JZUserAction jzUserEvent) {\n        JZ_USER_EVENT = jzUserEvent;\n    }\n\n    public static void goOnPlayOnResume() {\n        if (JZVideoPlayerManager.getCurrentJzvd() != null) {\n            JZVideoPlayer jzvd = JZVideoPlayerManager.getCurrentJzvd();\n            if (jzvd.currentState == JZVideoPlayer.CURRENT_STATE_PAUSE) {\n                jzvd.onStatePlaying();\n                JZMediaManager.start();\n            }\n        }\n    }\n\n    public static void goOnPlayOnPause() {\n        if (JZVideoPlayerManager.getCurrentJzvd() != null) {\n            JZVideoPlayer jzvd = JZVideoPlayerManager.getCurrentJzvd();\n            if (jzvd.currentState == JZVideoPlayer.CURRENT_STATE_AUTO_COMPLETE ||\n                    jzvd.currentState == JZVideoPlayer.CURRENT_STATE_NORMAL ||\n                    jzvd.currentState == JZVideoPlayer.CURRENT_STATE_ERROR) {\n//                JZVideoPlayer.releaseAllVideos();\n            } else {\n                jzvd.onStatePause();\n                JZMediaManager.pause();\n            }\n        }\n    }\n\n    public static void onScrollAutoTiny(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {\n        int lastVisibleItem = firstVisibleItem + visibleItemCount;\n        int currentPlayPosition = JZMediaManager.instance().positionInList;\n        if (currentPlayPosition >= 0) {\n            if ((currentPlayPosition < firstVisibleItem || currentPlayPosition > (lastVisibleItem - 1))) {\n                if (JZVideoPlayerManager.getCurrentJzvd() != null &&\n                        JZVideoPlayerManager.getCurrentJzvd().currentScreen != JZVideoPlayer.SCREEN_WINDOW_TINY &&\n                        JZVideoPlayerManager.getCurrentJzvd().currentScreen != JZVideoPlayer.SCREEN_WINDOW_FULLSCREEN) {\n                    if (JZVideoPlayerManager.getCurrentJzvd().currentState == JZVideoPlayer.CURRENT_STATE_PAUSE) {\n                        JZVideoPlayer.releaseAllVideos();\n                    } else {\n                        Log.e(TAG, \"onScroll: out screen\");\n                        JZVideoPlayerManager.getCurrentJzvd().startWindowTiny();\n                    }\n                }\n            } else {\n                if (JZVideoPlayerManager.getCurrentJzvd() != null &&\n                        JZVideoPlayerManager.getCurrentJzvd().currentScreen == JZVideoPlayer.SCREEN_WINDOW_TINY) {\n                    Log.e(TAG, \"onScroll: into screen\");\n                    JZVideoPlayer.backPress();\n                }\n            }\n        }\n    }\n\n    public static void onScrollReleaseAllVideos(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {\n        int lastVisibleItem = firstVisibleItem + visibleItemCount;\n        int currentPlayPosition = JZMediaManager.instance().positionInList;\n        Log.e(TAG, \"onScrollReleaseAllVideos: \" +\n                currentPlayPosition + \" \" + firstVisibleItem + \" \" + currentPlayPosition + \" \" + lastVisibleItem);\n        if (currentPlayPosition >= 0) {\n            if ((currentPlayPosition < firstVisibleItem || currentPlayPosition > (lastVisibleItem - 1))) {\n                if (JZVideoPlayerManager.getCurrentJzvd().currentScreen != JZVideoPlayer.SCREEN_WINDOW_FULLSCREEN) {\n                    JZVideoPlayer.releaseAllVideos();//为什么最后一个视频横屏会调用这个，其他地方不会\n                }\n            }\n        }\n    }\n\n    public static void onChildViewAttachedToWindow(View view, int jzvdId) {\n        if (JZVideoPlayerManager.getCurrentJzvd() != null && JZVideoPlayerManager.getCurrentJzvd().currentScreen == JZVideoPlayer.SCREEN_WINDOW_TINY) {\n            JZVideoPlayer videoPlayer = view.findViewById(jzvdId);\n            if (videoPlayer != null && JZUtils.getCurrentFromDataSource(videoPlayer.dataSourceObjects, videoPlayer.currentUrlMapIndex).equals(JZMediaManager.getCurrentDataSource())) {\n                JZVideoPlayer.backPress();\n            }\n        }\n    }\n\n    public static void onChildViewDetachedFromWindow(View view) {\n        if (JZVideoPlayerManager.getCurrentJzvd() != null && JZVideoPlayerManager.getCurrentJzvd().currentScreen != JZVideoPlayer.SCREEN_WINDOW_TINY) {\n            JZVideoPlayer videoPlayer = JZVideoPlayerManager.getCurrentJzvd();\n            if (((ViewGroup) view).indexOfChild(videoPlayer) != -1) {\n                if (videoPlayer.currentState == JZVideoPlayer.CURRENT_STATE_PAUSE) {\n                    JZVideoPlayer.releaseAllVideos();\n                } else {\n                    videoPlayer.startWindowTiny();\n                }\n            }\n        }\n    }\n\n    public static void setTextureViewRotation(int rotation) {\n        if (JZMediaManager.textureView != null) {\n            JZMediaManager.textureView.setRotation(rotation);\n        }\n    }\n\n    public static void setVideoImageDisplayType(int type) {\n        JZVideoPlayer.VIDEO_IMAGE_DISPLAY_TYPE = type;\n        if (JZMediaManager.textureView != null) {\n            JZMediaManager.textureView.requestLayout();\n        }\n    }\n\n    public Object getCurrentUrl() {\n        return JZUtils.getCurrentFromDataSource(dataSourceObjects, currentUrlMapIndex);\n    }\n\n    public abstract int getLayoutId();\n\n    public void init(Context context) {\n        View.inflate(context, getLayoutId(), this);\n        startButton = findViewById(R.id.start);\n        fullscreenButton = findViewById(R.id.fullscreen);\n        progressBar = findViewById(R.id.bottom_seek_progress);\n        currentTimeTextView = findViewById(R.id.current);\n        totalTimeTextView = findViewById(R.id.total);\n        bottomContainer = findViewById(R.id.layout_bottom);\n        textureViewContainer = findViewById(R.id.surface_container);\n        topContainer = findViewById(R.id.layout_top);\n\n        startButton.setOnClickListener(this);\n        fullscreenButton.setOnClickListener(this);\n        progressBar.setOnSeekBarChangeListener(this);\n        bottomContainer.setOnClickListener(this);\n        textureViewContainer.setOnClickListener(this);\n        textureViewContainer.setOnTouchListener(this);\n\n        mScreenWidth = getContext().getResources().getDisplayMetrics().widthPixels;\n        mScreenHeight = getContext().getResources().getDisplayMetrics().heightPixels;\n        mAudioManager = (AudioManager) getContext().getSystemService(Context.AUDIO_SERVICE);\n        mHandler = new Handler();\n\n        try {\n            if (isCurrentPlay()) {\n                NORMAL_ORIENTATION = ((AppCompatActivity) context).getRequestedOrientation();\n            }\n        } catch (Exception e) {\n            e.printStackTrace();\n        }\n    }\n\n    public void setUp(String url, int screen, String objects) {\n        LinkedHashMap map = new LinkedHashMap();\n        map.put(URL_KEY_DEFAULT, url);\n        Object[] dataSourceObjects = new Object[1];\n        dataSourceObjects[0] = map;\n        setUp(dataSourceObjects, 0, screen, objects);\n    }\n\n    public void setUp(Object[] dataSourceObjects, int defaultUrlMapIndex, int screen, Object... objects) {\n        if (this.dataSourceObjects != null && JZUtils.getCurrentFromDataSource(dataSourceObjects, currentUrlMapIndex) != null &&\n                JZUtils.getCurrentFromDataSource(this.dataSourceObjects, currentUrlMapIndex).equals(JZUtils.getCurrentFromDataSource(dataSourceObjects, currentUrlMapIndex))) {\n            return;\n        }\n        if (isCurrentJZVD() && JZUtils.dataSourceObjectsContainsUri(dataSourceObjects, JZMediaManager.getCurrentDataSource())) {\n            long position = 0;\n            try {\n                position = JZMediaManager.getCurrentPosition();\n            } catch (IllegalStateException e) {\n                e.printStackTrace();\n            }\n            if (position != 0) {\n                JZUtils.saveProgress(getContext(), JZMediaManager.getCurrentDataSource(), position);\n            }\n            JZMediaManager.instance().releaseMediaPlayer();\n        } else if (isCurrentJZVD() && !JZUtils.dataSourceObjectsContainsUri(dataSourceObjects, JZMediaManager.getCurrentDataSource())) {\n            startWindowTiny();\n        } else if (!isCurrentJZVD() && JZUtils.dataSourceObjectsContainsUri(dataSourceObjects, JZMediaManager.getCurrentDataSource())) {\n            if (JZVideoPlayerManager.getCurrentJzvd() != null &&\n                    JZVideoPlayerManager.getCurrentJzvd().currentScreen == JZVideoPlayer.SCREEN_WINDOW_TINY) {\n                //需要退出小窗退到我这里，我这里是第一层级\n                tmp_test_back = true;\n            }\n        } else if (!isCurrentJZVD() && !JZUtils.dataSourceObjectsContainsUri(dataSourceObjects, JZMediaManager.getCurrentDataSource())) {\n        }\n        this.dataSourceObjects = dataSourceObjects;\n        this.currentUrlMapIndex = defaultUrlMapIndex;\n        this.currentScreen = screen;\n        this.objects = objects;\n        onStateNormal();\n\n    }\n\n    @Override\n    public void onClick(View v) {\n        int i = v.getId();\n        if (i == R.id.start) {\n            Log.i(TAG, \"onClick start [\" + this.hashCode() + \"] \");\n            if (dataSourceObjects == null || JZUtils.getCurrentFromDataSource(dataSourceObjects, currentUrlMapIndex) == null) {\n                Toast.makeText(getContext(), getResources().getString(R.string.no_url), Toast.LENGTH_SHORT).show();\n                return;\n            }\n            if (currentState == CURRENT_STATE_NORMAL) {\n                if (!JZUtils.getCurrentFromDataSource(dataSourceObjects, currentUrlMapIndex).toString().startsWith(\"file\") && !\n                        JZUtils.getCurrentFromDataSource(dataSourceObjects, currentUrlMapIndex).toString().startsWith(\"/\") &&\n                        !JZUtils.isWifiConnected(getContext()) && !WIFI_TIP_DIALOG_SHOWED) {\n                    showWifiDialog(JZUserAction.ON_CLICK_START_ICON);\n                    return;\n                }\n                startVideo();\n                onEvent(JZUserAction.ON_CLICK_START_ICON);\n            } else if (currentState == CURRENT_STATE_PLAYING) {\n                onEvent(JZUserAction.ON_CLICK_PAUSE);\n                Log.d(TAG, \"pauseVideo [\" + this.hashCode() + \"] \");\n                JZMediaManager.pause();\n                onStatePause();\n            } else if (currentState == CURRENT_STATE_PAUSE) {\n                onEvent(JZUserAction.ON_CLICK_RESUME);\n                JZMediaManager.start();\n                onStatePlaying();\n            } else if (currentState == CURRENT_STATE_AUTO_COMPLETE) {\n                onEvent(JZUserAction.ON_CLICK_START_AUTO_COMPLETE);\n                startVideo();\n            }\n        } else if (i == R.id.fullscreen) {\n            Log.i(TAG, \"onClick fullscreen [\" + this.hashCode() + \"] \");\n            if (currentState == CURRENT_STATE_AUTO_COMPLETE) return;\n            if (currentScreen == SCREEN_WINDOW_FULLSCREEN) {\n                //quit fullscreen\n                backPress();\n            } else {\n                Log.d(TAG, \"toFullscreenActivity [\" + this.hashCode() + \"] \");\n                onEvent(JZUserAction.ON_ENTER_FULLSCREEN);\n                startWindowFullscreen();\n            }\n        }\n    }\n\n    @Override\n    public boolean onTouch(View v, MotionEvent event) {\n        float x = event.getX();\n        float y = event.getY();\n        int id = v.getId();\n        if (id == R.id.surface_container) {\n            switch (event.getAction()) {\n                case MotionEvent.ACTION_DOWN:\n                    Log.i(TAG, \"onTouch surfaceContainer actionDown [\" + this.hashCode() + \"] \");\n                    mTouchingProgressBar = true;\n\n                    mDownX = x;\n                    mDownY = y;\n                    mChangeVolume = false;\n                    mChangePosition = false;\n                    mChangeBrightness = false;\n                    break;\n                case MotionEvent.ACTION_MOVE:\n                    Log.i(TAG, \"onTouch surfaceContainer actionMove [\" + this.hashCode() + \"] \");\n                    float deltaX = x - mDownX;\n                    float deltaY = y - mDownY;\n                    float absDeltaX = Math.abs(deltaX);\n                    float absDeltaY = Math.abs(deltaY);\n                    if (currentScreen == SCREEN_WINDOW_FULLSCREEN) {\n                        if (!mChangePosition && !mChangeVolume && !mChangeBrightness) {\n                            if (absDeltaX > THRESHOLD || absDeltaY > THRESHOLD) {\n                                cancelProgressTimer();\n                                if (absDeltaX >= THRESHOLD) {\n                                    // 全屏模式下的CURRENT_STATE_ERROR状态下,不响应进度拖动事件.\n                                    // 否则会因为mediaplayer的状态非法导致App Crash\n                                    if (currentState != CURRENT_STATE_ERROR) {\n                                        mChangePosition = true;\n                                        mGestureDownPosition = getCurrentPositionWhenPlaying();\n                                    }\n                                } else {\n                                    //如果y轴滑动距离超过设置的处理范围，那么进行滑动事件处理\n                                    if (mDownX < mScreenWidth * 0.5f) {//左侧改变亮度\n                                        mChangeBrightness = true;\n                                        WindowManager.LayoutParams lp = JZUtils.getWindow(getContext()).getAttributes();\n                                        if (lp.screenBrightness < 0) {\n                                            try {\n                                                mGestureDownBrightness = Settings.System.getInt(getContext().getContentResolver(), Settings.System.SCREEN_BRIGHTNESS);\n                                                Log.i(TAG, \"current system brightness: \" + mGestureDownBrightness);\n                                            } catch (Settings.SettingNotFoundException e) {\n                                                e.printStackTrace();\n                                            }\n                                        } else {\n                                            mGestureDownBrightness = lp.screenBrightness * 255;\n                                            Log.i(TAG, \"current activity brightness: \" + mGestureDownBrightness);\n                                        }\n                                    } else {//右侧改变声音\n                                        mChangeVolume = true;\n                                        mGestureDownVolume = mAudioManager.getStreamVolume(AudioManager.STREAM_MUSIC);\n                                    }\n                                }\n                            }\n                        }\n                    }\n                    if (mChangePosition) {\n                        long totalTimeDuration = getDuration();\n                        mSeekTimePosition = (int) (mGestureDownPosition + deltaX * totalTimeDuration / mScreenWidth);\n                        if (mSeekTimePosition > totalTimeDuration)\n                            mSeekTimePosition = totalTimeDuration;\n                        String seekTime = JZUtils.stringForTime(mSeekTimePosition);\n                        String totalTime = JZUtils.stringForTime(totalTimeDuration);\n\n                        showProgressDialog(deltaX, seekTime, mSeekTimePosition, totalTime, totalTimeDuration);\n                    }\n                    if (mChangeVolume) {\n                        deltaY = -deltaY;\n                        int max = mAudioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC);\n                        int deltaV = (int) (max * deltaY * 3 / mScreenHeight);\n                        mAudioManager.setStreamVolume(AudioManager.STREAM_MUSIC, mGestureDownVolume + deltaV, 0);\n                        //dialog中显示百分比\n                        int volumePercent = (int) (mGestureDownVolume * 100 / max + deltaY * 3 * 100 / mScreenHeight);\n                        showVolumeDialog(-deltaY, volumePercent);\n                    }\n\n                    if (mChangeBrightness) {\n                        deltaY = -deltaY;\n                        int deltaV = (int) (255 * deltaY * 3 / mScreenHeight);\n                        WindowManager.LayoutParams params = JZUtils.getWindow(getContext()).getAttributes();\n                        if (((mGestureDownBrightness + deltaV) / 255) >= 1) {//这和声音有区别，必须自己过滤一下负值\n                            params.screenBrightness = 1;\n                        } else if (((mGestureDownBrightness + deltaV) / 255) <= 0) {\n                            params.screenBrightness = 0.01f;\n                        } else {\n                            params.screenBrightness = (mGestureDownBrightness + deltaV) / 255;\n                        }\n                        JZUtils.getWindow(getContext()).setAttributes(params);\n                        //dialog中显示百分比\n                        int brightnessPercent = (int) (mGestureDownBrightness * 100 / 255 + deltaY * 3 * 100 / mScreenHeight);\n                        showBrightnessDialog(brightnessPercent);\n//                        mDownY = y;\n                    }\n                    break;\n                case MotionEvent.ACTION_UP:\n                    Log.i(TAG, \"onTouch surfaceContainer actionUp [\" + this.hashCode() + \"] \");\n                    mTouchingProgressBar = false;\n                    dismissProgressDialog();\n                    dismissVolumeDialog();\n                    dismissBrightnessDialog();\n                    if (mChangePosition) {\n                        onEvent(JZUserAction.ON_TOUCH_SCREEN_SEEK_POSITION);\n                        JZMediaManager.seekTo(mSeekTimePosition);\n                        long duration = getDuration();\n                        int progress = (int) (mSeekTimePosition * 100 / (duration == 0 ? 1 : duration));\n                        progressBar.setProgress(progress);\n                    }\n                    if (mChangeVolume) {\n                        onEvent(JZUserAction.ON_TOUCH_SCREEN_SEEK_VOLUME);\n                    }\n                    startProgressTimer();\n                    break;\n            }\n        }\n        return false;\n    }\n\n    public void startVideo() {\n        JZVideoPlayerManager.completeAll();\n        Log.d(TAG, \"startVideo [\" + this.hashCode() + \"] \");\n        initTextureView();\n        addTextureView();\n        AudioManager mAudioManager = (AudioManager) getContext().getSystemService(Context.AUDIO_SERVICE);\n        mAudioManager.requestAudioFocus(onAudioFocusChangeListener, AudioManager.STREAM_MUSIC, AudioManager.AUDIOFOCUS_GAIN_TRANSIENT);\n        JZUtils.scanForActivity(getContext()).getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);\n\n        JZMediaManager.setDataSource(dataSourceObjects);\n        JZMediaManager.setCurrentDataSource(JZUtils.getCurrentFromDataSource(dataSourceObjects, currentUrlMapIndex));\n        JZMediaManager.instance().positionInList = positionInList;\n        onStatePreparing();\n        JZVideoPlayerManager.setFirstFloor(this);\n    }\n\n    public void onPrepared() {\n        Log.i(TAG, \"onPrepared \" + \" [\" + this.hashCode() + \"] \");\n        onStatePrepared();\n        onStatePlaying();\n    }\n\n    public void setState(int state) {\n        setState(state, 0, 0);\n    }\n\n    public void setState(int state, int urlMapIndex, int seekToInAdvance) {\n        switch (state) {\n            case CURRENT_STATE_NORMAL:\n                onStateNormal();\n                break;\n            case CURRENT_STATE_PREPARING:\n                onStatePreparing();\n                break;\n            case CURRENT_STATE_PREPARING_CHANGING_URL:\n                onStatePreparingChangingUrl(urlMapIndex, seekToInAdvance);\n                break;\n            case CURRENT_STATE_PLAYING:\n                onStatePlaying();\n                break;\n            case CURRENT_STATE_PAUSE:\n                onStatePause();\n                break;\n            case CURRENT_STATE_ERROR:\n                onStateError();\n                break;\n            case CURRENT_STATE_AUTO_COMPLETE:\n                onStateAutoComplete();\n                break;\n        }\n    }\n\n    public void onStateNormal() {\n        Log.i(TAG, \"onStateNormal \" + \" [\" + this.hashCode() + \"] \");\n        currentState = CURRENT_STATE_NORMAL;\n        cancelProgressTimer();\n    }\n\n    public void onStatePreparing() {\n        Log.i(TAG, \"onStatePreparing \" + \" [\" + this.hashCode() + \"] \");\n        currentState = CURRENT_STATE_PREPARING;\n        resetProgressAndTime();\n    }\n\n    public void onStatePreparingChangingUrl(int urlMapIndex, long seekToInAdvance) {\n        currentState = CURRENT_STATE_PREPARING_CHANGING_URL;\n        this.currentUrlMapIndex = urlMapIndex;\n        this.seekToInAdvance = seekToInAdvance;\n        JZMediaManager.setDataSource(dataSourceObjects);\n        JZMediaManager.setCurrentDataSource(JZUtils.getCurrentFromDataSource(dataSourceObjects, currentUrlMapIndex));\n        JZMediaManager.instance().prepare();\n    }\n\n    public void onStatePrepared() {//因为这个紧接着就会进入播放状态，所以不设置state\n        if (seekToInAdvance != 0) {\n            JZMediaManager.seekTo(seekToInAdvance);\n            seekToInAdvance = 0;\n        } else {\n            long position = JZUtils.getSavedProgress(getContext(), JZUtils.getCurrentFromDataSource(dataSourceObjects, currentUrlMapIndex));\n            if (position != 0) {\n                JZMediaManager.seekTo(position);\n            }\n        }\n    }\n\n    public void onStatePlaying() {\n        Log.i(TAG, \"onStatePlaying \" + \" [\" + this.hashCode() + \"] \");\n        currentState = CURRENT_STATE_PLAYING;\n        startProgressTimer();\n    }\n\n    public void onStatePause() {\n        Log.i(TAG, \"onStatePause \" + \" [\" + this.hashCode() + \"] \");\n        currentState = CURRENT_STATE_PAUSE;\n        startProgressTimer();\n    }\n\n    public void onStateError() {\n        Log.i(TAG, \"onStateError \" + \" [\" + this.hashCode() + \"] \");\n        currentState = CURRENT_STATE_ERROR;\n        cancelProgressTimer();\n    }\n\n    public void onStateAutoComplete() {\n        Log.i(TAG, \"onStateAutoComplete \" + \" [\" + this.hashCode() + \"] \");\n        currentState = CURRENT_STATE_AUTO_COMPLETE;\n        cancelProgressTimer();\n        progressBar.setProgress(100);\n        currentTimeTextView.setText(totalTimeTextView.getText());\n    }\n\n    public void onInfo(int what, int extra) {\n        Log.d(TAG, \"onInfo what - \" + what + \" extra - \" + extra);\n    }\n\n    public void onError(int what, int extra) {\n        Log.e(TAG, \"onError \" + what + \" - \" + extra + \" [\" + this.hashCode() + \"] \");\n        if (what != 38 && extra != -38 && what != -38 && extra != 38 && extra != -19) {\n            onStateError();\n            if (isCurrentPlay()) {\n                JZMediaManager.instance().releaseMediaPlayer();\n            }\n        }\n    }\n\n    @Override\n    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {\n        if (currentScreen == SCREEN_WINDOW_FULLSCREEN || currentScreen == SCREEN_WINDOW_TINY) {\n            super.onMeasure(widthMeasureSpec, heightMeasureSpec);\n            return;\n        }\n        if (widthRatio != 0 && heightRatio != 0) {\n            int specWidth = MeasureSpec.getSize(widthMeasureSpec);\n            int specHeight = (int) ((specWidth * (float) heightRatio) / widthRatio);\n            setMeasuredDimension(specWidth, specHeight);\n\n            int childWidthMeasureSpec = MeasureSpec.makeMeasureSpec(specWidth, MeasureSpec.EXACTLY);\n            int childHeightMeasureSpec = MeasureSpec.makeMeasureSpec(specHeight, MeasureSpec.EXACTLY);\n            getChildAt(0).measure(childWidthMeasureSpec, childHeightMeasureSpec);\n        } else {\n            super.onMeasure(widthMeasureSpec, heightMeasureSpec);\n        }\n\n    }\n\n    public void onAutoCompletion() {\n        Runtime.getRuntime().gc();\n        Log.i(TAG, \"onAutoCompletion \" + \" [\" + this.hashCode() + \"] \");\n        onEvent(JZUserAction.ON_AUTO_COMPLETE);\n        dismissVolumeDialog();\n        dismissProgressDialog();\n        dismissBrightnessDialog();\n        onStateAutoComplete();\n\n        if (currentScreen == SCREEN_WINDOW_FULLSCREEN || currentScreen == SCREEN_WINDOW_TINY) {\n            backPress();\n        }\n        JZMediaManager.instance().releaseMediaPlayer();\n        JZUtils.saveProgress(getContext(), JZUtils.getCurrentFromDataSource(dataSourceObjects, currentUrlMapIndex), 0);\n    }\n\n    public void onCompletion() {\n        Log.i(TAG, \"onCompletion \" + \" [\" + this.hashCode() + \"] \");\n        if (currentState == CURRENT_STATE_PLAYING || currentState == CURRENT_STATE_PAUSE) {\n            long position = getCurrentPositionWhenPlaying();\n            JZUtils.saveProgress(getContext(), JZUtils.getCurrentFromDataSource(dataSourceObjects, currentUrlMapIndex), position);\n        }\n        cancelProgressTimer();\n        onStateNormal();\n        textureViewContainer.removeView(JZMediaManager.textureView);\n        JZMediaManager.instance().currentVideoWidth = 0;\n        JZMediaManager.instance().currentVideoHeight = 0;\n\n        AudioManager mAudioManager = (AudioManager) getContext().getSystemService(Context.AUDIO_SERVICE);\n        mAudioManager.abandonAudioFocus(onAudioFocusChangeListener);\n        JZUtils.scanForActivity(getContext()).getWindow().clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);\n        clearFullscreenLayout();\n        JZUtils.setRequestedOrientation(getContext(), NORMAL_ORIENTATION);\n\n        if (JZMediaManager.surface != null) JZMediaManager.surface.release();\n        if (JZMediaManager.savedSurfaceTexture != null)\n            JZMediaManager.savedSurfaceTexture.release();\n        JZMediaManager.textureView = null;\n        JZMediaManager.savedSurfaceTexture = null;\n    }\n\n    public void release() {\n        if (JZUtils.getCurrentFromDataSource(dataSourceObjects, currentUrlMapIndex).equals(JZMediaManager.getCurrentDataSource()) &&\n                (System.currentTimeMillis() - CLICK_QUIT_FULLSCREEN_TIME) > FULL_SCREEN_NORMAL_DELAY) {\n            //在非全屏的情况下只能backPress()\n            if (JZVideoPlayerManager.getSecondFloor() != null &&\n                    JZVideoPlayerManager.getSecondFloor().currentScreen == SCREEN_WINDOW_FULLSCREEN) {//点击全屏\n            } else if (JZVideoPlayerManager.getSecondFloor() == null && JZVideoPlayerManager.getFirstFloor() != null &&\n                    JZVideoPlayerManager.getFirstFloor().currentScreen == SCREEN_WINDOW_FULLSCREEN) {//直接全屏\n            } else {\n                Log.d(TAG, \"releaseMediaPlayer [\" + this.hashCode() + \"]\");\n                releaseAllVideos();\n            }\n        }\n    }\n\n    public void initTextureView() {\n        removeTextureView();\n        JZMediaManager.textureView = new JZResizeTextureView(getContext());\n        JZMediaManager.textureView.setSurfaceTextureListener(JZMediaManager.instance());\n    }\n\n    public void addTextureView() {\n        Log.d(TAG, \"addTextureView [\" + this.hashCode() + \"] \");\n        FrameLayout.LayoutParams layoutParams =\n                new FrameLayout.LayoutParams(\n                        ViewGroup.LayoutParams.MATCH_PARENT,\n                        ViewGroup.LayoutParams.MATCH_PARENT,\n                        Gravity.CENTER);\n        textureViewContainer.addView(JZMediaManager.textureView, layoutParams);\n    }\n\n    public void removeTextureView() {\n        JZMediaManager.savedSurfaceTexture = null;\n        if (JZMediaManager.textureView != null && JZMediaManager.textureView.getParent() != null) {\n            ((ViewGroup) JZMediaManager.textureView.getParent()).removeView(JZMediaManager.textureView);\n        }\n    }\n\n    public void clearFullscreenLayout() {\n        ViewGroup vp = (JZUtils.scanForActivity(getContext()))//.getWindow().getDecorView();\n                .findViewById(Window.ID_ANDROID_CONTENT);\n        View oldF = vp.findViewById(R.id.jz_fullscreen_id);\n        View oldT = vp.findViewById(R.id.jz_tiny_id);\n        if (oldF != null) {\n            vp.removeView(oldF);\n        }\n        if (oldT != null) {\n            vp.removeView(oldT);\n        }\n        showSupportActionBar(getContext());\n    }\n\n    public void clearFloatScreen() {\n        JZUtils.setRequestedOrientation(getContext(), NORMAL_ORIENTATION);\n        showSupportActionBar(getContext());\n        JZVideoPlayer currJzvd = JZVideoPlayerManager.getCurrentJzvd();\n        currJzvd.textureViewContainer.removeView(JZMediaManager.textureView);\n        ViewGroup vp = (JZUtils.scanForActivity(getContext()))//.getWindow().getDecorView();\n                .findViewById(Window.ID_ANDROID_CONTENT);\n        vp.removeView(currJzvd);\n        JZVideoPlayerManager.setSecondFloor(null);\n    }\n\n    public void onVideoSizeChanged() {\n        Log.i(TAG, \"onVideoSizeChanged \" + \" [\" + this.hashCode() + \"] \");\n        if (JZMediaManager.textureView != null) {\n            if (videoRotation != 0) {\n                JZMediaManager.textureView.setRotation(videoRotation);\n            }\n            JZMediaManager.textureView.setVideoSize(JZMediaManager.instance().currentVideoWidth, JZMediaManager.instance().currentVideoHeight);\n        }\n    }\n\n    public void startProgressTimer() {\n        Log.i(TAG, \"startProgressTimer: \" + \" [\" + this.hashCode() + \"] \");\n        cancelProgressTimer();\n        UPDATE_PROGRESS_TIMER = new Timer();\n        mProgressTimerTask = new ProgressTimerTask();\n        UPDATE_PROGRESS_TIMER.schedule(mProgressTimerTask, 0, 300);\n    }\n\n    public void cancelProgressTimer() {\n        if (UPDATE_PROGRESS_TIMER != null) {\n            UPDATE_PROGRESS_TIMER.cancel();\n        }\n        if (mProgressTimerTask != null) {\n            mProgressTimerTask.cancel();\n        }\n    }\n\n    public void setProgressAndText(int progress, long position, long duration) {\n//        Log.d(TAG, \"setProgressAndText: progress=\" + progress + \" position=\" + position + \" duration=\" + duration);\n        if (!mTouchingProgressBar) {\n            if (progress != 0) progressBar.setProgress(progress);\n        }\n        if (position != 0) currentTimeTextView.setText(JZUtils.stringForTime(position));\n        totalTimeTextView.setText(JZUtils.stringForTime(duration));\n    }\n\n    public void setBufferProgress(int bufferProgress) {\n        if (bufferProgress != 0) progressBar.setSecondaryProgress(bufferProgress);\n    }\n\n    public void resetProgressAndTime() {\n        progressBar.setProgress(0);\n        progressBar.setSecondaryProgress(0);\n        currentTimeTextView.setText(JZUtils.stringForTime(0));\n        totalTimeTextView.setText(JZUtils.stringForTime(0));\n    }\n\n    public long getCurrentPositionWhenPlaying() {\n        long position = 0;\n        //TODO 这块的判断应该根据MediaPlayer来\n//        if (JZMediaManager.instance().mediaPlayer == null)\n//            return position;//这行代码不应该在这，如果代码和逻辑万无一失的话，心头之恨呐\n        if (currentState == CURRENT_STATE_PLAYING ||\n                currentState == CURRENT_STATE_PAUSE) {\n            try {\n                position = JZMediaManager.getCurrentPosition();\n            } catch (IllegalStateException e) {\n                e.printStackTrace();\n                return position;\n            }\n        }\n        return position;\n    }\n\n    public long getDuration() {\n        long duration = 0;\n        //TODO MediaPlayer 判空的问题\n//        if (JZMediaManager.instance().mediaPlayer == null) return duration;\n        try {\n            duration = JZMediaManager.getDuration();\n        } catch (IllegalStateException e) {\n            e.printStackTrace();\n            return duration;\n        }\n        return duration;\n    }\n\n    @Override\n    public void onStartTrackingTouch(SeekBar seekBar) {\n        Log.i(TAG, \"bottomProgress onStartTrackingTouch [\" + this.hashCode() + \"] \");\n        cancelProgressTimer();\n        ViewParent vpdown = getParent();\n        while (vpdown != null) {\n            vpdown.requestDisallowInterceptTouchEvent(true);\n            vpdown = vpdown.getParent();\n        }\n    }\n\n    @Override\n    public void onStopTrackingTouch(SeekBar seekBar) {\n        Log.i(TAG, \"bottomProgress onStopTrackingTouch [\" + this.hashCode() + \"] \");\n        onEvent(JZUserAction.ON_SEEK_POSITION);\n        startProgressTimer();\n        ViewParent vpup = getParent();\n        while (vpup != null) {\n            vpup.requestDisallowInterceptTouchEvent(false);\n            vpup = vpup.getParent();\n        }\n        if (currentState != CURRENT_STATE_PLAYING &&\n                currentState != CURRENT_STATE_PAUSE) return;\n        long time = seekBar.getProgress() * getDuration() / 100;\n        JZMediaManager.seekTo(time);\n        Log.i(TAG, \"seekTo \" + time + \" [\" + this.hashCode() + \"] \");\n    }\n\n    @Override\n    public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {\n    }\n\n    public void startWindowFullscreen() {\n        Log.i(TAG, \"startWindowFullscreen \" + \" [\" + this.hashCode() + \"] \");\n        hideSupportActionBar(getContext());\n        JZUtils.setRequestedOrientation(getContext(), FULLSCREEN_ORIENTATION);\n\n        ViewGroup vp = (JZUtils.scanForActivity(getContext()))//.getWindow().getDecorView();\n                .findViewById(Window.ID_ANDROID_CONTENT);\n        View old = vp.findViewById(R.id.jz_fullscreen_id);\n        if (old != null) {\n            vp.removeView(old);\n        }\n        textureViewContainer.removeView(JZMediaManager.textureView);\n        try {\n            Constructor<JZVideoPlayer> constructor = (Constructor<JZVideoPlayer>) JZVideoPlayer.this.getClass().getConstructor(Context.class);\n            JZVideoPlayer jzVideoPlayer = constructor.newInstance(getContext());\n            jzVideoPlayer.setId(R.id.jz_fullscreen_id);\n            FrameLayout.LayoutParams lp = new FrameLayout.LayoutParams(\n                    ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);\n            vp.addView(jzVideoPlayer, lp);\n            jzVideoPlayer.setSystemUiVisibility(View.SYSTEM_UI_FLAG_HIDE_NAVIGATION\n                    | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY | View.SYSTEM_UI_FLAG_FULLSCREEN);\n            jzVideoPlayer.setUp(dataSourceObjects, currentUrlMapIndex, JZVideoPlayerStandard.SCREEN_WINDOW_FULLSCREEN, objects);\n            jzVideoPlayer.setState(currentState);\n            jzVideoPlayer.addTextureView();\n            JZVideoPlayerManager.setSecondFloor(jzVideoPlayer);\n//            final Animation ra = AnimationUtils.loadAnimation(getContext(), R.anim.start_fullscreen);\n//            jzVideoPlayer.setAnimation(ra);\n            onStateNormal();\n            jzVideoPlayer.progressBar.setSecondaryProgress(progressBar.getSecondaryProgress());\n            jzVideoPlayer.startProgressTimer();\n            CLICK_QUIT_FULLSCREEN_TIME = System.currentTimeMillis();\n        } catch (Exception e) {\n            e.printStackTrace();\n        }\n    }\n\n    public void startWindowTiny() {\n        Log.i(TAG, \"startWindowTiny \" + \" [\" + this.hashCode() + \"] \");\n        onEvent(JZUserAction.ON_ENTER_TINYSCREEN);\n        if (currentState == CURRENT_STATE_NORMAL || currentState == CURRENT_STATE_ERROR || currentState == CURRENT_STATE_AUTO_COMPLETE)\n            return;\n        ViewGroup vp = (JZUtils.scanForActivity(getContext()))//.getWindow().getDecorView();\n                .findViewById(Window.ID_ANDROID_CONTENT);\n        View old = vp.findViewById(R.id.jz_tiny_id);\n        if (old != null) {\n            vp.removeView(old);\n        }\n        textureViewContainer.removeView(JZMediaManager.textureView);\n\n        try {\n            Constructor<JZVideoPlayer> constructor = (Constructor<JZVideoPlayer>) JZVideoPlayer.this.getClass().getConstructor(Context.class);\n            JZVideoPlayer jzVideoPlayer = constructor.newInstance(getContext());\n            jzVideoPlayer.setId(R.id.jz_tiny_id);\n            FrameLayout.LayoutParams lp = new FrameLayout.LayoutParams(400, 400);\n            lp.gravity = Gravity.RIGHT | Gravity.BOTTOM;\n            vp.addView(jzVideoPlayer, lp);\n            jzVideoPlayer.setUp(dataSourceObjects, currentUrlMapIndex, JZVideoPlayerStandard.SCREEN_WINDOW_TINY, objects);\n            jzVideoPlayer.setState(currentState);\n            jzVideoPlayer.addTextureView();\n            JZVideoPlayerManager.setSecondFloor(jzVideoPlayer);\n            onStateNormal();\n        } catch (InstantiationException e) {\n            e.printStackTrace();\n        } catch (Exception e) {\n            e.printStackTrace();\n        }\n    }\n\n    public boolean isCurrentPlay() {\n        return isCurrentJZVD()\n                && JZUtils.dataSourceObjectsContainsUri(dataSourceObjects, JZMediaManager.getCurrentDataSource());//不仅正在播放的url不能一样，并且各个清晰度也不能一样\n    }\n\n    public boolean isCurrentJZVD() {\n        return JZVideoPlayerManager.getCurrentJzvd() != null\n                && JZVideoPlayerManager.getCurrentJzvd() == this;\n    }\n\n    //退出全屏和小窗的方法\n    public void playOnThisJzvd() {\n        Log.i(TAG, \"playOnThisJzvd \" + \" [\" + this.hashCode() + \"] \");\n        //1.清空全屏和小窗的jzvd\n        currentState = JZVideoPlayerManager.getSecondFloor().currentState;\n        currentUrlMapIndex = JZVideoPlayerManager.getSecondFloor().currentUrlMapIndex;\n        clearFloatScreen();\n        //2.在本jzvd上播放\n        setState(currentState);\n        addTextureView();\n    }\n\n    //重力感应的时候调用的函数，\n    public void autoFullscreen(float x) {\n        if (isCurrentPlay()\n                && currentState == CURRENT_STATE_PLAYING\n                && currentScreen != SCREEN_WINDOW_FULLSCREEN\n                && currentScreen != SCREEN_WINDOW_TINY) {\n            if (x > 0) {\n                JZUtils.setRequestedOrientation(getContext(), ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);\n            } else {\n                JZUtils.setRequestedOrientation(getContext(), ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE);\n            }\n            onEvent(JZUserAction.ON_ENTER_FULLSCREEN);\n            startWindowFullscreen();\n        }\n    }\n\n    public void autoQuitFullscreen() {\n        if ((System.currentTimeMillis() - lastAutoFullscreenTime) > 2000\n                && isCurrentPlay()\n                && currentState == CURRENT_STATE_PLAYING\n                && currentScreen == SCREEN_WINDOW_FULLSCREEN) {\n            lastAutoFullscreenTime = System.currentTimeMillis();\n            backPress();\n        }\n    }\n\n    public void onEvent(int type) {\n        if (JZ_USER_EVENT != null && isCurrentPlay() && dataSourceObjects != null) {\n            JZ_USER_EVENT.onEvent(type, JZUtils.getCurrentFromDataSource(dataSourceObjects, currentUrlMapIndex), currentScreen, objects);\n        }\n    }\n\n    public static void setMediaInterface(JZMediaInterface mediaInterface) {\n        JZMediaManager.instance().jzMediaInterface = mediaInterface;\n    }\n\n    //TODO 是否有用\n    public void onSeekComplete() {\n\n    }\n\n    public void showWifiDialog(int event) {\n    }\n\n    public void showProgressDialog(float deltaX,\n                                   String seekTime, long seekTimePosition,\n                                   String totalTime, long totalTimeDuration) {\n    }\n\n    public void dismissProgressDialog() {\n\n    }\n\n    public void showVolumeDialog(float deltaY, int volumePercent) {\n\n    }\n\n    public void dismissVolumeDialog() {\n\n    }\n\n    public void showBrightnessDialog(int brightnessPercent) {\n\n    }\n\n    public void dismissBrightnessDialog() {\n\n    }\n\n    public static class JZAutoFullscreenListener implements SensorEventListener {\n        @Override\n        public void onSensorChanged(SensorEvent event) {//可以得到传感器实时测量出来的变化值\n            final float x = event.values[SensorManager.DATA_X];\n            float y = event.values[SensorManager.DATA_Y];\n            float z = event.values[SensorManager.DATA_Z];\n            //过滤掉用力过猛会有一个反向的大数值\n            if (((x > -15 && x < -10) || (x < 15 && x > 10)) && Math.abs(y) < 1.5) {\n                if ((System.currentTimeMillis() - lastAutoFullscreenTime) > 2000) {\n                    if (JZVideoPlayerManager.getCurrentJzvd() != null) {\n                        JZVideoPlayerManager.getCurrentJzvd().autoFullscreen(x);\n                    }\n                    lastAutoFullscreenTime = System.currentTimeMillis();\n                }\n            }\n        }\n\n        @Override\n        public void onAccuracyChanged(Sensor sensor, int accuracy) {\n        }\n    }\n\n    public class ProgressTimerTask extends TimerTask {\n        @Override\n        public void run() {\n            if (currentState == CURRENT_STATE_PLAYING || currentState == CURRENT_STATE_PAUSE) {\n//                Log.v(TAG, \"onProgressUpdate \" + \"[\" + this.hashCode() + \"] \");\n                mHandler.post(new Runnable() {\n                    @Override\n                    public void run() {\n                        long position = getCurrentPositionWhenPlaying();\n                        long duration = getDuration();\n                        int progress = (int) (position * 100 / (duration == 0 ? 1 : duration));\n                        setProgressAndText(progress, position, duration);\n                    }\n                });\n            }\n        }\n    }\n\n}\n"
  },
  {
    "path": "librarys/jiaozivideoplayer/src/main/java/cn/jzvd/JZVideoPlayerManager.java",
    "content": "package cn.jzvd;\n\n/**\n * Put JZVideoPlayer into layout\n * From a JZVideoPlayer to another JZVideoPlayer\n * Created by Nathen on 16/7/26.\n */\npublic class JZVideoPlayerManager {\n\n    public static JZVideoPlayer FIRST_FLOOR_JZVD;\n    public static JZVideoPlayer SECOND_FLOOR_JZVD;\n\n    public static JZVideoPlayer getFirstFloor() {\n        return FIRST_FLOOR_JZVD;\n    }\n\n    public static void setFirstFloor(JZVideoPlayer jzVideoPlayer) {\n        FIRST_FLOOR_JZVD = jzVideoPlayer;\n    }\n\n    public static JZVideoPlayer getSecondFloor() {\n        return SECOND_FLOOR_JZVD;\n    }\n\n    public static void setSecondFloor(JZVideoPlayer jzVideoPlayer) {\n        SECOND_FLOOR_JZVD = jzVideoPlayer;\n    }\n\n    public static JZVideoPlayer getCurrentJzvd() {\n        if (getSecondFloor() != null) {\n            return getSecondFloor();\n        }\n        return getFirstFloor();\n    }\n\n    public static void completeAll() {\n        if (SECOND_FLOOR_JZVD != null) {\n            SECOND_FLOOR_JZVD.onCompletion();\n            SECOND_FLOOR_JZVD = null;\n        }\n        if (FIRST_FLOOR_JZVD != null) {\n            FIRST_FLOOR_JZVD.onCompletion();\n            FIRST_FLOOR_JZVD = null;\n        }\n    }\n}\n"
  },
  {
    "path": "librarys/jiaozivideoplayer/src/main/java/cn/jzvd/JZVideoPlayerStandard.java",
    "content": "package cn.jzvd;\n\nimport android.app.Activity;\nimport android.app.AlertDialog;\nimport android.app.Dialog;\nimport android.content.BroadcastReceiver;\nimport android.content.Context;\nimport android.content.DialogInterface;\nimport android.content.Intent;\nimport android.content.IntentFilter;\nimport android.graphics.Color;\nimport android.media.AudioManager;\nimport android.util.AttributeSet;\nimport android.util.DebugUtils;\nimport android.util.Log;\nimport android.view.Gravity;\nimport android.view.LayoutInflater;\nimport android.view.MotionEvent;\nimport android.view.View;\nimport android.view.ViewGroup;\nimport android.view.Window;\nimport android.view.WindowManager;\nimport android.widget.ImageView;\nimport android.widget.LinearLayout;\nimport android.widget.PopupWindow;\nimport android.widget.ProgressBar;\nimport android.widget.SeekBar;\nimport android.widget.TextView;\nimport android.widget.Toast;\n\nimport java.text.SimpleDateFormat;\nimport java.util.Date;\nimport java.util.LinkedHashMap;\nimport java.util.Timer;\nimport java.util.TimerTask;\n\n/**\n * Created by Nathen\n * On 2016/04/18 16:15\n */\npublic class JZVideoPlayerStandard extends JZVideoPlayer {\n\n    protected static Timer DISMISS_CONTROL_VIEW_TIMER;\n\n    public ImageView backButton;\n    public ProgressBar bottomProgressBar, loadingProgressBar;\n    public TextView titleTextView;\n    public ImageView thumbImageView;\n    public ImageView tinyBackImageView;\n    public LinearLayout batteryTimeLayout;\n    public ImageView batteryLevel;\n    public TextView videoCurrentTime;\n    public TextView replayTextView;\n    public TextView clarity;\n    public PopupWindow clarityPopWindow;\n    public TextView mRetryBtn;\n    public LinearLayout mRetryLayout;\n\n    protected DismissControlViewTimerTask mDismissControlViewTimerTask;\n    protected Dialog mProgressDialog;\n    protected ProgressBar mDialogProgressBar;\n    protected TextView mDialogSeekTime;\n    protected TextView mDialogTotalTime;\n    protected ImageView mDialogIcon;\n    protected Dialog mVolumeDialog;\n    protected ProgressBar mDialogVolumeProgressBar;\n    protected TextView mDialogVolumeTextView;\n    protected ImageView mDialogVolumeImageView;\n    protected Dialog mBrightnessDialog;\n    protected ProgressBar mDialogBrightnessProgressBar;\n    protected TextView mDialogBrightnessTextView;\n    private boolean brocasting = false;\n    private BroadcastReceiver battertReceiver = new BroadcastReceiver() {\n        public void onReceive(Context context, Intent intent) {\n            String action = intent.getAction();\n            if (Intent.ACTION_BATTERY_CHANGED.equals(action)) {\n                int level = intent.getIntExtra(\"level\", 0);\n                int scale = intent.getIntExtra(\"scale\", 100);\n                int percent = level * 100 / scale;\n                if (percent < 15) {\n                    batteryLevel.setBackgroundResource(R.drawable.jz_battery_level_10);\n                } else if (percent >= 15 && percent < 40) {\n                    batteryLevel.setBackgroundResource(R.drawable.jz_battery_level_30);\n                } else if (percent >= 40 && percent < 60) {\n                    batteryLevel.setBackgroundResource(R.drawable.jz_battery_level_50);\n                } else if (percent >= 60 && percent < 80) {\n                    batteryLevel.setBackgroundResource(R.drawable.jz_battery_level_70);\n                } else if (percent >= 80 && percent < 95) {\n                    batteryLevel.setBackgroundResource(R.drawable.jz_battery_level_90);\n                } else if (percent >= 95 && percent <= 100) {\n                    batteryLevel.setBackgroundResource(R.drawable.jz_battery_level_100);\n                }\n                getContext().unregisterReceiver(battertReceiver);\n                brocasting = false;\n            }\n        }\n    };\n\n    public JZVideoPlayerStandard(Context context) {\n        super(context);\n    }\n\n    public JZVideoPlayerStandard(Context context, AttributeSet attrs) {\n        super(context, attrs);\n    }\n\n    @Override\n    public void init(Context context) {\n        super.init(context);\n        batteryTimeLayout = findViewById(R.id.battery_time_layout);\n        bottomProgressBar = findViewById(R.id.bottom_progress);\n        titleTextView = findViewById(R.id.title);\n        backButton = findViewById(R.id.back);\n        thumbImageView = findViewById(R.id.thumb);\n        loadingProgressBar = findViewById(R.id.loading);\n        tinyBackImageView = findViewById(R.id.back_tiny);\n        batteryLevel = findViewById(R.id.battery_level);\n        videoCurrentTime = findViewById(R.id.video_current_time);\n        replayTextView = findViewById(R.id.replay_text);\n        clarity = findViewById(R.id.clarity);\n        mRetryBtn = findViewById(R.id.retry_btn);\n        mRetryLayout = findViewById(R.id.retry_layout);\n\n        thumbImageView.setOnClickListener(this);\n        backButton.setOnClickListener(this);\n        tinyBackImageView.setOnClickListener(this);\n        clarity.setOnClickListener(this);\n        mRetryBtn.setOnClickListener(this);\n    }\n\n    public void setUp(Object[] dataSourceObjects, int defaultUrlMapIndex, int screen, Object... objects) {\n        super.setUp(dataSourceObjects, defaultUrlMapIndex, screen, objects);\n        Log.d(\"titlevideo012\", dataSourceObjects[0] + \"\");\n        if (objects.length != 0) titleTextView.setText(objects[0].toString());\n        if (currentScreen == SCREEN_WINDOW_FULLSCREEN) {\n            fullscreenButton.setImageResource(R.drawable.jz_shrink);\n            backButton.setVisibility(View.VISIBLE);\n            tinyBackImageView.setVisibility(View.INVISIBLE);\n            batteryTimeLayout.setVisibility(View.VISIBLE);\n            if (((LinkedHashMap) dataSourceObjects[0]).size() == 1) {\n                clarity.setVisibility(GONE);\n            } else {\n                clarity.setText(JZUtils.getKeyFromDataSource(dataSourceObjects, currentUrlMapIndex));\n                clarity.setVisibility(View.VISIBLE);\n            }\n            changeStartButtonSize((int) getResources().getDimension(R.dimen.jz_start_button_w_h_fullscreen));\n        } else if (currentScreen == SCREEN_WINDOW_NORMAL\n                || currentScreen == SCREEN_WINDOW_LIST) {\n            fullscreenButton.setImageResource(R.drawable.jz_enlarge);\n            backButton.setVisibility(View.GONE);\n            tinyBackImageView.setVisibility(View.INVISIBLE);\n            changeStartButtonSize((int) getResources().getDimension(R.dimen.jz_start_button_w_h_normal));\n            batteryTimeLayout.setVisibility(View.GONE);\n            clarity.setVisibility(View.GONE);\n        } else if (currentScreen == SCREEN_WINDOW_TINY) {\n            tinyBackImageView.setVisibility(View.VISIBLE);\n            setAllControlsVisiblity(View.INVISIBLE, View.INVISIBLE, View.INVISIBLE,\n                    View.INVISIBLE, View.INVISIBLE, View.INVISIBLE, View.INVISIBLE);\n            batteryTimeLayout.setVisibility(View.GONE);\n            clarity.setVisibility(View.GONE);\n        }\n        setSystemTimeAndBattery();\n\n\n        if (tmp_test_back) {\n            tmp_test_back = false;\n            JZVideoPlayerManager.setFirstFloor(this);\n            backPress();\n        }\n    }\n\n    public void changeStartButtonSize(int size) {\n        ViewGroup.LayoutParams lp = startButton.getLayoutParams();\n        lp.height = size;\n        lp.width = size;\n        lp = loadingProgressBar.getLayoutParams();\n        lp.height = size;\n        lp.width = size;\n    }\n\n    @Override\n    public int getLayoutId() {\n        return R.layout.jz_layout_standard;\n    }\n\n    @Override\n    public void onStateNormal() {\n        super.onStateNormal();\n        changeUiToNormal();\n    }\n\n    @Override\n    public void onStatePreparing() {\n        super.onStatePreparing();\n        changeUiToPreparing();\n    }\n\n    @Override\n    public void onStatePreparingChangingUrl(int urlMapIndex, long seekToInAdvance) {\n        super.onStatePreparingChangingUrl(urlMapIndex, seekToInAdvance);\n        loadingProgressBar.setVisibility(VISIBLE);\n        startButton.setVisibility(INVISIBLE);\n    }\n\n    @Override\n    public void onStatePlaying() {\n        super.onStatePlaying();\n        changeUiToPlayingClear();\n    }\n\n    @Override\n    public void onStatePause() {\n        super.onStatePause();\n        changeUiToPauseShow();\n        cancelDismissControlViewTimer();\n    }\n\n    @Override\n    public void onStateError() {\n        super.onStateError();\n        changeUiToError();\n    }\n\n    @Override\n    public void onStateAutoComplete() {\n        super.onStateAutoComplete();\n        changeUiToComplete();\n        cancelDismissControlViewTimer();\n        bottomProgressBar.setProgress(100);\n    }\n\n    @Override\n    public boolean onTouch(View v, MotionEvent event) {\n        int id = v.getId();\n        if (id == R.id.surface_container) {\n            switch (event.getAction()) {\n                case MotionEvent.ACTION_DOWN:\n                    break;\n                case MotionEvent.ACTION_MOVE:\n                    break;\n                case MotionEvent.ACTION_UP:\n                    startDismissControlViewTimer();\n                    if (mChangePosition) {\n                        long duration = getDuration();\n                        int progress = (int) (mSeekTimePosition * 100 / (duration == 0 ? 1 : duration));\n                        bottomProgressBar.setProgress(progress);\n                    }\n                    if (!mChangePosition && !mChangeVolume) {\n                        onEvent(JZUserActionStandard.ON_CLICK_BLANK);\n                        onClickUiToggle();\n                    }\n                    break;\n            }\n        } else if (id == R.id.bottom_seek_progress) {\n            switch (event.getAction()) {\n                case MotionEvent.ACTION_DOWN:\n                    cancelDismissControlViewTimer();\n                    break;\n                case MotionEvent.ACTION_UP:\n                    startDismissControlViewTimer();\n                    break;\n            }\n        }\n        return super.onTouch(v, event);\n    }\n\n    @Override\n    public void onClick(View v) {\n        super.onClick(v);\n        int i = v.getId();\n        if (i == R.id.thumb) {\n            if (dataSourceObjects == null || JZUtils.getCurrentFromDataSource(dataSourceObjects, currentUrlMapIndex) == null) {\n                Toast.makeText(getContext(), getResources().getString(R.string.no_url), Toast.LENGTH_SHORT).show();\n                return;\n            }\n            if (currentState == CURRENT_STATE_NORMAL) {\n                if (!JZUtils.getCurrentFromDataSource(dataSourceObjects, currentUrlMapIndex).toString().startsWith(\"file\") &&\n                        !JZUtils.getCurrentFromDataSource(dataSourceObjects, currentUrlMapIndex).toString().startsWith(\"/\") &&\n                        !JZUtils.isWifiConnected(getContext()) && !WIFI_TIP_DIALOG_SHOWED) {\n                    showWifiDialog(JZUserActionStandard.ON_CLICK_START_THUMB);\n                    return;\n                }\n                onEvent(JZUserActionStandard.ON_CLICK_START_THUMB);\n                startVideo();\n            } else if (currentState == CURRENT_STATE_AUTO_COMPLETE) {\n                onClickUiToggle();\n            }\n        } else if (i == R.id.surface_container) {\n            startDismissControlViewTimer();\n        } else if (i == R.id.back) {\n            backPress();\n        } else if (i == R.id.back_tiny) {\n            if (JZVideoPlayerManager.getFirstFloor().currentScreen == JZVideoPlayer.SCREEN_WINDOW_LIST) {\n                quitFullscreenOrTinyWindow();\n            } else {\n                backPress();\n            }\n        } else if (i == R.id.clarity) {\n            LayoutInflater inflater = (LayoutInflater) getContext()\n                    .getSystemService(Context.LAYOUT_INFLATER_SERVICE);\n            final LinearLayout layout = (LinearLayout) inflater.inflate(R.layout.jz_layout_clarity, null);\n\n            OnClickListener mQualityListener = new OnClickListener() {\n                public void onClick(View v) {\n                    int index = (int) v.getTag();\n                    onStatePreparingChangingUrl(index, getCurrentPositionWhenPlaying());\n                    clarity.setText(JZUtils.getKeyFromDataSource(dataSourceObjects, currentUrlMapIndex));\n                    for (int j = 0; j < layout.getChildCount(); j++) {//设置点击之后的颜色\n                        if (j == currentUrlMapIndex) {\n                            ((TextView) layout.getChildAt(j)).setTextColor(Color.parseColor(\"#fff85959\"));\n                        } else {\n                            ((TextView) layout.getChildAt(j)).setTextColor(Color.parseColor(\"#ffffff\"));\n                        }\n                    }\n                    if (clarityPopWindow != null) {\n                        clarityPopWindow.dismiss();\n                    }\n                }\n            };\n\n            for (int j = 0; j < ((LinkedHashMap) dataSourceObjects[0]).size(); j++) {\n                String key = JZUtils.getKeyFromDataSource(dataSourceObjects, j);\n                TextView clarityItem = (TextView) View.inflate(getContext(), R.layout.jz_layout_clarity_item, null);\n                clarityItem.setText(key);\n                clarityItem.setTag(j);\n                layout.addView(clarityItem, j);\n                clarityItem.setOnClickListener(mQualityListener);\n                if (j == currentUrlMapIndex) {\n                    clarityItem.setTextColor(Color.parseColor(\"#fff85959\"));\n                }\n            }\n\n            clarityPopWindow = new PopupWindow(layout, LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT, true);\n            clarityPopWindow.setContentView(layout);\n            clarityPopWindow.showAsDropDown(clarity);\n            layout.measure(View.MeasureSpec.UNSPECIFIED, View.MeasureSpec.UNSPECIFIED);\n            clarityPopWindow.update(clarity, -40, 46, Math.round(layout.getMeasuredWidth() * 2), layout.getMeasuredHeight());\n        } else if (i == R.id.retry_btn) {\n            if (!JZUtils.getCurrentFromDataSource(dataSourceObjects, currentUrlMapIndex).toString().startsWith(\"file\") && !\n                    JZUtils.getCurrentFromDataSource(dataSourceObjects, currentUrlMapIndex).toString().startsWith(\"/\") &&\n                    !JZUtils.isWifiConnected(getContext()) && !WIFI_TIP_DIALOG_SHOWED) {\n                showWifiDialog(JZUserAction.ON_CLICK_START_ICON);\n                return;\n            }\n            initTextureView();//和开始播放的代码重复\n            addTextureView();\n            JZMediaManager.setDataSource(dataSourceObjects);\n            JZMediaManager.setCurrentDataSource(JZUtils.getCurrentFromDataSource(dataSourceObjects, currentUrlMapIndex));\n            onStatePreparing();\n            onEvent(JZUserAction.ON_CLICK_START_ERROR);\n        }\n    }\n\n    @Override\n    public void showWifiDialog(int action) {\n        super.showWifiDialog(action);\n        AlertDialog.Builder builder = new AlertDialog.Builder(getContext());\n        builder.setMessage(getResources().getString(R.string.tips_not_wifi));\n        builder.setPositiveButton(getResources().getString(R.string.tips_not_wifi_confirm), new DialogInterface.OnClickListener() {\n            @Override\n            public void onClick(DialogInterface dialog, int which) {\n                dialog.dismiss();\n                onEvent(JZUserActionStandard.ON_CLICK_START_THUMB);\n                startVideo();\n                WIFI_TIP_DIALOG_SHOWED = true;\n            }\n        });\n        builder.setNegativeButton(getResources().getString(R.string.tips_not_wifi_cancel), new DialogInterface.OnClickListener() {\n            @Override\n            public void onClick(DialogInterface dialog, int which) {\n                dialog.dismiss();\n            }\n        });\n        builder.setOnCancelListener(new DialogInterface.OnCancelListener() {\n            @Override\n            public void onCancel(DialogInterface dialog) {\n                dialog.dismiss();\n            }\n        });\n        builder.create().show();\n    }\n\n    @Override\n    public void onStartTrackingTouch(SeekBar seekBar) {\n        super.onStartTrackingTouch(seekBar);\n        cancelDismissControlViewTimer();\n    }\n\n    @Override\n    public void onStopTrackingTouch(SeekBar seekBar) {\n        super.onStopTrackingTouch(seekBar);\n        if (currentState == CURRENT_STATE_PLAYING) {\n            dissmissControlView();\n        } else {\n            startDismissControlViewTimer();\n        }\n    }\n\n    public void onClickUiToggle() {\n        if (bottomContainer.getVisibility() != View.VISIBLE) {\n            setSystemTimeAndBattery();\n            clarity.setText(JZUtils.getKeyFromDataSource(dataSourceObjects, currentUrlMapIndex));\n        }\n        if (currentState == CURRENT_STATE_PREPARING) {\n            changeUiToPreparing();\n            if (bottomContainer.getVisibility() == View.VISIBLE) {\n            } else {\n                setSystemTimeAndBattery();\n            }\n        } else if (currentState == CURRENT_STATE_PLAYING) {\n            if (bottomContainer.getVisibility() == View.VISIBLE) {\n                changeUiToPlayingClear();\n            } else {\n                changeUiToPlayingShow();\n            }\n        } else if (currentState == CURRENT_STATE_PAUSE) {\n            if (bottomContainer.getVisibility() == View.VISIBLE) {\n                changeUiToPauseClear();\n            } else {\n                changeUiToPauseShow();\n            }\n        }\n    }\n\n    public void setSystemTimeAndBattery() {\n        SimpleDateFormat dateFormater = new SimpleDateFormat(\"HH:mm\");\n        Date date = new Date();\n        videoCurrentTime.setText(dateFormater.format(date));\n        if (!brocasting) {\n            getContext().registerReceiver(\n                    battertReceiver,\n                    new IntentFilter(Intent.ACTION_BATTERY_CHANGED)\n            );\n        }\n    }\n\n    public void onCLickUiToggleToClear() {\n        if (currentState == CURRENT_STATE_PREPARING) {\n            if (bottomContainer.getVisibility() == View.VISIBLE) {\n                changeUiToPreparing();\n            } else {\n            }\n        } else if (currentState == CURRENT_STATE_PLAYING) {\n            if (bottomContainer.getVisibility() == View.VISIBLE) {\n                changeUiToPlayingClear();\n            } else {\n            }\n        } else if (currentState == CURRENT_STATE_PAUSE) {\n            if (bottomContainer.getVisibility() == View.VISIBLE) {\n                changeUiToPauseClear();\n            } else {\n            }\n        } else if (currentState == CURRENT_STATE_AUTO_COMPLETE) {\n            if (bottomContainer.getVisibility() == View.VISIBLE) {\n                changeUiToComplete();\n            } else {\n            }\n        }\n    }\n\n    @Override\n    public void setProgressAndText(int progress, long position, long duration) {\n        super.setProgressAndText(progress, position, duration);\n        if (progress != 0) bottomProgressBar.setProgress(progress);\n    }\n\n    @Override\n    public void setBufferProgress(int bufferProgress) {\n        super.setBufferProgress(bufferProgress);\n        if (bufferProgress != 0) bottomProgressBar.setSecondaryProgress(bufferProgress);\n    }\n\n    @Override\n    public void resetProgressAndTime() {\n        super.resetProgressAndTime();\n        bottomProgressBar.setProgress(0);\n        bottomProgressBar.setSecondaryProgress(0);\n    }\n\n    public void changeUiToNormal() {\n        switch (currentScreen) {\n            case SCREEN_WINDOW_NORMAL:\n            case SCREEN_WINDOW_LIST:\n                setAllControlsVisiblity(View.VISIBLE, View.INVISIBLE, View.VISIBLE,\n                        View.INVISIBLE, View.VISIBLE, View.INVISIBLE, View.INVISIBLE);\n                updateStartImage();\n                break;\n            case SCREEN_WINDOW_FULLSCREEN:\n                setAllControlsVisiblity(View.VISIBLE, View.INVISIBLE, View.VISIBLE,\n                        View.INVISIBLE, View.VISIBLE, View.INVISIBLE, View.INVISIBLE);\n                updateStartImage();\n                break;\n            case SCREEN_WINDOW_TINY:\n                break;\n        }\n    }\n\n    public void changeUiToPreparing() {\n        switch (currentScreen) {\n            case SCREEN_WINDOW_NORMAL:\n            case SCREEN_WINDOW_LIST:\n                setAllControlsVisiblity(View.INVISIBLE, View.INVISIBLE, View.INVISIBLE,\n                        View.VISIBLE, View.VISIBLE, View.INVISIBLE, View.INVISIBLE);\n                updateStartImage();\n                break;\n            case SCREEN_WINDOW_FULLSCREEN:\n                setAllControlsVisiblity(View.INVISIBLE, View.INVISIBLE, View.INVISIBLE,\n                        View.VISIBLE, View.VISIBLE, View.INVISIBLE, View.INVISIBLE);\n                updateStartImage();\n                break;\n            case SCREEN_WINDOW_TINY:\n                break;\n        }\n\n    }\n\n    public void changeUiToPlayingShow() {\n        switch (currentScreen) {\n            case SCREEN_WINDOW_NORMAL:\n            case SCREEN_WINDOW_LIST:\n                setAllControlsVisiblity(View.VISIBLE, View.VISIBLE, View.VISIBLE,\n                        View.INVISIBLE, View.INVISIBLE, View.INVISIBLE, View.INVISIBLE);\n                updateStartImage();\n                break;\n            case SCREEN_WINDOW_FULLSCREEN:\n                setAllControlsVisiblity(View.VISIBLE, View.VISIBLE, View.VISIBLE,\n                        View.INVISIBLE, View.INVISIBLE, View.INVISIBLE, View.INVISIBLE);\n                updateStartImage();\n                break;\n            case SCREEN_WINDOW_TINY:\n                break;\n        }\n\n    }\n\n    public void changeUiToPlayingClear() {\n        switch (currentScreen) {\n            case SCREEN_WINDOW_NORMAL:\n            case SCREEN_WINDOW_LIST:\n                setAllControlsVisiblity(View.INVISIBLE, View.INVISIBLE, View.INVISIBLE,\n                        View.INVISIBLE, View.INVISIBLE, View.VISIBLE, View.INVISIBLE);\n                break;\n            case SCREEN_WINDOW_FULLSCREEN:\n                setAllControlsVisiblity(View.INVISIBLE, View.INVISIBLE, View.INVISIBLE,\n                        View.INVISIBLE, View.INVISIBLE, View.VISIBLE, View.INVISIBLE);\n                break;\n            case SCREEN_WINDOW_TINY:\n                break;\n        }\n\n    }\n\n    public void changeUiToPauseShow() {\n        switch (currentScreen) {\n            case SCREEN_WINDOW_NORMAL:\n            case SCREEN_WINDOW_LIST:\n                setAllControlsVisiblity(View.VISIBLE, View.VISIBLE, View.VISIBLE,\n                        View.INVISIBLE, View.INVISIBLE, View.INVISIBLE, View.INVISIBLE);\n                updateStartImage();\n                break;\n            case SCREEN_WINDOW_FULLSCREEN:\n                setAllControlsVisiblity(View.VISIBLE, View.VISIBLE, View.VISIBLE,\n                        View.INVISIBLE, View.INVISIBLE, View.INVISIBLE, View.INVISIBLE);\n                updateStartImage();\n                break;\n            case SCREEN_WINDOW_TINY:\n                break;\n        }\n    }\n\n    public void changeUiToPauseClear() {\n        switch (currentScreen) {\n            case SCREEN_WINDOW_NORMAL:\n            case SCREEN_WINDOW_LIST:\n                setAllControlsVisiblity(View.INVISIBLE, View.INVISIBLE, View.INVISIBLE,\n                        View.INVISIBLE, View.INVISIBLE, View.VISIBLE, View.INVISIBLE);\n                break;\n            case SCREEN_WINDOW_FULLSCREEN:\n                setAllControlsVisiblity(View.INVISIBLE, View.INVISIBLE, View.INVISIBLE,\n                        View.INVISIBLE, View.INVISIBLE, View.VISIBLE, View.INVISIBLE);\n                break;\n            case SCREEN_WINDOW_TINY:\n                break;\n        }\n\n    }\n\n    public void changeUiToComplete() {\n        switch (currentScreen) {\n            case SCREEN_WINDOW_NORMAL:\n            case SCREEN_WINDOW_LIST:\n                setAllControlsVisiblity(View.VISIBLE, View.INVISIBLE, View.VISIBLE,\n                        View.INVISIBLE, View.VISIBLE, View.INVISIBLE, View.INVISIBLE);\n                updateStartImage();\n                break;\n            case SCREEN_WINDOW_FULLSCREEN:\n                setAllControlsVisiblity(View.VISIBLE, View.INVISIBLE, View.VISIBLE,\n                        View.INVISIBLE, View.VISIBLE, View.INVISIBLE, View.INVISIBLE);\n                updateStartImage();\n                break;\n            case SCREEN_WINDOW_TINY:\n                break;\n        }\n\n    }\n\n    public void changeUiToError() {\n        switch (currentScreen) {\n            case SCREEN_WINDOW_NORMAL:\n            case SCREEN_WINDOW_LIST:\n                setAllControlsVisiblity(View.INVISIBLE, View.INVISIBLE, View.VISIBLE,\n                        View.INVISIBLE, View.INVISIBLE, View.INVISIBLE, View.VISIBLE);\n                updateStartImage();\n                break;\n            case SCREEN_WINDOW_FULLSCREEN:\n                setAllControlsVisiblity(View.INVISIBLE, View.INVISIBLE, View.VISIBLE,\n                        View.INVISIBLE, View.INVISIBLE, View.INVISIBLE, View.VISIBLE);\n                updateStartImage();\n                break;\n            case SCREEN_WINDOW_TINY:\n                break;\n        }\n\n    }\n\n    public void setAllControlsVisiblity(int topCon, int bottomCon, int startBtn, int loadingPro,\n                                        int thumbImg, int bottomPro, int retryLayout) {\n        topContainer.setVisibility(topCon);\n        bottomContainer.setVisibility(bottomCon);\n        startButton.setVisibility(startBtn);\n        loadingProgressBar.setVisibility(loadingPro);\n        thumbImageView.setVisibility(thumbImg);\n        bottomProgressBar.setVisibility(bottomPro);\n        mRetryLayout.setVisibility(retryLayout);\n    }\n\n    public void updateStartImage() {\n        if (currentState == CURRENT_STATE_PLAYING) {\n            startButton.setVisibility(VISIBLE);\n            startButton.setImageResource(R.drawable.jz_click_pause_selector);\n            replayTextView.setVisibility(INVISIBLE);\n        } else if (currentState == CURRENT_STATE_ERROR) {\n            startButton.setVisibility(INVISIBLE);\n            replayTextView.setVisibility(INVISIBLE);\n        } else if (currentState == CURRENT_STATE_AUTO_COMPLETE) {\n            startButton.setVisibility(VISIBLE);\n            startButton.setImageResource(R.drawable.jz_click_replay_selector);\n            replayTextView.setVisibility(VISIBLE);\n        } else {\n            startButton.setImageResource(R.drawable.jz_click_play_selector);\n            replayTextView.setVisibility(INVISIBLE);\n        }\n    }\n\n    @Override\n    public void showProgressDialog(float deltaX, String seekTime, long seekTimePosition, String totalTime, long totalTimeDuration) {\n        super.showProgressDialog(deltaX, seekTime, seekTimePosition, totalTime, totalTimeDuration);\n        if (mProgressDialog == null) {\n            View localView = LayoutInflater.from(getContext()).inflate(R.layout.jz_dialog_progress, null);\n            mDialogProgressBar = localView.findViewById(R.id.duration_progressbar);\n            mDialogSeekTime = localView.findViewById(R.id.tv_current);\n            mDialogTotalTime = localView.findViewById(R.id.tv_duration);\n            mDialogIcon = localView.findViewById(R.id.duration_image_tip);\n            mProgressDialog = createDialogWithView(localView);\n        }\n        if (!mProgressDialog.isShowing()) {\n            mProgressDialog.show();\n        }\n\n        mDialogSeekTime.setText(seekTime);\n        mDialogTotalTime.setText(\" / \" + totalTime);\n        mDialogProgressBar.setProgress(totalTimeDuration <= 0 ? 0 : (int) (seekTimePosition * 100 / totalTimeDuration));\n        if (deltaX > 0) {\n            mDialogIcon.setBackgroundResource(R.drawable.jz_forward_icon);\n        } else {\n            mDialogIcon.setBackgroundResource(R.drawable.jz_backward_icon);\n        }\n        onCLickUiToggleToClear();\n    }\n\n    @Override\n    public void dismissProgressDialog() {\n        super.dismissProgressDialog();\n        if (mProgressDialog != null) {\n            mProgressDialog.dismiss();\n        }\n    }\n\n    @Override\n    public void showVolumeDialog(float deltaY, int volumePercent) {\n        super.showVolumeDialog(deltaY, volumePercent);\n        if (mVolumeDialog == null) {\n            View localView = LayoutInflater.from(getContext()).inflate(R.layout.jz_dialog_volume, null);\n            mDialogVolumeImageView = localView.findViewById(R.id.volume_image_tip);\n            mDialogVolumeTextView = localView.findViewById(R.id.tv_volume);\n            mDialogVolumeProgressBar = localView.findViewById(R.id.volume_progressbar);\n            mVolumeDialog = createDialogWithView(localView);\n        }\n        if (!mVolumeDialog.isShowing()) {\n            mVolumeDialog.show();\n        }\n        if (volumePercent <= 0) {\n            mDialogVolumeImageView.setBackgroundResource(R.drawable.jz_close_volume);\n        } else {\n            mDialogVolumeImageView.setBackgroundResource(R.drawable.jz_add_volume);\n        }\n        if (volumePercent > 100) {\n            volumePercent = 100;\n        } else if (volumePercent < 0) {\n            volumePercent = 0;\n        }\n        mDialogVolumeTextView.setText(volumePercent + \"%\");\n        mDialogVolumeProgressBar.setProgress(volumePercent);\n        onCLickUiToggleToClear();\n    }\n\n    @Override\n    public void dismissVolumeDialog() {\n        super.dismissVolumeDialog();\n        if (mVolumeDialog != null) {\n            mVolumeDialog.dismiss();\n        }\n    }\n\n    @Override\n    public void showBrightnessDialog(int brightnessPercent) {\n        super.showBrightnessDialog(brightnessPercent);\n        if (mBrightnessDialog == null) {\n            View localView = LayoutInflater.from(getContext()).inflate(R.layout.jz_dialog_brightness, null);\n            mDialogBrightnessTextView = localView.findViewById(R.id.tv_brightness);\n            mDialogBrightnessProgressBar = localView.findViewById(R.id.brightness_progressbar);\n            mBrightnessDialog = createDialogWithView(localView);\n        }\n        if (!mBrightnessDialog.isShowing()) {\n            mBrightnessDialog.show();\n        }\n        if (brightnessPercent > 100) {\n            brightnessPercent = 100;\n        } else if (brightnessPercent < 0) {\n            brightnessPercent = 0;\n        }\n        mDialogBrightnessTextView.setText(brightnessPercent + \"%\");\n        mDialogBrightnessProgressBar.setProgress(brightnessPercent);\n        onCLickUiToggleToClear();\n    }\n\n    @Override\n    public void dismissBrightnessDialog() {\n        super.dismissBrightnessDialog();\n        if (mBrightnessDialog != null) {\n            mBrightnessDialog.dismiss();\n        }\n    }\n\n    public Dialog createDialogWithView(View localView) {\n        Dialog dialog = new Dialog(getContext(), R.style.jz_style_dialog_progress);\n        dialog.setContentView(localView);\n        Window window = dialog.getWindow();\n        window.addFlags(Window.FEATURE_ACTION_BAR);\n        window.addFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL);\n        window.addFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE);\n        window.setLayout(-2, -2);\n        WindowManager.LayoutParams localLayoutParams = window.getAttributes();\n        localLayoutParams.gravity = Gravity.CENTER;\n        window.setAttributes(localLayoutParams);\n        return dialog;\n    }\n\n    public void startDismissControlViewTimer() {\n        cancelDismissControlViewTimer();\n        DISMISS_CONTROL_VIEW_TIMER = new Timer();\n        mDismissControlViewTimerTask = new DismissControlViewTimerTask();\n        DISMISS_CONTROL_VIEW_TIMER.schedule(mDismissControlViewTimerTask, 2500);\n    }\n\n    public void cancelDismissControlViewTimer() {\n        if (DISMISS_CONTROL_VIEW_TIMER != null) {\n            DISMISS_CONTROL_VIEW_TIMER.cancel();\n        }\n        if (mDismissControlViewTimerTask != null) {\n            mDismissControlViewTimerTask.cancel();\n        }\n\n    }\n\n    @Override\n    public void onAutoCompletion() {\n        super.onAutoCompletion();\n        cancelDismissControlViewTimer();\n    }\n\n    @Override\n    public void onCompletion() {\n        super.onCompletion();\n        cancelDismissControlViewTimer();\n        if (clarityPopWindow != null) {\n            clarityPopWindow.dismiss();\n        }\n    }\n\n    public void dissmissControlView() {\n        if (currentState != CURRENT_STATE_NORMAL\n                && currentState != CURRENT_STATE_ERROR\n                && currentState != CURRENT_STATE_AUTO_COMPLETE) {\n            if (getContext() != null && getContext() instanceof Activity) {\n                ((Activity) getContext()).runOnUiThread(new Runnable() {\n                    @Override\n                    public void run() {\n                        bottomContainer.setVisibility(View.INVISIBLE);\n                        topContainer.setVisibility(View.INVISIBLE);\n                        startButton.setVisibility(View.INVISIBLE);\n                        if (clarityPopWindow != null) {\n                            clarityPopWindow.dismiss();\n                        }\n                        if (currentScreen != SCREEN_WINDOW_TINY) {\n                            bottomProgressBar.setVisibility(View.VISIBLE);\n                        }\n                    }\n                });\n            }\n        }\n    }\n\n    public class DismissControlViewTimerTask extends TimerTask {\n\n        @Override\n        public void run() {\n            dissmissControlView();\n        }\n    }\n}\n"
  },
  {
    "path": "librarys/jiaozivideoplayer/src/main/res/anim/quit_fullscreen.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<set xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:interpolator=\"@android:anim/linear_interpolator\">\n    <rotate\n        android:duration=\"5\"\n        android:fromDegrees=\"0\"\n        android:pivotX=\"50%\"\n        android:pivotY=\"50%\"\n        android:toDegrees=\"-2\" />\n</set>"
  },
  {
    "path": "librarys/jiaozivideoplayer/src/main/res/anim/start_fullscreen.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<set xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:interpolator=\"@android:anim/linear_interpolator\">\n    <rotate\n        android:duration=\"20\"\n        android:fromDegrees=\"-2\"\n        android:pivotX=\"50%\"\n        android:pivotY=\"50%\"\n        android:toDegrees=\"0\" />\n</set>"
  },
  {
    "path": "librarys/jiaozivideoplayer/src/main/res/drawable/jz_bottom_progress.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<layer-list xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <item android:id=\"@android:id/background\">\n        <shape>\n            <solid android:color=\"#a5ffffff\" />\n            <size android:height=\"4dp\" />\n            <corners android:radius=\"1dp\" />\n        </shape>\n    </item>\n    <item android:id=\"@android:id/secondaryProgress\">\n        <clip>\n            <shape>\n                <solid android:color=\"#ffe0e0e0\" />\n                <size android:height=\"4dp\" />\n                <corners android:radius=\"1dp\" />\n            </shape>\n        </clip>\n    </item>\n    <item android:id=\"@android:id/progress\">\n        <clip>\n            <shape>\n                <solid android:color=\"#fff85959\" />\n                <size android:height=\"4dp\" />\n                <corners android:radius=\"1dp\" />\n            </shape>\n        </clip>\n    </item>\n</layer-list>\n"
  },
  {
    "path": "librarys/jiaozivideoplayer/src/main/res/drawable/jz_bottom_seek_progress.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<layer-list xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <item android:id=\"@android:id/background\">\n        <shape>\n            <solid android:color=\"#a5ffffff\" />\n            <size android:height=\"1dp\" />\n            <corners android:radius=\"1.5dip\" />\n        </shape>\n    </item>\n    <item android:id=\"@android:id/secondaryProgress\">\n        <clip>\n            <shape>\n                <solid android:color=\"#ffffffff\" />\n                <size android:height=\"1dp\" />\n                <corners android:radius=\"1.5dip\" />\n            </shape>\n        </clip>\n    </item>\n    <item android:id=\"@android:id/progress\">\n        <clip>\n            <shape>\n                <solid android:color=\"#fff85959\" />\n                <size android:height=\"1dp\" />\n                <corners android:radius=\"1.5dip\" />\n            </shape>\n        </clip>\n    </item>\n</layer-list>\n"
  },
  {
    "path": "librarys/jiaozivideoplayer/src/main/res/drawable/jz_bottom_seek_thumb.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<selector xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <item android:drawable=\"@drawable/jz_seek_thumb_pressed\" android:state_pressed=\"true\" />\n    <item android:drawable=\"@drawable/jz_seek_thumb_normal\" />\n</selector>\n"
  },
  {
    "path": "librarys/jiaozivideoplayer/src/main/res/drawable/jz_click_back_selector.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<selector xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <item android:drawable=\"@drawable/jz_back_pressed\" android:state_pressed=\"true\" />\n    <item android:drawable=\"@drawable/jz_back_normal\" />\n</selector>\n"
  },
  {
    "path": "librarys/jiaozivideoplayer/src/main/res/drawable/jz_click_back_tiny_selector.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<selector xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <item android:drawable=\"@drawable/jz_back_tiny_pressed\" android:state_pressed=\"true\" />\n    <item android:drawable=\"@drawable/jz_back_tiny_normal\" />\n</selector>\n"
  },
  {
    "path": "librarys/jiaozivideoplayer/src/main/res/drawable/jz_click_pause_selector.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<selector xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <item android:drawable=\"@drawable/jz_pause_pressed\" android:state_pressed=\"true\" />\n    <item android:drawable=\"@drawable/jz_pause_normal\" />\n\n</selector>\n"
  },
  {
    "path": "librarys/jiaozivideoplayer/src/main/res/drawable/jz_click_play_selector.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<selector xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <item android:drawable=\"@drawable/jz_play_pressed\" android:state_pressed=\"true\" />\n    <item android:drawable=\"@drawable/jz_play_normal\" />\n</selector>\n"
  },
  {
    "path": "librarys/jiaozivideoplayer/src/main/res/drawable/jz_click_replay_selector.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<selector xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <item android:drawable=\"@drawable/jz_restart_pressed\" android:state_pressed=\"true\" />\n    <item android:drawable=\"@drawable/jz_restart_normal\" />\n</selector>\n"
  },
  {
    "path": "librarys/jiaozivideoplayer/src/main/res/drawable/jz_click_share_selector.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<selector xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <item android:drawable=\"@drawable/jz_share_pressed\" android:state_pressed=\"true\" />\n    <item android:drawable=\"@drawable/jz_share_normal\" />\n</selector>\n"
  },
  {
    "path": "librarys/jiaozivideoplayer/src/main/res/drawable/jz_dialog_progress.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<layer-list xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <item android:id=\"@android:id/background\">\n        <shape>\n            <solid android:color=\"#ffffffff\" />\n            <corners android:radius=\"2dp\" />\n        </shape>\n    </item>\n    <item android:id=\"@android:id/progress\">\n        <clip>\n            <shape>\n                <solid android:color=\"#fff85959\" />\n                <corners android:radius=\"2dp\" />\n            </shape>\n        </clip>\n    </item>\n</layer-list>\n"
  },
  {
    "path": "librarys/jiaozivideoplayer/src/main/res/drawable/jz_dialog_progress_bg.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<shape xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <solid android:color=\"#cc000000\" />\n    <corners\n        android:bottomLeftRadius=\"6dp\"\n        android:bottomRightRadius=\"6dp\"\n        android:topLeftRadius=\"6dp\"\n        android:topRightRadius=\"6dp\" />\n</shape>"
  },
  {
    "path": "librarys/jiaozivideoplayer/src/main/res/drawable/jz_loading.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<rotate xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:drawable=\"@drawable/jz_loading_bg\"\n    android:fromDegrees=\"0.0\"\n    android:pivotX=\"50.0%\"\n    android:pivotY=\"50.0%\"\n    android:toDegrees=\"360.0\" />\n"
  },
  {
    "path": "librarys/jiaozivideoplayer/src/main/res/drawable/jz_seek_thumb_normal.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<shape xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:shape=\"oval\">\n    <solid android:color=\"#ffffffff\" />\n    <size\n        android:width=\"15dp\"\n        android:height=\"15dp\" />\n</shape>\n"
  },
  {
    "path": "librarys/jiaozivideoplayer/src/main/res/drawable/jz_seek_thumb_pressed.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<shape xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:shape=\"oval\">\n    <solid android:color=\"#fff0f0f0\" />\n    <size\n        android:width=\"15dp\"\n        android:height=\"15dp\" />\n</shape>\n"
  },
  {
    "path": "librarys/jiaozivideoplayer/src/main/res/drawable/jz_volume_progress_bg.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<layer-list xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <item android:id=\"@android:id/background\">\n        <shape>\n            <solid android:color=\"#ffffffff\" />\n            <corners android:radius=\"2dp\" />\n        </shape>\n    </item>\n    <item android:id=\"@android:id/progress\">\n        <clip\n            android:clipOrientation=\"vertical\"\n            android:gravity=\"bottom\">\n            <shape>\n                <solid android:color=\"#fff85959\" />\n                <corners android:radius=\"2dp\" />\n            </shape>\n        </clip>\n    </item>\n</layer-list>\n"
  },
  {
    "path": "librarys/jiaozivideoplayer/src/main/res/drawable/retry_bg.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<shape xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <corners android:radius=\"7dp\" />\n    <stroke\n        android:width=\"1dp\"\n        android:color=\"@android:color/white\" />\n</shape>"
  },
  {
    "path": "librarys/jiaozivideoplayer/src/main/res/layout/jz_dialog_brightness.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    android:background=\"@drawable/jz_dialog_progress_bg\"\n    android:orientation=\"vertical\">\n\n    <LinearLayout\n        android:layout_width=\"155dp\"\n        android:layout_height=\"120dp\"\n        android:orientation=\"vertical\">\n\n        <ImageView\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_gravity=\"center_horizontal\"\n            android:layout_marginTop=\"20dp\"\n            android:src=\"@drawable/jz_brightness_video\" />\n\n        <TextView\n            android:id=\"@+id/tv_brightness\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_gravity=\"center_horizontal\"\n            android:layout_marginTop=\"12dp\"\n            android:gravity=\"center_horizontal\"\n            android:textColor=\"#ffffffff\"\n            android:textSize=\"16sp\" />\n\n        <ProgressBar\n            android:id=\"@+id/brightness_progressbar\"\n            style=\"@android:style/Widget.ProgressBar.Horizontal\"\n            android:layout_width=\"fill_parent\"\n            android:layout_height=\"3dp\"\n            android:layout_gravity=\"center_horizontal\"\n            android:layout_marginBottom=\"20dp\"\n            android:layout_marginLeft=\"24dp\"\n            android:layout_marginRight=\"24dp\"\n            android:layout_marginTop=\"8dp\"\n            android:max=\"100\"\n            android:progressDrawable=\"@drawable/jz_dialog_progress\" />\n    </LinearLayout>\n</LinearLayout>"
  },
  {
    "path": "librarys/jiaozivideoplayer/src/main/res/layout/jz_dialog_progress.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:layout_width=\"wrap_content\"\n    android:layout_height=\"wrap_content\"\n    android:background=\"@drawable/jz_dialog_progress_bg\"\n    android:orientation=\"vertical\">\n\n    <LinearLayout\n        android:layout_width=\"152dp\"\n        android:layout_height=\"wrap_content\"\n        android:orientation=\"vertical\">\n\n        <ImageView\n            android:id=\"@+id/duration_image_tip\"\n            android:layout_width=\"36dp\"\n            android:layout_height=\"27dp\"\n            android:layout_gravity=\"center_horizontal\"\n            android:layout_marginTop=\"16dp\" />\n\n        <LinearLayout\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_gravity=\"center_horizontal\"\n            android:layout_marginTop=\"20dp\"\n            android:gravity=\"center_horizontal\"\n            android:orientation=\"horizontal\">\n\n            <TextView\n                android:id=\"@+id/tv_current\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:textColor=\"#fff85959\"\n                android:textSize=\"14sp\" />\n\n            <TextView\n                android:id=\"@+id/tv_duration\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:textColor=\"#ffffffff\"\n                android:textSize=\"14sp\" />\n        </LinearLayout>\n\n        <ProgressBar\n            android:id=\"@+id/duration_progressbar\"\n            style=\"@android:style/Widget.ProgressBar.Horizontal\"\n            android:layout_width=\"fill_parent\"\n            android:layout_height=\"4dp\"\n            android:layout_gravity=\"center_horizontal\"\n            android:layout_marginBottom=\"16dp\"\n            android:layout_marginLeft=\"16dp\"\n            android:layout_marginRight=\"16dp\"\n            android:layout_marginTop=\"8dp\"\n            android:max=\"100\"\n            android:progressDrawable=\"@drawable/jz_dialog_progress\" />\n    </LinearLayout>\n</LinearLayout>\n"
  },
  {
    "path": "librarys/jiaozivideoplayer/src/main/res/layout/jz_dialog_volume.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:layout_width=\"wrap_content\"\n    android:layout_height=\"wrap_content\"\n    android:background=\"@drawable/jz_dialog_progress_bg\"\n    android:orientation=\"vertical\">\n\n    <LinearLayout\n        android:layout_width=\"155dp\"\n        android:layout_height=\"120dp\"\n        android:orientation=\"vertical\">\n\n        <ImageView\n            android:id=\"@+id/volume_image_tip\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_gravity=\"center_horizontal\"\n            android:layout_marginTop=\"20dp\" />\n\n        <TextView\n            android:id=\"@+id/tv_volume\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_gravity=\"center_horizontal\"\n            android:layout_marginTop=\"12dp\"\n            android:gravity=\"center_horizontal\"\n            android:textColor=\"#ffffffff\"\n            android:textSize=\"16sp\" />\n\n        <ProgressBar\n            android:id=\"@+id/volume_progressbar\"\n            style=\"@android:style/Widget.ProgressBar.Horizontal\"\n            android:layout_width=\"fill_parent\"\n            android:layout_height=\"3dp\"\n            android:layout_gravity=\"center_horizontal\"\n            android:layout_marginBottom=\"20dp\"\n            android:layout_marginLeft=\"24dp\"\n            android:layout_marginRight=\"24dp\"\n            android:layout_marginTop=\"8dp\"\n            android:max=\"100\"\n            android:progressDrawable=\"@drawable/jz_dialog_progress\" />\n    </LinearLayout>\n</LinearLayout>"
  },
  {
    "path": "librarys/jiaozivideoplayer/src/main/res/layout/jz_layout_clarity.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:id=\"@+id/video_quality_wrapper_area\"\n    android:layout_width=\"80dp\"\n    android:layout_height=\"wrap_content\"\n    android:background=\"@drawable/jz_clarity_popwindow_bg\"\n    android:orientation=\"vertical\"\n    android:paddingBottom=\"16dp\"\n    android:paddingTop=\"10dp\" />\n"
  },
  {
    "path": "librarys/jiaozivideoplayer/src/main/res/layout/jz_layout_clarity_item.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<TextView xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:id=\"@+id/video_item\"\n    android:layout_width=\"fill_parent\"\n    android:layout_height=\"wrap_content\"\n    android:gravity=\"center\"\n    android:orientation=\"vertical\"\n    android:paddingBottom=\"8dp\"\n    android:paddingLeft=\"10dp\"\n    android:paddingRight=\"10dp\"\n    android:paddingTop=\"8dp\"\n    android:textColor=\"#FFF\"\n    android:textSize=\"14sp\" />"
  },
  {
    "path": "librarys/jiaozivideoplayer/src/main/res/layout/jz_layout_standard.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    android:background=\"@android:color/black\"\n    android:descendantFocusability=\"blocksDescendants\">\n\n    <FrameLayout\n        android:id=\"@+id/surface_container\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\">\n\n    </FrameLayout>\n\n    <ImageView\n        android:id=\"@+id/thumb\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        android:layout_alignParentBottom=\"true\"\n        android:layout_alignParentLeft=\"true\"\n        android:layout_alignParentStart=\"true\"\n        android:background=\"#000000\"\n        android:scaleType=\"fitXY\" />\n\n    <LinearLayout\n        android:id=\"@+id/layout_bottom\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"50dp\"\n        android:layout_alignParentBottom=\"true\"\n        android:background=\"@drawable/jz_bottom_bg\"\n        android:gravity=\"center_vertical\"\n        android:orientation=\"horizontal\"\n        android:visibility=\"invisible\">\n\n        <TextView\n            android:id=\"@+id/current\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_marginLeft=\"14dp\"\n            android:text=\"00:00\"\n            android:textColor=\"#ffffff\" />\n\n        <SeekBar\n            android:id=\"@+id/bottom_seek_progress\"\n            android:layout_width=\"0dp\"\n            android:layout_height=\"wrap_content\"\n            android:layout_gravity=\"center_vertical\"\n            android:layout_weight=\"1.0\"\n            android:background=\"@null\"\n            android:max=\"100\"\n            android:maxHeight=\"1dp\"\n            android:minHeight=\"1dp\"\n            android:paddingBottom=\"8dp\"\n            android:paddingLeft=\"12dp\"\n            android:paddingRight=\"12dp\"\n            android:paddingTop=\"8dp\"\n            android:progressDrawable=\"@drawable/jz_bottom_seek_progress\"\n            android:thumb=\"@drawable/jz_bottom_seek_thumb\" />\n\n        <TextView\n            android:id=\"@+id/total\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:text=\"00:00\"\n            android:textColor=\"#ffffff\" />\n\n        <TextView\n            android:id=\"@+id/clarity\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:clickable=\"true\"\n            android:paddingLeft=\"20dp\"\n            android:text=\"clarity\"\n            android:textAlignment=\"center\"\n            android:textColor=\"#ffffff\" />\n\n        <ImageView\n            android:id=\"@+id/fullscreen\"\n            android:layout_width=\"52.5dp\"\n            android:layout_height=\"fill_parent\"\n            android:paddingLeft=\"14dp\"\n            android:paddingRight=\"14dp\"\n            android:scaleType=\"centerInside\"\n            android:src=\"@drawable/jz_enlarge\" />\n    </LinearLayout>\n\n    <ProgressBar\n        android:id=\"@+id/bottom_progress\"\n        style=\"?android:attr/progressBarStyleHorizontal\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"1.5dp\"\n        android:layout_alignParentBottom=\"true\"\n        android:max=\"100\"\n        android:progressDrawable=\"@drawable/jz_bottom_progress\" />\n\n    <ImageView\n        android:id=\"@+id/back_tiny\"\n        android:layout_width=\"24dp\"\n        android:layout_height=\"24dp\"\n        android:layout_marginLeft=\"6dp\"\n        android:layout_marginTop=\"6dp\"\n        android:background=\"@drawable/jz_click_back_tiny_selector\"\n        android:visibility=\"gone\" />\n\n    <RelativeLayout\n        android:id=\"@+id/layout_top\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"60dp\"\n        android:layout_alignParentLeft=\"true\"\n        android:layout_alignParentStart=\"true\"\n        android:layout_alignParentTop=\"true\"\n        android:background=\"@drawable/jz_title_bg\"\n        android:gravity=\"center_vertical\">\n\n        <ImageView\n            android:id=\"@+id/back\"\n            android:layout_width=\"23dp\"\n            android:layout_height=\"match_parent\"\n            android:layout_alignParentLeft=\"true\"\n            android:layout_alignParentStart=\"true\"\n            android:layout_alignParentTop=\"true\"\n            android:paddingLeft=\"12dp\"\n            android:paddingStart=\"12dp\"\n            android:scaleType=\"centerInside\"\n            android:src=\"@drawable/jz_click_back_selector\" />\n\n        <TextView\n            android:id=\"@+id/title\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_centerVertical=\"true\"\n            android:layout_marginEnd=\"12dp\"\n            android:layout_marginLeft=\"12dp\"\n            android:layout_marginRight=\"12dp\"\n            android:layout_marginStart=\"12dp\"\n            android:layout_toEndOf=\"@+id/back\"\n            android:layout_toLeftOf=\"@+id/battery_time_layout\"\n            android:layout_toRightOf=\"@+id/back\"\n            android:ellipsize=\"end\"\n            android:maxLines=\"2\"\n            android:textColor=\"#ffffff\"\n            android:textSize=\"18sp\" />\n\n        <LinearLayout\n            android:id=\"@+id/battery_time_layout\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_alignParentEnd=\"true\"\n            android:layout_alignParentRight=\"true\"\n            android:layout_centerVertical=\"true\"\n            android:layout_marginEnd=\"14dp\"\n            android:layout_marginRight=\"14dp\"\n            android:gravity=\"center_vertical\"\n            android:orientation=\"vertical\">\n\n            <ImageView\n                android:id=\"@+id/battery_level\"\n                android:layout_width=\"23dp\"\n                android:layout_height=\"10dp\"\n                android:layout_gravity=\"center_horizontal\"\n                android:background=\"@drawable/jz_battery_level_10\" />\n\n            <TextView\n                android:id=\"@+id/video_current_time\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:layout_gravity=\"center_horizontal\"\n                android:gravity=\"center_vertical\"\n                android:maxLines=\"1\"\n                android:textColor=\"#ffffffff\"\n                android:textSize=\"12.0sp\" />\n        </LinearLayout>\n    </RelativeLayout>\n\n    <ProgressBar\n        android:id=\"@+id/loading\"\n        android:layout_width=\"@dimen/jz_start_button_w_h_normal\"\n        android:layout_height=\"@dimen/jz_start_button_w_h_normal\"\n        android:layout_centerHorizontal=\"true\"\n        android:layout_centerVertical=\"true\"\n        android:indeterminateDrawable=\"@drawable/jz_loading\"\n        android:visibility=\"invisible\" />\n\n    <LinearLayout\n        android:id=\"@+id/start_layout\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_centerHorizontal=\"true\"\n        android:layout_centerVertical=\"true\"\n        android:layout_gravity=\"center_vertical\">\n\n        <ImageView\n            android:id=\"@+id/start\"\n            android:layout_width=\"@dimen/jz_start_button_w_h_normal\"\n            android:layout_height=\"@dimen/jz_start_button_w_h_normal\"\n            android:src=\"@drawable/jz_click_play_selector\" />\n    </LinearLayout>\n\n\n    <TextView\n        android:id=\"@+id/replay_text\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_below=\"@+id/start_layout\"\n        android:layout_centerHorizontal=\"true\"\n        android:layout_marginTop=\"6dp\"\n        android:text=\"@string/replay\"\n        android:textColor=\"#ffffff\"\n        android:textSize=\"12sp\"\n        android:visibility=\"invisible\" />\n\n    <LinearLayout\n        android:id=\"@+id/retry_layout\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_centerHorizontal=\"true\"\n        android:layout_centerVertical=\"true\"\n        android:gravity=\"center_horizontal\"\n        android:orientation=\"vertical\">\n\n        <TextView\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:text=\"视频加载失败\"\n            android:textColor=\"@android:color/white\"\n            android:textSize=\"14sp\" />\n\n        <TextView\n            android:id=\"@+id/retry_btn\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_marginTop=\"15dp\"\n            android:background=\"@drawable/retry_bg\"\n            android:paddingBottom=\"4dp\"\n            android:paddingLeft=\"9dp\"\n            android:paddingRight=\"9dp\"\n            android:paddingTop=\"4dp\"\n            android:text=\"点击重试\"\n            android:textColor=\"@android:color/white\"\n            android:textSize=\"14sp\" />\n    </LinearLayout>\n</RelativeLayout>\n"
  },
  {
    "path": "librarys/jiaozivideoplayer/src/main/res/values/colors.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources></resources>\n"
  },
  {
    "path": "librarys/jiaozivideoplayer/src/main/res/values/dimens.xml",
    "content": "<resources>\n    <dimen name=\"jz_start_button_w_h_normal\">45dp</dimen>\n    <dimen name=\"jz_start_button_w_h_fullscreen\">62dp</dimen>\n</resources>\n"
  },
  {
    "path": "librarys/jiaozivideoplayer/src/main/res/values/ids.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <item name=\"jz_fullscreen_id\" type=\"id\" />\n    <item name=\"jz_tiny_id\" type=\"id\" />\n</resources>"
  },
  {
    "path": "librarys/jiaozivideoplayer/src/main/res/values/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"tips_not_wifi\">You are currently using the mobile network, the player will continue to consume traffic</string>\n    <string name=\"tips_not_wifi_confirm\">Resume</string>\n    <string name=\"tips_not_wifi_cancel\">Stop play</string>\n    <string name=\"no_url\">No url</string>\n    <string name=\"replay\">Replay</string>\n</resources>\n"
  },
  {
    "path": "librarys/jiaozivideoplayer/src/main/res/values/styles.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n\n    <style name=\"jz_style_dialog_progress\" parent=\"@android:style/Theme.Dialog\">\n        <item name=\"android:windowBackground\">@android:color/transparent</item>\n        <item name=\"android:windowNoTitle\">true</item>\n        <item name=\"android:windowAnimationStyle\">@style/jz_popup_toast_anim</item>\n        <item name=\"android:backgroundDimEnabled\">false</item>\n    </style>\n\n    <style name=\"jz_popup_toast_anim\" parent=\"@android:style/Animation\">\n        <item name=\"android:windowEnterAnimation\">@android:anim/fade_in</item>\n        <item name=\"android:windowExitAnimation\">@android:anim/fade_out</item>\n    </style>\n\n</resources>\n"
  },
  {
    "path": "librarys/jiaozivideoplayer/src/main/res/values-es/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"tips_not_wifi\">Estás conectado a una red móvil, el reproductor utilizará tus datos si continuas</string>\n    <string name=\"tips_not_wifi_confirm\">Reproducir</string>\n    <string name=\"tips_not_wifi_cancel\">Cancelar</string>\n    <string name=\"no_url\">No hay vídeo</string>\n    <string name=\"replay\">Volver a ver</string>\n</resources>\n"
  },
  {
    "path": "librarys/jiaozivideoplayer/src/main/res/values-pt/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"tips_not_wifi\">Você está usando a rede móvel, você deseja mesmo ver o vídeo?</string>\n    <string name=\"tips_not_wifi_confirm\">Continuar</string>\n    <string name=\"tips_not_wifi_cancel\">Parar</string>\n    <string name=\"no_url\">Sem vídeo</string>\n    <string name=\"replay\">Replay</string>\n</resources>\n"
  },
  {
    "path": "librarys/jiaozivideoplayer/src/main/res/values-tr/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"tips_not_wifi\">Şu anda mobil veriyi kullanıyorsunuz, yüksek veri kaybına yol açabilir</string>\n    <string name=\"tips_not_wifi_confirm\">Devam Et</string>\n    <string name=\"tips_not_wifi_cancel\">Durdur</string>\n    <string name=\"no_url\">URL Bulunamadı</string>\n    <string name=\"replay\">Tekrar</string>\n</resources>\n"
  },
  {
    "path": "librarys/jiaozivideoplayer/src/main/res/values-zh/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"tips_not_wifi\">您当前正在使用移动网络，继续播放将消耗流量</string>\n    <string name=\"tips_not_wifi_confirm\">继续播放</string>\n    <string name=\"tips_not_wifi_cancel\">停止播放</string>\n    <string name=\"no_url\">播放地址无效</string>\n    <string name=\"replay\">重播</string>\n</resources>\n"
  },
  {
    "path": "librarys/jiaozivideoplayer/src/test/java/cn/jzvd/ExampleUnitTest.java",
    "content": "package cn.jzvd;\n\nimport org.junit.Test;\n\nimport static org.junit.Assert.assertEquals;\n\n/**\n * To work on unit tests, switch the Test Artifact in the Build Variants view.\n */\npublic class ExampleUnitTest {\n    @Test\n    public void addition_isCorrect() throws Exception {\n        assertEquals(4, 2 + 2);\n    }\n}\n"
  },
  {
    "path": "librarys/xrecyclerview/.gitignore",
    "content": "/build\n*.iml\n.idea"
  },
  {
    "path": "librarys/xrecyclerview/build.gradle",
    "content": "apply plugin: 'com.android.library'\n\nandroid {\n    compileSdkVersion 25\n    buildToolsVersion '26.0.2'\n\n    defaultConfig {\n        minSdkVersion 11\n        targetSdkVersion 25\n        versionCode 1\n        versionName \"1.0\"\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    compile 'com.android.support:appcompat-v7:25.0.1'\n    compile 'com.android.support:recyclerview-v7:25.0.1'\n    compile 'com.android.support:design:23.1.0'\n}\n\n\n\n"
  },
  {
    "path": "librarys/xrecyclerview/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/jianghejie/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"
  },
  {
    "path": "librarys/xrecyclerview/src/androidTest/java/com/jcodecraeer/xrecyclerview/ApplicationTest.java",
    "content": "package com.jcodecraeer.xrecyclerview;\n\nimport android.app.Application;\nimport android.test.ApplicationTestCase;\n\n/**\n * <a href=\"http://d.android.com/tools/testing/testing_android.html\">Testing Fundamentals</a>\n */\npublic class ApplicationTest extends ApplicationTestCase<Application> {\n    public ApplicationTest() {\n        super(Application.class);\n    }\n}"
  },
  {
    "path": "librarys/xrecyclerview/src/main/AndroidManifest.xml",
    "content": "<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    package=\"com.jcodecraeer.xrecyclerview\">\n    <application/>\n</manifest>\n"
  },
  {
    "path": "librarys/xrecyclerview/src/main/java/com/jcodecraeer/xrecyclerview/AppBarStateChangeListener.java",
    "content": "package com.jcodecraeer.xrecyclerview;\n\nimport android.support.design.widget.AppBarLayout;\n\n/**\n * Created by jianghejie on 16/6/19.\n */\n\npublic abstract class AppBarStateChangeListener implements AppBarLayout.OnOffsetChangedListener {\n\n    public enum State {\n        EXPANDED,\n        COLLAPSED,\n        IDLE\n    }\n\n    private State mCurrentState = State.IDLE;\n\n    @Override\n    public final void onOffsetChanged(AppBarLayout appBarLayout, int i) {\n        if (i == 0) {\n            if (mCurrentState != State.EXPANDED) {\n                onStateChanged(appBarLayout, State.EXPANDED);\n            }\n            mCurrentState = State.EXPANDED;\n        } else if (Math.abs(i) >= appBarLayout.getTotalScrollRange()) {\n            if (mCurrentState != State.COLLAPSED) {\n                onStateChanged(appBarLayout, State.COLLAPSED);\n            }\n            mCurrentState = State.COLLAPSED;\n        } else {\n            if (mCurrentState != State.IDLE) {\n                onStateChanged(appBarLayout, State.IDLE);\n            }\n            mCurrentState = State.IDLE;\n        }\n    }\n    public abstract void onStateChanged(AppBarLayout appBarLayout, State state);\n}\n\n"
  },
  {
    "path": "librarys/xrecyclerview/src/main/java/com/jcodecraeer/xrecyclerview/ArrowRefreshHeader.java",
    "content": "package com.jcodecraeer.xrecyclerview;\n\nimport android.animation.ValueAnimator;\nimport android.content.Context;\nimport android.os.Handler;\nimport android.util.AttributeSet;\nimport android.view.Gravity;\nimport android.view.LayoutInflater;\nimport android.view.View;\nimport android.view.ViewGroup;\nimport android.view.animation.Animation;\nimport android.view.animation.RotateAnimation;\nimport android.widget.ImageView;\nimport android.widget.LinearLayout;\nimport android.widget.ProgressBar;\nimport android.widget.TextView;\n\nimport com.jcodecraeer.xrecyclerview.progressindicator.AVLoadingIndicatorView;\n\nimport java.util.Date;\n\npublic class ArrowRefreshHeader extends LinearLayout implements BaseRefreshHeader {\n\n\tprivate LinearLayout mContainer;\n\tprivate ImageView mArrowImageView;\n\tprivate SimpleViewSwitcher mProgressBar;\n\tprivate TextView mStatusTextView;\n\tprivate int mState = STATE_NORMAL;\n\n\tprivate TextView mHeaderTimeView;\n\n\tprivate Animation mRotateUpAnim;\n\tprivate Animation mRotateDownAnim;\n\t\n\tprivate static final int ROTATE_ANIM_DURATION = 180;\n\n\tpublic int mMeasuredHeight;\n\n\tpublic ArrowRefreshHeader(Context context) {\n\t\tsuper(context);\n\t\tinitView();\n\t}\n\n\t/**\n\t * @param context\n\t * @param attrs\n\t */\n\tpublic ArrowRefreshHeader(Context context, AttributeSet attrs) {\n\t\tsuper(context, attrs);\n\t\tinitView();\n\t}\n\n\tprivate void initView() {\n\t\t// 初始情况，设置下拉刷新view高度为0\n\t\tmContainer = (LinearLayout) LayoutInflater.from(getContext()).inflate(\n\t\t\t\tR.layout.listview_header, null);\n        LayoutParams lp = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT);\n        lp.setMargins(0, 0, 0, 0);\n\t\tthis.setLayoutParams(lp);\n        this.setPadding(0, 0, 0, 0);\n\n\t\taddView(mContainer, new LayoutParams(LayoutParams.MATCH_PARENT, 0));\n\t\tsetGravity(Gravity.BOTTOM);\n\n\t\tmArrowImageView = (ImageView)findViewById(R.id.listview_header_arrow);\n\t\tmStatusTextView = (TextView)findViewById(R.id.refresh_status_textview);\n\n        //init the progress view\n\t\tmProgressBar = (SimpleViewSwitcher)findViewById(R.id.listview_header_progressbar);\n        AVLoadingIndicatorView progressView = new  AVLoadingIndicatorView(getContext());\n        progressView.setIndicatorColor(0xffB5B5B5);\n        progressView.setIndicatorId(ProgressStyle.BallSpinFadeLoader);\n        mProgressBar.setView(progressView);\n\n\n\t\tmRotateUpAnim = new RotateAnimation(0.0f, -180.0f,\n\t\t\t\tAnimation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);\n\t\tmRotateUpAnim.setDuration(ROTATE_ANIM_DURATION);\n\t\tmRotateUpAnim.setFillAfter(true);\n\t\tmRotateDownAnim = new RotateAnimation(-180.0f, 0.0f,\n\t\t\t\tAnimation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);\n\t\tmRotateDownAnim.setDuration(ROTATE_ANIM_DURATION);\n\t\tmRotateDownAnim.setFillAfter(true);\n\t\t\n\t\tmHeaderTimeView = (TextView)findViewById(R.id.last_refresh_time);\n\t\tmeasure(ViewGroup.LayoutParams.WRAP_CONTENT,ViewGroup.LayoutParams.WRAP_CONTENT);\n\t\tmMeasuredHeight = getMeasuredHeight();\n\t}\n\n    public void setProgressStyle(int style) {\n        if(style == ProgressStyle.SysProgress){\n            mProgressBar.setView(new ProgressBar(getContext(), null, android.R.attr.progressBarStyle));\n        }else{\n            AVLoadingIndicatorView progressView = new  AVLoadingIndicatorView(this.getContext());\n            progressView.setIndicatorColor(0xffB5B5B5);\n            progressView.setIndicatorId(style);\n            mProgressBar.setView(progressView);\n        }\n    }\n\n    public void setArrowImageView(int resid){\n        mArrowImageView.setImageResource(resid);\n    }\n\n\tpublic void setState(int state) {\n\t\tif (state == mState) return ;\n\n\t\tif (state == STATE_REFRESHING) {\t// 显示进度\n\t\t\tmArrowImageView.clearAnimation();\n\t\t\tmArrowImageView.setVisibility(View.INVISIBLE);\n\t\t\tmProgressBar.setVisibility(View.VISIBLE);\n            smoothScrollTo(mMeasuredHeight);\n\t\t} else if(state == STATE_DONE) {\n            mArrowImageView.setVisibility(View.INVISIBLE);\n            mProgressBar.setVisibility(View.INVISIBLE);\n        } else {\t// 显示箭头图片\n\t\t\tmArrowImageView.setVisibility(View.VISIBLE);\n\t\t\tmProgressBar.setVisibility(View.INVISIBLE);\n\t\t}\n\t\t\n\t\tswitch(state){\n            case STATE_NORMAL:\n                if (mState == STATE_RELEASE_TO_REFRESH) {\n                    mArrowImageView.startAnimation(mRotateDownAnim);\n                }\n                if (mState == STATE_REFRESHING) {\n                    mArrowImageView.clearAnimation();\n                }\n                mStatusTextView.setText(R.string.listview_header_hint_normal);\n                break;\n            case STATE_RELEASE_TO_REFRESH:\n                if (mState != STATE_RELEASE_TO_REFRESH) {\n                    mArrowImageView.clearAnimation();\n                    mArrowImageView.startAnimation(mRotateUpAnim);\n                    mStatusTextView.setText(R.string.listview_header_hint_release);\n                }\n                break;\n            case     STATE_REFRESHING:\n                mStatusTextView.setText(R.string.refreshing);\n                break;\n            case    STATE_DONE:\n                mStatusTextView.setText(R.string.refresh_done);\n                break;\n            default:\n\t\t}\n\t\t\n\t\tmState = state;\n\t}\n\n    public int getState() {\n        return mState;\n    }\n\n    @Override\n\tpublic void refreshComplete(){\n        mHeaderTimeView.setText(friendlyTime(new Date()));\n        setState(STATE_DONE);\n        new Handler().postDelayed(new Runnable(){\n            public void run() {\n                reset();\n            }\n        }, 200);\n\t}\n\n\tpublic void setVisibleHeight(int height) {\n\t\tif (height < 0) height = 0;\n\t\tLayoutParams lp = (LayoutParams) mContainer .getLayoutParams();\n\t\tlp.height = height;\n\t\tmContainer.setLayoutParams(lp);\n\t}\n\n\tpublic int getVisibleHeight() {\n        LayoutParams lp = (LayoutParams) mContainer.getLayoutParams();\n\t\treturn lp.height;\n\t}\n\n    @Override\n    public void onMove(float delta) {\n        if(getVisibleHeight() > 0 || delta > 0) {\n            setVisibleHeight((int) delta + getVisibleHeight());\n            if (mState <= STATE_RELEASE_TO_REFRESH) { // 未处于刷新状态，更新箭头\n                if (getVisibleHeight() > mMeasuredHeight) {\n                    setState(STATE_RELEASE_TO_REFRESH);\n                }else {\n                    setState(STATE_NORMAL);\n                }\n            }\n        }\n    }\n\n    @Override\n    public boolean releaseAction() {\n        boolean isOnRefresh = false;\n        int height = getVisibleHeight();\n        if (height == 0) // not visible.\n            isOnRefresh = false;\n\n        if(getVisibleHeight() > mMeasuredHeight &&  mState < STATE_REFRESHING){\n            setState(STATE_REFRESHING);\n            isOnRefresh = true;\n        }\n        // refreshing and header isn't shown fully. do nothing.\n        if (mState == STATE_REFRESHING && height <=  mMeasuredHeight) {\n            //return;\n        }\n        if (mState != STATE_REFRESHING) {\n            smoothScrollTo(0);\n        }\n\n        if (mState == STATE_REFRESHING) {\n            int destHeight = mMeasuredHeight;\n            smoothScrollTo(destHeight);\n        }\n\n        return isOnRefresh;\n    }\n\n    public void reset() {\n        smoothScrollTo(0);\n        new Handler().postDelayed(new Runnable() {\n            public void run() {\n                setState(STATE_NORMAL);\n            }\n        }, 500);\n    }\n\n    private void smoothScrollTo(int destHeight) {\n        ValueAnimator animator = ValueAnimator.ofInt(getVisibleHeight(), destHeight);\n        animator.setDuration(300).start();\n        animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {\n            @Override\n            public void onAnimationUpdate(ValueAnimator animation)\n            {\n                setVisibleHeight((int) animation.getAnimatedValue());\n            }\n        });\n        animator.start();\n    }\n\n    public static String friendlyTime(Date time) {\n        //获取time距离当前的秒数\n        int ct = (int)((System.currentTimeMillis() - time.getTime())/1000);\n\n        if(ct == 0) {\n            return \"刚刚\";\n        }\n\n        if(ct > 0 && ct < 60) {\n            return ct + \"秒前\";\n        }\n\n        if(ct >= 60 && ct < 3600) {\n            return Math.max(ct / 60,1) + \"分钟前\";\n        }\n        if(ct >= 3600 && ct < 86400)\n            return ct / 3600 + \"小时前\";\n        if(ct >= 86400 && ct < 2592000){ //86400 * 30\n            int day = ct / 86400 ;\n            return day + \"天前\";\n        }\n        if(ct >= 2592000 && ct < 31104000) { //86400 * 30\n            return ct / 2592000 + \"月前\";\n        }\n        return ct / 31104000 + \"年前\";\n    }\n\n}"
  },
  {
    "path": "librarys/xrecyclerview/src/main/java/com/jcodecraeer/xrecyclerview/BaseRefreshHeader.java",
    "content": "package com.jcodecraeer.xrecyclerview;\n\n/**\n * Created by jianghejie on 15/11/22.\n */\ninterface BaseRefreshHeader {\n\n\tint STATE_NORMAL = 0;\n\tint STATE_RELEASE_TO_REFRESH = 1;\n\tint STATE_REFRESHING = 2;\n\tint STATE_DONE = 3;\n\n\tvoid onMove(float delta);\n\n\tboolean releaseAction();\n\n\tvoid refreshComplete();\n\n}"
  },
  {
    "path": "librarys/xrecyclerview/src/main/java/com/jcodecraeer/xrecyclerview/CustomFooterViewCallBack.java",
    "content": "package com.jcodecraeer.xrecyclerview;\n\nimport android.view.View;\n\n/**\n * 作者：林冠宏\n * <p>\n * My GitHub : https://github.com/af913337456/\n * <p>\n * My Blog   : http://www.cnblogs.com/linguanh/\n * <p>\n * on 2017/11/8.\n */\n\npublic interface CustomFooterViewCallBack {\n\n    void onLoadingMore(View yourFooterView);\n    void onLoadMoreComplete(View yourFooterView);\n    void onSetNoMore(View yourFooterView,boolean noMore);\n\n}\n"
  },
  {
    "path": "librarys/xrecyclerview/src/main/java/com/jcodecraeer/xrecyclerview/ItemTouchHelperAdapter.java",
    "content": "package com.jcodecraeer.xrecyclerview;\n\nimport android.support.v7.widget.RecyclerView;\n\n/**\n * Created by jianghejie on 16/6/20.\n */\n\npublic interface ItemTouchHelperAdapter {\n\n    /**\n     * Called when an item has been dragged far enough to trigger a move. This is called every time\n     * an item is shifted, and <strong>not</strong> at the end of a \"drop\" event.<br/>\n     * <br/>\n     * Implementations should call {@link RecyclerView.Adapter#notifyItemMoved(int, int)} after\n     * adjusting the underlying data to reflect this move.\n     *\n     * @param fromPosition The start position of the moved item.\n     * @param toPosition   Then resolved position of the moved item.\n     *\n     * @see RecyclerView#getAdapterPositionFor(RecyclerView.ViewHolder)\n     * @see RecyclerView.ViewHolder#getAdapterPosition()\n     */\n    void onItemMove(int fromPosition, int toPosition);\n\n\n    /**\n     * Called when an item has been dismissed by a swipe.<br/>\n     * <br/>\n     * Implementations should call {@link RecyclerView.Adapter#notifyItemRemoved(int)} after\n     * adjusting the underlying data to reflect this removal.\n     *\n     * @param position The position of the item dismissed.\n     *\n     * @see RecyclerView#getAdapterPositionFor(RecyclerView.ViewHolder)\n     * @see RecyclerView.ViewHolder#getAdapterPosition()\n     */\n    void onItemDismiss(int position);\n}\n"
  },
  {
    "path": "librarys/xrecyclerview/src/main/java/com/jcodecraeer/xrecyclerview/JellyView.java",
    "content": "package com.jcodecraeer.xrecyclerview;\n\n/**\n * Created by jianghejie on 15/11/22.\n */\n\nimport android.annotation.TargetApi;\nimport android.content.Context;\nimport android.graphics.Canvas;\nimport android.graphics.Paint;\nimport android.graphics.Path;\nimport android.os.Build;\nimport android.util.AttributeSet;\nimport android.util.Log;\nimport android.view.View;\n\n\npublic class JellyView extends View  implements BaseRefreshHeader{\n    Path path;\n\n    Paint paint;\n\n    private int minimumHeight = 0;\n\n    private int jellyHeight =0;\n\n    public JellyView(Context context) {\n        super(context);\n        init();\n    }\n\n    public JellyView(Context context, AttributeSet attrs) {\n        super(context, attrs);\n        init();\n    }\n\n    public JellyView(Context context, AttributeSet attrs, int defStyleAttr) {\n        super(context, attrs, defStyleAttr);\n        init();\n    }\n\n    @SuppressWarnings(\"unused\")\n    @TargetApi(Build.VERSION_CODES.LOLLIPOP)\n    public JellyView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {\n        super(context, attrs, defStyleAttr, defStyleRes);\n        init();\n    }\n\n    private void init() {\n        if (isInEditMode()) {\n            return;\n        }\n        path = new Path();\n        paint = new Paint();\n        paint.setColor(getContext().getResources().getColor(android.R.color.holo_blue_bright));\n        paint.setAntiAlias(true);\n    }\n\n    public void setJellyColor(int jellyColor) {\n        paint.setColor(jellyColor);\n    }\n\n    @Override\n    protected void onDraw(Canvas canvas) {\n        super.onDraw(canvas);\n        path.reset();\n        path.lineTo(0, minimumHeight);\n        path.quadTo(getMeasuredWidth() / 2, minimumHeight + jellyHeight, getMeasuredWidth(), minimumHeight);\n        path.lineTo(getMeasuredWidth(), 0);\n        canvas.drawPath(path, paint);\n    }\n\n    @Override\n    public void setMinimumHeight(int minimumHeight) {\n        this.minimumHeight = minimumHeight;\n    }\n\n    public void setJellyHeight(int ribbonHeight) {\n        this.jellyHeight = ribbonHeight;\n    }\n\n    @Override\n    public int getMinimumHeight() {\n        return minimumHeight;\n    }\n\n    public int getJellyHeight() {\n        return jellyHeight;\n    }\n\n\n    @Override\n    public void refreshComplete(){\n\n    }\n\n    @Override\n    public void onMove(float delta) {\n        jellyHeight = jellyHeight + (int)delta;\n        Log.i(\"jellyHeight\", \"delta = \" + delta);\n        this.invalidate();\n    }\n\n    @Override\n    public boolean releaseAction() {\n       return false;\n    }\n}\n"
  },
  {
    "path": "librarys/xrecyclerview/src/main/java/com/jcodecraeer/xrecyclerview/LoadingMoreFooter.java",
    "content": "package com.jcodecraeer.xrecyclerview;\n\nimport android.content.Context;\nimport android.support.v7.widget.RecyclerView;\nimport android.util.AttributeSet;\nimport android.view.Gravity;\nimport android.view.View;\nimport android.view.ViewGroup;\nimport android.widget.LinearLayout;\nimport android.widget.ProgressBar;\nimport android.widget.TextView;\n\nimport com.jcodecraeer.xrecyclerview.progressindicator.AVLoadingIndicatorView;\n\npublic class LoadingMoreFooter extends LinearLayout {\n\n    private SimpleViewSwitcher progressCon;\n    public final static int STATE_LOADING = 0;\n    public final static int STATE_COMPLETE = 1;\n    public final static int STATE_NOMORE = 2;\n\n    private TextView mText;\n    private String loadingHint;\n    private String noMoreHint;\n    private String loadingDoneHint;\n\n\tpublic LoadingMoreFooter(Context context) {\n\t\tsuper(context);\n\t\tinitView();\n\t}\n\n\t/**\n\t * @param context\n\t * @param attrs\n\t */\n\tpublic LoadingMoreFooter(Context context, AttributeSet attrs) {\n\t\tsuper(context, attrs);\n\t\tinitView();\n\t}\n\n    public void setLoadingHint(String hint) {\n        loadingHint = hint;\n    }\n\n    public void setNoMoreHint(String hint) {\n        noMoreHint = hint;\n    }\n\n    public void setLoadingDoneHint(String hint) {\n        loadingDoneHint = hint;\n    }\n\n    public void initView(){\n        setGravity(Gravity.CENTER);\n        setLayoutParams(new RecyclerView.LayoutParams(\n                ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT));\n        progressCon = new SimpleViewSwitcher(getContext());\n        progressCon.setLayoutParams(new ViewGroup.LayoutParams(\n                ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT));\n\n        AVLoadingIndicatorView progressView = new  AVLoadingIndicatorView(this.getContext());\n        progressView.setIndicatorColor(0xffB5B5B5);\n        progressView.setIndicatorId(ProgressStyle.BallSpinFadeLoader);\n        progressCon.setView(progressView);\n\n        addView(progressCon);\n        mText = new TextView(getContext());\n        mText.setText(getContext().getString(R.string.listview_loading));\n\n        if(loadingHint == null || loadingHint.equals(\"\")){\n            loadingHint = (String)getContext().getText(R.string.listview_loading);\n        }\n        if(noMoreHint == null || noMoreHint.equals(\"\")){\n            noMoreHint = (String)getContext().getText(R.string.nomore_loading);\n        }\n        if(loadingDoneHint == null || loadingDoneHint.equals(\"\")){\n            loadingDoneHint = (String)getContext().getText(R.string.loading_done);\n        }\n\n        LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);\n        layoutParams.setMargins( (int)getResources().getDimension(R.dimen.textandiconmargin),0,0,0 );\n\n        mText.setLayoutParams(layoutParams);\n        addView(mText);\n    }\n\n    public void setProgressStyle(int style) {\n        if(style == ProgressStyle.SysProgress){\n            progressCon.setView(new ProgressBar(getContext(), null, android.R.attr.progressBarStyle));\n        }else{\n            AVLoadingIndicatorView progressView = new  AVLoadingIndicatorView(this.getContext());\n            progressView.setIndicatorColor(0xffB5B5B5);\n            progressView.setIndicatorId(style);\n            progressCon.setView(progressView);\n        }\n    }\n\n    public void  setState(int state) {\n        switch(state) {\n            case STATE_LOADING:\n                progressCon.setVisibility(View.VISIBLE);\n                mText.setText(loadingHint);\n                this.setVisibility(View.VISIBLE);\n                    break;\n            case STATE_COMPLETE:\n                mText.setText(loadingDoneHint);\n                this.setVisibility(View.GONE);\n                break;\n            case STATE_NOMORE:\n                mText.setText(noMoreHint);\n                progressCon.setVisibility(View.GONE);\n                this.setVisibility(View.VISIBLE);\n                break;\n        }\n    }\n}\n"
  },
  {
    "path": "librarys/xrecyclerview/src/main/java/com/jcodecraeer/xrecyclerview/ProgressStyle.java",
    "content": "package com.jcodecraeer.xrecyclerview;\n\n/**\n * Created by jianghejie on 15/11/23.\n */\npublic class ProgressStyle {\n    public static final int SysProgress=-1;\n    public static final int BallPulse=0;\n    public static final int BallGridPulse=1;\n    public static final int BallClipRotate=2;\n    public static final int BallClipRotatePulse=3;\n    public static final int SquareSpin=4;\n    public static final int BallClipRotateMultiple=5;\n    public static final int BallPulseRise=6;\n    public static final int BallRotate=7;\n    public static final int CubeTransition=8;\n    public static final int BallZigZag=9;\n    public static final int BallZigZagDeflect=10;\n    public static final int BallTrianglePath=11;\n    public static final int BallScale=12;\n    public static final int LineScale=13;\n    public static final int LineScaleParty=14;\n    public static final int BallScaleMultiple=15;\n    public static final int BallPulseSync=16;\n    public static final int BallBeat=17;\n    public static final int LineScalePulseOut=18;\n    public static final int LineScalePulseOutRapid=19;\n    public static final int BallScaleRipple=20;\n    public static final int BallScaleRippleMultiple=21;\n    public static final int BallSpinFadeLoader=22;\n    public static final int LineSpinFadeLoader=23;\n    public static final int TriangleSkewSpin=24;\n    public static final int Pacman=25;\n    public static final int BallGridBeat=26;\n    public static final int SemiCircleSpin=27;\n}\n"
  },
  {
    "path": "librarys/xrecyclerview/src/main/java/com/jcodecraeer/xrecyclerview/SimpleItemTouchHelperCallback.java",
    "content": "package com.jcodecraeer.xrecyclerview;\n\nimport android.graphics.Canvas;\nimport android.graphics.Color;\nimport android.support.v7.widget.RecyclerView;\nimport android.support.v7.widget.helper.ItemTouchHelper;\nimport android.view.View;\n\n/**\n * Created by jianghejie on 16/6/20.\n */\n\npublic class SimpleItemTouchHelperCallback extends ItemTouchHelper.Callback {\n\n    public static final float ALPHA_FULL = 1.0f;\n\n    private final ItemTouchHelperAdapter mAdapter;\n    private  XRecyclerView mXrecyclerView;\n\n    public SimpleItemTouchHelperCallback(ItemTouchHelperAdapter adapter, XRecyclerView recyclerView) {\n        mAdapter = adapter;\n        this.mXrecyclerView = recyclerView;\n    }\n\n    @Override\n    public boolean isLongPressDragEnabled() {\n        return true;\n    }\n\n    @Override\n    public boolean isItemViewSwipeEnabled() {\n        return true;\n    }\n\n    @Override\n    public int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {\n        // Enable drag and swipe in both directions\n        final int dragFlags = ItemTouchHelper.UP | ItemTouchHelper.DOWN;\n        final int swipeFlags = ItemTouchHelper.START | ItemTouchHelper.END;\n        return makeMovementFlags(dragFlags, swipeFlags);\n    }\n\n    @Override\n    public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder source, RecyclerView.ViewHolder target) {\n        if (source.getItemViewType() != target.getItemViewType()) {\n            return false;\n        }\n        // Notify the adapter of the move\n        mAdapter.onItemMove(source.getAdapterPosition(), target.getAdapterPosition());\n        return true;\n    }\n\n    @Override\n    public void onSwiped(RecyclerView.ViewHolder viewHolder, int i) {\n        // Notify the adapter of the dismissal\n        mAdapter.onItemDismiss(viewHolder.getAdapterPosition());\n    }\n\n    @Override\n    public void onChildDraw(Canvas c, RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, float dX, float dY, int actionState, boolean isCurrentlyActive) {\n        super.onChildDraw(c, recyclerView, viewHolder, dX, dY, actionState, isCurrentlyActive);\n\n        // Fade out the view as it is swiped out of the parent's bounds\n        if (actionState == ItemTouchHelper.ACTION_STATE_SWIPE) {\n            View itemView = viewHolder.itemView;\n            final float alpha = ALPHA_FULL - Math.abs(dX) / (float) itemView.getWidth();\n            itemView.setAlpha(alpha);\n        }\n    }\n\n    @Override\n    public void onSelectedChanged(RecyclerView.ViewHolder viewHolder, int actionState) {\n        if (actionState != ItemTouchHelper.ACTION_STATE_IDLE) {\n            // Let the view holder know that this item is being moved or dragged\n            viewHolder.itemView.setBackgroundColor(Color.LTGRAY);\n        }\n\n        super.onSelectedChanged(viewHolder, actionState);\n    }\n\n    @Override\n    public void clearView(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {\n        super.clearView(recyclerView, viewHolder);\n        viewHolder.itemView.setAlpha(ALPHA_FULL);\n        viewHolder.itemView.setBackgroundColor(0);\n    }\n}\n"
  },
  {
    "path": "librarys/xrecyclerview/src/main/java/com/jcodecraeer/xrecyclerview/SimpleViewSwitcher.java",
    "content": "package com.jcodecraeer.xrecyclerview;\n\nimport android.content.Context;\nimport android.util.AttributeSet;\nimport android.view.View;\nimport android.view.ViewGroup;\n\n/**\n * Created by jianghejie on 15/11/22.\n */\npublic class SimpleViewSwitcher extends ViewGroup {\n\n    public SimpleViewSwitcher(Context context) {\n        super(context);\n    }\n\n    public SimpleViewSwitcher(Context context, AttributeSet attrs) {\n        this(context, attrs, 0);\n    }\n\n    public SimpleViewSwitcher(Context context, AttributeSet attrs, int defStyle) {\n        super(context, attrs, defStyle);\n    }\n\n    @Override\n    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {\n        int childCount = this.getChildCount();\n        int maxHeight = 0;\n        int maxWidth = 0;\n        for (int i = 0; i < childCount; i++) {\n            View child = this.getChildAt(i);\n            this.measureChild(child, widthMeasureSpec, heightMeasureSpec);\n            int cw = child.getMeasuredWidth();\n            // int ch = child.getMeasuredHeight();\n            maxWidth = child.getMeasuredWidth();\n            maxHeight = child.getMeasuredHeight();\n        }\n        setMeasuredDimension(maxWidth, maxHeight);\n    }\n\n    @Override\n    protected void onLayout(boolean changed, int l, int t, int r, int b) {\n        final int count = getChildCount();\n        for (int i = 0; i < count; i++) {\n            final View child = getChildAt(i);\n            if (child.getVisibility() != View.GONE) {\n                child.layout(0, 0,  r - l,  b - t);\n\n            }\n        }\n    }\n\n    public void setView(View view) {\n        if (this.getChildCount() != 0){\n            this.removeViewAt(0);\n        }\n        this.addView(view,0);\n    }\n\n}"
  },
  {
    "path": "librarys/xrecyclerview/src/main/java/com/jcodecraeer/xrecyclerview/XRecyclerView.java",
    "content": "package com.jcodecraeer.xrecyclerview;\n\nimport android.content.Context;\nimport android.graphics.Canvas;\nimport android.graphics.Rect;\nimport android.graphics.drawable.Drawable;\nimport android.support.annotation.NonNull;\nimport android.support.design.widget.AppBarLayout;\nimport android.support.design.widget.CoordinatorLayout;\nimport android.support.v7.widget.GridLayoutManager;\nimport android.support.v7.widget.LinearLayoutManager;\nimport android.support.v7.widget.RecyclerView;\nimport android.support.v7.widget.StaggeredGridLayoutManager;\nimport android.util.AttributeSet;\nimport android.view.MotionEvent;\nimport android.view.View;\nimport android.view.ViewGroup;\nimport android.view.ViewParent;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\npublic class XRecyclerView extends RecyclerView {\n    private boolean isLoadingData = false;\n    private boolean isNoMore = false;\n    private int mRefreshProgressStyle = ProgressStyle.SysProgress;\n    private int mLoadingMoreProgressStyle = ProgressStyle.SysProgress;\n    private ArrayList<View> mHeaderViews = new ArrayList<>();\n    private WrapAdapter mWrapAdapter;\n    private float mLastY = -1;\n    private static final float DRAG_RATE = 3;\n    private CustomFooterViewCallBack footerViewCallBack;\n    private LoadingListener mLoadingListener;\n    private ArrowRefreshHeader mRefreshHeader;\n    private boolean pullRefreshEnabled = true;\n    private boolean loadingMoreEnabled = true;\n    //下面的ItemViewType是保留值(ReservedItemViewType),如果用户的adapter与它们重复将会强制抛出异常。不过为了简化,我们检测到重复时对用户的提示是ItemViewType必须小于10000\n    private static final int TYPE_REFRESH_HEADER = 10000;//设置一个很大的数字,尽可能避免和用户的adapter冲突\n    private static final int TYPE_FOOTER = 10001;\n    private static final int HEADER_INIT_INDEX = 10002;\n    private static List<Integer> sHeaderTypes = new ArrayList<>();//每个header必须有不同的type,不然滚动的时候顺序会变化\n    private int mPageCount = 0;\n    //adapter没有数据的时候显示,类似于listView的emptyView\n    private View mEmptyView;\n    private View mFootView;\n    private final RecyclerView.AdapterDataObserver mDataObserver = new DataObserver();\n    private AppBarStateChangeListener.State appbarState = AppBarStateChangeListener.State.EXPANDED;\n\n    // limit number to call load more\n    // 控制多出多少条的时候调用 onLoadMore\n    private int limitNumberToCallLoadMore = 1;\n\n    public XRecyclerView(Context context) {\n        this(context, null);\n    }\n\n    public XRecyclerView(Context context, AttributeSet attrs) {\n        this(context, attrs, 0);\n    }\n\n    public XRecyclerView(Context context, AttributeSet attrs, int defStyle) {\n        super(context, attrs, defStyle);\n        init();\n    }\n\n    private void init() {\n        if (pullRefreshEnabled) {\n            mRefreshHeader = new ArrowRefreshHeader(getContext());\n            mRefreshHeader.setProgressStyle(mRefreshProgressStyle);\n        }\n        LoadingMoreFooter footView = new LoadingMoreFooter(getContext());\n        footView.setProgressStyle(mLoadingMoreProgressStyle);\n        mFootView = footView;\n        mFootView.setVisibility(GONE);\n    }\n\n    public LoadingMoreFooter getDefaultFootView(){\n        if(mFootView == null){\n            return null;\n        }\n        if(mFootView instanceof LoadingMoreFooter){\n            return ((LoadingMoreFooter) mFootView);\n        }\n        return null;\n    }\n\n    // set the number to control call load more,see the demo on linearActivity\n    public void setLimitNumberToCallLoadMore(int limitNumberToCallLoadMore) {\n        this.limitNumberToCallLoadMore = limitNumberToCallLoadMore;\n    }\n\n    public View getFootView(){\n        return mFootView;\n    }\n\n    public void setFootViewText(String loading, String noMore) {\n        if(mFootView instanceof LoadingMoreFooter){\n            ((LoadingMoreFooter) mFootView).setLoadingHint(loading);\n            ((LoadingMoreFooter) mFootView).setNoMoreHint(noMore);\n        }\n    }\n\n    public void addHeaderView(View view) {\n        sHeaderTypes.add(HEADER_INIT_INDEX + mHeaderViews.size());\n        mHeaderViews.add(view);\n        if (mWrapAdapter != null) {\n            mWrapAdapter.notifyDataSetChanged();\n        }\n    }\n\n    //根据header的ViewType判断是哪个header\n    private View getHeaderViewByType(int itemType) {\n        if(!isHeaderType(itemType)) {\n            return null;\n        }\n        return mHeaderViews.get(itemType - HEADER_INIT_INDEX);\n    }\n\n    //判断一个type是否为HeaderType\n    private boolean isHeaderType(int itemViewType) {\n        return  mHeaderViews.size() > 0 &&  sHeaderTypes.contains(itemViewType);\n    }\n\n    //判断是否是XRecyclerView保留的itemViewType\n    private boolean isReservedItemViewType(int itemViewType) {\n        if(itemViewType == TYPE_REFRESH_HEADER || itemViewType == TYPE_FOOTER || sHeaderTypes.contains(itemViewType)) {\n            return true;\n        } else {\n            return false;\n        }\n    }\n\n    @SuppressWarnings(\"all\")\n    public void setFootView(@NonNull final View view,@NonNull CustomFooterViewCallBack footerViewCallBack) {\n        if(view == null || footerViewCallBack == null){\n            return;\n        }\n        mFootView = view;\n        this.footerViewCallBack = footerViewCallBack;\n    }\n\n    public void loadMoreComplete() {\n        isLoadingData = false;\n        if (mFootView instanceof LoadingMoreFooter) {\n            ((LoadingMoreFooter) mFootView).setState(LoadingMoreFooter.STATE_COMPLETE);\n        } else {\n            if(footerViewCallBack != null){\n                footerViewCallBack.onLoadMoreComplete(mFootView);\n            }\n        }\n    }\n\n    public void setNoMore(boolean noMore){\n        isLoadingData = false;\n        isNoMore = noMore;\n        if (mFootView instanceof LoadingMoreFooter) {\n            ((LoadingMoreFooter) mFootView).setState(isNoMore ? LoadingMoreFooter.STATE_NOMORE:LoadingMoreFooter.STATE_COMPLETE);\n        } else {\n            if(footerViewCallBack != null){\n                footerViewCallBack.onSetNoMore(mFootView,noMore);\n            }\n        }\n    }\n    public void refresh() {\n        if (pullRefreshEnabled && mLoadingListener != null) {\n            mRefreshHeader.setState(ArrowRefreshHeader.STATE_REFRESHING);\n            mLoadingListener.onRefresh();\n        }\n    }\n    public void reset(){\n        setNoMore(false);\n        loadMoreComplete();\n        refreshComplete();\n    }\n\n    public void refreshComplete() {\n        mRefreshHeader.refreshComplete();\n        setNoMore(false);\n    }\n\n    public void setRefreshHeader(ArrowRefreshHeader refreshHeader) {\n        mRefreshHeader = refreshHeader;\n    }\n\n    public void setPullRefreshEnabled(boolean enabled) {\n        pullRefreshEnabled = enabled;\n    }\n\n    public void setLoadingMoreEnabled(boolean enabled) {\n        loadingMoreEnabled = enabled;\n        if (!enabled) {\n            if (mFootView instanceof LoadingMoreFooter) {\n                ((LoadingMoreFooter)mFootView).setState(LoadingMoreFooter.STATE_COMPLETE);\n            }\n        }\n    }\n\n    public void setRefreshProgressStyle(int style) {\n        mRefreshProgressStyle = style;\n        if (mRefreshHeader != null) {\n            mRefreshHeader.setProgressStyle(style);\n        }\n    }\n\n    public void setLoadingMoreProgressStyle(int style) {\n        mLoadingMoreProgressStyle = style;\n        if (mFootView instanceof LoadingMoreFooter) {\n            ((LoadingMoreFooter) mFootView).setProgressStyle(style);\n        }\n    }\n\n    public void setArrowImageView(int resId) {\n        if (mRefreshHeader != null) {\n            mRefreshHeader.setArrowImageView(resId);\n        }\n    }\n\n    public void setEmptyView(View emptyView) {\n        this.mEmptyView = emptyView;\n        mDataObserver.onChanged();\n    }\n\n    public View getEmptyView() {\n        return mEmptyView;\n    }\n\n    @Override\n    public void setAdapter(Adapter adapter) {\n        mWrapAdapter = new WrapAdapter(adapter);\n        super.setAdapter(mWrapAdapter);\n        adapter.registerAdapterDataObserver(mDataObserver);\n        mDataObserver.onChanged();\n    }\n\n    //避免用户自己调用getAdapter() 引起的ClassCastException\n    @Override\n    public Adapter getAdapter() {\n        if(mWrapAdapter != null)\n            return mWrapAdapter.getOriginalAdapter();\n        else\n            return null;\n    }\n\n    @Override\n    public void setLayoutManager(LayoutManager layout) {\n        super.setLayoutManager(layout);\n        if(mWrapAdapter != null){\n            if (layout instanceof GridLayoutManager) {\n                final GridLayoutManager gridManager = ((GridLayoutManager) layout);\n                gridManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {\n                    @Override\n                    public int getSpanSize(int position) {\n                        return (mWrapAdapter.isHeader(position) || mWrapAdapter.isFooter(position) || mWrapAdapter.isRefreshHeader(position))\n                                ? gridManager.getSpanCount() : 1;\n                    }\n                });\n            }\n        }\n    }\n\n    /** ===================== try to adjust the position for XR when you call those functions below ====================== */\n    // which cause \"Called attach on a child which is not detached\" exception info.\n    // {reason analyze @link:http://www.cnblogs.com/linguanh/p/5348510.html}\n    // by lgh on 2017-11-13 23:55\n\n    // example: listData.remove(position); You can also see a demo on LinearActivity\n    public<T> void notifyItemRemoved(List<T> listData,int position) {\n        if(mWrapAdapter.adapter == null)\n            return;\n        int adjPos = position + getHeaders_includingRefreshCount();\n        mWrapAdapter.adapter.notifyItemRemoved(adjPos);\n        if(adjPos != listData.size()){\n            // call this just for the reset the position for the list data\n            mWrapAdapter.adapter.notifyItemRangeChanged(adjPos, listData.size() - adjPos,new Object());\n        }\n    }\n\n    public void notifyItemInserted(int position) {\n        if(mWrapAdapter.adapter == null)\n            return;\n        int adjPos = position + getHeaders_includingRefreshCount();\n        mWrapAdapter.adapter.notifyItemInserted(adjPos);\n    }\n\n    public void notifyItemChanged(int position) {\n        if(mWrapAdapter.adapter == null)\n            return;\n        int adjPos = position + getHeaders_includingRefreshCount();\n        mWrapAdapter.adapter.notifyItemChanged(adjPos);\n    }\n\n    public void notifyItemChanged(int position,Object o) {\n        if(mWrapAdapter.adapter == null)\n            return;\n        int adjPos = position + getHeaders_includingRefreshCount();\n        mWrapAdapter.adapter.notifyItemChanged(adjPos,o);\n    }\n\n    private int getHeaders_includingRefreshCount(){\n        return mWrapAdapter.getHeadersCount()+1;\n    }\n\n    /** ======================================================= end ======================================================= */\n\n    @Override\n    public void onScrollStateChanged(int state) {\n        super.onScrollStateChanged(state);\n        if (state == RecyclerView.SCROLL_STATE_IDLE && mLoadingListener != null && !isLoadingData && loadingMoreEnabled) {\n            LayoutManager layoutManager = getLayoutManager();\n            int lastVisibleItemPosition;\n            if (layoutManager instanceof GridLayoutManager) {\n                lastVisibleItemPosition = ((GridLayoutManager) layoutManager).findLastVisibleItemPosition();\n            } else if (layoutManager instanceof StaggeredGridLayoutManager) {\n                int[] into = new int[((StaggeredGridLayoutManager) layoutManager).getSpanCount()];\n                ((StaggeredGridLayoutManager) layoutManager).findLastVisibleItemPositions(into);\n                lastVisibleItemPosition = findMax(into);\n            } else {\n                lastVisibleItemPosition = ((LinearLayoutManager) layoutManager).findLastVisibleItemPosition();\n            }\n            int adjAdapterItemCount = layoutManager.getItemCount()+getHeaders_includingRefreshCount();\n\n            if (\n                    layoutManager.getChildCount() > 0\n                    && lastVisibleItemPosition >= adjAdapterItemCount - limitNumberToCallLoadMore\n                    && adjAdapterItemCount >= layoutManager.getChildCount()\n                    && !isNoMore\n                    && mRefreshHeader.getState() < ArrowRefreshHeader.STATE_REFRESHING\n            )\n            {\n                isLoadingData = true;\n                if (mFootView instanceof LoadingMoreFooter) {\n                    ((LoadingMoreFooter) mFootView).setState(LoadingMoreFooter.STATE_LOADING);\n                } else {\n                    if(footerViewCallBack != null){\n                        footerViewCallBack.onLoadingMore(mFootView);\n                    }\n                }\n                mLoadingListener.onLoadMore();\n            }\n        }\n    }\n\n    @Override\n    public boolean onTouchEvent(MotionEvent ev) {\n        if (mLastY == -1) {\n            mLastY = ev.getRawY();\n        }\n        switch (ev.getAction()) {\n            case MotionEvent.ACTION_DOWN:\n                mLastY = ev.getRawY();\n                break;\n            case MotionEvent.ACTION_MOVE:\n                final float deltaY = ev.getRawY() - mLastY;\n                mLastY = ev.getRawY();\n                if (isOnTop() && pullRefreshEnabled && appbarState == AppBarStateChangeListener.State.EXPANDED) {\n                    mRefreshHeader.onMove(deltaY / DRAG_RATE);\n                    if (mRefreshHeader.getVisibleHeight() > 0 && mRefreshHeader.getState() < ArrowRefreshHeader.STATE_REFRESHING) {\n                        return false;\n                    }\n                }\n                break;\n            default:\n                mLastY = -1; // reset\n                if (isOnTop() && pullRefreshEnabled && appbarState == AppBarStateChangeListener.State.EXPANDED) {\n                    if (mRefreshHeader.releaseAction()) {\n                        if (mLoadingListener != null) {\n                            mLoadingListener.onRefresh();\n                        }\n                    }\n                }\n                break;\n        }\n        return super.onTouchEvent(ev);\n    }\n\n    private int findMax(int[] lastPositions) {\n        int max = lastPositions[0];\n        for (int value : lastPositions) {\n            if (value > max) {\n                max = value;\n            }\n        }\n        return max;\n    }\n\n    private boolean isOnTop() {\n        if (mRefreshHeader.getParent() != null) {\n            return true;\n        } else {\n            return false;\n        }\n    }\n\n    private class DataObserver extends RecyclerView.AdapterDataObserver {\n        @Override\n        public void onChanged() {\n            if (mWrapAdapter != null) {\n                mWrapAdapter.notifyDataSetChanged();\n            }\n            if (mWrapAdapter != null && mEmptyView != null) {\n                int emptyCount = 1 + mWrapAdapter.getHeadersCount();\n                if (loadingMoreEnabled) {\n                    emptyCount++;\n                }\n                if (mWrapAdapter.getItemCount() == emptyCount) {\n                    mEmptyView.setVisibility(View.VISIBLE);\n                    XRecyclerView.this.setVisibility(View.GONE);\n                } else {\n\n                    mEmptyView.setVisibility(View.GONE);\n                    XRecyclerView.this.setVisibility(View.VISIBLE);\n                }\n            }\n        }\n\n        @Override\n        public void onItemRangeInserted(int positionStart, int itemCount) {\n            mWrapAdapter.notifyItemRangeInserted(positionStart, itemCount);\n        }\n\n        @Override\n        public void onItemRangeChanged(int positionStart, int itemCount) {\n            mWrapAdapter.notifyItemRangeChanged(positionStart, itemCount);\n        }\n\n        @Override\n        public void onItemRangeChanged(int positionStart, int itemCount, Object payload) {\n            mWrapAdapter.notifyItemRangeChanged(positionStart, itemCount, payload);\n        }\n\n        @Override\n        public void onItemRangeRemoved(int positionStart, int itemCount) {\n            mWrapAdapter.notifyItemRangeRemoved(positionStart, itemCount);\n        }\n\n        @Override\n        public void onItemRangeMoved(int fromPosition, int toPosition, int itemCount) {\n            mWrapAdapter.notifyItemMoved(fromPosition, toPosition);\n        }\n    };\n\n    private class WrapAdapter extends RecyclerView.Adapter<ViewHolder> {\n\n        private RecyclerView.Adapter adapter;\n\n        public WrapAdapter(RecyclerView.Adapter adapter) {\n            this.adapter = adapter;\n        }\n\n        public RecyclerView.Adapter getOriginalAdapter(){\n            return this.adapter;\n        }\n\n        public boolean isHeader(int position) {\n            return position >= 1 && position < mHeaderViews.size() + 1;\n        }\n\n        public boolean isFooter(int position) {\n            if(loadingMoreEnabled) {\n                return position == getItemCount() - 1;\n            }else {\n                return false;\n            }\n        }\n\n        public boolean isRefreshHeader(int position) {\n            return position == 0;\n        }\n\n        public int getHeadersCount() {\n            return mHeaderViews.size();\n        }\n\n        @Override\n        public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {\n            if (viewType == TYPE_REFRESH_HEADER) {\n                return new SimpleViewHolder(mRefreshHeader);\n            } else if (isHeaderType(viewType)) {\n                return new SimpleViewHolder(getHeaderViewByType(viewType));\n            } else if (viewType == TYPE_FOOTER) {\n                return new SimpleViewHolder(mFootView);\n            }\n            return adapter.onCreateViewHolder(parent, viewType);\n        }\n\n        @Override\n        public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {\n            if (isHeader(position) || isRefreshHeader(position)) {\n                return;\n            }\n            int adjPosition = position - (getHeadersCount() + 1);\n            int adapterCount;\n            if (adapter != null) {\n                adapterCount = adapter.getItemCount();\n                if (adjPosition < adapterCount) {\n                    adapter.onBindViewHolder(holder, adjPosition);\n                }\n            }\n        }\n\n        // some times we need to override this\n        @Override\n        public void onBindViewHolder(RecyclerView.ViewHolder holder, int position,List<Object> payloads) {\n            if (isHeader(position) || isRefreshHeader(position)) {\n                return;\n            }\n\n            int adjPosition = position - (getHeadersCount() + 1);\n            int adapterCount;\n            if (adapter != null) {\n                adapterCount = adapter.getItemCount();\n                if (adjPosition < adapterCount) {\n                    if(payloads.isEmpty()){\n                        adapter.onBindViewHolder(holder, adjPosition);\n                    }\n                    else{\n                        adapter.onBindViewHolder(holder, adjPosition,payloads);\n                    }\n                }\n            }\n        }\n\n        @Override\n        public int getItemCount() {\n            int adjLen = (loadingMoreEnabled?2:1);\n            if (adapter != null) {\n                return getHeadersCount() + adapter.getItemCount() + adjLen;\n            } else {\n                return getHeadersCount() + adjLen;\n            }\n        }\n\n        @Override\n        public int getItemViewType(int position) {\n            int adjPosition = position - (getHeadersCount() + 1);\n            if (isRefreshHeader(position)) {\n                return TYPE_REFRESH_HEADER;\n            }\n            if (isHeader(position)) {\n                position = position - 1;\n                return sHeaderTypes.get(position);\n            }\n            if (isFooter(position)) {\n                return TYPE_FOOTER;\n            }\n            int adapterCount;\n            if (adapter != null) {\n                adapterCount = adapter.getItemCount();\n                if (adjPosition < adapterCount) {\n                    int type =  adapter.getItemViewType(adjPosition);\n                    if(isReservedItemViewType(type)) {\n                        throw new IllegalStateException(\"XRecyclerView require itemViewType in adapter should be less than 10000 \" );\n                    }\n                    return type;\n                }\n            }\n            return 0;\n        }\n\n        @Override\n        public long getItemId(int position) {\n            if (adapter != null && position >= getHeadersCount() + 1) {\n                int adjPosition = position - (getHeadersCount() + 1);\n                if (adjPosition < adapter.getItemCount()) {\n                    return adapter.getItemId(adjPosition);\n                }\n            }\n            return -1;\n        }\n\n        @Override\n        public void onAttachedToRecyclerView(RecyclerView recyclerView) {\n            super.onAttachedToRecyclerView(recyclerView);\n            RecyclerView.LayoutManager manager = recyclerView.getLayoutManager();\n            if (manager instanceof GridLayoutManager) {\n                final GridLayoutManager gridManager = ((GridLayoutManager) manager);\n                gridManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {\n                    @Override\n                    public int getSpanSize(int position) {\n                        return (isHeader(position) || isFooter(position) || isRefreshHeader(position))\n                                ? gridManager.getSpanCount() : 1;\n                    }\n                });\n            }\n            adapter.onAttachedToRecyclerView(recyclerView);\n        }\n\n        @Override\n        public void onDetachedFromRecyclerView(RecyclerView recyclerView) {\n            adapter.onDetachedFromRecyclerView(recyclerView);\n        }\n\n        @Override\n        public void onViewAttachedToWindow(RecyclerView.ViewHolder holder) {\n            super.onViewAttachedToWindow(holder);\n            ViewGroup.LayoutParams lp = holder.itemView.getLayoutParams();\n            if (lp != null\n                    && lp instanceof StaggeredGridLayoutManager.LayoutParams\n                    && (isHeader(holder.getLayoutPosition()) ||isRefreshHeader(holder.getLayoutPosition()) || isFooter(holder.getLayoutPosition()))) {\n                StaggeredGridLayoutManager.LayoutParams p = (StaggeredGridLayoutManager.LayoutParams) lp;\n                p.setFullSpan(true);\n            }\n            adapter.onViewAttachedToWindow(holder);\n        }\n\n        @Override\n        public void onViewDetachedFromWindow(RecyclerView.ViewHolder holder) {\n            adapter.onViewDetachedFromWindow(holder);\n        }\n\n        @Override\n        public void onViewRecycled(RecyclerView.ViewHolder holder) {\n            adapter.onViewRecycled(holder);\n        }\n\n        @Override\n        public boolean onFailedToRecycleView(RecyclerView.ViewHolder holder) {\n            return adapter.onFailedToRecycleView(holder);\n        }\n\n        @Override\n        public void unregisterAdapterDataObserver(AdapterDataObserver observer) {\n            adapter.unregisterAdapterDataObserver(observer);\n        }\n\n        @Override\n        public void registerAdapterDataObserver(AdapterDataObserver observer) {\n            adapter.registerAdapterDataObserver(observer);\n        }\n\n        private class SimpleViewHolder extends RecyclerView.ViewHolder {\n            public SimpleViewHolder(View itemView) {\n                super(itemView);\n            }\n        }\n    }\n\n    public void setLoadingListener(LoadingListener listener) {\n        mLoadingListener = listener;\n    }\n\n    public interface LoadingListener {\n\n        void onRefresh();\n\n        void onLoadMore();\n    }\n\n    @Override\n    protected void onAttachedToWindow() {\n        super.onAttachedToWindow();\n        //解决和CollapsingToolbarLayout冲突的问题\n        AppBarLayout appBarLayout = null;\n        ViewParent p = getParent();\n        while (p != null) {\n            if (p instanceof CoordinatorLayout) {\n                break;\n            }\n            p = p.getParent();\n        }\n        if(p instanceof CoordinatorLayout) {\n            CoordinatorLayout coordinatorLayout = (CoordinatorLayout)p;\n            final int childCount = coordinatorLayout.getChildCount();\n            for (int i = childCount - 1; i >= 0; i--) {\n                final View child = coordinatorLayout.getChildAt(i);\n                if(child instanceof AppBarLayout) {\n                    appBarLayout = (AppBarLayout)child;\n                    break;\n                }\n            }\n            if(appBarLayout != null) {\n                appBarLayout.addOnOffsetChangedListener(new AppBarStateChangeListener() {\n                    @Override\n                    public void onStateChanged(AppBarLayout appBarLayout, State state) {\n                        appbarState = state;\n                    }\n                });\n            }\n        }\n    }\n\n    public class DividerItemDecoration extends RecyclerView.ItemDecoration {\n\n        private Drawable mDivider;\n        private int mOrientation;\n\n        /**\n         * Sole constructor. Takes in a {@link Drawable} to be used as the interior\n         * divider.\n         *\n         * @param divider A divider {@code Drawable} to be drawn on the RecyclerView\n         */\n        public DividerItemDecoration(Drawable divider) {\n            mDivider = divider;\n        }\n\n        /**\n         * Draws horizontal or vertical dividers onto the parent RecyclerView.\n         *\n         * @param canvas The {@link Canvas} onto which dividers will be drawn\n         * @param parent The RecyclerView onto which dividers are being added\n         * @param state The current RecyclerView.State of the RecyclerView\n         */\n        @Override\n        public void onDraw(Canvas canvas, RecyclerView parent, RecyclerView.State state) {\n            if (mOrientation == LinearLayoutManager.HORIZONTAL) {\n                drawHorizontalDividers(canvas, parent);\n            } else if (mOrientation == LinearLayoutManager.VERTICAL) {\n                drawVerticalDividers(canvas, parent);\n            }\n        }\n\n        /**\n         * Determines the size and location of offsets between items in the parent\n         * RecyclerView.\n         *\n         * @param outRect The {@link Rect} of offsets to be added around the child\n         *                view\n         * @param view The child view to be decorated with an offset\n         * @param parent The RecyclerView onto which dividers are being added\n         * @param state The current RecyclerView.State of the RecyclerView\n         */\n        @Override\n        public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {\n            super.getItemOffsets(outRect, view, parent, state);\n\n            if (parent.getChildAdapterPosition(view) <= mWrapAdapter.getHeadersCount() + 1) {\n                return;\n            }\n            mOrientation = ((LinearLayoutManager) parent.getLayoutManager()).getOrientation();\n            if (mOrientation == LinearLayoutManager.HORIZONTAL) {\n                outRect.left = mDivider.getIntrinsicWidth();\n            } else if (mOrientation == LinearLayoutManager.VERTICAL) {\n                outRect.top = mDivider.getIntrinsicHeight();\n            }\n        }\n\n        /**\n         * Adds dividers to a RecyclerView with a LinearLayoutManager or its\n         * subclass oriented horizontally.\n         *\n         * @param canvas The {@link Canvas} onto which horizontal dividers will be\n         *               drawn\n         * @param parent The RecyclerView onto which horizontal dividers are being\n         *               added\n         */\n        private void drawHorizontalDividers(Canvas canvas, RecyclerView parent) {\n            int parentTop = parent.getPaddingTop();\n            int parentBottom = parent.getHeight() - parent.getPaddingBottom();\n\n            int childCount = parent.getChildCount();\n            for (int i = 0; i < childCount - 1; i++) {\n                View child = parent.getChildAt(i);\n\n                RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child.getLayoutParams();\n\n                int parentLeft = child.getRight() + params.rightMargin;\n                int parentRight = parentLeft + mDivider.getIntrinsicWidth();\n\n                mDivider.setBounds(parentLeft, parentTop, parentRight, parentBottom);\n                mDivider.draw(canvas);\n            }\n        }\n\n        /**\n         * Adds dividers to a RecyclerView with a LinearLayoutManager or its\n         * subclass oriented vertically.\n         *\n         * @param canvas The {@link Canvas} onto which vertical dividers will be\n         *               drawn\n         * @param parent The RecyclerView onto which vertical dividers are being\n         *               added\n         */\n        private void drawVerticalDividers(Canvas canvas, RecyclerView parent) {\n            int parentLeft = parent.getPaddingLeft();\n            int parentRight = parent.getWidth() - parent.getPaddingRight();\n\n            int childCount = parent.getChildCount();\n            for (int i = 0; i < childCount - 1; i++) {\n                View child = parent.getChildAt(i);\n\n                RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child.getLayoutParams();\n\n                int parentTop = child.getBottom() + params.bottomMargin;\n                int parentBottom = parentTop + mDivider.getIntrinsicHeight();\n\n                mDivider.setBounds(parentLeft, parentTop, parentRight, parentBottom);\n                mDivider.draw(canvas);\n            }\n        }\n    }\n\n    /** add by LinGuanHong below */\n    private int scrollDyCounter = 0;\n\n    @Override\n    public void scrollToPosition(int position) {\n        super.scrollToPosition(position);\n        /** if we scroll to position 0, the scrollDyCounter should be reset */\n        if(position == 0){\n            scrollDyCounter = 0;\n        }\n    }\n\n    @Override\n    public void onScrolled(int dx, int dy) {\n        super.onScrolled(dx, dy);\n        if(scrollAlphaChangeListener == null){\n            return;\n        }\n        int height = scrollAlphaChangeListener.setLimitHeight();\n        scrollDyCounter = scrollDyCounter + dy;\n        if (scrollDyCounter <= 0) {\n            scrollAlphaChangeListener.onAlphaChange(0);\n        }else if(scrollDyCounter <= height && scrollDyCounter > 0){\n            float scale = (float) scrollDyCounter / height; /** 255/height = x/255 */\n            float alpha = (255 * scale);\n            scrollAlphaChangeListener.onAlphaChange((int) alpha);\n        }else {\n            scrollAlphaChangeListener.onAlphaChange(255);\n        }\n    }\n\n    private ScrollAlphaChangeListener scrollAlphaChangeListener;\n    public void setScrollAlphaChangeListener(\n            ScrollAlphaChangeListener scrollAlphaChangeListener\n    ){\n        this.scrollAlphaChangeListener = scrollAlphaChangeListener;\n    }\n    public interface ScrollAlphaChangeListener{\n        void onAlphaChange(int alpha);  /** you can handle the alpha insert it */\n        int setLimitHeight(); /** set a height for the begging of the alpha start to change */\n    }\n}"
  },
  {
    "path": "librarys/xrecyclerview/src/main/java/com/jcodecraeer/xrecyclerview/progressindicator/AVLoadingIndicatorView.java",
    "content": "package com.jcodecraeer.xrecyclerview.progressindicator;\n\nimport android.annotation.TargetApi;\nimport android.content.Context;\nimport android.content.res.TypedArray;\nimport android.graphics.Canvas;\nimport android.graphics.Color;\nimport android.graphics.Paint;\nimport android.os.Build;\nimport android.support.annotation.IntDef;\nimport android.util.AttributeSet;\nimport android.view.View;\n\nimport com.jcodecraeer.xrecyclerview.R;\nimport com.jcodecraeer.xrecyclerview.progressindicator.indicator.BallBeatIndicator;\nimport com.jcodecraeer.xrecyclerview.progressindicator.indicator.BallClipRotateIndicator;\nimport com.jcodecraeer.xrecyclerview.progressindicator.indicator.BallClipRotateMultipleIndicator;\nimport com.jcodecraeer.xrecyclerview.progressindicator.indicator.BallClipRotatePulseIndicator;\nimport com.jcodecraeer.xrecyclerview.progressindicator.indicator.BallGridBeatIndicator;\nimport com.jcodecraeer.xrecyclerview.progressindicator.indicator.BallGridPulseIndicator;\nimport com.jcodecraeer.xrecyclerview.progressindicator.indicator.BallPulseIndicator;\nimport com.jcodecraeer.xrecyclerview.progressindicator.indicator.BallPulseRiseIndicator;\nimport com.jcodecraeer.xrecyclerview.progressindicator.indicator.BallPulseSyncIndicator;\nimport com.jcodecraeer.xrecyclerview.progressindicator.indicator.BallRotateIndicator;\nimport com.jcodecraeer.xrecyclerview.progressindicator.indicator.BallScaleIndicator;\nimport com.jcodecraeer.xrecyclerview.progressindicator.indicator.BallScaleMultipleIndicator;\nimport com.jcodecraeer.xrecyclerview.progressindicator.indicator.BallScaleRippleIndicator;\nimport com.jcodecraeer.xrecyclerview.progressindicator.indicator.BallScaleRippleMultipleIndicator;\nimport com.jcodecraeer.xrecyclerview.progressindicator.indicator.BallSpinFadeLoaderIndicator;\nimport com.jcodecraeer.xrecyclerview.progressindicator.indicator.BallTrianglePathIndicator;\nimport com.jcodecraeer.xrecyclerview.progressindicator.indicator.BallZigZagDeflectIndicator;\nimport com.jcodecraeer.xrecyclerview.progressindicator.indicator.BallZigZagIndicator;\nimport com.jcodecraeer.xrecyclerview.progressindicator.indicator.BaseIndicatorController;\nimport com.jcodecraeer.xrecyclerview.progressindicator.indicator.CubeTransitionIndicator;\nimport com.jcodecraeer.xrecyclerview.progressindicator.indicator.LineScaleIndicator;\nimport com.jcodecraeer.xrecyclerview.progressindicator.indicator.LineScalePartyIndicator;\nimport com.jcodecraeer.xrecyclerview.progressindicator.indicator.LineScalePulseOutIndicator;\nimport com.jcodecraeer.xrecyclerview.progressindicator.indicator.LineScalePulseOutRapidIndicator;\nimport com.jcodecraeer.xrecyclerview.progressindicator.indicator.LineSpinFadeLoaderIndicator;\nimport com.jcodecraeer.xrecyclerview.progressindicator.indicator.PacmanIndicator;\nimport com.jcodecraeer.xrecyclerview.progressindicator.indicator.SemiCircleSpinIndicator;\nimport com.jcodecraeer.xrecyclerview.progressindicator.indicator.SquareSpinIndicator;\nimport com.jcodecraeer.xrecyclerview.progressindicator.indicator.TriangleSkewSpinIndicator;\n\n\n/**\n * Created by Jack on 2015/10/15\n *\n .BallPulse,\n .BallGridPulse,\n .BallClipRotate,\n .BallClipRotatePulse,\n .SquareSpin,\n .BallClipRotateMultiple,\n .BallPulseRise,\n .BallRotate,\n .CubeTransition,\n .BallZigZag,\n .BallZigZagDeflect,\n .BallTrianglePath,\n .BallScale,\n .LineScale,\n .LineScaleParty,\n .BallScaleMultiple,\n .BallPulseSync,\n .BallBeat,\n .LineScalePulseOut,\n .LineScalePulseOutRapid,\n .BallScaleRipple,\n .BallScaleRippleMultiple,\n .BallSpinFadeLoader,\n .LineSpinFadeLoader,\n .TriangleSkewSpin,\n .Pacman,\n .BallGridBeat,\n .SemiCircleSpin\n *\n */\npublic class AVLoadingIndicatorView extends View{\n    //indicators\n    public static final int BallPulse=0;\n    public static final int BallGridPulse=1;\n    public static final int BallClipRotate=2;\n    public static final int BallClipRotatePulse=3;\n    public static final int SquareSpin=4;\n    public static final int BallClipRotateMultiple=5;\n    public static final int BallPulseRise=6;\n    public static final int BallRotate=7;\n    public static final int CubeTransition=8;\n    public static final int BallZigZag=9;\n    public static final int BallZigZagDeflect=10;\n    public static final int BallTrianglePath=11;\n    public static final int BallScale=12;\n    public static final int LineScale=13;\n    public static final int LineScaleParty=14;\n    public static final int BallScaleMultiple=15;\n    public static final int BallPulseSync=16;\n    public static final int BallBeat=17;\n    public static final int LineScalePulseOut=18;\n    public static final int LineScalePulseOutRapid=19;\n    public static final int BallScaleRipple=20;\n    public static final int BallScaleRippleMultiple=21;\n    public static final int BallSpinFadeLoader=22;\n    public static final int LineSpinFadeLoader=23;\n    public static final int TriangleSkewSpin=24;\n    public static final int Pacman=25;\n    public static final int BallGridBeat=26;\n    public static final int SemiCircleSpin=27;\n\n\n    @IntDef(flag = true,\n            value = {\n                    BallPulse,\n                    BallGridPulse,\n                    BallClipRotate,\n                    BallClipRotatePulse,\n                    SquareSpin,\n                    BallClipRotateMultiple,\n                    BallPulseRise,\n                    BallRotate,\n                    CubeTransition,\n                    BallZigZag,\n                    BallZigZagDeflect,\n                    BallTrianglePath,\n                    BallScale,\n                    LineScale,\n                    LineScaleParty,\n                    BallScaleMultiple,\n                    BallPulseSync,\n                    BallBeat,\n                    LineScalePulseOut,\n                    LineScalePulseOutRapid,\n                    BallScaleRipple,\n                    BallScaleRippleMultiple,\n                    BallSpinFadeLoader,\n                    LineSpinFadeLoader,\n                    TriangleSkewSpin,\n                    Pacman,\n                    BallGridBeat,\n                    SemiCircleSpin\n            })\n    public @interface Indicator{}\n\n    //Sizes (with defaults in DP)\n    public static final int DEFAULT_SIZE=30;\n\n    //attrs\n    int mIndicatorId;\n    int mIndicatorColor;\n\n    Paint mPaint;\n\n    BaseIndicatorController mIndicatorController;\n\n    private boolean mHasAnimation;\n\n    public AVLoadingIndicatorView(Context context) {\n        super(context);\n        init(null, 0);\n    }\n\n    public AVLoadingIndicatorView(Context context, AttributeSet attrs) {\n        super(context, attrs);\n        init(attrs, 0);\n    }\n\n    public AVLoadingIndicatorView(Context context, AttributeSet attrs, int defStyleAttr) {\n        super(context, attrs, defStyleAttr);\n        init(attrs, defStyleAttr);\n    }\n\n\n    @TargetApi(Build.VERSION_CODES.LOLLIPOP)\n    public AVLoadingIndicatorView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {\n        super(context, attrs, defStyleAttr, defStyleRes);\n        init(attrs, defStyleAttr);\n    }\n\n    private void init(AttributeSet attrs, int defStyle) {\n        TypedArray a = getContext().obtainStyledAttributes(attrs, R.styleable.AVLoadingIndicatorView);\n        mIndicatorId=a.getInt(R.styleable.AVLoadingIndicatorView_indicator, BallPulse);\n        mIndicatorColor=a.getColor(R.styleable.AVLoadingIndicatorView_indicator_color, Color.WHITE);\n        a.recycle();\n        mPaint=new Paint();\n        mPaint.setColor(mIndicatorColor);\n        mPaint.setStyle(Paint.Style.FILL);\n        mPaint.setAntiAlias(true);\n        applyIndicator();\n    }\n\n    public void setIndicatorId(int  indicatorId){\n        mIndicatorId = indicatorId;\n        applyIndicator();\n    }\n\n    public void setIndicatorColor(int color){\n        mIndicatorColor = color;\n        mPaint.setColor(mIndicatorColor);\n        this.invalidate();\n    }\n\n    private void applyIndicator(){\n        switch (mIndicatorId){\n            case BallPulse:\n                mIndicatorController=new BallPulseIndicator();\n                break;\n            case BallGridPulse:\n                mIndicatorController=new BallGridPulseIndicator();\n                break;\n            case BallClipRotate:\n                mIndicatorController=new BallClipRotateIndicator();\n                break;\n            case BallClipRotatePulse:\n                mIndicatorController=new BallClipRotatePulseIndicator();\n                break;\n            case SquareSpin:\n                mIndicatorController=new SquareSpinIndicator();\n                break;\n            case BallClipRotateMultiple:\n                mIndicatorController=new BallClipRotateMultipleIndicator();\n                break;\n            case BallPulseRise:\n                mIndicatorController=new BallPulseRiseIndicator();\n                break;\n            case BallRotate:\n                mIndicatorController=new BallRotateIndicator();\n                break;\n            case CubeTransition:\n                mIndicatorController=new CubeTransitionIndicator();\n                break;\n            case BallZigZag:\n                mIndicatorController=new BallZigZagIndicator();\n                break;\n            case BallZigZagDeflect:\n                mIndicatorController=new BallZigZagDeflectIndicator();\n                break;\n            case BallTrianglePath:\n                mIndicatorController=new BallTrianglePathIndicator();\n                break;\n            case BallScale:\n                mIndicatorController=new BallScaleIndicator();\n                break;\n            case LineScale:\n                mIndicatorController=new LineScaleIndicator();\n                break;\n            case LineScaleParty:\n                mIndicatorController=new LineScalePartyIndicator();\n                break;\n            case BallScaleMultiple:\n                mIndicatorController=new BallScaleMultipleIndicator();\n                break;\n            case BallPulseSync:\n                mIndicatorController=new BallPulseSyncIndicator();\n                break;\n            case BallBeat:\n                mIndicatorController=new BallBeatIndicator();\n                break;\n            case LineScalePulseOut:\n                mIndicatorController=new LineScalePulseOutIndicator();\n                break;\n            case LineScalePulseOutRapid:\n                mIndicatorController=new LineScalePulseOutRapidIndicator();\n                break;\n            case BallScaleRipple:\n                mIndicatorController=new BallScaleRippleIndicator();\n                break;\n            case BallScaleRippleMultiple:\n                mIndicatorController=new BallScaleRippleMultipleIndicator();\n                break;\n            case BallSpinFadeLoader:\n                mIndicatorController=new BallSpinFadeLoaderIndicator();\n                break;\n            case LineSpinFadeLoader:\n                mIndicatorController=new LineSpinFadeLoaderIndicator();\n                break;\n            case TriangleSkewSpin:\n                mIndicatorController=new TriangleSkewSpinIndicator();\n                break;\n            case Pacman:\n                mIndicatorController=new PacmanIndicator();\n                break;\n            case BallGridBeat:\n                mIndicatorController=new BallGridBeatIndicator();\n                break;\n            case SemiCircleSpin:\n                mIndicatorController=new SemiCircleSpinIndicator();\n                break;\n        }\n        mIndicatorController.setTarget(this);\n    }\n\n    @Override\n    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {\n        int width  = measureDimension(dp2px(DEFAULT_SIZE), widthMeasureSpec);\n        int height = measureDimension(dp2px(DEFAULT_SIZE), heightMeasureSpec);\n        setMeasuredDimension(width, height);\n    }\n\n    private int measureDimension(int defaultSize,int measureSpec){\n        int result = defaultSize;\n        int specMode = MeasureSpec.getMode(measureSpec);\n        int specSize = MeasureSpec.getSize(measureSpec);\n        if (specMode == MeasureSpec.EXACTLY) {\n            result = specSize;\n        } else if (specMode == MeasureSpec.AT_MOST) {\n            result = Math.min(defaultSize, specSize);\n        } else {\n            result = defaultSize;\n        }\n        return result;\n    }\n\n    @Override\n    protected void onDraw(Canvas canvas) {\n        super.onDraw(canvas);\n        drawIndicator(canvas);\n    }\n\n    @Override\n    protected void onLayout(boolean changed, int left, int top, int right, int bottom) {\n        super.onLayout(changed, left, top, right, bottom);\n        if (!mHasAnimation){\n            mHasAnimation=true;\n            applyAnimation();\n        }\n    }\n\n    @Override\n    public void setVisibility(int v) {\n        if (getVisibility() != v) {\n            super.setVisibility(v);\n            if (v == GONE || v == INVISIBLE) {\n                mIndicatorController.setAnimationStatus(BaseIndicatorController.AnimStatus.END);\n            } else {\n                mIndicatorController.setAnimationStatus(BaseIndicatorController.AnimStatus.START);\n            }\n        }\n    }\n\n    @Override\n    protected void onDetachedFromWindow() {\n        super.onDetachedFromWindow();\n        mIndicatorController.setAnimationStatus(BaseIndicatorController.AnimStatus.CANCEL);\n    }\n\n    @Override\n    protected void onAttachedToWindow() {\n        super.onAttachedToWindow();\n        mIndicatorController.setAnimationStatus(BaseIndicatorController.AnimStatus.START);\n    }\n\n    void drawIndicator(Canvas canvas){\n        mIndicatorController.draw(canvas, mPaint);\n    }\n\n    void applyAnimation(){\n        mIndicatorController.initAnimation();\n    }\n\n    private int dp2px(int dpValue) {\n        return (int) getContext().getResources().getDisplayMetrics().density * dpValue;\n    }\n\n\n}\n"
  },
  {
    "path": "librarys/xrecyclerview/src/main/java/com/jcodecraeer/xrecyclerview/progressindicator/indicator/BallBeatIndicator.java",
    "content": "package com.jcodecraeer.xrecyclerview.progressindicator.indicator;\n\nimport android.animation.Animator;\nimport android.animation.ValueAnimator;\nimport android.graphics.Canvas;\nimport android.graphics.Paint;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\n/**\n * Created by Jack on 2015/10/19.\n */\npublic class BallBeatIndicator extends com.jcodecraeer.xrecyclerview.progressindicator.indicator.BaseIndicatorController {\n\n    public static final float SCALE=1.0f;\n\n    public static final int ALPHA=255;\n\n    private float[] scaleFloats=new float[]{SCALE,\n            SCALE,\n            SCALE};\n\n    int[] alphas=new int[]{ALPHA,\n            ALPHA,\n            ALPHA,};\n\n    @Override\n    public void draw(Canvas canvas, Paint paint) {\n        float circleSpacing=4;\n        float radius=(getWidth()-circleSpacing*2)/6;\n        float x = getWidth()/ 2-(radius*2+circleSpacing);\n        float y=getHeight() / 2;\n        for (int i = 0; i < 3; i++) {\n            canvas.save();\n            float translateX=x+(radius*2)*i+circleSpacing*i;\n            canvas.translate(translateX, y);\n            canvas.scale(scaleFloats[i], scaleFloats[i]);\n            paint.setAlpha(alphas[i]);\n            canvas.drawCircle(0, 0, radius, paint);\n            canvas.restore();\n        }\n    }\n\n    @Override\n    public List<Animator> createAnimation() {\n        List<Animator> animators=new ArrayList<>();\n        int[] delays=new int[]{350,0,350};\n        for (int i = 0; i < 3; i++) {\n            final int index=i;\n            ValueAnimator scaleAnim=ValueAnimator.ofFloat(1,0.75f,1);\n            scaleAnim.setDuration(700);\n            scaleAnim.setRepeatCount(-1);\n            scaleAnim.setStartDelay(delays[i]);\n            scaleAnim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {\n                @Override\n                public void onAnimationUpdate(ValueAnimator animation) {\n                    scaleFloats[index] = (float) animation.getAnimatedValue();\n                    postInvalidate();\n                }\n            });\n            scaleAnim.start();\n\n            ValueAnimator alphaAnim=ValueAnimator.ofInt(255,51,255);\n            alphaAnim.setDuration(700);\n            alphaAnim.setRepeatCount(-1);\n            alphaAnim.setStartDelay(delays[i]);\n            alphaAnim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {\n                @Override\n                public void onAnimationUpdate(ValueAnimator animation) {\n                    alphas[index] = (int) animation.getAnimatedValue();\n                    postInvalidate();\n                }\n            });\n            alphaAnim.start();\n            animators.add(scaleAnim);\n            animators.add(alphaAnim);\n        }\n        return animators;\n    }\n\n}\n"
  },
  {
    "path": "librarys/xrecyclerview/src/main/java/com/jcodecraeer/xrecyclerview/progressindicator/indicator/BallClipRotateIndicator.java",
    "content": "package com.jcodecraeer.xrecyclerview.progressindicator.indicator;\n\nimport android.animation.Animator;\nimport android.animation.ValueAnimator;\nimport android.graphics.Canvas;\nimport android.graphics.Paint;\nimport android.graphics.RectF;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\n/**\n * Created by Jack on 2015/10/16.\n */\npublic class BallClipRotateIndicator extends BaseIndicatorController {\n\n    float scaleFloat=1,degrees;\n\n    @Override\n    public void draw(Canvas canvas, Paint paint) {\n        paint.setStyle(Paint.Style.STROKE);\n        paint.setStrokeWidth(3);\n\n        float circleSpacing=12;\n        float x = (getWidth()) / 2;\n        float y=(getHeight()) / 2;\n        canvas.translate(x, y);\n        canvas.scale(scaleFloat, scaleFloat);\n        canvas.rotate(degrees);\n        RectF rectF=new RectF(-x+circleSpacing,-y+circleSpacing,0+x-circleSpacing,0+y-circleSpacing);\n        canvas.drawArc(rectF, -45, 270, false, paint);\n    }\n\n    @Override\n    public List<Animator> createAnimation() {\n        List<Animator> animators=new ArrayList<>();\n        ValueAnimator scaleAnim=ValueAnimator.ofFloat(1,0.6f,0.5f,1);\n        scaleAnim.setDuration(750);\n        scaleAnim.setRepeatCount(-1);\n        scaleAnim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {\n            @Override\n            public void onAnimationUpdate(ValueAnimator animation) {\n                scaleFloat = (float) animation.getAnimatedValue();\n                postInvalidate();\n            }\n        });\n        scaleAnim.start();\n\n        ValueAnimator rotateAnim=ValueAnimator.ofFloat(0,180,360);\n        rotateAnim.setDuration(750);\n        rotateAnim.setRepeatCount(-1);\n        rotateAnim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {\n            @Override\n            public void onAnimationUpdate(ValueAnimator animation) {\n                degrees = (float) animation.getAnimatedValue();\n                postInvalidate();\n            }\n        });\n        rotateAnim.start();\n        animators.add(scaleAnim);\n        animators.add(rotateAnim);\n        return animators;\n    }\n\n}\n"
  },
  {
    "path": "librarys/xrecyclerview/src/main/java/com/jcodecraeer/xrecyclerview/progressindicator/indicator/BallClipRotateMultipleIndicator.java",
    "content": "package com.jcodecraeer.xrecyclerview.progressindicator.indicator;\n\nimport android.animation.Animator;\nimport android.animation.ValueAnimator;\nimport android.graphics.Canvas;\nimport android.graphics.Paint;\nimport android.graphics.RectF;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\n/**\n * Created by Jack on 2015/10/17.\n */\npublic class BallClipRotateMultipleIndicator extends BaseIndicatorController{\n\n    float scaleFloat=1,degrees;\n\n\n    @Override\n    public void draw(Canvas canvas, Paint paint) {\n        paint.setStrokeWidth(3);\n        paint.setStyle(Paint.Style.STROKE);\n\n        float circleSpacing=12;\n        float x=getWidth()/2;\n        float y=getHeight()/2;\n\n        canvas.save();\n\n        canvas.translate(x, y);\n        canvas.scale(scaleFloat, scaleFloat);\n        canvas.rotate(degrees);\n\n        //draw two big arc\n        float[] bStartAngles=new float[]{135,-45};\n        for (int i = 0; i < 2; i++) {\n            RectF rectF=new RectF(-x+circleSpacing,-y+circleSpacing,x-circleSpacing,y-circleSpacing);\n            canvas.drawArc(rectF, bStartAngles[i], 90, false, paint);\n        }\n\n        canvas.restore();\n        canvas.translate(x, y);\n        canvas.scale(scaleFloat, scaleFloat);\n        canvas.rotate(-degrees);\n        //draw two small arc\n        float[] sStartAngles=new float[]{225,45};\n        for (int i = 0; i < 2; i++) {\n            RectF rectF=new RectF(-x/1.8f+circleSpacing,-y/1.8f+circleSpacing,x/1.8f-circleSpacing,y/1.8f-circleSpacing);\n            canvas.drawArc(rectF, sStartAngles[i], 90, false, paint);\n        }\n    }\n\n    @Override\n    public List<Animator> createAnimation() {\n        List<Animator> animators=new ArrayList<>();\n        ValueAnimator scaleAnim=ValueAnimator.ofFloat(1,0.6f,1);\n        scaleAnim.setDuration(1000);\n        scaleAnim.setRepeatCount(-1);\n        scaleAnim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {\n            @Override\n            public void onAnimationUpdate(ValueAnimator animation) {\n                scaleFloat = (float) animation.getAnimatedValue();\n                postInvalidate();\n            }\n        });\n        scaleAnim.start();\n\n        ValueAnimator rotateAnim=ValueAnimator.ofFloat(0, 180,360);\n        rotateAnim.setDuration(1000);\n        rotateAnim.setRepeatCount(-1);\n        rotateAnim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {\n            @Override\n            public void onAnimationUpdate(ValueAnimator animation) {\n                degrees = (float) animation.getAnimatedValue();\n                postInvalidate();\n            }\n        });\n        rotateAnim.start();\n        animators.add(scaleAnim);\n        animators.add(rotateAnim);\n        return animators;\n    }\n\n}\n"
  },
  {
    "path": "librarys/xrecyclerview/src/main/java/com/jcodecraeer/xrecyclerview/progressindicator/indicator/BallClipRotatePulseIndicator.java",
    "content": "package com.jcodecraeer.xrecyclerview.progressindicator.indicator;\n\nimport android.animation.Animator;\nimport android.animation.ValueAnimator;\nimport android.graphics.Canvas;\nimport android.graphics.Paint;\nimport android.graphics.RectF;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\n/**\n * Created by Jack on 2015/10/16.\n */\npublic class BallClipRotatePulseIndicator extends BaseIndicatorController {\n\n    float scaleFloat1,scaleFloat2,degrees;\n\n\n    @Override\n    public void draw(Canvas canvas, Paint paint) {\n        float circleSpacing=12;\n        float x=getWidth()/2;\n        float y=getHeight()/2;\n\n        //draw fill circle\n        canvas.save();\n        canvas.translate(x, y);\n        canvas.scale(scaleFloat1, scaleFloat1);\n        paint.setStyle(Paint.Style.FILL);\n        canvas.drawCircle(0, 0, x / 2.5f, paint);\n\n        canvas.restore();\n\n        canvas.translate(x, y);\n        canvas.scale(scaleFloat2, scaleFloat2);\n        canvas.rotate(degrees);\n\n        paint.setStrokeWidth(3);\n        paint.setStyle(Paint.Style.STROKE);\n\n        //draw two arc\n        float[] startAngles=new float[]{225,45};\n        for (int i = 0; i < 2; i++) {\n            RectF rectF=new RectF(-x+circleSpacing,-y+circleSpacing,x-circleSpacing,y-circleSpacing);\n            canvas.drawArc(rectF, startAngles[i], 90, false, paint);\n        }\n    }\n\n    @Override\n    public List<Animator> createAnimation() {\n        ValueAnimator scaleAnim=ValueAnimator.ofFloat(1,0.3f,1);\n        scaleAnim.setDuration(1000);\n        scaleAnim.setRepeatCount(-1);\n        scaleAnim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {\n            @Override\n            public void onAnimationUpdate(ValueAnimator animation) {\n                scaleFloat1 = (float) animation.getAnimatedValue();\n                postInvalidate();\n            }\n        });\n        scaleAnim.start();\n\n        ValueAnimator scaleAnim2=ValueAnimator.ofFloat(1,0.6f,1);\n        scaleAnim2.setDuration(1000);\n        scaleAnim2.setRepeatCount(-1);\n        scaleAnim2.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {\n            @Override\n            public void onAnimationUpdate(ValueAnimator animation) {\n                scaleFloat2 = (float) animation.getAnimatedValue();\n                postInvalidate();\n            }\n        });\n        scaleAnim2.start();\n\n        ValueAnimator rotateAnim=ValueAnimator.ofFloat(0, 180,360);\n        rotateAnim.setDuration(1000);\n        rotateAnim.setRepeatCount(-1);\n        rotateAnim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {\n            @Override\n            public void onAnimationUpdate(ValueAnimator animation) {\n                degrees = (float) animation.getAnimatedValue();\n                postInvalidate();\n            }\n        });\n        rotateAnim.start();\n        List<Animator> animators=new ArrayList<>();\n        animators.add(scaleAnim);\n        animators.add(scaleAnim2);\n        animators.add(rotateAnim);\n        return animators;\n    }\n\n}\n"
  },
  {
    "path": "librarys/xrecyclerview/src/main/java/com/jcodecraeer/xrecyclerview/progressindicator/indicator/BallGridBeatIndicator.java",
    "content": "package com.jcodecraeer.xrecyclerview.progressindicator.indicator;\n\nimport android.animation.Animator;\nimport android.animation.ValueAnimator;\nimport android.graphics.Canvas;\nimport android.graphics.Paint;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\n/**\n * Created by Jack on 2015/10/20.\n */\npublic class BallGridBeatIndicator extends BaseIndicatorController {\n\n    public static final int ALPHA=255;\n\n    int[] alphas=new int[]{ALPHA,\n            ALPHA,\n            ALPHA,\n            ALPHA,\n            ALPHA,\n            ALPHA,\n            ALPHA,\n            ALPHA,\n            ALPHA};\n\n    @Override\n    public void draw(Canvas canvas, Paint paint) {\n        float circleSpacing=4;\n        float radius=(getWidth()-circleSpacing*4)/6;\n        float x = getWidth()/ 2-(radius*2+circleSpacing);\n        float y = getWidth()/ 2-(radius*2+circleSpacing);\n\n        for (int i = 0; i < 3; i++) {\n            for (int j = 0; j < 3; j++) {\n                canvas.save();\n                float translateX=x+(radius*2)*j+circleSpacing*j;\n                float translateY=y+(radius*2)*i+circleSpacing*i;\n                canvas.translate(translateX, translateY);\n                paint.setAlpha(alphas[3 * i + j]);\n                canvas.drawCircle(0, 0, radius, paint);\n                canvas.restore();\n            }\n        }\n    }\n\n    @Override\n    public List<Animator> createAnimation() {\n        List<Animator> animators=new ArrayList<>();\n\n        int[] durations={960, 930, 1190, 1130, 1340, 940, 1200, 820, 1190};\n        int[] delays= {360, 400, 680, 410, 710, -150, -120, 10, 320};\n\n        for (int i = 0; i < 9; i++) {\n            final int index=i;\n            ValueAnimator alphaAnim=ValueAnimator.ofInt(255, 168,255);\n            alphaAnim.setDuration(durations[i]);\n            alphaAnim.setRepeatCount(-1);\n            alphaAnim.setStartDelay(delays[i]);\n            alphaAnim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {\n                @Override\n                public void onAnimationUpdate(ValueAnimator animation) {\n                    alphas[index] = (int) animation.getAnimatedValue();\n                    postInvalidate();\n                }\n            });\n            alphaAnim.start();\n            animators.add(alphaAnim);\n        }\n        return animators;\n    }\n\n\n\n}\n"
  },
  {
    "path": "librarys/xrecyclerview/src/main/java/com/jcodecraeer/xrecyclerview/progressindicator/indicator/BallGridPulseIndicator.java",
    "content": "package com.jcodecraeer.xrecyclerview.progressindicator.indicator;\n\nimport android.animation.Animator;\nimport android.animation.ValueAnimator;\nimport android.graphics.Canvas;\nimport android.graphics.Paint;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\n/**\n * Created by Jack on 2015/10/16.\n */\npublic class BallGridPulseIndicator extends BaseIndicatorController{\n\n    public static final int ALPHA=255;\n\n    public static final float SCALE=1.0f;\n\n    int[] alphas=new int[]{ALPHA,\n            ALPHA,\n            ALPHA,\n            ALPHA,\n            ALPHA,\n            ALPHA,\n            ALPHA,\n            ALPHA,\n            ALPHA};\n\n    float[] scaleFloats=new float[]{SCALE,\n            SCALE,\n            SCALE,\n            SCALE,\n            SCALE,\n            SCALE,\n            SCALE,\n            SCALE,\n            SCALE};\n\n\n\n    @Override\n    public void draw(Canvas canvas, Paint paint) {\n        float circleSpacing=4;\n        float radius=(getWidth()-circleSpacing*4)/6;\n        float x = getWidth()/ 2-(radius*2+circleSpacing);\n        float y = getWidth()/ 2-(radius*2+circleSpacing);\n\n        for (int i = 0; i < 3; i++) {\n            for (int j = 0; j < 3; j++) {\n                canvas.save();\n                float translateX=x+(radius*2)*j+circleSpacing*j;\n                float translateY=y+(radius*2)*i+circleSpacing*i;\n                canvas.translate(translateX, translateY);\n                canvas.scale(scaleFloats[3 * i + j], scaleFloats[3 * i + j]);\n                paint.setAlpha(alphas[3 * i + j]);\n                canvas.drawCircle(0, 0, radius, paint);\n                canvas.restore();\n            }\n        }\n    }\n\n    @Override\n    public List<Animator> createAnimation() {\n        List<Animator> animators=new ArrayList<>();\n        int[] durations={720, 1020, 1280, 1420, 1450, 1180, 870, 1450, 1060};\n        int[] delays= {-60, 250, -170, 480, 310, 30, 460, 780, 450};\n\n        for (int i = 0; i < 9; i++) {\n            final int index=i;\n            ValueAnimator scaleAnim=ValueAnimator.ofFloat(1,0.5f,1);\n            scaleAnim.setDuration(durations[i]);\n            scaleAnim.setRepeatCount(-1);\n            scaleAnim.setStartDelay(delays[i]);\n            scaleAnim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {\n                @Override\n                public void onAnimationUpdate(ValueAnimator animation) {\n                    scaleFloats[index] = (float) animation.getAnimatedValue();\n                    postInvalidate();\n                }\n            });\n            scaleAnim.start();\n\n            ValueAnimator alphaAnim=ValueAnimator.ofInt(255, 210, 122, 255);\n            alphaAnim.setDuration(durations[i]);\n            alphaAnim.setRepeatCount(-1);\n            alphaAnim.setStartDelay(delays[i]);\n            alphaAnim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {\n                @Override\n                public void onAnimationUpdate(ValueAnimator animation) {\n                    alphas[index] = (int) animation.getAnimatedValue();\n                    postInvalidate();\n                }\n            });\n            alphaAnim.start();\n            animators.add(scaleAnim);\n            animators.add(alphaAnim);\n        }\n        return animators;\n    }\n\n\n}\n"
  },
  {
    "path": "librarys/xrecyclerview/src/main/java/com/jcodecraeer/xrecyclerview/progressindicator/indicator/BallPulseIndicator.java",
    "content": "package com.jcodecraeer.xrecyclerview.progressindicator.indicator;\n\nimport android.animation.Animator;\nimport android.animation.ValueAnimator;\nimport android.graphics.Canvas;\nimport android.graphics.Paint;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\n/**\n * Created by Jack on 2015/10/16.\n */\npublic class BallPulseIndicator extends BaseIndicatorController{\n\n    public static final float SCALE=1.0f;\n\n    //scale x ,y\n    private float[] scaleFloats=new float[]{SCALE,\n            SCALE,\n            SCALE};\n\n\n\n    @Override\n    public void draw(Canvas canvas, Paint paint) {\n        float circleSpacing=4;\n        float radius=(Math.min(getWidth(),getHeight())-circleSpacing*2)/6;\n        float x = getWidth()/ 2-(radius*2+circleSpacing);\n        float y=getHeight() / 2;\n        for (int i = 0; i < 3; i++) {\n            canvas.save();\n            float translateX=x+(radius*2)*i+circleSpacing*i;\n            canvas.translate(translateX, y);\n            canvas.scale(scaleFloats[i], scaleFloats[i]);\n            canvas.drawCircle(0, 0, radius, paint);\n            canvas.restore();\n        }\n    }\n\n    @Override\n    public List<Animator> createAnimation() {\n        List<Animator> animators=new ArrayList<>();\n        int[] delays=new int[]{120,240,360};\n        for (int i = 0; i < 3; i++) {\n            final int index=i;\n            \n            ValueAnimator scaleAnim=ValueAnimator.ofFloat(1,0.3f,1);\n            \n            scaleAnim.setDuration(750);\n            scaleAnim.setRepeatCount(-1);\n            scaleAnim.setStartDelay(delays[i]);\n            \n            scaleAnim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {\n                @Override\n                public void onAnimationUpdate(ValueAnimator animation) {\n                    scaleFloats[index] = (float) animation.getAnimatedValue();\n                    postInvalidate();\n\n                }\n            });\n            scaleAnim.start();\n            animators.add(scaleAnim);\n        }\n        return animators;\n    }\n\n}\n"
  },
  {
    "path": "librarys/xrecyclerview/src/main/java/com/jcodecraeer/xrecyclerview/progressindicator/indicator/BallPulseRiseIndicator.java",
    "content": "package com.jcodecraeer.xrecyclerview.progressindicator.indicator;\n\nimport android.animation.Animator;\nimport android.animation.ObjectAnimator;\nimport android.animation.PropertyValuesHolder;\nimport android.graphics.Canvas;\nimport android.graphics.Paint;\nimport android.view.animation.LinearInterpolator;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\n/**\n * Created by Jack on 2015/10/17.\n */\npublic class BallPulseRiseIndicator extends BaseIndicatorController{\n\n    @Override\n    public void draw(Canvas canvas, Paint paint) {\n        float radius=getWidth()/10;\n        canvas.drawCircle(getWidth()/4,radius*2,radius,paint);\n        canvas.drawCircle(getWidth()*3/4,radius*2,radius,paint);\n\n        canvas.drawCircle(radius,getHeight()-2*radius,radius,paint);\n        canvas.drawCircle(getWidth()/2,getHeight()-2*radius,radius,paint);\n        canvas.drawCircle(getWidth()-radius,getHeight()-2*radius,radius,paint);\n    }\n\n    @Override\n    public List<Animator> createAnimation() {\n        PropertyValuesHolder rotation6=PropertyValuesHolder.ofFloat(\"rotationX\",0,360);\n        ObjectAnimator animator=ObjectAnimator.ofPropertyValuesHolder(getTarget(), rotation6);\n        animator.setInterpolator(new LinearInterpolator());\n        animator.setRepeatCount(-1);\n        animator.setDuration(1500);\n        animator.start();\n        List<Animator> animators=new ArrayList<>();\n        animators.add(animator);\n        return animators;\n    }\n}\n"
  },
  {
    "path": "librarys/xrecyclerview/src/main/java/com/jcodecraeer/xrecyclerview/progressindicator/indicator/BallPulseSyncIndicator.java",
    "content": "package com.jcodecraeer.xrecyclerview.progressindicator.indicator;\n\nimport android.animation.Animator;\nimport android.animation.ValueAnimator;\nimport android.graphics.Canvas;\nimport android.graphics.Paint;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\n/**\n * Created by Jack on 2015/10/19.\n */\npublic class BallPulseSyncIndicator extends BaseIndicatorController {\n\n    float[] translateYFloats=new float[3];\n\n    @Override\n    public void draw(Canvas canvas, Paint paint) {\n        float circleSpacing=4;\n        float radius=(getWidth()-circleSpacing*2)/6;\n        float x = getWidth()/ 2-(radius*2+circleSpacing);\n        for (int i = 0; i < 3; i++) {\n            canvas.save();\n            float translateX=x+(radius*2)*i+circleSpacing*i;\n            canvas.translate(translateX, translateYFloats[i]);\n            canvas.drawCircle(0, 0, radius, paint);\n            canvas.restore();\n        }\n    }\n\n    @Override\n    public List<Animator> createAnimation() {\n        List<Animator> animators=new ArrayList<>();\n        float circleSpacing=4;\n        float radius=(getWidth()-circleSpacing*2)/6;\n        int[] delays=new int[]{70,140,210};\n        for (int i = 0; i < 3; i++) {\n            final int index=i;\n            ValueAnimator scaleAnim=ValueAnimator.ofFloat(getHeight()/2,getHeight()/2-radius*2,getHeight()/2);\n            scaleAnim.setDuration(600);\n            scaleAnim.setRepeatCount(-1);\n            scaleAnim.setStartDelay(delays[i]);\n            scaleAnim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {\n                @Override\n                public void onAnimationUpdate(ValueAnimator animation) {\n                    translateYFloats[index] = (float) animation.getAnimatedValue();\n                    postInvalidate();\n                }\n            });\n            scaleAnim.start();\n            animators.add(scaleAnim);\n        }\n        return animators;\n    }\n\n}\n"
  },
  {
    "path": "librarys/xrecyclerview/src/main/java/com/jcodecraeer/xrecyclerview/progressindicator/indicator/BallRotateIndicator.java",
    "content": "package com.jcodecraeer.xrecyclerview.progressindicator.indicator;\n\nimport android.animation.Animator;\nimport android.animation.ObjectAnimator;\nimport android.animation.ValueAnimator;\nimport android.graphics.Canvas;\nimport android.graphics.Paint;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\n/**\n * Created by Jack on 2015/10/17.\n */\npublic class BallRotateIndicator extends BaseIndicatorController{\n\n    float scaleFloat=0.5f;\n\n\n    @Override\n    public void draw(Canvas canvas, Paint paint) {\n        float radius=getWidth()/10;\n        float x = getWidth()/ 2;\n        float y=getHeight()/2;\n\n        canvas.save();\n        canvas.translate(x - radius * 2 - radius, y);\n        canvas.scale(scaleFloat, scaleFloat);\n        canvas.drawCircle(0, 0, radius, paint);\n        canvas.restore();\n\n        canvas.save();\n        canvas.translate(x, y);\n        canvas.scale(scaleFloat, scaleFloat);\n        canvas.drawCircle(0, 0, radius, paint);\n        canvas.restore();\n\n        canvas.save();\n        canvas.translate(x + radius * 2 + radius, y);\n        canvas.scale(scaleFloat, scaleFloat);\n        canvas.drawCircle(0,0,radius, paint);\n        canvas.restore();\n    }\n\n    @Override\n    public List<Animator> createAnimation() {\n        List<Animator> animators=new ArrayList<>();\n        ValueAnimator scaleAnim=ValueAnimator.ofFloat(0.5f,1,0.5f);\n        scaleAnim.setDuration(1000);\n        scaleAnim.setRepeatCount(-1);\n        scaleAnim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {\n            @Override\n            public void onAnimationUpdate(ValueAnimator animation) {\n                scaleFloat = (float) animation.getAnimatedValue();\n                postInvalidate();\n            }\n        });\n        scaleAnim.start();\n\n        ObjectAnimator rotateAnim=ObjectAnimator.ofFloat(getTarget(),\"rotation\",0,180,360);\n        rotateAnim.setDuration(1000);\n        rotateAnim.setRepeatCount(-1);\n        rotateAnim.start();\n\n        animators.add(scaleAnim);\n        animators.add(rotateAnim);\n        return animators;\n    }\n\n\n}\n"
  },
  {
    "path": "librarys/xrecyclerview/src/main/java/com/jcodecraeer/xrecyclerview/progressindicator/indicator/BallScaleIndicator.java",
    "content": "package com.jcodecraeer.xrecyclerview.progressindicator.indicator;\n\nimport android.animation.Animator;\nimport android.animation.ValueAnimator;\nimport android.graphics.Canvas;\nimport android.graphics.Paint;\nimport android.view.animation.LinearInterpolator;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\n/**\n * Created by Jack on 2015/10/19.\n */\npublic class BallScaleIndicator extends BaseIndicatorController {\n\n    float scale=1;\n    int alpha=255;\n\n    @Override\n    public void draw(Canvas canvas, Paint paint) {\n        float circleSpacing=4;\n        paint.setAlpha(alpha);\n        canvas.scale(scale,scale,getWidth()/2,getHeight()/2);\n        paint.setAlpha(alpha);\n        canvas.drawCircle(getWidth()/2,getHeight()/2,getWidth()/2-circleSpacing,paint);\n    }\n\n    @Override\n    public List<Animator> createAnimation() {\n        List<Animator> animators=new ArrayList<>();\n        ValueAnimator scaleAnim=ValueAnimator.ofFloat(0,1);\n        scaleAnim.setInterpolator(new LinearInterpolator());\n        scaleAnim.setDuration(1000);\n        scaleAnim.setRepeatCount(-1);\n        scaleAnim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {\n            @Override\n            public void onAnimationUpdate(ValueAnimator animation) {\n                scale = (float) animation.getAnimatedValue();\n                postInvalidate();\n            }\n        });\n        scaleAnim.start();\n\n        ValueAnimator alphaAnim=ValueAnimator.ofInt(255, 0);\n        alphaAnim.setInterpolator(new LinearInterpolator());\n        alphaAnim.setDuration(1000);\n        alphaAnim.setRepeatCount(-1);\n        alphaAnim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {\n            @Override\n            public void onAnimationUpdate(ValueAnimator animation) {\n                alpha = (int) animation.getAnimatedValue();\n                postInvalidate();\n            }\n        });\n        alphaAnim.start();\n        animators.add(scaleAnim);\n        animators.add(alphaAnim);\n        return animators;\n    }\n\n\n}\n"
  },
  {
    "path": "librarys/xrecyclerview/src/main/java/com/jcodecraeer/xrecyclerview/progressindicator/indicator/BallScaleMultipleIndicator.java",
    "content": "package com.jcodecraeer.xrecyclerview.progressindicator.indicator;\n\nimport android.animation.Animator;\nimport android.animation.ValueAnimator;\nimport android.graphics.Canvas;\nimport android.graphics.Paint;\nimport android.view.animation.LinearInterpolator;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\n/**\n * Created by Jack on 2015/10/19.\n */\npublic class BallScaleMultipleIndicator extends BaseIndicatorController {\n\n    float[] scaleFloats=new float[]{1,1,1};\n    int[] alphaInts=new int[]{255,255,255};\n\n    @Override\n    public void draw(Canvas canvas, Paint paint) {\n        float circleSpacing=4;\n        for (int i = 0; i < 3; i++) {\n            paint.setAlpha(alphaInts[i]);\n            canvas.scale(scaleFloats[i],scaleFloats[i],getWidth()/2,getHeight()/2);\n            canvas.drawCircle(getWidth()/2,getHeight()/2,getWidth()/2-circleSpacing,paint);\n        }\n    }\n\n    @Override\n    public List<Animator> createAnimation() {\n        List<Animator> animators=new ArrayList<>();\n        long[] delays=new long[]{0, 200, 400};\n        for (int i = 0; i < 3; i++) {\n            final int index=i;\n            ValueAnimator scaleAnim=ValueAnimator.ofFloat(0,1);\n            scaleAnim.setInterpolator(new LinearInterpolator());\n            scaleAnim.setDuration(1000);\n            scaleAnim.setRepeatCount(-1);\n            scaleAnim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {\n                @Override\n                public void onAnimationUpdate(ValueAnimator animation) {\n                    scaleFloats[index] = (float) animation.getAnimatedValue();\n                    postInvalidate();\n                }\n            });\n            scaleAnim.setStartDelay(delays[i]);\n            scaleAnim.start();\n\n            ValueAnimator alphaAnim=ValueAnimator.ofInt(255,0);\n            alphaAnim.setInterpolator(new LinearInterpolator());\n            alphaAnim.setDuration(1000);\n            alphaAnim.setRepeatCount(-1);\n            alphaAnim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {\n                @Override\n                public void onAnimationUpdate(ValueAnimator animation) {\n                    alphaInts[index] = (int) animation.getAnimatedValue();\n                    postInvalidate();\n                }\n            });\n            scaleAnim.setStartDelay(delays[i]);\n            alphaAnim.start();\n\n            animators.add(scaleAnim);\n            animators.add(alphaAnim);\n        }\n        return animators;\n    }\n\n}\n"
  },
  {
    "path": "librarys/xrecyclerview/src/main/java/com/jcodecraeer/xrecyclerview/progressindicator/indicator/BallScaleRippleIndicator.java",
    "content": "package com.jcodecraeer.xrecyclerview.progressindicator.indicator;\n\nimport android.animation.Animator;\nimport android.animation.ValueAnimator;\nimport android.graphics.Canvas;\nimport android.graphics.Paint;\nimport android.view.animation.LinearInterpolator;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\n/**\n * Created by Jack on 2015/10/19.\n */\npublic class BallScaleRippleIndicator extends BallScaleIndicator {\n\n\n    @Override\n    public void draw(Canvas canvas, Paint paint) {\n        paint.setStyle(Paint.Style.STROKE);\n        paint.setStrokeWidth(3);\n        super.draw(canvas, paint);\n    }\n\n    @Override\n    public List<Animator> createAnimation() {\n        List<Animator> animators=new ArrayList<>();\n        ValueAnimator scaleAnim=ValueAnimator.ofFloat(0,1);\n        scaleAnim.setInterpolator(new LinearInterpolator());\n        scaleAnim.setDuration(1000);\n        scaleAnim.setRepeatCount(-1);\n        scaleAnim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {\n            @Override\n            public void onAnimationUpdate(ValueAnimator animation) {\n                scale = (float) animation.getAnimatedValue();\n                postInvalidate();\n            }\n        });\n        scaleAnim.start();\n\n        ValueAnimator alphaAnim=ValueAnimator.ofInt(0, 255);\n        alphaAnim.setInterpolator(new LinearInterpolator());\n        alphaAnim.setDuration(1000);\n        alphaAnim.setRepeatCount(-1);\n        alphaAnim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {\n            @Override\n            public void onAnimationUpdate(ValueAnimator animation) {\n                alpha = (int) animation.getAnimatedValue();\n                postInvalidate();\n            }\n        });\n        alphaAnim.start();\n\n        animators.add(scaleAnim);\n        animators.add(alphaAnim);\n        return animators;\n    }\n\n}\n"
  },
  {
    "path": "librarys/xrecyclerview/src/main/java/com/jcodecraeer/xrecyclerview/progressindicator/indicator/BallScaleRippleMultipleIndicator.java",
    "content": "package com.jcodecraeer.xrecyclerview.progressindicator.indicator;\n\nimport android.animation.Animator;\nimport android.animation.ValueAnimator;\nimport android.graphics.Canvas;\nimport android.graphics.Paint;\nimport android.view.animation.LinearInterpolator;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\n/**\n * Created by Jack on 2015/10/19.\n */\npublic class BallScaleRippleMultipleIndicator extends BallScaleMultipleIndicator{\n\n\n    @Override\n    public void draw(Canvas canvas, Paint paint) {\n        paint.setStyle(Paint.Style.STROKE);\n        paint.setStrokeWidth(3);\n        super.draw(canvas, paint);\n    }\n\n    @Override\n    public List<Animator> createAnimation() {\n        List<Animator> animators=new ArrayList<>();\n        long[] delays=new long[]{0, 200, 400};\n        for (int i = 0; i < 3; i++) {\n            final int index=i;\n            ValueAnimator scaleAnim=ValueAnimator.ofFloat(0,1);\n            scaleAnim.setInterpolator(new LinearInterpolator());\n            scaleAnim.setDuration(1000);\n            scaleAnim.setRepeatCount(-1);\n            scaleAnim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {\n                @Override\n                public void onAnimationUpdate(ValueAnimator animation) {\n                    scaleFloats[index] = (float) animation.getAnimatedValue();\n                    postInvalidate();\n                }\n            });\n            scaleAnim.setStartDelay(delays[i]);\n            scaleAnim.start();\n\n            ValueAnimator alphaAnim=ValueAnimator.ofInt(0,255);\n            scaleAnim.setInterpolator(new LinearInterpolator());\n            alphaAnim.setDuration(1000);\n            alphaAnim.setRepeatCount(-1);\n            alphaAnim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {\n                @Override\n                public void onAnimationUpdate(ValueAnimator animation) {\n                    alphaInts[index] = (int) animation.getAnimatedValue();\n                    postInvalidate();\n                }\n            });\n            scaleAnim.setStartDelay(delays[i]);\n            alphaAnim.start();\n\n            animators.add(scaleAnim);\n            animators.add(alphaAnim);\n        }\n        return animators;\n    }\n\n}\n"
  },
  {
    "path": "librarys/xrecyclerview/src/main/java/com/jcodecraeer/xrecyclerview/progressindicator/indicator/BallSpinFadeLoaderIndicator.java",
    "content": "package com.jcodecraeer.xrecyclerview.progressindicator.indicator;\n\nimport android.animation.Animator;\nimport android.animation.ValueAnimator;\nimport android.graphics.Canvas;\nimport android.graphics.Paint;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\n/**\n * Created by Jack on 2015/10/20.\n */\npublic class BallSpinFadeLoaderIndicator extends BaseIndicatorController {\n\n    public static final float SCALE=1.0f;\n\n    public static final int ALPHA=255;\n\n    float[] scaleFloats=new float[]{SCALE,\n            SCALE,\n            SCALE,\n            SCALE,\n            SCALE,\n            SCALE,\n            SCALE,\n            SCALE};\n\n    int[] alphas=new int[]{ALPHA,\n            ALPHA,\n            ALPHA,\n            ALPHA,\n            ALPHA,\n            ALPHA,\n            ALPHA,\n            ALPHA};\n\n\n    @Override\n    public void draw(Canvas canvas, Paint paint) {\n        float radius=getWidth()/10;\n        for (int i = 0; i < 8; i++) {\n            canvas.save();\n            Point point=circleAt(getWidth(),getHeight(),getWidth()/2-radius,i*(Math.PI/4));\n            canvas.translate(point.x,point.y);\n            canvas.scale(scaleFloats[i],scaleFloats[i]);\n            paint.setAlpha(alphas[i]);\n            canvas.drawCircle(0,0,radius,paint);\n            canvas.restore();\n        }\n    }\n\n    /**\n     * 圆O的圆心为(a,b),半径为R,点A与到X轴的为角α.\n     *则点A的坐标为(a+R*cosα,b+R*sinα)\n     * @param width\n     * @param height\n     * @param radius\n     * @param angle\n     * @return\n     */\n    Point circleAt(int width,int height,float radius,double angle){\n        float x= (float) (width/2+radius*(Math.cos(angle)));\n        float y= (float) (height/2+radius*(Math.sin(angle)));\n        return new Point(x,y);\n    }\n\n    @Override\n    public List<Animator> createAnimation() {\n        List<Animator> animators=new ArrayList<>();\n        int[] delays= {0, 120, 240, 360, 480, 600, 720, 780, 840};\n        for (int i = 0; i < 8; i++) {\n            final int index=i;\n            ValueAnimator scaleAnim=ValueAnimator.ofFloat(1,0.4f,1);\n            scaleAnim.setDuration(1000);\n            scaleAnim.setRepeatCount(-1);\n            scaleAnim.setStartDelay(delays[i]);\n            scaleAnim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {\n                @Override\n                public void onAnimationUpdate(ValueAnimator animation) {\n                    scaleFloats[index] = (float) animation.getAnimatedValue();\n                    postInvalidate();\n                }\n            });\n            scaleAnim.start();\n\n            ValueAnimator alphaAnim=ValueAnimator.ofInt(255, 77, 255);\n            alphaAnim.setDuration(1000);\n            alphaAnim.setRepeatCount(-1);\n            alphaAnim.setStartDelay(delays[i]);\n            alphaAnim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {\n                @Override\n                public void onAnimationUpdate(ValueAnimator animation) {\n                    alphas[index] = (int) animation.getAnimatedValue();\n                    postInvalidate();\n                }\n            });\n            alphaAnim.start();\n            animators.add(scaleAnim);\n            animators.add(alphaAnim);\n        }\n        return animators;\n    }\n\n    final class Point{\n        public float x;\n        public float y;\n\n        public Point(float x, float y){\n            this.x=x;\n            this.y=y;\n        }\n    }\n\n\n}\n"
  },
  {
    "path": "librarys/xrecyclerview/src/main/java/com/jcodecraeer/xrecyclerview/progressindicator/indicator/BallTrianglePathIndicator.java",
    "content": "package com.jcodecraeer.xrecyclerview.progressindicator.indicator;\n\nimport android.animation.Animator;\nimport android.animation.ValueAnimator;\nimport android.graphics.Canvas;\nimport android.graphics.Paint;\nimport android.view.animation.LinearInterpolator;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\n/**\n * Created by Jack on 2015/10/19.\n */\npublic class BallTrianglePathIndicator extends BaseIndicatorController {\n\n    float[] translateX=new float[3],translateY=new float[3];\n\n    @Override\n    public void draw(Canvas canvas, Paint paint) {\n        paint.setStrokeWidth(3);\n        paint.setStyle(Paint.Style.STROKE);\n        for (int i = 0; i < 3; i++) {\n            canvas.save();\n            canvas.translate(translateX[i], translateY[i]);\n            canvas.drawCircle(0, 0, getWidth() / 10, paint);\n            canvas.restore();\n        }\n    }\n\n    @Override\n    public List<Animator> createAnimation() {\n        List<Animator> animators=new ArrayList<>();\n        float startX=getWidth()/5;\n        float startY=getWidth()/5;\n        for (int i = 0; i < 3; i++) {\n            final int index=i;\n            ValueAnimator translateXAnim=ValueAnimator.ofFloat(getWidth()/2,getWidth()-startX,startX,getWidth()/2);\n            if (i==1){\n                translateXAnim=ValueAnimator.ofFloat(getWidth()-startX,startX,getWidth()/2,getWidth()-startX);\n            }else if (i==2){\n                translateXAnim=ValueAnimator.ofFloat(startX,getWidth()/2,getWidth()-startX,startX);\n            }\n            ValueAnimator translateYAnim=ValueAnimator.ofFloat(startY,getHeight()-startY,getHeight()-startY,startY);\n            if (i==1){\n                translateYAnim=ValueAnimator.ofFloat(getHeight()-startY,getHeight()-startY,startY,getHeight()-startY);\n            }else if (i==2){\n                translateYAnim=ValueAnimator.ofFloat(getHeight()-startY,startY,getHeight()-startY,getHeight()-startY);\n            }\n\n            translateXAnim.setDuration(2000);\n            translateXAnim.setInterpolator(new LinearInterpolator());\n                translateXAnim.setRepeatCount(-1);\n            translateXAnim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {\n                @Override\n                public void onAnimationUpdate(ValueAnimator animation) {\n                    translateX [index]= (float) animation.getAnimatedValue();\n                    postInvalidate();\n                }\n            });\n            translateXAnim.start();\n\n            translateYAnim.setDuration(2000);\n            translateYAnim.setInterpolator(new LinearInterpolator());\n            translateYAnim.setRepeatCount(-1);\n            translateYAnim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {\n                @Override\n                public void onAnimationUpdate(ValueAnimator animation) {\n                    translateY [index]= (float) animation.getAnimatedValue();\n                    postInvalidate();\n                }\n            });\n            translateYAnim.start();\n\n            animators.add(translateXAnim);\n            animators.add(translateYAnim);\n        }\n        return animators;\n    }\n\n\n}\n"
  },
  {
    "path": "librarys/xrecyclerview/src/main/java/com/jcodecraeer/xrecyclerview/progressindicator/indicator/BallZigZagDeflectIndicator.java",
    "content": "package com.jcodecraeer.xrecyclerview.progressindicator.indicator;\n\n\nimport android.animation.Animator;\nimport android.animation.ValueAnimator;\nimport android.view.animation.LinearInterpolator;\nimport java.util.ArrayList;\nimport java.util.List;\n\n/**\n * Created by Jack on 2015/10/19.\n */\npublic class BallZigZagDeflectIndicator extends com.jcodecraeer.xrecyclerview.progressindicator.indicator.BallZigZagIndicator {\n\n\n\n\n    @Override\n    public List<Animator> createAnimation() {\n        List<Animator> animators=new ArrayList<>();\n        float startX=getWidth()/6;\n        float startY=getWidth()/6;\n        for (int i = 0; i < 2; i++) {\n            final int index=i;\n            ValueAnimator translateXAnim=ValueAnimator.ofFloat(startX,getWidth()-startX,startX,getWidth()-startX,startX);\n            if (i==1){\n                translateXAnim=ValueAnimator.ofFloat(getWidth()-startX,startX,getWidth()-startX,startX,getWidth()-startX);\n            }\n            ValueAnimator translateYAnim=ValueAnimator.ofFloat(startY,startY,getHeight()-startY,getHeight()-startY,startY);\n            if (i==1){\n                translateYAnim=ValueAnimator.ofFloat(getHeight()-startY,getHeight()-startY,startY,startY,getHeight()-startY);\n            }\n\n            translateXAnim.setDuration(2000);\n            translateXAnim.setInterpolator(new LinearInterpolator());\n            translateXAnim.setRepeatCount(-1);\n            translateXAnim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {\n                @Override\n                public void onAnimationUpdate(ValueAnimator animation) {\n                    translateX [index]= (float) animation.getAnimatedValue();\n                    postInvalidate();\n                }\n            });\n            translateXAnim.start();\n\n            translateYAnim.setDuration(2000);\n            translateYAnim.setInterpolator(new LinearInterpolator());\n            translateYAnim.setRepeatCount(-1);\n            translateYAnim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {\n                @Override\n                public void onAnimationUpdate(ValueAnimator animation) {\n                    translateY [index]= (float) animation.getAnimatedValue();\n                    postInvalidate();\n                }\n            });\n            translateYAnim.start();\n\n            animators.add(translateXAnim);\n            animators.add(translateYAnim);\n        }\n        return animators;\n    }\n\n}\n"
  },
  {
    "path": "librarys/xrecyclerview/src/main/java/com/jcodecraeer/xrecyclerview/progressindicator/indicator/BallZigZagIndicator.java",
    "content": "package com.jcodecraeer.xrecyclerview.progressindicator.indicator;\n\nimport android.animation.Animator;\nimport android.animation.ValueAnimator;\nimport android.graphics.Canvas;\nimport android.graphics.Paint;\nimport android.view.animation.LinearInterpolator;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\n/**\n * Created by Jack on 2015/10/19.\n */\npublic class BallZigZagIndicator extends BaseIndicatorController {\n\n    float[] translateX=new float[2],translateY=new float[2];\n\n\n    @Override\n    public void draw(Canvas canvas, Paint paint) {\n        for (int i = 0; i < 2; i++) {\n            canvas.save();\n            canvas.translate(translateX[i], translateY[i]);\n            canvas.drawCircle(0, 0, getWidth() / 10, paint);\n            canvas.restore();\n        }\n    }\n\n    @Override\n    public List<Animator> createAnimation() {\n        List<Animator> animators=new ArrayList<>();\n        float startX=getWidth()/6;\n        float startY=getWidth()/6;\n        for (int i = 0; i < 2; i++) {\n            final int index=i;\n            ValueAnimator translateXAnim=ValueAnimator.ofFloat(startX,getWidth()-startX,getWidth()/2,startX);\n            if (i==1){\n                translateXAnim=ValueAnimator.ofFloat(getWidth()-startX,startX,getWidth()/2,getWidth()-startX);\n            }\n            ValueAnimator translateYAnim=ValueAnimator.ofFloat(startY,startY,getHeight()/2,startY);\n            if (i==1){\n                translateYAnim=ValueAnimator.ofFloat(getHeight()-startY,getHeight()-startY,getHeight()/2,getHeight()-startY);\n            }\n\n            translateXAnim.setDuration(1000);\n            translateXAnim.setInterpolator(new LinearInterpolator());\n            translateXAnim.setRepeatCount(-1);\n            translateXAnim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {\n                @Override\n                public void onAnimationUpdate(ValueAnimator animation) {\n                    translateX[index] = (float) animation.getAnimatedValue();\n                    postInvalidate();\n                }\n            });\n            translateXAnim.start();\n\n            translateYAnim.setDuration(1000);\n            translateYAnim.setInterpolator(new LinearInterpolator());\n            translateYAnim.setRepeatCount(-1);\n            translateYAnim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {\n                @Override\n                public void onAnimationUpdate(ValueAnimator animation) {\n                    translateY[index] = (float) animation.getAnimatedValue();\n                    postInvalidate();\n                }\n            });\n            translateYAnim.start();\n            animators.add(translateXAnim);\n            animators.add(translateYAnim);\n        }\n        return animators;\n    }\n\n}\n"
  },
  {
    "path": "librarys/xrecyclerview/src/main/java/com/jcodecraeer/xrecyclerview/progressindicator/indicator/BaseIndicatorController.java",
    "content": "package com.jcodecraeer.xrecyclerview.progressindicator.indicator;\n\nimport android.animation.Animator;\nimport android.graphics.Canvas;\nimport android.graphics.Paint;\nimport android.view.View;\nimport java.util.List;\n\n/**\n * Created by Jack on 2015/10/15.\n */\npublic abstract class BaseIndicatorController {\n\n\n    private View mTarget;\n\n    private List<Animator> mAnimators;\n\n\n    public void setTarget(View target){\n        this.mTarget=target;\n    }\n\n    public View getTarget(){\n        return mTarget;\n    }\n\n\n    public int getWidth(){\n        return mTarget.getWidth();\n    }\n\n    public int getHeight(){\n        return mTarget.getHeight();\n    }\n\n    public void postInvalidate(){\n        mTarget.postInvalidate();\n    }\n\n    /**\n     * draw indicator\n     * @param canvas\n     * @param paint\n     */\n    public abstract void draw(Canvas canvas,Paint paint);\n\n    /**\n     * create animation or animations\n     */\n    public abstract List<Animator> createAnimation();\n\n    public void initAnimation(){\n        mAnimators=createAnimation();\n    }\n\n    /**\n     * make animation to start or end when target\n     * view was be Visible or Gone or Invisible.\n     * make animation to cancel when target view\n     * be onDetachedFromWindow.\n     * @param animStatus\n     */\n    public void setAnimationStatus(AnimStatus animStatus){\n        if (mAnimators==null){\n            return;\n        }\n        int count=mAnimators.size();\n        for (int i = 0; i < count; i++) {\n            Animator animator=mAnimators.get(i);\n            boolean isRunning=animator.isRunning();\n            switch (animStatus){\n                case START:\n                    if (!isRunning){\n                        animator.start();\n                    }\n                    break;\n                case END:\n                    if (isRunning){\n                        animator.end();\n                    }\n                    break;\n                case CANCEL:\n                    if (isRunning){\n                        animator.cancel();\n                    }\n                    break;\n            }\n        }\n    }\n\n\n    public enum AnimStatus{\n        START,END,CANCEL\n    }\n\n\n\n}\n"
  },
  {
    "path": "librarys/xrecyclerview/src/main/java/com/jcodecraeer/xrecyclerview/progressindicator/indicator/CubeTransitionIndicator.java",
    "content": "package com.jcodecraeer.xrecyclerview.progressindicator.indicator;\n\nimport android.animation.Animator;\nimport android.animation.ValueAnimator;\nimport android.graphics.Canvas;\nimport android.graphics.Paint;\nimport android.graphics.RectF;\nimport android.view.animation.LinearInterpolator;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\n/**\n * Created by Jack on 2015/10/18.\n */\npublic class CubeTransitionIndicator extends BaseIndicatorController {\n\n    float[] translateX=new float[2],translateY=new float[2];\n    float degrees,scaleFloat=1.0f;\n\n    @Override\n    public void draw(Canvas canvas, Paint paint) {\n        float rWidth=getWidth()/5;\n        float rHeight=getHeight()/5;\n        for (int i = 0; i < 2; i++) {\n            canvas.save();\n            canvas.translate(translateX[i], translateY[i]);\n            canvas.rotate(degrees);\n            canvas.scale(scaleFloat,scaleFloat);\n            RectF rectF=new RectF(-rWidth/2,-rHeight/2,rWidth/2,rHeight/2);\n            canvas.drawRect(rectF,paint);\n            canvas.restore();\n        }\n    }\n\n    @Override\n    public List<Animator> createAnimation() {\n        List<Animator> animators=new ArrayList<>();\n        float startX=getWidth()/5;\n        float startY=getHeight()/5;\n        for (int i = 0; i < 2; i++) {\n            final int index=i;\n            translateX[index]=startX;\n            ValueAnimator translationXAnim=ValueAnimator.ofFloat(startX,getWidth()-startX,getWidth()-startX, startX,startX);\n            if (i==1){\n                translationXAnim=ValueAnimator.ofFloat(getWidth()-startX,startX,startX, getWidth()-startX,getWidth()-startX);\n            }\n            translationXAnim.setInterpolator(new LinearInterpolator());\n            translationXAnim.setDuration(1600);\n            translationXAnim.setRepeatCount(-1);\n            translationXAnim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {\n                @Override\n                public void onAnimationUpdate(ValueAnimator animation) {\n                    translateX[index] = (float) animation.getAnimatedValue();\n                    postInvalidate();\n                }\n            });\n            translationXAnim.start();\n            translateY[index]=startY;\n            ValueAnimator translationYAnim=ValueAnimator.ofFloat(startY,startY,getHeight()-startY,getHeight()- startY,startY);\n            if (i==1){\n                translationYAnim=ValueAnimator.ofFloat(getHeight()-startY,getHeight()-startY,startY,startY,getHeight()-startY);\n            }\n            translationYAnim.setDuration(1600);\n            translationYAnim.setInterpolator(new LinearInterpolator());\n            translationYAnim.setRepeatCount(-1);\n            translationYAnim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {\n                @Override\n                public void onAnimationUpdate(ValueAnimator animation) {\n                    translateY[index] = (float) animation.getAnimatedValue();\n                    postInvalidate();\n                }\n            });\n            translationYAnim.start();\n\n            animators.add(translationXAnim);\n            animators.add(translationYAnim);\n        }\n\n        ValueAnimator scaleAnim=ValueAnimator.ofFloat(1,0.5f,1,0.5f,1);\n        scaleAnim.setDuration(1600);\n        scaleAnim.setInterpolator(new LinearInterpolator());\n        scaleAnim.setRepeatCount(-1);\n        scaleAnim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {\n            @Override\n            public void onAnimationUpdate(ValueAnimator animation) {\n                scaleFloat = (float) animation.getAnimatedValue();\n                postInvalidate();\n            }\n        });\n        scaleAnim.start();\n\n        ValueAnimator rotateAnim=ValueAnimator.ofFloat(0,180,360,1.5f*360,2*360);\n        rotateAnim.setDuration(1600);\n        rotateAnim.setInterpolator(new LinearInterpolator());\n        rotateAnim.setRepeatCount(-1);\n        rotateAnim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {\n            @Override\n            public void onAnimationUpdate(ValueAnimator animation) {\n                degrees = (float) animation.getAnimatedValue();\n                postInvalidate();\n            }\n        });\n        rotateAnim.start();\n\n        animators.add(scaleAnim);\n        animators.add(rotateAnim);\n        return animators;\n    }\n}\n"
  },
  {
    "path": "librarys/xrecyclerview/src/main/java/com/jcodecraeer/xrecyclerview/progressindicator/indicator/LineScaleIndicator.java",
    "content": "package com.jcodecraeer.xrecyclerview.progressindicator.indicator;\n\nimport android.animation.Animator;\nimport android.animation.ValueAnimator;\nimport android.graphics.Canvas;\nimport android.graphics.Paint;\nimport android.graphics.RectF;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\n/**\n * Created by Jack on 2015/10/19.\n */\npublic class LineScaleIndicator extends BaseIndicatorController {\n\n    public static final float SCALE=1.0f;\n\n    float[] scaleYFloats=new float[]{SCALE,\n            SCALE,\n            SCALE,\n            SCALE,\n            SCALE,};\n\n    @Override\n    public void draw(Canvas canvas, Paint paint) {\n        float translateX=getWidth()/11;\n        float translateY=getHeight()/2;\n        for (int i = 0; i < 5; i++) {\n            canvas.save();\n            canvas.translate((2 + i * 2) * translateX - translateX / 2, translateY);\n            canvas.scale(SCALE, scaleYFloats[i]);\n            RectF rectF=new RectF(-translateX/2,-getHeight()/2.5f,translateX/2,getHeight()/2.5f);\n            canvas.drawRoundRect(rectF, 5, 5, paint);\n            canvas.restore();\n        }\n    }\n\n    @Override\n    public List<Animator> createAnimation() {\n        List<Animator> animators=new ArrayList<>();\n        long[] delays=new long[]{100,200,300,400,500};\n        for (int i = 0; i < 5; i++) {\n            final int index=i;\n            ValueAnimator scaleAnim=ValueAnimator.ofFloat(1, 0.4f, 1);\n            scaleAnim.setDuration(1000);\n            scaleAnim.setRepeatCount(-1);\n            scaleAnim.setStartDelay(delays[i]);\n            scaleAnim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {\n                @Override\n                public void onAnimationUpdate(ValueAnimator animation) {\n                    scaleYFloats[index] = (float) animation.getAnimatedValue();\n                    postInvalidate();\n                }\n            });\n            scaleAnim.start();\n            animators.add(scaleAnim);\n        }\n        return animators;\n    }\n\n}\n"
  },
  {
    "path": "librarys/xrecyclerview/src/main/java/com/jcodecraeer/xrecyclerview/progressindicator/indicator/LineScalePartyIndicator.java",
    "content": "package com.jcodecraeer.xrecyclerview.progressindicator.indicator;\n\nimport android.animation.Animator;\nimport android.animation.ValueAnimator;\nimport android.graphics.Canvas;\nimport android.graphics.Paint;\nimport android.graphics.RectF;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\n/**\n * Created by Jack on 2015/10/19.\n */\npublic class LineScalePartyIndicator extends BaseIndicatorController {\n\n    public static final float SCALE=1.0f;\n\n    float[] scaleFloats=new float[]{SCALE,\n            SCALE,\n            SCALE,\n            SCALE,\n            SCALE,};\n\n    @Override\n    public void draw(Canvas canvas, Paint paint) {\n        float translateX=getWidth()/9;\n        float translateY=getHeight()/2;\n        for (int i = 0; i < 4; i++) {\n            canvas.save();\n            canvas.translate((2 + i * 2) * translateX - translateX / 2, translateY);\n            canvas.scale(scaleFloats[i], scaleFloats[i]);\n            RectF rectF=new RectF(-translateX/2,-getHeight()/2.5f,translateX/2,getHeight()/2.5f);\n            canvas.drawRoundRect(rectF,5,5,paint);\n            canvas.restore();\n        }\n    }\n\n    @Override\n    public List<Animator> createAnimation() {\n        List<Animator> animators=new ArrayList<>();\n        long[] durations=new long[]{1260, 430, 1010, 730};\n        long[] delays=new long[]{770, 290, 280, 740};\n        for (int i = 0; i < 4; i++) {\n            final int index=i;\n            ValueAnimator scaleAnim=ValueAnimator.ofFloat(1,0.4f,1);\n            scaleAnim.setDuration(durations[i]);\n            scaleAnim.setRepeatCount(-1);\n            scaleAnim.setStartDelay(delays[i]);\n            scaleAnim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {\n                @Override\n                public void onAnimationUpdate(ValueAnimator animation) {\n                    scaleFloats[index] = (float) animation.getAnimatedValue();\n                    postInvalidate();\n                }\n            });\n            scaleAnim.start();\n            animators.add(scaleAnim);\n        }\n        return animators;\n    }\n\n\n}\n"
  },
  {
    "path": "librarys/xrecyclerview/src/main/java/com/jcodecraeer/xrecyclerview/progressindicator/indicator/LineScalePulseOutIndicator.java",
    "content": "package com.jcodecraeer.xrecyclerview.progressindicator.indicator;\n\nimport android.animation.Animator;\nimport android.animation.ValueAnimator;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\n/**\n * Created by Jack on 2015/10/19.\n */\npublic class LineScalePulseOutIndicator extends LineScaleIndicator {\n\n    @Override\n    public List<Animator> createAnimation() {\n        List<Animator> animators=new ArrayList<>();\n        long[] delays=new long[]{500,250,0,250,500};\n        for (int i = 0; i < 5; i++) {\n            final int index=i;\n            ValueAnimator scaleAnim=ValueAnimator.ofFloat(1,0.3f,1);\n            scaleAnim.setDuration(900);\n            scaleAnim.setRepeatCount(-1);\n            scaleAnim.setStartDelay(delays[i]);\n            scaleAnim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {\n                @Override\n                public void onAnimationUpdate(ValueAnimator animation) {\n                    scaleYFloats[index] = (float) animation.getAnimatedValue();\n                    postInvalidate();\n                }\n            });\n            scaleAnim.start();\n            animators.add(scaleAnim);\n        }\n        return animators;\n    }\n\n}\n"
  },
  {
    "path": "librarys/xrecyclerview/src/main/java/com/jcodecraeer/xrecyclerview/progressindicator/indicator/LineScalePulseOutRapidIndicator.java",
    "content": "package com.jcodecraeer.xrecyclerview.progressindicator.indicator;\n\nimport android.animation.Animator;\nimport android.animation.ValueAnimator;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\n/**\n * Created by Jack on 2015/10/19.\n */\npublic class LineScalePulseOutRapidIndicator extends LineScaleIndicator {\n\n    @Override\n    public List<Animator> createAnimation() {\n        List<Animator> animators=new ArrayList<>();\n        long[] delays=new long[]{400,200,0,200,400};\n        for (int i = 0; i < 5; i++) {\n            final int index=i;\n            ValueAnimator scaleAnim=ValueAnimator.ofFloat(1,0.4f,1);\n            scaleAnim.setDuration(1000);\n            scaleAnim.setRepeatCount(-1);\n            scaleAnim.setStartDelay(delays[i]);\n            scaleAnim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {\n                @Override\n                public void onAnimationUpdate(ValueAnimator animation) {\n                    scaleYFloats[index] = (float) animation.getAnimatedValue();\n                    postInvalidate();\n                }\n            });\n            scaleAnim.start();\n            animators.add(scaleAnim);\n        }\n        return animators;\n    }\n\n}\n"
  },
  {
    "path": "librarys/xrecyclerview/src/main/java/com/jcodecraeer/xrecyclerview/progressindicator/indicator/LineSpinFadeLoaderIndicator.java",
    "content": "package com.jcodecraeer.xrecyclerview.progressindicator.indicator;\n\nimport android.graphics.Canvas;\nimport android.graphics.Paint;\nimport android.graphics.RectF;\n\n/**\n * Created by Jack on 2015/10/24.\n * Email:81813780@qq.com\n */\npublic class LineSpinFadeLoaderIndicator extends BallSpinFadeLoaderIndicator {\n\n\n    @Override\n    public void draw(Canvas canvas, Paint paint) {\n        float radius=getWidth()/10;\n        for (int i = 0; i < 8; i++) {\n            canvas.save();\n            Point point=circleAt(getWidth(),getHeight(),getWidth()/2.5f-radius,i*(Math.PI/4));\n            canvas.translate(point.x, point.y);\n            canvas.scale(scaleFloats[i], scaleFloats[i]);\n            canvas.rotate(i*45);\n            paint.setAlpha(alphas[i]);\n            RectF rectF=new RectF(-radius,-radius/1.5f,1.5f*radius,radius/1.5f);\n            canvas.drawRoundRect(rectF,5,5,paint);\n            canvas.restore();\n        }\n    }\n\n}\n"
  },
  {
    "path": "librarys/xrecyclerview/src/main/java/com/jcodecraeer/xrecyclerview/progressindicator/indicator/PacmanIndicator.java",
    "content": "package com.jcodecraeer.xrecyclerview.progressindicator.indicator;\n\nimport android.animation.Animator;\nimport android.animation.ValueAnimator;\nimport android.graphics.Canvas;\nimport android.graphics.Paint;\nimport android.graphics.RectF;\nimport android.view.animation.LinearInterpolator;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\n/**\n * Created by Jack on 2015/10/16.\n */\npublic class PacmanIndicator extends BaseIndicatorController{\n\n    private float translateX;\n\n    private int alpha;\n\n    private float degrees1,degrees2;\n\n    @Override\n    public void draw(Canvas canvas, Paint paint) {\n        drawPacman(canvas,paint);\n        drawCircle(canvas,paint);\n    }\n\n    private void drawPacman(Canvas canvas,Paint paint){\n        float x=getWidth()/2;\n        float y=getHeight()/2;\n\n        canvas.save();\n\n        canvas.translate(x, y);\n        canvas.rotate(degrees1);\n        paint.setAlpha(255);\n        RectF rectF1=new RectF(-x/1.7f,-y/1.7f,x/1.7f,y/1.7f);\n        canvas.drawArc(rectF1, 0, 270, true, paint);\n\n        canvas.restore();\n\n        canvas.save();\n        canvas.translate(x, y);\n        canvas.rotate(degrees2);\n        paint.setAlpha(255);\n        RectF rectF2=new RectF(-x/1.7f,-y/1.7f,x/1.7f,y/1.7f);\n        canvas.drawArc(rectF2,90,270,true,paint);\n        canvas.restore();\n    }\n\n\n    private void drawCircle(Canvas canvas, Paint paint) {\n        float radius=getWidth()/11;\n        paint.setAlpha(alpha);\n        canvas.drawCircle(translateX, getHeight() / 2, radius, paint);\n    }\n\n    @Override\n    public List<Animator> createAnimation() {\n        List<Animator> animators=new ArrayList<>();\n        float startT=getWidth()/11;\n        ValueAnimator translationAnim=ValueAnimator.ofFloat(getWidth()-startT,getWidth()/2);\n        translationAnim.setDuration(650);\n        translationAnim.setInterpolator(new LinearInterpolator());\n        translationAnim.setRepeatCount(-1);\n        translationAnim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {\n            @Override\n            public void onAnimationUpdate(ValueAnimator animation) {\n                translateX = (float) animation.getAnimatedValue();\n                postInvalidate();\n            }\n        });\n        translationAnim.start();\n\n        ValueAnimator alphaAnim=ValueAnimator.ofInt(255,122);\n        alphaAnim.setDuration(650);\n        alphaAnim.setRepeatCount(-1);\n        alphaAnim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {\n            @Override\n            public void onAnimationUpdate(ValueAnimator animation) {\n                alpha = (int) animation.getAnimatedValue();\n                postInvalidate();\n            }\n        });\n        alphaAnim.start();\n\n        ValueAnimator rotateAnim1=ValueAnimator.ofFloat(0, 45, 0);\n        rotateAnim1.setDuration(650);\n        rotateAnim1.setRepeatCount(-1);\n        rotateAnim1.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {\n            @Override\n            public void onAnimationUpdate(ValueAnimator animation) {\n                degrees1 = (float) animation.getAnimatedValue();\n                postInvalidate();\n            }\n        });\n        rotateAnim1.start();\n\n        ValueAnimator rotateAnim2=ValueAnimator.ofFloat(0,-45,0);\n        rotateAnim2.setDuration(650);\n        rotateAnim2.setRepeatCount(-1);\n        rotateAnim2.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {\n            @Override\n            public void onAnimationUpdate(ValueAnimator animation) {\n                degrees2 = (float) animation.getAnimatedValue();\n                postInvalidate();\n            }\n        });\n        rotateAnim2.start();\n\n        animators.add(translationAnim);\n        animators.add(alphaAnim);\n        animators.add(rotateAnim1);\n        animators.add(rotateAnim2);\n        return animators;\n    }\n}\n"
  },
  {
    "path": "librarys/xrecyclerview/src/main/java/com/jcodecraeer/xrecyclerview/progressindicator/indicator/SemiCircleSpinIndicator.java",
    "content": "package com.jcodecraeer.xrecyclerview.progressindicator.indicator;\n\nimport android.animation.Animator;\nimport android.animation.ObjectAnimator;\nimport android.graphics.Canvas;\nimport android.graphics.Paint;\nimport android.graphics.RectF;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\n/**\n * Created by Jack on 2015/10/20.\n */\npublic class SemiCircleSpinIndicator extends BaseIndicatorController {\n\n\n    @Override\n    public void draw(Canvas canvas, Paint paint) {\n        RectF rectF=new RectF(0,0,getWidth(),getHeight());\n        canvas.drawArc(rectF,-60,120,false,paint);\n    }\n\n    @Override\n    public List<Animator> createAnimation() {\n        List<Animator> animators=new ArrayList<>();\n        ObjectAnimator rotateAnim=ObjectAnimator.ofFloat(getTarget(),\"rotation\",0,180,360);\n        rotateAnim.setDuration(600);\n        rotateAnim.setRepeatCount(-1);\n        rotateAnim.start();\n        animators.add(rotateAnim);\n        return animators;\n    }\n\n\n}\n"
  },
  {
    "path": "librarys/xrecyclerview/src/main/java/com/jcodecraeer/xrecyclerview/progressindicator/indicator/SquareSpinIndicator.java",
    "content": "package com.jcodecraeer.xrecyclerview.progressindicator.indicator;\n\nimport android.animation.Animator;\nimport android.animation.ObjectAnimator;\nimport android.animation.PropertyValuesHolder;\nimport android.graphics.Canvas;\nimport android.graphics.Paint;\nimport android.graphics.RectF;\nimport android.view.animation.LinearInterpolator;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\n/**\n * Created by Jack on 2015/10/16.\n */\npublic class SquareSpinIndicator extends BaseIndicatorController {\n\n    @Override\n    public void draw(Canvas canvas, Paint paint) {\n        canvas.drawRect(new RectF(getWidth()/5,getHeight()/5,getWidth()*4/5,getHeight()*4/5),paint);\n    }\n\n    @Override\n    public List<Animator> createAnimation() {\n        List<Animator> animators=new ArrayList<>();\n        PropertyValuesHolder rotation5=PropertyValuesHolder.ofFloat(\"rotationX\",0,180,180,0,0);\n        PropertyValuesHolder rotation6=PropertyValuesHolder.ofFloat(\"rotationY\",0,0,180,180,0);\n        ObjectAnimator animator=ObjectAnimator.ofPropertyValuesHolder(getTarget(), rotation6,rotation5);\n        animator.setInterpolator(new LinearInterpolator());\n        animator.setRepeatCount(-1);\n        animator.setDuration(2500);\n        animator.start();\n        animators.add(animator);\n        return animators;\n    }\n}\n"
  },
  {
    "path": "librarys/xrecyclerview/src/main/java/com/jcodecraeer/xrecyclerview/progressindicator/indicator/TriangleSkewSpinIndicator.java",
    "content": "package com.jcodecraeer.xrecyclerview.progressindicator.indicator;\n\nimport android.animation.Animator;\nimport android.animation.ObjectAnimator;\nimport android.animation.PropertyValuesHolder;\nimport android.graphics.Canvas;\nimport android.graphics.Paint;\nimport android.graphics.Path;\nimport android.view.animation.LinearInterpolator;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\n/**\n * Created by Jack on 2015/10/20.\n */\npublic class TriangleSkewSpinIndicator extends BaseIndicatorController {\n\n    @Override\n    public void draw(Canvas canvas, Paint paint) {\n        Path path=new Path();\n        path.moveTo(getWidth()/5,getHeight()*4/5);\n        path.lineTo(getWidth()*4/5, getHeight()*4/5);\n        path.lineTo(getWidth()/2,getHeight()/5);\n        path.close();\n        canvas.drawPath(path, paint);\n    }\n\n    @Override\n    public List<Animator> createAnimation() {\n        List<Animator> animators=new ArrayList<>();\n        PropertyValuesHolder rotation5=PropertyValuesHolder.ofFloat(\"rotationX\",0,180,180,0,0);\n        PropertyValuesHolder rotation6=PropertyValuesHolder.ofFloat(\"rotationY\",0,0,180,180,0);\n        \n        ObjectAnimator animator=ObjectAnimator.ofPropertyValuesHolder(getTarget(), rotation6,rotation5);\n        animator.setInterpolator(new LinearInterpolator());\n        animator.setRepeatCount(-1);\n        animator.setDuration(2500);\n        animator.start();\n\n        animators.add(animator);\n        return animators;\n    }\n\n}\n"
  },
  {
    "path": "librarys/xrecyclerview/src/main/res/drawable/progressloading.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<animated-rotate android:drawable=\"@drawable/ic_loading_rotate\" android:pivotX=\"50.0%\" android:pivotY=\"50.0%\"\n  xmlns:android=\"http://schemas.android.com/apk/res/android\" />"
  },
  {
    "path": "librarys/xrecyclerview/src/main/res/drawable-hdpi/progressbar.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<animation-list android:oneshot=\"false\"\n  xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <item android:duration=\"100\" android:drawable=\"@drawable/loading_01\" />\n    <item android:duration=\"100\" android:drawable=\"@drawable/loading_02\" />\n    <item android:duration=\"100\" android:drawable=\"@drawable/loading_03\" />\n    <item android:duration=\"100\" android:drawable=\"@drawable/loading_04\" />\n    <item android:duration=\"100\" android:drawable=\"@drawable/loading_05\" />\n    <item android:duration=\"100\" android:drawable=\"@drawable/loading_06\" />\n    <item android:duration=\"100\" android:drawable=\"@drawable/loading_07\" />\n    <item android:duration=\"100\" android:drawable=\"@drawable/loading_08\" />\n    <item android:duration=\"100\" android:drawable=\"@drawable/loading_09\" />\n    <item android:duration=\"100\" android:drawable=\"@drawable/loading_10\" />\n    <item android:duration=\"100\" android:drawable=\"@drawable/loading_11\" />\n    <item android:duration=\"100\" android:drawable=\"@drawable/loading_12\" />\n</animation-list>"
  },
  {
    "path": "librarys/xrecyclerview/src/main/res/layout/listview_footer.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:orientation=\"horizontal\"\n    android:layout_width=\"fill_parent\"\n\tandroid:layout_height=\"wrap_content\"\n    android:gravity=\"center\"\n    android:padding=\"3dp\">\n    <ProgressBar\n        android:id=\"@+id/listview_foot_progress\"\n        android:layout_width=\"30dip\"\n        android:layout_height=\"30dip\"\n    />\t\t\n    <TextView\n    \tandroid:id=\"@+id/listview_foot_more\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:gravity=\"center\"\n        android:padding=\"5dp\"\n        android:text=\"加载中...\"/>\n    \n</LinearLayout>"
  },
  {
    "path": "librarys/xrecyclerview/src/main/res/layout/listview_header.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:layout_width=\"fill_parent\"\n    android:layout_height=\"wrap_content\"\n    android:gravity=\"bottom\" >\n\n    <RelativeLayout\n        android:id=\"@+id/listview_header_content\"\n        android:layout_width=\"fill_parent\"\n        android:layout_height=\"80dp\"\n        android:paddingTop=\"10dip\"\n        >\n\n        <LinearLayout\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:minWidth=\"100dip\"\n            android:layout_centerInParent=\"true\"\n            android:gravity=\"center\"\n            android:orientation=\"vertical\"\n            android:id=\"@+id/listview_header_text\">\n\n            <TextView\n                android:id=\"@+id/refresh_status_textview\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:text=\"@string/listview_header_hint_normal\" />\n\n            <LinearLayout\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:visibility=\"gone\"\n                android:layout_marginTop=\"3dp\" >\n\n                <TextView\n                    android:layout_width=\"wrap_content\"\n                    android:layout_height=\"wrap_content\"\n                    android:text=\"@string/listview_header_last_time\"\n                    android:textSize=\"12sp\" />\n\n                <TextView\n                    android:id=\"@+id/last_refresh_time\"\n                    android:layout_width=\"wrap_content\"\n                    android:layout_height=\"wrap_content\"\n                    android:textSize=\"12sp\" />\n            </LinearLayout>\n        </LinearLayout>\n\n        <ImageView\n            android:id=\"@+id/listview_header_arrow\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_centerVertical=\"true\"\n            android:layout_marginLeft=\"35dp\"\n            android:layout_marginRight=\"10dp\"\n            android:layout_toLeftOf=\"@+id/listview_header_text\"\n            android:src=\"@drawable/ic_pulltorefresh_arrow\" />\n\n        <com.jcodecraeer.xrecyclerview.SimpleViewSwitcher\n            android:id=\"@+id/listview_header_progressbar\"\n            android:layout_width=\"30dip\"\n            android:layout_height=\"30dip\"\n            android:layout_toLeftOf=\"@+id/listview_header_text\"\n            android:layout_centerVertical=\"true\"\n            android:layout_marginLeft=\"40dp\"\n            android:layout_marginRight=\"10dp\"\n            android:visibility=\"invisible\" />\n    </RelativeLayout>\n\n</LinearLayout>"
  },
  {
    "path": "librarys/xrecyclerview/src/main/res/layout/pull_to_refresh_head.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>  \n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"  \n    android:layout_width=\"fill_parent\"  \n    android:layout_height=\"fill_parent\" \n    android:orientation=\"vertical\">  \n  \n    <RelativeLayout\n        android:id=\"@+id/head_contentLayout\"  \n        android:layout_width=\"fill_parent\"  \n        android:layout_height=\"fill_parent\" \n        android:paddingTop=\"10dip\"\n    \tandroid:paddingBottom=\"15dip\">  \n  \n        <FrameLayout  \n            android:layout_width=\"wrap_content\"  \n            android:layout_height=\"fill_parent\"  \n            android:layout_alignParentLeft=\"true\"  \n            android:layout_centerVertical=\"true\"\n        \tandroid:layout_marginLeft=\"30dip\"\n        \tandroid:layout_marginRight=\"20dip\">  \n\n            <ImageView  \n                android:id=\"@+id/head_arrowImageView\"  \n                android:layout_width=\"wrap_content\"  \n                android:layout_height=\"wrap_content\"  \n                android:layout_gravity=\"center\"  \n                android:src=\"@drawable/ic_pulltorefresh_arrow\" />  \n  \n        </FrameLayout> \n  \n        <FrameLayout  \n            android:layout_width=\"wrap_content\"  \n            android:layout_height=\"fill_parent\"  \n            android:layout_alignParentLeft=\"true\"  \n            android:layout_centerVertical=\"true\"\n        \tandroid:layout_marginLeft=\"100dip\"\n        \tandroid:layout_marginRight=\"10dip\">  \n\t          <ImageView\n\t             android:id=\"@+id/head_progressBar\"\n\t\t\t     android:layout_width=\"wrap_content\" \n\t\t\t     android:layout_height=\"wrap_content\"\n\t\t\t     android:src=\"@drawable/progressbar\"\n\t\t\t     android:visibility=\"gone\"\n\t\t\t  />\n  \n        </FrameLayout>\n  \n        <LinearLayout  \n            android:layout_width=\"wrap_content\"  \n            android:layout_height=\"wrap_content\"  \n            android:layout_centerInParent=\"true\"\n            android:gravity=\"center_horizontal\"  \n            android:orientation=\"vertical\">  \n  \n            <TextView  \n                android:id=\"@+id/head_tipsTextView\"  \n                android:layout_width=\"wrap_content\"  \n                android:layout_height=\"wrap_content\"  \n                android:text=\"@string/listview_header_hint_normal\"  \n                android:textColor=\"#000000\"/>  \n  \n            <TextView  \n                android:id=\"@+id/head_lastUpdatedTextView\"  \n                android:layout_width=\"wrap_content\"  \n                android:layout_height=\"wrap_content\" \n                android:textColor=\"#000000\"  \n                android:textSize=\"10sp\" />  \n              \n        </LinearLayout>  \n    </RelativeLayout>  \n  \n  \n</LinearLayout> \n"
  },
  {
    "path": "librarys/xrecyclerview/src/main/res/values/attrs.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n\n    <declare-styleable name=\"AVLoadingIndicatorView\">\n        <attr name=\"indicator\">\n            <flag name=\"BallPulse\" value=\"0\"/>\n            <flag name=\"BallGridPulse\" value=\"1\"/>\n            <flag name=\"BallClipRotate\" value=\"2\"/>\n            <flag name=\"BallClipRotatePulse\" value=\"3\"/>\n            <flag name=\"SquareSpin\" value=\"4\"/>\n            <flag name=\"BallClipRotateMultiple\" value=\"5\"/>\n            <flag name=\"BallPulseRise\" value=\"6\"/>\n            <flag name=\"BallRotate\" value=\"7\"/>\n            <flag name=\"CubeTransition\" value=\"8\"/>\n            <flag name=\"BallZigZag\" value=\"9\"/>\n            <flag name=\"BallZigZagDeflect\" value=\"10\"/>\n            <flag name=\"BallTrianglePath\" value=\"11\"/>\n            <flag name=\"BallScale\" value=\"12\"/>\n            <flag name=\"LineScale\" value=\"13\"/>\n            <flag name=\"LineScaleParty\" value=\"14\"/>\n            <flag name=\"BallScaleMultiple\" value=\"15\"/>\n            <flag name=\"BallPulseSync\" value=\"16\"/>\n            <flag name=\"BallBeat\" value=\"17\"/>\n            <flag name=\"LineScalePulseOut\" value=\"18\"/>\n            <flag name=\"LineScalePulseOutRapid\" value=\"19\"/>\n            <flag name=\"BallScaleRipple\" value=\"20\"/>\n            <flag name=\"BallScaleRippleMultiple\" value=\"21\"/>\n            <flag name=\"BallSpinFadeLoader\" value=\"22\"/>\n            <flag name=\"LineSpinFadeLoader\" value=\"23\"/>\n            <flag name=\"TriangleSkewSpin\" value=\"24\"/>\n            <flag name=\"Pacman\" value=\"25\"/>\n            <flag name=\"BallGridBeat\" value=\"26\"/>\n            <flag name=\"SemiCircleSpin\" value=\"27\"/>\n        </attr>\n        <attr name=\"indicator_color\" format=\"color\"/>\n    </declare-styleable>\n\n</resources>"
  },
  {
    "path": "librarys/xrecyclerview/src/main/res/values/dimens.xml",
    "content": "<resources>\n    <!-- Default screen margins, per the Android Design guidelines. -->\n    <dimen name=\"textandiconmargin\">10dp</dimen>\n</resources>\n"
  },
  {
    "path": "librarys/xrecyclerview/src/main/res/values/strings.xml",
    "content": "<resources>\n    <string name=\"listview_header_hint_normal\">pull to refresh</string>\n    <string name=\"listview_header_hint_release\">release to start refresh</string>\n    <string name=\"listview_loading\">loading...</string>\n    <string name=\"nomore_loading\">no more to be loaded</string>\n    <string name=\"refreshing\">refreshing...</string>\n    <string name=\"refresh_done\">refresh done</string>\n    <string name=\"loading_done\">loading done</string>\n    <string name=\"listview_header_last_time\">last update：</string>\n</resources>\n"
  },
  {
    "path": "librarys/xrecyclerview/src/main/res/values-zh/strings.xml",
    "content": "<resources>\n    <string name=\"listview_header_hint_normal\">下拉刷新</string>\n    <string name=\"listview_header_hint_release\">释放立即刷新</string>\n    <string name=\"listview_loading\">正在加载...</string>\n    <string name=\"nomore_loading\">没有了</string>\n    <string name=\"refreshing\">正在刷新...</string>\n    <string name=\"refresh_done\">刷新完成</string>\n    <string name=\"loading_done\">加载完成</string>\n    <string name=\"listview_header_last_time\">上次更新时间：</string>\n</resources>\n"
  },
  {
    "path": "librarys/zmenu/.gitignore",
    "content": "/build\n"
  },
  {
    "path": "librarys/zmenu/build.gradle",
    "content": "apply plugin: 'com.android.library'\n\nandroid {\n    compileSdkVersion 26\n    buildToolsVersion '26.0.2'\n\n    defaultConfig {\n        minSdkVersion 15\n        targetSdkVersion 26\n        versionCode 1\n        versionName \"1.0\"\n\n        testInstrumentationRunner \"android.support.test.runner.AndroidJUnitRunner\"\n\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:26.1.0'\n    compile 'com.android.support:design:26.1.0'\n    compile 'com.facebook.rebound:rebound:0.3.8'\n    testCompile 'junit:junit:4.12'\n}\n"
  },
  {
    "path": "librarys/zmenu/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 G:\\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": "librarys/zmenu/src/androidTest/java/com/example/zmenu/ExampleInstrumentedTest.java",
    "content": "package com.example.zmenu;\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.example.zmenu.test\", appContext.getPackageName());\n    }\n}\n"
  },
  {
    "path": "librarys/zmenu/src/main/AndroidManifest.xml",
    "content": "<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n\n    package=\"com.example.zmenu\">\n\n    <application android:allowBackup=\"true\" android:label=\"@string/app_name\"\n        android:supportsRtl=\"true\">\n\n    </application>\n\n</manifest>\n"
  },
  {
    "path": "librarys/zmenu/src/main/java/com/example/zmenu/FloatButton.java",
    "content": "package com.example.zmenu;\n\nimport android.content.Context;\nimport android.support.design.widget.FloatingActionButton;\nimport android.util.AttributeSet;\n\nimport com.facebook.rebound.SimpleSpringListener;\nimport com.facebook.rebound.Spring;\nimport com.facebook.rebound.SpringSystem;\n\n/**\n * Created by xmuSistone.\n */\npublic class FloatButton extends FloatingActionButton {\n    private Spring springX, springY;\n    private SimpleSpringListener followerListenerX, followerListenerY; // 此为跟踪的回调，当前面一个view移动的时候，此为后面的view，需要更新endValue\n\n    public FloatButton(Context context) {\n        this(context, null);\n    }\n\n    public FloatButton(Context context, AttributeSet attrs) {\n        this(context, attrs, 0);\n    }\n\n    public FloatButton(Context context, AttributeSet attrs, int defStyleAttr) {\n        super(context, attrs, defStyleAttr);\n\n        SpringSystem mSpringSystem = SpringSystem.create();\n        springX = mSpringSystem.createSpring();\n        springY = mSpringSystem.createSpring();\n\n        springX.addListener(new SimpleSpringListener() {\n            @Override\n            public void onSpringUpdate(Spring spring) {\n                int xPos = (int) spring.getCurrentValue();\n                setScreenX(xPos);\n            }\n        });\n\n        springY.addListener(new SimpleSpringListener() {\n            @Override\n            public void onSpringUpdate(Spring spring) {\n                int yPos = (int) spring.getCurrentValue();\n                setScreenY(yPos);\n            }\n        });\n\n        followerListenerX = new SimpleSpringListener() {\n            @Override\n            public void onSpringUpdate(Spring spring) {\n                int xPos = (int) spring.getCurrentValue();\n                springX.setEndValue(xPos);\n            }\n        };\n\n        followerListenerY = new SimpleSpringListener() {\n            @Override\n            public void onSpringUpdate(Spring spring) {\n                int yPos = (int) spring.getCurrentValue();\n                springY.setEndValue(yPos);\n            }\n        };\n    }\n\n    private void setScreenX(int screenX) {\n\n        this.offsetLeftAndRight(screenX - getLeft());\n    }\n\n    private void setScreenY(int screenY) {\n        this.offsetTopAndBottom(screenY - getTop());\n    }\n\n    /**\n     * 顶部ImageView强行停止动画\n     */\n    public void stopAnimation() {\n        springX.setAtRest();\n        springY.setAtRest();\n    }\n\n    /**\n     * 只为最顶部的view调用，触点松开后，回归原点\n     * @param xPos\n     * @param yPos\n     */\n    public void onRelease(int xPos, int yPos) {\n        setCurrentSpringPos(getLeft(), getTop());\n        setEndValue(xPos, yPos);\n    }\n\n    /**\n     * 设置当前spring位置\n     */\n    public void setCurrentSpringPos(int xPos, int yPos) {\n        springX.setCurrentValue(xPos);\n        springY.setCurrentValue(yPos);\n    }\n\n    public Spring getSpringX() {\n        return springX;\n    }\n\n    public Spring getSpringY() {\n        return springY;\n    }\n\n    public SimpleSpringListener getFollowerListenerX() {\n        return followerListenerX;\n    }\n\n    public SimpleSpringListener getFollowerListenerY() {\n        return followerListenerY;\n    }\n\n    public void setEndValue(int x, int y) {\n        springX.setEndValue(x);\n        springY.setEndValue(y);\n    }\n\n    //设置阴影为0\n\n    @Override\n    public void setElevation(float elevation) {\n        super.setElevation(0);\n    }\n}\n"
  },
  {
    "path": "librarys/zmenu/src/main/java/com/example/zmenu/PUtils.java",
    "content": "package com.example.zmenu;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\n/**\n * Created by Administrator on 2017/12/1 0001.\n */\n\npublic class PUtils {\n\n    private List<Integer> imageList;\n    private List<Integer> colorList;\n    private List<FloatButton> viewList;\n    private int marginRight, marginBottom;\n    private boolean isVisible;\n    private static volatile PUtils instance;\n\n    public static PUtils getInstance() {\n        if (instance == null) {\n            synchronized (PUtils.class) {\n                if (instance == null) {\n                    instance = new PUtils();\n                }\n            }\n        }\n\n        return instance;\n    }\n\n    public  void setImagesAndColors(List<Integer> imagelist , List<Integer> colorlist) {\n        instance.imageList = imagelist;\n        instance.colorList = colorlist;\n    }\n\n    public void setMargin(int marginRight, int marginBottom) {\n        instance.marginRight = marginRight;\n        instance.marginBottom = marginBottom;\n    }\n\n    public void setVisible(boolean isVisible) {\n        getInstance().isVisible = isVisible;\n    }\n\n    public boolean getVisible() {\n        return getInstance().isVisible;\n    }\n    public static List<Integer> getImages() {\n        return getInstance().imageList;\n    }\n\n    public static List<Integer> getColors() {\n        return getInstance().colorList;\n    }\n\n    public int getMarginRight() {\n        return getInstance().marginRight;\n    }\n\n    public int getMarginBottom(){\n        return getInstance().marginBottom;\n    }\n\n    public void setViewList(List<FloatButton> viewList) {\n        instance.viewList = viewList;\n    }\n\n    public List<FloatButton> getViewList() {\n        return getInstance().viewList;\n    }\n}\n"
  },
  {
    "path": "librarys/zmenu/src/main/java/com/example/zmenu/SnakeButtonLayout.java",
    "content": "package com.example.zmenu;\n\nimport android.content.Context;\nimport android.os.Build;\nimport android.support.v4.view.ViewCompat;\nimport android.support.v4.widget.ViewDragHelper;\nimport android.util.AttributeSet;\nimport android.util.Log;\nimport android.view.MotionEvent;\nimport android.view.View;\nimport android.view.ViewGroup;\nimport android.widget.RelativeLayout;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\n\npublic class SnakeButtonLayout extends RelativeLayout {\n    private List<Integer> imageList;\n    private List<Integer> colorList;\n    private List<FloatButton> viewList = new ArrayList<>();\n    public ViewDragHelper mDragHelper;\n    public ViewController controller;\n    public FloatButton topView;\n    public FloatButton topFollowView;\n    public int marginRight = 0, marginBottom = 0;\n    public onTopViewClickListener onTopViewClickListener;\n    public long upTime = 0, downTime = 0;\n    public boolean isClickable = false;\n    public boolean isVisible = false;\n    public interface onTopViewClickListener {\n         void onclick();\n    }\n    public SnakeButtonLayout(Context context) {\n        super(context, null);\n    }\n\n    public SnakeButtonLayout(Context context, AttributeSet attrs) {\n        super(context, attrs);\n        marginRight = PUtils.getInstance().getMarginRight();\n        marginBottom = PUtils.getInstance().getMarginBottom();\n        isVisible = PUtils.getInstance().getVisible();\n        mDragHelper = ViewDragHelper.create(this, 10f, new MyViewDragCallBack());\n        controller = ViewController.getInstance();\n    }\n\n    @Override\n    protected void onFinishInflate() {\n        super.onFinishInflate();\n        initImagesAndColors();\n        int len = imageList.size();\n        for (int i = 0; i < len; i++) {\n            FloatButton floatButton = new FloatButton(getContext());\n            floatButton.setImageResource(imageList.get(i));\n            floatButton.setBackgroundTintList(getResources().getColorStateList(colorList.get(i)));\n\n            if (!isVisible) {\n                floatButton.hide();\n            }\n            //添加到主布局中去\n            LayoutParams lp = new LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);\n            lp.setMargins(0, 0, marginRight, marginBottom);\n            lp.addRule(ALIGN_PARENT_BOTTOM);\n            lp.addRule(ALIGN_PARENT_RIGHT);\n            viewList.add(floatButton);\n            Log.d(\"rules\", \"restore\");\n            addView(floatButton, lp);\n\n            //获取顶部的view\n            if (i == len - 1) {\n                topView = floatButton;\n            }\n            if (i == len - 2) {\n                topFollowView = floatButton;\n            }\n        }\n        PUtils.getInstance().setViewList(viewList);\n        controller.init(viewList);\n    }\n\n    public void initImagesAndColors() {\n        this.imageList = new ArrayList<>();\n        this.colorList = new ArrayList<>();\n        if (PUtils.getImages() != null) {\n            this.imageList = PUtils.getImages();\n        } else {\n            this.imageList.add(R.drawable.image1);\n            this.imageList.add(R.drawable.image2);\n        }\n        if (PUtils.getColors() != null) {\n            this.colorList = PUtils.getColors();\n        } else {\n            this.colorList.add(R.color.background1);\n            this.colorList.add(R.color.background2);\n        }\n\n    }\n\n    public class MyViewDragCallBack extends ViewDragHelper.Callback {\n\n        //捕捉topview\n        @Override\n        public boolean tryCaptureView(View child, int pointerId) {\n            downTime = System.currentTimeMillis();\n            Log.d(\"catchview\", \"1\");\n            if (child == topView) {\n                topView.stopAnimation();\n                return true;\n            }\n            return false;\n        }\n\n        @Override\n        public void onViewPositionChanged(View changedView, int left, int top, int dx, int dy) {\n\n            topFollowView.setEndValue(left, top);\n        }\n\n        @Override\n        public int clampViewPositionVertical(View child, int top, int dy) {\n            return top;\n        }\n\n        @Override\n        public int clampViewPositionHorizontal(View child, int left, int dx) {\n            return left;\n        }\n\n        @Override\n        public void onViewReleased(View releasedChild, float xvel, float yvel) {\n            upTime = System.currentTimeMillis();\n            //拖拽 < 250ms 触发点击事件\n            if ((upTime - downTime) < 250L && isClickable == true) {\n                onTopViewClickListener.onclick();\n            }\n\n            controller.onRelease(topView);\n        }\n\n        @Override\n        public int getViewHorizontalDragRange(View child)\n        {\n            return getMeasuredWidth()-child.getMeasuredWidth();\n        }\n\n        @Override\n        public int getViewVerticalDragRange(View child)\n        {\n            return getMeasuredHeight()-child.getMeasuredHeight();\n        }\n    }\n\n    //设置是否可点击\n    public void setClickable(boolean isClickable) {\n        this.isClickable = isClickable;\n    }\n\n    /*实时刷新\n    保持平滑状态\n     */\n    @Override\n    public void computeScroll() {\n        if (mDragHelper.continueSettling(true)) {\n            ViewCompat.postInvalidateOnAnimation(this);\n        }\n    }\n\n    @Override\n    public boolean onInterceptTouchEvent(MotionEvent ev) {\n        return mDragHelper.shouldInterceptTouchEvent(ev);\n    }\n\n    @Override\n    public boolean onTouchEvent(MotionEvent event) {\n\n        try {\n            mDragHelper.processTouchEvent(event);\n        } catch (Exception exception) {\n            exception.printStackTrace();\n        }\n\n        if ( event.getX() > topView.getLeft() && event.getX() < topView.getRight()\n                && event.getY() > topView.getTop() && event.getY() < topView.getBottom() ) {\n            return true;\n        }\n        return false;\n    }\n\n\n    public void setOnTopViewClickListener(onTopViewClickListener listener) {\n        this.onTopViewClickListener = listener;\n    }\n\n    /*@Override\n    public boolean dispatchTouchEvent(MotionEvent ev) {\n        if (ev.getAction() == MotionEvent.ACTION_DOWN) {\n            mDragHelper.abort();\n        }\n        return super.dispatchTouchEvent(ev);\n    }*/\n\n    @Override\n    protected void onLayout(boolean changed, int l, int t, int r, int b) {\n        super.onLayout(changed, l, t, r, b);\n        controller.setOriginPos(topView.getLeft(), topView.getTop());\n    }\n}\n"
  },
  {
    "path": "librarys/zmenu/src/main/java/com/example/zmenu/ViewController.java",
    "content": "package com.example.zmenu;\n\nimport android.util.Log;\n\nimport java.util.List;\n\n/**\n * Created by Administrator on 2017/12/2 0002.\n */\n\npublic class ViewController {\n\n    public int resetPosX,resetPosY;\n    public List<FloatButton> imageViewList;\n    public ViewController() {\n\n    }\n\n    public static ViewController getInstance() {\n        return new ViewController();\n    }\n    public void init(List<FloatButton> list) {\n        Log.d(\"text1\", \"11\");\n        imageViewList = list;\n        for (int i = 1; i < list.size(); i++) {\n            Log.d(\"text1\", \"12\");\n            FloatButton view1 = list.get(i - 1);\n            FloatButton view2 = list.get(i);\n            view2.getSpringX().addListener(view1.getFollowerListenerX());\n            view2.getSpringY().addListener(view1.getFollowerListenerY());\n        }\n    }\n\n    /**\n     * 设置view最初的原始位置\n     */\n    public void setOriginPos(int xPos, int yPos) {\n        resetPosX = xPos;\n        resetPosY = yPos;\n\n        int len = imageViewList.size();\n        for (int i = 0; i < len; i++) {\n            imageViewList.get(i).setCurrentSpringPos(xPos, yPos);\n        }\n    }\n\n    public void onRelease(FloatButton topView) {\n        topView.onRelease(resetPosX, resetPosY);\n    }\n\n}\n"
  },
  {
    "path": "librarys/zmenu/src/main/res/values/colors.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <color name=\"background1\">#1c574c</color>\n    <color name=\"background2\">#00d21c</color>\n\n</resources>"
  },
  {
    "path": "librarys/zmenu/src/main/res/values/strings.xml",
    "content": "<resources>\n    <string name=\"app_name\">zmenu</string>\n</resources>\n"
  },
  {
    "path": "librarys/zmenu/src/test/java/com/example/zmenu/ExampleUnitTest.java",
    "content": "package com.example.zmenu;\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 ':app', ':librarys:http', ':librarys:jiaozivideoplayer', ':librarys:xrecyclerview', ':librarys:zmenu'\n"
  }
]