[
  {
    "path": ".gitignore",
    "content": "*.iml\n.gradle\n/local.properties\n/.idea/workspace.xml\n/.idea/libraries\n.DS_Store\n/build\n/captures\n.externalNativeBuild\n"
  },
  {
    "path": ".idea/compiler.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"CompilerConfiguration\">\n    <resourceExtensions />\n    <wildcardResourcePatterns>\n      <entry name=\"!?*.java\" />\n      <entry name=\"!?*.form\" />\n      <entry name=\"!?*.class\" />\n      <entry name=\"!?*.groovy\" />\n      <entry name=\"!?*.scala\" />\n      <entry name=\"!?*.flex\" />\n      <entry name=\"!?*.kt\" />\n      <entry name=\"!?*.clj\" />\n      <entry name=\"!?*.aj\" />\n    </wildcardResourcePatterns>\n    <annotationProcessing>\n      <profile default=\"true\" name=\"Default\" enabled=\"false\">\n        <processorPath useClasspath=\"true\" />\n      </profile>\n    </annotationProcessing>\n  </component>\n</project>"
  },
  {
    "path": ".idea/copyright/profiles_settings.xml",
    "content": "<component name=\"CopyrightManager\">\n  <settings default=\"\" />\n</component>"
  },
  {
    "path": ".idea/encodings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"Encoding\">\n    <file url=\"PROJECT\" charset=\"UTF-8\" />\n  </component>\n</project>"
  },
  {
    "path": ".idea/gradle.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"GradleSettings\">\n    <option name=\"linkedExternalProjectsSettings\">\n      <GradleProjectSettings>\n        <option name=\"distributionType\" value=\"DEFAULT_WRAPPED\" />\n        <option name=\"externalProjectPath\" value=\"$PROJECT_DIR$\" />\n        <option name=\"modules\">\n          <set>\n            <option value=\"$PROJECT_DIR$\" />\n            <option value=\"$PROJECT_DIR$/app\" />\n          </set>\n        </option>\n        <option name=\"resolveModulePerSourceSet\" value=\"false\" />\n      </GradleProjectSettings>\n    </option>\n  </component>\n</project>"
  },
  {
    "path": ".idea/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</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$/WanAndroid.iml\" filepath=\"$PROJECT_DIR$/WanAndroid.iml\" />\n      <module fileurl=\"file://$PROJECT_DIR$/app/app.iml\" filepath=\"$PROJECT_DIR$/app/app.iml\" />\n    </modules>\n  </component>\n</project>"
  },
  {
    "path": ".idea/runConfigurations.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"RunConfigurationProducerService\">\n    <option name=\"ignoredProducers\">\n      <set>\n        <option value=\"org.jetbrains.plugins.gradle.execution.test.runner.AllInPackageGradleConfigurationProducer\" />\n        <option value=\"org.jetbrains.plugins.gradle.execution.test.runner.TestClassGradleConfigurationProducer\" />\n        <option value=\"org.jetbrains.plugins.gradle.execution.test.runner.TestMethodGradleConfigurationProducer\" />\n      </set>\n    </option>\n  </component>\n</project>"
  },
  {
    "path": ".idea/vcs.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"VcsDirectoryMappings\">\n    <mapping directory=\"$PROJECT_DIR$\" vcs=\"Git\" />\n  </component>\n</project>"
  },
  {
    "path": "README.md",
    "content": "#WanAndroid\r\nTry to build a www.wanandroid.com client\r\n\r\n# APK\r\n[app-release.apk](https://coding.net/u/salecoding/p/WanAndroid/git/raw/master/app/release/app-release.apk)\r\n\r\n# 接口\r\n[玩Android接口](http://www.wanandroid.com/blog/show/2)\r\n\r\n# 代码结构\r\n### MVP + RxJava + Retrofit2 + Dagger2 + Glide\r\n* [RxJava2](https://github.com/ReactiveX/RxJava)\r\n* [Dagger2](https://github.com/google/dagger)\r\n* [Retrofit2](https://github.com/square/retrofit)\r\n* [鸿神的Flowlayout](https://github.com/hongyangAndroid/FlowLayout)\r\n* [BRVAH](https://github.com/CymChad/BaseRecyclerViewAdapterHelper)\r\n* [Agentweb](https://github.com/Justson/AgentWeb)\r\n* [Glide](https://github.com/bumptech/glide)\r\n\r\n# 项目运行截图\r\n<img src=\"screenshots/Screenshot_2018-02-23-14-00-13-312_com.will.weiyu.png\" width=\"300px\"/>\r\n<img src=\"screenshots/Screenshot_2018-02-23-14-00-20-507_com.will.weiyu.png\" width=\"300px\"/>\r\n<img src=\"screenshots/Screenshot_2018-02-23-14-00-24-498_com.will.weiyu.png\" width=\"300px\"/>\r\n<img src=\"screenshots/Screenshot_2018-02-23-14-00-32-235_com.will.weiyu.png\" width=\"300px\"/>\r\n<img src=\"screenshots/Screenshot_2018-02-23-14-00-42-897_com.will.weiyu.png\" width=\"300px\"/>\r\n<img src=\"screenshots/Screenshot_2018-02-23-14-00-51-177_com.will.weiyu.png\" width=\"300px\"/>\r\n<img src=\"screenshots/Screenshot_2018-02-23-14-01-29-488_com.will.weiyu.png\" width=\"300px\"/>\r\n<img src=\"screenshots/Screenshot_2018-02-23-14-01-46-958_com.will.weiyu.png\" width=\"300px\"/>\r\n<img src=\"screenshots/Screenshot_2018-02-23-14-01-52-929_com.will.weiyu.png\" width=\"300px\"/>\r\n<img src=\"screenshots/Screenshot_2018-02-23-14-01-57-654_com.will.weiyu.png\" width=\"300px\"/>\r\n<img src=\"screenshots/Screenshot_2018-02-23-14-02-15-107_com.will.weiyu.png\" width=\"300px\"/>\r\n<img src=\"screenshots/Screenshot_2018-02-23-14-02-27-830_com.will.weiyu.png\" width=\"300px\"/>\r\n\r\n# 参考项目\r\nWanAndroidClient https://github.com/wangzailfm/WanAndroidClient\r\n\r\n微阅 https://github.com/Will-Ls/WeiYue\r\n\r\n非常感谢以上开源项目的作者！谢谢！\r\n\r\n[Github](https://github.com/salecoding) \r\n"
  },
  {
    "path": "app/.gitignore",
    "content": "/build\n"
  },
  {
    "path": "app/build.gradle",
    "content": "apply plugin: 'com.android.application'\n\nandroid {\n    signingConfigs {\n        config {\n            keyAlias RELEASE_KEY_ALIAS\n            keyPassword RELEASE_KEY_PASSWORD\n            storeFile file(RELEASE_STORE_FILE)\n            storePassword RELEASE_STORE_PASSWORD\n        }\n    }\n    compileSdkVersion rootProject.ext.android.compileSdkVersion\n    buildToolsVersion rootProject.ext.android.buildToolsVersion\n\n    defaultConfig {\n        applicationId rootProject.ext.android.applicationId\n        minSdkVersion rootProject.ext.android.minSdkVersion\n        targetSdkVersion rootProject.ext.android.targetSdkVersion\n        versionCode rootProject.ext.android.versionCode\n        versionName rootProject.ext.android.versionName\n        testInstrumentationRunner \"android.support.test.runner.AndroidJUnitRunner\"\n        javaCompileOptions {\n            annotationProcessorOptions {\n                arguments = [moduleName: project.getName()]\n            }\n        }\n        multiDexEnabled true\n    }\n\n    buildTypes {\n        release {\n            minifyEnabled false\n            signingConfig signingConfigs.config\n            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'\n        }\n        debug {\n            buildConfigField \"boolean\", \"LOG_DEBUG\", \"true\"\n            minifyEnabled false\n            signingConfig signingConfigs.config\n            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'\n        }\n    }\n\n    buildToolsVersion '26.0.2'\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 rootProject.ext.dependencies[\"appcompat-v7\"]\n    compile rootProject.ext.dependencies[\"support-v4\"]\n    compile rootProject.ext.dependencies[\"cardview\"]\n    compile rootProject.ext.dependencies[\"design\"]\n    compile rootProject.ext.dependencies[\"recyclerview\"]\n    compile rootProject.ext.dependencies[\"preference\"]\n    compile rootProject.ext.dependencies[\"retrofit2\"]\n    compile rootProject.ext.dependencies[\"converter-scalars\"]\n    compile rootProject.ext.dependencies[\"converter-gson\"]\n    compile rootProject.ext.dependencies[\"adapter-rxjava2\"]\n    compile rootProject.ext.dependencies[\"rxlifecycle2\"]\n    compile rootProject.ext.dependencies[\"rxlifecomponents\"]\n    compile rootProject.ext.dependencies[\"dagger\"]\n    annotationProcessor rootProject.ext.dependencies[\"dagger-compiler\"]\n\n    compile rootProject.ext.dependencies[\"rxjava\"]\n    compile rootProject.ext.dependencies[\"rxandroid\"]\n    compile rootProject.ext.dependencies[\"rxbinding2\"]\n    compile rootProject.ext.dependencies[\"constraint-layout\"]\n    compile rootProject.ext.dependencies[\"butterknife\"]\n    annotationProcessor rootProject.ext.dependencies[\"butterknife-compiler\"]\n    compile rootProject.ext.dependencies[\"BaseAdapterHelper\"]\n    compile rootProject.ext.dependencies[\"glide\"]\n    compile rootProject.ext.dependencies[\"banner\"]\n    compile rootProject.ext.dependencies[\"circleimageview\"]\n    compile rootProject.ext.dependencies[\"utilcode\"]\n    compile rootProject.ext.dependencies[\"agentweb\"]\n    compile rootProject.ext.dependencies[\"flowlayout\"]\n    compile rootProject.ext.dependencies[\"fragmentation\"]\n    compile rootProject.ext.dependencies[\"arouter-api\"]\n    annotationProcessor rootProject.ext.dependencies[\"arouter-compiler\"]\n\n    annotationProcessor rootProject.ext.dependencies[\"dbflow-processor\"]\n    compile rootProject.ext.dependencies[\"dbflow-core\"]\n    compile rootProject.ext.dependencies[\"dbflow\"]\n    compile rootProject.ext.dependencies[\"dbflow-sqlcipher\"]\n    testCompile 'junit:junit:4.12'\n}\nrepositories {\n    mavenCentral()\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 D:\\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/release/output.json",
    "content": "[{\"outputType\":{\"type\":\"APK\"},\"apkInfo\":{\"type\":\"MAIN\",\"splits\":[],\"versionCode\":1},\"path\":\"app-release.apk\",\"properties\":{\"packageId\":\"com.will.weiyue\",\"split\":\"\",\"minSdkVersion\":\"19\"}}]"
  },
  {
    "path": "app/src/androidTest/java/com/lw/wanandroid/ExampleInstrumentedTest.java",
    "content": "package com.lw.wanandroid;\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.assertEquals;\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.lw.wanandroid\", 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.lw.wanandroid\">\n\n    <uses-permission android:name=\"android.permission.READ_PHONE_STATE\"/>\n    <uses-permission android:name=\"android.permission.RECEIVE_BOOT_COMPLETED\"/>\n    <uses-permission android:name=\"android.permission.DISABLE_KEYGUARD\"/>\n    <uses-permission android:name=\"android.permission.ACCESS_DOWNLOAD_MANAGER\"/>\n    <uses-permission android:name=\"android.permission.DOWNLOAD_WITHOUT_NOTIFICATION\"/>\n    <uses-permission android:name=\"android.permission.EXPAND_STATUS_BAR\"/>\n    <uses-permission android:name=\"android.permission.GET_ACCOUNTS\"/>\n    <uses-permission android:name=\"android.permission.INTERNET\"/>\n    <uses-permission android:name=\"android.permission.RESTART_PACKAGES\"/>\n    <uses-permission android:name=\"android.permission.ACCESS_NETWORK_STATE\"/>\n    <!-- 获取网络状态 -->\n    <uses-permission android:name=\"android.permission.ACCESS_WIFI_STATE\"/>\n    <!-- 获取wifi状态 -->\n    <uses-permission android:name=\"android.permission.CHANGE_WIFI_STATE\"/>\n    <!-- 改变wifi状态 -->\n    <uses-permission android:name=\"android.permission.READ_LOGS\"/>\n    <uses-permission android:name=\"android.permission.WRITE_EXTERNAL_STORAGE\"/>\n    <!-- 读取sd卡 -->\n    <uses-permission android:name=\"android.permission.MOUNT_UNMOUNT_FILESYSTEMS\"/>\n    <uses-permission android:name=\"android.permission.BATTERY_STATS\"/>\n    <!-- 获取电池信息 -->\n    <uses-permission android:name=\"android.permission.WRITE_SETTINGS\"/>\n    <!-- 设置系统权限 -->\n    <uses-permission android:name=\"android.permission.GET_TASKS\"/>\n    <!-- 设置系统权限 -->\n    <uses-permission android:name=\"android.permission.WAKE_LOCK\"/>\n    <!-- 电源锁权限 -->\n    <uses-permission android:name=\"android.permission.CAMERA\"/>\n    <!-- 允许应用写（非读）用户的日历数据 -->\n    <uses-permission android:name=\"android.permission.VIBRATE\"/>\n    <!-- 允许应用访问震动器 -->\n    <uses-permission android:name=\"android.permission.RECORD_AUDIO\"/>\n\n    <application\n        android:name=\".base.App\"\n        android:allowBackup=\"true\"\n        android:icon=\"@drawable/logo\"\n        android:label=\"@string/app_name\"\n        android:roundIcon=\"@mipmap/ic_launcher_round\"\n        android:supportsRtl=\"true\"\n        android:theme=\"@style/AppTheme.NoActionBar\">\n        <activity\n            android:name=\".MainActivity\"\n            android:configChanges=\"screenSize|keyboardHidden|orientation\"\n            android:label=\"@string/app_name\"\n            android:screenOrientation=\"portrait\">\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=\".ui.article.ArticleContentActivity\"\n            android:configChanges=\"screenSize|keyboardHidden|orientation\"\n            android:screenOrientation=\"portrait\"/>\n        <activity\n            android:name=\".ui.article.ArticleTypeActivity\"\n            android:configChanges=\"screenSize|keyboardHidden|orientation\"\n            android:screenOrientation=\"portrait\"/>\n        <activity\n            android:name=\".ui.hotsearch.SearchActivity\"\n            android:configChanges=\"screenSize|keyboardHidden|orientation\"\n            android:screenOrientation=\"portrait\"/>\n        <activity\n            android:name=\".ui.my.LoginActivity\"\n            android:configChanges=\"screenSize|keyboardHidden|orientation\"\n            android:screenOrientation=\"portrait\"/>\n        <activity\n            android:name=\".ui.my.RegisterActivity\"\n            android:configChanges=\"screenSize|keyboardHidden|orientation\"\n            android:screenOrientation=\"portrait\"/>\n        <activity\n            android:name=\".ui.my.MyCollectionActivity\"\n            android:configChanges=\"screenSize|keyboardHidden|orientation\"\n            android:screenOrientation=\"portrait\"/>\n        <activity\n            android:name=\".ui.my.MyBookmarkActivity\"\n            android:configChanges=\"screenSize|keyboardHidden|orientation\"\n            android:screenOrientation=\"portrait\"/>\n        <activity\n            android:name=\".ui.setting.SettingActivity\"\n            android:configChanges=\"screenSize|keyboardHidden|orientation\"\n            android:screenOrientation=\"portrait\"/>\n        <activity\n            android:name=\".ui.setting.TestPageActivity\"\n            android:configChanges=\"screenSize|keyboardHidden|orientation\"\n            android:screenOrientation=\"portrait\"/>\n    </application>\n\n</manifest>"
  },
  {
    "path": "app/src/main/java/com/lw/wanandroid/MainActivity.java",
    "content": "package com.lw.wanandroid;\n\nimport android.support.annotation.NonNull;\nimport android.support.design.widget.BottomNavigationView;\nimport android.view.KeyEvent;\nimport android.view.Menu;\nimport android.view.MenuItem;\n\nimport com.alibaba.android.arouter.facade.annotation.Route;\nimport com.alibaba.android.arouter.launcher.ARouter;\nimport com.blankj.utilcode.util.ToastUtils;\nimport com.lw.wanandroid.base.BaseActivity;\nimport com.lw.wanandroid.ui.home.HomeFragment;\nimport com.lw.wanandroid.ui.hotsearch.HotFragment;\nimport com.lw.wanandroid.ui.knowledgesystem.KnowledgeSystemFragment;\nimport com.lw.wanandroid.ui.my.MyFragment;\n\nimport butterknife.BindView;\nimport me.yokeyword.fragmentation.ISupportFragment;\n\n@Route(path = \"/wanandroid/MainActivity\")\npublic class MainActivity extends BaseActivity implements BottomNavigationView.OnNavigationItemSelectedListener {\n    @BindView(R.id.navigation)\n    BottomNavigationView mNavigation;\n    private ISupportFragment[] mFragments = new ISupportFragment[4];\n    private long mExitTime;\n    private int preIndex;\n\n    @Override\n    protected int getLayoutId() {\n        return R.layout.activity_main;\n    }\n\n    @Override\n    protected void initInjector() {\n    }\n\n    @Override\n    protected void initView() {\n        mNavigation.setOnNavigationItemSelectedListener(this);\n        ISupportFragment homeFragment = findFragment(HomeFragment.class);\n        if (homeFragment == null) {\n            mFragments[0] = HomeFragment.newInstance();\n            mFragments[1] = KnowledgeSystemFragment.newInstance();\n            mFragments[2] = MyFragment.newInstance();\n            mFragments[3] = HotFragment.newInstance();\n            loadMultipleRootFragment(R.id.layout_fragment, 0,\n                    mFragments[0],\n                    mFragments[1],\n                    mFragments[2],\n                    mFragments[3]);\n        } else {\n            // 这里我们需要拿到mFragments的引用\n            mFragments[0] = homeFragment;\n            mFragments[1] = findFragment(KnowledgeSystemFragment.class);\n            mFragments[2] = findFragment(MyFragment.class);\n            mFragments[3] = findFragment(HotFragment.class);\n        }\n    }\n\n    @Override\n    public boolean onNavigationItemSelected(@NonNull MenuItem item) {\n        switch (item.getItemId()) {\n            case R.id.navigation_home:\n                mToolbar.setTitle(R.string.app_name);\n                showHideFragment(mFragments[0], mFragments[preIndex]);\n                preIndex = 0;\n                break;\n            case R.id.navigation_knowledgesystem:\n                mToolbar.setTitle(R.string.title_knowledgesystem);\n                showHideFragment(mFragments[1], mFragments[preIndex]);\n                preIndex = 1;\n                break;\n            case R.id.navigation_my:\n                mToolbar.setTitle(R.string.title_my);\n                showHideFragment(mFragments[2], mFragments[preIndex]);\n                preIndex = 2;\n                break;\n        }\n        return true;\n    }\n\n    @Override\n    public boolean onCreateOptionsMenu(Menu menu) {\n        getMenuInflater().inflate(R.menu.menu_main, menu);\n        return super.onCreateOptionsMenu(menu);\n    }\n\n    @Override\n    public boolean onOptionsItemSelected(MenuItem item) {\n        if (item.getItemId() == R.id.menuHot) {\n            mToolbar.setTitle(R.string.hot_title);\n            showHideFragment(mFragments[3], mFragments[preIndex]);\n            preIndex = 3;\n        } else if (item.getItemId() == R.id.menuSearch) {\n            ARouter.getInstance().build(\"/hotsearch/SearchActivity\").navigation();\n        }\n        return super.onOptionsItemSelected(item);\n    }\n\n    @Override\n    public boolean onKeyDown(int keyCode, KeyEvent event) {\n        if (keyCode == KeyEvent.KEYCODE_BACK) {\n            if ((System.currentTimeMillis() - mExitTime) > 2000) {\n                ToastUtils.showShort(R.string.exit_system);\n                mExitTime = System.currentTimeMillis();\n            } else {\n                System.exit(0);\n            }\n            return true;\n        }\n        return super.onKeyDown(keyCode, event);\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/lw/wanandroid/base/App.java",
    "content": "package com.lw.wanandroid.base;\n\nimport android.app.Application;\nimport android.content.Context;\n\nimport com.alibaba.android.arouter.launcher.ARouter;\nimport com.blankj.utilcode.util.Utils;\nimport com.lw.wanandroid.BuildConfig;\nimport com.lw.wanandroid.di.component.ApplicationComponent;\nimport com.lw.wanandroid.di.component.DaggerApplicationComponent;\nimport com.lw.wanandroid.di.module.ApplicationModule;\nimport com.raizlabs.android.dbflow.config.FlowManager;\n\nimport me.yokeyword.fragmentation.Fragmentation;\n\n/**\n * Created by lw on 2018/1/18.\n */\n\npublic class App extends Application {\n    private ApplicationComponent mApplicationComponent;\n    private static App mInstance;\n\n    @Override\n    public void onCreate() {\n        super.onCreate();\n        mInstance = this;\n        initApplicationComponent();\n        Utils.init(this);\n        intARouter();\n        FlowManager.init(this);\n        Fragmentation.builder()\n                .stackViewMode(Fragmentation.BUBBLE)                // 显示悬浮球 ; 其他Mode:SHAKE: 摇一摇唤出   NONE：隐藏\n                .debug(BuildConfig.DEBUG)\n                .install();\n    }\n\n    /**\n     * 初始化路由\n     */\n    private void intARouter() {\n        if (BuildConfig.DEBUG) {           // 这两行必须写在init之前，否则这些配置在init过程中将无效\n            ARouter.openLog();     // 打印日志\n            ARouter.openDebug();   // 开启调试模式(如果在InstantRun模式下运行，必须开启调试模式！线上版本需要关闭,否则有安全风险)\n        }\n        ARouter.init(this); // 尽可能早，推荐在Application中初始化\n    }\n\n    /**\n     * 初始化ApplicationComponent\n     */\n    private void initApplicationComponent() {\n        mApplicationComponent = DaggerApplicationComponent.builder()\n                .applicationModule(new ApplicationModule(this))\n                .build();\n    }\n\n    public ApplicationComponent getApplicationComponent() {\n        return mApplicationComponent;\n    }\n\n    public static Context getAppContext() {\n        return mInstance.getApplicationContext();\n    }\n\n    public static App getInstance() {\n        return mInstance;\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/lw/wanandroid/base/BaseActivity.java",
    "content": "package com.lw.wanandroid.base;\n\nimport android.os.Build;\nimport android.os.Bundle;\nimport android.support.annotation.NonNull;\nimport android.support.annotation.Nullable;\nimport android.support.v4.widget.SwipeRefreshLayout;\nimport android.support.v7.widget.Toolbar;\nimport android.view.MenuItem;\nimport android.view.MotionEvent;\n\nimport com.alibaba.android.arouter.launcher.ARouter;\nimport com.blankj.utilcode.util.NetworkUtils;\nimport com.blankj.utilcode.util.ToastUtils;\nimport com.chad.library.adapter.base.BaseQuickAdapter;\nimport com.lw.wanandroid.R;\nimport com.lw.wanandroid.constant.Constant;\nimport com.lw.wanandroid.constant.LoadType;\nimport com.lw.wanandroid.di.component.ActivityComponent;\nimport com.lw.wanandroid.di.component.DaggerActivityComponent;\nimport com.lw.wanandroid.di.module.ActivityModule;\nimport com.trello.rxlifecycle2.LifecycleTransformer;\nimport com.trello.rxlifecycle2.components.support.RxAppCompatActivity;\n\nimport java.util.List;\n\nimport javax.inject.Inject;\n\nimport butterknife.ButterKnife;\nimport butterknife.Unbinder;\nimport me.yokeyword.fragmentation.ExtraTransaction;\nimport me.yokeyword.fragmentation.ISupportActivity;\nimport me.yokeyword.fragmentation.ISupportFragment;\nimport me.yokeyword.fragmentation.SupportActivityDelegate;\nimport me.yokeyword.fragmentation.SupportFragment;\nimport me.yokeyword.fragmentation.SupportHelper;\nimport me.yokeyword.fragmentation.anim.FragmentAnimator;\n\n/**\n * Created by lw on 2018/1/18.\n */\n\npublic abstract class BaseActivity<T extends BaseContract.BasePresenter> extends RxAppCompatActivity implements ISupportActivity, BaseContract.BaseView {\n    @Nullable\n    @Inject\n    protected T mPresenter;\n    protected ActivityComponent mActivityComponent;\n    @Nullable\n    protected Toolbar mToolbar;\n    private Unbinder unbinder;\n\n    protected abstract int getLayoutId();\n\n    protected abstract void initInjector();\n\n    protected abstract void initView();\n\n    /**\n     * 是否显示返回键\n     *\n     * @return\n     */\n    protected boolean showHomeAsUp() {\n        return false;\n    }\n\n    @Override\n    protected void onCreate(@Nullable Bundle savedInstanceState) {\n        super.onCreate(savedInstanceState);\n        mDelegate.onCreate(savedInstanceState);\n        initActivityComponent();\n        ARouter.getInstance().inject(this);\n        int layoutId = getLayoutId();\n        setContentView(layoutId);\n        initInjector();\n        unbinder = ButterKnife.bind(this);\n        initToolBar();\n        attachView();\n        initView();\n        if (!NetworkUtils.isConnected()) showNoNet();\n    }\n\n    @Override\n    protected void onDestroy() {\n        super.onDestroy();\n        mDelegate.onDestroy();\n        unbinder.unbind();\n        detachView();\n    }\n\n    @Override\n    public void showLoading() {\n\n    }\n\n    @Override\n    public void hideLoading() {\n\n    }\n\n    @Override\n    public void showSuccess(String successMsg) {\n        ToastUtils.showShort(successMsg);\n    }\n\n    @Override\n    public void showFaild(String errorMsg) {\n        ToastUtils.showShort(errorMsg);\n    }\n\n    @Override\n    public void showNoNet() {\n        ToastUtils.showShort(R.string.no_network_connection);\n    }\n\n    @Override\n    public void onRetry() {\n\n    }\n\n    @Override\n    public <T> LifecycleTransformer<T> bindToLife() {\n        return this.bindToLifecycle();\n    }\n\n    @Override\n    public boolean onOptionsItemSelected(MenuItem item) {\n        int id = item.getItemId();\n        switch (id) {\n            case android.R.id.home:\n                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {\n                    finishAfterTransition();\n                } else {\n                    finish();\n                }\n                break;\n        }\n        return true;\n    }\n\n    final SupportActivityDelegate mDelegate = new SupportActivityDelegate(this);\n\n    @Override\n    public SupportActivityDelegate getSupportDelegate() {\n        return mDelegate;\n    }\n\n    /**\n     * Perform some extra transactions.\n     * 额外的事务：自定义Tag，添加SharedElement动画，操作非回退栈Fragment\n     */\n    @Override\n    public ExtraTransaction extraTransaction() {\n        return mDelegate.extraTransaction();\n    }\n\n\n    @Override\n    protected void onPostCreate(@Nullable Bundle savedInstanceState) {\n        super.onPostCreate(savedInstanceState);\n        mDelegate.onPostCreate(savedInstanceState);\n    }\n\n\n    /**\n     * Note： return mDelegate.dispatchTouchEvent(ev) || super.dispatchTouchEvent(ev);\n     */\n    @Override\n    public boolean dispatchTouchEvent(MotionEvent ev) {\n        return mDelegate.dispatchTouchEvent(ev) || super.dispatchTouchEvent(ev);\n    }\n\n    /**\n     * 不建议复写该方法,请使用 {@link #onBackPressedSupport} 代替\n     */\n    @Override\n    final public void onBackPressed() {\n        mDelegate.onBackPressed();\n    }\n\n    /**\n     * 该方法回调时机为,Activity回退栈内Fragment的数量 小于等于1 时,默认finish Activity\n     * 请尽量复写该方法,避免复写onBackPress(),以保证SupportFragment内的onBackPressedSupport()回退事件正常执行\n     */\n    @Override\n    public void onBackPressedSupport() {\n        mDelegate.onBackPressedSupport();\n    }\n\n    /**\n     * 获取设置的全局动画 copy\n     *\n     * @return FragmentAnimator\n     */\n    @Override\n    public FragmentAnimator getFragmentAnimator() {\n        return mDelegate.getFragmentAnimator();\n    }\n\n    /**\n     * Set all fragments animation.\n     * 设置Fragment内的全局动画\n     */\n    @Override\n    public void setFragmentAnimator(FragmentAnimator fragmentAnimator) {\n        mDelegate.setFragmentAnimator(fragmentAnimator);\n    }\n\n    /**\n     * Set all fragments animation.\n     * 构建Fragment转场动画\n     * <p/>\n     * 如果是在Activity内实现,则构建的是Activity内所有Fragment的转场动画,\n     * 如果是在Fragment内实现,则构建的是该Fragment的转场动画,此时优先级 > Activity的onCreateFragmentAnimator()\n     *\n     * @return FragmentAnimator对象\n     */\n    @Override\n    public FragmentAnimator onCreateFragmentAnimator() {\n        return mDelegate.onCreateFragmentAnimator();\n    }\n\n    /**\n     * Causes the Runnable r to be added to the action queue.\n     * <p>\n     * The runnable will be run after all the previous action has been run.\n     * <p>\n     * 前面的事务全部执行后 执行该Action\n     */\n    @Override\n    public void post(Runnable runnable) {\n        mDelegate.post(runnable);\n    }\n\n    protected void setToolbarTitle(String title) {\n        getSupportActionBar().setTitle(title);\n    }\n\n    /**\n     * 设置加载数据结果\n     *\n     * @param baseQuickAdapter\n     * @param refreshLayout\n     * @param list\n     * @param loadType\n     */\n    protected void setLoadDataResult(BaseQuickAdapter baseQuickAdapter, SwipeRefreshLayout refreshLayout, List list, @LoadType.checker int loadType) {\n        switch (loadType) {\n            case LoadType.TYPE_REFRESH_SUCCESS:\n                baseQuickAdapter.setNewData(list);\n                refreshLayout.setRefreshing(false);\n                break;\n            case LoadType.TYPE_REFRESH_ERROR:\n                refreshLayout.setRefreshing(false);\n                break;\n            case LoadType.TYPE_LOAD_MORE_SUCCESS:\n                if (list != null) baseQuickAdapter.addData(list);\n                break;\n            case LoadType.TYPE_LOAD_MORE_ERROR:\n                baseQuickAdapter.loadMoreFail();\n                break;\n        }\n        if (list == null || list.isEmpty() || list.size() < Constant.PAGE_SIZE) {\n            baseQuickAdapter.loadMoreEnd(false);\n        } else {\n            baseQuickAdapter.loadMoreComplete();\n        }\n    }\n\n    // 选择性拓展其他方法\n\n    public void loadRootFragment(int containerId, @NonNull ISupportFragment toFragment) {\n        mDelegate.loadRootFragment(containerId, toFragment);\n    }\n\n    public void start(ISupportFragment toFragment) {\n        mDelegate.start(toFragment);\n    }\n\n    /**\n     * @param launchMode Same as Activity's LaunchMode.\n     */\n    public void start(ISupportFragment toFragment, @ISupportFragment.LaunchMode int launchMode) {\n        mDelegate.start(toFragment, launchMode);\n    }\n\n    /**\n     * It is recommended to use {@link SupportFragment#startWithPopTo(ISupportFragment, Class, boolean)}.\n     *\n     * @see #popTo(Class, boolean)\n     * +\n     * @see #start(ISupportFragment)\n     */\n    public void startWithPopTo(ISupportFragment toFragment, Class<?> targetFragmentClass, boolean includeTargetFragment) {\n        mDelegate.startWithPopTo(toFragment, targetFragmentClass, includeTargetFragment);\n    }\n\n    /**\n     * Pop the fragment.\n     */\n    public void pop() {\n        mDelegate.pop();\n    }\n\n    /**\n     * Pop the last fragment transition from the manager's fragment\n     * back stack.\n     */\n    public void popTo(Class<?> targetFragmentClass, boolean includeTargetFragment) {\n        mDelegate.popTo(targetFragmentClass, includeTargetFragment);\n    }\n\n    /**\n     * If you want to begin another FragmentTransaction immediately after popTo(), use this method.\n     * 如果你想在出栈后, 立刻进行FragmentTransaction操作，请使用该方法\n     */\n    public void popTo(Class<?> targetFragmentClass, boolean includeTargetFragment, Runnable afterPopTransactionRunnable) {\n        mDelegate.popTo(targetFragmentClass, includeTargetFragment, afterPopTransactionRunnable);\n    }\n\n    public void popTo(Class<?> targetFragmentClass, boolean includeTargetFragment, Runnable afterPopTransactionRunnable, int popAnim) {\n        mDelegate.popTo(targetFragmentClass, includeTargetFragment, afterPopTransactionRunnable, popAnim);\n    }\n\n    /**\n     * 得到位于栈顶Fragment\n     */\n    public ISupportFragment getTopFragment() {\n        return SupportHelper.getTopFragment(getSupportFragmentManager());\n    }\n\n    /**\n     * 获取栈内的fragment对象\n     */\n    public <T extends ISupportFragment> T findFragment(Class<T> fragmentClass) {\n        return SupportHelper.findFragment(getSupportFragmentManager(), fragmentClass);\n    }\n\n    /**\n     * 加载多个同级根Fragment,类似Wechat, QQ主页的场景\n     */\n    public void loadMultipleRootFragment(int containerId, int showPosition, ISupportFragment... toFragments) {\n        mDelegate.loadMultipleRootFragment(containerId, showPosition, toFragments);\n    }\n\n    /**\n     * show一个Fragment,hide其他同栈所有Fragment\n     * 使用该方法时，要确保同级栈内无多余的Fragment,(只有通过loadMultipleRootFragment()载入的Fragment)\n     * <p>\n     * 建议使用更明确的{@link #showHideFragment(ISupportFragment, ISupportFragment)}\n     *\n     * @param showFragment 需要show的Fragment\n     */\n    public void showHideFragment(ISupportFragment showFragment) {\n        mDelegate.showHideFragment(showFragment);\n    }\n\n    /**\n     * show一个Fragment,hide一个Fragment ; 主要用于类似微信主页那种 切换tab的情况\n     */\n    public void showHideFragment(ISupportFragment showFragment, ISupportFragment hideFragment) {\n        mDelegate.showHideFragment(showFragment, hideFragment);\n    }\n\n    /**\n     * 初始化ActivityComponent\n     */\n    private void initActivityComponent() {\n        mActivityComponent = DaggerActivityComponent.builder()\n                .applicationComponent(((App) getApplication()).getApplicationComponent())\n                .activityModule(new ActivityModule(this))\n                .build();\n    }\n\n    /**\n     * 初始化toolbar\n     */\n    private void initToolBar() {\n        mToolbar = (Toolbar) findViewById(R.id.toolbar);\n        if (mToolbar == null) {\n            throw new NullPointerException(\"toolbar can not be null\");\n        }\n        setSupportActionBar(mToolbar);\n        getSupportActionBar().setDisplayHomeAsUpEnabled(showHomeAsUp());\n        /**toolbar除掉阴影*/\n        getSupportActionBar().setElevation(0);\n        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {\n            mToolbar.setElevation(0);\n        }\n    }\n\n    /**\n     * 贴上view\n     */\n    private void attachView() {\n        if (mPresenter != null) {\n            mPresenter.attachView(this);\n        }\n    }\n\n    /**\n     * 分离view\n     */\n    private void detachView() {\n        if (mPresenter != null) {\n            mPresenter.detachView();\n        }\n    }\n\n\n}\n"
  },
  {
    "path": "app/src/main/java/com/lw/wanandroid/base/BaseContract.java",
    "content": "package com.lw.wanandroid.base;\n\nimport com.trello.rxlifecycle2.LifecycleTransformer;\n\n/**\n * desc:\n * author: Will .\n * date: 2017/9/2 .\n */\npublic interface BaseContract {\n\n    interface BasePresenter<T extends BaseContract.BaseView> {\n\n        void attachView(T view);\n\n        void detachView();\n    }\n\n\n    interface BaseView {\n\n        //显示进度中\n        void showLoading();\n\n        //隐藏进度\n        void hideLoading();\n\n        //显示请求成功\n        void showSuccess(String message);\n\n        //失败重试\n        void showFaild(String message);\n\n        //显示当前网络不可用\n        void showNoNet();\n\n        //重试\n        void onRetry();\n\n        /**\n         * 绑定生命周期\n         *\n         * @param <T>\n         * @return\n         */\n        <T> LifecycleTransformer<T> bindToLife();\n\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/lw/wanandroid/base/BaseFragment.java",
    "content": "package com.lw.wanandroid.base;\n\nimport android.app.Activity;\nimport android.os.Bundle;\nimport android.support.annotation.Nullable;\nimport android.support.v4.app.FragmentActivity;\nimport android.support.v4.app.FragmentTransaction;\nimport android.support.v4.widget.SwipeRefreshLayout;\nimport android.view.LayoutInflater;\nimport android.view.View;\nimport android.view.ViewGroup;\nimport android.view.animation.Animation;\n\nimport com.alibaba.android.arouter.launcher.ARouter;\nimport com.blankj.utilcode.util.NetworkUtils;\nimport com.blankj.utilcode.util.ToastUtils;\nimport com.chad.library.adapter.base.BaseQuickAdapter;\nimport com.lw.wanandroid.R;\nimport com.lw.wanandroid.constant.Constant;\nimport com.lw.wanandroid.constant.LoadType;\nimport com.lw.wanandroid.di.component.DaggerFragmentComponent;\nimport com.lw.wanandroid.di.component.FragmentComponent;\nimport com.lw.wanandroid.di.module.FragmentModule;\nimport com.trello.rxlifecycle2.LifecycleTransformer;\nimport com.trello.rxlifecycle2.components.support.RxFragment;\n\nimport java.util.List;\n\nimport javax.inject.Inject;\n\nimport butterknife.ButterKnife;\nimport butterknife.Unbinder;\nimport me.yokeyword.fragmentation.ExtraTransaction;\nimport me.yokeyword.fragmentation.ISupportFragment;\nimport me.yokeyword.fragmentation.SupportFragmentDelegate;\nimport me.yokeyword.fragmentation.SupportHelper;\nimport me.yokeyword.fragmentation.anim.FragmentAnimator;\n\n/**\n * Created by lw on 2018/1/18.\n */\n\npublic abstract class BaseFragment<T extends BaseContract.BasePresenter> extends RxFragment implements ISupportFragment, BaseContract.BaseView {\n    private static final String STATE_SAVE_IS_HIDDEN = \"STATE_SAVE_IS_HIDDEN\";\n    @Nullable\n    @Inject\n    protected T mPresenter;\n    protected FragmentComponent mFragmentComponent;\n    private Unbinder unbinder;\n    private View mRootView, mErrorView, mEmptyView;\n\n    protected abstract int getLayoutId();\n\n    protected abstract void initInjector();\n\n    protected abstract void initView(View view);\n\n    @Override\n    public void onCreate(@Nullable Bundle savedInstanceState) {\n        super.onCreate(savedInstanceState);\n        mDelegate.onCreate(savedInstanceState);\n        initFragmentComponent();\n        ARouter.getInstance().inject(this);\n        initInjector();\n        attachView();\n        if (!NetworkUtils.isConnected()) showNoNet();\n        if (savedInstanceState != null) {\n            boolean isSupportHidden = savedInstanceState.getBoolean(STATE_SAVE_IS_HIDDEN);\n            FragmentTransaction ft = getFragmentManager().beginTransaction();\n            if (isSupportHidden) {\n                ft.hide(this);\n            } else {\n                ft.show(this);\n            }\n            ft.commit();\n        }\n    }\n\n    @Override\n    public void onSaveInstanceState(Bundle outState) {\n        mDelegate.onSaveInstanceState(outState);\n        outState.putBoolean(STATE_SAVE_IS_HIDDEN, isHidden());\n    }\n\n    @Nullable\n    @Override\n    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {\n        inflaterView(inflater, container);\n        unbinder = ButterKnife.bind(this, mRootView);\n        initView(mRootView);\n        return mRootView;\n    }\n\n    @Override\n    public void onDestroy() {\n        super.onDestroy();\n        mDelegate.onDestroy();\n        unbinder.unbind();\n        detachView();\n    }\n\n    @Override\n    public void showLoading() {\n        ToastUtils.showShort(\"showLoading\");\n    }\n\n    @Override\n    public void hideLoading() {\n        ToastUtils.showShort(\"hideLoading\");\n    }\n\n    @Override\n    public void showSuccess(String successMsg) {\n        ToastUtils.showShort(successMsg);\n    }\n\n    @Override\n    public void showFaild(String errorMsg) {\n        ToastUtils.showShort(errorMsg);\n    }\n\n    @Override\n    public void showNoNet() {\n        ToastUtils.showShort(R.string.no_network_connection);\n    }\n\n    @Override\n    public void onRetry() {\n        ToastUtils.showShort(\"onRetry\");\n    }\n\n    @Override\n    public <T> LifecycleTransformer<T> bindToLife() {\n        return this.bindToLifecycle();\n    }\n\n    /**\n     * 设置加载数据结果\n     *\n     * @param baseQuickAdapter\n     * @param refreshLayout\n     * @param list\n     * @param loadType\n     */\n    protected void setLoadDataResult(BaseQuickAdapter baseQuickAdapter, SwipeRefreshLayout refreshLayout, List list, @LoadType.checker int loadType) {\n        switch (loadType) {\n            case LoadType.TYPE_REFRESH_SUCCESS:\n                baseQuickAdapter.setNewData(list);\n                refreshLayout.setRefreshing(false);\n                break;\n            case LoadType.TYPE_REFRESH_ERROR:\n                refreshLayout.setRefreshing(false);\n                break;\n            case LoadType.TYPE_LOAD_MORE_SUCCESS:\n                if (list != null) baseQuickAdapter.addData(list);\n                break;\n            case LoadType.TYPE_LOAD_MORE_ERROR:\n                baseQuickAdapter.loadMoreFail();\n                break;\n        }\n        if (list == null || list.isEmpty() || list.size() < Constant.PAGE_SIZE) {\n            baseQuickAdapter.loadMoreEnd(false);\n        } else {\n            baseQuickAdapter.loadMoreComplete();\n        }\n    }\n\n    /**\n     * 初始化FragmentComponent\n     */\n    private void initFragmentComponent() {\n        mFragmentComponent = DaggerFragmentComponent.builder()\n                .applicationComponent(((App) getActivity().getApplication()).getApplicationComponent())\n                .fragmentModule(new FragmentModule(this))\n                .build();\n    }\n\n    /**\n     * 贴上view\n     */\n    private void attachView() {\n        if (mPresenter != null) {\n            mPresenter.attachView(this);\n        }\n    }\n\n    /**\n     * 分离view\n     */\n    private void detachView() {\n        if (mPresenter != null) {\n            mPresenter.detachView();\n        }\n    }\n\n\n    /**\n     * 设置View\n     *\n     * @param inflater\n     * @param container\n     */\n    private void inflaterView(LayoutInflater inflater, @Nullable ViewGroup container) {\n        if (mRootView == null) {\n            mRootView = inflater.inflate(getLayoutId(), container, false);\n        }\n    }\n\n    final SupportFragmentDelegate mDelegate = new SupportFragmentDelegate(this);\n    protected FragmentActivity _mActivity;\n\n    @Override\n    public SupportFragmentDelegate getSupportDelegate() {\n        return mDelegate;\n    }\n\n    /**\n     * Perform some extra transactions.\n     * 额外的事务：自定义Tag，添加SharedElement动画，操作非回退栈Fragment\n     */\n    @Override\n    public ExtraTransaction extraTransaction() {\n        return mDelegate.extraTransaction();\n    }\n\n    @Override\n    public void onAttach(Activity activity) {\n        super.onAttach(activity);\n        mDelegate.onAttach(activity);\n        _mActivity = mDelegate.getActivity();\n    }\n\n    @Override\n    public Animation onCreateAnimation(int transit, boolean enter, int nextAnim) {\n        return mDelegate.onCreateAnimation(transit, enter, nextAnim);\n    }\n\n    @Override\n    public void onActivityCreated(@Nullable Bundle savedInstanceState) {\n        super.onActivityCreated(savedInstanceState);\n        mDelegate.onActivityCreated(savedInstanceState);\n    }\n\n    @Override\n    public void onResume() {\n        super.onResume();\n        mDelegate.onResume();\n    }\n\n    @Override\n    public void onPause() {\n        super.onPause();\n        mDelegate.onPause();\n    }\n\n    @Override\n    public void onDestroyView() {\n        mDelegate.onDestroyView();\n        super.onDestroyView();\n    }\n\n\n    @Override\n    public void onHiddenChanged(boolean hidden) {\n        super.onHiddenChanged(hidden);\n        mDelegate.onHiddenChanged(hidden);\n    }\n\n    @Override\n    public void setUserVisibleHint(boolean isVisibleToUser) {\n        super.setUserVisibleHint(isVisibleToUser);\n        mDelegate.setUserVisibleHint(isVisibleToUser);\n    }\n\n    /**\n     * Causes the Runnable r to be added to the action queue.\n     * <p>\n     * The runnable will be run after all the previous action has been run.\n     * <p>\n     * 前面的事务全部执行后 执行该Action\n     *\n     * @deprecated Use {@link #post(Runnable)} instead.\n     */\n    @Deprecated\n    @Override\n    public void enqueueAction(Runnable runnable) {\n        mDelegate.enqueueAction(runnable);\n    }\n\n    /**\n     * Causes the Runnable r to be added to the action queue.\n     * <p>\n     * The runnable will be run after all the previous action has been run.\n     * <p>\n     * 前面的事务全部执行后 执行该Action\n     */\n    @Override\n    public void post(Runnable runnable) {\n        mDelegate.post(runnable);\n    }\n\n    /**\n     * Called when the enter-animation end.\n     * 入栈动画 结束时,回调\n     */\n    @Override\n    public void onEnterAnimationEnd(Bundle savedInstanceState) {\n        mDelegate.onEnterAnimationEnd(savedInstanceState);\n    }\n\n\n    /**\n     * Lazy initial，Called when fragment is first called.\n     * <p>\n     * 同级下的 懒加载 ＋ ViewPager下的懒加载  的结合回调方法\n     */\n    @Override\n    public void onLazyInitView(@Nullable Bundle savedInstanceState) {\n        mDelegate.onLazyInitView(savedInstanceState);\n    }\n\n    /**\n     * Called when the fragment is visible.\n     * 当Fragment对用户可见时回调\n     * <p>\n     * Is the combination of  [onHiddenChanged() + onResume()/onPause() + setUserVisibleHint()]\n     */\n    @Override\n    public void onSupportVisible() {\n        mDelegate.onSupportVisible();\n    }\n\n    /**\n     * Called when the fragment is invivible.\n     * <p>\n     * Is the combination of  [onHiddenChanged() + onResume()/onPause() + setUserVisibleHint()]\n     */\n    @Override\n    public void onSupportInvisible() {\n        mDelegate.onSupportInvisible();\n    }\n\n    /**\n     * Return true if the fragment has been supportVisible.\n     */\n    @Override\n    final public boolean isSupportVisible() {\n        return mDelegate.isSupportVisible();\n    }\n\n    /**\n     * Set fragment animation with a higher priority than the ISupportActivity\n     * 设定当前Fragmemt动画,优先级比在SupportActivity里高\n     */\n    @Override\n    public FragmentAnimator onCreateFragmentAnimator() {\n        return mDelegate.onCreateFragmentAnimator();\n    }\n\n    /**\n     * 获取设置的全局动画 copy\n     *\n     * @return FragmentAnimator\n     */\n    @Override\n    public FragmentAnimator getFragmentAnimator() {\n        return mDelegate.getFragmentAnimator();\n    }\n\n    /**\n     * 设置Fragment内的全局动画\n     */\n    @Override\n    public void setFragmentAnimator(FragmentAnimator fragmentAnimator) {\n        mDelegate.setFragmentAnimator(fragmentAnimator);\n    }\n\n    /**\n     * 按返回键触发,前提是SupportActivity的onBackPressed()方法能被调用\n     *\n     * @return false则继续向上传递, true则消费掉该事件\n     */\n    @Override\n    public boolean onBackPressedSupport() {\n        return mDelegate.onBackPressedSupport();\n    }\n\n    /**\n     * 类似\n     * <p>\n     * Similar to\n     *\n     * @see #startForResult(ISupportFragment, int)\n     */\n    @Override\n    public void setFragmentResult(int resultCode, Bundle bundle) {\n        mDelegate.setFragmentResult(resultCode, bundle);\n    }\n\n    /**\n     * 类似\n     * <p>\n     * Similar to\n     *\n     * @see #startForResult(ISupportFragment, int)\n     */\n    @Override\n    public void onFragmentResult(int requestCode, int resultCode, Bundle data) {\n        mDelegate.onFragmentResult(requestCode, resultCode, data);\n    }\n\n    /**\n     * 在start(TargetFragment,LaunchMode)时,启动模式为SingleTask/SingleTop, 回调TargetFragment的该方法\n     * 类似\n     * <p>\n     * Similar to\n     *\n     * @param args putNewBundle(Bundle newBundle)\n     * @see #start(ISupportFragment, int)\n     */\n    @Override\n    public void onNewBundle(Bundle args) {\n        mDelegate.onNewBundle(args);\n    }\n\n    /**\n     * 添加NewBundle,用于启动模式为SingleTask/SingleTop时\n     *\n     * @see #start(ISupportFragment, int)\n     */\n    @Override\n    public void putNewBundle(Bundle newBundle) {\n        mDelegate.putNewBundle(newBundle);\n    }\n\n\n    /****************************************以下为可选方法(Optional methods)******************************************************/\n    // 自定制Support时，可移除不必要的方法\n\n    /**\n     * 隐藏软键盘\n     */\n    protected void hideSoftInput() {\n        mDelegate.hideSoftInput();\n    }\n\n    /**\n     * 显示软键盘,调用该方法后,会在onPause时自动隐藏软键盘\n     */\n    protected void showSoftInput(final View view) {\n        mDelegate.showSoftInput(view);\n    }\n\n    /**\n     * 加载根Fragment, 即Activity内的第一个Fragment 或 Fragment内的第一个子Fragment\n     *\n     * @param containerId 容器id\n     * @param toFragment  目标Fragment\n     */\n    public void loadRootFragment(int containerId, ISupportFragment toFragment) {\n        mDelegate.loadRootFragment(containerId, toFragment);\n    }\n\n    public void loadRootFragment(int containerId, ISupportFragment toFragment, boolean addToBackStack, boolean allowAnim) {\n        mDelegate.loadRootFragment(containerId, toFragment, addToBackStack, allowAnim);\n    }\n\n    public void start(ISupportFragment toFragment) {\n        mDelegate.start(toFragment);\n    }\n\n    /**\n     * @param launchMode Similar to Activity's LaunchMode.\n     */\n    public void start(final ISupportFragment toFragment, @LaunchMode int launchMode) {\n        mDelegate.start(toFragment, launchMode);\n    }\n\n    /**\n     * Launch an fragment for which you would like a result when it poped.\n     */\n    public void startForResult(ISupportFragment toFragment, int requestCode) {\n        mDelegate.startForResult(toFragment, requestCode);\n    }\n\n    /**\n     * Start the target Fragment and pop itself\n     */\n    public void startWithPop(ISupportFragment toFragment) {\n        mDelegate.startWithPop(toFragment);\n    }\n\n    /**\n     * @see #popTo(Class, boolean)\n     * +\n     * @see #start(ISupportFragment)\n     */\n    public void startWithPopTo(ISupportFragment toFragment, Class<?> targetFragmentClass, boolean includeTargetFragment) {\n        mDelegate.startWithPopTo(toFragment, targetFragmentClass, includeTargetFragment);\n    }\n\n    public void replaceFragment(ISupportFragment toFragment, boolean addToBackStack) {\n        mDelegate.replaceFragment(toFragment, addToBackStack);\n    }\n\n    public void pop() {\n        mDelegate.pop();\n    }\n\n    /**\n     * Pop the last fragment transition from the manager's fragment\n     * back stack.\n     * <p>\n     * 出栈到目标fragment\n     *\n     * @param targetFragmentClass   目标fragment\n     * @param includeTargetFragment 是否包含该fragment\n     */\n    public void popTo(Class<?> targetFragmentClass, boolean includeTargetFragment) {\n        mDelegate.popTo(targetFragmentClass, includeTargetFragment);\n    }\n\n    /**\n     * 获取栈内的fragment对象\n     */\n    public <T extends ISupportFragment> T findChildFragment(Class<T> fragmentClass) {\n        return SupportHelper.findFragment(getChildFragmentManager(), fragmentClass);\n    }\n\n}\n"
  },
  {
    "path": "app/src/main/java/com/lw/wanandroid/base/BasePresenter.java",
    "content": "package com.lw.wanandroid.base;\n\n/**\n * desc:\n * author: Will .\n * date: 2017/9/2 .\n */\n\npublic class BasePresenter<T extends BaseContract.BaseView> implements BaseContract.BasePresenter<T> {\n\n    protected T mView;\n\n    @Override\n    public void attachView(T view) {\n        this.mView = view;\n    }\n\n    @Override\n    public void detachView() {\n        if (mView != null) {\n            mView = null;\n        }\n    }\n}"
  },
  {
    "path": "app/src/main/java/com/lw/wanandroid/bean/Article.java",
    "content": "package com.lw.wanandroid.bean;\n\nimport java.util.List;\n\n/**\n * Created by lw on 2018/1/18.\n */\n\npublic class Article {\n\n    private int offset;\n    private int size;\n    private int total;\n    private int pageCount;\n    private int curPage;\n    private boolean over;\n    private List<DatasBean> datas;\n\n    public int getOffset() {\n        return offset;\n    }\n\n    public void setOffset(int offset) {\n        this.offset = offset;\n    }\n\n    public int getSize() {\n        return size;\n    }\n\n    public void setSize(int size) {\n        this.size = size;\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 int getPageCount() {\n        return pageCount;\n    }\n\n    public void setPageCount(int pageCount) {\n        this.pageCount = pageCount;\n    }\n\n    public int getCurPage() {\n        return curPage;\n    }\n\n    public void setCurPage(int curPage) {\n        this.curPage = curPage;\n    }\n\n    public boolean isOver() {\n        return over;\n    }\n\n    public void setOver(boolean over) {\n        this.over = over;\n    }\n\n    public List<DatasBean> getDatas() {\n        return datas;\n    }\n\n    public void setDatas(List<DatasBean> datas) {\n        this.datas = datas;\n    }\n\n    public static class DatasBean {\n        /**\n         * id : 1578\n         * title : 这些 Drawable 的小技巧，你都了解吗？\n         * chapterId : 168\n         * chapterName : Drawable\n         * envelopePic : null\n         * link : https://juejin.im/post/5a28b2d0f265da431c703153\n         * author :  承香墨影\n         * origin : null\n         * publishTime : 1512660849000\n         * zan : null\n         * desc : null\n         * visible : 1\n         * niceDate : 2017-12-07\n         * courseId : 13\n         * collect : false\n         */\n\n        private int id;\n        private String title;\n        private int chapterId;\n        private String chapterName;\n        private String envelopePic;\n        private String link;\n        private String author;\n        private String origin;\n        private long publishTime;\n        private String zan;\n        private String desc;\n        private int visible;\n        private String niceDate;\n        private int courseId;\n        private boolean collect;\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 int getChapterId() {\n            return chapterId;\n        }\n\n        public void setChapterId(int chapterId) {\n            this.chapterId = chapterId;\n        }\n\n        public String getChapterName() {\n            return chapterName;\n        }\n\n        public void setChapterName(String chapterName) {\n            this.chapterName = chapterName;\n        }\n\n        public String getEnvelopePic() {\n            return envelopePic;\n        }\n\n        public void setEnvelopePic(String envelopePic) {\n            this.envelopePic = envelopePic;\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 String getAuthor() {\n            return author;\n        }\n\n        public void setAuthor(String author) {\n            this.author = author;\n        }\n\n        public String getOrigin() {\n            return origin;\n        }\n\n        public void setOrigin(String origin) {\n            this.origin = origin;\n        }\n\n        public long getPublishTime() {\n            return publishTime;\n        }\n\n        public void setPublishTime(long publishTime) {\n            this.publishTime = publishTime;\n        }\n\n        public String getZan() {\n            return zan;\n        }\n\n        public void setZan(String zan) {\n            this.zan = zan;\n        }\n\n        public String getDesc() {\n            return desc;\n        }\n\n        public void setDesc(String desc) {\n            this.desc = desc;\n        }\n\n        public int getVisible() {\n            return visible;\n        }\n\n        public void setVisible(int visible) {\n            this.visible = visible;\n        }\n\n        public String getNiceDate() {\n            return niceDate;\n        }\n\n        public void setNiceDate(String niceDate) {\n            this.niceDate = niceDate;\n        }\n\n        public int getCourseId() {\n            return courseId;\n        }\n\n        public void setCourseId(int courseId) {\n            this.courseId = courseId;\n        }\n\n        public boolean isCollect() {\n            return collect;\n        }\n\n        public void setCollect(boolean collect) {\n            this.collect = collect;\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/lw/wanandroid/bean/Banner.java",
    "content": "package com.lw.wanandroid.bean;\n\n/**\n * Created by lw on 2018/1/19.\n */\n\npublic class Banner {\n    private int id;\n    private String url;\n    private String imagePath;\n    private String title;\n    private String desc;\n    private int isVisible;\n    private int order;\n    private int type;\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 getUrl() {\n        return url;\n    }\n\n    public void setUrl(String url) {\n        this.url = url;\n    }\n\n    public String getImagePath() {\n        return imagePath;\n    }\n\n    public void setImagePath(String imagePath) {\n        this.imagePath = imagePath;\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 getDesc() {\n        return desc;\n    }\n\n    public void setDesc(String desc) {\n        this.desc = desc;\n    }\n\n    public int getIsVisible() {\n        return isVisible;\n    }\n\n    public void setIsVisible(int isVisible) {\n        this.isVisible = isVisible;\n    }\n\n    public int getOrder() {\n        return order;\n    }\n\n    public void setOrder(int order) {\n        this.order = order;\n    }\n\n    public int getType() {\n        return type;\n    }\n\n    public void setType(int type) {\n        this.type = type;\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/lw/wanandroid/bean/DataResponse.java",
    "content": "package com.lw.wanandroid.bean;\n\n/**\n * Created by lw on 2018/1/19.\n */\n\npublic class DataResponse<T> {\n    private int errorCode;\n    private Object errorMsg;\n    private T data;\n\n    public int getErrorCode() {\n        return errorCode;\n    }\n\n    public void setErrorCode(int errorCode) {\n        this.errorCode = errorCode;\n    }\n\n    public Object getErrorMsg() {\n        return errorMsg;\n    }\n\n    public void setErrorMsg(Object errorMsg) {\n        this.errorMsg = errorMsg;\n    }\n\n    public T getData() {\n        return data;\n    }\n\n    public void setData(T data) {\n        this.data = data;\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/lw/wanandroid/bean/Friend.java",
    "content": "package com.lw.wanandroid.bean;\n\n/**\n * Created by lw on 2018/1/23.\n */\n\npublic class Friend {\n    private int id;\n    private String name;\n    private String link;\n    private int visible;\n    private int order;\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 getLink() {\n        return link;\n    }\n\n    public void setLink(String link) {\n        this.link = link;\n    }\n\n    public int getVisible() {\n        return visible;\n    }\n\n    public void setVisible(int visible) {\n        this.visible = visible;\n    }\n\n    public int getOrder() {\n        return order;\n    }\n\n    public void setOrder(int order) {\n        this.order = order;\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/lw/wanandroid/bean/HotKey.java",
    "content": "package com.lw.wanandroid.bean;\n\n/**\n * Created by lw on 2018/1/23.\n */\n\npublic class HotKey {\n    private int id;\n    private String name;\n    private String link;\n    private int visible;\n    private int order;\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 getLink() {\n        return link;\n    }\n\n    public void setLink(String link) {\n        this.link = link;\n    }\n\n    public int getVisible() {\n        return visible;\n    }\n\n    public void setVisible(int visible) {\n        this.visible = visible;\n    }\n\n    public int getOrder() {\n        return order;\n    }\n\n    public void setOrder(int order) {\n        this.order = order;\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/lw/wanandroid/bean/KnowledgeSystem.java",
    "content": "package com.lw.wanandroid.bean;\n\nimport android.content.Context;\n\nimport com.alibaba.android.arouter.facade.annotation.Route;\nimport com.alibaba.android.arouter.facade.service.SerializationService;\nimport com.lw.wanandroid.utils.GsonUtils;\n\nimport java.lang.reflect.Type;\nimport java.util.List;\n\n/**\n * Created by lw on 2018/1/22.\n */\n@Route(path = \"/service/json\")\npublic class KnowledgeSystem implements SerializationService {\n\n    private int id;\n    private String name;\n    private int courseId;\n    private int parentChapterId;\n    private int order;\n    private int visible;\n    private List<ChildrenBean> children;\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 int getCourseId() {\n        return courseId;\n    }\n\n    public void setCourseId(int courseId) {\n        this.courseId = courseId;\n    }\n\n    public int getParentChapterId() {\n        return parentChapterId;\n    }\n\n    public void setParentChapterId(int parentChapterId) {\n        this.parentChapterId = parentChapterId;\n    }\n\n    public int getOrder() {\n        return order;\n    }\n\n    public void setOrder(int order) {\n        this.order = order;\n    }\n\n    public int getVisible() {\n        return visible;\n    }\n\n    public void setVisible(int visible) {\n        this.visible = visible;\n    }\n\n    public List<ChildrenBean> getChildren() {\n        return children;\n    }\n\n    public void setChildren(List<ChildrenBean> children) {\n        this.children = children;\n    }\n\n    @Override\n    public <T> T json2Object(String input, Class<T> clazz) {\n        return GsonUtils.convertObj(input, clazz);\n    }\n\n    @Override\n    public String object2Json(Object instance) {\n        return GsonUtils.toJson(instance);\n    }\n\n    @Override\n    public <T> T parseObject(String input, Type clazz) {\n        return GsonUtils.convertObj(input, clazz);\n    }\n\n    @Override\n    public void init(Context context) {\n\n    }\n\n    public static class ChildrenBean implements SerializationService {\n        /**\n         * id : 60\n         * name : Android Studio相关\n         * courseId : 13\n         * parentChapterId : 150\n         * order : 1000\n         * visible : 1\n         * children : []\n         */\n\n        private int id;\n        private String name;\n        private int courseId;\n        private int parentChapterId;\n        private int order;\n        private int visible;\n        private List<ChildrenBean> children;\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 int getCourseId() {\n            return courseId;\n        }\n\n        public void setCourseId(int courseId) {\n            this.courseId = courseId;\n        }\n\n        public int getParentChapterId() {\n            return parentChapterId;\n        }\n\n        public void setParentChapterId(int parentChapterId) {\n            this.parentChapterId = parentChapterId;\n        }\n\n        public int getOrder() {\n            return order;\n        }\n\n        public void setOrder(int order) {\n            this.order = order;\n        }\n\n        public int getVisible() {\n            return visible;\n        }\n\n        public void setVisible(int visible) {\n            this.visible = visible;\n        }\n\n        public List<?> getChildren() {\n            return children;\n        }\n\n        public void setChildren(List<ChildrenBean> children) {\n            this.children = children;\n        }\n\n        @Override\n        public <T> T json2Object(String input, Class<T> clazz) {\n            return GsonUtils.convertObj(input, clazz);\n        }\n\n        @Override\n        public String object2Json(Object instance) {\n            return GsonUtils.toJson(instance);\n        }\n\n        @Override\n        public <T> T parseObject(String input, Type clazz) {\n            return GsonUtils.convertObj(input, clazz);\n        }\n\n        @Override\n        public void init(Context context) {\n\n        }\n\n        public ChildrenBean(int id, String name) {\n            this.id = id;\n            this.name = name;\n        }\n    }\n\n\n}\n"
  },
  {
    "path": "app/src/main/java/com/lw/wanandroid/bean/User.java",
    "content": "package com.lw.wanandroid.bean;\n\nimport java.util.List;\n\n/**\n * Created by lw on 2018/1/24.\n */\n\npublic class User {\n    private int id;\n    private String username;\n    private String password;\n    private String icon;\n    private int type;\n    private List<Integer> collectIds;\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 getUsername() {\n        return username;\n    }\n\n    public void setUsername(String username) {\n        this.username = username;\n    }\n\n    public String getPassword() {\n        return password;\n    }\n\n    public void setPassword(String password) {\n        this.password = password;\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 int getType() {\n        return type;\n    }\n\n    public void setType(int type) {\n        this.type = type;\n    }\n\n    public List<Integer> getCollectIds() {\n        return collectIds;\n    }\n\n    public void setCollectIds(List<Integer> collectIds) {\n        this.collectIds = collectIds;\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/lw/wanandroid/constant/Constant.java",
    "content": "package com.lw.wanandroid.constant;\n\n/**\n * Created by lw on 2018/1/19.\n */\n\npublic class Constant {\n    public static final String REQUEST_BASE_URL = \"http://wanandroid.com/\";\n\n    /**\n     * 每页数量\n     */\n    public static final int PAGE_SIZE = 20;\n    /**\n     * url key\n     */\n    public static final String CONTENT_URL_KEY = \"url\";\n    /**\n     * title key\n     */\n    public static final String CONTENT_TITLE_KEY = \"title\";\n    /**\n     * id key\n     */\n    public static final String CONTENT_ID_KEY = \"id\";\n    /**\n     * cid key\n     */\n    public static final String CONTENT_CID_KEY = \"cid\";\n    public static final String CONTENT_AUTHOR_KEY = \"author\";\n    /**\n     * childrenData key\n     */\n    public static final String CONTENT_CHILDREN_DATA_KEY = \"childrenData\";\n    /**\n     * hotFriend key\n     */\n    public static final String CONTENT_HOT_FRIEND_KEY = \"hotFriend\";\n    /**\n     * hot key\n     */\n    public static final String CONTENT_HOT_KEY = \"hotKey\";\n    /**\n     * hot key\n     */\n    public static final String CONTENT_HOT_NAME_KEY = \"hotNameKey\";\n\n    public static final String SAVE_USER_LOGIN_KEY = \"user/login\";\n    public static final String SAVE_USER_REGISTER_KEY = \"user/register\";\n    public static final String SET_COOKIE_KEY = \"set-cookie\";\n\n    public static final String SHARED_NAME = \"_preferences\";\n    public static final String USERNAME_KEY = \"username\";\n    public static final String PASSWORD_KEY = \"password\";\n    public static final String LOGIN_KEY = \"login\";\n    public static final String USER_KEY = \"user\";\n    public static final String BANNER_KEY = \"banner\";\n    public static final String ARTICLE_KEY = \"article\";\n}\n"
  },
  {
    "path": "app/src/main/java/com/lw/wanandroid/constant/LoadType.java",
    "content": "package com.lw.wanandroid.constant;\n\nimport android.support.annotation.IntDef;\n\nimport java.lang.annotation.Retention;\nimport java.lang.annotation.RetentionPolicy;\n\n/**\n * Created by lw on 2017-04-06.\n */\n\npublic class LoadType {\n    public static final int TYPE_REFRESH_SUCCESS = 1;\n    public static final int TYPE_REFRESH_ERROR = 2;\n    public static final int TYPE_LOAD_MORE_SUCCESS = 3;\n    public static final int TYPE_LOAD_MORE_ERROR = 4;\n\n    @IntDef({TYPE_REFRESH_SUCCESS, TYPE_REFRESH_ERROR, TYPE_LOAD_MORE_SUCCESS, TYPE_LOAD_MORE_ERROR})\n    @Retention(RetentionPolicy.SOURCE)\n    public @interface checker {\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/lw/wanandroid/db/AppDatabase.java",
    "content": "package com.lw.wanandroid.db;\n\nimport com.raizlabs.android.dbflow.annotation.Database;\n\n/**\n * Created by lw on 2018/2/2.\n */\n@Database(name = AppDatabase.NAME, version = AppDatabase.VERSION)\npublic class AppDatabase {\n    public static final String NAME = \"WanAndroid-db\";\n\n    public static final int VERSION = 1;\n}\n"
  },
  {
    "path": "app/src/main/java/com/lw/wanandroid/db/HistoryModel.java",
    "content": "package com.lw.wanandroid.db;\n\nimport com.raizlabs.android.dbflow.annotation.Column;\nimport com.raizlabs.android.dbflow.annotation.PrimaryKey;\nimport com.raizlabs.android.dbflow.annotation.Table;\nimport com.raizlabs.android.dbflow.structure.BaseModel;\n\nimport java.util.Date;\n\n/**\n * Created by lw on 2018/2/2.\n */\n@Table(database = AppDatabase.class)\npublic class HistoryModel extends BaseModel {\n    @PrimaryKey(autoincrement = true)\n    private long id;\n    @Column\n    private String name;\n    @Column\n    private Date date;\n\n    public long getId() {\n        return id;\n    }\n\n    public void setId(long 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 Date getDate() {\n        return date;\n    }\n\n    public void setDate(Date date) {\n        this.date = date;\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/lw/wanandroid/di/component/ActivityComponent.java",
    "content": "package com.lw.wanandroid.di.component;\n\nimport android.app.Activity;\nimport android.content.Context;\n\nimport com.lw.wanandroid.di.module.ActivityModule;\nimport com.lw.wanandroid.di.scope.ContextLife;\nimport com.lw.wanandroid.di.scope.PerActivity;\nimport com.lw.wanandroid.ui.article.ArticleContentActivity;\nimport com.lw.wanandroid.ui.hotsearch.SearchActivity;\nimport com.lw.wanandroid.ui.my.LoginActivity;\nimport com.lw.wanandroid.ui.my.MyBookmarkActivity;\nimport com.lw.wanandroid.ui.my.MyCollectionActivity;\n\nimport dagger.Component;\n\n/**\n * Created by lw on 2017/1/19.\n */\n@PerActivity\n@Component(dependencies = ApplicationComponent.class, modules = ActivityModule.class)\npublic interface ActivityComponent {\n\n    @ContextLife(\"Activity\")\n    Context getActivityContext();\n\n    @ContextLife(\"Application\")\n    Context getApplicationContext();\n\n    Activity getActivity();\n\n    void inject(SearchActivity activity);\n\n    void inject(LoginActivity activity);\n\n    void inject(ArticleContentActivity activity);\n\n    void inject(MyCollectionActivity activity);\n\n    void inject(MyBookmarkActivity activity);\n}\n"
  },
  {
    "path": "app/src/main/java/com/lw/wanandroid/di/component/ApplicationComponent.java",
    "content": "package com.lw.wanandroid.di.component;\n\nimport android.content.Context;\n\nimport com.lw.wanandroid.di.module.ApplicationModule;\nimport com.lw.wanandroid.di.scope.ContextLife;\nimport com.lw.wanandroid.di.scope.PerApp;\n\nimport dagger.Component;\n\n\n/**\n * Created by lw on 2017/1/19.\n */\n@PerApp\n@Component(modules = ApplicationModule.class)\npublic interface ApplicationComponent {\n    @ContextLife(\"Application\")\n    Context getApplication();\n}"
  },
  {
    "path": "app/src/main/java/com/lw/wanandroid/di/component/FragmentComponent.java",
    "content": "package com.lw.wanandroid.di.component;\n\nimport android.app.Activity;\nimport android.content.Context;\n\nimport com.lw.wanandroid.di.module.FragmentModule;\nimport com.lw.wanandroid.di.scope.ContextLife;\nimport com.lw.wanandroid.di.scope.PerFragment;\nimport com.lw.wanandroid.ui.article.ArticleListFragment;\nimport com.lw.wanandroid.ui.home.HomeFragment;\nimport com.lw.wanandroid.ui.hotsearch.HotFragment;\nimport com.lw.wanandroid.ui.knowledgesystem.KnowledgeSystemFragment;\nimport com.lw.wanandroid.ui.my.MyFragment;\n\nimport dagger.Component;\n\n/**\n * Created by lw on 2017/1/19.\n */\n@PerFragment\n@Component(dependencies = ApplicationComponent.class, modules = FragmentModule.class)\npublic interface FragmentComponent {\n    @ContextLife(\"Activity\")\n    Context getActivityContext();\n\n    @ContextLife(\"Application\")\n    Context getApplicationContext();\n\n    Activity getActivity();\n\n    void inject(HomeFragment fragment);\n\n    void inject(KnowledgeSystemFragment fragment);\n\n    void inject(MyFragment fragment);\n\n    void inject(ArticleListFragment fragment);\n\n    void inject(HotFragment fragment);\n}\n"
  },
  {
    "path": "app/src/main/java/com/lw/wanandroid/di/component/ServiceComponent.java",
    "content": "package com.lw.wanandroid.di.component;\n\nimport android.content.Context;\n\nimport com.lw.wanandroid.di.module.ServiceModule;\nimport com.lw.wanandroid.di.scope.ContextLife;\nimport com.lw.wanandroid.di.scope.PerService;\n\nimport dagger.Component;\n\n\n/**\n * Created by lw on 2017/1/19.\n */\n@PerService\n@Component(dependencies = ApplicationComponent.class, modules = ServiceModule.class)\npublic interface ServiceComponent {\n    @ContextLife(\"Service\")\n    Context getServiceContext();\n\n    @ContextLife(\"Application\")\n    Context getApplicationContext();\n}\n"
  },
  {
    "path": "app/src/main/java/com/lw/wanandroid/di/module/ActivityModule.java",
    "content": "package com.lw.wanandroid.di.module;\n\nimport android.app.Activity;\nimport android.content.Context;\n\nimport com.lw.wanandroid.di.scope.ContextLife;\nimport com.lw.wanandroid.di.scope.PerActivity;\n\nimport dagger.Module;\nimport dagger.Provides;\n\n/**\n * Created by lw on 2017/1/19.\n */\n@Module\npublic class ActivityModule {\n    private Activity mActivity;\n\n    public ActivityModule(Activity activity) {\n        mActivity = activity;\n    }\n\n    @Provides\n    @PerActivity\n    @ContextLife(\"Activity\")\n    public Context provideActivityContext() {\n        return mActivity;\n    }\n\n    @Provides\n    @PerActivity\n    public Activity provideActivity() {\n        return mActivity;\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/lw/wanandroid/di/module/ApplicationModule.java",
    "content": "package com.lw.wanandroid.di.module;\n\nimport android.content.Context;\n\nimport com.lw.wanandroid.base.App;\nimport com.lw.wanandroid.di.scope.ContextLife;\nimport com.lw.wanandroid.di.scope.PerApp;\n\nimport dagger.Module;\nimport dagger.Provides;\n\n\n/**\n * Created by lw on 2017/1/19.\n */\n@Module\npublic class ApplicationModule {\n    private App mApplication;\n\n    public ApplicationModule(App application) {\n        mApplication = application;\n    }\n\n    @Provides\n    @PerApp\n    @ContextLife(\"Application\")\n    public Context provideApplicationContext() {\n        return mApplication.getApplicationContext();\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/lw/wanandroid/di/module/FragmentModule.java",
    "content": "package com.lw.wanandroid.di.module;\n\nimport android.app.Activity;\nimport android.content.Context;\nimport android.support.v4.app.Fragment;\n\nimport com.lw.wanandroid.di.scope.ContextLife;\nimport com.lw.wanandroid.di.scope.PerFragment;\n\nimport dagger.Module;\nimport dagger.Provides;\n\n/**\n * Created by lw on 2017/1/19.\n */\n@Module\npublic class FragmentModule {\n    private Fragment mFragment;\n\n    public FragmentModule(Fragment fragment) {\n        mFragment = fragment;\n    }\n\n    @Provides\n    @PerFragment\n    @ContextLife(\"Activity\")\n    public Context provideActivityContext() {\n        return mFragment.getActivity();\n    }\n\n    @Provides\n    @PerFragment\n    public Activity provideActivity() {\n        return mFragment.getActivity();\n    }\n\n    @Provides\n    @PerFragment\n    public Fragment provideFragment() {\n        return mFragment;\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/lw/wanandroid/di/module/ServiceModule.java",
    "content": "package com.lw.wanandroid.di.module;\n\nimport android.app.Service;\nimport android.content.Context;\n\nimport com.lw.wanandroid.di.scope.ContextLife;\nimport com.lw.wanandroid.di.scope.PerService;\n\nimport dagger.Module;\nimport dagger.Provides;\n\n/**\n * Created by lw on 2017/1/19.\n */\n@Module\npublic class ServiceModule {\n    private Service mService;\n\n    public ServiceModule(Service service) {\n        mService = service;\n    }\n\n    @Provides\n    @PerService\n    @ContextLife(\"Service\")\n    public Context ProvideServiceContext() {\n        return mService;\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/lw/wanandroid/di/scope/ContextLife.java",
    "content": "package com.lw.wanandroid.di.scope;\n\nimport java.lang.annotation.Documented;\nimport java.lang.annotation.Retention;\nimport java.lang.annotation.RetentionPolicy;\n\nimport javax.inject.Qualifier;\n\n/**\n * Created by lw on 2017/1/19.\n */\n@Qualifier\n@Documented\n@Retention(RetentionPolicy.RUNTIME)\npublic @interface ContextLife {\n    String value() default \"Application\";\n}\n"
  },
  {
    "path": "app/src/main/java/com/lw/wanandroid/di/scope/PerActivity.java",
    "content": "package com.lw.wanandroid.di.scope;\n\nimport java.lang.annotation.Documented;\nimport java.lang.annotation.Retention;\nimport java.lang.annotation.RetentionPolicy;\n\nimport javax.inject.Scope;\n\n/**\n * Created by lw on 2017/1/19.\n */\n@Scope\n@Documented\n@Retention(RetentionPolicy.RUNTIME)\npublic @interface PerActivity {\n}\n"
  },
  {
    "path": "app/src/main/java/com/lw/wanandroid/di/scope/PerApp.java",
    "content": "package com.lw.wanandroid.di.scope;\n\nimport java.lang.annotation.Documented;\nimport java.lang.annotation.Retention;\nimport java.lang.annotation.RetentionPolicy;\n\nimport javax.inject.Scope;\n\n/**\n * Created by lw on 2017/1/19.\n */\n@Scope\n@Documented\n@Retention(RetentionPolicy.RUNTIME)\npublic @interface PerApp {\n}\n"
  },
  {
    "path": "app/src/main/java/com/lw/wanandroid/di/scope/PerFragment.java",
    "content": "package com.lw.wanandroid.di.scope;\n\nimport java.lang.annotation.Documented;\nimport java.lang.annotation.Retention;\nimport java.lang.annotation.RetentionPolicy;\n\nimport javax.inject.Scope;\n\n/**\n * Created by lw on 2017/1/19.\n */\n@Scope\n@Documented\n@Retention(RetentionPolicy.RUNTIME)\npublic @interface PerFragment {\n}\n"
  },
  {
    "path": "app/src/main/java/com/lw/wanandroid/di/scope/PerService.java",
    "content": "package com.lw.wanandroid.di.scope;\n\nimport java.lang.annotation.Documented;\nimport java.lang.annotation.Retention;\nimport java.lang.annotation.RetentionPolicy;\n\nimport javax.inject.Scope;\n\n/**\n * Created by lw on 2017/1/19.\n */\n@Scope\n@Documented\n@Retention(RetentionPolicy.RUNTIME)\npublic @interface PerService {\n}\n"
  },
  {
    "path": "app/src/main/java/com/lw/wanandroid/event/LoginEvent.java",
    "content": "package com.lw.wanandroid.event;\n\n/**\n * Created by lw on 2018/1/25.\n */\n\npublic class LoginEvent {\n}\n"
  },
  {
    "path": "app/src/main/java/com/lw/wanandroid/net/ApiService.java",
    "content": "package com.lw.wanandroid.net;\n\nimport com.lw.wanandroid.bean.Article;\nimport com.lw.wanandroid.bean.Banner;\nimport com.lw.wanandroid.bean.DataResponse;\nimport com.lw.wanandroid.bean.Friend;\nimport com.lw.wanandroid.bean.HotKey;\nimport com.lw.wanandroid.bean.KnowledgeSystem;\nimport com.lw.wanandroid.bean.User;\n\nimport java.util.List;\n\nimport io.reactivex.Observable;\nimport retrofit2.http.Field;\nimport retrofit2.http.FormUrlEncoded;\nimport retrofit2.http.GET;\nimport retrofit2.http.POST;\nimport retrofit2.http.Path;\nimport retrofit2.http.Query;\n\n/**\n * Created by lw on 2018/1/23.\n */\n\npublic interface ApiService {\n    /**\n     * 首页数据\n     * http://www.wanandroid.com/article/list/0/json\n     *\n     * @param page page\n     */\n    @GET(\"/article/list/{page}/json\")\n    Observable<DataResponse<Article>> getHomeArticles(@Path(\"page\") int page);\n\n    /**\n     * 首页Banner\n     *\n     * @return BannerResponse\n     */\n    @GET(\"/banner/json\")\n    Observable<DataResponse<List<Banner>>> getHomeBanners();\n\n    /**\n     * 知识体系\n     * http://www.wanandroid.com/tree/json\n     *\n     * @return BannerResponse\n     */\n    @GET(\"/tree/json\")\n    Observable<DataResponse<List<KnowledgeSystem>>> getKnowledgeSystems();\n\n    /**\n     * 知识体系下的文章\n     * http://www.wanandroid.com/article/list/0/json?cid=168\n     *\n     * @param page page\n     * @param cid  cid\n     */\n    @GET(\"/article/list/{page}/json\")\n    Observable<DataResponse<Article>> getKnowledgeSystemArticles(@Path(\"page\") int page, @Query(\"cid\") int cid);\n\n\n    /**\n     * 常用网站\n     * http://www.wanandroid.com/friend/json\n     */\n    @GET(\"/friend/json\")\n    Observable<DataResponse<List<Friend>>> getHotFriends();\n\n    /**\n     * 大家都在搜\n     * http://www.wanandroid.com/hotkey/json\n     */\n    @GET(\"/hotkey/json\")\n    Observable<DataResponse<List<HotKey>>> getHotKeys();\n\n    /**\n     * 搜索\n     * http://www.wanandroid.com/article/query/0/json\n     *\n     * @param page page\n     * @param k    POST search key\n     */\n    @POST(\"/article/query/{page}/json\")\n    @FormUrlEncoded\n    Observable<DataResponse<Article>> getSearchArticles(@Path(\"page\") int page, @Field(\"k\") String k);\n\n\n    /**\n     * 登录\n     *\n     * @param username username\n     * @param password password\n     * @return Deferred<User>\n     */\n    @POST(\"/user/login\")\n    @FormUrlEncoded\n    Observable<DataResponse<User>> login(@Field(\"username\") String username, @Field(\"password\") String password);\n\n    /**\n     * 注册\n     *\n     * @param username   username\n     * @param password   password\n     * @param repassword repassword\n     * @return Deferred<User>\n     */\n    @POST(\"/user/register\")\n    @FormUrlEncoded\n    Observable<DataResponse<User>> register(@Field(\"username\") String username, @Field(\"password\") String password, @Field(\"repassword\") String repassword);\n\n    /**\n     * 收藏文章\n     *\n     * @param id id\n     * @return Deferred<DataResponse>\n     */\n    @POST(\"/lg/collect/{id}/json\")\n    Observable<DataResponse> addCollectArticle(@Path(\"id\") int id);\n\n    /**\n     * 收藏站外文章\n     *\n     * @param title  title\n     * @param author author\n     * @param link   link\n     * @return Deferred<DataResponse>\n     */\n    @POST(\"/lg/collect/add/json\")\n    @FormUrlEncoded\n    Observable<DataResponse> addCollectOutsideArticle(@Field(\"title\") String title, @Field(\"author\") String author, @Field(\"link\") String link);\n\n    /**\n     * 删除收藏文章\n     *\n     * @param id       id\n     * @param originId -1\n     * @return Deferred<DataResponse>\n     */\n    @POST(\"/lg/uncollect/{id}/json\")\n    @FormUrlEncoded\n    Observable<DataResponse> removeCollectArticle(@Path(\"id\") int id, @Field(\"originId\") int originId);\n\n\n    /**\n     * 获取自己收藏的文章列表\n     *\n     * @param page page\n     * @return Deferred<Article>\n     */\n    @GET(\"/lg/collect/list/{page}/json\")\n    Observable<DataResponse<Article>> getCollectArticles(@Path(\"page\") int page);\n\n    /**\n     * 我的书签\n     * http://www.wanandroid.com/lg/collect/usertools/json\n     */\n    @GET(\"/lg/collect/usertools/json\")\n    Observable<DataResponse<List<Friend>>> getBookmarks();\n\n    /**\n     * 编辑书签\n     * http://www.wanandroid.com/lg/collect/updatetool/json\n     */\n    @POST(\"/lg/collect/usertools/json\")\n    @FormUrlEncoded\n    Observable<DataResponse> editBookmark(@Field(\"id\") int id, @Field(\"name\") String name, @Field(\"link\") String link);\n\n    /**\n     * 删除书签\n     * http://www.wanandroid.com/lg/collect/deletetool/json\n     */\n    @POST(\"/lg/collect/usertools/json\")\n    @FormUrlEncoded\n    Observable<DataResponse> delBookmark(@Field(\"id\") int id);\n}\n"
  },
  {
    "path": "app/src/main/java/com/lw/wanandroid/net/CookiesManager.java",
    "content": "package com.lw.wanandroid.net;\n\nimport java.util.List;\n\nimport okhttp3.Cookie;\nimport okhttp3.CookieJar;\nimport okhttp3.HttpUrl;\n\n/**\n * Created by lw on 2018/1/25.\n */\n\npublic class CookiesManager implements CookieJar {\n\n    private static final PersistentCookieStore cookieStore = new PersistentCookieStore();\n\n    @Override\n    public void saveFromResponse(HttpUrl url, List<Cookie> cookies) {\n        if (cookies != null && cookies.size() > 0) {\n            for (Cookie item : cookies) {\n                cookieStore.add(url, item);\n            }\n        }\n    }\n\n    @Override\n    public List<Cookie> loadForRequest(HttpUrl url) {\n        List<Cookie> cookies = cookieStore.get(url);\n        return cookies;\n    }\n\n    /**\n     * 清除所有cookie\n     */\n    public static void clearAllCookies() {\n        cookieStore.removeAll();\n    }\n\n    /**\n     * 清除指定cookie\n     *\n     * @param url\n     * @param cookie\n     * @return\n     */\n    public static boolean clearCookies(HttpUrl url, Cookie cookie) {\n        return cookieStore.remove(url, cookie);\n    }\n\n    /**\n     * 获取cookies\n     *\n     * @return\n     */\n    public static List<Cookie> getCookies() {\n        return cookieStore.getCookies();\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/lw/wanandroid/net/OkHttpCookies.java",
    "content": "package com.lw.wanandroid.net;\n\nimport java.io.IOException;\nimport java.io.ObjectInputStream;\nimport java.io.ObjectOutputStream;\nimport java.io.Serializable;\n\nimport okhttp3.Cookie;\n\n/**\n * Created by lw on 2018/1/25.\n */\n\npublic class OkHttpCookies implements Serializable {\n    private transient final Cookie cookies;\n    private transient Cookie clientCookies;\n\n    public OkHttpCookies(Cookie cookies) {\n        this.cookies = cookies;\n    }\n\n    public Cookie getCookies() {\n        Cookie bestCookies = cookies;\n        if (clientCookies != null) {\n            bestCookies = clientCookies;\n        }\n        return bestCookies;\n    }\n\n    private void writeObject(ObjectOutputStream out) throws IOException {\n        out.writeObject(cookies.name());\n        out.writeObject(cookies.value());\n        out.writeLong(cookies.expiresAt());\n        out.writeObject(cookies.domain());\n        out.writeObject(cookies.path());\n        out.writeBoolean(cookies.secure());\n        out.writeBoolean(cookies.httpOnly());\n        out.writeBoolean(cookies.hostOnly());\n        out.writeBoolean(cookies.persistent());\n    }\n\n    private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException {\n        String name = (String) in.readObject();\n        String value = (String) in.readObject();\n        long expiresAt = in.readLong();\n        String domain = (String) in.readObject();\n        String path = (String) in.readObject();\n        boolean secure = in.readBoolean();\n        boolean httpOnly = in.readBoolean();\n        boolean hostOnly = in.readBoolean();\n        boolean persistent = in.readBoolean();\n        Cookie.Builder builder = new Cookie.Builder();\n        builder = builder.name(name);\n        builder = builder.value(value);\n        builder = builder.expiresAt(expiresAt);\n        builder = hostOnly ? builder.hostOnlyDomain(domain) : builder.domain(domain);\n        builder = builder.path(path);\n        builder = secure ? builder.secure() : builder;\n        builder = httpOnly ? builder.httpOnly() : builder;\n        clientCookies = builder.build();\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/lw/wanandroid/net/PersistentCookieStore.java",
    "content": "package com.lw.wanandroid.net;\n\nimport android.content.SharedPreferences;\nimport android.text.TextUtils;\nimport android.util.Log;\n\nimport com.lw.wanandroid.base.App;\n\nimport java.io.ByteArrayInputStream;\nimport java.io.ByteArrayOutputStream;\nimport java.io.IOException;\nimport java.io.ObjectInputStream;\nimport java.io.ObjectOutputStream;\nimport java.util.ArrayList;\nimport java.util.HashMap;\nimport java.util.List;\nimport java.util.Locale;\nimport java.util.Map;\nimport java.util.concurrent.ConcurrentHashMap;\n\nimport okhttp3.Cookie;\nimport okhttp3.HttpUrl;\n\n/**\n * Created by lw on 2018/1/25.\n */\n\npublic class PersistentCookieStore {\n    private static final String LOG_TAG = \"PersistentCookieStore\";\n    private static final String COOKIE_PREFS = \"Cookies_Prefs\";\n    private final Map<String, ConcurrentHashMap<String, Cookie>> cookies;\n    private final SharedPreferences cookiePrefs;\n\n    public PersistentCookieStore() {\n        cookiePrefs = App.getAppContext().getSharedPreferences(COOKIE_PREFS, 0);\n        cookies = new HashMap<>();\n\n        //将持久化的cookies缓存到内存中 即map cookies\n        Map<String, ?> prefsMap = cookiePrefs.getAll();\n        for (Map.Entry<String, ?> entry : prefsMap.entrySet()) {\n            String[] cookieNames = TextUtils.split((String) entry.getValue(), \",\");\n            for (String name : cookieNames) {\n                String encodedCookie = cookiePrefs.getString(name, null);\n                if (encodedCookie != null) {\n                    Cookie decodedCookie = decodeCookie(encodedCookie);\n                    if (decodedCookie != null) {\n                        if (!cookies.containsKey(entry.getKey())) {\n                            cookies.put(entry.getKey(), new ConcurrentHashMap<String, Cookie>());\n                        }\n                        cookies.get(entry.getKey()).put(name, decodedCookie);\n                    }\n                }\n            }\n        }\n    }\n\n    protected String getCookieToken(Cookie cookie) {\n        return cookie.name() + \"@\" + cookie.domain();\n    }\n\n    public void add(HttpUrl url, Cookie cookie) {\n        String name = getCookieToken(cookie);\n\n        //将cookies缓存到内存中 如果缓存过期 就重置此cookie\n        if (!cookie.persistent()) {\n            if (!cookies.containsKey(url.host())) {\n                cookies.put(url.host(), new ConcurrentHashMap<String, Cookie>());\n            }\n            cookies.get(url.host()).put(name, cookie);\n        } else {\n            if (cookies.containsKey(url.host())) {\n                cookies.get(url.host()).remove(name);\n            }\n        }\n\n        //讲cookies持久化到本地\n        SharedPreferences.Editor prefsWriter = cookiePrefs.edit();\n        prefsWriter.putString(url.host(), TextUtils.join(\",\", cookies.get(url.host()).keySet()));\n        prefsWriter.putString(name, encodeCookie(new OkHttpCookies(cookie)));\n        prefsWriter.apply();\n    }\n\n    public List<Cookie> get(HttpUrl url) {\n        ArrayList<Cookie> ret = new ArrayList<>();\n        if (cookies.containsKey(url.host()))\n            ret.addAll(cookies.get(url.host()).values());\n        return ret;\n    }\n\n    public boolean removeAll() {\n        SharedPreferences.Editor prefsWriter = cookiePrefs.edit();\n        prefsWriter.clear();\n        prefsWriter.apply();\n        cookies.clear();\n        return true;\n    }\n\n    public boolean remove(HttpUrl url, Cookie cookie) {\n        String name = getCookieToken(cookie);\n\n        if (cookies.containsKey(url.host()) && cookies.get(url.host()).containsKey(name)) {\n            cookies.get(url.host()).remove(name);\n\n            SharedPreferences.Editor prefsWriter = cookiePrefs.edit();\n            if (cookiePrefs.contains(name)) {\n                prefsWriter.remove(name);\n            }\n            prefsWriter.putString(url.host(), TextUtils.join(\",\", cookies.get(url.host()).keySet()));\n            prefsWriter.apply();\n\n            return true;\n        } else {\n            return false;\n        }\n    }\n\n    public List<Cookie> getCookies() {\n        ArrayList<Cookie> ret = new ArrayList<>();\n        for (String key : cookies.keySet())\n            ret.addAll(cookies.get(key).values());\n\n        return ret;\n    }\n\n    /**\n     * cookies 序列化成 string\n     *\n     * @param cookie 要序列化的cookie\n     * @return 序列化之后的string\n     */\n    protected String encodeCookie(OkHttpCookies cookie) {\n        if (cookie == null)\n            return null;\n        ByteArrayOutputStream os = new ByteArrayOutputStream();\n        try {\n            ObjectOutputStream outputStream = new ObjectOutputStream(os);\n            outputStream.writeObject(cookie);\n        } catch (IOException e) {\n            Log.d(LOG_TAG, \"IOException in encodeCookie\", e);\n            return null;\n        }\n\n        return byteArrayToHexString(os.toByteArray());\n    }\n\n    /**\n     * 将字符串反序列化成cookies\n     *\n     * @param cookieString cookies string\n     * @return cookie object\n     */\n    protected Cookie decodeCookie(String cookieString) {\n        byte[] bytes = hexStringToByteArray(cookieString);\n        ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(bytes);\n        Cookie cookie = null;\n        try {\n            ObjectInputStream objectInputStream = new ObjectInputStream(byteArrayInputStream);\n            cookie = ((OkHttpCookies) objectInputStream.readObject()).getCookies();\n        } catch (IOException e) {\n            Log.d(LOG_TAG, \"IOException in decodeCookie\", e);\n        } catch (ClassNotFoundException e) {\n            Log.d(LOG_TAG, \"ClassNotFoundException in decodeCookie\", e);\n        }\n\n        return cookie;\n    }\n\n    /**\n     * 二进制数组转十六进制字符串\n     *\n     * @param bytes byte array to be converted\n     * @return string containing hex values\n     */\n    protected String byteArrayToHexString(byte[] bytes) {\n        StringBuilder sb = new StringBuilder(bytes.length * 2);\n        for (byte element : bytes) {\n            int v = element & 0xff;\n            if (v < 16) {\n                sb.append('0');\n            }\n            sb.append(Integer.toHexString(v));\n        }\n        return sb.toString().toUpperCase(Locale.US);\n    }\n\n    /**\n     * 十六进制字符串转二进制数组\n     *\n     * @param hexString string of hex-encoded values\n     * @return decoded byte array\n     */\n    protected byte[] hexStringToByteArray(String hexString) {\n        int len = hexString.length();\n        byte[] data = new byte[len / 2];\n        for (int i = 0; i < len; i += 2) {\n            data[i / 2] = (byte) ((Character.digit(hexString.charAt(i), 16) << 4) + Character.digit(hexString.charAt(i + 1), 16));\n        }\n        return data;\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/lw/wanandroid/net/RetrofitManager.java",
    "content": "package com.lw.wanandroid.net;\n\nimport com.blankj.utilcode.util.NetworkUtils;\nimport com.lw.wanandroid.base.App;\nimport com.lw.wanandroid.constant.Constant;\n\nimport java.io.File;\nimport java.io.IOException;\nimport java.util.concurrent.TimeUnit;\n\nimport okhttp3.Cache;\nimport okhttp3.CacheControl;\nimport okhttp3.Interceptor;\nimport okhttp3.OkHttpClient;\nimport okhttp3.Request;\nimport okhttp3.Response;\nimport retrofit2.Retrofit;\nimport retrofit2.adapter.rxjava2.RxJava2CallAdapterFactory;\nimport retrofit2.converter.gson.GsonConverterFactory;\n\n/**\n * Created by lw on 2017-04-01.\n */\n\npublic class RetrofitManager {\n    private static long CONNECT_TIMEOUT = 60L;\n    private static long READ_TIMEOUT = 10L;\n    private static long WRITE_TIMEOUT = 10L;\n    //设缓存有效期为1天\n    private static final long CACHE_STALE_SEC = 60 * 60 * 24 * 1;\n    //查询缓存的Cache-Control设置，为if-only-cache时只查询缓存而不会请求服务器，max-stale可以配合设置缓存失效时间\n    public static final String CACHE_CONTROL_CACHE = \"only-if-cached, max-stale=\" + CACHE_STALE_SEC;\n    //查询网络的Cache-Control设置\n    //(假如请求了服务器并在a时刻返回响应结果，则在max-age规定的秒数内，浏览器将不会发送对应的请求到服务器，数据由缓存直接返回)\n    public static final String CACHE_CONTROL_NETWORK = \"Cache-Control: public, max-age=10\";\n    // 避免出现 HTTP 403 Forbidden，参考：http://stackoverflow.com/questions/13670692/403-forbidden-with-java-but-not-web-browser\n    private static final String AVOID_HTTP403_FORBIDDEN = \"User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.95 Safari/537.11\";\n    private static volatile OkHttpClient mOkHttpClient;\n\n    /**\n     * 云端响应头拦截器，用来配置缓存策略\n     * Dangerous interceptor that rewrites the server's cache-control header.\n     */\n    private static final Interceptor mRewriteCacheControlInterceptor = new Interceptor() {\n        @Override\n        public Response intercept(Chain chain) throws IOException {\n            Request request = chain.request();\n            if (!NetworkUtils.isConnected()) {\n                request = request.newBuilder()\n                        .cacheControl(CacheControl.FORCE_CACHE)\n                        .build();\n            }\n            Response originalResponse = chain.proceed(request);\n            if (NetworkUtils.isConnected()) {\n                //有网的时候读接口上的@Headers里的配置，可以在这里进行统一的设置\n                String cacheControl = request.cacheControl().toString();\n                return originalResponse.newBuilder()\n                        .header(\"Cache-Control\", cacheControl)\n                        .removeHeader(\"Pragma\")\n                        .build();\n            } else {\n                return originalResponse.newBuilder()\n                        .header(\"Cache-Control\", \"public, only-if-cached, max-stale=\" + CACHE_CONTROL_CACHE)\n                        .removeHeader(\"Pragma\")\n                        .build();\n            }\n        }\n    };\n\n    /**\n     * 日志拦截器\n     */\n    private static final Interceptor mLoggingInterceptor = new Interceptor() {\n        @Override\n        public Response intercept(Chain chain) throws IOException {\n            Request request = chain.request();\n            Response response = chain.proceed(request);\n            return response;\n        }\n    };\n\n    /**\n     * 获取OkHttpClient实例\n     *\n     * @return\n     */\n    private static OkHttpClient getOkHttpClient() {\n        if (mOkHttpClient == null) {\n            synchronized (RetrofitManager.class) {\n                Cache cache = new Cache(new File(App.getAppContext().getCacheDir(), \"HttpCache\"), 1024 * 1024 * 100);\n                if (mOkHttpClient == null) {\n                    mOkHttpClient = new OkHttpClient.Builder().cache(cache)\n                            .connectTimeout(CONNECT_TIMEOUT, TimeUnit.SECONDS)\n                            .readTimeout(READ_TIMEOUT, TimeUnit.SECONDS)\n                            .writeTimeout(WRITE_TIMEOUT, TimeUnit.SECONDS)\n                            .addInterceptor(mRewriteCacheControlInterceptor)\n                            .addInterceptor(mLoggingInterceptor)\n                            .cookieJar(new CookiesManager())\n                            .build();\n                }\n            }\n        }\n        return mOkHttpClient;\n    }\n\n\n    /**\n     * 获取Service\n     *\n     * @param clazz\n     * @param <T>\n     * @return\n     */\n    public static <T> T create(Class<T> clazz) {\n        Retrofit retrofit = new Retrofit.Builder().baseUrl(Constant.REQUEST_BASE_URL)\n                .client(getOkHttpClient())\n                .addConverterFactory(GsonConverterFactory.create())\n                .addCallAdapterFactory(RxJava2CallAdapterFactory.create()).build();\n        return retrofit.create(clazz);\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/lw/wanandroid/ui/article/ArticleAdapter.java",
    "content": "package com.lw.wanandroid.ui.article;\n\nimport android.text.Html;\n\nimport com.chad.library.adapter.base.BaseQuickAdapter;\nimport com.chad.library.adapter.base.BaseViewHolder;\nimport com.lw.wanandroid.R;\nimport com.lw.wanandroid.bean.Article;\n\nimport javax.inject.Inject;\n\n/**\n * Created by lw on 2018/1/19.\n */\n\npublic class ArticleAdapter extends BaseQuickAdapter<Article.DatasBean, BaseViewHolder> {\n    private boolean mChapterNameVisible = true;\n    private boolean mIsMyColection = false;\n\n    @Inject\n    public ArticleAdapter() {\n        super(R.layout.item_article, null);\n    }\n\n    @Override\n    protected void convert(BaseViewHolder helper, Article.DatasBean item) {\n        helper.setText(R.id.tvAuthor, item.getAuthor());\n        helper.setText(R.id.tvNiceDate, item.getNiceDate());\n        helper.setText(R.id.tvTitle, Html.fromHtml(item.getTitle()));\n        helper.setText(R.id.tvChapterName, item.getChapterName());\n        if (mIsMyColection) item.setCollect(mIsMyColection);\n        helper.setImageResource(R.id.ivCollect, item.isCollect()\n                ? R.drawable.ic_action_like : R.drawable.ic_action_no_like);\n        helper.addOnClickListener(R.id.tvChapterName);\n        helper.addOnClickListener(R.id.ivCollect);\n        helper.setVisible(R.id.tvChapterName, mChapterNameVisible);\n    }\n\n    public void setChapterNameVisible(boolean chapterNameVisible) {\n        this.mChapterNameVisible = chapterNameVisible;\n    }\n\n    public void isMyColection(boolean isMyColection) {\n        this.mIsMyColection = isMyColection;\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/lw/wanandroid/ui/article/ArticleContentActivity.java",
    "content": "package com.lw.wanandroid.ui.article;\n\nimport android.content.Intent;\nimport android.net.Uri;\nimport android.view.Menu;\nimport android.view.MenuItem;\nimport android.webkit.WebView;\nimport android.widget.FrameLayout;\nimport android.widget.LinearLayout;\n\nimport com.alibaba.android.arouter.facade.annotation.Autowired;\nimport com.alibaba.android.arouter.facade.annotation.Route;\nimport com.alibaba.android.arouter.launcher.ARouter;\nimport com.just.agentweb.AgentWeb;\nimport com.just.agentweb.ChromeClientCallbackManager;\nimport com.lw.wanandroid.R;\nimport com.lw.wanandroid.base.BaseActivity;\nimport com.lw.wanandroid.constant.Constant;\n\nimport butterknife.BindView;\n\n/**\n * Created by lw on 2018/1/22.\n */\n@Route(path = \"/article/ArticleContentActivity\")\npublic class ArticleContentActivity extends BaseActivity<ArticleContentPresenter> implements ArticleContentContract.View {\n    @Autowired\n    public int id;\n    @Autowired\n    public String url;\n    @Autowired\n    public String title;\n    @Autowired\n    public String author;\n    @BindView(R.id.webContent)\n    FrameLayout mWebContent;\n\n    @Override\n    protected int getLayoutId() {\n        return R.layout.activity_article_content;\n    }\n\n    @Override\n    protected void initInjector() {\n        mActivityComponent.inject(this);\n    }\n\n    @Override\n    protected void initView() {\n        AgentWeb.with(this)//传入Activity or Fragment\n                .setAgentWebParent(mWebContent, new LinearLayout.LayoutParams(-1, -1))//传入AgentWeb 的父控件 ，如果父控件为 RelativeLayout ， 那么第二参数需要传入 RelativeLayout.LayoutParams ,第一个参数和第二个参数应该对应。\n                .useDefaultIndicator()// 使用默认进度条\n                .defaultProgressBarColor() // 使用默认进度条颜色\n                .setReceivedTitleCallback(mReceivedTitleCallback) //设置 Web 页面的 title 回调\n                .createAgentWeb()//\n                .ready()\n                .go(url);\n    }\n\n    @Override\n    protected boolean showHomeAsUp() {\n        return true;\n    }\n\n    @Override\n    public boolean onCreateOptionsMenu(Menu menu) {\n        getMenuInflater().inflate(R.menu.menu_content, menu);\n        return super.onCreateOptionsMenu(menu);\n    }\n\n    @Override\n    public boolean onOptionsItemSelected(MenuItem item) {\n        if (item.getItemId() == R.id.menuShare) {\n            Intent intent = new Intent(Intent.ACTION_SEND);\n            intent.putExtra(Intent.EXTRA_TEXT, getString(R.string.share_article_url, getString(R.string.app_name), title, url));\n            intent.setType(\"text/plain\");\n            startActivity(intent);\n        } else if (item.getItemId() == R.id.menuLike) {\n            if (id == 0) mPresenter.collectOutsideArticle(title, author, url);\n            else mPresenter.collectArticle(id);\n        } else if (item.getItemId() == R.id.menuBrowser) {\n            Intent intent = new Intent(\"android.intent.action.VIEW\");\n            intent.setData(Uri.parse(url));\n            startActivity(intent);\n        }\n        return super.onOptionsItemSelected(item);\n    }\n\n    public static void start(int id, String url, String title, String author) {\n        ARouter.getInstance().build(\"/article/ArticleContentActivity\")\n                .withInt(Constant.CONTENT_ID_KEY, id)\n                .withString(Constant.CONTENT_URL_KEY, url)\n                .withString(Constant.CONTENT_TITLE_KEY, title)\n                .withString(Constant.CONTENT_AUTHOR_KEY, author)\n                .navigation();\n    }\n\n    private ChromeClientCallbackManager.ReceivedTitleCallback mReceivedTitleCallback = new ChromeClientCallbackManager.ReceivedTitleCallback() {\n        @Override\n        public void onReceivedTitle(WebView view, String title) {\n            setToolbarTitle(title);\n        }\n    };\n}\n"
  },
  {
    "path": "app/src/main/java/com/lw/wanandroid/ui/article/ArticleContentContract.java",
    "content": "package com.lw.wanandroid.ui.article;\n\nimport com.lw.wanandroid.base.BaseContract;\n\nimport retrofit2.http.Field;\n\n/**\n * Created by lw on 2018/1/25.\n */\n\npublic interface ArticleContentContract {\n    interface View extends BaseContract.BaseView {\n\n    }\n\n    interface Presenter extends BaseContract.BasePresenter<ArticleContentContract.View> {\n        void collectArticle(int id);\n\n        void collectOutsideArticle(String title, String author, String link);\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/lw/wanandroid/ui/article/ArticleContentPresenter.java",
    "content": "package com.lw.wanandroid.ui.article;\n\nimport com.blankj.utilcode.util.SPUtils;\nimport com.lw.wanandroid.R;\nimport com.lw.wanandroid.base.App;\nimport com.lw.wanandroid.base.BasePresenter;\nimport com.lw.wanandroid.bean.DataResponse;\nimport com.lw.wanandroid.constant.Constant;\nimport com.lw.wanandroid.net.ApiService;\nimport com.lw.wanandroid.net.RetrofitManager;\nimport com.lw.wanandroid.ui.my.LoginActivity;\nimport com.lw.wanandroid.utils.RxSchedulers;\n\nimport javax.inject.Inject;\n\nimport io.reactivex.functions.Consumer;\n\n/**\n * Created by lw on 2018/1/25.\n */\n\npublic class ArticleContentPresenter extends BasePresenter<ArticleContentContract.View> implements ArticleContentContract.Presenter {\n    @Inject\n    public ArticleContentPresenter() {\n    }\n\n    @Override\n    public void collectArticle(int id) {\n        if (SPUtils.getInstance(Constant.SHARED_NAME).getBoolean(Constant.LOGIN_KEY)) {\n            RetrofitManager.create(ApiService.class)\n                    .addCollectArticle(id)\n                    .compose(RxSchedulers.<DataResponse>applySchedulers())\n                    .compose(mView.<DataResponse>bindToLife())\n                    .subscribe(new Consumer<DataResponse>() {\n                        @Override\n                        public void accept(DataResponse response) throws Exception {\n                            if (response.getErrorCode() == 0) {\n                                mView.showSuccess(App.getAppContext().getString(R.string.collection_success));\n                            } else {\n                                mView.showFaild(App.getAppContext().getString(R.string.collection_failed, response.getErrorMsg()));\n                            }\n                        }\n                    }, new Consumer<Throwable>() {\n                        @Override\n                        public void accept(Throwable throwable) throws Exception {\n                            mView.showFaild(throwable.getMessage());\n                        }\n                    });\n        } else {\n            LoginActivity.start();\n        }\n    }\n\n    @Override\n    public void collectOutsideArticle(String title, String author, String link) {\n        if (SPUtils.getInstance(Constant.SHARED_NAME).getBoolean(Constant.LOGIN_KEY)) {\n            RetrofitManager.create(ApiService.class)\n                    .addCollectOutsideArticle(title, author, link)\n                    .compose(RxSchedulers.<DataResponse>applySchedulers())\n                    .compose(mView.<DataResponse>bindToLife())\n                    .subscribe(new Consumer<DataResponse>() {\n                        @Override\n                        public void accept(DataResponse response) throws Exception {\n                            if (response.getErrorCode() == 0) {\n                                mView.showSuccess(App.getAppContext().getString(R.string.collection_success));\n                            } else {\n                                mView.showFaild(App.getAppContext().getString(R.string.collection_failed, response.getErrorMsg()));\n                            }\n                        }\n                    }, new Consumer<Throwable>() {\n                        @Override\n                        public void accept(Throwable throwable) throws Exception {\n                            mView.showFaild(throwable.getMessage());\n                        }\n                    });\n        } else {\n            LoginActivity.start();\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/lw/wanandroid/ui/article/ArticleListContract.java",
    "content": "package com.lw.wanandroid.ui.article;\n\nimport com.lw.wanandroid.base.BaseContract;\nimport com.lw.wanandroid.bean.Article;\nimport com.lw.wanandroid.constant.LoadType;\n\n/**\n * Created by lw on 2018/1/23.\n */\n\npublic interface ArticleListContract {\n    interface View extends BaseContract.BaseView {\n\n        void setKnowledgeSystemArticles(Article article, @LoadType.checker int loadType);\n\n        void collectArticleSuccess(int position, Article.DatasBean bean);\n\n    }\n\n    interface Presenter extends BaseContract.BasePresenter<ArticleListContract.View> {\n        void loadKnowledgeSystemArticles(int cid);\n\n        void refresh();\n\n        void loadMore();\n\n        void collectArticle(int position, Article.DatasBean bean);\n\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/lw/wanandroid/ui/article/ArticleListFragment.java",
    "content": "package com.lw.wanandroid.ui.article;\n\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.alibaba.android.arouter.facade.annotation.Autowired;\nimport com.alibaba.android.arouter.facade.annotation.Route;\nimport com.chad.library.adapter.base.BaseQuickAdapter;\nimport com.lw.wanandroid.R;\nimport com.lw.wanandroid.base.BaseFragment;\nimport com.lw.wanandroid.bean.Article;\nimport com.lw.wanandroid.event.LoginEvent;\nimport com.lw.wanandroid.utils.RxBus;\n\nimport javax.inject.Inject;\n\nimport butterknife.BindView;\nimport io.reactivex.functions.Consumer;\n\n/**\n * Created by lw on 2018/1/22.\n */\n@Route(path = \"/article/ArticleListFragment\")\npublic class ArticleListFragment extends BaseFragment<ArticleListPresenter> implements ArticleListContract.View, ArticleAdapter.OnItemClickListener, ArticleAdapter.OnItemChildClickListener,\n        SwipeRefreshLayout.OnRefreshListener, ArticleAdapter.RequestLoadMoreListener {\n    @BindView(R.id.rvArticleList)\n    RecyclerView mRvArticleList;\n    @BindView(R.id.swipeRefreshLayout)\n    SwipeRefreshLayout mSwipeRefreshLayout;\n    @Autowired\n    public int cid;\n    @Inject\n    ArticleAdapter mArticleAdapter;\n\n    @Override\n    protected int getLayoutId() {\n        return R.layout.fragment_article_list;\n    }\n\n    @Override\n    protected void initInjector() {\n        mFragmentComponent.inject(this);\n    }\n\n    @Override\n    protected void initView(View view) {\n        /**隐藏文章类型*/\n        mArticleAdapter.setChapterNameVisible(false);\n\n        /**设置RecyclerView*/\n        mRvArticleList.setLayoutManager(new LinearLayoutManager(getContext()));\n        mRvArticleList.setAdapter(mArticleAdapter);\n\n        /**设置事件监听*/\n        mArticleAdapter.setOnItemClickListener(this);\n        mArticleAdapter.setOnItemChildClickListener(this);\n        mSwipeRefreshLayout.setOnRefreshListener(this);\n        mArticleAdapter.setOnLoadMoreListener(this);\n\n        /**请求数据*/\n        mPresenter.loadKnowledgeSystemArticles(cid);\n\n        /**登陆成功刷新*/\n        RxBus.getInstance().toFlowable(LoginEvent.class)\n                .subscribe(new Consumer<LoginEvent>() {\n                    @Override\n                    public void accept(LoginEvent event) throws Exception {\n                        mPresenter.refresh();\n                    }\n                });\n    }\n\n    @Override\n    public void showLoading() {\n        mSwipeRefreshLayout.setRefreshing(true);\n    }\n\n    @Override\n    public void onRefresh() {\n        mPresenter.refresh();\n    }\n\n    @Override\n    public void onItemChildClick(BaseQuickAdapter adapter, View view, int position) {\n        if (view.getId() == R.id.ivCollect) {\n            mPresenter.collectArticle(position, mArticleAdapter.getItem(position));\n        }\n    }\n\n    @Override\n    public void onItemClick(BaseQuickAdapter adapter, View view, int position) {\n        ArticleContentActivity.start(mArticleAdapter.getItem(position).getId(),\n                mArticleAdapter.getItem(position).getLink(), mArticleAdapter.getItem(position).getTitle(),\n                mArticleAdapter.getItem(position).getAuthor());\n    }\n\n    @Override\n    public void onLoadMoreRequested() {\n        mPresenter.loadMore();\n    }\n\n    @Override\n    public void setKnowledgeSystemArticles(Article article, int loadType) {\n        setLoadDataResult(mArticleAdapter, mSwipeRefreshLayout, article.getDatas(), loadType);\n    }\n\n    @Override\n    public void collectArticleSuccess(int position, Article.DatasBean bean) {\n        mArticleAdapter.setData(position, bean);\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/lw/wanandroid/ui/article/ArticleListPresenter.java",
    "content": "package com.lw.wanandroid.ui.article;\n\nimport com.blankj.utilcode.util.SPUtils;\nimport com.lw.wanandroid.R;\nimport com.lw.wanandroid.base.App;\nimport com.lw.wanandroid.base.BasePresenter;\nimport com.lw.wanandroid.bean.Article;\nimport com.lw.wanandroid.bean.DataResponse;\nimport com.lw.wanandroid.constant.Constant;\nimport com.lw.wanandroid.constant.LoadType;\nimport com.lw.wanandroid.net.ApiService;\nimport com.lw.wanandroid.net.RetrofitManager;\nimport com.lw.wanandroid.utils.RxSchedulers;\nimport com.lw.wanandroid.ui.my.LoginActivity;\n\nimport javax.inject.Inject;\n\nimport io.reactivex.functions.Consumer;\n\n/**\n * Created by lw on 2018/1/23.\n */\n\npublic class ArticleListPresenter extends BasePresenter<ArticleListContract.View> implements ArticleListContract.Presenter {\n\n    private boolean mIsRefresh;\n    private int mPage, mCid;\n\n    @Inject\n    public ArticleListPresenter() {\n        this.mIsRefresh = true;\n    }\n\n    @Override\n    public void loadKnowledgeSystemArticles(int cid) {\n        this.mCid = cid;\n        RetrofitManager.create(ApiService.class).getKnowledgeSystemArticles(mPage, mCid)\n                .compose(RxSchedulers.<DataResponse<Article>>applySchedulers())\n                .compose(mView.<DataResponse<Article>>bindToLife())\n                .subscribe(new Consumer<DataResponse<Article>>() {\n                    @Override\n                    public void accept(DataResponse<Article> dataResponse) throws Exception {\n                        int loadType = mIsRefresh ? LoadType.TYPE_REFRESH_SUCCESS : LoadType.TYPE_LOAD_MORE_SUCCESS;\n                        mView.setKnowledgeSystemArticles(dataResponse.getData(), loadType);\n                    }\n                }, new Consumer<Throwable>() {\n                    @Override\n                    public void accept(Throwable throwable) throws Exception {\n                        int loadType = mIsRefresh ? LoadType.TYPE_REFRESH_ERROR : LoadType.TYPE_LOAD_MORE_ERROR;\n                        mView.setKnowledgeSystemArticles(new Article(), loadType);\n                    }\n                });\n    }\n\n    @Override\n    public void refresh() {\n        mPage = 0;\n        mIsRefresh = true;\n        loadKnowledgeSystemArticles(mCid);\n    }\n\n    @Override\n    public void loadMore() {\n        mPage++;\n        mIsRefresh = false;\n        loadKnowledgeSystemArticles(mCid);\n    }\n\n    @Override\n    public void collectArticle(final int position, final Article.DatasBean bean) {\n        if (SPUtils.getInstance(Constant.SHARED_NAME).getBoolean(Constant.LOGIN_KEY)) {\n            if (bean.isCollect()) {\n                RetrofitManager.create(ApiService.class).removeCollectArticle(bean.getId(), -1)\n                        .compose(RxSchedulers.<DataResponse>applySchedulers())\n                        .compose(mView.<DataResponse>bindToLife())\n                        .subscribe(new Consumer<DataResponse>() {\n                            @Override\n                            public void accept(DataResponse response) throws Exception {\n                                if (response.getErrorCode() == 0) {\n                                    bean.setCollect(!bean.isCollect());\n                                    mView.collectArticleSuccess(position, bean);\n                                    mView.showSuccess(App.getAppContext().getString(R.string.collection_cancel_success));\n                                } else {\n                                    mView.showFaild(App.getAppContext().getString(R.string.collection_cancel_failed, response.getData()));\n                                }\n                            }\n                        }, new Consumer<Throwable>() {\n                            @Override\n                            public void accept(Throwable throwable) throws Exception {\n                                mView.showFaild(throwable.getMessage());\n                            }\n                        });\n            } else {\n                RetrofitManager.create(ApiService.class).addCollectArticle(bean.getId())\n                        .compose(RxSchedulers.<DataResponse>applySchedulers())\n                        .compose(mView.<DataResponse>bindToLife())\n                        .subscribe(new Consumer<DataResponse>() {\n                            @Override\n                            public void accept(DataResponse response) throws Exception {\n                                if (response.getErrorCode() == 0) {\n                                    bean.setCollect(!bean.isCollect());\n                                    mView.collectArticleSuccess(position, bean);\n                                    mView.showSuccess(App.getAppContext().getString(R.string.collection_success));\n                                } else {\n                                    mView.showFaild(App.getAppContext().getString(R.string.collection_failed, response.getErrorMsg()));\n                                }\n                            }\n                        }, new Consumer<Throwable>() {\n                            @Override\n                            public void accept(Throwable throwable) throws Exception {\n                                mView.showFaild(throwable.getMessage());\n                            }\n                        });\n            }\n        } else {\n            LoginActivity.start();\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/lw/wanandroid/ui/article/ArticleTypeActivity.java",
    "content": "package com.lw.wanandroid.ui.article;\n\nimport android.content.Intent;\nimport android.support.design.widget.TabLayout;\nimport android.support.v4.view.ViewPager;\nimport android.view.Menu;\nimport android.view.MenuItem;\n\nimport com.alibaba.android.arouter.facade.annotation.Autowired;\nimport com.alibaba.android.arouter.facade.annotation.Route;\nimport com.alibaba.android.arouter.launcher.ARouter;\nimport com.lw.wanandroid.R;\nimport com.lw.wanandroid.base.BaseActivity;\nimport com.lw.wanandroid.bean.KnowledgeSystem;\n\nimport java.util.List;\n\nimport butterknife.BindView;\n\n/**\n * Created by lw on 2018/1/22.\n */\n@Route(path = \"/article/ArticleTypeActivity\")\npublic class ArticleTypeActivity extends BaseActivity {\n    @Autowired\n    public String title;\n    @Autowired\n    public List<KnowledgeSystem.ChildrenBean> childrenData;\n    @BindView(R.id.tabArticleTypes)\n    TabLayout mTabArticleTypes;\n    @BindView(R.id.vpArticleTypes)\n    ViewPager mVpArticleTypes;\n\n    ArticleTypeFragmentPagerAdapter mArticleTypeFragmentPagerAdapter;\n\n    @Override\n    protected int getLayoutId() {\n        return R.layout.activity_article_type;\n    }\n\n    @Override\n    protected void initInjector() {\n\n    }\n\n    @Override\n    protected void initView() {\n        setToolbarTitle(title);\n        mArticleTypeFragmentPagerAdapter = new ArticleTypeFragmentPagerAdapter(getSupportFragmentManager(), childrenData);\n        mVpArticleTypes.setAdapter(mArticleTypeFragmentPagerAdapter);\n        mTabArticleTypes.setupWithViewPager(mVpArticleTypes);\n    }\n\n    @Override\n    protected boolean showHomeAsUp() {\n        return true;\n    }\n\n    @Override\n    public boolean onCreateOptionsMenu(Menu menu) {\n        getMenuInflater().inflate(R.menu.menu_type_content, menu);\n        return super.onCreateOptionsMenu(menu);\n    }\n\n    @Override\n    public boolean onOptionsItemSelected(MenuItem item) {\n        if (item.getItemId() == R.id.menuShare) {\n            Intent intent = new Intent(Intent.ACTION_SEND);\n            intent.putExtra(Intent.EXTRA_TEXT, getString(R.string.share_type_url, getString(R.string.app_name),\n                    childrenData.get(mTabArticleTypes.getSelectedTabPosition()).getName(), childrenData.get(mTabArticleTypes.getSelectedTabPosition()).getId()));\n            intent.setType(\"text/plain\");\n            startActivity(Intent.createChooser(intent, getString(R.string.share_title)));\n        } else if (item.getItemId() == R.id.menuSearch) {\n            ARouter.getInstance().build(\"/hotsearch/SearchActivity\").navigation();\n        }\n        return super.onOptionsItemSelected(item);\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/lw/wanandroid/ui/article/ArticleTypeFragmentPagerAdapter.java",
    "content": "package com.lw.wanandroid.ui.article;\n\nimport android.support.annotation.Nullable;\nimport android.support.v4.app.Fragment;\nimport android.support.v4.app.FragmentManager;\nimport android.support.v4.app.FragmentPagerAdapter;\n\nimport com.alibaba.android.arouter.launcher.ARouter;\nimport com.lw.wanandroid.bean.KnowledgeSystem;\nimport com.lw.wanandroid.constant.Constant;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\nimport javax.inject.Inject;\n\n/**\n * Created by lw on 2018/1/22.\n */\n\npublic class ArticleTypeFragmentPagerAdapter extends FragmentPagerAdapter {\n\n    @Nullable\n    private List<KnowledgeSystem.ChildrenBean> mChildrenData;\n    private List<ArticleListFragment> mArticleTypeFragments;\n\n    @Inject\n    public ArticleTypeFragmentPagerAdapter(FragmentManager fm, List<KnowledgeSystem.ChildrenBean> childrenData) {\n        super(fm);\n        this.mChildrenData = childrenData;\n        mArticleTypeFragments = new ArrayList<>();\n        if (mChildrenData == null) return;\n        for (KnowledgeSystem.ChildrenBean childrenBean : mChildrenData) {\n            ArticleListFragment articleListFragment = (ArticleListFragment) ARouter.getInstance()\n                    .build(\"/article/ArticleListFragment\")\n                    .withInt(Constant.CONTENT_CID_KEY, childrenBean.getId())\n                    .navigation();\n            mArticleTypeFragments.add(articleListFragment);\n        }\n    }\n\n    @Override\n    public Fragment getItem(int position) {\n        return mArticleTypeFragments.get(position);\n    }\n\n    @Override\n    public int getCount() {\n        return mArticleTypeFragments.size();\n    }\n\n    @Override\n    public CharSequence getPageTitle(int position) {\n        return mChildrenData.get(position).getName();\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/lw/wanandroid/ui/home/HomeContract.java",
    "content": "package com.lw.wanandroid.ui.home;\n\nimport com.lw.wanandroid.base.BaseContract;\nimport com.lw.wanandroid.bean.Article;\nimport com.lw.wanandroid.bean.Banner;\nimport com.lw.wanandroid.constant.LoadType;\n\nimport java.util.List;\n\n/**\n * Created by lw on 2018/1/18.\n */\n\npublic interface HomeContract {\n\n    interface View extends BaseContract.BaseView {\n        void setHomeBanners(List<Banner> banners);\n\n        void setHomeArticles(Article article, @LoadType.checker int loadType);\n\n        void collectArticleSuccess(int position, Article.DatasBean bean);\n\n    }\n\n    interface Presenter extends BaseContract.BasePresenter<View> {\n        void loadHomeBanners();\n\n        void loadHomeArticles();\n\n        void refresh();\n\n        void loadMore();\n\n        void collectArticle(int position, Article.DatasBean bean);\n\n        void loadHomeData();\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/lw/wanandroid/ui/home/HomeFragment.java",
    "content": "package com.lw.wanandroid.ui.home;\n\nimport android.support.v4.widget.SwipeRefreshLayout;\nimport android.support.v7.widget.LinearLayoutManager;\nimport android.support.v7.widget.RecyclerView;\nimport android.view.LayoutInflater;\nimport android.view.View;\n\nimport com.alibaba.android.arouter.launcher.ARouter;\nimport com.chad.library.adapter.base.BaseQuickAdapter;\nimport com.lw.wanandroid.R;\nimport com.lw.wanandroid.base.BaseFragment;\nimport com.lw.wanandroid.bean.Article;\nimport com.lw.wanandroid.bean.Banner;\nimport com.lw.wanandroid.bean.KnowledgeSystem;\nimport com.lw.wanandroid.constant.Constant;\nimport com.lw.wanandroid.constant.LoadType;\nimport com.lw.wanandroid.event.LoginEvent;\nimport com.lw.wanandroid.ui.article.ArticleAdapter;\nimport com.lw.wanandroid.ui.article.ArticleContentActivity;\nimport com.lw.wanandroid.utils.GlideImageLoader;\nimport com.lw.wanandroid.utils.RxBus;\nimport com.youth.banner.BannerConfig;\nimport com.youth.banner.listener.OnBannerListener;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\nimport javax.inject.Inject;\n\nimport butterknife.BindView;\nimport io.reactivex.functions.Consumer;\n\n/**\n * Created by lw on 2018/1/18.\n */\n\npublic class HomeFragment extends BaseFragment<HomePresenter> implements HomeContract.View, ArticleAdapter.OnItemClickListener, ArticleAdapter.OnItemChildClickListener,\n        SwipeRefreshLayout.OnRefreshListener, ArticleAdapter.RequestLoadMoreListener {\n    @BindView(R.id.rvHomeArticles)\n    RecyclerView mRvHomeArticles;\n    @BindView(R.id.swipeRefreshLayout)\n    SwipeRefreshLayout mSwipeRefreshLayout;\n    @Inject\n    ArticleAdapter mArticleAdapter;\n    private com.youth.banner.Banner mBannerAds;\n    private View mHomeBannerHeadView;\n\n    @Override\n    protected int getLayoutId() {\n        return R.layout.fragment_home;\n    }\n\n    @Override\n    protected void initInjector() {\n        mFragmentComponent.inject(this);\n    }\n\n    @Override\n    protected void initView(View view) {\n        /**设置RecyclerView*/\n        mRvHomeArticles.setLayoutManager(new LinearLayoutManager(getContext()));\n        mRvHomeArticles.setAdapter(mArticleAdapter);\n\n        /**设置BannerHeadView*/\n        mHomeBannerHeadView = LayoutInflater.from(getContext()).inflate(R.layout.layout_home_banner_head, null);\n        mBannerAds = (com.youth.banner.Banner) mHomeBannerHeadView.findViewById(R.id.banner_ads);\n        mArticleAdapter.addHeaderView(mHomeBannerHeadView);\n\n        /**设置事件监听*/\n        mArticleAdapter.setOnItemClickListener(this);\n        mArticleAdapter.setOnItemChildClickListener(this);\n        mSwipeRefreshLayout.setOnRefreshListener(this);\n        mArticleAdapter.setOnLoadMoreListener(this);\n\n        /**请求数据*/\n        mPresenter.loadHomeData();\n\n        /**登陆成功刷新*/\n        RxBus.getInstance().toFlowable(LoginEvent.class)\n                .subscribe(new Consumer<LoginEvent>() {\n                    @Override\n                    public void accept(LoginEvent event) throws Exception {\n                        mPresenter.refresh();\n                    }\n                });\n    }\n\n    @Override\n    public void showLoading() {\n        mSwipeRefreshLayout.setRefreshing(true);\n    }\n\n    @Override\n    public void showFaild(String errorMsg) {\n        mSwipeRefreshLayout.setRefreshing(false);\n    }\n\n    @Override\n    public void setHomeBanners(final List<Banner> banners) {\n        List<String> images = new ArrayList();\n        List<String> titles = new ArrayList();\n        for (Banner banner : banners) {\n            images.add(banner.getImagePath());\n            titles.add(banner.getTitle());\n        }\n        mBannerAds.setImages(images)\n                .setBannerTitles(titles)\n                .setBannerStyle(BannerConfig.CIRCLE_INDICATOR_TITLE_INSIDE)\n                .setImageLoader(new GlideImageLoader())\n                .start();\n        mBannerAds.setOnBannerListener(new OnBannerListener() {\n            @Override\n            public void OnBannerClick(int position) {\n                ArticleContentActivity.start(banners.get(position).getId(), banners.get(position).getUrl(),\n                        banners.get(position).getTitle(), null);\n            }\n        });\n    }\n\n    @Override\n    public void setHomeArticles(Article article, @LoadType.checker int loadType) {\n        setLoadDataResult(mArticleAdapter, mSwipeRefreshLayout, article.getDatas(), loadType);\n    }\n\n    @Override\n    public void collectArticleSuccess(int position, Article.DatasBean bean) {\n        mArticleAdapter.setData(position, bean);\n    }\n\n    @Override\n    public void onItemChildClick(BaseQuickAdapter adapter, View view, int position) {\n        if (view.getId() == R.id.tvChapterName) {\n            List<KnowledgeSystem.ChildrenBean> childrenBeans = new ArrayList<>();\n            childrenBeans.add(new KnowledgeSystem.ChildrenBean(mArticleAdapter.getItem(position).getChapterId(),\n                    mArticleAdapter.getItem(position).getChapterName()));\n            ARouter.getInstance().build(\"/article/ArticleTypeActivity\")\n                    .withString(Constant.CONTENT_TITLE_KEY, mArticleAdapter.getItem(position).getChapterName())\n                    .withObject(Constant.CONTENT_CHILDREN_DATA_KEY, childrenBeans)\n                    .navigation();\n        } else if (view.getId() == R.id.ivCollect) {\n            mPresenter.collectArticle(position, mArticleAdapter.getItem(position));\n        }\n    }\n\n    @Override\n    public void onItemClick(BaseQuickAdapter adapter, View view, int position) {\n        ArticleContentActivity.start(mArticleAdapter.getItem(position).getId(),\n                mArticleAdapter.getItem(position).getLink(), mArticleAdapter.getItem(position).getTitle(),\n                mArticleAdapter.getItem(position).getAuthor());\n    }\n\n    @Override\n    public void onRefresh() {\n        mPresenter.refresh();\n    }\n\n    @Override\n    public void onLoadMoreRequested() {\n        mPresenter.loadMore();\n    }\n\n    public static HomeFragment newInstance() {\n        return new HomeFragment();\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/lw/wanandroid/ui/home/HomePresenter.java",
    "content": "package com.lw.wanandroid.ui.home;\n\nimport com.blankj.utilcode.util.SPUtils;\nimport com.lw.wanandroid.R;\nimport com.lw.wanandroid.base.App;\nimport com.lw.wanandroid.base.BasePresenter;\nimport com.lw.wanandroid.bean.Article;\nimport com.lw.wanandroid.bean.Banner;\nimport com.lw.wanandroid.bean.DataResponse;\nimport com.lw.wanandroid.bean.User;\nimport com.lw.wanandroid.constant.Constant;\nimport com.lw.wanandroid.constant.LoadType;\nimport com.lw.wanandroid.net.ApiService;\nimport com.lw.wanandroid.net.RetrofitManager;\nimport com.lw.wanandroid.utils.ArticleUtils;\nimport com.lw.wanandroid.utils.RxSchedulers;\n\nimport java.util.HashMap;\nimport java.util.List;\nimport java.util.Map;\n\nimport javax.inject.Inject;\n\nimport io.reactivex.Observable;\nimport io.reactivex.functions.Consumer;\nimport io.reactivex.functions.Function3;\n\n/**\n * Created by lw on 2018/1/18.\n */\n\npublic class HomePresenter extends BasePresenter<HomeContract.View> implements HomeContract.Presenter {\n    private int mPage;\n    private boolean mIsRefresh;\n\n    @Inject\n    public HomePresenter() {\n        this.mIsRefresh = true;\n    }\n\n    @Override\n    public void loadHomeBanners() {\n        RetrofitManager.create(ApiService.class)\n                .getHomeBanners()\n                .compose(RxSchedulers.<DataResponse<List<Banner>>>applySchedulers())\n                .compose(mView.<DataResponse<List<Banner>>>bindToLife())\n                .subscribe(new Consumer<DataResponse<List<Banner>>>() {\n                    @Override\n                    public void accept(DataResponse<List<Banner>> dataResponse) throws Exception {\n                        mView.setHomeBanners(dataResponse.getData());\n                    }\n                }, new Consumer<Throwable>() {\n                    @Override\n                    public void accept(Throwable throwable) throws Exception {\n                        mView.showFaild(throwable.getMessage());\n                    }\n                });\n    }\n\n    @Override\n    public void loadHomeArticles() {\n        RetrofitManager.create(ApiService.class)\n                .getHomeArticles(mPage)\n                .compose(RxSchedulers.<DataResponse<Article>>applySchedulers())\n                .compose(mView.<DataResponse<Article>>bindToLife())\n                .subscribe(new Consumer<DataResponse<Article>>() {\n                    @Override\n                    public void accept(DataResponse<Article> dataResponse) throws Exception {\n                        int loadType = mIsRefresh ? LoadType.TYPE_REFRESH_SUCCESS : LoadType.TYPE_LOAD_MORE_SUCCESS;\n                        mView.setHomeArticles(dataResponse.getData(), loadType);\n                    }\n                }, new Consumer<Throwable>() {\n                    @Override\n                    public void accept(Throwable throwable) throws Exception {\n                        int loadType = mIsRefresh ? LoadType.TYPE_REFRESH_ERROR : LoadType.TYPE_LOAD_MORE_ERROR;\n                        mView.setHomeArticles(new Article(), loadType);\n                    }\n                });\n    }\n\n    @Override\n    public void refresh() {\n        mPage = 0;\n        mIsRefresh = true;\n        loadHomeBanners();\n        loadHomeArticles();\n    }\n\n    @Override\n    public void loadMore() {\n        mPage++;\n        mIsRefresh = false;\n        loadHomeArticles();\n    }\n\n    @Override\n    public void collectArticle(final int position, final Article.DatasBean bean) {\n        ArticleUtils.collectArticle(mView, position, bean);\n    }\n\n    @Override\n    public void loadHomeData() {\n        mView.showLoading();\n        String username = SPUtils.getInstance(Constant.SHARED_NAME).getString(Constant.USERNAME_KEY);\n        String password = SPUtils.getInstance(Constant.SHARED_NAME).getString(Constant.PASSWORD_KEY);\n        Observable<DataResponse<User>> observableUser = RetrofitManager.create(ApiService.class).login(username, password);\n        Observable<DataResponse<List<Banner>>> observableBanner = RetrofitManager.create(ApiService.class).getHomeBanners();\n        Observable<DataResponse<Article>> observableArticle = RetrofitManager.create(ApiService.class).getHomeArticles(mPage);\n        Observable.zip(observableUser, observableBanner, observableArticle, new Function3<DataResponse<User>, DataResponse<List<Banner>>, DataResponse<Article>, Map<String, Object>>() {\n            @Override\n            public Map<String, Object> apply(DataResponse<User> response, DataResponse<List<Banner>> dataResponse, DataResponse<Article> dataResponse2) throws Exception {\n                Map<String, Object> objMap = new HashMap<>();\n                objMap.put(Constant.USER_KEY, response);\n                objMap.put(Constant.BANNER_KEY, dataResponse.getData());\n                objMap.put(Constant.ARTICLE_KEY, dataResponse2.getData());\n                return objMap;\n            }\n        }).compose(RxSchedulers.<Map<String, Object>>applySchedulers()).compose(mView.<Map<String, Object>>bindToLife()).subscribe(new Consumer<Map<String, Object>>() {\n            @Override\n            public void accept(Map<String, Object> map) throws Exception {\n                DataResponse<User> dataResponse = (DataResponse<User>) map.get(Constant.USER_KEY);\n                if (dataResponse.getErrorCode() == 0) {\n                    mView.showSuccess(App.getAppContext().getString(R.string.auto_login_success));\n                } else {\n                    mView.showFaild(String.valueOf(dataResponse.getErrorMsg()));\n                }\n                List<Banner> banners = (List<Banner>) map.get(Constant.BANNER_KEY);\n                Article article = (Article) map.get(Constant.ARTICLE_KEY);\n                mView.setHomeBanners(banners);\n                mView.setHomeArticles(article, LoadType.TYPE_REFRESH_SUCCESS);\n            }\n        }, new Consumer<Throwable>() {\n            @Override\n            public void accept(Throwable throwable) throws Exception {\n                mView.showFaild(throwable.getMessage());\n            }\n        });\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/lw/wanandroid/ui/hotsearch/CommonHotAdapter.java",
    "content": "package com.lw.wanandroid.ui.hotsearch;\n\nimport com.chad.library.adapter.base.BaseQuickAdapter;\nimport com.chad.library.adapter.base.BaseViewHolder;\nimport com.lw.wanandroid.R;\nimport com.lw.wanandroid.bean.Friend;\n\nimport javax.inject.Inject;\n\n/**\n * Created by lw on 2018/1/23.\n */\n\npublic class CommonHotAdapter extends BaseQuickAdapter<Friend, BaseViewHolder> {\n    @Inject\n    public CommonHotAdapter() {\n        super(R.layout.item_hot, null);\n    }\n\n    @Override\n    protected void convert(BaseViewHolder helper, Friend item) {\n        helper.setText(R.id.tvTitle, item.getName());\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/lw/wanandroid/ui/hotsearch/HistoryAdapter.java",
    "content": "package com.lw.wanandroid.ui.hotsearch;\n\nimport android.content.Context;\nimport android.graphics.Color;\nimport android.view.LayoutInflater;\nimport android.view.View;\nimport android.widget.TextView;\n\nimport com.lw.wanandroid.R;\nimport com.lw.wanandroid.db.HistoryModel;\nimport com.zhy.view.flowlayout.FlowLayout;\nimport com.zhy.view.flowlayout.TagAdapter;\n\nimport java.util.List;\n\n/**\n * Created by lw on 2018/2/2.\n */\n\npublic class HistoryAdapter extends TagAdapter<HistoryModel> {\n    private Context mContext;\n    private LayoutInflater mInflater;\n\n    public HistoryAdapter(Context context, List<HistoryModel> datas) {\n        super(datas);\n        this.mContext = context;\n        this.mInflater = LayoutInflater.from(mContext);\n    }\n\n    @Override\n    public View getView(FlowLayout parent, int position, HistoryModel model) {\n        View view = mInflater.inflate(R.layout.item_history, parent, false);\n        TextView tvTitle = (TextView) view.findViewById(R.id.tvTitle);\n        int parseColor = 0;\n        try {\n            tvTitle.setText(model.getName());\n            String str = Integer.toHexString((int) (Math.random() * 16777215));\n            parseColor = Color.parseColor(\"#\".concat(str));\n            tvTitle.setTextColor(parseColor);\n        } catch (Exception e) {\n            e.printStackTrace();\n            parseColor = mContext.getResources().getColor(R.color.colorAccent);\n        }\n        tvTitle.setTextColor(parseColor);\n        return view;\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/lw/wanandroid/ui/hotsearch/HotAdapter.java",
    "content": "package com.lw.wanandroid.ui.hotsearch;\n\nimport android.content.Context;\nimport android.graphics.Color;\nimport android.view.LayoutInflater;\nimport android.view.View;\nimport android.widget.TextView;\n\nimport com.lw.wanandroid.R;\nimport com.zhy.view.flowlayout.FlowLayout;\nimport com.zhy.view.flowlayout.TagAdapter;\n\nimport java.lang.reflect.Field;\nimport java.util.List;\n\n/**\n * Created by lw on 2018/1/23.\n */\n\npublic class HotAdapter<T> extends TagAdapter<T> {\n    private Context mContext;\n    private LayoutInflater mInflater;\n\n    public HotAdapter(Context context, List<T> datas) {\n        super(datas);\n        this.mContext = context;\n        this.mInflater = LayoutInflater.from(mContext);\n    }\n\n    @Override\n    public View getView(FlowLayout parent, int position, T item) {\n        View view = mInflater.inflate(R.layout.item_hot, parent, false);\n        TextView tvTitle = (TextView) view.findViewById(R.id.tvTitle);\n        int parseColor = 0;\n        try {\n            String name = \"\";\n            Field[] fields = item.getClass().getDeclaredFields();\n            for (Field field : fields) {\n                field.setAccessible(true);\n                if (field.getName().equals(\"name\")) {\n                    name = (String) field.get(item);\n                    break;\n                }\n            }\n            tvTitle.setText(name);\n            String str = Integer.toHexString((int) (Math.random() * 16777215));\n            parseColor = Color.parseColor(\"#\".concat(str));\n            tvTitle.setTextColor(parseColor);\n        } catch (Exception e) {\n            e.printStackTrace();\n            parseColor = mContext.getResources().getColor(R.color.colorAccent);\n        }\n        tvTitle.setTextColor(parseColor);\n        return view;\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/lw/wanandroid/ui/hotsearch/HotContract.java",
    "content": "package com.lw.wanandroid.ui.hotsearch;\n\nimport com.lw.wanandroid.base.BaseContract;\nimport com.lw.wanandroid.bean.Friend;\nimport com.lw.wanandroid.bean.HotKey;\n\nimport java.util.List;\n\n/**\n * Created by lw on 2018/1/23.\n */\n\npublic interface HotContract {\n    interface View extends BaseContract.BaseView {\n        void setHotData(List<HotKey> hotKeys, List<Friend> friends);\n    }\n\n    interface Presenter extends BaseContract.BasePresenter<View> {\n        void loadHotData();\n\n        void refresh();\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/lw/wanandroid/ui/hotsearch/HotFragment.java",
    "content": "package com.lw.wanandroid.ui.hotsearch;\n\nimport android.support.v4.widget.SwipeRefreshLayout;\nimport android.support.v7.widget.LinearLayoutManager;\nimport android.support.v7.widget.RecyclerView;\nimport android.view.LayoutInflater;\nimport android.view.View;\n\nimport com.alibaba.android.arouter.launcher.ARouter;\nimport com.lw.wanandroid.R;\nimport com.lw.wanandroid.base.BaseFragment;\nimport com.lw.wanandroid.bean.Friend;\nimport com.lw.wanandroid.bean.HotKey;\nimport com.lw.wanandroid.constant.Constant;\nimport com.lw.wanandroid.ui.article.ArticleContentActivity;\nimport com.zhy.view.flowlayout.FlowLayout;\nimport com.zhy.view.flowlayout.TagFlowLayout;\n\nimport java.util.List;\n\nimport javax.inject.Inject;\n\nimport butterknife.BindView;\n\n/**\n * Created by lw on 2018/1/23.\n */\n\npublic class HotFragment extends BaseFragment<HotPresenter> implements HotContract.View, SwipeRefreshLayout.OnRefreshListener {\n    @BindView(R.id.rvHots)\n    RecyclerView mRvHots;\n    @BindView(R.id.swipeRefreshLayout)\n    SwipeRefreshLayout mSwipeRefreshLayout;\n    @Inject\n    public CommonHotAdapter mCommonHotAdapter;\n    private TagFlowLayout mTtlBookMarks, mTflHotKeys, mTflHotFriends;\n    private HotAdapter<HotKey> mHotKeyAdapter;\n    private HotAdapter<Friend> mHotFriendAdapter, mBookMarkAdapter;\n    private View mHotHeadView;\n\n    @Override\n    protected int getLayoutId() {\n        return R.layout.fragment_hot;\n    }\n\n    @Override\n    protected void initInjector() {\n        mFragmentComponent.inject(this);\n    }\n\n    @Override\n    protected void initView(View view) {\n        /**设置RecyclerView*/\n        mRvHots.setLayoutManager(new LinearLayoutManager(getContext()));\n        mRvHots.setAdapter(mCommonHotAdapter);\n\n        /**设置HotHeadView*/\n        mHotHeadView = LayoutInflater.from(getContext()).inflate(R.layout.layout_hot_head, null);\n        mTtlBookMarks = (TagFlowLayout) mHotHeadView.findViewById(R.id.tflBookMarks);\n        mTflHotKeys = (TagFlowLayout) mHotHeadView.findViewById(R.id.tflHotKeys);\n        mTflHotFriends = (TagFlowLayout) mHotHeadView.findViewById(R.id.tflHotFriends);\n        mCommonHotAdapter.addHeaderView(mHotHeadView);\n\n        /**设置监听*/\n        setListener();\n\n        /**请求数据*/\n        mPresenter.loadHotData();\n    }\n\n    @Override\n    public void showLoading() {\n        mSwipeRefreshLayout.setRefreshing(true);\n    }\n\n    @Override\n    public void showFaild(String errorMsg) {\n        mSwipeRefreshLayout.setRefreshing(false);\n    }\n\n    @Override\n    public void setHotData(List<HotKey> hotKeys, List<Friend> friends) {\n        mHotKeyAdapter = new HotAdapter(getContext(), hotKeys);\n        mTflHotKeys.setAdapter(mHotKeyAdapter);\n\n        mHotFriendAdapter = new HotAdapter<>(getContext(), friends);\n        mTflHotFriends.setAdapter(mHotFriendAdapter);\n\n        mSwipeRefreshLayout.setRefreshing(false);\n    }\n\n    @Override\n    public void onRefresh() {\n        mPresenter.refresh();\n    }\n\n    public static HotFragment newInstance() {\n        return new HotFragment();\n    }\n\n    private void setListener() {\n        mSwipeRefreshLayout.setOnRefreshListener(this);\n        mTflHotKeys.setOnTagClickListener(new TagFlowLayout.OnTagClickListener() {\n            @Override\n            public boolean onTagClick(View view, int position, FlowLayout parent) {\n                String name = mHotKeyAdapter.getItem(position).getName();\n                ARouter.getInstance().build(\"/hotsearch/SearchActivity\")\n                        .withString(Constant.CONTENT_HOT_NAME_KEY, name)\n                        .navigation();\n                return false;\n            }\n        });\n        mTflHotFriends.setOnTagClickListener(new TagFlowLayout.OnTagClickListener() {\n            @Override\n            public boolean onTagClick(View view, int position, FlowLayout parent) {\n                ArticleContentActivity.start(mHotFriendAdapter.getItem(position).getId(),\n                        mHotFriendAdapter.getItem(position).getLink(), mHotFriendAdapter.getItem(position).getName(),\n                        null);\n                return false;\n            }\n        });\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/lw/wanandroid/ui/hotsearch/HotPresenter.java",
    "content": "package com.lw.wanandroid.ui.hotsearch;\n\nimport com.lw.wanandroid.base.BasePresenter;\nimport com.lw.wanandroid.bean.DataResponse;\nimport com.lw.wanandroid.bean.Friend;\nimport com.lw.wanandroid.bean.HotKey;\nimport com.lw.wanandroid.constant.Constant;\nimport com.lw.wanandroid.net.ApiService;\nimport com.lw.wanandroid.net.RetrofitManager;\nimport com.lw.wanandroid.utils.RxSchedulers;\n\nimport java.util.HashMap;\nimport java.util.List;\nimport java.util.Map;\n\nimport javax.inject.Inject;\n\nimport io.reactivex.Observable;\nimport io.reactivex.functions.BiFunction;\nimport io.reactivex.functions.Consumer;\n\n/**\n * Created by lw on 2018/1/23.\n */\n\npublic class HotPresenter extends BasePresenter<HotContract.View> implements HotContract.Presenter {\n    @Inject\n    public HotPresenter() {\n    }\n\n    @Override\n    public void loadHotData() {\n        mView.showLoading();\n        Observable<DataResponse<List<Friend>>> observableFriend = RetrofitManager.create(ApiService.class).getHotFriends();\n        Observable<DataResponse<List<HotKey>>> observableHotKey = RetrofitManager.create(ApiService.class).getHotKeys();\n        Observable.zip(observableFriend, observableHotKey, new BiFunction<DataResponse<List<Friend>>, DataResponse<List<HotKey>>, Map<String, Object>>() {\n            @Override\n            public Map<String, Object> apply(DataResponse<List<Friend>> response, DataResponse<List<HotKey>> response2) throws Exception {\n                Map<String, Object> objMap = new HashMap<>();\n                objMap.put(Constant.CONTENT_HOT_KEY, response2.getData());\n                objMap.put(Constant.CONTENT_HOT_FRIEND_KEY, response.getData());\n                return objMap;\n            }\n        }).compose(RxSchedulers.<Map<String, Object>>applySchedulers()).compose(mView.<Map<String, Object>>bindToLife()).subscribe(new Consumer<Map<String, Object>>() {\n            @Override\n            public void accept(Map<String, Object> map) throws Exception {\n                List<HotKey> hotKeys = (List<HotKey>) map.get(Constant.CONTENT_HOT_KEY);\n                List<Friend> friends = (List<Friend>) map.get(Constant.CONTENT_HOT_FRIEND_KEY);\n                mView.setHotData(hotKeys, friends);\n            }\n        }, new Consumer<Throwable>() {\n            @Override\n            public void accept(Throwable throwable) throws Exception {\n                mView.showFaild(throwable.getMessage());\n            }\n        });\n    }\n\n    @Override\n    public void refresh() {\n        loadHotData();\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/lw/wanandroid/ui/hotsearch/SearchActivity.java",
    "content": "package com.lw.wanandroid.ui.hotsearch;\n\nimport android.support.v4.widget.SwipeRefreshLayout;\nimport android.support.v7.widget.LinearLayoutManager;\nimport android.support.v7.widget.RecyclerView;\nimport android.support.v7.widget.SearchView;\nimport android.view.LayoutInflater;\nimport android.view.Menu;\nimport android.view.View;\n\nimport com.alibaba.android.arouter.facade.annotation.Autowired;\nimport com.alibaba.android.arouter.facade.annotation.Route;\nimport com.alibaba.android.arouter.launcher.ARouter;\nimport com.chad.library.adapter.base.BaseQuickAdapter;\nimport com.lw.wanandroid.R;\nimport com.lw.wanandroid.base.BaseActivity;\nimport com.lw.wanandroid.bean.Article;\nimport com.lw.wanandroid.bean.KnowledgeSystem;\nimport com.lw.wanandroid.constant.Constant;\nimport com.lw.wanandroid.db.HistoryModel;\nimport com.lw.wanandroid.event.LoginEvent;\nimport com.lw.wanandroid.ui.article.ArticleAdapter;\nimport com.lw.wanandroid.ui.article.ArticleContentActivity;\nimport com.lw.wanandroid.utils.RxBus;\nimport com.zhy.view.flowlayout.FlowLayout;\nimport com.zhy.view.flowlayout.TagFlowLayout;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\nimport javax.inject.Inject;\n\nimport butterknife.BindView;\nimport io.reactivex.functions.Consumer;\n\n/**\n * Created by lw on 2018/1/23.\n */\n@Route(path = \"/hotsearch/SearchActivity\")\npublic class SearchActivity extends BaseActivity<SearchPresenter> implements SearchContract.View, ArticleAdapter.OnItemClickListener, ArticleAdapter.OnItemChildClickListener,\n        SwipeRefreshLayout.OnRefreshListener, ArticleAdapter.RequestLoadMoreListener {\n    @BindView(R.id.rvArticleList)\n    RecyclerView mRvArticleList;\n    @BindView(R.id.swipeRefreshLayout)\n    SwipeRefreshLayout mSwipeRefreshLayout;\n    @Inject\n    ArticleAdapter mArticleAdapter;\n    @Autowired\n    public String hotNameKey;\n    private HistoryAdapter mHistoryAdapter;\n    private SearchView mSearchView;\n    private List<HistoryModel> mHistoryModels;\n    private View mSearchHeadView;\n    private TagFlowLayout mTflHistorys;\n\n    @Override\n    protected int getLayoutId() {\n        return R.layout.activity_search;\n    }\n\n    @Override\n    protected void initInjector() {\n        mActivityComponent.inject(this);\n    }\n\n    @Override\n    protected void initView() {\n        /**设置RecyclerView*/\n        mRvArticleList.setLayoutManager(new LinearLayoutManager(this));\n        mRvArticleList.setAdapter(mArticleAdapter);\n        /**设置SearchHeadView*/\n        mSearchHeadView = LayoutInflater.from(this).inflate(R.layout.layout_search_head, null);\n        mTflHistorys = (TagFlowLayout) mSearchHeadView.findViewById(R.id.tflHistorys);\n        mArticleAdapter.addHeaderView(mSearchHeadView);\n\n        /**设置事件监听*/\n        mArticleAdapter.setOnItemClickListener(this);\n        mArticleAdapter.setOnItemChildClickListener(this);\n        mSwipeRefreshLayout.setOnRefreshListener(this);\n        mArticleAdapter.setOnLoadMoreListener(this);\n\n        /**加载历史搜索记录*/\n        mPresenter.loadHistory();\n\n        /**登陆成功刷新*/\n        RxBus.getInstance().toFlowable(LoginEvent.class)\n                .subscribe(new Consumer<LoginEvent>() {\n                    @Override\n                    public void accept(LoginEvent event) throws Exception {\n                        mPresenter.refresh();\n                    }\n                });\n\n        mTflHistorys.setOnTagClickListener(new TagFlowLayout.OnTagClickListener() {\n            @Override\n            public boolean onTagClick(View view, int position, FlowLayout parent) {\n                String name = mHistoryAdapter.getItem(position).getName();\n                mSearchView.setQuery(name, false);\n                mPresenter.loadSearchArtcles(name);\n                return false;\n            }\n        });\n    }\n\n    @Override\n    protected boolean showHomeAsUp() {\n        return true;\n    }\n\n    @Override\n    public boolean onCreateOptionsMenu(Menu menu) {\n        getMenuInflater().inflate(R.menu.menu_search, menu);\n        mSearchView = (SearchView) menu.findItem(R.id.menuSearch).getActionView();\n        mSearchView.setMaxWidth(1920);\n        mSearchView.setIconified(false);\n        mSearchView.setOnCloseListener(new SearchView.OnCloseListener() {\n            @Override\n            public boolean onClose() {\n                SearchActivity.this.finish();\n                return true;\n            }\n        });\n        mSearchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {\n            @Override\n            public boolean onQueryTextSubmit(String query) {\n                mPresenter.addHistory(query);\n                mPresenter.loadSearchArtcles(query);\n                return true;\n            }\n\n            @Override\n            public boolean onQueryTextChange(String newText) {\n                return false;\n            }\n        });\n        /**是否是从hot页面过来的*/\n        mSearchView.setQuery(hotNameKey, true);\n        return super.onCreateOptionsMenu(menu);\n    }\n\n    @Override\n    public void onRefresh() {\n        mPresenter.refresh();\n    }\n\n    @Override\n    public void onItemChildClick(BaseQuickAdapter adapter, View view, int position) {\n        if (view.getId() == R.id.tvChapterName) {\n            List<KnowledgeSystem.ChildrenBean> childrenBeans = new ArrayList<>();\n            childrenBeans.add(new KnowledgeSystem.ChildrenBean(mArticleAdapter.getItem(position).getChapterId(),\n                    mArticleAdapter.getItem(position).getChapterName()));\n            ARouter.getInstance().build(\"/article/ArticleTypeActivity\")\n                    .withString(Constant.CONTENT_TITLE_KEY, mArticleAdapter.getItem(position).getChapterName())\n                    .withObject(Constant.CONTENT_CHILDREN_DATA_KEY, childrenBeans)\n                    .navigation();\n        } else if (view.getId() == R.id.ivCollect) {\n            mPresenter.collectArticle(position, mArticleAdapter.getItem(position));\n        }\n    }\n\n    @Override\n    public void onItemClick(BaseQuickAdapter adapter, View view, int position) {\n        ArticleContentActivity.start(mArticleAdapter.getItem(position).getId(),\n                mArticleAdapter.getItem(position).getLink(), mArticleAdapter.getItem(position).getTitle(),\n                mArticleAdapter.getItem(position).getAuthor());\n    }\n\n    @Override\n    public void showLoading() {\n        mSwipeRefreshLayout.setRefreshing(true);\n    }\n\n    @Override\n    public void onLoadMoreRequested() {\n        mPresenter.loadMore();\n    }\n\n    @Override\n    public void setSearchArtcles(Article article, int loadType) {\n        setLoadDataResult(mArticleAdapter, mSwipeRefreshLayout, article.getDatas(), loadType);\n    }\n\n    @Override\n    public void collectArticleSuccess(int position, Article.DatasBean bean) {\n        mArticleAdapter.setData(position, bean);\n    }\n\n    @Override\n    public void setHistory(List<HistoryModel> historyModels) {\n        this.mHistoryModels = historyModels;\n        mHistoryAdapter = new HistoryAdapter(this, mHistoryModels);\n        mTflHistorys.setAdapter(mHistoryAdapter);\n        mSwipeRefreshLayout.setRefreshing(false);\n    }\n\n    @Override\n    public void addHistorySuccess(HistoryModel historyModel) {\n        if (mHistoryModels != null) mHistoryModels.add(0, historyModel);\n        mHistoryAdapter.notifyDataChanged();\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/lw/wanandroid/ui/hotsearch/SearchContract.java",
    "content": "package com.lw.wanandroid.ui.hotsearch;\n\nimport com.lw.wanandroid.base.BaseContract;\nimport com.lw.wanandroid.bean.Article;\nimport com.lw.wanandroid.constant.LoadType;\nimport com.lw.wanandroid.db.HistoryModel;\n\nimport java.util.List;\n\n/**\n * Created by lw on 2018/1/23.\n */\n\npublic interface SearchContract {\n    interface View extends BaseContract.BaseView {\n        void setSearchArtcles(Article article, @LoadType.checker int loadType);\n\n        void collectArticleSuccess(int position, Article.DatasBean bean);\n\n        void setHistory(List<HistoryModel> historyModels);\n\n        void addHistorySuccess(HistoryModel historyModel);\n    }\n\n    interface Presenter extends BaseContract.BasePresenter<SearchContract.View> {\n        void loadSearchArtcles(String k);\n\n        void refresh();\n\n        void loadMore();\n\n        void collectArticle(int position, Article.DatasBean bean);\n\n        void loadHistory();\n\n        void addHistory(String name);\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/lw/wanandroid/ui/hotsearch/SearchPresenter.java",
    "content": "package com.lw.wanandroid.ui.hotsearch;\n\nimport com.lw.wanandroid.base.BasePresenter;\nimport com.lw.wanandroid.bean.Article;\nimport com.lw.wanandroid.bean.DataResponse;\nimport com.lw.wanandroid.constant.LoadType;\nimport com.lw.wanandroid.db.HistoryModel;\nimport com.lw.wanandroid.db.HistoryModel_Table;\nimport com.lw.wanandroid.net.ApiService;\nimport com.lw.wanandroid.net.RetrofitManager;\nimport com.lw.wanandroid.utils.ArticleUtils;\nimport com.lw.wanandroid.utils.RxSchedulers;\nimport com.raizlabs.android.dbflow.sql.language.SQLite;\n\nimport java.util.Date;\nimport java.util.List;\n\nimport javax.inject.Inject;\n\nimport io.reactivex.Observable;\nimport io.reactivex.ObservableEmitter;\nimport io.reactivex.ObservableOnSubscribe;\nimport io.reactivex.functions.Consumer;\n\n/**\n * Created by lw on 2018/1/23.\n */\n\npublic class SearchPresenter extends BasePresenter<SearchContract.View> implements SearchContract.Presenter {\n    private int mPage;\n    private boolean mIsRefresh;\n    private String mK;\n\n    @Inject\n    public SearchPresenter() {\n        this.mIsRefresh = true;\n    }\n\n    @Override\n    public void loadSearchArtcles(String k) {\n        this.mK = k;\n        RetrofitManager.create(ApiService.class)\n                .getSearchArticles(mPage, mK)\n                .compose(RxSchedulers.<DataResponse<Article>>applySchedulers())\n                .compose(mView.<DataResponse<Article>>bindToLife())\n                .subscribe(new Consumer<DataResponse<Article>>() {\n                    @Override\n                    public void accept(DataResponse<Article> dataResponse) throws Exception {\n                        int loadType = mIsRefresh ? LoadType.TYPE_REFRESH_SUCCESS : LoadType.TYPE_LOAD_MORE_SUCCESS;\n                        mView.setSearchArtcles(dataResponse.getData(), loadType);\n                    }\n                }, new Consumer<Throwable>() {\n                    @Override\n                    public void accept(Throwable throwable) throws Exception {\n                        int loadType = mIsRefresh ? LoadType.TYPE_REFRESH_ERROR : LoadType.TYPE_LOAD_MORE_ERROR;\n                        mView.setSearchArtcles(new Article(), loadType);\n                    }\n                });\n\n    }\n\n    @Override\n    public void refresh() {\n        mPage = 0;\n        mIsRefresh = true;\n        loadSearchArtcles(mK);\n    }\n\n    @Override\n    public void loadMore() {\n        mPage++;\n        mIsRefresh = false;\n        loadSearchArtcles(mK);\n    }\n\n    @Override\n    public void collectArticle(final int position, final Article.DatasBean bean) {\n        ArticleUtils.collectArticle(mView, position, bean);\n    }\n\n    @Override\n    public void loadHistory() {\n        mView.showLoading();\n        Observable.create(new ObservableOnSubscribe<List<HistoryModel>>() {\n            @Override\n            public void subscribe(ObservableEmitter<List<HistoryModel>> e) throws Exception {\n                List<HistoryModel> historyModels = SQLite.select().from(HistoryModel.class)\n                        .orderBy(HistoryModel_Table.date, false)\n                        .limit(10).offset(0)\n                        .queryList();\n                e.onNext(historyModels);\n            }\n        }).compose(RxSchedulers.<List<HistoryModel>>applySchedulers()).compose(mView.<List<HistoryModel>>bindToLife()).subscribe(new Consumer<List<HistoryModel>>() {\n            @Override\n            public void accept(List<HistoryModel> historyModels) throws Exception {\n                mView.setHistory(historyModels);\n            }\n        }, new Consumer<Throwable>() {\n            @Override\n            public void accept(Throwable throwable) throws Exception {\n                mView.showFaild(throwable.getMessage());\n            }\n        });\n\n    }\n\n    @Override\n    public void addHistory(String name) {\n        HistoryModel historyModel = new HistoryModel();\n        historyModel.setName(name);\n        historyModel.setDate(new Date());\n        long id = historyModel.insert();\n        if (id > 0) mView.addHistorySuccess(historyModel);\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/lw/wanandroid/ui/knowledgesystem/KnowledgeSystemAdapter.java",
    "content": "package com.lw.wanandroid.ui.knowledgesystem;\n\nimport com.chad.library.adapter.base.BaseQuickAdapter;\nimport com.chad.library.adapter.base.BaseViewHolder;\nimport com.lw.wanandroid.R;\nimport com.lw.wanandroid.bean.KnowledgeSystem;\n\nimport javax.inject.Inject;\n\n/**\n * Created by lw on 2018/1/22.\n */\n\npublic class KnowledgeSystemAdapter extends BaseQuickAdapter<KnowledgeSystem, BaseViewHolder> {\n    @Inject\n    public KnowledgeSystemAdapter() {\n        super(R.layout.item_knowledge_system, null);\n    }\n\n    @Override\n    protected void convert(BaseViewHolder helper, KnowledgeSystem item) {\n        helper.setText(R.id.typeItemFirst, item.getName());\n        StringBuffer sb = new StringBuffer();\n        for (KnowledgeSystem.ChildrenBean childrenBean : item.getChildren()) {\n            sb.append(childrenBean.getName() + \"     \");\n        }\n        helper.setText(R.id.typeItemSecond, sb.toString());\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/lw/wanandroid/ui/knowledgesystem/KnowledgeSystemContract.java",
    "content": "package com.lw.wanandroid.ui.knowledgesystem;\n\nimport com.lw.wanandroid.base.BaseContract;\nimport com.lw.wanandroid.bean.KnowledgeSystem;\n\nimport java.util.List;\n\n/**\n * Created by lw on 2018/1/19.\n */\n\npublic interface KnowledgeSystemContract {\n    interface View extends BaseContract.BaseView {\n        void setKnowledgeSystems(List<KnowledgeSystem> knowledgeSystems);\n    }\n\n    interface Presenter extends BaseContract.BasePresenter<KnowledgeSystemContract.View> {\n        void loadKnowledgeSystems();\n\n        void refresh();\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/lw/wanandroid/ui/knowledgesystem/KnowledgeSystemFragment.java",
    "content": "package com.lw.wanandroid.ui.knowledgesystem;\n\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.alibaba.android.arouter.launcher.ARouter;\nimport com.chad.library.adapter.base.BaseQuickAdapter;\nimport com.lw.wanandroid.R;\nimport com.lw.wanandroid.base.BaseFragment;\nimport com.lw.wanandroid.bean.KnowledgeSystem;\nimport com.lw.wanandroid.constant.Constant;\n\nimport java.util.List;\n\nimport javax.inject.Inject;\n\nimport butterknife.BindView;\n\n/**\n * Created by lw on 2018/1/18.\n */\n\npublic class KnowledgeSystemFragment extends BaseFragment<KnowledgeSystemPresenter> implements KnowledgeSystemContract.View,\n        KnowledgeSystemAdapter.OnItemClickListener, SwipeRefreshLayout.OnRefreshListener {\n    @BindView(R.id.rvKnowledgeSystems)\n    RecyclerView mRvKnowledgeSystems;\n    @BindView(R.id.swipeRefreshLayout)\n    SwipeRefreshLayout mSwipeRefreshLayout;\n    @Inject\n    KnowledgeSystemAdapter mKnowledgeSystemAdapter;\n\n    @Override\n    protected int getLayoutId() {\n        return R.layout.fragment_knowledge_system;\n    }\n\n    @Override\n    protected void initInjector() {\n        mFragmentComponent.inject(this);\n    }\n\n    @Override\n    protected void initView(View view) {\n        /**设置RecyclerView*/\n        mRvKnowledgeSystems.setLayoutManager(new LinearLayoutManager(getContext()));\n        mRvKnowledgeSystems.setAdapter(mKnowledgeSystemAdapter);\n\n        /**设置事件监听*/\n        mKnowledgeSystemAdapter.setOnItemClickListener(this);\n        mSwipeRefreshLayout.setOnRefreshListener(this);\n\n        /**请求数据*/\n        mPresenter.loadKnowledgeSystems();\n    }\n\n    @Override\n    public void showLoading() {\n        mSwipeRefreshLayout.setRefreshing(true);\n    }\n\n    @Override\n    public void showFaild(String errorMsg) {\n        mSwipeRefreshLayout.setRefreshing(false);\n    }\n\n    @Override\n    public void setKnowledgeSystems(List<KnowledgeSystem> knowledgeSystems) {\n        mKnowledgeSystemAdapter.setNewData(knowledgeSystems);\n        mSwipeRefreshLayout.setRefreshing(false);\n    }\n\n    @Override\n    public void onRefresh() {\n        mPresenter.refresh();\n    }\n\n    @Override\n    public void onItemClick(BaseQuickAdapter adapter, View view, int position) {\n        ARouter.getInstance().build(\"/article/ArticleTypeActivity\")\n                .withString(Constant.CONTENT_TITLE_KEY, mKnowledgeSystemAdapter.getItem(position).getName())\n                .withObject(Constant.CONTENT_CHILDREN_DATA_KEY, mKnowledgeSystemAdapter.getItem(position).getChildren())\n                .navigation();\n    }\n\n    public static KnowledgeSystemFragment newInstance() {\n        return new KnowledgeSystemFragment();\n    }\n\n}\n"
  },
  {
    "path": "app/src/main/java/com/lw/wanandroid/ui/knowledgesystem/KnowledgeSystemPresenter.java",
    "content": "package com.lw.wanandroid.ui.knowledgesystem;\n\nimport com.lw.wanandroid.base.BasePresenter;\nimport com.lw.wanandroid.bean.DataResponse;\nimport com.lw.wanandroid.bean.KnowledgeSystem;\nimport com.lw.wanandroid.net.ApiService;\nimport com.lw.wanandroid.net.RetrofitManager;\nimport com.lw.wanandroid.utils.RxSchedulers;\n\nimport java.util.List;\n\nimport javax.inject.Inject;\n\nimport io.reactivex.functions.Consumer;\n\n/**\n * Created by lw on 2018/1/19.\n */\n\npublic class KnowledgeSystemPresenter extends BasePresenter<KnowledgeSystemContract.View> implements KnowledgeSystemContract.Presenter {\n    @Inject\n    public KnowledgeSystemPresenter() {\n\n    }\n\n    @Override\n    public void loadKnowledgeSystems() {\n        mView.showLoading();\n        RetrofitManager.create(ApiService.class)\n                .getKnowledgeSystems()\n                .compose(RxSchedulers.<DataResponse<List<KnowledgeSystem>>>applySchedulers())\n                .compose(mView.<DataResponse<List<KnowledgeSystem>>>bindToLife())\n                .subscribe(new Consumer<DataResponse<List<KnowledgeSystem>>>() {\n                    @Override\n                    public void accept(DataResponse<List<KnowledgeSystem>> dataResponse) throws Exception {\n                        mView.setKnowledgeSystems(dataResponse.getData());\n                    }\n                }, new Consumer<Throwable>() {\n                    @Override\n                    public void accept(Throwable throwable) throws Exception {\n                        mView.showFaild(throwable.getMessage());\n                    }\n                });\n    }\n\n    @Override\n    public void refresh() {\n        loadKnowledgeSystems();\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/lw/wanandroid/ui/my/LoginActivity.java",
    "content": "package com.lw.wanandroid.ui.my;\n\nimport android.support.design.widget.TextInputEditText;\n\nimport com.alibaba.android.arouter.facade.annotation.Route;\nimport com.alibaba.android.arouter.launcher.ARouter;\nimport com.blankj.utilcode.util.SPUtils;\nimport com.blankj.utilcode.util.StringUtils;\nimport com.blankj.utilcode.util.ToastUtils;\nimport com.lw.wanandroid.R;\nimport com.lw.wanandroid.base.BaseActivity;\nimport com.lw.wanandroid.bean.User;\nimport com.lw.wanandroid.constant.Constant;\nimport com.lw.wanandroid.event.LoginEvent;\nimport com.lw.wanandroid.utils.RxBus;\n\nimport butterknife.BindView;\nimport butterknife.OnClick;\n\n/**\n * Created by lw on 2018/1/24.\n */\n@Route(path = \"/my/LoginActivity\")\npublic class LoginActivity extends BaseActivity<LoginPresenter> implements LoginContract.View {\n    @BindView(R.id.etUsername)\n    TextInputEditText mEtUsername;\n    @BindView(R.id.etPassword)\n    TextInputEditText mEtPassword;\n\n    @Override\n    protected int getLayoutId() {\n        return R.layout.activity_login;\n    }\n\n    @Override\n    protected void initInjector() {\n        mActivityComponent.inject(this);\n    }\n\n    @Override\n    protected void initView() {\n        mEtUsername.setText(SPUtils.getInstance(Constant.SHARED_NAME).getString(Constant.USERNAME_KEY));\n        mEtPassword.setText(SPUtils.getInstance(Constant.SHARED_NAME).getString(Constant.PASSWORD_KEY));\n    }\n\n    @Override\n    protected boolean showHomeAsUp() {\n        return true;\n    }\n\n    @OnClick(R.id.btnLogin)\n    public void login() {\n        String username = mEtUsername.getText().toString();\n        String password = mEtPassword.getText().toString();\n        if (StringUtils.isEmpty(username) || StringUtils.isEmpty(password)) {\n            ToastUtils.showShort(R.string.the_username_or_password_can_not_be_empty);\n            return;\n        }\n        mPresenter.login(username, password);\n    }\n\n    @Override\n    public void loginSuccess(User user) {\n        SPUtils.getInstance(Constant.SHARED_NAME).put(Constant.LOGIN_KEY, true);\n        SPUtils.getInstance(Constant.SHARED_NAME).put(Constant.USERNAME_KEY, user.getUsername());\n        SPUtils.getInstance(Constant.SHARED_NAME).put(Constant.PASSWORD_KEY, user.getPassword());\n        /**登陆成功通知其他界面刷新*/\n        RxBus.getInstance().post(new LoginEvent());\n        this.finish();\n    }\n\n    public static void start() {\n        ARouter.getInstance().build(\"/my/LoginActivity\").navigation();\n    }\n\n}\n"
  },
  {
    "path": "app/src/main/java/com/lw/wanandroid/ui/my/LoginContract.java",
    "content": "package com.lw.wanandroid.ui.my;\n\nimport com.lw.wanandroid.base.BaseContract;\nimport com.lw.wanandroid.bean.User;\n\n/**\n * Created by lw on 2018/1/24.\n */\n\npublic interface LoginContract {\n    interface View extends BaseContract.BaseView {\n        void loginSuccess(User user);\n    }\n\n    interface Presenter extends BaseContract.BasePresenter<LoginContract.View> {\n        void login(String username, String password);\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/lw/wanandroid/ui/my/LoginPresenter.java",
    "content": "package com.lw.wanandroid.ui.my;\n\nimport com.lw.wanandroid.base.BasePresenter;\nimport com.lw.wanandroid.bean.DataResponse;\nimport com.lw.wanandroid.bean.User;\nimport com.lw.wanandroid.net.ApiService;\nimport com.lw.wanandroid.net.RetrofitManager;\nimport com.lw.wanandroid.utils.RxSchedulers;\n\nimport javax.inject.Inject;\n\nimport io.reactivex.functions.Consumer;\n\n/**\n * Created by lw on 2018/1/24.\n */\n\npublic class LoginPresenter extends BasePresenter<LoginContract.View> implements LoginContract.Presenter {\n    @Inject\n    public LoginPresenter() {\n    }\n\n    @Override\n    public void login(String username, String password) {\n        RetrofitManager.create(ApiService.class)\n                .login(username, password)\n                .compose(RxSchedulers.<DataResponse<User>>applySchedulers())\n                .compose(mView.<DataResponse<User>>bindToLife())\n                .subscribe(new Consumer<DataResponse<User>>() {\n                    @Override\n                    public void accept(DataResponse<User> response) throws Exception {\n                        if (response.getErrorCode() == 0) {\n                            mView.loginSuccess(response.getData());\n                        } else {\n                            mView.showFaild(String.valueOf(response.getErrorMsg()));\n                        }\n                    }\n                }, new Consumer<Throwable>() {\n                    @Override\n                    public void accept(Throwable throwable) throws Exception {\n                        mView.showFaild(throwable.getMessage());\n                    }\n                });\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/lw/wanandroid/ui/my/MyBookmarkActivity.java",
    "content": "package com.lw.wanandroid.ui.my;\n\nimport android.support.v4.widget.SwipeRefreshLayout;\nimport android.util.Log;\nimport android.view.View;\n\nimport com.alibaba.android.arouter.facade.annotation.Route;\nimport com.blankj.utilcode.util.ToastUtils;\nimport com.lw.wanandroid.R;\nimport com.lw.wanandroid.base.BaseActivity;\nimport com.lw.wanandroid.bean.Friend;\nimport com.lw.wanandroid.ui.article.ArticleContentActivity;\nimport com.lw.wanandroid.ui.hotsearch.HotAdapter;\nimport com.zhy.view.flowlayout.FlowLayout;\nimport com.zhy.view.flowlayout.TagFlowLayout;\n\nimport java.util.List;\nimport java.util.Set;\n\nimport butterknife.BindView;\n\n/**\n * Created by lw on 2018/1/25.\n */\n@Route(path = \"/my/MyBookmarkActivity\")\npublic class MyBookmarkActivity extends BaseActivity<MyBookmarkPresenter> implements MyBookmarkContract.View, SwipeRefreshLayout.OnRefreshListener {\n    @BindView(R.id.tflMyBookmarks)\n    TagFlowLayout mTflMyBookmarks;\n    @BindView(R.id.swipeRefreshLayout)\n    SwipeRefreshLayout mSwipeRefreshLayout;\n    private HotAdapter<Friend> mBookmarkAdapter;\n\n    @Override\n    protected int getLayoutId() {\n        return R.layout.activity_my_bookmark;\n    }\n\n    @Override\n    protected void initInjector() {\n        mActivityComponent.inject(this);\n    }\n\n    @Override\n    protected void initView() {\n        mSwipeRefreshLayout.setOnRefreshListener(this);\n        mPresenter.loadMyBookmarks();\n\n        mTflMyBookmarks.setOnTagClickListener(new TagFlowLayout.OnTagClickListener() {\n            @Override\n            public boolean onTagClick(View view, int position, FlowLayout parent) {\n                ArticleContentActivity.start(mBookmarkAdapter.getItem(position).getId(),\n                        mBookmarkAdapter.getItem(position).getLink(), mBookmarkAdapter.getItem(position).getName(),\n                        null);\n                return false;\n            }\n        });\n\n    }\n\n    @Override\n    protected boolean showHomeAsUp() {\n        return true;\n    }\n\n    @Override\n    public void setMyBookmarks(List<Friend> bookmarks) {\n        mBookmarkAdapter = new HotAdapter(this, bookmarks);\n        mTflMyBookmarks.setAdapter(mBookmarkAdapter);\n        mSwipeRefreshLayout.setRefreshing(false);\n    }\n\n    @Override\n    public void showLoading() {\n        mSwipeRefreshLayout.setRefreshing(true);\n    }\n\n    @Override\n    public void onRefresh() {\n        mPresenter.refresh();\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/lw/wanandroid/ui/my/MyBookmarkContract.java",
    "content": "package com.lw.wanandroid.ui.my;\n\nimport com.lw.wanandroid.base.BaseContract;\nimport com.lw.wanandroid.bean.Friend;\n\nimport java.util.List;\n\n/**\n * Created by lw on 2018/2/2.\n */\n\npublic interface MyBookmarkContract {\n    interface View extends BaseContract.BaseView {\n        void setMyBookmarks(List<Friend> bookmarks);\n    }\n\n    interface Presenter extends BaseContract.BasePresenter<MyBookmarkContract.View> {\n        void loadMyBookmarks();\n\n        void editBookmark(int id, String name, String link);\n\n        void delBookmark(int id);\n\n        void refresh();\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/lw/wanandroid/ui/my/MyBookmarkPresenter.java",
    "content": "package com.lw.wanandroid.ui.my;\n\nimport com.lw.wanandroid.base.BasePresenter;\nimport com.lw.wanandroid.bean.DataResponse;\nimport com.lw.wanandroid.bean.Friend;\nimport com.lw.wanandroid.net.ApiService;\nimport com.lw.wanandroid.net.RetrofitManager;\nimport com.lw.wanandroid.utils.RxSchedulers;\n\nimport java.util.List;\n\nimport javax.inject.Inject;\n\nimport io.reactivex.functions.Consumer;\n\n/**\n * Created by lw on 2018/2/2.\n */\n\npublic class MyBookmarkPresenter extends BasePresenter<MyBookmarkContract.View> implements MyBookmarkContract.Presenter {\n    private boolean mIsRefresh;\n\n    @Inject\n    public MyBookmarkPresenter() {\n        this.mIsRefresh = true;\n    }\n\n    @Override\n    public void loadMyBookmarks() {\n        mView.showLoading();\n        RetrofitManager.create(ApiService.class)\n                .getBookmarks()\n                .compose(RxSchedulers.<DataResponse<List<Friend>>>applySchedulers())\n                .compose(mView.<DataResponse<List<Friend>>>bindToLife())\n                .subscribe(new Consumer<DataResponse<List<Friend>>>() {\n                    @Override\n                    public void accept(DataResponse<List<Friend>> response) throws Exception {\n                        mView.setMyBookmarks(response.getData());\n                    }\n                }, new Consumer<Throwable>() {\n                    @Override\n                    public void accept(Throwable throwable) throws Exception {\n                        mView.showFaild(throwable.getMessage());\n                    }\n                });\n    }\n\n    @Override\n    public void editBookmark(int id, String name, String link) {\n\n    }\n\n    @Override\n    public void delBookmark(int id) {\n\n    }\n\n    @Override\n    public void refresh() {\n        mIsRefresh = true;\n        loadMyBookmarks();\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/lw/wanandroid/ui/my/MyCollectionActivity.java",
    "content": "package com.lw.wanandroid.ui.my;\n\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.alibaba.android.arouter.facade.annotation.Route;\nimport com.alibaba.android.arouter.launcher.ARouter;\nimport com.chad.library.adapter.base.BaseQuickAdapter;\nimport com.lw.wanandroid.R;\nimport com.lw.wanandroid.base.BaseActivity;\nimport com.lw.wanandroid.bean.Article;\nimport com.lw.wanandroid.bean.KnowledgeSystem;\nimport com.lw.wanandroid.constant.Constant;\nimport com.lw.wanandroid.ui.article.ArticleAdapter;\nimport com.lw.wanandroid.ui.article.ArticleContentActivity;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\nimport javax.inject.Inject;\n\nimport butterknife.BindView;\n\n/**\n * Created by lw on 2018/1/25.\n */\n@Route(path = \"/my/MyCollectionActivity\")\npublic class MyCollectionActivity extends BaseActivity<MyCollectionPresenter> implements MyCollectionContract.View,\n        ArticleAdapter.OnItemClickListener, ArticleAdapter.OnItemChildClickListener, SwipeRefreshLayout.OnRefreshListener, ArticleAdapter.RequestLoadMoreListener {\n    @BindView(R.id.rvMyCollectionArticles)\n    RecyclerView mRvMyCollectionArticles;\n    @BindView(R.id.swipeRefreshLayout)\n    SwipeRefreshLayout mSwipeRefreshLayout;\n    @Inject\n    ArticleAdapter mArticleAdapter;\n\n    @Override\n    protected int getLayoutId() {\n        return R.layout.activity_my_collection;\n    }\n\n    @Override\n    protected void initInjector() {\n        mActivityComponent.inject(this);\n    }\n\n    @Override\n    protected void initView() {\n        /**设置RecyclerView*/\n        mRvMyCollectionArticles.setLayoutManager(new LinearLayoutManager(this));\n        mRvMyCollectionArticles.setAdapter(mArticleAdapter);\n\n        /**设置事件监听*/\n        mArticleAdapter.setOnItemClickListener(this);\n        mArticleAdapter.setOnItemChildClickListener(this);\n        mSwipeRefreshLayout.setOnRefreshListener(this);\n        mArticleAdapter.setOnLoadMoreListener(this);\n        mArticleAdapter.isMyColection(true);\n\n        /**请求数据*/\n        mPresenter.loadMyCollectArticles();\n    }\n\n    @Override\n    public void showLoading() {\n        mSwipeRefreshLayout.setRefreshing(true);\n    }\n\n    @Override\n    protected boolean showHomeAsUp() {\n        return true;\n    }\n\n    @Override\n    public void setMyCollectArticles(Article article, int loadType) {\n        setLoadDataResult(mArticleAdapter, mSwipeRefreshLayout, article.getDatas(), loadType);\n    }\n\n    @Override\n    public void unCollectArticleSuccess(int position) {\n        mArticleAdapter.remove(position);\n    }\n\n    @Override\n    public void onRefresh() {\n        mPresenter.refresh();\n    }\n\n    @Override\n    public void onItemChildClick(BaseQuickAdapter adapter, View view, int position) {\n        if (view.getId() == R.id.tvChapterName) {\n            List<KnowledgeSystem.ChildrenBean> childrenBeans = new ArrayList<>();\n            childrenBeans.add(new KnowledgeSystem.ChildrenBean(mArticleAdapter.getItem(position).getChapterId(),\n                    mArticleAdapter.getItem(position).getChapterName()));\n            ARouter.getInstance().build(\"/article/ArticleTypeActivity\")\n                    .withString(Constant.CONTENT_TITLE_KEY, mArticleAdapter.getItem(position).getChapterName())\n                    .withObject(Constant.CONTENT_CHILDREN_DATA_KEY, childrenBeans)\n                    .navigation();\n        } else if (view.getId() == R.id.ivCollect) {\n            mPresenter.unCollectArticle(position, mArticleAdapter.getItem(position));\n        }\n    }\n\n    @Override\n    public void onItemClick(BaseQuickAdapter adapter, View view, int position) {\n        ArticleContentActivity.start(mArticleAdapter.getItem(position).getId(),\n                mArticleAdapter.getItem(position).getLink(), mArticleAdapter.getItem(position).getTitle(),\n                mArticleAdapter.getItem(position).getAuthor());\n    }\n\n    @Override\n    public void onLoadMoreRequested() {\n        mPresenter.loadMore();\n    }\n\n}\n"
  },
  {
    "path": "app/src/main/java/com/lw/wanandroid/ui/my/MyCollectionContract.java",
    "content": "package com.lw.wanandroid.ui.my;\n\nimport com.lw.wanandroid.base.BaseContract;\nimport com.lw.wanandroid.bean.Article;\nimport com.lw.wanandroid.constant.LoadType;\n\n/**\n * Created by lw on 2018/2/2.\n */\n\npublic interface MyCollectionContract {\n    interface View extends BaseContract.BaseView {\n        void setMyCollectArticles(Article article, @LoadType.checker int loadType);\n\n        void unCollectArticleSuccess(int position);\n    }\n\n    interface Presenter extends BaseContract.BasePresenter<MyCollectionContract.View> {\n        void loadMyCollectArticles();\n\n        void refresh();\n\n        void loadMore();\n\n        void unCollectArticle(int position, Article.DatasBean bean);\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/lw/wanandroid/ui/my/MyCollectionPresenter.java",
    "content": "package com.lw.wanandroid.ui.my;\n\nimport com.lw.wanandroid.base.BasePresenter;\nimport com.lw.wanandroid.bean.Article;\nimport com.lw.wanandroid.bean.DataResponse;\nimport com.lw.wanandroid.constant.LoadType;\nimport com.lw.wanandroid.net.ApiService;\nimport com.lw.wanandroid.net.RetrofitManager;\nimport com.lw.wanandroid.utils.ArticleUtils;\nimport com.lw.wanandroid.utils.RxSchedulers;\n\nimport javax.inject.Inject;\n\nimport io.reactivex.functions.Consumer;\n\n/**\n * Created by lw on 2018/2/2.\n */\n\npublic class MyCollectionPresenter extends BasePresenter<MyCollectionContract.View> implements MyCollectionContract.Presenter {\n    private int mPage;\n    private boolean mIsRefresh;\n\n    @Inject\n    public MyCollectionPresenter() {\n        this.mIsRefresh = true;\n    }\n\n    @Override\n    public void loadMyCollectArticles() {\n        if (mIsRefresh) mView.showLoading();\n        RetrofitManager.create(ApiService.class)\n                .getCollectArticles(mPage)\n                .compose(RxSchedulers.<DataResponse<Article>>applySchedulers())\n                .compose(mView.<DataResponse<Article>>bindToLife())\n                .subscribe(new Consumer<DataResponse<Article>>() {\n                    @Override\n                    public void accept(DataResponse<Article> dataResponse) throws Exception {\n                        int loadType = mIsRefresh ? LoadType.TYPE_REFRESH_SUCCESS : LoadType.TYPE_LOAD_MORE_SUCCESS;\n                        mView.setMyCollectArticles(dataResponse.getData(), loadType);\n                    }\n                }, new Consumer<Throwable>() {\n                    @Override\n                    public void accept(Throwable throwable) throws Exception {\n                        int loadType = mIsRefresh ? LoadType.TYPE_REFRESH_ERROR : LoadType.TYPE_LOAD_MORE_ERROR;\n                        mView.setMyCollectArticles(new Article(), loadType);\n                    }\n                });\n    }\n\n    @Override\n    public void refresh() {\n        mPage = 0;\n        mIsRefresh = true;\n        loadMyCollectArticles();\n    }\n\n    @Override\n    public void loadMore() {\n        mPage++;\n        mIsRefresh = false;\n        loadMyCollectArticles();\n    }\n\n    @Override\n    public void unCollectArticle(final int position, final Article.DatasBean bean) {\n        ArticleUtils.collectArticle(mView, position, bean);\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/lw/wanandroid/ui/my/MyContract.java",
    "content": "package com.lw.wanandroid.ui.my;\n\nimport com.lw.wanandroid.base.BaseContract;\n\n/**\n * Created by lw on 2018/1/19.\n */\n\npublic interface MyContract {\n    interface View extends BaseContract.BaseView {\n    }\n\n    interface Presenter extends BaseContract.BasePresenter<MyContract.View> {\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/lw/wanandroid/ui/my/MyFragment.java",
    "content": "package com.lw.wanandroid.ui.my;\n\nimport android.view.View;\nimport android.widget.LinearLayout;\nimport android.widget.TextView;\n\nimport com.alibaba.android.arouter.launcher.ARouter;\nimport com.blankj.utilcode.util.SPUtils;\nimport com.blankj.utilcode.util.ToastUtils;\nimport com.lw.wanandroid.R;\nimport com.lw.wanandroid.base.BaseFragment;\nimport com.lw.wanandroid.constant.Constant;\nimport com.lw.wanandroid.event.LoginEvent;\nimport com.lw.wanandroid.net.CookiesManager;\nimport com.lw.wanandroid.utils.RxBus;\n\nimport butterknife.BindView;\nimport butterknife.OnClick;\nimport de.hdodenhof.circleimageview.CircleImageView;\nimport io.reactivex.functions.Consumer;\n\n/**\n * Created by lw on 2018/1/18.\n */\n\npublic class MyFragment extends BaseFragment<MyPresenter> implements MyContract.View {\n    @BindView(R.id.civAvatar)\n    CircleImageView mCivAvatar;\n    @BindView(R.id.tvNick)\n    TextView mTvNick;\n    @BindView(R.id.llLogout)\n    LinearLayout mLlLogout;\n    private boolean mIsLogin;\n\n    @Override\n    protected int getLayoutId() {\n        return R.layout.fragment_my;\n    }\n\n    @Override\n    protected void initInjector() {\n        mFragmentComponent.inject(this);\n    }\n\n    @Override\n    protected void initView(View view) {\n        setUserStatusInfo();\n        /**登陆成功重新设置用户新*/\n        RxBus.getInstance().toFlowable(LoginEvent.class).subscribe(new Consumer<LoginEvent>() {\n            @Override\n            public void accept(LoginEvent event) throws Exception {\n                setUserStatusInfo();\n            }\n        });\n    }\n\n    @OnClick({R.id.civAvatar, R.id.tvMyCollection, R.id.tvMyBookmark, R.id.tvSetting, R.id.llLogout})\n    public void onViewClicked(View view) {\n        switch (view.getId()) {\n            case R.id.civAvatar:\n                if (!mIsLogin) LoginActivity.start();\n                break;\n            case R.id.tvMyCollection:\n                if (mIsLogin) ARouter.getInstance().build(\"/my/MyCollectionActivity\").navigation();\n                else ToastUtils.showShort(R.string.not_login);\n                break;\n            case R.id.tvMyBookmark:\n                if (mIsLogin) ARouter.getInstance().build(\"/my/MyBookmarkActivity\").navigation();\n                else ToastUtils.showShort(R.string.not_login);\n                break;\n            case R.id.tvSetting:\n                ARouter.getInstance().build(\"/setting/SettingActivity\").navigation();\n                break;\n            case R.id.llLogout:\n                logout();\n                break;\n        }\n    }\n\n    /**\n     * 退出登陆\n     */\n    private void logout() {\n        /**设置退出登陆*/\n        SPUtils.getInstance(Constant.SHARED_NAME).clear();\n        setUserStatusInfo();\n        /**清除cookies*/\n        CookiesManager.clearAllCookies();\n        /**发送退出登陆的消息*/\n        RxBus.getInstance().post(new LoginEvent());\n    }\n\n    /**\n     * 设置用户状态信息\n     */\n    private void setUserStatusInfo() {\n        mIsLogin = SPUtils.getInstance(Constant.SHARED_NAME).getBoolean(Constant.LOGIN_KEY);\n        if (mIsLogin) {\n            mCivAvatar.setImageResource(R.drawable.ic_head_portrait);\n            mTvNick.setText(SPUtils.getInstance(Constant.SHARED_NAME).getString(Constant.USERNAME_KEY));\n            mLlLogout.setVisibility(View.VISIBLE);\n        } else {\n            mCivAvatar.setImageResource(R.drawable.ic_avatar);\n            mTvNick.setText(R.string.click_avatar_login);\n            mLlLogout.setVisibility(View.GONE);\n        }\n    }\n\n    public static MyFragment newInstance() {\n        return new MyFragment();\n    }\n\n}\n"
  },
  {
    "path": "app/src/main/java/com/lw/wanandroid/ui/my/MyPresenter.java",
    "content": "package com.lw.wanandroid.ui.my;\n\nimport com.lw.wanandroid.base.BasePresenter;\n\nimport javax.inject.Inject;\n\n/**\n * Created by lw on 2018/1/19.\n */\n\npublic class MyPresenter extends BasePresenter<MyContract.View> implements MyContract.Presenter {\n    @Inject\n    public MyPresenter() {\n\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/lw/wanandroid/ui/my/RegisterActivity.java",
    "content": "package com.lw.wanandroid.ui.my;\n\nimport com.alibaba.android.arouter.facade.annotation.Route;\nimport com.lw.wanandroid.R;\nimport com.lw.wanandroid.base.BaseActivity;\n\n/**\n * Created by lw on 2018/1/24.\n */\n@Route(path = \"/my/RegisterActivity\")\npublic class RegisterActivity extends BaseActivity {\n    @Override\n    protected int getLayoutId() {\n        return R.layout.activity_register;\n    }\n\n    @Override\n    protected void initInjector() {\n\n    }\n\n    @Override\n    protected void initView() {\n\n    }\n\n    @Override\n    protected boolean showHomeAsUp() {\n        return true;\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/lw/wanandroid/ui/setting/SettingActivity.java",
    "content": "package com.lw.wanandroid.ui.setting;\n\nimport com.alibaba.android.arouter.facade.annotation.Route;\nimport com.lw.wanandroid.R;\nimport com.lw.wanandroid.base.BaseActivity;\n\n/**\n * Created by lw on 2018/1/25.\n */\n@Route(path = \"/setting/SettingActivity\")\npublic class SettingActivity extends BaseActivity {\n    @Override\n    protected int getLayoutId() {\n        return R.layout.activity_setting;\n    }\n\n    @Override\n    protected void initInjector() {\n\n    }\n\n    @Override\n    protected void initView() {\n        getSupportFragmentManager().beginTransaction()\n                .replace(R.id.layout_fragment, SettingFragment.newInstance())\n                .commit();\n    }\n\n    @Override\n    protected boolean showHomeAsUp() {\n        return true;\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/lw/wanandroid/ui/setting/SettingFragment.java",
    "content": "package com.lw.wanandroid.ui.setting;\n\nimport android.os.Bundle;\nimport android.support.v7.preference.Preference;\nimport android.support.v7.preference.PreferenceFragmentCompat;\n\nimport com.alibaba.android.arouter.launcher.ARouter;\nimport com.lw.wanandroid.R;\n\n\n/**\n * Created by lw on 2017-09-05.\n */\n\npublic class SettingFragment extends PreferenceFragmentCompat {\n    private Preference mSettingAutoUpdate, mCheckUpdate, mAbout, mTestPage;\n\n    @Override\n    public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {\n        addPreferencesFromResource(R.xml.settings_preference_fragment);\n        mSettingAutoUpdate = findPreference(\"settingAutoUpdate\");\n        mCheckUpdate = findPreference(\"checkUpdate\");\n        mAbout = findPreference(\"about\");\n        mTestPage = findPreference(\"testPage\");\n        mTestPage.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {\n            @Override\n            public boolean onPreferenceClick(Preference preference) {\n                ARouter.getInstance().build(\"/setting/TestPageActivity\").navigation();\n                return false;\n            }\n        });\n    }\n\n    public static SettingFragment newInstance() {\n        return new SettingFragment();\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/lw/wanandroid/ui/setting/TestPageActivity.java",
    "content": "package com.lw.wanandroid.ui.setting;\n\nimport android.util.Log;\nimport android.view.View;\nimport android.widget.Button;\n\nimport com.alibaba.android.arouter.facade.annotation.Route;\nimport com.lw.wanandroid.R;\nimport com.lw.wanandroid.base.BaseActivity;\n\nimport java.io.IOException;\nimport java.util.concurrent.TimeUnit;\n\nimport butterknife.BindView;\nimport butterknife.OnClick;\nimport okhttp3.Call;\nimport okhttp3.Callback;\nimport okhttp3.OkHttpClient;\nimport okhttp3.Request;\nimport okhttp3.Response;\n\n/**\n * Created by lw on 2018/2/12.\n */\n@Route(path = \"/setting/TestPageActivity\")\npublic class TestPageActivity extends BaseActivity {\n    private static final String TAG = \"TestPageActivity\";\n    @BindView(R.id.btnTest1)\n    Button mBtnTest1;\n    @BindView(R.id.btnTest2)\n    Button mBtnTest2;\n    @BindView(R.id.btnTest3)\n    Button mBtnTest3;\n    OkHttpClient mOkHttpClient = new OkHttpClient.Builder().readTimeout(5, TimeUnit.SECONDS).build();\n\n    @Override\n    protected int getLayoutId() {\n        return R.layout.activity_test_page;\n    }\n\n    @Override\n    protected void initInjector() {\n\n    }\n\n    @Override\n    protected void initView() {\n\n    }\n\n    @Override\n    protected boolean showHomeAsUp() {\n        return true;\n    }\n\n    @OnClick({R.id.btnTest1, R.id.btnTest2, R.id.btnTest3})\n    public void onViewClicked(View view) {\n        switch (view.getId()) {\n            case R.id.btnTest1:\n                test1();\n                break;\n            case R.id.btnTest2:\n                break;\n            case R.id.btnTest3:\n                break;\n        }\n    }\n\n    private void test1() {\n        Request request = new Request.Builder().url(\"http://www.baidu.com\").build();\n        Call call = mOkHttpClient.newCall(request);\n        try {\n            //Response response = call.execute();\n            //Log.d(TAG, \"test1: \" + response.body().string());\n            call.enqueue(new Callback() {\n                @Override\n                public void onFailure(Call call, IOException e) {\n                    Log.d(TAG, \"test1: \" + e.getMessage());\n                }\n\n                @Override\n                public void onResponse(Call call, Response response) throws IOException {\n                    Log.d(TAG, \"test1: \" + response.body().string());\n                }\n            });\n        } catch (Exception e) {\n            e.printStackTrace();\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/lw/wanandroid/utils/ArticleUtils.java",
    "content": "package com.lw.wanandroid.utils;\n\nimport com.blankj.utilcode.util.SPUtils;\nimport com.lw.wanandroid.R;\nimport com.lw.wanandroid.base.App;\nimport com.lw.wanandroid.base.BaseContract;\nimport com.lw.wanandroid.bean.Article;\nimport com.lw.wanandroid.bean.DataResponse;\nimport com.lw.wanandroid.constant.Constant;\nimport com.lw.wanandroid.net.ApiService;\nimport com.lw.wanandroid.net.RetrofitManager;\nimport com.lw.wanandroid.ui.article.ArticleListContract;\nimport com.lw.wanandroid.ui.home.HomeContract;\nimport com.lw.wanandroid.ui.hotsearch.SearchContract;\nimport com.lw.wanandroid.ui.my.LoginActivity;\nimport com.lw.wanandroid.ui.my.MyCollectionContract;\n\nimport io.reactivex.functions.Consumer;\n\n/**\n * Created by lw on 2018/2/28.\n */\n\npublic class ArticleUtils {\n    /**\n     * 文章收藏\n     *\n     * @param view\n     * @param position\n     * @param bean\n     */\n    public static void collectArticle(final BaseContract.BaseView view, final int position, final Article.DatasBean bean) {\n        if (SPUtils.getInstance(Constant.SHARED_NAME).getBoolean(Constant.LOGIN_KEY)) {\n            if (bean.isCollect()) {\n                RetrofitManager.create(ApiService.class).removeCollectArticle(bean.getId(), -1)\n                        .compose(RxSchedulers.<DataResponse>applySchedulers())\n                        .compose(view.<DataResponse>bindToLife())\n                        .subscribe(new Consumer<DataResponse>() {\n                            @Override\n                            public void accept(DataResponse response) throws Exception {\n                                if (response.getErrorCode() == 0) {\n                                    bean.setCollect(!bean.isCollect());\n                                    if (view instanceof HomeContract.View) {\n                                        ((HomeContract.View) view).collectArticleSuccess(position, bean);\n                                    } else if (view instanceof ArticleListContract.View) {\n                                        ((ArticleListContract.View) view).collectArticleSuccess(position, bean);\n                                    } else if (view instanceof MyCollectionContract.View) {\n                                        ((MyCollectionContract.View) view).unCollectArticleSuccess(position);\n                                    } else if (view instanceof SearchContract.View) {\n                                        ((SearchContract.View) view).collectArticleSuccess(position, bean);\n                                    }\n                                    view.showSuccess(App.getAppContext().getString(R.string.collection_cancel_success));\n                                } else {\n                                    view.showFaild(App.getAppContext().getString(R.string.collection_cancel_failed, response.getData()));\n                                }\n                            }\n                        }, new Consumer<Throwable>() {\n                            @Override\n                            public void accept(Throwable throwable) throws Exception {\n                                view.showFaild(throwable.getMessage());\n                            }\n                        });\n            } else {\n                RetrofitManager.create(ApiService.class).addCollectArticle(bean.getId())\n                        .compose(RxSchedulers.<DataResponse>applySchedulers())\n                        .compose(view.<DataResponse>bindToLife())\n                        .subscribe(new Consumer<DataResponse>() {\n                            @Override\n                            public void accept(DataResponse response) throws Exception {\n                                if (response.getErrorCode() == 0) {\n                                    bean.setCollect(!bean.isCollect());\n                                    if (view instanceof HomeContract.View) {\n                                        ((HomeContract.View) view).collectArticleSuccess(position, bean);\n                                    } else if (view instanceof ArticleListContract.View) {\n                                        ((ArticleListContract.View) view).collectArticleSuccess(position, bean);\n                                    } else if (view instanceof MyCollectionContract.View) {\n                                        ((MyCollectionContract.View) view).unCollectArticleSuccess(position);\n                                    } else if (view instanceof SearchContract.View) {\n                                        ((SearchContract.View) view).collectArticleSuccess(position, bean);\n                                    }\n                                    view.showSuccess(App.getAppContext().getString(R.string.collection_success));\n                                } else {\n                                    view.showFaild(App.getAppContext().getString(R.string.collection_failed, response.getErrorMsg()));\n                                }\n                            }\n                        }, new Consumer<Throwable>() {\n                            @Override\n                            public void accept(Throwable throwable) throws Exception {\n                                view.showFaild(throwable.getMessage());\n                            }\n                        });\n            }\n        } else {\n            LoginActivity.start();\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/lw/wanandroid/utils/GlideImageLoader.java",
    "content": "package com.lw.wanandroid.utils;\n\nimport android.content.Context;\nimport android.widget.ImageView;\n\nimport com.bumptech.glide.Glide;\nimport com.youth.banner.loader.ImageLoader;\n\n/**\n * Created by lw on 2017-09-01.\n */\n\npublic class GlideImageLoader extends ImageLoader {\n    @Override\n    public void displayImage(Context context, Object path, ImageView imageView) {\n        //具体方法内容自己去选择，次方法是为了减少banner过多的依赖第三方包，所以将这个权限开放给使用者去选择\n        Glide.with(context.getApplicationContext())\n                .load(path)\n                .into(imageView);\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/lw/wanandroid/utils/GsonUtils.java",
    "content": "package com.lw.wanandroid.utils;\n\nimport com.blankj.utilcode.util.StringUtils;\nimport com.google.gson.Gson;\nimport com.google.gson.GsonBuilder;\nimport com.google.gson.JsonElement;\nimport com.google.gson.JsonObject;\nimport com.google.gson.reflect.TypeToken;\n\nimport java.lang.reflect.Type;\nimport java.util.ArrayList;\nimport java.util.List;\n\n/**\n * Created by lw on 2017-05-04.\n */\n\npublic class GsonUtils {\n    private static final Gson gson = new GsonBuilder()\n            .disableHtmlEscaping()\n            .create();\n\n    /**\n     * <pre>\n     * JSON字符串转换为List数组, 提供两种方式(主要解决调用的容易程度)\n     * 1. TypeToken<List<T>> token 参数转换\n     * 2. Class<T> cls 方式转换\n     *\n     * @param json\n     * @return List<T>\n     *\n     * <pre>\n     */\n    public static <T> List<T> convertList(String json, TypeToken<List<T>> token) {\n        if (StringUtils.isSpace(json)) {\n            return new ArrayList<T>();\n        }\n        return gson.fromJson(json, token.getType());\n    }\n\n    /**\n     * <pre>\n     * Json格式转换, 由JSON字符串转化到制定类型T\n     *\n     * @param json\n     * @param cls\n     * @return T\n     *\n     * <pre>\n     */\n    public static <T> T convertObj(String json, Class<T> cls) {\n        if (StringUtils.isSpace(json)) {\n            return null;\n        }\n        return gson.fromJson(json, cls);\n    }\n\n    /**\n     * <pre>\n     * Json格式转换, 由JSON字符串转化到制定类型T\n     *\n     * @param json\n     * @param cls\n     * @return T\n     *\n     * <pre>\n     */\n    public static <T> T convertObj(String json, Type cls) {\n        if (StringUtils.isSpace(json)) {\n            return null;\n        }\n        return gson.fromJson(json, cls);\n    }\n\n    /**\n     * <pre>\n     * java对象转化JSON\n     *\n     * @return String\n     *\n     * <pre>\n     */\n    public static String toJson(Object obj) {\n        if (obj == null) {\n            return \"\";\n        }\n        return gson.toJson(obj);\n    }\n\n    public static String getJsonObjectAsString(JsonObject jsonObject, String name) {\n        if (jsonObject == null || StringUtils.isSpace(name)) {\n            return null;\n        }\n        JsonElement jsonElement = jsonObject.get(name);\n        return (jsonElement == null) ? null : jsonElement.getAsString();\n    }\n\n    public static JsonObject getJsonObjectChild(JsonObject jsonObject, String name) {\n        if (jsonObject == null || StringUtils.isSpace(name)) {\n            return null;\n        }\n        JsonElement jsonElement = jsonObject.get(name);\n        return (jsonElement == null) ? null : jsonElement.getAsJsonObject();\n    }\n\n    public static boolean getJsonObjectAsBoolean(JsonObject jsonObject, String name) {\n        if (jsonObject == null || StringUtils.isSpace(name)) {\n            return false;\n        }\n        JsonElement jsonElement = jsonObject.get(name);\n        return (jsonElement == null) ? false : jsonElement.getAsBoolean();\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/lw/wanandroid/utils/RxBus.java",
    "content": "package com.lw.wanandroid.utils;\n\nimport io.reactivex.Flowable;\nimport io.reactivex.processors.FlowableProcessor;\nimport io.reactivex.processors.PublishProcessor;\n\n/**\n * Created by lw on 2018/1/25.\n */\n\npublic class RxBus {\n    private static volatile RxBus sRxBus;\n    // 主题\n    private final FlowableProcessor<Object> mBus;\n\n    // PublishSubject只会把在订阅发生的时间点之后来自原始Observable的数据发射给观察者\n    public RxBus() {\n        mBus = PublishProcessor.create().toSerialized();\n    }\n\n    // 单例RxBus\n    public static RxBus getInstance() {\n        if (sRxBus == null) {\n            synchronized (RxBus.class) {\n                if (sRxBus == null) {\n                    sRxBus = new RxBus();\n                }\n            }\n        }\n        return sRxBus;\n    }\n\n    // 提供了一个新的事件\n    public void post(Object o) {\n        mBus.onNext(o);\n    }\n\n    // 根据传递的 eventType 类型返回特定类型(eventType)的 被观察者\n    public <T> Flowable<T> toFlowable(Class<T> eventType) {\n        return mBus.ofType(eventType);\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/lw/wanandroid/utils/RxSchedulers.java",
    "content": "package com.lw.wanandroid.utils;\n\n\nimport io.reactivex.Observable;\nimport io.reactivex.ObservableSource;\nimport io.reactivex.ObservableTransformer;\nimport io.reactivex.android.schedulers.AndroidSchedulers;\nimport io.reactivex.schedulers.Schedulers;\n\n/**\n * 通用的Rx线程转换类\n * 参考:http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2015/0819/3327.html\n */\npublic class RxSchedulers {\n\n\n    static final ObservableTransformer schedulersTransformer = new ObservableTransformer() {\n        @Override\n        public ObservableSource apply(Observable upstream) {\n            return (upstream).subscribeOn(Schedulers.io())\n                    .observeOn(AndroidSchedulers.mainThread());\n        }\n    };\n\n\n    public static <T> ObservableTransformer<T, T> applySchedulers() {\n        return (ObservableTransformer<T, T>) schedulersTransformer;\n    }\n}\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_action_browser.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        android:width=\"24dp\"\n        android:height=\"24dp\"\n        android:viewportHeight=\"1024.0\"\n        android:viewportWidth=\"1024.0\">\n    <path\n        android:fillColor=\"#ffffff\"\n        android:pathData=\"M981.8,311.4c-25.7,-60.7 -62.4,-115.2 -109.2,-162.1 -46.8,-46.8 -101.3,-83.6 -162.1,-109.2 -62.2,-26.3 -128.2,-39.8 -196.2,-40.1 -0.7,0 -1.5,-0 -2.2,-0s-1.5,0 -2.2,0c-68,0.3 -134,13.8 -196.2,40.1 -60.7,25.7 -115.2,62.4 -162.1,109.2 -46.8,46.8 -83.6,101.3 -109.2,162.1 -26.6,62.9 -40.1,129.6 -40.1,198.5 0,68.8 13.5,135.6 40.1,198.5 25.7,60.7 62.4,115.2 109.2,162.1s101.3,83.6 162.1,109.2c62.2,26.3 128.2,39.8 196.2,40.1 0.7,0 1.5,0 2.2,0s1.5,-0 2.2,-0c68,-0.3 134,-13.8 196.2,-40.1 60.7,-25.7 115.2,-62.4 162.1,-109.2s83.6,-101.3 109.2,-162.1c26.6,-62.9 40.1,-129.6 40.1,-198.5C1021.8,441 1008.3,374.2 981.8,311.4zM180.4,178.3c43.1,-43.1 93.2,-76.9 149,-100.5 19.2,-8.1 38.7,-14.9 58.6,-20.3 -24.8,24.9 -47.6,57.5 -67.4,97.2 -12.7,25.4 -23.9,53.1 -33.5,82.5 -44.1,-11.8 -84.6,-27 -119.7,-45.4C171.7,187.2 176,182.7 180.4,178.3zM79.9,327.3c15.7,-37.2 36,-71.9 60.6,-103.7 39.3,21.6 85.1,39.3 135.2,52.7 -17.3,65.3 -27.1,137.8 -28.6,213L43.6,489.4C45.9,433.3 58.1,378.9 79.9,327.3zM140.5,796c-24.5,-31.8 -44.8,-66.5 -60.5,-103.7 -21.8,-51.5 -34,-106 -36.4,-162.1l203.5,0c1.5,75.2 11.3,147.6 28.6,213C225.6,756.7 179.8,774.4 140.5,796zM329.5,941.9c-55.8,-23.6 -106,-57.4 -149,-100.5 -4.4,-4.4 -8.7,-8.9 -12.9,-13.4 35.1,-18.4 75.5,-33.7 119.7,-45.5 9.6,29.4 20.8,57.1 33.5,82.5 19.9,39.7 42.6,72.3 67.4,97.2C368.2,956.8 348.6,950 329.5,941.9zM491.5,976.7c-21,-4.2 -41.6,-14.7 -61.6,-31.6 -27,-22.8 -51.5,-56 -72.7,-98.4 -11.4,-22.7 -21.5,-47.4 -30.2,-73.7 51.5,-10.8 107,-17 164.4,-18.2L491.5,976.7zM491.5,713.9c-61.3,1.2 -120.9,8.1 -176.1,19.9 -16.5,-62.1 -25.9,-131.3 -27.4,-203.4l203.5,0L491.5,713.9zM491.5,489.4l-203.5,0c1.5,-72.2 10.9,-141.3 27.4,-203.5 55.3,11.8 114.8,18.7 176.1,19.9L491.5,489.4zM491.5,264.9c-57.3,-1.2 -112.9,-7.5 -164.4,-18.2 8.7,-26.2 18.8,-50.9 30.1,-73.7 21.2,-42.4 45.7,-75.6 72.7,-98.4 19.9,-16.9 40.6,-27.4 61.6,-31.6L491.5,264.9zM694.5,77.8c55.8,23.6 106,57.4 149,100.5 4.4,4.4 8.7,8.9 12.9,13.4 -34.7,18.1 -75.4,33.6 -119.7,45.4 -9.6,-29.4 -20.8,-57 -33.5,-82.5 -19.9,-39.7 -42.6,-72.3 -67.4,-97.2C655.8,62.9 675.4,69.7 694.5,77.8zM532.5,43c21,4.2 41.6,14.7 61.5,31.6 27,22.9 51.5,56 72.7,98.4 11.4,22.7 21.4,47.4 30.1,73.6 -51.9,10.9 -107.8,17.1 -164.4,18.3L532.5,43zM532.5,305.8c61.2,-1.2 120.3,-7.9 176.1,-19.8 16.5,62.1 25.9,131.3 27.4,203.4l-203.5,0L532.5,305.8 532.5,305.8zM532.5,530.3l203.5,0c-1.5,72.1 -10.9,141.3 -27.5,203.5 -55.3,-11.8 -114.8,-18.7 -176.1,-19.9L532.5,530.3 532.5,530.3zM594,945.1c-19.9,16.9 -40.5,27.4 -61.5,31.6L532.5,754.8c57.3,1.2 112.8,7.5 164.4,18.2 -8.7,26.2 -18.8,50.9 -30.1,73.7C645.5,889.2 621,922.3 594,945.1zM843.6,841.4c-43.1,43.1 -93.2,76.9 -149,100.5 -19.2,8.1 -38.7,14.9 -58.6,20.3 24.8,-24.9 47.6,-57.5 67.4,-97.2 12.7,-25.4 23.9,-53.1 33.5,-82.5 44.1,11.7 84.6,27 119.7,45.4C852.3,832.5 848,837 843.6,841.4zM944.1,692.3c-15.7,37.2 -36,71.9 -60.6,103.7 -39.3,-21.6 -85.1,-39.3 -135.2,-52.7 17.3,-65.4 27.1,-137.8 28.6,-213l203.5,0C978.1,586.4 965.9,640.8 944.1,692.3zM776.9,489.4c-1.5,-75.2 -11.3,-147.6 -28.6,-213 50.8,-13.6 96.2,-31.3 135.2,-52.7 24.5,31.8 44.8,66.4 60.6,103.7 21.8,51.5 34,106 36.4,162.1L776.9,489.4z\"/>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_action_hot.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        android:width=\"24dp\"\n        android:height=\"24dp\"\n        android:viewportHeight=\"1024.0\"\n        android:viewportWidth=\"1024.0\">\n    <path\n        android:fillColor=\"#ffffff\"\n        android:pathData=\"M726.4,201.6c-12.8,-9.6 -28.8,-6.4 -38.4,0 -9.6,9.6 -16,25.6 -9.6,38.4 6.4,12.8 9.6,28.8 12.8,44.8 -86.4,-201.6 -230.4,-246.4 -236.8,-249.6 -9.6,-3.2 -22.4,0 -28.8,6.4 -9.6,6.4 -12.8,19.2 -9.6,28.8 12.8,86.4 -25.6,188.8 -115.2,310.4 -6.4,-25.6 -16,-51.2 -32,-80 -9.6,-9.6 -22.4,-16 -35.2,-12.8 -16,3.2 -25.6,12.8 -25.6,28.8 -3.2,48 -25.6,92.8 -51.2,140.8 -22.4,41.6 -44.8,86.4 -54.4,134.4 -32,153.6 35.2,265.6 224,368 6.4,3.2 9.6,3.2 16,3.2 9.6,0 19.2,-6.4 25.6,-12.8 9.6,-16 6.4,-35.2 -9.6,-44.8l-3.2,-3.2c-188.8,-105.6 -214.4,-192 -192,-297.6 9.6,-41.6 28.8,-76.8 48,-118.4 12.8,-19.2 22.4,-38.4 28.8,-57.6 0,9.6 3.2,22.4 3.2,32 0,12.8 9.6,25.6 22.4,28.8 12.8,3.2 25.6,0 35.2,-9.6 112,-134.4 172.8,-256 179.2,-364.8 51.2,32 137.6,108.8 182.4,272 3.2,9.6 9.6,19.2 22.4,22.4 9.6,3.2 22.4,0 28.8,-6.4 25.6,-22.4 38.4,-54.4 41.6,-86.4 54.4,67.2 115.2,176 108.8,288 -6.4,92.8 -57.6,172.8 -150.4,243.2 35.2,-166.4 -32,-358.4 -179.2,-457.6 -9.6,-6.4 -22.4,-6.4 -32,-3.2 -9.6,6.4 -16,16 -16,28.8 -3.2,89.6 -48,144 -89.6,198.4 -35.2,44.8 -70.4,89.6 -76.8,150.4 0,16 12.8,32 28.8,35.2 19.2,3.2 32,-12.8 35.2,-28.8 3.2,-41.6 32,-76.8 60.8,-115.2 35.2,-44.8 76.8,-99.2 96,-176 115.2,108.8 153.6,300.8 83.2,435.2v3.2c0,3.2 0,3.2 -3.2,6.4v12.8c0,3.2 0,3.2 3.2,6.4v3.2l3.2,3.2c0,3.2 3.2,3.2 3.2,6.4 0,0 3.2,3.2 6.4,3.2l3.2,3.2s3.2,0 3.2,3.2h19.2c3.2,0 6.4,0 9.6,-3.2 163.2,-89.6 252.8,-208 259.2,-345.6 9.6,-214.4 -169.6,-393.6 -204.8,-416z\"/>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_action_like.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        android:width=\"24dp\"\n        android:height=\"24dp\"\n        android:viewportHeight=\"1024.0\"\n        android:viewportWidth=\"1024.0\">\n    <path\n        android:fillColor=\"#00abff\"\n        android:pathData=\"M761.4,136.9C588.3,90.9 512,238.2 512,238.2 512,238.2 435.7,90.9 262.6,136.9 89.6,183 -5.3,414.9 208.7,623 422.7,831.1 512,910.2 512,910.2 512,910.2 601.3,831.1 815.3,623 1029.3,414.9 934.4,183 761.4,136.9\"/>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_action_no_like.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        android:width=\"24dp\"\n        android:height=\"24dp\"\n        android:viewportHeight=\"1024.0\"\n        android:viewportWidth=\"1024.0\">\n    <path\n        android:fillColor=\"#e6e6e6\"\n        android:pathData=\"M761.4,136.9C588.3,90.9 512,238.2 512,238.2 512,238.2 435.7,90.9 262.6,136.9 89.6,183 -5.3,414.9 208.7,623 422.7,831.1 512,910.2 512,910.2 512,910.2 601.3,831.1 815.3,623 1029.3,414.9 934.4,183 761.4,136.9\"/>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_action_search.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        android:width=\"24dp\"\n        android:height=\"24dp\"\n        android:viewportHeight=\"1024.0\"\n        android:viewportWidth=\"1024.0\">\n    <path\n        android:fillColor=\"#ffffff\"\n        android:pathData=\"M940.6,852.7l-214.5,-214.7c44.8,-60.9 69.3,-134.1 69.3,-211 0,-95.7 -37.4,-185.8 -104.9,-253.3 -67.8,-67.5 -157.8,-104.9 -253.6,-104.9s-185.8,37.4 -253.3,104.9c-139.5,139.5 -139.5,366.9 0,506.6 67.5,67.5 157.6,104.9 253.3,104.9 77.2,0 150.2,-24.5 211.3,-69.3l214.5,214.7c21.5,21.5 56.4,21.5 77.7,0 21.8,-21.5 21.8,-56.4 0.3,-77.9zM252.9,611.3c-101.4,-101.7 -101.4,-266.9 0,-368.3 49.2,-49.2 114.5,-76.2 184.3,-76.2 69.5,0 134.8,27 184,76.2 49.2,49.2 76.4,114.5 76.4,184.3 0,69.8 -27.2,135.1 -76.4,184.3 -49.2,49.2 -114.5,76.2 -184,76.2 -69.8,-0.3 -135.1,-27.2 -184.3,-76.4z\"/>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_action_share.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        android:width=\"24dp\"\n        android:height=\"24dp\"\n        android:viewportHeight=\"1024.0\"\n        android:viewportWidth=\"1024.0\">\n    <path\n        android:fillColor=\"#ffffff\"\n        android:pathData=\"M768,686.1c-32.4,0 -61.4,12.8 -83.6,32.9l-304.2,-177.1c2.1,-9.8 3.8,-19.6 3.8,-29.9s-1.7,-20.1 -3.8,-29.9l300.8,-175.4c23,21.3 53.3,34.6 87,34.6 70.8,0 128,-57.2 128,-128s-57.2,-128 -128,-128c-70.8,0 -128,57.2 -128,128 0,10.2 1.7,20.1 3.8,29.9l-300.8,175.4c-23,-21.3 -53.3,-34.6 -87,-34.6 -70.8,0 -128,57.2 -128,128s57.2,128 128,128c33.7,0 64,-13.2 87,-34.6l303.8,177.5c-2.1,9 -3.4,18.3 -3.4,27.7 0,68.7 55.9,124.6 124.6,124.6s124.6,-55.9 124.6,-124.6c0,-68.7 -55.9,-124.6 -124.6,-124.6l0,0z\"/>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_action_white_like.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        android:width=\"24dp\"\n        android:height=\"24dp\"\n        android:viewportHeight=\"1024.0\"\n        android:viewportWidth=\"1024.0\">\n    <path\n        android:fillColor=\"#FFFFFF\"\n        android:pathData=\"M761.4,136.9C588.3,90.9 512,238.2 512,238.2 512,238.2 435.7,90.9 262.6,136.9 89.6,183 -5.3,414.9 208.7,623 422.7,831.1 512,910.2 512,910.2 512,910.2 601.3,831.1 815.3,623 1029.3,414.9 934.4,183 761.4,136.9\"/>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_chevron_right_black_24dp.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        android:width=\"24dp\"\n        android:height=\"24dp\"\n        android:viewportHeight=\"1024.0\"\n        android:viewportWidth=\"1024.0\">\n    <path\n        android:fillColor=\"#000000\"\n        android:pathData=\"M676.8,512.1a32,32 0,0 1,-10 23.2l-265.6,251.3a32,32 0,0 1,-44 -46.5l241.1,-228 -241.1,-228.2a32.1,32.1 0,0 1,-1.3 -45.2c12.2,-12.8 32.4,-13.4 45.2,-1.3l265.6,251.5a32,32 0,0 1,10 23.3z\"/>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_dashboard_black_24dp.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        android:width=\"24dp\"\n        android:height=\"24dp\"\n        android:viewportHeight=\"24.0\"\n        android:viewportWidth=\"24.0\">\n    <path\n        android:fillColor=\"#FF000000\"\n        android:pathData=\"M3,13h8L11,3L3,3v10zM3,21h8v-6L3,15v6zM13,21h8L21,11h-8v10zM13,3v6h8L21,3h-8z\"/>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_home_black_24dp.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        android:width=\"24dp\"\n        android:height=\"24dp\"\n        android:viewportHeight=\"24.0\"\n        android:viewportWidth=\"24.0\">\n    <path\n        android:fillColor=\"#FF000000\"\n        android:pathData=\"M10,20v-6h4v6h5v-8h3L12,3 2,12h3v8z\"/>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_my_black_24dp.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:fillColor=\"#FF000000\"\n        android:pathData=\"M12,12c2.21,0 4,-1.79 4,-4s-1.79,-4 -4,-4 -4,1.79 -4,4 1.79,4 4,4zM12,14c-2.67,0 -8,1.34 -8,4v2h16v-2c0,-2.66 -5.33,-4 -8,-4z\"/>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/item_selector.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<selector xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <item android:state_focused=\"true\" android:drawable=\"@color/lightgray\"/>\n    <item android:state_pressed=\"true\" android:drawable=\"@color/lightgray\"/>\n</selector>"
  },
  {
    "path": "app/src/main/res/drawable/item_selector_hot.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<selector xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <item android:drawable=\"@color/while_most_color\" android:state_pressed=\"true\"/>\n    <item android:drawable=\"@color/while_most_color\" android:state_focused=\"true\"/>\n    <item android:drawable=\"@android:color/transparent\"/>\n</selector>\n"
  },
  {
    "path": "app/src/main/res/drawable-v21/item_selector_hot.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<ripple xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        android:color=\"@color/while_most_color\">\n    <item\n        android:id=\"@android:id/mask\"\n        android:drawable=\"@android:color/white\"/>\n    <item>\n        <shape android:shape=\"rectangle\">\n            <corners android:radius=\"@dimen/dp_40\"/>\n            <solid android:color=\"@color/item_bg\"/>\n            <stroke\n                android:color=\"@color/while_most_color\"\n                android:width=\"1px\"/>\n        </shape>\n    </item>\n</ripple>\n"
  },
  {
    "path": "app/src/main/res/layout/activity_article_content.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              android:layout_width=\"match_parent\"\n              android:layout_height=\"match_parent\"\n              android:orientation=\"vertical\">\n\n    <android.support.design.widget.AppBarLayout\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:theme=\"@style/AppTheme.AppBarOverlay\">\n\n        <android.support.v7.widget.Toolbar\n            android:id=\"@+id/toolbar\"\n            style=\"@style/action_bar\"\n            app:popupTheme=\"@style/AppTheme.PopupOverlay\">\n        </android.support.v7.widget.Toolbar>\n    </android.support.design.widget.AppBarLayout>\n\n    <FrameLayout\n        android:id=\"@+id/webContent\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"0dp\"\n        android:layout_weight=\"1\"/>\n</LinearLayout>"
  },
  {
    "path": "app/src/main/res/layout/activity_article_type.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              android:layout_width=\"match_parent\"\n              android:layout_height=\"match_parent\"\n              android:orientation=\"vertical\">\n\n    <android.support.design.widget.AppBarLayout\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:theme=\"@style/AppTheme.AppBarOverlay\">\n\n        <android.support.v7.widget.Toolbar\n            android:id=\"@+id/toolbar\"\n            style=\"@style/action_bar\">\n        </android.support.v7.widget.Toolbar>\n\n        <android.support.design.widget.TabLayout\n            android:id=\"@+id/tabArticleTypes\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:layout_marginTop=\"@dimen/dp_8\"\n            app:tabGravity=\"center\"\n            app:tabIndicatorColor=\"@color/white\"\n            app:tabIndicatorHeight=\"@dimen/dp_4\"\n            app:tabMode=\"scrollable\"/>\n    </android.support.design.widget.AppBarLayout>\n\n    <android.support.v4.view.ViewPager\n        android:id=\"@+id/vpArticleTypes\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        app:layout_behavior=\"@string/appbar_scrolling_view_behavior\"/>\n</LinearLayout>"
  },
  {
    "path": "app/src/main/res/layout/activity_login.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              android:layout_width=\"match_parent\"\n              android:layout_height=\"match_parent\"\n              android:orientation=\"vertical\">\n\n    <android.support.design.widget.AppBarLayout\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:theme=\"@style/AppTheme.AppBarOverlay\">\n\n        <android.support.v7.widget.Toolbar\n            android:id=\"@+id/toolbar\"\n            style=\"@style/action_bar\"\n            app:title=\"@string/title_login\">\n        </android.support.v7.widget.Toolbar>\n    </android.support.design.widget.AppBarLayout>\n\n    <android.support.design.widget.TextInputLayout\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:layout_margin=\"@dimen/dp_5\"\n        android:orientation=\"horizontal\">\n\n        <android.support.design.widget.TextInputEditText\n            android:id=\"@+id/etUsername\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:hint=\"@string/username\"/>\n\n    </android.support.design.widget.TextInputLayout>\n\n    <android.support.design.widget.TextInputLayout\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:layout_margin=\"@dimen/dp_5\"\n        android:orientation=\"horizontal\">\n\n        <android.support.design.widget.TextInputEditText\n            android:id=\"@+id/etPassword\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:hint=\"@string/password\"\n            android:inputType=\"textPassword\"/>\n    </android.support.design.widget.TextInputLayout>\n\n    <Button\n        android:id=\"@+id/btnLogin\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:layout_margin=\"@dimen/dp_10\"\n        android:text=\"@string/title_login\"\n        android:textColor=\"@color/white\"\n        android:textSize=\"@dimen/big_small\"/>\n\n</LinearLayout>"
  },
  {
    "path": "app/src/main/res/layout/activity_main.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<android.support.design.widget.CoordinatorLayout 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:fitsSystemWindows=\"true\"\n                                                 tools:context=\"com.lw.wanandroid.MainActivity\">\n\n    <LinearLayout\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        android:orientation=\"vertical\">\n\n        <android.support.design.widget.AppBarLayout\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:theme=\"@style/AppTheme.AppBarOverlay\"\n            app:elevation=\"0dp\">\n\n            <android.support.v7.widget.Toolbar\n                android:id=\"@+id/toolbar\"\n                style=\"@style/action_bar\">\n            </android.support.v7.widget.Toolbar>\n        </android.support.design.widget.AppBarLayout>\n\n        <FrameLayout\n            android:id=\"@+id/layout_fragment\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"0dp\"\n            android:layout_weight=\"1\"/>\n\n        <android.support.design.widget.BottomNavigationView\n            android:id=\"@+id/navigation\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:layout_gravity=\"bottom\"\n            android:background=\"?android:attr/windowBackground\"\n            app:menu=\"@menu/navigation\"/>\n    </LinearLayout>\n</android.support.design.widget.CoordinatorLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/activity_my_bookmark.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:zhy=\"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.design.widget.AppBarLayout\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:theme=\"@style/AppTheme.AppBarOverlay\">\n\n        <android.support.v7.widget.Toolbar\n            android:id=\"@+id/toolbar\"\n            style=\"@style/action_bar\"\n            app:title=\"@string/my_bookmark\">\n        </android.support.v7.widget.Toolbar>\n    </android.support.design.widget.AppBarLayout>\n\n    <android.support.v4.widget.SwipeRefreshLayout\n        android:id=\"@+id/swipeRefreshLayout\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\">\n\n        <com.zhy.view.flowlayout.TagFlowLayout\n            android:id=\"@+id/tflMyBookmarks\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:layout_marginBottom=\"@dimen/dp_10\"\n            android:paddingStart=\"@dimen/dp_10\"\n            zhy:max_select=\"0\"/>\n    </android.support.v4.widget.SwipeRefreshLayout>\n</LinearLayout>"
  },
  {
    "path": "app/src/main/res/layout/activity_my_collection.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              android:layout_width=\"match_parent\"\n              android:layout_height=\"match_parent\"\n              android:orientation=\"vertical\">\n\n    <android.support.design.widget.AppBarLayout\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:theme=\"@style/AppTheme.AppBarOverlay\">\n\n        <android.support.v7.widget.Toolbar\n            android:id=\"@+id/toolbar\"\n            style=\"@style/action_bar\"\n            app:title=\"@string/my_collection\">\n        </android.support.v7.widget.Toolbar>\n    </android.support.design.widget.AppBarLayout>\n\n    <android.support.v4.widget.SwipeRefreshLayout\n        android:id=\"@+id/swipeRefreshLayout\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\">\n\n        <android.support.v7.widget.RecyclerView\n            android:id=\"@+id/rvMyCollectionArticles\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"match_parent\"/>\n    </android.support.v4.widget.SwipeRefreshLayout>\n</LinearLayout>"
  },
  {
    "path": "app/src/main/res/layout/activity_register.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              android:layout_width=\"match_parent\"\n              android:layout_height=\"match_parent\"\n              android:orientation=\"vertical\">\n\n    <android.support.design.widget.AppBarLayout\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:theme=\"@style/AppTheme.AppBarOverlay\">\n\n        <android.support.v7.widget.Toolbar\n            android:id=\"@+id/toolbar\"\n            style=\"@style/action_bar\"\n            app:title=\"@string/title_register\">\n        </android.support.v7.widget.Toolbar>\n    </android.support.design.widget.AppBarLayout>\n</LinearLayout>"
  },
  {
    "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              android:layout_width=\"match_parent\"\n              android:layout_height=\"match_parent\"\n              android:orientation=\"vertical\">\n\n    <android.support.design.widget.AppBarLayout\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:theme=\"@style/AppTheme.AppBarOverlay\">\n\n        <android.support.v7.widget.Toolbar\n            android:id=\"@+id/toolbar\"\n            style=\"@style/action_bar\">\n        </android.support.v7.widget.Toolbar>\n    </android.support.design.widget.AppBarLayout>\n\n    <android.support.v4.widget.SwipeRefreshLayout\n        xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        android:id=\"@+id/swipeRefreshLayout\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\">\n\n        <android.support.v7.widget.RecyclerView\n            android:id=\"@+id/rvArticleList\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"match_parent\"/>\n    </android.support.v4.widget.SwipeRefreshLayout>\n</LinearLayout>"
  },
  {
    "path": "app/src/main/res/layout/activity_setting.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              android:layout_width=\"match_parent\"\n              android:layout_height=\"match_parent\"\n              android:orientation=\"vertical\">\n\n    <android.support.design.widget.AppBarLayout\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:theme=\"@style/AppTheme.AppBarOverlay\">\n\n        <android.support.v7.widget.Toolbar\n            android:id=\"@+id/toolbar\"\n            style=\"@style/action_bar\"\n            app:title=\"@string/setting\">\n        </android.support.v7.widget.Toolbar>\n    </android.support.design.widget.AppBarLayout>\n    <FrameLayout\n        android:id=\"@+id/layout_fragment\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"0dp\"\n        android:layout_weight=\"1\"/>\n</LinearLayout>"
  },
  {
    "path": "app/src/main/res/layout/activity_test_page.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              android:layout_width=\"match_parent\"\n              android:layout_height=\"match_parent\"\n              android:orientation=\"vertical\">\n\n    <android.support.design.widget.AppBarLayout\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:theme=\"@style/AppTheme.AppBarOverlay\">\n\n        <android.support.v7.widget.Toolbar\n            android:id=\"@+id/toolbar\"\n            style=\"@style/action_bar\"\n            app:title=\"@string/test_page\">\n        </android.support.v7.widget.Toolbar>\n    </android.support.design.widget.AppBarLayout>\n\n    <Button\n        android:id=\"@+id/btnTest1\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:text=\"测试1\"/>\n\n    <Button\n        android:id=\"@+id/btnTest2\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:text=\"测试2\"/>\n\n    <Button\n        android:id=\"@+id/btnTest3\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:text=\"测试3\"/>\n</LinearLayout>"
  },
  {
    "path": "app/src/main/res/layout/fragment_article_list.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<android.support.v4.widget.SwipeRefreshLayout\n    xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:id=\"@+id/swipeRefreshLayout\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\">\n\n    <android.support.v7.widget.RecyclerView\n        android:id=\"@+id/rvArticleList\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"/>\n</android.support.v4.widget.SwipeRefreshLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/fragment_home.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<android.support.v4.widget.SwipeRefreshLayout\n    xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:id=\"@+id/swipeRefreshLayout\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\">\n\n    <android.support.v7.widget.RecyclerView\n        android:id=\"@+id/rvHomeArticles\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"/>\n</android.support.v4.widget.SwipeRefreshLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/fragment_hot.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<android.support.v4.widget.SwipeRefreshLayout\n    xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:id=\"@+id/swipeRefreshLayout\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\">\n\n    <android.support.v7.widget.RecyclerView\n        android:id=\"@+id/rvHots\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        android:scrollbarSize=\"@dimen/dp_10\"\n        android:scrollbars=\"vertical\"/>\n\n</android.support.v4.widget.SwipeRefreshLayout>"
  },
  {
    "path": "app/src/main/res/layout/fragment_knowledge_system.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<android.support.v4.widget.SwipeRefreshLayout\n    xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:id=\"@+id/swipeRefreshLayout\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\">\n\n    <android.support.v7.widget.RecyclerView\n        android:id=\"@+id/rvKnowledgeSystems\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"/>\n</android.support.v4.widget.SwipeRefreshLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/fragment_my.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout\n    xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    android:orientation=\"vertical\">\n\n    <LinearLayout\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"0dp\"\n        android:layout_weight=\"1\"\n        android:background=\"@color/colorPrimary\"\n        android:gravity=\"center\"\n        android:orientation=\"vertical\">\n\n        <de.hdodenhof.circleimageview.CircleImageView\n            android:id=\"@+id/civAvatar\"\n            android:layout_width=\"@dimen/dp_72\"\n            android:layout_height=\"@dimen/dp_72\"\n            android:src=\"@drawable/ic_avatar\"/>\n\n        <TextView\n            android:id=\"@+id/tvNick\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:padding=\"@dimen/dp_10\"\n            android:text=\"@string/click_avatar_login\"\n            android:textColor=\"@color/white\"\n            android:textSize=\"@dimen/medium\"/>\n    </LinearLayout>\n\n    <ScrollView\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"0dp\"\n        android:layout_weight=\"2\">\n\n        <LinearLayout\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"match_parent\"\n            android:orientation=\"vertical\">\n\n            <View\n                style=\"@style/line_view\"/>\n\n\n            <TextView\n                android:id=\"@+id/tvMyCollection\"\n                style=\"@style/tv_operating_style\"\n                android:background=\"@drawable/item_selector\"\n                android:drawableLeft=\"@drawable/ic_collection\"\n                android:drawablePadding=\"@dimen/dp_5\"\n                android:text=\"@string/my_collection\"/>\n\n            <View\n                style=\"@style/line_view\"/>\n\n            <TextView\n                android:id=\"@+id/tvMyBookmark\"\n                style=\"@style/tv_operating_style\"\n                android:background=\"@drawable/item_selector\"\n                android:drawableLeft=\"@drawable/ic_bookmark\"\n                android:drawablePadding=\"@dimen/dp_5\"\n                android:text=\"@string/my_bookmark\"/>\n\n            <View\n                style=\"@style/line_view\"/>\n\n            <TextView\n                android:id=\"@+id/tvSetting\"\n                style=\"@style/tv_operating_style\"\n                android:background=\"@drawable/item_selector\"\n                android:drawableLeft=\"@drawable/ic_setting\"\n                android:drawablePadding=\"@dimen/dp_5\"\n                android:text=\"@string/setting\"/>\n\n            <View\n                style=\"@style/line_view\"/>\n\n            <LinearLayout\n                android:id=\"@+id/llLogout\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:background=\"@drawable/item_selector\"\n                android:orientation=\"vertical\"\n                android:visibility=\"gone\">\n\n                <TextView\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"wrap_content\"\n                    android:gravity=\"center\"\n                    android:padding=\"@dimen/dp_15\"\n                    android:text=\"@string/logout\"\n                    android:textSize=\"@dimen/big_small\"\n                    android:textStyle=\"bold\"/>\n\n                <View\n                    style=\"@style/line_view\"/>\n            </LinearLayout>\n        </LinearLayout>\n    </ScrollView>\n</LinearLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/item_article.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<android.support.v7.widget.CardView xmlns:android=\"http://schemas.android.com/apk/res/android\"\n                                    style=\"@style/card_view\">\n\n    <LinearLayout\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"150dp\"\n        android:orientation=\"vertical\"\n        android:padding=\"@dimen/dp_10\">\n\n        <RelativeLayout\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"0dp\"\n            android:layout_weight=\"1\"\n            android:gravity=\"center_vertical\">\n\n            <de.hdodenhof.circleimageview.CircleImageView\n                android:id=\"@+id/civHeadPortrait\"\n                android:layout_width=\"48dp\"\n                android:layout_height=\"48dp\"\n                android:src=\"@drawable/ic_head_portrait\"/>\n\n            <TextView\n                android:id=\"@+id/tvAuthor\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:layout_centerVertical=\"true\"\n                android:layout_marginLeft=\"@dimen/dp_4\"\n                android:layout_toRightOf=\"@id/civHeadPortrait\"\n                android:text=\"作者\"/>\n\n            <TextView\n                android:id=\"@+id/tvNiceDate\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:layout_alignParentRight=\"true\"\n                android:layout_centerVertical=\"true\"\n                android:text=\"日期\"/>\n\n        </RelativeLayout>\n\n        <TextView\n            android:id=\"@+id/tvTitle\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"0dp\"\n            android:layout_alignParentBottom=\"true\"\n            android:layout_alignParentStart=\"true\"\n            android:layout_weight=\"1\"\n            android:gravity=\"center_vertical\"\n            android:maxLines=\"2\"\n            android:text=\"标题\"\n            android:textSize=\"@dimen/medium\"/>\n\n        <RelativeLayout\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"0dp\"\n            android:layout_weight=\"1\">\n\n            <TextView\n                android:id=\"@+id/tvChapterName\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:layout_centerVertical=\"true\"\n                android:text=\"章节名称\"\n                android:textColor=\"@color/colorPrimary\"\n                android:textSize=\"@dimen/big_small\"/>\n\n            <ImageView\n                android:id=\"@+id/ivCollect\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:layout_alignParentRight=\"true\"\n                android:layout_centerVertical=\"true\"\n                android:src=\"@drawable/ic_action_no_like\"/>\n        </RelativeLayout>\n    </LinearLayout>\n</android.support.v7.widget.CardView>"
  },
  {
    "path": "app/src/main/res/layout/item_history.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<TextView\n    xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:id=\"@+id/tvTitle\"\n    android:layout_width=\"wrap_content\"\n    android:layout_height=\"wrap_content\"\n    android:layout_margin=\"2dp\"\n    android:background=\"@drawable/item_selector_hot\"\n    android:gravity=\"center\"\n    android:padding=\"@dimen/dp_8\"\n    android:textColor=\"@android:color/primary_text_light\"\n    android:textSize=\"18sp\"\n    tools:text=\"历史记录\"/>\n"
  },
  {
    "path": "app/src/main/res/layout/item_hot.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<TextView\n    xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:id=\"@+id/tvTitle\"\n    android:layout_width=\"wrap_content\"\n    android:layout_height=\"wrap_content\"\n    android:layout_margin=\"5dp\"\n    android:background=\"@drawable/item_selector_hot\"\n    android:gravity=\"center\"\n    android:padding=\"@dimen/dp_10\"\n    android:textColor=\"@android:color/primary_text_light\"\n    android:textSize=\"18sp\"\n    tools:text=\"常用网址\"/>\n"
  },
  {
    "path": "app/src/main/res/layout/item_knowledge_system.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<android.support.v7.widget.CardView xmlns:android=\"http://schemas.android.com/apk/res/android\"\n                                    style=\"@style/card_view\">\n\n    <LinearLayout\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:gravity=\"center\"\n        android:orientation=\"horizontal\"\n        android:padding=\"@dimen/dp_10\">\n\n        <LinearLayout\n            android:layout_width=\"0dp\"\n            android:layout_height=\"wrap_content\"\n            android:layout_weight=\"8\"\n            android:orientation=\"vertical\">\n\n            <TextView\n                android:id=\"@+id/typeItemFirst\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:padding=\"@dimen/dp_8\"\n                android:text=\"一级目录\"\n                android:textColor=\"@android:color/primary_text_light\"\n                android:textSize=\"@dimen/medium\"/>\n\n            <TextView\n                android:id=\"@+id/typeItemSecond\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:padding=\"@dimen/dp_8\"\n                android:text=\"二级目录\"\n                android:textColor=\"@android:color/secondary_text_light\"/>\n        </LinearLayout>\n\n        <ImageView\n            android:id=\"@+id/typeItemArrow\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:src=\"@drawable/ic_chevron_right_black_24dp\"/>\n    </LinearLayout>\n</android.support.v7.widget.CardView>"
  },
  {
    "path": "app/src/main/res/layout/layout_empty_view.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n              style=\"@style/bg\"\n              android:gravity=\"center\"\n              android:orientation=\"vertical\">\n\n    <ImageView\n        style=\"@style/empty_img\"\n        android:src=\"@mipmap/ic_launcher\"/>\n\n    <TextView\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginTop=\"5dp\"\n        android:text=\"@string/empty_no_data\"\n        android:textColor=\"@color/txt_color\"/>\n</LinearLayout>"
  },
  {
    "path": "app/src/main/res/layout/layout_error_view.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n              style=\"@style/bg\"\n              android:gravity=\"center\"\n              android:orientation=\"vertical\">\n\n    <ImageView\n        style=\"@style/empty_img\"\n        android:layout_marginBottom=\"10dp\"\n        android:src=\"@mipmap/ic_launcher\"/>\n\n    <TextView\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginBottom=\"30dp\"\n        android:layout_marginTop=\"5dp\"\n        android:text=\"@string/empty_network_error\"\n        android:textColor=\"@color/txt_color\"/>\n</LinearLayout>"
  },
  {
    "path": "app/src/main/res/layout/layout_home_banner_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=\"match_parent\"\n              android:layout_height=\"wrap_content\">\n\n    <com.youth.banner.Banner\n        android:id=\"@+id/banner_ads\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"200dp\"/>\n</LinearLayout>"
  },
  {
    "path": "app/src/main/res/layout/layout_hot_head.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n              xmlns:tools=\"http://schemas.android.com/tools\"\n              xmlns:zhy=\"http://schemas.android.com/apk/res-auto\"\n              android:layout_width=\"match_parent\"\n              android:layout_height=\"wrap_content\"\n              android:orientation=\"vertical\"\n              tools:ignore=\"RtlSymmetry\">\n\n    <TextView\n        android:id=\"@+id/bookmarkTitle\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginBottom=\"@dimen/dp_10\"\n        android:background=\"@color/item_bg\"\n        android:padding=\"@dimen/dp_10\"\n        android:text=\"@string/my_bookmark\"\n        android:textAppearance=\"@style/TextAppearance.AppCompat.Title\"\n        android:visibility=\"gone\"/>\n\n    <com.zhy.view.flowlayout.TagFlowLayout\n        android:id=\"@+id/tflBookMarks\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginBottom=\"@dimen/dp_10\"\n        android:paddingStart=\"@dimen/dp_10\"\n        android:visibility=\"gone\"\n        zhy:max_select=\"0\"/>\n\n    <TextView\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginBottom=\"@dimen/dp_10\"\n        android:background=\"@color/item_bg\"\n        android:padding=\"@dimen/dp_10\"\n        android:text=\"@string/hot_key\"\n        android:textAppearance=\"@style/TextAppearance.AppCompat.Title\"/>\n\n    <com.zhy.view.flowlayout.TagFlowLayout\n        android:id=\"@+id/tflHotKeys\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginBottom=\"@dimen/dp_10\"\n        android:paddingStart=\"@dimen/dp_10\"\n        zhy:max_select=\"0\"/>\n\n    <TextView\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginBottom=\"@dimen/dp_10\"\n        android:background=\"@color/item_bg\"\n        android:padding=\"@dimen/dp_10\"\n        android:text=\"@string/common_use\"\n        android:textAppearance=\"@style/TextAppearance.AppCompat.Title\"/>\n\n    <com.zhy.view.flowlayout.TagFlowLayout\n        android:id=\"@+id/tflHotFriends\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginBottom=\"@dimen/dp_10\"\n        android:paddingStart=\"@dimen/dp_10\"\n        zhy:max_select=\"0\"/>\n\n</LinearLayout>"
  },
  {
    "path": "app/src/main/res/layout/layout_search_head.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n              xmlns:zhy=\"http://schemas.android.com/apk/res-auto\"\n              android:layout_width=\"match_parent\"\n              android:layout_height=\"wrap_content\"\n              android:orientation=\"vertical\">\n\n    <LinearLayout\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:padding=\"@dimen/dp_8\">\n\n        <TextView\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:text=\"历史搜索\"/>\n    </LinearLayout>\n\n    <com.zhy.view.flowlayout.TagFlowLayout\n        android:id=\"@+id/tflHistorys\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        zhy:max_select=\"0\"/>\n</LinearLayout>"
  },
  {
    "path": "app/src/main/res/menu/menu_content.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<menu xmlns:android=\"http://schemas.android.com/apk/res/android\"\n      xmlns:app=\"http://schemas.android.com/apk/res-auto\">\n\n    <item\n        android:id=\"@+id/menuShare\"\n        android:orderInCategory=\"100\"\n        android:title=\"@string/share_title\"\n        android:icon=\"@drawable/ic_action_share\"\n        app:showAsAction=\"never\" />\n\n    <item\n        android:id=\"@+id/menuLike\"\n        android:orderInCategory=\"100\"\n        android:title=\"@string/like_title\"\n        android:icon=\"@drawable/ic_action_white_like\"\n        app:showAsAction=\"never\" />\n\n    <item\n        android:id=\"@+id/menuBrowser\"\n        android:orderInCategory=\"100\"\n        android:title=\"@string/browser_title\"\n        android:icon=\"@drawable/ic_action_browser\"\n        app:showAsAction=\"never\" />\n</menu>"
  },
  {
    "path": "app/src/main/res/menu/menu_main.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<menu xmlns:android=\"http://schemas.android.com/apk/res/android\"\n      xmlns:app=\"http://schemas.android.com/apk/res-auto\">\n    <item\n        android:id=\"@+id/menuHot\"\n        android:title=\"@string/hot_title\"\n        android:icon=\"@drawable/ic_action_hot\"\n        app:showAsAction=\"ifRoom\"/>\n    <item\n        android:id=\"@+id/menuSearch\"\n        android:title=\"@string/search_title\"\n        android:icon=\"@drawable/ic_action_search\"\n        app:showAsAction=\"ifRoom\"/>\n</menu>"
  },
  {
    "path": "app/src/main/res/menu/menu_search.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<menu xmlns:android=\"http://schemas.android.com/apk/res/android\"\n      xmlns:app=\"http://schemas.android.com/apk/res-auto\">\n    <item\n        android:id=\"@+id/menuSearch\"\n        android:title=\"@string/search_title\"\n        app:actionViewClass=\"android.support.v7.widget.SearchView\"\n        app:showAsAction=\"ifRoom\"/>\n</menu>"
  },
  {
    "path": "app/src/main/res/menu/menu_type_content.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<menu xmlns:android=\"http://schemas.android.com/apk/res/android\"\n      xmlns:app=\"http://schemas.android.com/apk/res-auto\">\n    <item\n        android:id=\"@+id/menuSearch\"\n        android:icon=\"@drawable/ic_action_search\"\n        android:title=\"@string/search_title\"\n        app:showAsAction=\"ifRoom\"/>\n\n    <item\n        android:id=\"@+id/menuShare\"\n        android:icon=\"@drawable/ic_action_share\"\n        android:orderInCategory=\"100\"\n        android:title=\"@string/share_type_title\"\n        app:showAsAction=\"ifRoom\"/>\n</menu>"
  },
  {
    "path": "app/src/main/res/menu/navigation.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<menu xmlns:android=\"http://schemas.android.com/apk/res/android\">\n\n    <item\n        android:id=\"@+id/navigation_home\"\n        android:icon=\"@drawable/ic_home_black_24dp\"\n        android:title=\"@string/title_home\"/>\n\n    <item\n        android:id=\"@+id/navigation_knowledgesystem\"\n        android:icon=\"@drawable/ic_dashboard_black_24dp\"\n        android:title=\"@string/title_knowledgesystem\"/>\n\n    <item\n        android:id=\"@+id/navigation_my\"\n        android:icon=\"@drawable/ic_my_black_24dp\"\n        android:title=\"@string/title_my\"/>\n\n</menu>\n"
  },
  {
    "path": "app/src/main/res/values/colors.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <color name=\"colorPrimary\">#03A9F4</color>\n    <color name=\"colorPrimaryDark\">#0288D1</color>\n    <color name=\"colorAccent\">#00BCD4</color>\n\n    <color name=\"color_light_blue\">#00DDB6</color>\n    <color name=\"txt_color\">#48495F</color>\n    <color name=\"item_bg\">#FFFFFF</color>\n    <color name=\"bg\">#F0F0F0</color>\n    <color name=\"spinner_bg\">#333244</color>\n    <color name=\"new_text_color\">#555771</color>\n    <color name=\"white_text_color\">#F0F0F0</color>\n    <color name=\"gray_color\">#4b4b58</color>\n    <color name=\"hard_color\">#48495f</color>\n    <color name=\"clickspan_color\">#00ddb6</color>\n    <color name=\"dull_blue\">#3B4BBF</color>\n    <color name=\"while_most_color\">#e4e4e4</color>\n    <color name=\"alpha_10_black\">#1A000000</color>\n    <color name=\"lightgray\">#11000000</color>\n\n</resources>\n"
  },
  {
    "path": "app/src/main/res/values/dimens.xml",
    "content": "<resources>\n    <!-- Default screen margins, per the Android Design guidelines. -->\n    <dimen name=\"nav_header_vertical_spacing\">16dp</dimen>\n    <dimen name=\"nav_header_height\">160dp</dimen>\n    <!-- Default screen margins, per the Android Design guidelines. -->\n    <dimen name=\"activity_horizontal_margin\">16dp</dimen>\n    <dimen name=\"activity_vertical_margin\">16dp</dimen>\n    <dimen name=\"fab_margin\">16dp</dimen>\n    <dimen name=\"text_margin\">16dp</dimen>\n\n    <dimen name=\"item_margin\">8dp</dimen>\n    <dimen name=\"title_margin\">24dp</dimen>\n\n    <dimen name=\"splash_bottom_padding\">10dp</dimen>\n    <dimen name=\"splash_middle_top_margin\">10dp</dimen>\n    <dimen name=\"splash_bottom_margin\">40dp</dimen>\n    <dimen name=\"splash_top_margin\">130dp</dimen>\n    <dimen name=\"toolbar_height\">56dp</dimen>\n    <dimen name=\"toolbar_margin_top\">0dp</dimen>\n    <dimen name=\"dp_10\">10dp</dimen>\n    <dimen name=\"dp_20\">20dp</dimen>\n    <dimen name=\"dp_25\">25dp</dimen>\n    <dimen name=\"dp_15\">15dp</dimen>\n    <dimen name=\"dp_4\">4dp</dimen>\n    <dimen name=\"dp_5\">5dp</dimen>\n    <dimen name=\"dp_8\">8dp</dimen>\n    <dimen name=\"dp_30\">30dp</dimen>\n    <dimen name=\"dp_40\">40dp</dimen>\n    <dimen name=\"dp_50\">50dp</dimen>\n    <dimen name=\"dp_72\">72dp</dimen>\n    <dimen name=\"dp_100\">100dp</dimen>\n    <dimen name=\"dp_65\">65dp</dimen>\n    <dimen name=\"dp_60\">60dp</dimen>\n</resources>\n"
  },
  {
    "path": "app/src/main/res/values/fonts.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <dimen name=\"big_large\">24sp</dimen>\n    <dimen name=\"large\">22sp</dimen>\n    <dimen name=\"big_medium\">20sp</dimen>\n    <dimen name=\"medium\">18sp</dimen>\n    <dimen name=\"big_small\">16sp</dimen>\n    <dimen name=\"small\">14sp</dimen>\n    <dimen name=\"micro\">12sp</dimen>\n</resources>"
  },
  {
    "path": "app/src/main/res/values/strings.xml",
    "content": "<resources>\n    <string name=\"app_name\">玩Android</string>\n    <string name=\"title_home\">首页</string>\n    <string name=\"title_knowledgesystem\">知识体系</string>\n    <string name=\"title_my\">我的</string>\n    <string name=\"hot_title\">Hot</string>\n    <string name=\"search_title\">Search</string>\n    <string name=\"empty_network_error\">Network error, Click Retry</string>\n    <string name=\"empty_no_data\">There is no data, Click Retry</string>\n    <string name=\"setting_auto_update\">开启后WIFI自动下载更新应用</string>\n    <string name=\"auto_update\">自动更新</string>\n    <string name=\"check_update\">检查更新</string>\n    <string name=\"about\">关于玩Android</string>\n    <string name=\"test_page\">测试页面</string>\n    <string name=\"system_settings\">系统设置</string>\n    <!-- article -->\n    <string name=\"browser_title\">用系统浏览器打开</string>\n    <string name=\"hot_key\">大家都在搜</string>\n    <string name=\"common_use\">常用网站</string>\n\n    <!-- navigation -->\n    <string name=\"my_bookmark\">我的书签</string>\n    <string name=\"my_like\">我喜欢的</string>\n    <string name=\"my_about\">关于我们</string>\n    <string name=\"title_login\">登陆</string>\n    <string name=\"title_register\">注册</string>\n\n\n    <string name=\"like_title\">收藏</string>\n    <string name=\"collection_time\">收藏时间：%1$s</string>\n    <string name=\"collection_success\">收藏成功</string>\n    <string name=\"collection_failed\">收藏失败：%1$s</string>\n    <string name=\"collection_cancel_success\">取消收藏成功</string>\n    <string name=\"collection_cancel_failed\">取消收藏失败：%1$s</string>\n    <string name=\"username\">用户名</string>\n    <string name=\"password\">密码</string>\n    <string name=\"the_username_or_password_can_not_be_empty\">用户名或密码不能为空</string>\n    <string name=\"no_network_connection\">无网络连接</string>\n    <string name=\"login_success\">登陆成功</string>\n    <string name=\"auto_login_success\">自动登陆成功</string>\n    <string name=\"click_avatar_login\">点击头像登陆</string>\n    <string name=\"logout\">退出登陆</string>\n    <string name=\"my_collection\">我的收藏</string>\n    <string name=\"bookmark\">书签</string>\n    <string name=\"setting\">设置</string>\n    <string name=\"not_login\">没有登陆</string>\n    <string name=\"share_title\">分享</string>\n    <string name=\"share_type_title\">分享专题</string>\n    <string name=\"share_article_url\">%1$s分享【%2$s】：%3$s</string>\n    <string name=\"share_type_url\">%1$s分享【%2$s】专题：http://www.wanandroid.com/article/list/0?cid=%3$d</string>\n    <string name=\"exit_system\">再按一次退出程序</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/colorPrimary</item>\n        <item name=\"colorPrimaryDark\">@color/colorPrimary</item>\n        <item name=\"colorAccent\">@color/colorAccent</item>\n        <item name=\"preferenceTheme\">@style/PreferenceScreen</item>\n    </style>\n\n    <style name=\"PreferenceScreen\" parent=\"PreferenceThemeOverlay.v14.Material\">\n        <item name=\"android:fadeScrollbars\">true</item>\n        <item name=\"android:scrollbars\">vertical</item>\n        <item name=\"android:scrollbarFadeDuration\">1</item>\n    </style>\n\n    <style name=\"AppTheme.NoActionBar\">\n        <item name=\"windowActionBar\">false</item>\n        <item name=\"windowNoTitle\">true</item>\n    </style>\n\n    <style name=\"AppTheme.AppBarOverlay\" parent=\"ThemeOverlay.AppCompat.Dark.ActionBar\"/>\n\n    <style name=\"AppTheme.PopupOverlay\" parent=\"ThemeOverlay.AppCompat.Light\"/>\n\n    <style name=\"action_bar\">\n        <item name=\"android:background\">?attr/colorPrimary</item>\n        <item name=\"android:layout_width\">match_parent</item>\n        <item name=\"android:layout_height\">?attr/actionBarSize</item>\n    </style>\n\n\n    <style name=\"card_view\">\n        <item name=\"android:layout_width\">match_parent</item>\n        <item name=\"android:layout_height\">wrap_content</item>\n        <item name=\"android:layout_marginTop\">4dp</item>\n        <item name=\"android:layout_marginLeft\">4dp</item>\n        <item name=\"android:layout_marginRight\">4dp</item>\n        <item name=\"android:foreground\">?android:attr/selectableItemBackground</item>\n    </style>\n\n\n    <style name=\"bg\">\n        <item name=\"android:layout_width\">match_parent</item>\n        <item name=\"android:layout_height\">match_parent</item>\n        <item name=\"android:background\">@color/bg</item>\n        <item name=\"android:orientation\">vertical</item>\n    </style>\n\n    <style name=\"empty_img\">\n        <item name=\"android:layout_width\">@dimen/def_height</item>\n        <item name=\"android:layout_height\">@dimen/def_height</item>\n        <item name=\"android:layout_marginBottom\">10dp</item>\n    </style>\n\n    <style name=\"tv_operating_style\">\n        <item name=\"android:gravity\">center_vertical</item>\n        <item name=\"android:layout_width\">match_parent</item>\n        <item name=\"android:layout_height\">wrap_content</item>\n        <item name=\"android:background\">@null</item>\n        <item name=\"android:drawableRight\">@drawable/ic_right</item>\n        <item name=\"android:padding\">@dimen/dp_10</item>\n    </style>\n\n    <style name=\"line_view\">\n        <item name=\"android:layout_height\">2px</item>\n        <item name=\"android:background\">@color/alpha_10_black</item>\n        <item name=\"android:layout_width\">match_parent</item>\n    </style>\n</resources>\n"
  },
  {
    "path": "app/src/main/res/xml/settings_preference_fragment.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?><!--\n  ~ Copyright 2017 lizhaotailang\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<android.support.v7.preference.PreferenceScreen xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <android.support.v7.preference.PreferenceCategory android:title=\"@string/system_settings\">\n        <SwitchPreference\n            android:defaultValue=\"false\"\n            android:key=\"settingAutoUpdate\"\n            android:summary=\"@string/setting_auto_update\"\n            android:title=\"@string/auto_update\"/>\n        <android.support.v7.preference.Preference\n            android:key=\"checkUpdate\"\n            android:title=\"@string/check_update\"/>\n        <android.support.v7.preference.Preference\n            android:key=\"about\"\n            android:title=\"@string/about\"/>\n        <android.support.v7.preference.Preference\n            android:key=\"testPage\"\n            android:title=\"@string/test_page\"/>\n    </android.support.v7.preference.PreferenceCategory>\n</android.support.v7.preference.PreferenceScreen>"
  },
  {
    "path": "app/src/test/java/com/lw/wanandroid/ExampleUnitTest.java",
    "content": "package com.lw.wanandroid;\n\nimport org.junit.Test;\n\nimport static org.junit.Assert.assertEquals;\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.\napply from: \"config.gradle\"\n\nbuildscript {\n    repositories {\n        jcenter()\n        mavenCentral()\n        google()\n    }\n    dependencies {\n        classpath 'com.android.tools.build:gradle:3.0.1'\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        mavenCentral()\n        maven { url \"https://jitpack.io\" }\n        google()\n    }\n}\n\ntask clean(type: Delete) {\n    delete rootProject.buildDir\n}\n"
  },
  {
    "path": "config.gradle",
    "content": "ext {\n\n    android = [\n            compileSdkVersion: 25,\n            buildToolsVersion: \"25.0.2\",\n            applicationId    : \"com.will.weiyue\",\n            minSdkVersion    : 19,\n            targetSdkVersion : 25,\n            versionCode      : 1,\n            versionName      : \"1.0\"\n    ]\n\n    dependVersion = [\n            support: \"25.3.1\",\n            dbflow : \"4.2.4\"\n    ]\n\n    dependencies = [\n            //android-support\n            \"support-v4\"          : \"com.android.support:support-v4:${dependVersion.support}\",\n            \"appcompat-v7\"        : \"com.android.support:appcompat-v7:${dependVersion.support}\",\n            \"design\"              : \"com.android.support:design:${dependVersion.support}\",\n            \"recyclerview\"        : \"com.android.support:recyclerview-v7:${dependVersion.support}\",\n            \"cardview\"            : \"com.android.support:cardview-v7:${dependVersion.support}\",\n            \"preference\"          : \"com.android.support:preference-v14:25.3.1\",\n\n            //http\n            \"retrofit2\"           : \"com.squareup.retrofit2:retrofit:2.1.0\",\n            \"converter-scalars\"   : \"com.squareup.retrofit2:converter-scalars:2.1.0\",\n            \"converter-gson\"      : \"com.squareup.retrofit2:converter-gson:2.1.0\",\n            \"adapter-rxjava2\"     : \"com.squareup.retrofit2:adapter-rxjava2:2.2.0\",\n\n            //httpcache\n            \"rxCache\"             : \"com.github.VictorAlbertos.RxCache:runtime:1.8.0-2.x\",\n            \"Jolyglot-gson\"       : \"com.github.VictorAlbertos.Jolyglot:gson:0.0.3\",\n\n            //rxjava\n            \"rxjava\"              : \"io.reactivex.rxjava2:rxjava:2.0.6\",\n            \"rxandroid\"           : \"io.reactivex.rxjava2:rxandroid:2.0.1\",\n            \"rxbinding2\"          : \"com.jakewharton.rxbinding2:rxbinding:2.0.0\",\n            \"rxlifecycle2\"        : \"com.trello.rxlifecycle2:rxlifecycle:2.1.0\",\n            \"rxlifecomponents\"    : \"com.trello.rxlifecycle2:rxlifecycle-components:2.1.0\",\n\n            //dagger2\n            \"dagger\"              : \"com.google.dagger:dagger:2.7\",\n            \"dagger-compiler\"     : \"com.google.dagger:dagger-compiler:2.7\",\n\n            //ui\n            \"constraint-layout\"   : \"com.android.support.constraint:constraint-layout:1.0.2\",\n            \"butterknife\"         : \"com.jakewharton:butterknife:8.8.1\",\n            \"butterknife-compiler\": \"com.jakewharton:butterknife-compiler:8.8.1\",\n            \"BaseAdapterHelper\"   : \"com.github.CymChad:BaseRecyclerViewAdapterHelper:2.9.30\",\n            \"glide\"               : \"com.github.bumptech.glide:glide:4.0.0-RC1\",\n            \"banner\"              : \"com.youth.banner:banner:1.4.9\",\n            \"circleimageview\"     : \"de.hdodenhof:circleimageview:2.2.0\",\n            \"utilcode\"            : \"com.blankj:utilcode:1.9.6\",\n            \"agentweb\"            : \"com.just.agentweb:agentweb:3.1.0\",\n            \"flowlayout\"          : \"com.hyman:flowlayout-lib:1.1.2\",\n            \"fragmentation\"       : \"me.yokeyword:fragmentation:1.3.3\",\n\n            //alibaba\n            \"arouter-api\"         : \"com.alibaba:arouter-api:1.3.1\",\n            \"arouter-compiler\"    : \"com.alibaba:arouter-compiler:1.1.4\",\n\n            //DBFLOW\n            \"dbflow-processor\"    : \"com.github.Raizlabs.DBFlow:dbflow-processor:${dependVersion.dbflow}\",\n            \"dbflow-core\"         : \"com.github.Raizlabs.DBFlow:dbflow-core:${dependVersion.dbflow}\",\n            \"dbflow\"              : \"com.github.Raizlabs.DBFlow:dbflow:${dependVersion.dbflow}\",\n            \"dbflow-sqlcipher\"    : \"com.github.Raizlabs.DBFlow:dbflow-sqlcipher:${dependVersion.dbflow}\"\n    ]\n}"
  },
  {
    "path": "gradle/wrapper/gradle-wrapper.properties",
    "content": "#Thu Oct 26 09:51:01 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# IDE (e.g. Android Studio) users:\n# Gradle settings configured through the IDE *will override*\n# any settings specified in this file.\n# For more details on how to configure your build environment visit\n# http://www.gradle.org/docs/current/userguide/build_environment.html\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# 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\nRELEASE_KEY_PASSWORD=wanandroid\nRELEASE_KEY_ALIAS=wanandroid\nRELEASE_STORE_PASSWORD=wanandroid\nRELEASE_STORE_FILE=wanandroid.jks\n\n\n"
  },
  {
    "path": "gradlew",
    "content": "#!/usr/bin/env bash\n\n##############################################################################\n##\n##  Gradle start up script for UN*X\n##\n##############################################################################\n\n# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.\nDEFAULT_JVM_OPTS=\"\"\n\nAPP_NAME=\"Gradle\"\nAPP_BASE_NAME=`basename \"$0\"`\n\n# Use the maximum available, or set MAX_FD != -1 to use that value.\nMAX_FD=\"maximum\"\n\nwarn ( ) {\n    echo \"$*\"\n}\n\ndie ( ) {\n    echo\n    echo \"$*\"\n    echo\n    exit 1\n}\n\n# OS specific support (must be 'true' or 'false').\ncygwin=false\nmsys=false\ndarwin=false\ncase \"`uname`\" in\n  CYGWIN* )\n    cygwin=true\n    ;;\n  Darwin* )\n    darwin=true\n    ;;\n  MINGW* )\n    msys=true\n    ;;\nesac\n\n# Attempt to set APP_HOME\n# Resolve links: $0 may be a link\nPRG=\"$0\"\n# Need this for relative symlinks.\nwhile [ -h \"$PRG\" ] ; do\n    ls=`ls -ld \"$PRG\"`\n    link=`expr \"$ls\" : '.*-> \\(.*\\)$'`\n    if expr \"$link\" : '/.*' > /dev/null; then\n        PRG=\"$link\"\n    else\n        PRG=`dirname \"$PRG\"`\"/$link\"\n    fi\ndone\nSAVED=\"`pwd`\"\ncd \"`dirname \\\"$PRG\\\"`/\" >/dev/null\nAPP_HOME=\"`pwd -P`\"\ncd \"$SAVED\" >/dev/null\n\nCLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar\n\n# Determine the Java command to use to start the JVM.\nif [ -n \"$JAVA_HOME\" ] ; then\n    if [ -x \"$JAVA_HOME/jre/sh/java\" ] ; then\n        # IBM's JDK on AIX uses strange locations for the executables\n        JAVACMD=\"$JAVA_HOME/jre/sh/java\"\n    else\n        JAVACMD=\"$JAVA_HOME/bin/java\"\n    fi\n    if [ ! -x \"$JAVACMD\" ] ; then\n        die \"ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME\n\nPlease set the JAVA_HOME variable in your environment to match the\nlocation of your Java installation.\"\n    fi\nelse\n    JAVACMD=\"java\"\n    which java >/dev/null 2>&1 || die \"ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.\n\nPlease set the JAVA_HOME variable in your environment to match the\nlocation of your Java installation.\"\nfi\n\n# Increase the maximum file descriptors if we can.\nif [ \"$cygwin\" = \"false\" -a \"$darwin\" = \"false\" ] ; then\n    MAX_FD_LIMIT=`ulimit -H -n`\n    if [ $? -eq 0 ] ; then\n        if [ \"$MAX_FD\" = \"maximum\" -o \"$MAX_FD\" = \"max\" ] ; then\n            MAX_FD=\"$MAX_FD_LIMIT\"\n        fi\n        ulimit -n $MAX_FD\n        if [ $? -ne 0 ] ; then\n            warn \"Could not set maximum file descriptor limit: $MAX_FD\"\n        fi\n    else\n        warn \"Could not query maximum file descriptor limit: $MAX_FD_LIMIT\"\n    fi\nfi\n\n# For Darwin, add options to specify how the application appears in the dock\nif $darwin; then\n    GRADLE_OPTS=\"$GRADLE_OPTS \\\"-Xdock:name=$APP_NAME\\\" \\\"-Xdock:icon=$APP_HOME/media/gradle.icns\\\"\"\nfi\n\n# For Cygwin, switch paths to Windows format before running java\nif $cygwin ; then\n    APP_HOME=`cygpath --path --mixed \"$APP_HOME\"`\n    CLASSPATH=`cygpath --path --mixed \"$CLASSPATH\"`\n    JAVACMD=`cygpath --unix \"$JAVACMD\"`\n\n    # We build the pattern for arguments to be converted via cygpath\n    ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`\n    SEP=\"\"\n    for dir in $ROOTDIRSRAW ; do\n        ROOTDIRS=\"$ROOTDIRS$SEP$dir\"\n        SEP=\"|\"\n    done\n    OURCYGPATTERN=\"(^($ROOTDIRS))\"\n    # Add a user-defined pattern to the cygpath arguments\n    if [ \"$GRADLE_CYGPATTERN\" != \"\" ] ; then\n        OURCYGPATTERN=\"$OURCYGPATTERN|($GRADLE_CYGPATTERN)\"\n    fi\n    # Now convert the arguments - kludge to limit ourselves to /bin/sh\n    i=0\n    for arg in \"$@\" ; do\n        CHECK=`echo \"$arg\"|egrep -c \"$OURCYGPATTERN\" -`\n        CHECK2=`echo \"$arg\"|egrep -c \"^-\"`                                 ### Determine if an option\n\n        if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then                    ### Added a condition\n            eval `echo args$i`=`cygpath --path --ignore --mixed \"$arg\"`\n        else\n            eval `echo args$i`=\"\\\"$arg\\\"\"\n        fi\n        i=$((i+1))\n    done\n    case $i in\n        (0) set -- ;;\n        (1) set -- \"$args0\" ;;\n        (2) set -- \"$args0\" \"$args1\" ;;\n        (3) set -- \"$args0\" \"$args1\" \"$args2\" ;;\n        (4) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" ;;\n        (5) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" ;;\n        (6) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" \"$args5\" ;;\n        (7) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" \"$args5\" \"$args6\" ;;\n        (8) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" \"$args5\" \"$args6\" \"$args7\" ;;\n        (9) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" \"$args5\" \"$args6\" \"$args7\" \"$args8\" ;;\n    esac\nfi\n\n# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules\nfunction splitJvmOpts() {\n    JVM_OPTS=(\"$@\")\n}\neval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS\nJVM_OPTS[${#JVM_OPTS[*]}]=\"-Dorg.gradle.appname=$APP_BASE_NAME\"\n\nexec \"$JAVACMD\" \"${JVM_OPTS[@]}\" -classpath \"$CLASSPATH\" org.gradle.wrapper.GradleWrapperMain \"$@\"\n"
  },
  {
    "path": "gradlew.bat",
    "content": "@if \"%DEBUG%\" == \"\" @echo off\n@rem ##########################################################################\n@rem\n@rem  Gradle startup script for Windows\n@rem\n@rem ##########################################################################\n\n@rem Set local scope for the variables with windows NT shell\nif \"%OS%\"==\"Windows_NT\" setlocal\n\n@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.\nset DEFAULT_JVM_OPTS=\n\nset DIRNAME=%~dp0\nif \"%DIRNAME%\" == \"\" set DIRNAME=.\nset APP_BASE_NAME=%~n0\nset APP_HOME=%DIRNAME%\n\n@rem Find java.exe\nif defined JAVA_HOME goto findJavaFromJavaHome\n\nset JAVA_EXE=java.exe\n%JAVA_EXE% -version >NUL 2>&1\nif \"%ERRORLEVEL%\" == \"0\" goto init\n\necho.\necho ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.\necho.\necho Please set the JAVA_HOME variable in your environment to match the\necho location of your Java installation.\n\ngoto fail\n\n:findJavaFromJavaHome\nset JAVA_HOME=%JAVA_HOME:\"=%\nset JAVA_EXE=%JAVA_HOME%/bin/java.exe\n\nif exist \"%JAVA_EXE%\" goto init\n\necho.\necho ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%\necho.\necho Please set the JAVA_HOME variable in your environment to match the\necho location of your Java installation.\n\ngoto fail\n\n:init\n@rem Get command-line arguments, handling Windowz variants\n\nif not \"%OS%\" == \"Windows_NT\" goto win9xME_args\nif \"%@eval[2+2]\" == \"4\" goto 4NT_args\n\n:win9xME_args\n@rem Slurp the command line arguments.\nset CMD_LINE_ARGS=\nset _SKIP=2\n\n:win9xME_args_slurp\nif \"x%~1\" == \"x\" goto execute\n\nset CMD_LINE_ARGS=%*\ngoto execute\n\n:4NT_args\n@rem Get arguments from the 4NT Shell from JP Software\nset CMD_LINE_ARGS=%$\n\n:execute\n@rem Setup the command line\n\nset CLASSPATH=%APP_HOME%\\gradle\\wrapper\\gradle-wrapper.jar\n\n@rem Execute Gradle\n\"%JAVA_EXE%\" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% \"-Dorg.gradle.appname=%APP_BASE_NAME%\" -classpath \"%CLASSPATH%\" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%\n\n:end\n@rem End local scope for the variables with windows NT shell\nif \"%ERRORLEVEL%\"==\"0\" goto mainEnd\n\n:fail\nrem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of\nrem the _cmd.exe /c_ return code!\nif  not \"\" == \"%GRADLE_EXIT_CONSOLE%\" exit 1\nexit /b 1\n\n:mainEnd\nif \"%OS%\"==\"Windows_NT\" endlocal\n\n:omega\n"
  },
  {
    "path": "settings.gradle",
    "content": "include ':app'\n"
  }
]