[
  {
    "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/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/inspectionProfiles/Project_Default.xml",
    "content": "<component name=\"InspectionProjectProfileManager\">\n  <profile version=\"1.0\">\n    <option name=\"myName\" value=\"Project Default\" />\n    <inspection_tool class=\"JavaDoc\" enabled=\"true\" level=\"WARNING\" enabled_by_default=\"true\">\n      <option name=\"TOP_LEVEL_CLASS_OPTIONS\">\n        <value>\n          <option name=\"ACCESS_JAVADOC_REQUIRED_FOR\" value=\"none\" />\n          <option name=\"REQUIRED_TAGS\" value=\"\" />\n        </value>\n      </option>\n      <option name=\"INNER_CLASS_OPTIONS\">\n        <value>\n          <option name=\"ACCESS_JAVADOC_REQUIRED_FOR\" value=\"none\" />\n          <option name=\"REQUIRED_TAGS\" value=\"\" />\n        </value>\n      </option>\n      <option name=\"METHOD_OPTIONS\">\n        <value>\n          <option name=\"ACCESS_JAVADOC_REQUIRED_FOR\" value=\"none\" />\n          <option name=\"REQUIRED_TAGS\" value=\"@return@param@throws or @exception\" />\n        </value>\n      </option>\n      <option name=\"FIELD_OPTIONS\">\n        <value>\n          <option name=\"ACCESS_JAVADOC_REQUIRED_FOR\" value=\"none\" />\n          <option name=\"REQUIRED_TAGS\" value=\"\" />\n        </value>\n      </option>\n      <option name=\"IGNORE_DEPRECATED\" value=\"false\" />\n      <option name=\"IGNORE_JAVADOC_PERIOD\" value=\"true\" />\n      <option name=\"IGNORE_DUPLICATED_THROWS\" value=\"false\" />\n      <option name=\"IGNORE_POINT_TO_ITSELF\" value=\"false\" />\n      <option name=\"myAdditionalJavadocTags\" value=\"date\" />\n    </inspection_tool>\n  </profile>\n</component>"
  },
  {
    "path": ".idea/misc.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"NullableNotNullManager\">\n    <option name=\"myDefaultNullable\" value=\"android.support.annotation.Nullable\" />\n    <option name=\"myDefaultNotNull\" value=\"android.support.annotation.NonNull\" />\n    <option name=\"myNullables\">\n      <value>\n        <list size=\"4\">\n          <item index=\"0\" class=\"java.lang.String\" itemvalue=\"org.jetbrains.annotations.Nullable\" />\n          <item index=\"1\" class=\"java.lang.String\" itemvalue=\"javax.annotation.Nullable\" />\n          <item index=\"2\" class=\"java.lang.String\" itemvalue=\"edu.umd.cs.findbugs.annotations.Nullable\" />\n          <item index=\"3\" class=\"java.lang.String\" itemvalue=\"android.support.annotation.Nullable\" />\n        </list>\n      </value>\n    </option>\n    <option name=\"myNotNulls\">\n      <value>\n        <list size=\"4\">\n          <item index=\"0\" class=\"java.lang.String\" itemvalue=\"org.jetbrains.annotations.NotNull\" />\n          <item index=\"1\" class=\"java.lang.String\" itemvalue=\"javax.annotation.Nonnull\" />\n          <item index=\"2\" class=\"java.lang.String\" itemvalue=\"edu.umd.cs.findbugs.annotations.NonNull\" />\n          <item index=\"3\" class=\"java.lang.String\" itemvalue=\"android.support.annotation.NonNull\" />\n        </list>\n      </value>\n    </option>\n  </component>\n  <component name=\"ProjectRootManager\" version=\"2\" languageLevel=\"JDK_1_8\" 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$/TomatoIt.iml\" filepath=\"$PROJECT_DIR$/TomatoIt.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": "# 用okgo、rxjava、mvp实现一个玩Android的客户端 #\n\n# 一、简述 #\n现在Android开发，MVP+RxJava+Retrofit这安卓三剑客搭配真是主流，但这里我用了okgo+Rxjava+mvp来开发一个完整的APP，（okgo，比 Retrofit 更简单易用的网络请求框架，开发者的原话，真的不错）个人感觉此项目的框架很适合开发者在个人或者公司的项目中使用，相比retrofit和Google的MVP模式，挺简洁方便的，适合学习mvp模式在项目的应用。\n\n\n# 二、备注 #\n- 此项目提供了一个完整的项目的开发解决方案，包括mvp模式Base类的封装，业务分层，iconfont图标适配方案，autoLayout全尺寸适配方案等\n- okgo网络框架： https://github.com/jeasonlzy/okhttp-OkGo\n- 项目的接口：http://www.wanandroid.com/blog/show/2\n\n\n## 技术与框架 ##\n- okgo网络框架\n- rxjava（增加适当的封装）\n- BRVAH\n- autolayout\n- 自适应图标IconFont\n- 具体看代码吧\n\n## 项目截图 ##\n![](https://user-gold-cdn.xitu.io/2018/2/3/1615ae00b451c48b?w=320&h=568&f=jpeg&s=41339)\n![](https://user-gold-cdn.xitu.io/2018/2/3/1615ae00ae746a05?w=320&h=568&f=jpeg&s=50929)\n![](https://user-gold-cdn.xitu.io/2018/2/3/1615ae00ae26ce6c?w=320&h=568&f=jpeg&s=28894)\n![](https://user-gold-cdn.xitu.io/2018/2/3/1615ae00aeb1419e?w=320&h=568&f=png&s=21729)\n"
  },
  {
    "path": "app/.gitignore",
    "content": "/build\n"
  },
  {
    "path": "app/build.gradle",
    "content": "apply plugin: 'com.android.application'\n\nandroid {\n    compileSdkVersion 26\n    defaultConfig {\n        applicationId \"com.lqm.tomatoit\"\n        minSdkVersion 16\n        targetSdkVersion 26\n        versionCode 1\n        versionName \"1.0\"\n        testInstrumentationRunner \"android.support.test.runner.AndroidJUnitRunner\"\n\n        //解决butterknife  在3.0.1问题\n        javaCompileOptions { annotationProcessorOptions { includeCompileClasspath = true } }\n\n    }\n    buildTypes {\n        release {\n            minifyEnabled false\n            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'\n        }\n    }\n\n    compileOptions {\n        sourceCompatibility JavaVersion.VERSION_1_8\n        targetCompatibility JavaVersion.VERSION_1_8\n    }\n}\n\ndependencies {\n    implementation fileTree(dir: 'libs', include: ['*.jar'])\n    implementation 'com.android.support:appcompat-v7:26.0.2'\n    implementation 'com.android.support.constraint:constraint-layout:1.0.2'\n    testImplementation 'junit:junit:4.12'\n    androidTestImplementation 'com.android.support.test:runner:1.0.1'\n    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.1'\n\n    //okrx2\n    compile 'com.lzy.net:okrx2:2.0.2'\n    compile 'io.reactivex.rxjava2:rxandroid:2.0.1'\n    compile 'com.readystatesoftware.chuck:library:1.0.4'\n\n    compile 'com.android.support:design:26.0.2'\n    compile 'com.android.support:recyclerview-v7:26.0.2'\n    compile 'com.android.support:cardview-v7:26.0.2'\n    compile 'com.jakewharton:butterknife:7.0.1'\n    compile 'com.github.bumptech.glide:glide:3.7.0'\n    compile 'com.google.code.gson:gson:2.8.0'\n    compile 'com.github.CymChad:BaseRecyclerViewAdapterHelper:2.9.30'\n    compile 'com.zhy:autolayout:1.4.5'\n    //轮播图库\n    compile 'cn.bingoogolapple:bga-banner:2.1.7@aar'\n}\n"
  },
  {
    "path": "app/proguard-rules.pro",
    "content": "# Add project specific ProGuard rules here.\n# You can control the set of applied configuration files using the\n# proguardFiles setting in build.gradle.\n#\n# For more details, see\n#   http://developer.android.com/guide/developing/tools/proguard.html\n\n# If your project uses WebView with JS, uncomment the following\n# and specify the fully qualified class name to the JavaScript interface\n# class:\n#-keepclassmembers class fqcn.of.javascript.interface.for.webview {\n#   public *;\n#}\n\n# Uncomment this to preserve the line number information for\n# debugging stack traces.\n#-keepattributes SourceFile,LineNumberTable\n\n# If you keep the line number information, uncomment this to\n# hide the original source file name.\n#-renamesourcefileattribute SourceFile\n"
  },
  {
    "path": "app/src/androidTest/java/com/lqm/tomatoit/ExampleInstrumentedTest.java",
    "content": "package com.lqm.tomatoit;\n\nimport android.content.Context;\nimport android.support.test.InstrumentationRegistry;\nimport android.support.test.runner.AndroidJUnit4;\n\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\n\nimport static org.junit.Assert.*;\n\n/**\n * Instrumented 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.lqm.tomatoit\", 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.lqm.tomatoit\">\n\n    <application\n        android:name=\".app.App\"\n        android:allowBackup=\"true\"\n        android:icon=\"@mipmap/ic_photo\"\n        android:label=\"@string/app_name\"\n        android:roundIcon=\"@mipmap/ic_launcher_round\"\n        android:supportsRtl=\"true\"\n        android:theme=\"@style/AppTheme\">\n\n        <!--autolayout设计稿尺寸-->\n        <meta-data\n            android:name=\"design_width\"\n            android:value=\"750\" />\n        <meta-data\n            android:name=\"design_height\"\n            android:value=\"1334\" />\n\n        <activity\n            android:name=\".ui.activity.MainActivity\"\n            android:screenOrientation=\"portrait\"\n            android:launchMode=\"singleTop\"\n            >\n            <intent-filter>\n                <action android:name=\"android.intent.action.MAIN\" />\n                <category android:name=\"android.intent.category.LAUNCHER\" />\n            </intent-filter>\n        </activity>\n\n        <activity\n            android:name=\".ui.activity.WebViewActivity\"\n            android:screenOrientation=\"portrait\" />\n\n        <activity\n            android:name=\".ui.activity.LoginActivity\"\n            android:screenOrientation=\"portrait\" />\n\n        <activity\n            android:name=\".ui.activity.AboutActivity\"\n            android:screenOrientation=\"portrait\" />\n\n        <activity\n            android:name=\".ui.activity.CollectActivity\"\n            android:screenOrientation=\"portrait\" />\n\n        <activity\n            android:name=\".ui.activity.SearchActivity\"\n            android:screenOrientation=\"portrait\" />\n\n    </application>\n\n</manifest>"
  },
  {
    "path": "app/src/main/java/com/lqm/tomatoit/api/WanService.java",
    "content": "package com.lqm.tomatoit.api;\n\nimport com.lqm.tomatoit.app.AppConst;\nimport com.lqm.tomatoit.helper.JsonConvert;\nimport com.lqm.tomatoit.model.ResponseData;\nimport com.lqm.tomatoit.model.pojo.BannerBean;\nimport com.lqm.tomatoit.model.pojo.HotKeyBean;\nimport com.lqm.tomatoit.model.pojo.UserBean;\nimport com.lqm.tomatoit.model.pojoVO.ArticleListVO;\nimport com.lqm.tomatoit.model.pojoVO.TypeTagVO;\nimport com.lzy.okgo.OkGo;\nimport com.lzy.okgo.cache.CacheMode;\nimport com.lzy.okrx2.adapter.ObservableBody;\n\nimport java.util.List;\n\nimport io.reactivex.Observable;\n\n/**\n * user：lqm\n * desc：玩Android提供的api接口\n * www.wanandroid.com\n */\n\npublic class WanService {\n\n    private static String homeDataList = AppConst.BASE_URL + \"article/list/{page}/json\";\n    private static String homeBannerData = AppConst.BASE_URL + \"banner/json\";\n    private static String hotKeyUrl = AppConst.BASE_URL + \"hotkey/json\";\n    private static String loginUrl = AppConst.BASE_URL + \"user/login\";\n    private static String registUrl = AppConst.BASE_URL + \"user/register\";\n    private static String getClollectData = AppConst.BASE_URL + \"lg/collect/list/0/json\";\n\n    /**\n     * 首页Banner\n     *\n     * @GET(\"/banner/json\")\n     */\n    public static Observable<ResponseData<List<BannerBean>>> getBannerData() {\n        return OkGo.<ResponseData<List<BannerBean>>>get(homeBannerData)\n                .cacheMode(CacheMode.FIRST_CACHE_THEN_REQUEST)\n                .converter(new JsonConvert<ResponseData<List<BannerBean>>>() {\n                })\n                .adapt(new ObservableBody<ResponseData<List<BannerBean>>>());\n    }\n\n    /**\n     * 首页数据\n     * http://www.wanandroid.com/article/list/0/json\n     *\n     * @param page\n     * @GET(\"/article/list/{page}/json\")\n     */\n    public static Observable<ResponseData<ArticleListVO>> getHomeData(int page) {\n        String url = AppConst.BASE_URL + \"article/list/\" + page + \"/json\";\n        return OkGo.<ResponseData<ArticleListVO>>get(url)\n                .cacheMode(CacheMode.FIRST_CACHE_THEN_REQUEST)  //使用缓存\n                .converter(new JsonConvert<ResponseData<ArticleListVO>>() {\n                })\n                .adapt(new ObservableBody<ResponseData<ArticleListVO>>());\n    }\n\n    /**\n     * 知识体系 (类别tag)\n     * http://www.wanandroid.com/tree/json\n     *\n     * @GET(\"/tree/json\")\n     */\n    public static Observable<ResponseData<List<TypeTagVO>>> getTypeTagData() {\n        String url = AppConst.BASE_URL + \"tree/json\";\n        return OkGo.<ResponseData<List<TypeTagVO>>>get(url)\n                .converter(new JsonConvert<ResponseData<List<TypeTagVO>>>() {\n                })\n                .adapt(new ObservableBody<ResponseData<List<TypeTagVO>>>());\n    }\n\n\n    /**\n     * 知识体系下的文章\n     * http://www.wanandroid.com/article/list/0/json?cid=168\n     *\n     * @param page page\n     * @param cid  cid\n     * @GET(\"/article/list/{page}/json\")\n     */\n    public static Observable<ResponseData<ArticleListVO>> getTypeDataById(int page, int cid) {\n        String url = AppConst.BASE_URL + \"article/list/\" + page + \"/json\";\n        return OkGo.<ResponseData<ArticleListVO>>get(url)\n                .params(\"cid\", cid)\n                .converter(new JsonConvert<ResponseData<ArticleListVO>>() {\n                })\n                .adapt(new ObservableBody<ResponseData<ArticleListVO>>());\n    }\n\n    /**\n     * 大家都在搜\n     * http://www.wanandroid.com/hotkey/json\n     *\n     * @GET(\"/hotkey/json\")\n     */\n    public static Observable<ResponseData<List<HotKeyBean>>> getHotKey() {\n        return OkGo.<ResponseData<List<HotKeyBean>>>get(hotKeyUrl)\n                .converter(new JsonConvert<ResponseData<List<HotKeyBean>>>() {\n                })\n                .adapt(new ObservableBody<ResponseData<List<HotKeyBean>>>());\n    }\n\n    /**\n     * 搜索\n     * http://www.wanandroid.com/article/query/0/json\n     * @param page page\n     * @param k    POST search key\n     * @POST(\"/article/query/{page}/json\")\n     */\n    public static Observable<ResponseData<ArticleListVO>> searchArticle(int page,String key) {\n        String url = AppConst.BASE_URL + \"article/query/\" + page + \"/json\";\n        return OkGo.<ResponseData<ArticleListVO>>post(url)\n                .params(\"k\",key)\n                .converter(new JsonConvert<ResponseData<ArticleListVO>>() {\n                })\n                .adapt(new ObservableBody<ResponseData<ArticleListVO>>());\n    }\n\n    /**\n     * 登录\n     * @param username username\n     * @param password password\n     * @POST(\"/user/login\")\n     */\n    public static Observable<ResponseData<UserBean>> login(String username, String password) {\n        return OkGo.<ResponseData<UserBean>>post(loginUrl)\n                .params(\"username\", username)\n                .params(\"password\", password)\n                .converter(new JsonConvert<ResponseData<UserBean>>() {\n                })\n                .adapt(new ObservableBody<ResponseData<UserBean>>());\n    }\n\n    /**\n     * 注册\n     *\n     * @param username   username\n     * @param password   password\n     * @param repassword 确认密码\n     * @POST(\"/user/register\")\n     */\n    public static Observable<ResponseData<UserBean>> regist(String username, String password) {\n        return OkGo.<ResponseData<UserBean>>post(registUrl)\n                .params(\"username\", username)\n                .params(\"password\", password)\n                .params(\"repassword\", password)\n                .converter(new JsonConvert<ResponseData<UserBean>>() {\n                })\n                .adapt(new ObservableBody<ResponseData<UserBean>>());\n    }\n\n    /**\n     * 获取自己收藏的文章列表\n     *\n     * @param page page\n     * @GET(\"/lg/collect/list/{page}/json\")\n     */\n    public static Observable<ResponseData<ArticleListVO>> getCollectData(int page) {\n        String url = AppConst.BASE_URL + \"lg/collect/list/\" + page + \"/json\";\n        return OkGo.<ResponseData<ArticleListVO>>\n                get(url)\n                .converter(new JsonConvert<ResponseData<ArticleListVO>>() {\n                })\n                .adapt(new ObservableBody<ResponseData<ArticleListVO>>());\n    }\n\n    /**\n     * 收藏文章\n     *\n     * @param id id\n     * @POST(\"/lg/collect/{id}/json\")\n     */\n    public static Observable<ResponseData<String>> collectArticle(int id) {\n        String url = AppConst.BASE_URL + \"lg/collect/\" + id + \"/json\";\n        return OkGo.<ResponseData<String>>\n                post(url)\n                .converter(new JsonConvert<ResponseData<String>>() {\n                })\n                .adapt(new ObservableBody<ResponseData<String>>());\n    }\n\n    /**\n     * 取消收藏文章\n     *\n     * @param id id\n     *  POST(\"/lg/uncollect/{id}/json\")\n     *  http://www.wanandroid.com/lg/uncollect/99/json\n     *  POST 参数：originId:1165，没有则写-1\n     *           (注意获取首页接口的时候接口没有返回originId字段，获取我的收藏接口的时候有返回originId字段，\n     *            收藏接口的id 跟 首页接口的id 是不一样的，收藏接口的originId 跟首页接口的id 一样，\n     *            这个接口有点神奇啊，url也不一样)\n     */\n    public static Observable<ResponseData<String>> unCollectArticle(int id,int originId, boolean hasOriginId) {\n        String url;\n        if (hasOriginId){\n            url = AppConst.BASE_URL + \"lg/uncollect/\" + id + \"/json\";\n        }else{\n            url = AppConst.BASE_URL + \"lg/uncollect_originId/\" + id + \"/json\";\n        }\n\n        if (originId == 0){\n            originId = -1;\n        }\n        return OkGo.<ResponseData<String>>\n                post(url)\n                .params(\"originId\",originId)\n                .converter(new JsonConvert<ResponseData<String>>() {\n                })\n                .adapt(new ObservableBody<ResponseData<String>>());\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/lqm/tomatoit/app/App.java",
    "content": "package com.lqm.tomatoit.app;\n\nimport android.app.Activity;\nimport android.app.Application;\nimport android.content.Context;\n\nimport com.lzy.okgo.OkGo;\nimport com.lzy.okgo.cache.CacheEntity;\nimport com.lzy.okgo.cache.CacheMode;\nimport com.lzy.okgo.cookie.CookieJarImpl;\nimport com.lzy.okgo.cookie.store.SPCookieStore;\nimport com.lzy.okgo.interceptor.HttpLoggingInterceptor;\n\nimport java.util.LinkedList;\nimport java.util.List;\nimport java.util.logging.Level;\n\nimport okhttp3.OkHttpClient;\n\n/**\n * user：lqm\n * desc：\n */\n\npublic class App extends Application {\n\n    public static List<Activity> activities = new LinkedList<>();\n\n    private static Context mContext;\n\n    @Override\n    public void onCreate() {\n        super.onCreate();\n        mContext = this.getApplicationContext();\n\n\n        initOkGo();\n        initAutoLayout();\n\n    }\n\n    /**\n     * 配置AutoLayout\n     */\n    private void initAutoLayout() {\n        //默认使用的高度是设备的可用高度，也就是不包括状态栏和底部的操作栏的，以下配置可以拿到设备的物理高度进行百分比\n//        AutoLayoutConifg.getInstance().useDeviceSize();\n    }\n\n    /**\n     * 初始化okgo\n     */\n    private void initOkGo() {\n\n\n        OkHttpClient.Builder builder = new OkHttpClient.Builder();\n        //使用sp保持cookie，如果cookie不过期，则一直有效\n        builder.cookieJar(new CookieJarImpl(new SPCookieStore(this)));\n        HttpLoggingInterceptor loggingInterceptor = new HttpLoggingInterceptor(\"OkGo\");\n        loggingInterceptor.setPrintLevel(HttpLoggingInterceptor.Level.BODY);\n        //log颜色级别，决定了log在控制台显示的颜色\n        loggingInterceptor.setColorLevel(Level.INFO);\n        builder.addInterceptor(loggingInterceptor);\n//        builder.addInterceptor(new TokenInterceptor());\n\n        OkGo.getInstance()\n                .init(this)\n                .setOkHttpClient(builder.build()) //设置OkHttpClient，不设置将使用默认的\n                .setCacheMode(CacheMode.NO_CACHE)\n                .setCacheTime(CacheEntity.CACHE_NEVER_EXPIRE)\n                .setRetryCount(3);\n\n    }\n\n    public static Context getmContext() {\n        return mContext;\n    }\n\n    /**\n     * 退出程序\n     */\n    public static void exit() {\n        for (Activity activity : activities) {\n            activity.finish();\n        }\n    }\n\n}"
  },
  {
    "path": "app/src/main/java/com/lqm/tomatoit/app/AppConst.java",
    "content": "package com.lqm.tomatoit.app;\n\n/**\n * user：lqm\n * desc：App全局常量\n */\n\npublic class AppConst {\n\n    public static final String BASE_URL = \"http://wanandroid.com/\";\n\n    public static final String IS_LOGIN_KEY = \"isLogin\";\n    public static final String USERNAME_KEY = \"userName\";\n\n}\n"
  },
  {
    "path": "app/src/main/java/com/lqm/tomatoit/helper/Convert.java",
    "content": "/*\n * Copyright 2016 jeasonlzy(廖子尧)\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage com.lqm.tomatoit.helper;\n\nimport com.google.gson.Gson;\nimport com.google.gson.JsonElement;\nimport com.google.gson.JsonIOException;\nimport com.google.gson.JsonParser;\nimport com.google.gson.JsonSyntaxException;\nimport com.google.gson.stream.JsonReader;\nimport com.readystatesoftware.chuck.internal.support.JsonConvertor;\n\nimport java.io.Reader;\nimport java.lang.reflect.Type;\n\n/**\n * ================================================\n * 作    者：jeasonlzy（廖子尧）Github地址：https://github.com/jeasonlzy\n * 版    本：1.0\n * 创建日期：16/9/28\n * 描    述： Gson 数据转换工具类\n * 修订历史：\n * ================================================\n */\npublic class Convert {\n\n    private static Gson create() {\n        return Convert.GsonHolder.gson;\n    }\n\n    private static class GsonHolder {\n        private static Gson gson = new Gson();\n    }\n\n    public static <T> T fromJson(String json, Class<T> type) throws JsonIOException, JsonSyntaxException {\n        return create().fromJson(json, type);\n    }\n\n    public static <T> T fromJson(String json, Type type) {\n        return create().fromJson(json, type);\n    }\n\n    public static <T> T fromJson(JsonReader reader, Type typeOfT) throws JsonIOException, JsonSyntaxException {\n        return create().fromJson(reader, typeOfT);\n    }\n\n    public static <T> T fromJson(Reader json, Class<T> classOfT) throws JsonSyntaxException, JsonIOException {\n        return create().fromJson(json, classOfT);\n    }\n\n    public static <T> T fromJson(Reader json, Type typeOfT) throws JsonIOException, JsonSyntaxException {\n        return create().fromJson(json, typeOfT);\n    }\n\n    public static String toJson(Object src) {\n        return create().toJson(src);\n    }\n\n    public static String toJson(Object src, Type typeOfSrc) {\n        return create().toJson(src, typeOfSrc);\n    }\n\n    public static String formatJson(String json) {\n        try {\n            JsonParser jp = new JsonParser();\n            JsonElement je = jp.parse(json);\n            return JsonConvertor.getInstance().toJson(je);\n        } catch (Exception e) {\n            return json;\n        }\n    }\n\n    public static String formatJson(Object src) {\n        try {\n            JsonParser jp = new JsonParser();\n            JsonElement je = jp.parse(toJson(src));\n            return JsonConvertor.getInstance().toJson(je);\n        } catch (Exception e) {\n            return e.getMessage();\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/lqm/tomatoit/helper/JsonConvert.java",
    "content": "/*\n * Copyright 2016 jeasonlzy(廖子尧)\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage com.lqm.tomatoit.helper;\n\nimport com.google.gson.stream.JsonReader;\nimport com.lzy.okgo.convert.Converter;\n\nimport org.json.JSONArray;\nimport org.json.JSONObject;\n\nimport java.lang.reflect.ParameterizedType;\nimport java.lang.reflect.Type;\n\nimport okhttp3.Response;\nimport okhttp3.ResponseBody;\n\n/**\n * ================================================\n * 作    者：jeasonlzy（廖子尧）Github地址：https://github.com/jeasonlzy\n * 版    本：1.0\n * 创建日期：16/9/11\n * 描    述：\n * 修订历史：\n * ================================================\n */\npublic class JsonConvert<T> implements Converter<T> {\n\n    private Type type;\n    private Class<T> clazz;\n\n    public JsonConvert() {\n    }\n\n    public JsonConvert(Type type) {\n        this.type = type;\n    }\n\n    public JsonConvert(Class<T> clazz) {\n        this.clazz = clazz;\n    }\n\n    /**\n     * 该方法是子线程处理，不能做ui相关的工作\n     * 主要作用是解析网络返回的 response 对象，生成onSuccess回调中需要的数据对象\n     * 这里的解析工作不同的业务逻辑基本都不一样,所以需要自己实现,以下给出的时模板代码,实际使用根据需要修改\n     */\n    @Override\n    public T convertResponse(Response response) throws Throwable {\n\n        // 重要的事情说三遍，不同的业务，这里的代码逻辑都不一样，如果你不修改，那么基本不可用\n        // 重要的事情说三遍，不同的业务，这里的代码逻辑都不一样，如果你不修改，那么基本不可用\n        // 重要的事情说三遍，不同的业务，这里的代码逻辑都不一样，如果你不修改，那么基本不可用\n\n        // 如果你对这里的代码原理不清楚，可以看这里的详细原理说明: https://github.com/jeasonlzy/okhttp-OkGo/wiki/JsonCallback\n        // 如果你对这里的代码原理不清楚，可以看这里的详细原理说明: https://github.com/jeasonlzy/okhttp-OkGo/wiki/JsonCallback\n        // 如果你对这里的代码原理不清楚，可以看这里的详细原理说明: https://github.com/jeasonlzy/okhttp-OkGo/wiki/JsonCallback\n\n        if (type == null) {\n            if (clazz == null) {\n                // 如果没有通过构造函数传进来，就自动解析父类泛型的真实类型（有局限性，继承后就无法解析到）\n                Type genType = getClass().getGenericSuperclass();\n                type = ((ParameterizedType) genType).getActualTypeArguments()[0];\n            } else {\n                return parseClass(response, clazz);\n            }\n        }\n\n        if (type instanceof ParameterizedType) {\n            return parseParameterizedType(response, (ParameterizedType) type);\n        } else if (type instanceof Class) {\n            return parseClass(response, (Class<?>) type);\n        } else {\n            return parseType(response, type);\n        }\n    }\n\n    private T parseClass(Response response, Class<?> rawType) throws Exception {\n        if (rawType == null) return null;\n        ResponseBody body = response.body();\n        if (body == null) return null;\n        JsonReader jsonReader = new JsonReader(body.charStream());\n\n        if (rawType == String.class) {\n            //noinspection unchecked\n            return (T) body.string();\n        } else if (rawType == JSONObject.class) {\n            //noinspection unchecked\n            return (T) new JSONObject(body.string());\n        } else if (rawType == JSONArray.class) {\n            //noinspection unchecked\n            return (T) new JSONArray(body.string());\n        } else {\n            T t = Convert.fromJson(jsonReader, rawType);\n            response.close();\n            return t;\n        }\n    }\n\n    private T parseType(Response response, Type type) throws Exception {\n        if (type == null) return null;\n        ResponseBody body = response.body();\n        if (body == null) return null;\n        JsonReader jsonReader = new JsonReader(body.charStream());\n\n        // 泛型格式如下： new JsonCallback<任意JavaBean>(this)\n        T t = Convert.fromJson(jsonReader, type);\n        response.close();\n        return t;\n    }\n\n    private T parseParameterizedType(Response response, ParameterizedType type) throws Exception {\n        if (type == null) return null;\n        ResponseBody body = response.body();\n        if (body == null) return null;\n        JsonReader jsonReader = new JsonReader(body.charStream());\n\n        Type rawType = type.getRawType();                     // 泛型的实际类型\n        Type typeArgument = type.getActualTypeArguments()[0]; // 泛型的参数\n        if (rawType != LzyResponse.class) {\n            // 泛型格式如下： new JsonCallback<外层BaseBean<内层JavaBean>>(this)\n            T t = Convert.fromJson(jsonReader, type);\n            response.close();\n            return t;\n        } else {\n            if (typeArgument == Void.class) {\n                // 泛型格式如下： new JsonCallback<LzyResponse<Void>>(this)\n                SimpleResponse simpleResponse = Convert.fromJson(jsonReader, SimpleResponse.class);\n                response.close();\n                //noinspection unchecked\n                return (T) simpleResponse.toLzyResponse();\n            } else {\n                // 泛型格式如下： new JsonCallback<LzyResponse<内层JavaBean>>(this)\n                LzyResponse lzyResponse = Convert.fromJson(jsonReader, type);\n                response.close();\n                int code = lzyResponse.code;\n                //这里的0是以下意思\n                //一般来说服务器会和客户端约定一个数表示成功，其余的表示失败，这里根据实际情况修改\n                if (code == 0) {\n                    //noinspection unchecked\n                    return (T) lzyResponse;\n                } else if (code == 104) {\n                    throw new IllegalStateException(\"用户授权信息无效\");\n                } else if (code == 105) {\n                    throw new IllegalStateException(\"用户收取信息已过期\");\n                } else {\n                    //直接将服务端的错误信息抛出，onError中可以获取\n                    throw new IllegalStateException(\"错误代码：\" + code + \"，错误信息：\" + lzyResponse.msg);\n                }\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/lqm/tomatoit/helper/LzyResponse.java",
    "content": "/*\n * Copyright 2016 jeasonlzy(廖子尧)\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage com.lqm.tomatoit.helper;\n\nimport java.io.Serializable;\n\n/**\n * ================================================\n * 作    者：jeasonlzy（廖子尧）Github地址：https://github.com/jeasonlzy\n * 版    本：1.0\n * 创建日期：16/9/28\n * 描    述：\n * 修订历史：\n * ================================================\n */\npublic class LzyResponse<T> implements Serializable {\n\n    private static final long serialVersionUID = 5213230387175987834L;\n\n    public int code;\n    public String msg;\n    public T data;\n\n    @Override\n    public String toString() {\n        return \"LzyResponse{\\n\" +//\n               \"\\tcode=\" + code + \"\\n\" +//\n               \"\\tmsg='\" + msg + \"\\'\\n\" +//\n               \"\\tdata=\" + data + \"\\n\" +//\n               '}';\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/lqm/tomatoit/helper/SimpleResponse.java",
    "content": "/*\n * Copyright 2016 jeasonlzy(廖子尧)\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage com.lqm.tomatoit.helper;\n\nimport java.io.Serializable;\n\n/**\n * ================================================\n * 作    者：jeasonlzy（廖子尧）Github地址：https://github.com/jeasonlzy\n * 版    本：1.0\n * 创建日期：16/9/28\n * 描    述：\n * 修订历史：\n * ================================================\n */\npublic class SimpleResponse implements Serializable {\n\n    private static final long serialVersionUID = -1477609349345966116L;\n\n    public int code;\n    public String msg;\n\n    public LzyResponse toLzyResponse() {\n        LzyResponse lzyResponse = new LzyResponse();\n        lzyResponse.code = code;\n        lzyResponse.msg = msg;\n        return lzyResponse;\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/lqm/tomatoit/helper/interceptor/TokenInterceptor.java",
    "content": "package com.lqm.tomatoit.helper.interceptor;\n\nimport android.util.Log;\n\nimport org.json.JSONException;\nimport org.json.JSONObject;\n\nimport java.io.IOException;\nimport java.nio.charset.Charset;\n\nimport okhttp3.Interceptor;\nimport okhttp3.MediaType;\nimport okhttp3.Request;\nimport okhttp3.Response;\nimport okhttp3.ResponseBody;\nimport okio.Buffer;\nimport okio.BufferedSource;\n\n/**\n * user：lqm\n * desc：token验证令牌失效拦截器，token过期时刷新token或弹dialog跳转到登录界面\n *  src:https://www.jianshu.com/p/62ab11ddacc8\n */\n\npublic class TokenInterceptor implements Interceptor {\n\n    private static final Charset UTF8 = Charset.forName(\"UTF-8\");\n\n    @Override\n    public Response intercept(Chain chain) throws IOException {\n        Request request = chain.request();\n\n        // try the request\n        Response originalResponse = chain.proceed(request);\n\n        /**通过如下的办法曲线取到请求完成的数据\n         *\n         * 原本想通过  originalResponse.body().string()\n         * 去取到请求完成的数据,但是一直报错,不知道是okhttp的bug还是操作不当\n         *\n         * 然后去看了okhttp的源码,找到了这个曲线方法,取到请求完成的数据后,根据特定的判断条件去判断token过期\n         */\n        ResponseBody responseBody = originalResponse.body();\n        BufferedSource source = responseBody.source();\n        source.request(Long.MAX_VALUE); // Buffer the entire body.\n        Buffer buffer = source.buffer();\n        Charset charset = UTF8;\n        MediaType contentType = responseBody.contentType();\n        if (contentType != null) {\n            charset = contentType.charset(UTF8);\n        }\n        String bodyString = buffer.clone().readString(charset);\n        Log.d(\"body---------->\", bodyString);\n\n        /***************************************/\n\n        JSONObject extrasJson = null;\n        try {\n            if (extrasJson == null){\n                extrasJson = new JSONObject(bodyString);\n            }\n        } catch (JSONException e) {\n            e.printStackTrace();\n        }\n        int code = Integer.parseInt(extrasJson.optString(\"errorCode\")); //根据后台返回数据执行修改\n\n//        if (response shows expired token){//根据和服务端的约定判断token过期\n        if (code == 401){  //假设服务端返回码401为token过期\n\n            // TODO 弹出全局的dialog或者用以下代码刷新token (全局dialog可以用WindowManager相应实现)\n\n            //取出本地的refreshToken\n            String refreshToken = \"sssgr122222222\";\n            // 通过一个特定的接口获取新的token，此处要用到同步的retrofit请求\n//            ApiService service = ServiceManager.getService(ApiService.class);\n//            Call<String> call = service.refreshToken(refreshToken);\n            //要用retrofit的同步方式\n//            String newToken = call.execute().body();\n            String newToken = \"sssssssss  ne wtoken\";\n\n            // create a new request and modify it accordingly using the new token\n            Request newRequest = request.newBuilder().header(\"token\", newToken)\n                    .build();\n\n            // retry the request\n\n            originalResponse.body().close();\n            return chain.proceed(newRequest);\n        }\n\n        // otherwise just pass the original response on\n        return originalResponse;\n    }\n\n}\n"
  },
  {
    "path": "app/src/main/java/com/lqm/tomatoit/helper/rxjavahelper/RxObserver.java",
    "content": "package com.lqm.tomatoit.helper.rxjavahelper;\n\n\nimport io.reactivex.Observer;\nimport io.reactivex.disposables.Disposable;\n\n/**\n * user：lqm\n * desc：自己的Observer，减少实现不必要的回调\n */\npublic abstract class RxObserver<T>  implements Observer<T> {\n\n    @Override\n    public void onSubscribe(Disposable d){\n        _onSubscribe(d);\n    }\n\n    @Override\n    public void onNext(T t) {\n        _onNext(t);\n    }\n    @Override\n    public void onError(Throwable e) {\n        _onError(e.getMessage());\n    }\n    @Override\n    public void onComplete() {\n        _onComplete();\n    }\n\n    public void _onSubscribe(Disposable d) {\n\n    }\n    public void _onComplete() {\n\n    }\n\n    //抽象方法，必须实现\n    public abstract void _onNext(T t);\n    public abstract void _onError(String errorMessage);\n\n}"
  },
  {
    "path": "app/src/main/java/com/lqm/tomatoit/helper/rxjavahelper/RxResultHelper.java",
    "content": "package com.lqm.tomatoit.helper.rxjavahelper;\n\nimport com.lqm.tomatoit.model.ResponseData;\n\nimport io.reactivex.Observable;\nimport io.reactivex.ObservableSource;\nimport io.reactivex.ObservableTransformer;\nimport io.reactivex.functions.Function;\n\n/**\n * user：lqm\n * desc：Rx处理服务器返回,\n *      服务器的返回的数据格式一般都是一致的，所有我们每个网络请求都可以使\n *      用compose(RxResultHelper.handleResult())来处理服务器返回，一般服务器返回成功码为200，\n *      相应改一下返回码的判断就行了\n */\n\npublic class RxResultHelper {\n\n    private static final int RESPONSE_SUCCESS_CODE = 0; //大部分为200\n    private static final int RESPONSE_ERROR_CODE = -1;\n\n\n\n    public static <T> ObservableTransformer<ResponseData<T>, T> handleResult() {\n        return new ObservableTransformer<ResponseData<T>, T>() {\n            @Override\n            public ObservableSource<T> apply(Observable<ResponseData<T>> tObservable) {\n                return tObservable.flatMap(\n                        new Function<ResponseData<T>, Observable<T>>() {\n                            @Override\n                            public Observable<T> apply(ResponseData<T> tResponseData) throws Exception {\n                                //可以相应更改\n                                if (tResponseData.getErrorCode() == RESPONSE_SUCCESS_CODE) {\n                                    return Observable.just(tResponseData.getData());\n                                } else if (tResponseData.getErrorCode() == RESPONSE_ERROR_CODE) {\n                                    return Observable.error(new Exception(tResponseData.getErrorMsg()));\n                                } else {\n                                    return Observable.empty();\n                                }\n                            }\n                        }\n                );\n            }\n\n        };\n    }\n\n}\n"
  },
  {
    "path": "app/src/main/java/com/lqm/tomatoit/helper/rxjavahelper/RxSchedulersHelper.java",
    "content": "package com.lqm.tomatoit.helper.rxjavahelper;\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 * user：lqm\n * desc：compose()里接收一个Transformer对象，ObservableTransformer\n *       可以通过它将一种类型的Observable转换成另一种类型的Observable。\n *       现在.subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread())\n *       的地方可以用.compose(RxSchedulersHelper.io_main())代替。\n */\n\npublic class RxSchedulersHelper {\n\n    public static <T> ObservableTransformer<T, T> io_main() {\n        return new ObservableTransformer<T, T>() {\n            @Override\n            public ObservableSource<T> apply(Observable<T> upstream) {\n                return upstream\n                        .subscribeOn(Schedulers.io())\n                        .observeOn(AndroidSchedulers.mainThread());\n            }\n        };\n    }\n\n}\n"
  },
  {
    "path": "app/src/main/java/com/lqm/tomatoit/manager/ImageLoaderManager.java",
    "content": "package com.lqm.tomatoit.manager;\n\nimport android.content.Context;\nimport android.widget.ImageView;\n\nimport com.bumptech.glide.Glide;\nimport com.bumptech.glide.load.engine.DiskCacheStrategy;\nimport com.bumptech.glide.request.FutureTarget;\nimport com.lqm.tomatoit.R;\n\nimport java.io.File;\n\n/**\n * @user lqm\n * @desc 图片加载管理\n */\npublic class ImageLoaderManager {\n\n    public static void LoadImage(Context context, String imgUrl, ImageView imageView) {\n\n        Glide.with(context)\n                .load(imgUrl)\n                .placeholder(R.mipmap.default_img)\n                .dontAnimate() //解决圆形图显示占位图问题\n                .error(R.mipmap.default_img)\n                .diskCacheStrategy(DiskCacheStrategy.ALL)\n                .into(imageView);\n    }\n\n\n    /**\n     * 缓存图片到本地\n     */\n    public static File CacheFile(Context context, String imgUrl){\n        File cacheFile = null;\n        FutureTarget<File> future = Glide.with(context)\n                .load(imgUrl)\n                .downloadOnly(500, 500);\n        try {\n             cacheFile = future.get();\n        } catch (Exception e) {\n            e.printStackTrace();\n        }\n        return cacheFile;\n    }\n\n}\n"
  },
  {
    "path": "app/src/main/java/com/lqm/tomatoit/model/ResponseData.java",
    "content": "package com.lqm.tomatoit.model;\n\nimport java.io.Serializable;\n\npublic class ResponseData<T> implements Serializable {\n\n    private static final long serialVersionUID = 5213230387175987834L;\n\n    private int errorCode;\n    private String errorMsg;\n    private T data;\n\n\n    public int getErrorCode() {\n        return errorCode;\n    }\n\n    public void setErrorCode(int errorCode) {\n        this.errorCode = errorCode;\n    }\n\n    public String getErrorMsg() {\n        return errorMsg;\n    }\n\n    public void setErrorMsg(String 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}"
  },
  {
    "path": "app/src/main/java/com/lqm/tomatoit/model/pojo/ArticleBean.java",
    "content": "package com.lqm.tomatoit.model.pojo;\n\nimport java.io.Serializable;\n\n/**\n * user：lqm\n * desc：\n */\n\npublic class ArticleBean implements Serializable {\n    /**\n     * id : 2207\n     * title : 慢啄的Xposed文章\n     * chapterId : 239\n     * chapterName : Xposed\n     * envelopePic : null\n     * link : https://www.wrbug.com/categories/xposed%E5%BC%80%E5%8F%91/\n     * author : 慢啄\n     * origin : null\n     * publishTime : 1516332536000\n     * zan : null\n     * desc : null\n     * visible : 1\n     * niceDate : 2018-01-19\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 Object envelopePic;\n    private String link;\n    private String author;\n    private Object origin;\n    private int originId;\n    private long publishTime;\n    private Object zan;\n    private Object 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 Object getEnvelopePic() {\n        return envelopePic;\n    }\n\n    public void setEnvelopePic(Object 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 Object getOrigin() {\n        return origin;\n    }\n\n    public void setOrigin(Object origin) {\n        this.origin = origin;\n    }\n\n    public int getOriginId() {\n        return originId;\n    }\n\n    public void setOriginId(int originId) {\n        this.originId = originId;\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 Object getZan() {\n        return zan;\n    }\n\n    public void setZan(Object zan) {\n        this.zan = zan;\n    }\n\n    public Object getDesc() {\n        return desc;\n    }\n\n    public void setDesc(Object desc) {\n        this.desc = desc;\n    }\n\n    public 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"
  },
  {
    "path": "app/src/main/java/com/lqm/tomatoit/model/pojo/BannerBean.java",
    "content": "package com.lqm.tomatoit.model.pojo;\n\nimport java.io.Serializable;\n\n/**\n * user：lqm\n * desc：首页轮播图\n */\n\npublic class BannerBean implements Serializable {\n\n    /**\n     * id : 6\n     * url : http://www.wanandroid.com/navi\n     * imagePath : http://www.wanandroid.com/blogimgs/62c1bd68-b5f3-4a3c-a649-7ca8c7dfabe6.png\n     * title : 我们新增了一个常用导航Tab~\n     * desc :\n     * isVisible : 1\n     * order : 1\n     * type : 0\n     */\n\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/lqm/tomatoit/model/pojo/HotKeyBean.java",
    "content": "package com.lqm.tomatoit.model.pojo;\n\nimport java.io.Serializable;\n\n/**\n * user：lqm\n * desc：热词\n */\n\npublic class HotKeyBean implements Serializable {\n\n    /**\n     * id : 6\n     * name : 面试\n     * link : null\n     * visible : 1\n     * order : 1\n     */\n\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/lqm/tomatoit/model/pojo/TypeChildrenBean.java",
    "content": "package com.lqm.tomatoit.model.pojo;\n\nimport java.io.Serializable;\nimport java.util.List;\n\n/**\n * user：lqm\n * desc：Type Tag  二级标签\n */\n\npublic class TypeChildrenBean implements Serializable {\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<?> 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<?> children) {\n        this.children = children;\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/lqm/tomatoit/model/pojo/UserBean.java",
    "content": "package com.lqm.tomatoit.model.pojo;\n\nimport java.io.Serializable;\nimport java.util.List;\n\n/**\n * user：lqm\n * desc：登录注册成功\n */\n\npublic class UserBean implements Serializable {\n\n    /**\n     * id : 1847\n     * username : 猥琐的豆腐6\n     * password : 123456\n     * icon : null\n     * type : 0\n     * collectIds : [2239]\n     */\n\n    private int id;\n    private String username;\n    private String password;\n    private Object 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 Object getIcon() {\n        return icon;\n    }\n\n    public void setIcon(Object 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/lqm/tomatoit/model/pojoVO/ArticleListVO.java",
    "content": "package com.lqm.tomatoit.model.pojoVO;\n\nimport com.lqm.tomatoit.model.pojo.ArticleBean;\n\nimport java.io.Serializable;\nimport java.util.List;\n\n/**\n * user：lqm\n * desc：获取一个文章列表（首页，分类，收藏 等通用）\n */\n\npublic class ArticleListVO implements Serializable {\n\n    /**\n     * datas : [{\"id\":2207,\"title\":\"慢啄的Xposed文章\",\"chapterId\":239,\"chapterName\":\"Xposed\",\"envelopePic\":null,\"link\":\"https://www.wrbug.com/categories/xposed%E5%BC%80%E5%8F%91/\",\"author\":\"慢啄\",\"origin\":null,\"publishTime\":1516332536000,\"zan\":null,\"desc\":null,\"visible\":1,\"niceDate\":\"2018-01-19\",\"courseId\":13,\"collect\":false},{\"id\":2206,\"title\":\"QMUI Android\",\"chapterId\":301,\"chapterName\":\"快速开发\",\"envelopePic\":null,\"link\":\"http://qmuiteam.com/android/page/index.html\",\"author\":\"小编\",\"origin\":null,\"publishTime\":1516328190000,\"zan\":null,\"desc\":null,\"visible\":1,\"niceDate\":\"2018-01-19\",\"courseId\":13,\"collect\":false},{\"id\":2205,\"title\":\"awesome-design\",\"chapterId\":299,\"chapterName\":\"创意&素材\",\"envelopePic\":null,\"link\":\"https://github.com/gztchan/awesome-design/\",\"author\":\"小编\",\"origin\":null,\"publishTime\":1516289555000,\"zan\":null,\"desc\":null,\"visible\":1,\"niceDate\":\"2018-01-18\",\"courseId\":13,\"collect\":false},{\"id\":2204,\"title\":\"Material Design设计模板与素材\",\"chapterId\":299,\"chapterName\":\"创意&素材\",\"envelopePic\":null,\"link\":\"https://www.uplabs.com/android\",\"author\":\"小编\",\"origin\":null,\"publishTime\":1516289539000,\"zan\":null,\"desc\":null,\"visible\":1,\"niceDate\":\"2018-01-18\",\"courseId\":13,\"collect\":false},{\"id\":2203,\"title\":\"iconstore\",\"chapterId\":299,\"chapterName\":\"创意&素材\",\"envelopePic\":null,\"link\":\"https://iconstore.co/\",\"author\":\"小编\",\"origin\":null,\"publishTime\":1516289486000,\"zan\":null,\"desc\":null,\"visible\":1,\"niceDate\":\"2018-01-18\",\"courseId\":13,\"collect\":false},{\"id\":2202,\"title\":\"iconfont\",\"chapterId\":299,\"chapterName\":\"创意&素材\",\"envelopePic\":null,\"link\":\"http://www.iconfont.cn/\",\"author\":\"小编\",\"origin\":null,\"publishTime\":1516289466000,\"zan\":null,\"desc\":null,\"visible\":1,\"niceDate\":\"2018-01-18\",\"courseId\":13,\"collect\":false},{\"id\":2201,\"title\":\"《广研Android卡顿监控系统》\",\"chapterId\":78,\"chapterName\":\"性能优化\",\"envelopePic\":null,\"link\":\"https://mp.weixin.qq.com/s/MthGj4AwFPL2JrZ0x1i4fw\",\"author\":\"腾讯Bugly\",\"origin\":null,\"publishTime\":1516286424000,\"zan\":null,\"desc\":null,\"visible\":1,\"niceDate\":\"2018-01-18\",\"courseId\":13,\"collect\":false},{\"id\":2200,\"title\":\"WebView截长图解决方案\",\"chapterId\":98,\"chapterName\":\"WebView\",\"envelopePic\":null,\"link\":\"https://www.jianshu.com/p/0faa70e88441\",\"author\":\"贝聊科技\",\"origin\":null,\"publishTime\":1516280223000,\"zan\":null,\"desc\":null,\"visible\":1,\"niceDate\":\"2018-01-18\",\"courseId\":13,\"collect\":false},{\"id\":2199,\"title\":\"【Xposed】Android-Hook初探\",\"chapterId\":239,\"chapterName\":\"Xposed\",\"envelopePic\":null,\"link\":\"http://liompei.com/2018/01/02/%E3%80%90Xposed%E3%80%91Android-Hook%E5%88%9D%E6%8E%A2/\",\"author\":\"Liompei\",\"origin\":null,\"publishTime\":1516276750000,\"zan\":null,\"desc\":null,\"visible\":1,\"niceDate\":\"2018-01-18\",\"courseId\":13,\"collect\":false},{\"id\":2198,\"title\":\"Xposed开发初体验\",\"chapterId\":239,\"chapterName\":\"Xposed\",\"envelopePic\":null,\"link\":\"http://www.jowanxu.top/2017/09/21/Xposed%E5%BC%80%E5%8F%91%E5%88%9D%E4%BD%93%E9%AA%8C/\",\"author\":\"叫我旺仔\",\"origin\":null,\"publishTime\":1516275347000,\"zan\":null,\"desc\":null,\"visible\":1,\"niceDate\":\"2018-01-18\",\"courseId\":13,\"collect\":false},{\"id\":2197,\"title\":\"叫我旺仔\",\"chapterId\":274,\"chapterName\":\"个人博客\",\"envelopePic\":null,\"link\":\"http://www.jowanxu.top/archives/\",\"author\":\"小编\",\"origin\":null,\"publishTime\":1516275071000,\"zan\":null,\"desc\":null,\"visible\":1,\"niceDate\":\"2018-01-18\",\"courseId\":13,\"collect\":false},{\"id\":2196,\"title\":\"Android Studio 掌握这些调试技巧，Debug能力不能再高啦\",\"chapterId\":60,\"chapterName\":\"Android Studio相关\",\"envelopePic\":null,\"link\":\"https://www.jianshu.com/p/985f788fae2c\",\"author\":\"亦枫\",\"origin\":null,\"publishTime\":1516270173000,\"zan\":null,\"desc\":null,\"visible\":1,\"niceDate\":\"2018-01-18\",\"courseId\":13,\"collect\":false},{\"id\":2194,\"title\":\"百度移动统计\",\"chapterId\":300,\"chapterName\":\"互联网统计\",\"envelopePic\":null,\"link\":\"https://mtj.baidu.com/data/mobile/device\",\"author\":\"小编\",\"origin\":null,\"publishTime\":1516266460000,\"zan\":null,\"desc\":null,\"visible\":1,\"niceDate\":\"2018-01-18\",\"courseId\":13,\"collect\":false},{\"id\":2193,\"title\":\"猎豹大数据\",\"chapterId\":300,\"chapterName\":\"互联网统计\",\"envelopePic\":null,\"link\":\"http://cn.data.cmcm.com/rank\",\"author\":\"小编\",\"origin\":null,\"publishTime\":1516266420000,\"zan\":null,\"desc\":null,\"visible\":1,\"niceDate\":\"2018-01-18\",\"courseId\":13,\"collect\":false},{\"id\":2192,\"title\":\"无版权素材站\",\"chapterId\":299,\"chapterName\":\"创意&素材\",\"envelopePic\":null,\"link\":\"https://unsplash.com/\",\"author\":\"小编\",\"origin\":null,\"publishTime\":1516252267000,\"zan\":null,\"desc\":null,\"visible\":1,\"niceDate\":\"2018-01-18\",\"courseId\":13,\"collect\":false},{\"id\":2189,\"title\":\"Android 混淆查缺补漏\",\"chapterId\":295,\"chapterName\":\"混淆\",\"envelopePic\":null,\"link\":\"https://mp.weixin.qq.com/s/g7AxmLHvJTX-JyGqs4SaHg\",\"author\":\"Othershe\",\"origin\":null,\"publishTime\":1516241162000,\"zan\":null,\"desc\":null,\"visible\":1,\"niceDate\":\"2018-01-18\",\"courseId\":13,\"collect\":false},{\"id\":2188,\"title\":\"Android实现修改状态栏背景 字体 图标颜色\",\"chapterId\":186,\"chapterName\":\"沉浸式\",\"envelopePic\":null,\"link\":\"https://juejin.im/post/5a30f1535188251c11409d77\",\"author\":\"jlanglang\",\"origin\":null,\"publishTime\":1516203303000,\"zan\":null,\"desc\":null,\"visible\":1,\"niceDate\":\"2018-01-17\",\"courseId\":13,\"collect\":false},{\"id\":2187,\"title\":\"搭建Android上的服务器 实现隔空取物\",\"chapterId\":298,\"chapterName\":\"我的博客\",\"envelopePic\":null,\"link\":\"http://www.wanandroid.com/blog/show/2020\",\"author\":\"鸿洋\",\"origin\":null,\"publishTime\":1516153307000,\"zan\":null,\"desc\":null,\"visible\":1,\"niceDate\":\"2018-01-17\",\"courseId\":13,\"collect\":false},{\"id\":2088,\"title\":\"Xposed 框架解析\",\"chapterId\":239,\"chapterName\":\"Xposed\",\"envelopePic\":null,\"link\":\"https://www.jianshu.com/p/2b8343c774df\",\"author\":\"王永迪 \",\"origin\":null,\"publishTime\":1516094972000,\"zan\":null,\"desc\":null,\"visible\":1,\"niceDate\":\"2018-01-16\",\"courseId\":13,\"collect\":false},{\"id\":985,\"title\":\"Android Studio 使用Gradle多渠道打包\",\"chapterId\":169,\"chapterName\":\"gradle\",\"envelopePic\":\"\",\"link\":\"https://mp.weixin.qq.com/s/yKfesG8lodfhJVA-rPfyRg\",\"author\":\"loonggg\",\"origin\":\"非著名程序员\",\"publishTime\":1516003287000,\"zan\":0,\"desc\":\"我们都知道国内应用市场非常多，为了统计各个应用市场的app下载量和使用情况，我们需要多渠道的打包。如果一个一个的手动去打包岂不烦死了，要多麻烦就有多麻烦。这就要求我们学会使用Gradle进行多渠道打包。\",\"visible\":1,\"niceDate\":\"2018-01-15\",\"courseId\":13,\"collect\":false}]\n     * offset : 20\n     * size : 20\n     * total : 1014\n     * pageCount : 51\n     * curPage : 2\n     * over : false\n     */\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<ArticleBean> 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<ArticleBean> getDatas() {\n        return datas;\n    }\n\n    public void setDatas(List<ArticleBean> datas) {\n        this.datas = datas;\n    }\n\n}\n"
  },
  {
    "path": "app/src/main/java/com/lqm/tomatoit/model/pojoVO/TypeTagVO.java",
    "content": "package com.lqm.tomatoit.model.pojoVO;\n\nimport com.lqm.tomatoit.model.pojo.TypeChildrenBean;\n\nimport java.io.Serializable;\nimport java.util.List;\n\n/**\n * user：lqm\n * desc：分类标签\n */\n\npublic class TypeTagVO implements Serializable {\n\n    /**\n     * id : 150\n     * name : 开发环境\n     * courseId : 13\n     * parentChapterId : 0\n     * order : 1\n     * visible : 1\n     * children : [{\"id\":60,\"name\":\"Android Studio相关\",\"courseId\":13,\"parentChapterId\":150,\"order\":1000,\"visible\":1,\"children\":[]},{\"id\":169,\"name\":\"gradle\",\"courseId\":13,\"parentChapterId\":150,\"order\":1001,\"visible\":1,\"children\":[]},{\"id\":269,\"name\":\"官方发布\",\"courseId\":13,\"parentChapterId\":150,\"order\":1002,\"visible\":1,\"children\":[]}]\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<TypeChildrenBean> 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<TypeChildrenBean> getChildren() {\n        return children;\n    }\n\n    public void setChildren(List<TypeChildrenBean> children) {\n        this.children = children;\n    }\n\n\n}"
  },
  {
    "path": "app/src/main/java/com/lqm/tomatoit/ui/activity/AboutActivity.java",
    "content": "package com.lqm.tomatoit.ui.activity;\n\nimport android.widget.TextView;\n\nimport com.lqm.tomatoit.R;\nimport com.lqm.tomatoit.ui.base.BaseActivity;\nimport com.lqm.tomatoit.ui.base.BasePresenter;\nimport com.lqm.tomatoit.widget.IconFontTextView;\n\nimport butterknife.Bind;\nimport butterknife.OnClick;\n\n/**\n * user：lqm\n * desc：关于我们界面\n */\n\npublic class AboutActivity extends BaseActivity {\n\n    @Bind(R.id.tv_return)\n    IconFontTextView tvReturn;\n    @Bind(R.id.tv_title)\n    TextView tvTitle;\n    @Bind(R.id.tv_other)\n    IconFontTextView tvOther;\n\n    @Override\n    protected BasePresenter createPresenter() {\n        return null;\n    }\n\n    @Override\n    protected int provideContentViewId() {\n        return R.layout.activity_about;\n    }\n\n    @Override\n    public void initView() {\n        tvTitle.setText(\"关于我们\");\n    }\n\n    @OnClick(R.id.tv_return)\n    public void onViewClicked() {\n        finish();\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/lqm/tomatoit/ui/activity/CollectActivity.java",
    "content": "package com.lqm.tomatoit.ui.activity;\n\nimport android.support.design.widget.Snackbar;\nimport android.support.v4.widget.SwipeRefreshLayout;\nimport android.support.v7.widget.LinearLayoutManager;\nimport android.support.v7.widget.RecyclerView;\nimport android.view.View;\nimport android.widget.TextView;\n\nimport com.chad.library.adapter.base.BaseQuickAdapter;\nimport com.lqm.tomatoit.R;\nimport com.lqm.tomatoit.model.pojo.ArticleBean;\nimport com.lqm.tomatoit.ui.adapter.CollectArticleAdapter;\nimport com.lqm.tomatoit.ui.base.BaseActivity;\nimport com.lqm.tomatoit.ui.presenter.CollectPresenter;\nimport com.lqm.tomatoit.ui.view.CollectView;\nimport com.lqm.tomatoit.widget.IconFontTextView;\n\nimport java.util.List;\n\nimport butterknife.Bind;\nimport butterknife.OnClick;\n\n/**\n * user：lqm\n * desc：我的收藏界面\n */\n\npublic class CollectActivity extends BaseActivity<CollectView, CollectPresenter> implements CollectView,\n        SwipeRefreshLayout.OnRefreshListener, BaseQuickAdapter.RequestLoadMoreListener {\n    @Bind(R.id.tv_return)\n    IconFontTextView tvReturn;\n    @Bind(R.id.tv_title)\n    TextView tvTitle;\n    @Bind(R.id.tv_no_collect)\n    TextView tvNoCollect;\n    @Bind(R.id.tv_other)\n    IconFontTextView tvOther;\n    @Bind(R.id.rv_content)\n    RecyclerView rvContent;\n    @Bind(R.id.swipe_refresh)\n    SwipeRefreshLayout swipeRefresh;\n    private CollectArticleAdapter mAdapter;\n\n    @Override\n    protected CollectPresenter createPresenter() {\n        return new CollectPresenter();\n    }\n\n    @Override\n    protected int provideContentViewId() {\n        return R.layout.activity_collect;\n    }\n\n    @Override\n    public void initView() {\n        tvTitle.setText(\"我的收藏\");\n\n        rvContent.setLayoutManager(new LinearLayoutManager(CollectActivity.this));\n        mAdapter = new CollectArticleAdapter(CollectActivity.this, null);\n        rvContent.setAdapter(mAdapter);\n        swipeRefresh.setOnRefreshListener(this);\n        mAdapter.setOnLoadMoreListener(this,rvContent);\n\n        onRefresh();\n\n    }\n\n\n    @Override\n    public void onRefresh() {\n        mPresenter.getRefreshData();\n    }\n\n    @Override\n    public void onLoadMoreRequested() {\n        mPresenter.getMoreData();\n    }\n\n\n    @OnClick(R.id.tv_return)\n    public void onViewClicked() {\n        finish();\n    }\n\n    @Override\n    public void onRefreshSuccess(List<ArticleBean> data) {\n        mAdapter.setNewData(data);\n        tvNoCollect.setVisibility(data.size() ==0? View.VISIBLE:View.GONE);\n    }\n\n    @Override\n    public void onRefreshFail(String errorString) {\n        showSwipeRefresh(false);\n        Snackbar.make(rvContent, errorString, Snackbar.LENGTH_SHORT).show();\n    }\n\n    @Override\n    public void onLoadMoreSuccess(List<ArticleBean> data) {\n        if (data.size() == 0) {\n            mAdapter.loadMoreEnd();\n        } else {\n            mAdapter.addData(data);\n            mAdapter.loadMoreComplete();\n        }\n    }\n\n    @Override\n    public void onLoadMoreFail(String errorString) {\n        showSwipeRefresh(false);\n        mAdapter.loadMoreComplete();\n        Snackbar.make(rvContent, errorString, Snackbar.LENGTH_SHORT).show();\n    }\n\n    @Override\n    public void loadComplete() {\n        showSwipeRefresh(false);\n    }\n\n    private void showSwipeRefresh(boolean isRefresh) {\n        swipeRefresh.post(new Runnable() {\n            @Override\n            public void run() {\n                swipeRefresh.setRefreshing(isRefresh);\n            }\n        });\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/lqm/tomatoit/ui/activity/LoginActivity.java",
    "content": "package com.lqm.tomatoit.ui.activity;\n\nimport android.content.Intent;\nimport android.text.TextUtils;\nimport android.view.View;\nimport android.widget.Button;\nimport android.widget.EditText;\n\nimport com.lqm.tomatoit.R;\nimport com.lqm.tomatoit.app.AppConst;\nimport com.lqm.tomatoit.model.pojo.UserBean;\nimport com.lqm.tomatoit.ui.base.BaseActivity;\nimport com.lqm.tomatoit.ui.presenter.LoginRegistPresenter;\nimport com.lqm.tomatoit.ui.view.LoginRegistView;\nimport com.lqm.tomatoit.util.PrefUtils;\nimport com.lqm.tomatoit.util.T;\nimport com.lqm.tomatoit.widget.IconFontTextView;\n\nimport butterknife.Bind;\nimport butterknife.OnClick;\n\n/**\n * user：lqm\n * desc：登录注册界面\n */\n\npublic class LoginActivity extends BaseActivity<LoginRegistView,LoginRegistPresenter>\n        implements LoginRegistView {\n\n    @Bind(R.id.ic_close)\n    IconFontTextView icClose;\n    @Bind(R.id.et_name)\n    EditText etName;\n    @Bind(R.id.et_password)\n    EditText etPassword;\n    @Bind(R.id.btn_regist)\n    Button btnRegist;\n    @Bind(R.id.btn_login)\n    Button btnLogin;\n\n    @Override\n    protected LoginRegistPresenter createPresenter() {\n        return new LoginRegistPresenter();\n    }\n\n    @Override\n    protected int provideContentViewId() {\n        return R.layout.activity_login;\n    }\n\n    @OnClick({R.id.ic_close, R.id.btn_regist, R.id.btn_login})\n    public void onViewClicked(View view) {\n        switch (view.getId()) {\n            case R.id.ic_close:\n                finish();\n                break;\n            case R.id.btn_regist:\n                if (TextUtils.isEmpty(etName.getText().toString()) || TextUtils.isEmpty(etPassword.getText().toString())){\n                    T.showShort(LoginActivity.this,\"用户名和密码不能为空\");\n                }else if (etName.getText().toString().length() < 6 || etName.getText().toString().length() <6){\n                    T.showShort(LoginActivity.this,\"用户名和密码长度不能小于6位\");\n                }else{\n                    mPresenter.toRegist(etName.getText().toString(),etPassword.getText().toString());\n                }\n\n                break;\n            case R.id.btn_login:\n                if (TextUtils.isEmpty(etName.getText().toString()) || TextUtils.isEmpty(etPassword.getText().toString())){\n                    T.showShort(LoginActivity.this,\"用户名和密码不能为空\");\n                }else if (etName.getText().toString().length() < 6 || etName.getText().toString().length() <6){\n                    T.showShort(LoginActivity.this,\"用户名和密码长度不能小于6位\");\n                }else{\n                    mPresenter.toLogin(etName.getText().toString(),etPassword.getText().toString());\n                }\n                break;\n        }\n    }\n\n    @Override\n    public void showProgress(String tipString) {\n        showWaitingDialog(tipString);\n    }\n\n    @Override\n    public void hideProgress() {\n        hideWaitingDialog();\n    }\n\n    @Override\n    public void loginSuccess(UserBean user) {\n        PrefUtils.setBoolean(LoginActivity.this,AppConst.IS_LOGIN_KEY,true);\n        PrefUtils.setString(LoginActivity.this,AppConst.USERNAME_KEY,etName.getText().toString());\n        startActivity(new Intent(LoginActivity.this,MainActivity.class));\n        finish();\n    }\n\n    @Override\n    public void registerSuccess(UserBean user) {\n        T.showShort(LoginActivity.this,\"注册成功\");\n        PrefUtils.setBoolean(LoginActivity.this, AppConst.IS_LOGIN_KEY,true);\n        PrefUtils.setString(LoginActivity.this,AppConst.USERNAME_KEY,etName.getText().toString());\n        startActivity(new Intent(LoginActivity.this,MainActivity.class));\n        finish();\n    }\n\n    @Override\n    public void loginFail() {\n        T.showShort(LoginActivity.this,\"登录失败\");\n    }\n\n    @Override\n    public void registerFail() {\n        T.showShort(LoginActivity.this,\"注册失败\");\n    }\n\n}\n"
  },
  {
    "path": "app/src/main/java/com/lqm/tomatoit/ui/activity/MainActivity.java",
    "content": "package com.lqm.tomatoit.ui.activity;\n\nimport android.content.Intent;\nimport android.support.v4.app.Fragment;\nimport android.support.v4.view.ViewPager;\nimport android.view.View;\nimport android.widget.LinearLayout;\nimport android.widget.TextView;\n\nimport com.lqm.tomatoit.R;\nimport com.lqm.tomatoit.ui.adapter.FragPagerAdapter;\nimport com.lqm.tomatoit.ui.base.BaseActivity;\nimport com.lqm.tomatoit.ui.base.BasePresenter;\nimport com.lqm.tomatoit.ui.fragment.HomeFragment;\nimport com.lqm.tomatoit.ui.fragment.TypeFragment;\nimport com.lqm.tomatoit.ui.fragment.UserFragment;\nimport com.lqm.tomatoit.util.UIUtils;\nimport com.lqm.tomatoit.widget.IconFontTextView;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\nimport butterknife.Bind;\nimport butterknife.OnClick;\n\npublic class MainActivity extends BaseActivity {\n\n    @Bind(R.id.viewpager)\n    ViewPager viewPager;\n    @Bind(R.id.if_home)\n    IconFontTextView ifHome;\n    @Bind(R.id.tv_home)\n    TextView tvHome;\n    @Bind(R.id.ll_home)\n    LinearLayout llHome;\n    @Bind(R.id.if_type)\n    IconFontTextView ifType;\n    @Bind(R.id.tv_type)\n    TextView tvType;\n    @Bind(R.id.ll_type)\n    LinearLayout llType;\n    @Bind(R.id.if_user)\n    IconFontTextView ifUser;\n    @Bind(R.id.tv_user)\n    TextView tvUser;\n    @Bind(R.id.ll_user)\n    LinearLayout llUser;\n    @Bind(R.id.tv_hot)\n    IconFontTextView tvHot;\n    @Bind(R.id.tv_search)\n    IconFontTextView tvSearch;\n\n    private List<Fragment> mFragments = new ArrayList<>();\n\n    @Override\n    protected BasePresenter createPresenter() {\n        return null;\n    }\n\n    @Override\n    protected int provideContentViewId() {\n        return R.layout.activity_main;\n    }\n\n    @Override\n    public void initView() {\n\n        setTabColor(ifHome, tvHome);\n        mFragments.add(HomeFragment.newInstance());\n        mFragments.add(TypeFragment.newInstance());\n        mFragments.add(UserFragment.newInstance());\n        viewPager.setAdapter(new FragPagerAdapter(getSupportFragmentManager(), mFragments));\n        viewPager.setCurrentItem(0, false);\n        viewPager.setOffscreenPageLimit(3);\n\n        viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {\n            @Override\n            public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {\n\n            }\n\n            @Override\n            public void onPageSelected(int position) {\n                switch (position) {\n                    case 0:\n                        setTabColor(ifHome, tvHome);\n                        break;\n                    case 1:\n                        setTabColor(ifType, tvType);\n                        break;\n                    case 2:\n                        setTabColor(ifUser, tvUser);\n                        break;\n                }\n            }\n\n            @Override\n            public void onPageScrollStateChanged(int state) {\n\n            }\n        });\n\n    }\n\n    @OnClick({R.id.ll_home, R.id.ll_type,R.id.ll_user, R.id.tv_hot, R.id.tv_search})\n    public void onViewClicked(View view) {\n        switch (view.getId()) {\n            case R.id.ll_home:\n                viewPager.setCurrentItem(0);\n                setTabColor(ifHome, tvHome);\n                break;\n            case R.id.ll_type:\n                viewPager.setCurrentItem(1);\n                setTabColor(ifType, tvType);\n                break;\n            case R.id.ll_user:\n                viewPager.setCurrentItem(2);\n                setTabColor(ifUser, tvUser);\n                break;\n            case R.id.tv_hot:\n\n                break;\n            case R.id.tv_search:\n                startActivity(new Intent(MainActivity.this,SearchActivity.class));\n                break;\n        }\n    }\n\n    private void setTabColor(IconFontTextView icon, TextView textView) {\n        ifHome.setTextColor(UIUtils.getColor(R.color.tab_nor_color));\n        tvHome.setTextColor(UIUtils.getColor(R.color.tab_nor_color));\n        ifType.setTextColor(UIUtils.getColor(R.color.tab_nor_color));\n        tvType.setTextColor(UIUtils.getColor(R.color.tab_nor_color));\n        ifUser.setTextColor(UIUtils.getColor(R.color.tab_nor_color));\n        tvUser.setTextColor(UIUtils.getColor(R.color.tab_nor_color));\n        icon.setTextColor(UIUtils.getColor(R.color.tab_sel_color));\n        textView.setTextColor(UIUtils.getColor(R.color.tab_sel_color));\n    }\n\n\n}\n"
  },
  {
    "path": "app/src/main/java/com/lqm/tomatoit/ui/activity/SearchActivity.java",
    "content": "package com.lqm.tomatoit.ui.activity;\n\nimport android.support.v7.widget.LinearLayoutManager;\nimport android.support.v7.widget.RecyclerView;\nimport android.text.Editable;\nimport android.text.Selection;\nimport android.text.Spannable;\nimport android.text.TextUtils;\nimport android.text.TextWatcher;\nimport android.view.View;\nimport android.widget.EditText;\nimport android.widget.LinearLayout;\nimport android.widget.RelativeLayout;\nimport android.widget.TextView;\n\nimport com.chad.library.adapter.base.BaseQuickAdapter;\nimport com.lqm.tomatoit.R;\nimport com.lqm.tomatoit.model.pojo.ArticleBean;\nimport com.lqm.tomatoit.model.pojo.HotKeyBean;\nimport com.lqm.tomatoit.ui.adapter.ArticleListAdapter;\nimport com.lqm.tomatoit.ui.base.BaseActivity;\nimport com.lqm.tomatoit.ui.presenter.SearchPresenter;\nimport com.lqm.tomatoit.ui.view.SearchView;\nimport com.lqm.tomatoit.util.T;\nimport com.lqm.tomatoit.widget.AutoLinefeedLayout;\nimport com.lqm.tomatoit.widget.IconFontTextView;\n\nimport java.util.List;\n\nimport butterknife.Bind;\nimport butterknife.OnClick;\n\n/**\n * user：lqm\n * desc：搜索界面\n */\n\npublic class SearchActivity extends BaseActivity<SearchView, SearchPresenter>\n        implements SearchView, BaseQuickAdapter.RequestLoadMoreListener {\n\n    @Bind(R.id.et_search)\n    EditText etSearch;\n    @Bind(R.id.rl_search)\n    RelativeLayout rlSearch;\n    @Bind(R.id.tv_return)\n    TextView tvReturn;\n    @Bind(R.id.tv_clean_input)\n    IconFontTextView tvCleanInput;\n    @Bind(R.id.layout_hot_key)\n    AutoLinefeedLayout hotKeyLayout;\n    @Bind(R.id.ll_hot_key)\n    LinearLayout llHotKey;\n    @Bind(R.id.rv_content)\n    RecyclerView rvContent;\n    private ArticleListAdapter mArticleAdapter;\n\n    @Override\n    protected SearchPresenter createPresenter() {\n        return new SearchPresenter();\n    }\n\n    @Override\n    protected int provideContentViewId() {\n        return R.layout.activity_search;\n    }\n\n    @Override\n    public void initView() {\n\n        rvContent.setLayoutManager(new LinearLayoutManager(SearchActivity.this));\n        mArticleAdapter = new ArticleListAdapter(SearchActivity.this, null);\n        rvContent.setAdapter(mArticleAdapter);\n\n        mArticleAdapter.setOnLoadMoreListener(this, rvContent);\n\n        mPresenter.getHotKeyData();\n\n    }\n\n    @Override\n    public void initListener() {\n        etSearch.addTextChangedListener(new TextWatcher() {\n            @Override\n            public void beforeTextChanged(CharSequence s, int start, int count, int after) {\n            }\n\n            @Override\n            public void onTextChanged(CharSequence s, int start, int before, int count) {\n            }\n\n            @Override\n            public void afterTextChanged(Editable s) {\n                mPresenter.searchData(etSearch.getText().toString());\n            }\n        });\n\n    }\n\n    @OnClick({R.id.tv_clean_input, R.id.tv_return})\n    public void onViewClicked(View view) {\n        switch (view.getId()) {\n            case R.id.tv_clean_input:\n                etSearch.setText(\"\");\n                break;\n            case R.id.tv_return:\n                finish();\n                break;\n        }\n\n    }\n\n    @Override\n    public void getHotKeySuccess(List<HotKeyBean> data) {\n        hotKeyLayout.removeAllViews();\n        for (int i = 0; i < data.size(); i++) {\n            View view = LinearLayout.inflate(SearchActivity.this, R.layout.item_hot_key, null);\n            TextView textView = (TextView) view.findViewById(R.id.textview);\n            textView.setText(data.get(i).getName());\n            hotKeyLayout.addView(view);\n            int finalI = i;\n            view.setOnClickListener(new View.OnClickListener() {\n                @Override\n                public void onClick(View v) {\n                    etSearch.setText(data.get(finalI).getName());\n\n                    // 将光标移至字符串尾部\n                    CharSequence charSequence = etSearch.getText();\n                    if (charSequence instanceof Spannable) {\n                        Spannable spanText = (Spannable) charSequence;\n                        Selection.setSelection(spanText, charSequence.length());\n                    }\n                }\n            });\n        }\n    }\n\n    @Override\n    public void getHotKeyFail(String message) {\n        T.showShort(SearchActivity.this, message);\n    }\n\n    @Override\n    public void searchDataSuccess(List<ArticleBean> data) {\n        if (data == null || data.size() == 0) {\n            llHotKey.setVisibility(View.VISIBLE);\n            rvContent.setVisibility(View.GONE);\n        } else {\n            llHotKey.setVisibility(View.GONE);\n            rvContent.setVisibility(View.VISIBLE);\n        }\n        mArticleAdapter.setNewData(data);\n    }\n\n    @Override\n    public void searchDataFail(String message) {\n        T.showShort(SearchActivity.this, message);\n    }\n\n    @Override\n    public void loadMoreDataSuccess(List<ArticleBean> data) {\n        if (data.size() == 0) {\n            mArticleAdapter.loadMoreEnd();\n        } else {\n            mArticleAdapter.addData(data);\n            mArticleAdapter.loadMoreComplete();\n        }\n    }\n\n    @Override\n    public void loadMoreDataFail(String message) {\n        T.showShort(SearchActivity.this, message);\n    }\n\n    @Override\n    public void onLoadMoreRequested() {\n        String keyWord = etSearch.getText().toString();\n        if (!TextUtils.isEmpty(keyWord)) {\n            mPresenter.getMoreData(etSearch.getText().toString());\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/lqm/tomatoit/ui/activity/WebViewActivity.java",
    "content": "package com.lqm.tomatoit.ui.activity;\n\nimport android.content.ClipData;\nimport android.content.ClipboardManager;\nimport android.content.Context;\nimport android.content.Intent;\nimport android.net.Uri;\nimport android.support.design.widget.Snackbar;\nimport android.support.v4.widget.NestedScrollView;\nimport android.view.KeyEvent;\nimport android.view.View;\nimport android.webkit.WebView;\nimport android.widget.ProgressBar;\nimport android.widget.RelativeLayout;\nimport android.widget.TextView;\n\nimport com.lqm.tomatoit.R;\nimport com.lqm.tomatoit.ui.base.BaseActivity;\nimport com.lqm.tomatoit.ui.presenter.WebViewPresenter;\nimport com.lqm.tomatoit.ui.view.CommonWebView;\nimport com.lqm.tomatoit.util.ActivityUtils;\nimport com.lqm.tomatoit.util.SharesUtils;\nimport com.lqm.tomatoit.util.UIUtils;\nimport com.lqm.tomatoit.widget.CustomPopWindow;\nimport com.lqm.tomatoit.widget.IconFontTextView;\nimport com.lqm.tomatoit.widget.WebViewFragment;\n\nimport butterknife.Bind;\nimport butterknife.OnClick;\n\n/**\n * user：lqm\n * desc：WebView界面，加载文章详情等\n * (tip:上滑隐藏topbar,因为webview焦点问题，这里在布局中用NestedScrollView，再动态添加webview)\n */\n\npublic class WebViewActivity extends BaseActivity<CommonWebView, WebViewPresenter>\n        implements CommonWebView {\n\n    public static final String WEB_URL = \"web_url\";\n\n    @Bind(R.id.progress_bar)\n    ProgressBar progressBar;\n    @Bind(R.id.tv_return)\n    IconFontTextView tvReturn;\n    @Bind(R.id.tv_title)\n    TextView tvTitle;\n    @Bind(R.id.tv_other)\n    IconFontTextView tvOther;\n    @Bind(R.id.rl_topbar_layout)\n    RelativeLayout rlTopbarLayout;\n    @Bind(R.id.webview_container)\n    NestedScrollView webViewContainer;\n\n\n    private String mUrl;\n    private CustomPopWindow mMorePopWindow;\n    private WebViewFragment mWebViewFragment;\n    private WebView webView;\n\n    public static void runActivity(Context context, String url) {\n        Intent intent = new Intent(context, WebViewActivity.class);\n        intent.putExtra(WEB_URL, url);\n        context.startActivity(intent);\n    }\n\n    @Override\n    protected WebViewPresenter createPresenter() {\n        return new WebViewPresenter();\n    }\n\n    @Override\n    protected int provideContentViewId() {\n        return R.layout.activity_webview;\n    }\n\n    @Override\n    public ProgressBar getProgressBar() {\n        return progressBar;\n    }\n\n    @Override\n    public void setTitle(String title) {\n        tvTitle.setText(title);\n    }\n\n    @Override\n    public void init() {\n        mUrl = getIntent().getStringExtra(WEB_URL);\n    }\n\n    @Override\n    public void initView() {\n        tvOther.setText(UIUtils.getString(R.string.ic_more));\n\n        mWebViewFragment = new WebViewFragment();\n        ActivityUtils.addFragmentToActivity(getSupportFragmentManager(), mWebViewFragment, R.id.webview_container);\n\n    }\n\n    @Override\n    protected void onStart() {\n        super.onStart();\n\n        //获取webview\n        webView = mWebViewFragment.getWebView();\n        mPresenter.setWebView(webView, mUrl);\n    }\n\n    @Override\n    protected void onDestroy() {\n        super.onDestroy();\n        webView.destroy();\n    }\n\n    @Override\n    public boolean onKeyDown(int keyCode, KeyEvent event) {\n        if (keyCode == KeyEvent.KEYCODE_BACK) {\n            if (webView.canGoBack()) {\n                webView.goBack();\n                return true;\n            } else {\n                finish();//退出程序\n                return true;\n            }\n        }\n        return super.onKeyDown(keyCode, event);\n    }\n\n\n    @OnClick({R.id.tv_return, R.id.tv_other})\n\n    public void onViewClicked(View view) {\n        switch (view.getId()) {\n            case R.id.tv_return:\n                finish();\n                break;\n            case R.id.tv_other:\n                //更多按钮\n                View popView = View.inflate(WebViewActivity.this, R.layout.popup_webview_more, null);\n                mMorePopWindow = new CustomPopWindow.PopupWindowBuilder(this)\n                        .setView(popView)\n                        .enableBackgroundDark(false) //弹出popWindow时，背景是否变暗\n                        .create()\n                        .showAsDropDown(tvOther, -430, -10);\n\n                //分享\n                popView.findViewById(R.id.tv_shape).setOnClickListener(new View.OnClickListener() {\n                    @Override\n                    public void onClick(View v) {\n                        SharesUtils.share(WebViewActivity.this, webView.getUrl());\n                        mMorePopWindow.dissmiss();\n                    }\n                });\n                //复制链接\n                popView.findViewById(R.id.tv_copy_link).setOnClickListener(new View.OnClickListener() {\n                    @Override\n                    public void onClick(View v) {\n                        ClipboardManager cmd = (ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE);\n                        cmd.setPrimaryClip(ClipData.newPlainText(getString(R.string.copy_link), webView.getUrl()));\n                        Snackbar.make(getWindow().getDecorView(), R.string.copy_link_success, Snackbar.LENGTH_SHORT).show();\n                        mMorePopWindow.dissmiss();\n                    }\n                });\n                //使用系统浏览器打开\n                popView.findViewById(R.id.tv_open_out).setOnClickListener(new View.OnClickListener() {\n                    @Override\n                    public void onClick(View v) {\n                        Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(webView.getUrl()));\n                        startActivity(intent);\n                        mMorePopWindow.dissmiss();\n                    }\n                });\n                break;\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/lqm/tomatoit/ui/adapter/ArticleListAdapter.java",
    "content": "package com.lqm.tomatoit.ui.adapter;\n\nimport android.content.Context;\nimport android.support.annotation.Nullable;\nimport android.text.Html;\nimport android.view.View;\nimport android.widget.TextView;\n\nimport com.chad.library.adapter.base.BaseQuickAdapter;\nimport com.chad.library.adapter.base.BaseViewHolder;\nimport com.lqm.tomatoit.R;\nimport com.lqm.tomatoit.api.WanService;\nimport com.lqm.tomatoit.app.AppConst;\nimport com.lqm.tomatoit.helper.rxjavahelper.RxObserver;\nimport com.lqm.tomatoit.helper.rxjavahelper.RxResultHelper;\nimport com.lqm.tomatoit.helper.rxjavahelper.RxSchedulersHelper;\nimport com.lqm.tomatoit.model.ResponseData;\nimport com.lqm.tomatoit.model.pojo.ArticleBean;\nimport com.lqm.tomatoit.ui.activity.WebViewActivity;\nimport com.lqm.tomatoit.util.PrefUtils;\nimport com.lqm.tomatoit.util.T;\nimport com.lqm.tomatoit.util.UIUtils;\n\nimport java.util.List;\n\nimport io.reactivex.Observer;\nimport io.reactivex.android.schedulers.AndroidSchedulers;\nimport io.reactivex.disposables.Disposable;\nimport io.reactivex.schedulers.Schedulers;\n\n/**\n * user：lqm\n * desc：文章列表适配器\n */\n\npublic class ArticleListAdapter extends BaseQuickAdapter<ArticleBean, BaseViewHolder> {\n\n    private Context mContext;\n\n    public ArticleListAdapter(Context context, @Nullable List<ArticleBean> data) {\n        super(R.layout.item_article, data);\n        mContext = context;\n    }\n\n    @Override\n    protected void convert(final BaseViewHolder holder, final ArticleBean bean) {\n        holder.setText(R.id.tv_title, Html.fromHtml(bean.getTitle()))\n                .setText(R.id.tv_author, bean.getAuthor())\n                .setText(R.id.tv_time, bean.getNiceDate())\n                .setText(R.id.tv_type, bean.getChapterName());\n\n        TextView tvCollect = (TextView) holder.getView(R.id.tv_collect);\n        if (bean.isCollect()) {\n            tvCollect.setText(UIUtils.getString(R.string.ic_collect_sel));\n            tvCollect.setTextColor(UIUtils.getColor(R.color.main));\n        } else {\n            tvCollect.setText(UIUtils.getString(R.string.ic_collect_nor));\n            tvCollect.setTextColor(UIUtils.getColor(R.color.text3));\n        }\n\n        tvCollect.setOnClickListener(new View.OnClickListener() {\n            @Override\n            public void onClick(View v) {\n                collectArticle(tvCollect, bean);\n            }\n        });\n\n        holder.itemView.setOnClickListener(new View.OnClickListener() {\n            @Override\n            public void onClick(View v) {\n                WebViewActivity.runActivity(mContext, bean.getLink());\n            }\n        });\n\n    }\n\n    //收藏文章\n    private void collectArticle(TextView tvCollect, ArticleBean bean) {\n        if (PrefUtils.getBoolean(mContext, AppConst.IS_LOGIN_KEY, false) == false) {\n            T.showShort(mContext, \"请先登录\");\n            return;\n        }\n        if (bean.isCollect()) {\n            //已经收藏，点击取消收藏\n            unCollectArticler(bean, tvCollect);\n        } else {\n            collectArticler(bean, tvCollect);\n        }\n    }\n\n    private void collectArticler(ArticleBean bean, TextView tvCollect) {\n        WanService.collectArticle(bean.getId())\n                .subscribeOn(Schedulers.io())\n                .observeOn(AndroidSchedulers.mainThread())\n                .subscribe(new Observer<ResponseData<String>>() {\n                    @Override\n                    public void onSubscribe(Disposable d) {\n\n                    }\n\n                    @Override\n                    public void onNext(ResponseData<String> responseData) {\n                        if (responseData.getErrorCode() == 0) {\n                            T.showShort(mContext, \"收藏成功\");\n                            bean.setCollect(true);\n                            tvCollect.setText(UIUtils.getString(R.string.ic_collect_sel));\n                            tvCollect.setTextColor(UIUtils.getColor(R.color.main));\n                        } else {\n                            T.showShort(mContext, responseData.getErrorMsg());\n                        }\n\n                    }\n\n                    @Override\n                    public void onError(Throwable e) {\n                        T.showShort(mContext, \"收藏失败\");\n                    }\n\n                    @Override\n                    public void onComplete() {\n\n                    }\n                });\n    }\n\n    private void unCollectArticler(ArticleBean bean, TextView tvCollect) {\n        WanService.unCollectArticle(bean.getId(), bean.getOriginId(), false)\n                .compose(RxSchedulersHelper.io_main())\n                .compose(RxResultHelper.handleResult())\n                .subscribe(new RxObserver<String>() {\n                    @Override\n                    public void _onNext(String s) {\n                        T.showShort(mContext, \"取消收藏\");\n                        bean.setCollect(false);\n                        tvCollect.setText(UIUtils.getString(R.string.ic_collect_nor));\n                        tvCollect.setTextColor(UIUtils.getColor(R.color.text3));\n                    }\n\n                    @Override\n                    public void _onError(String errorMessage) {\n                        T.showShort(mContext, \"取消收藏失败\");\n                    }\n                });\n    }\n\n}\n"
  },
  {
    "path": "app/src/main/java/com/lqm/tomatoit/ui/adapter/CollectArticleAdapter.java",
    "content": "package com.lqm.tomatoit.ui.adapter;\n\nimport android.content.Context;\nimport android.support.annotation.Nullable;\nimport android.view.View;\nimport android.widget.TextView;\n\nimport com.chad.library.adapter.base.BaseQuickAdapter;\nimport com.chad.library.adapter.base.BaseViewHolder;\nimport com.lqm.tomatoit.R;\nimport com.lqm.tomatoit.api.WanService;\nimport com.lqm.tomatoit.helper.rxjavahelper.RxObserver;\nimport com.lqm.tomatoit.helper.rxjavahelper.RxResultHelper;\nimport com.lqm.tomatoit.helper.rxjavahelper.RxSchedulersHelper;\nimport com.lqm.tomatoit.model.pojo.ArticleBean;\nimport com.lqm.tomatoit.ui.activity.WebViewActivity;\nimport com.lqm.tomatoit.util.T;\nimport com.lqm.tomatoit.util.UIUtils;\n\nimport java.util.List;\n\n/**\n * user：lqm\n * desc：我的收藏文章列表适配器\n *      （这个适配器跟ArticleListAdapter一样的，但是接口收藏列表接口返回的数据collect字段有问题，所以这里分开）\n */\n\npublic class CollectArticleAdapter extends BaseQuickAdapter<ArticleBean, BaseViewHolder> {\n\n    private Context mContext;\n\n    public CollectArticleAdapter(Context context, @Nullable List<ArticleBean> data) {\n        super(R.layout.item_article, data);\n        mContext = context;\n    }\n\n    @Override\n    protected void convert(final BaseViewHolder holder, final ArticleBean bean) {\n        holder.setText(R.id.tv_title, bean.getTitle())\n                .setText(R.id.tv_author, bean.getAuthor())\n                .setText(R.id.tv_time, bean.getNiceDate())\n                .setText(R.id.tv_type, bean.getChapterName());\n\n        TextView tvCollect = (TextView) holder.getView(R.id.tv_collect);\n        tvCollect.setText(UIUtils.getString(R.string.ic_collect_sel));\n        tvCollect.setTextColor(UIUtils.getColor(R.color.main));\n\n        tvCollect.setOnClickListener(new View.OnClickListener() {\n            @Override\n            public void onClick(View v) {\n                unCollectArticler(holder.getLayoutPosition(), bean);\n            }\n        });\n\n        holder.itemView.setOnClickListener(new View.OnClickListener() {\n            @Override\n            public void onClick(View v) {\n                WebViewActivity.runActivity(mContext, bean.getLink());\n            }\n        });\n\n    }\n\n    private void unCollectArticler(int position, ArticleBean bean) {\n        WanService.unCollectArticle(bean.getId(),bean.getOriginId(),true)\n                .compose(RxSchedulersHelper.io_main())\n                .compose(RxResultHelper.handleResult())\n                .subscribe(new RxObserver<String>() {\n                    @Override\n                    public void _onNext(String s) {\n                        T.showShort(mContext, \"取消收藏\");\n                        getData().remove(position);\n                        if (position != 0){\n                            notifyItemRemoved(position);\n                        }else{\n                            notifyDataSetChanged();\n                        }\n                    }\n\n                    @Override\n                    public void _onError(String errorMessage) {\n                        T.showShort(mContext, \"取消收藏失败\");\n                    }\n                });\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/lqm/tomatoit/ui/adapter/FragPagerAdapter.java",
    "content": "package com.lqm.tomatoit.ui.adapter;\n\nimport android.support.v4.app.Fragment;\nimport android.support.v4.app.FragmentManager;\nimport android.support.v4.app.FragmentPagerAdapter;\n\nimport java.util.List;\n\n/**\n * @user  lqm\n * @desc  ViewPager+Fragment 的适配器\n */\n\npublic class FragPagerAdapter extends FragmentPagerAdapter {\n    private List<Fragment> mFragments;\n\n    public FragPagerAdapter(FragmentManager fm, List<Fragment> fragments) {\n        super(fm);\n        mFragments = fragments;\n\n    }\n\n    @Override\n    public Fragment getItem(int position) {\n        return mFragments.get(position);\n    }\n\n    @Override\n    public int getCount() {\n        return mFragments.size();\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/lqm/tomatoit/ui/base/BaseActivity.java",
    "content": "package com.lqm.tomatoit.ui.base;\n\nimport android.app.Dialog;\nimport android.os.Bundle;\nimport android.support.annotation.Nullable;\nimport android.text.TextUtils;\nimport android.view.View;\nimport android.view.ViewGroup;\nimport android.view.Window;\nimport android.widget.TextView;\n\nimport com.lqm.tomatoit.R;\nimport com.lqm.tomatoit.app.App;\nimport com.lqm.tomatoit.widget.CustomDialog;\nimport com.zhy.autolayout.AutoLayoutActivity;\n\nimport butterknife.ButterKnife;\n\n\npublic abstract class BaseActivity<V, T extends BasePresenter<V>> extends AutoLayoutActivity {\n\n\n    protected T mPresenter;\n    private CustomDialog mDialogWaiting;\n\n\n    @Override\n    protected void onCreate(@Nullable Bundle savedInstanceState) {\n        super.onCreate(savedInstanceState);\n        App.activities.add(this);\n\n        init();\n\n        //判断是否使用MVP模式\n        mPresenter = createPresenter();\n        if (mPresenter != null) {\n            mPresenter.attachView((V) this);//因为之后所有的子类都要实现对应的View接口\n        }\n\n        //子类不再需要设置布局ID，也不再需要使用ButterKnife.bind()\n        setContentView(provideContentViewId());\n        ButterKnife.bind(this);\n\n        excuteStatesBar();\n\n        initView();\n        initData();\n        initListener();\n    }\n\n    /**\n     * 解决4.4设置状态栏颜色之后，布局内容嵌入状态栏位置问题\n     */\n    private void excuteStatesBar(){\n        ViewGroup mContentView = (ViewGroup) getWindow().findViewById(Window.ID_ANDROID_CONTENT);\n        View mChildView = mContentView.getChildAt(0);\n        if (mChildView != null) {\n            //注意不是设置 ContentView 的 FitsSystemWindows,\n            // 而是设置 ContentView 的第一个子 View ，预留出系统 View 的空间.\n            mChildView.setFitsSystemWindows(true);\n        }\n    }\n\n    @Override\n    protected void onDestroy() {\n        super.onDestroy();\n        if (mPresenter != null) {\n            mPresenter.detachView();\n        }\n    }\n\n    //在setContentView()调用之前调用，可以设置WindowFeature(如：this.requestWindowFeature(Window.FEATURE_NO_TITLE);)\n    public void init() {\n    }\n\n    public void initView() {\n    }\n\n    public void initData() {\n    }\n\n    public void initListener() {\n    }\n\n    //用于创建Presenter和判断是否使用MVP模式(由子类实现)\n    protected abstract T createPresenter();\n\n    //得到当前界面的布局文件id(由子类实现)\n    protected abstract int provideContentViewId();\n\n    /**\n     * 显示等待提示框\n     */\n    public Dialog showWaitingDialog(String tip) {\n        hideWaitingDialog();\n        View view = View.inflate(this, R.layout.dialog_waiting, null);\n        if (!TextUtils.isEmpty(tip))\n            ((TextView) view.findViewById(R.id.tvTip)).setText(tip);\n        mDialogWaiting = new CustomDialog(this, view, R.style.MyDialog);\n        mDialogWaiting.show();\n        mDialogWaiting.setCancelable(false);\n        return mDialogWaiting;\n    }\n\n    /**\n     * 隐藏等待提示框\n     */\n    public void hideWaitingDialog() {\n        if (mDialogWaiting != null) {\n            mDialogWaiting.dismiss();\n            mDialogWaiting = null;\n        }\n    }\n\n}\n"
  },
  {
    "path": "app/src/main/java/com/lqm/tomatoit/ui/base/BaseFragment.java",
    "content": "package com.lqm.tomatoit.ui.base;\n\nimport android.os.Bundle;\nimport android.support.v4.app.Fragment;\nimport android.view.LayoutInflater;\nimport android.view.View;\nimport android.view.ViewGroup;\n\nimport butterknife.ButterKnife;\nimport io.reactivex.annotations.Nullable;\n\n/**\n * user：lqm\n * desc：BaseFragment\n */\n\npublic abstract class BaseFragment<V, T extends BasePresenter<V>> extends Fragment {\n\n    protected T mPresenter;\n\n    @Override\n    public void onCreate(@Nullable Bundle savedInstanceState) {\n        super.onCreate(savedInstanceState);\n\n        init();\n\n        //判断是否使用MVP模式\n        mPresenter = createPresenter();\n        if (mPresenter != null) {\n            mPresenter.attachView((V) this);//因为之后所有的子类都要实现对应的View接口\n        }\n    }\n\n    @Nullable\n    @Override\n    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {\n        View rootView = inflater.inflate(provideContentViewId(), container, false);\n        ButterKnife.bind(this, rootView);\n        initView(rootView);\n        return rootView;\n    }\n\n    @Override\n    public void onActivityCreated(@Nullable Bundle savedInstanceState) {\n        super.onActivityCreated(savedInstanceState);\n        initData();\n        initListener();\n    }\n\n    @Override\n    public void onDestroy() {\n        super.onDestroy();\n        if (mPresenter != null) {\n            mPresenter.detachView();\n        }\n    }\n\n    public void init() {\n\n    }\n\n    public void initView(View rootView) {\n    }\n\n    public void initData() {\n\n    }\n\n    public void initListener() {\n\n    }\n\n\n    //用于创建Presenter和判断是否使用MVP模式(由子类实现)\n    protected abstract T createPresenter();\n\n    //得到当前界面的布局文件id(由子类实现)\n    protected abstract int provideContentViewId();\n}\n"
  },
  {
    "path": "app/src/main/java/com/lqm/tomatoit/ui/base/BasePresenter.java",
    "content": "package com.lqm.tomatoit.ui.base;\n\nimport java.lang.ref.Reference;\nimport java.lang.ref.WeakReference;\n\n/**\n * @user  lqm\n * @desc  BasePresenter\n */\n\npublic abstract class BasePresenter<V> {\n\n    protected Reference<V> mViewRef;\n\n\n    public void attachView(V view){\n        mViewRef = new WeakReference<V>(view);\n    }\n\n    protected V getView(){\n        return mViewRef.get();\n    }\n\n    public boolean isViewAttached(){\n        return mViewRef != null&&mViewRef.get()!=null;\n    }\n\n    public void detachView(){\n        if(mViewRef!=null){\n            mViewRef.clear();\n            mViewRef = null;\n        }\n    }\n\n}\n"
  },
  {
    "path": "app/src/main/java/com/lqm/tomatoit/ui/fragment/HomeFragment.java",
    "content": "package com.lqm.tomatoit.ui.fragment;\n\nimport android.support.design.widget.Snackbar;\nimport android.support.v4.widget.SwipeRefreshLayout;\nimport android.support.v7.widget.LinearLayoutManager;\nimport android.support.v7.widget.RecyclerView;\nimport android.view.View;\nimport android.widget.ImageView;\n\nimport com.chad.library.adapter.base.BaseQuickAdapter;\nimport com.lqm.tomatoit.R;\nimport com.lqm.tomatoit.manager.ImageLoaderManager;\nimport com.lqm.tomatoit.model.pojo.ArticleBean;\nimport com.lqm.tomatoit.model.pojo.BannerBean;\nimport com.lqm.tomatoit.ui.activity.WebViewActivity;\nimport com.lqm.tomatoit.ui.adapter.ArticleListAdapter;\nimport com.lqm.tomatoit.ui.base.BaseFragment;\nimport com.lqm.tomatoit.ui.presenter.HomePresenter;\nimport com.lqm.tomatoit.ui.view.HomeView;\n\nimport java.util.List;\n\nimport butterknife.Bind;\nimport cn.bingoogolapple.bgabanner.BGABanner;\n\n/**\n * user：lqm\n * desc：第一个模块，主页Fragment\n */\n\npublic class HomeFragment extends BaseFragment<HomeView, HomePresenter>\n        implements HomeView, SwipeRefreshLayout.OnRefreshListener,\n        BaseQuickAdapter.RequestLoadMoreListener {\n\n    @Bind(R.id.rv_content)\n    RecyclerView rvContent;\n    @Bind(R.id.swipe_refresh)\n    SwipeRefreshLayout swipeRefresh;\n    private ArticleListAdapter mAdapter;\n    private BGABanner mBannerView;\n\n    public static HomeFragment newInstance() {\n        return new HomeFragment();\n    }\n\n    @Override\n    protected HomePresenter createPresenter() {\n        return new HomePresenter();\n    }\n\n    @Override\n    protected int provideContentViewId() {\n        return R.layout.frag_home;\n    }\n\n    @Override\n    public void onRefresh() {\n        mPresenter.getBannerData();\n        mPresenter.getRefreshData();\n    }\n\n    @Override\n    public void onLoadMoreRequested() {\n        mPresenter.getMoreData();\n    }\n\n\n    @Override\n    public void showRefreshView(final Boolean refresh) {\n        swipeRefresh.post(new Runnable() {\n            @Override\n            public void run() {\n                swipeRefresh.setRefreshing(refresh);\n            }\n        });\n    }\n\n\n    @Override\n    public void getBannerDataSuccess(List<BannerBean> bannerData) {\n        //设置轮播图\n        mBannerView.setData(R.layout.item_banner, bannerData, null);\n        mBannerView.setAdapter(new BGABanner.Adapter<View, BannerBean>() {\n            @Override\n            public void fillBannerItem(BGABanner banner, View itemView, BannerBean model, int position) {\n                ImageView imageView = (ImageView) itemView.findViewById(R.id.imageView);\n                ImageLoaderManager.LoadImage(getContext(), model.getImagePath(), imageView);\n            }\n        });\n        mBannerView.setDelegate(new BGABanner.Delegate<View, BannerBean>() {\n            @Override\n            public void onBannerItemClick(BGABanner banner, View itemView, BannerBean model, int position) {\n                WebViewActivity.runActivity(getContext(), model.getUrl());\n\n            }\n        });\n    }\n\n    @Override\n    public void initView(View rootView) {\n\n        rvContent.setLayoutManager(new LinearLayoutManager(getContext()));\n        mAdapter = new ArticleListAdapter(getContext(), null);\n        rvContent.setAdapter(mAdapter);\n        swipeRefresh.setOnRefreshListener(this);\n        mAdapter.setOnLoadMoreListener(this, rvContent);\n\n        //添加头部轮播图布局\n        View headView = View.inflate(getActivity(), R.layout.layout_banner, null);\n        mBannerView = (BGABanner) headView.findViewById(R.id.banner);\n        mAdapter.addHeaderView(headView);\n\n        onRefresh();\n    }\n\n    @Override\n    public void initData() {\n        mPresenter.getBannerData();\n    }\n\n    @Override\n    public void getDataError(String message) {\n        showRefreshView(false);\n        Snackbar.make(rvContent, message, Snackbar.LENGTH_SHORT).show();\n    }\n\n    @Override\n    public void getMoreDataSuccess(List<ArticleBean> data) {\n        if (data.size() != 0) {\n            mAdapter.addData(data);\n            mAdapter.loadMoreComplete();\n        } else {\n            mAdapter.loadMoreEnd();\n        }\n    }\n\n    @Override\n    public void getRefreshDataSuccess(List<ArticleBean> data) {\n        mAdapter.setNewData(data);\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/lqm/tomatoit/ui/fragment/TypeFragment.java",
    "content": "package com.lqm.tomatoit.ui.fragment;\n\nimport android.support.design.widget.Snackbar;\nimport android.support.design.widget.TabLayout;\nimport android.support.v7.widget.LinearLayoutManager;\nimport android.support.v7.widget.RecyclerView;\nimport android.view.View;\n\nimport com.chad.library.adapter.base.BaseQuickAdapter;\nimport com.lqm.tomatoit.R;\nimport com.lqm.tomatoit.model.pojo.ArticleBean;\nimport com.lqm.tomatoit.ui.adapter.ArticleListAdapter;\nimport com.lqm.tomatoit.ui.base.BaseFragment;\nimport com.lqm.tomatoit.ui.presenter.TypePresenter;\nimport com.lqm.tomatoit.ui.view.TypeView;\nimport com.lqm.tomatoit.widget.AutoLinefeedLayout;\nimport com.zhy.autolayout.AutoLinearLayout;\n\nimport java.util.List;\n\nimport butterknife.Bind;\n\n/**\n * user：lqm\n * desc：第二个模块，分类Fragment\n */\n\npublic class TypeFragment extends BaseFragment<TypeView, TypePresenter>\n        implements TypeView, BaseQuickAdapter.RequestLoadMoreListener {\n\n    @Bind(R.id.tabLayout)\n    TabLayout tabLayout;\n    @Bind(R.id.rv_content)\n    RecyclerView rvContent;\n    @Bind(R.id.ll_tag)\n    AutoLinefeedLayout llTag;\n    @Bind(R.id.layout_blank)\n    AutoLinearLayout layoutBlank;\n    private ArticleListAdapter mAdapter;\n\n    public static TypeFragment newInstance() {\n        return new TypeFragment();\n    }\n\n    @Override\n    protected TypePresenter createPresenter() {\n        return new TypePresenter(getActivity());\n    }\n\n    @Override\n    protected int provideContentViewId() {\n        return R.layout.frag_type;\n    }\n\n\n    @Override\n    public void initView(View rootView) {\n\n        rvContent.setLayoutManager(new LinearLayoutManager(getContext()));\n        mAdapter = new ArticleListAdapter(getContext(),null);\n        rvContent.setAdapter(mAdapter);\n        mAdapter.setOnLoadMoreListener(this,rvContent);\n\n        mPresenter.getTagData();\n    }\n\n\n    @Override\n    public void onLoadMoreRequested() {\n        mPresenter.getMoreData();\n    }\n\n    @Override\n    public TabLayout getTabLayout() {\n        return tabLayout;\n    }\n\n    @Override\n    public AutoLinefeedLayout getTagLayout() {\n        return llTag;\n    }\n\n\n    @Override\n    public ArticleListAdapter getAdapter() {\n        return mAdapter;\n    }\n\n    @Override\n    public void getDataError(String message) {\n        Snackbar.make(rvContent, message, Snackbar.LENGTH_SHORT).show();\n    }\n\n    @Override\n    public void getRefreshDataSuccess(List<ArticleBean> data) {\n        mAdapter.setNewData(data);\n    }\n\n    @Override\n    public void getMoreDataSuccess(List<ArticleBean> data) {\n        if (data.size() != 0) {\n            mAdapter.addData(data);\n            mAdapter.loadMoreComplete();\n        } else {\n            mAdapter.loadMoreEnd();\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/lqm/tomatoit/ui/fragment/UserFragment.java",
    "content": "package com.lqm.tomatoit.ui.fragment;\n\nimport android.content.Intent;\nimport android.support.v7.widget.CardView;\nimport android.view.View;\nimport android.widget.TextView;\n\nimport com.lqm.tomatoit.R;\nimport com.lqm.tomatoit.app.AppConst;\nimport com.lqm.tomatoit.ui.activity.AboutActivity;\nimport com.lqm.tomatoit.ui.activity.CollectActivity;\nimport com.lqm.tomatoit.ui.activity.LoginActivity;\nimport com.lqm.tomatoit.ui.base.BaseFragment;\nimport com.lqm.tomatoit.ui.base.BasePresenter;\nimport com.lqm.tomatoit.util.PrefUtils;\nimport com.lqm.tomatoit.util.T;\n\nimport butterknife.Bind;\nimport butterknife.OnClick;\n\n/**\n * user：lqm\n * desc：第三个模块，用户模块\n */\n\npublic class UserFragment extends BaseFragment{\n\n    @Bind(R.id.tv_name)\n    TextView tvName;\n    @Bind(R.id.cv_collect)\n    CardView cvCollect;\n    @Bind(R.id.cv_about)\n    CardView cvAbout;\n    @Bind(R.id.cv_logou)\n    CardView cvLogou;\n    @Bind(R.id.tv_logou)\n    TextView tvLogou;\n\n\n    public static UserFragment newInstance() {\n        return new UserFragment();\n    }\n\n    @Override\n    protected BasePresenter createPresenter() {\n        return null;\n    }\n\n    @Override\n    protected int provideContentViewId() {\n        return R.layout.frag_user;\n    }\n\n    @Override\n    public void initView(View rootView) {\n\n        if (PrefUtils.getBoolean(getContext(), AppConst.IS_LOGIN_KEY,false) == false){\n            tvLogou.setText(\"点击登录\");\n            tvName.setText(\"暂未登录\");\n        }else{\n            tvName.setText(PrefUtils.getString(getContext(),AppConst.USERNAME_KEY,\"暂未登录\"));\n            tvLogou.setText(\"退出登录\");\n        }\n    }\n\n    @OnClick({R.id.cv_collect, R.id.cv_about, R.id.cv_logou})\n    public void onViewClicked(View view) {\n        switch (view.getId()) {\n            case R.id.cv_collect:\n                if (PrefUtils.getBoolean(getContext(),AppConst.IS_LOGIN_KEY,false) == false){\n                    T.showShort(getContext(),\"请先登录\");\n                }else{\n                    startActivity(new Intent(getActivity(),CollectActivity.class));\n                }\n                break;\n            case R.id.cv_about:\n                startActivity(new Intent(getActivity(),AboutActivity.class));\n                break;\n            case R.id.cv_logou:\n                if (PrefUtils.getBoolean(getContext(),AppConst.IS_LOGIN_KEY,false) == false){\n                    startActivity(new Intent(getActivity(),LoginActivity.class));\n                }else{\n                    //注销\n                    PrefUtils.setBoolean(getContext(),AppConst.IS_LOGIN_KEY,false);\n                    T.showShort(getContext(),\"已注销\");\n                    tvLogou.setText(\"点击登录\");\n                    tvName.setText(\"暂未登录\");\n                }\n                break;\n        }\n    }\n\n\n}\n"
  },
  {
    "path": "app/src/main/java/com/lqm/tomatoit/ui/presenter/CollectPresenter.java",
    "content": "package com.lqm.tomatoit.ui.presenter;\n\nimport com.lqm.tomatoit.api.WanService;\nimport com.lqm.tomatoit.helper.rxjavahelper.RxObserver;\nimport com.lqm.tomatoit.helper.rxjavahelper.RxResultHelper;\nimport com.lqm.tomatoit.helper.rxjavahelper.RxSchedulersHelper;\nimport com.lqm.tomatoit.model.pojoVO.ArticleListVO;\nimport com.lqm.tomatoit.ui.base.BasePresenter;\nimport com.lqm.tomatoit.ui.view.CollectView;\n\n/**\n * user：lqm\n * desc：我的收藏\n */\n\npublic class CollectPresenter extends BasePresenter<CollectView> {\n\n    private int mCurrentPage;\n\n    //刷新获取数据\n    public void getRefreshData() {\n        mCurrentPage = 0;\n        WanService.getCollectData(mCurrentPage)\n                .compose(RxSchedulersHelper.io_main())\n                .compose(RxResultHelper.handleResult())\n                .subscribe(new RxObserver<ArticleListVO>() {\n                    @Override\n                    public void _onNext(ArticleListVO articleListVO) {\n                        getView().onRefreshSuccess(articleListVO.getDatas());\n                    }\n\n                    @Override\n                    public void _onError(String errorMessage) {\n                        getView().onRefreshFail(errorMessage);\n                    }\n\n                    @Override\n                    public void _onComplete() {\n                        getView().loadComplete();\n                    }\n                });\n\n    }\n\n    //获取更多数据\n    public void getMoreData() {\n        mCurrentPage += 1;\n        WanService.getCollectData(mCurrentPage)\n                .compose(RxSchedulersHelper.io_main())\n                .compose(RxResultHelper.handleResult())\n                .subscribe(new RxObserver<ArticleListVO>() {\n                    @Override\n                    public void _onNext(ArticleListVO articleListVO) {\n                        getView().onLoadMoreSuccess(articleListVO.getDatas());\n                    }\n\n                    @Override\n                    public void _onError(String errorMessage) {\n                        getView().onLoadMoreFail(errorMessage);\n                    }\n                });\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/lqm/tomatoit/ui/presenter/HomePresenter.java",
    "content": "package com.lqm.tomatoit.ui.presenter;\n\nimport com.lqm.tomatoit.api.WanService;\nimport com.lqm.tomatoit.helper.rxjavahelper.RxObserver;\nimport com.lqm.tomatoit.helper.rxjavahelper.RxResultHelper;\nimport com.lqm.tomatoit.helper.rxjavahelper.RxSchedulersHelper;\nimport com.lqm.tomatoit.model.pojo.BannerBean;\nimport com.lqm.tomatoit.model.pojoVO.ArticleListVO;\nimport com.lqm.tomatoit.ui.base.BasePresenter;\nimport com.lqm.tomatoit.ui.view.HomeView;\n\nimport java.util.List;\n\nimport io.reactivex.disposables.Disposable;\n\n/**\n * user：lqm\n * desc：首页\n */\n\npublic class HomePresenter extends BasePresenter<HomeView> {\n\n    private int mCurrentPage;\n\n    //刷新\n    public void getRefreshData() {\n        mCurrentPage = 0;\n        WanService.getHomeData(mCurrentPage)\n                .compose(RxSchedulersHelper.io_main())\n                .compose(RxResultHelper.handleResult())\n                .subscribe(new RxObserver<ArticleListVO>() {\n                    @Override\n                    public void _onSubscribe(Disposable d) {\n                        getView().showRefreshView(true);\n                    }\n\n                    @Override\n                    public void _onNext(ArticleListVO articleListVO) {\n                        getView().getRefreshDataSuccess(articleListVO.getDatas());\n                    }\n\n                    @Override\n                    public void _onError(String message) {\n                        getView().getDataError(message);\n                    }\n\n                    @Override\n                    public void _onComplete() {\n                        getView().showRefreshView(false);\n                    }\n                });\n    }\n\n    //加载更多\n    public void getMoreData() {\n        mCurrentPage = mCurrentPage + 1;\n        WanService.getHomeData(mCurrentPage)\n                .compose(RxSchedulersHelper.io_main())\n                .compose(RxResultHelper.handleResult())\n                .subscribe(new RxObserver<ArticleListVO>() {\n                    @Override\n                    public void _onNext(ArticleListVO articleListVO) {\n                        getView().getMoreDataSuccess(articleListVO.getDatas());\n                    }\n\n                    @Override\n                    public void _onError(String errorMessage) {\n                        getView().getDataError(errorMessage);\n                    }\n                });\n    }\n\n    //获取轮播图数据\n    public void getBannerData() {\n\n        WanService.getBannerData()\n                .compose(RxSchedulersHelper.io_main())\n                .compose(RxResultHelper.handleResult())\n                .subscribe(new RxObserver<List<BannerBean>>() {\n                    @Override\n                    public void _onNext(List<BannerBean> bannerBeans) {\n                        getView().getBannerDataSuccess(bannerBeans);\n                    }\n\n                    @Override\n                    public void _onError(String errorMessage) {\n                        getView().getDataError(errorMessage);\n                    }\n                });\n    }\n\n}"
  },
  {
    "path": "app/src/main/java/com/lqm/tomatoit/ui/presenter/LoginRegistPresenter.java",
    "content": "package com.lqm.tomatoit.ui.presenter;\n\nimport com.lqm.tomatoit.api.WanService;\nimport com.lqm.tomatoit.helper.rxjavahelper.RxObserver;\nimport com.lqm.tomatoit.helper.rxjavahelper.RxResultHelper;\nimport com.lqm.tomatoit.helper.rxjavahelper.RxSchedulersHelper;\nimport com.lqm.tomatoit.model.pojo.UserBean;\nimport com.lqm.tomatoit.ui.base.BasePresenter;\nimport com.lqm.tomatoit.ui.view.LoginRegistView;\n\nimport io.reactivex.disposables.Disposable;\n\n/**\n * user：lqm\n * desc：登录注册\n */\n\npublic class LoginRegistPresenter extends BasePresenter<LoginRegistView> {\n\n    //登录\n    public void toLogin(String username, String password) {\n\n        WanService.login(username, password)\n                .compose(RxSchedulersHelper.io_main())\n                .compose(RxResultHelper.handleResult())\n                .subscribe(new RxObserver<UserBean>() {\n\n                    @Override\n                    public void _onSubscribe(Disposable d) {\n                        getView().showProgress(\"正在登陆...\");\n                    }\n\n                    @Override\n                    public void _onNext(UserBean userBean) {\n                        getView().loginSuccess(userBean);\n                    }\n\n                    @Override\n                    public void _onError(String errorMessage) {\n                        getView().loginFail();\n\n                    }\n\n                    @Override\n                    public void _onComplete() {\n                        getView().hideProgress();\n                    }\n\n                });\n    }\n\n    //注册\n    public void toRegist(String username, String password) {\n        WanService.regist(username, password)\n            .compose(RxSchedulersHelper.io_main())\n            .compose(RxResultHelper.handleResult())\n            .subscribe(new RxObserver<UserBean>() {\n                @Override\n                public void _onSubscribe(Disposable d) {\n                    getView().showProgress(\"正在注册...\");\n                }\n\n                @Override\n                public void _onNext(UserBean userBean) {\n                    getView().registerSuccess(userBean);\n                }\n\n                @Override\n                public void _onError(String errorMessage) {\n                    getView().registerFail();\n                }\n\n                @Override\n                public void _onComplete() {\n                    getView().hideProgress();\n                }\n            });\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/lqm/tomatoit/ui/presenter/SearchPresenter.java",
    "content": "package com.lqm.tomatoit.ui.presenter;\n\nimport com.lqm.tomatoit.api.WanService;\nimport com.lqm.tomatoit.helper.rxjavahelper.RxObserver;\nimport com.lqm.tomatoit.helper.rxjavahelper.RxResultHelper;\nimport com.lqm.tomatoit.helper.rxjavahelper.RxSchedulersHelper;\nimport com.lqm.tomatoit.model.pojo.HotKeyBean;\nimport com.lqm.tomatoit.model.pojoVO.ArticleListVO;\nimport com.lqm.tomatoit.ui.base.BasePresenter;\nimport com.lqm.tomatoit.ui.view.SearchView;\n\nimport java.util.List;\n\n/**\n * user：lqm\n * desc：搜索\n */\n\npublic class SearchPresenter extends BasePresenter<SearchView> {\n\n\n    private int mCurrentPage;\n\n    //热门搜索\n    public void getHotKeyData() {\n        WanService.getHotKey()\n                .compose(RxSchedulersHelper.io_main())\n                .compose(RxResultHelper.handleResult())\n                .subscribe(new RxObserver<List<HotKeyBean>>() {\n                    @Override\n                    public void _onNext(List<HotKeyBean> hotKeyBeans) {\n                        getView().getHotKeySuccess(hotKeyBeans);\n                    }\n\n                    @Override\n                    public void _onError(String errorMessage) {\n                        getView().getHotKeyFail(errorMessage);\n                    }\n                });\n    }\n\n    //搜索\n    public void searchData(String key) {\n        mCurrentPage = 0;\n        WanService.searchArticle(mCurrentPage, key)\n                .compose(RxSchedulersHelper.io_main())\n                .compose(RxResultHelper.handleResult())\n                .subscribe(new RxObserver<ArticleListVO>() {\n                    @Override\n                    public void _onNext(ArticleListVO articleListVO) {\n                        getView().searchDataSuccess(articleListVO.getDatas());\n                    }\n\n                    @Override\n                    public void _onError(String errorMessage) {\n                        getView().searchDataFail(errorMessage);\n                    }\n                });\n    }\n\n    //加载更多\n    public void getMoreData(String key) {\n        mCurrentPage += 1;\n        WanService.searchArticle(mCurrentPage, key)\n            .compose(RxSchedulersHelper.io_main())\n            .compose(RxResultHelper.handleResult())\n            .subscribe(new RxObserver<ArticleListVO>() {\n                @Override\n                public void _onNext(ArticleListVO articleListVO) {\n                    getView().loadMoreDataSuccess(articleListVO.getDatas());\n                }\n\n                @Override\n                public void _onError(String errorMessage) {\n                    getView().loadMoreDataFail(errorMessage);\n                }\n            });\n    }\n\n}\n"
  },
  {
    "path": "app/src/main/java/com/lqm/tomatoit/ui/presenter/TypePresenter.java",
    "content": "package com.lqm.tomatoit.ui.presenter;\n\nimport android.support.design.widget.TabLayout;\nimport android.support.v4.app.FragmentActivity;\nimport android.view.View;\nimport android.widget.LinearLayout;\nimport android.widget.TextView;\n\nimport com.lqm.tomatoit.R;\nimport com.lqm.tomatoit.api.WanService;\nimport com.lqm.tomatoit.helper.rxjavahelper.RxObserver;\nimport com.lqm.tomatoit.helper.rxjavahelper.RxResultHelper;\nimport com.lqm.tomatoit.helper.rxjavahelper.RxSchedulersHelper;\nimport com.lqm.tomatoit.model.pojoVO.ArticleListVO;\nimport com.lqm.tomatoit.model.pojoVO.TypeTagVO;\nimport com.lqm.tomatoit.ui.adapter.ArticleListAdapter;\nimport com.lqm.tomatoit.ui.base.BasePresenter;\nimport com.lqm.tomatoit.ui.view.TypeView;\nimport com.lqm.tomatoit.util.UIUtils;\nimport com.lqm.tomatoit.widget.AutoLinefeedLayout;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\n/**\n * user：lqm\n * desc：分类\n */\n\npublic class TypePresenter extends BasePresenter<TypeView> {\n\n    private FragmentActivity mActivity;\n    private TypeView mTypeView;\n    private int mCurrentPage;\n    private List<TypeTagVO> mTagDatas;\n    private ArticleListAdapter mAdapter;\n    private int mId;\n    private int mTabSelect; //标记选中的Tab标签\n    private int mTagSelect; //标记选中的Tag标签，用户设置背景色\n    private List<TextView> tagTvs;\n    private AutoLinefeedLayout llTag;\n\n    public TypePresenter(FragmentActivity activity) {\n        this.mActivity = activity;\n    }\n\n    //分类标签\n    public void getTagData() {\n        mTypeView = getView();\n        WanService.getTypeTagData()\n                .compose(RxSchedulersHelper.io_main())\n                .compose(RxResultHelper.handleResult())\n                .subscribe(new RxObserver<List<TypeTagVO>>() {\n                    @Override\n                    public void _onNext(List<TypeTagVO> typeTagVOS) {\n                        mTagDatas = typeTagVOS;\n                        setTabUI();\n                        mTabSelect = 0;\n                        mTagSelect = 0;\n                        getServerData(mTagDatas.get(0).getChildren().get(0).getId());\n                    }\n\n                    @Override\n                    public void _onError(String errorMessage) {\n\n                    }\n                });\n    }\n\n    //一级Tab\n    private void setTabUI() {\n        TabLayout tabLayout = mTypeView.getTabLayout();\n        tabLayout.setTabMode(TabLayout.MODE_SCROLLABLE);\n        for (TypeTagVO bean : mTagDatas) {\n            tabLayout.addTab(tabLayout.newTab().setText(bean.getName()));\n        }\n\n        tabLayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {\n            @Override\n            public void onTabSelected(TabLayout.Tab tab) {\n                setTagUI(tab.getPosition());\n            }\n\n            @Override\n            public void onTabUnselected(TabLayout.Tab tab) {\n\n            }\n\n            @Override\n            public void onTabReselected(TabLayout.Tab tab) {\n                if (llTag != null && llTag.getVisibility() == View.VISIBLE) {\n                    llTag.setVisibility(View.GONE);\n                } else {\n                    setTagUI(tab.getPosition());\n                }\n            }\n        });\n\n    }\n\n    //二级Tag\n    private void setTagUI(int position) {\n        llTag = mTypeView.getTagLayout();\n        llTag.setVisibility(View.VISIBLE);\n        llTag.removeAllViews();\n        if (tagTvs == null) {\n            tagTvs = new ArrayList<>();\n        } else {\n            tagTvs.clear();\n        }\n        for (int i = 0; i < mTagDatas.get(position).getChildren().size(); i++) {\n            View view = LinearLayout.inflate(mActivity, R.layout.item_tag_layout, null);\n            TextView tvItem = (TextView) view.findViewById(R.id.tv_item);\n            tvItem.setText(mTagDatas.get(position).getChildren().get(i).getName());\n            llTag.addView(view);\n            tagTvs.add(tvItem);\n\n            int finalI = i;\n            view.setOnClickListener(new View.OnClickListener() {\n                @Override\n                public void onClick(View v) {\n                    //点击某个tag按钮\n                    mTabSelect = position;\n                    mTagSelect = finalI;\n                    tvItem.setTextColor(UIUtils.getColor(R.color.white));\n                    tvItem.setBackgroundResource(R.drawable.shape_tag_sel);\n                    mId = mTagDatas.get(position).getChildren().get(finalI).getId();\n                    getServerData(mId);\n                }\n            });\n        }\n\n        //设置选中的tag背景\n        for (int j = 0; j < tagTvs.size(); j++) {\n            if (position == mTabSelect && j == mTagSelect) {\n                tagTvs.get(j).setTextColor(UIUtils.getColor(R.color.white));\n                tagTvs.get(j).setBackgroundResource(R.drawable.shape_tag_sel);\n            } else {\n                tagTvs.get(j).setTextColor(UIUtils.getColor(R.color.text0));\n                tagTvs.get(j).setBackgroundResource(R.drawable.shape_tag_nor);\n            }\n        }\n\n    }\n\n\n    //根据点击的标签获取数据\n    public void getServerData(int cid) {\n        mCurrentPage = 0; //从第0页开始\n        mAdapter = mTypeView.getAdapter();\n        WanService.getTypeDataById(mCurrentPage, cid)\n                .compose(RxSchedulersHelper.io_main())\n                .compose(RxResultHelper.handleResult())\n                .subscribe(new RxObserver<ArticleListVO>() {\n                    @Override\n                    public void _onNext(ArticleListVO articleListVO) {\n                        if (articleListVO.getDatas() != null) {\n                            getView().getRefreshDataSuccess(articleListVO.getDatas());\n                            mTypeView.getTagLayout().setVisibility(View.GONE);\n                        }\n                    }\n\n                    @Override\n                    public void _onError(String errorMessage) {\n                        getView().getDataError(errorMessage);\n                    }\n                });\n    }\n\n    //加载下一页\n    public void getMoreData() {\n        mCurrentPage = mCurrentPage + 1;\n        WanService.getTypeDataById(mCurrentPage, mId)\n                .compose(RxSchedulersHelper.io_main())\n                .compose(RxResultHelper.handleResult())\n                .subscribe(new RxObserver<ArticleListVO>() {\n                    @Override\n                    public void _onNext(ArticleListVO articleListVO) {\n                        getView().getMoreDataSuccess(articleListVO.getDatas());\n                    }\n\n                    @Override\n                    public void _onError(String errorMessage) {\n                        getView().getDataError(errorMessage);\n                    }\n                });\n\n    }\n\n}"
  },
  {
    "path": "app/src/main/java/com/lqm/tomatoit/ui/presenter/WebViewPresenter.java",
    "content": "package com.lqm.tomatoit.ui.presenter;\n\nimport android.graphics.Bitmap;\nimport android.view.View;\nimport android.webkit.WebChromeClient;\nimport android.webkit.WebSettings;\nimport android.webkit.WebView;\nimport android.webkit.WebViewClient;\nimport android.widget.ProgressBar;\n\nimport com.lqm.tomatoit.ui.base.BasePresenter;\nimport com.lqm.tomatoit.ui.view.CommonWebView;\n\n/**\n * user：lqm\n * desc：WebView Presenter\n */\n\npublic class WebViewPresenter extends BasePresenter<CommonWebView> {\n\n    public void setWebView(WebView webView,String url) {\n\n        CommonWebView urlView = getView();\n        ProgressBar progressBar = urlView.getProgressBar();\n\n        WebSettings settings = webView.getSettings();\n        settings.setJavaScriptEnabled(true);// 支持JS\n        settings.setBuiltInZoomControls(true);// 显示放大缩小按钮\n        settings.setUseWideViewPort(true);// 支持双击放大缩小\n        settings.setSupportZoom(true);\n        settings.setJavaScriptCanOpenWindowsAutomatically(true);\n        settings.setLoadWithOverviewMode(true);\n        settings.setUseWideViewPort(true);\n        settings.setDefaultTextEncodingName(\"utf-8\");\n        settings.setLoadsImagesAutomatically(true);\n        settings.setLayoutAlgorithm(WebSettings.LayoutAlgorithm.SINGLE_COLUMN);\n        settings.setAppCacheEnabled(true);\n        settings.setDomStorageEnabled(true);\n\n        webView.setWebViewClient(new WebViewClient() {\n            @Override\n            public void onPageStarted(WebView view, String url, Bitmap favicon) {\n\n                super.onPageStarted(view, url, favicon);\n                System.out.println(\"网页开始加载\");\n                progressBar.setVisibility(View.VISIBLE);\n            }\n\n            @Override\n            public void onPageFinished(WebView view, String url) {\n                super.onPageFinished(view, url);\n                System.out.println(\"网页加载结束\");\n                progressBar.setVisibility(View.GONE);\n            }\n\n            /**\n             * 所有跳转的链接都在此方法中回调\n             */\n            @Override\n            public boolean shouldOverrideUrlLoading(WebView view, String url) {\n                view.loadUrl(url);\n                return super.shouldOverrideUrlLoading(view, url);\n            }\n        });\n\n        webView.setWebChromeClient(new WebChromeClient() {\n            @Override\n            public void onProgressChanged(WebView view, int newProgress) {\n                super.onProgressChanged(view, newProgress);\n                progressBar.setProgress(newProgress);\n            }\n\n            @Override\n            public void onReceivedTitle(WebView view, String title) {\n                urlView.setTitle(title);\n                super.onReceivedTitle(view, title);\n            }\n        });\n\n        webView.loadUrl(url);\n    }\n\n}"
  },
  {
    "path": "app/src/main/java/com/lqm/tomatoit/ui/view/CollectView.java",
    "content": "package com.lqm.tomatoit.ui.view;\n\nimport com.lqm.tomatoit.model.pojo.ArticleBean;\n\nimport java.util.List;\n\n/**\n * user：lqm\n * desc：我的收藏\n */\n\npublic interface CollectView {\n\n    void onRefreshSuccess(List<ArticleBean> data);\n\n    void onRefreshFail(String errorString);\n\n    void onLoadMoreSuccess(List<ArticleBean> data);\n\n    void onLoadMoreFail(String errorString);\n\n    void loadComplete();\n}\n"
  },
  {
    "path": "app/src/main/java/com/lqm/tomatoit/ui/view/CommonWebView.java",
    "content": "package com.lqm.tomatoit.ui.view;\n\nimport android.widget.ProgressBar;\n\n/**\n * user：lqm\n * desc： WebView\n */\n\npublic interface CommonWebView {\n\n    ProgressBar getProgressBar();\n    void setTitle(String title);\n\n}\n"
  },
  {
    "path": "app/src/main/java/com/lqm/tomatoit/ui/view/HomeView.java",
    "content": "package com.lqm.tomatoit.ui.view;\n\nimport com.lqm.tomatoit.model.pojo.ArticleBean;\nimport com.lqm.tomatoit.model.pojo.BannerBean;\n\nimport java.util.List;\n\n/**\n * user：lqm\n * desc：首页\n */\n\npublic interface HomeView {\n\n    void showRefreshView(Boolean refresh);\n    void getBannerDataSuccess(List<BannerBean> data);\n    void getDataError(String message);\n    void getRefreshDataSuccess(List<ArticleBean> data);\n    void getMoreDataSuccess(List<ArticleBean> data);\n\n}\n"
  },
  {
    "path": "app/src/main/java/com/lqm/tomatoit/ui/view/LoginRegistView.java",
    "content": "package com.lqm.tomatoit.ui.view;\n\nimport com.lqm.tomatoit.model.pojo.UserBean;\n\n/**\n * user：lqm\n * desc：登录注册\n */\n\npublic interface LoginRegistView {\n\n\n    void showProgress(String tipString);\n\n    void hideProgress();\n\n    void loginSuccess(UserBean user);\n\n    void registerSuccess(UserBean user);\n\n    void loginFail();\n\n    void registerFail();\n\n}\n"
  },
  {
    "path": "app/src/main/java/com/lqm/tomatoit/ui/view/SearchView.java",
    "content": "package com.lqm.tomatoit.ui.view;\n\nimport com.lqm.tomatoit.model.pojo.ArticleBean;\nimport com.lqm.tomatoit.model.pojo.HotKeyBean;\n\nimport java.util.List;\n\n/**\n * user：lqm\n * desc：搜索\n */\n\npublic interface SearchView {\n    void getHotKeySuccess(List<HotKeyBean> data);\n\n    void getHotKeyFail(String message);\n\n    void searchDataSuccess(List<ArticleBean> data);\n\n    void searchDataFail(String message);\n\n    void loadMoreDataSuccess(List<ArticleBean> data);\n\n    void loadMoreDataFail(String message);\n}\n"
  },
  {
    "path": "app/src/main/java/com/lqm/tomatoit/ui/view/TypeView.java",
    "content": "package com.lqm.tomatoit.ui.view;\n\nimport android.support.design.widget.TabLayout;\n\nimport com.lqm.tomatoit.model.pojo.ArticleBean;\nimport com.lqm.tomatoit.ui.adapter.ArticleListAdapter;\nimport com.lqm.tomatoit.widget.AutoLinefeedLayout;\n\nimport java.util.List;\n\n/**\n * user：lqm\n * desc：分类View\n */\n\npublic interface TypeView {\n\n    TabLayout getTabLayout();\n    AutoLinefeedLayout getTagLayout();\n    ArticleListAdapter getAdapter();\n\n    void getDataError(String message);\n    void getRefreshDataSuccess(List<ArticleBean> data);\n    void getMoreDataSuccess(List<ArticleBean> data);\n\n}\n"
  },
  {
    "path": "app/src/main/java/com/lqm/tomatoit/util/ActivityUtils.java",
    "content": "package com.lqm.tomatoit.util;\n\nimport android.support.annotation.NonNull;\nimport android.support.v4.app.Fragment;\nimport android.support.v4.app.FragmentManager;\nimport android.support.v4.app.FragmentTransaction;\nimport android.util.Log;\n\n/**\n * autour: lqm\n * desc:\n */\npublic class ActivityUtils {\n\n    private static final String TAG = \"ActivityUtils\";\n\n    public static void addFragmentToActivity(@NonNull FragmentManager fragmentManager,\n                                             @NonNull Fragment fragment, int frameId) {\n        addFragmentToActivity(fragmentManager, fragment, frameId, true);\n    }\n\n    public static void addFragmentToActivity(@NonNull FragmentManager fragmentManager,\n                                             @NonNull Fragment fragment, int frameId, boolean addToBackStack) {\n        if (fragment.isAdded()) {\n            Log.w(TAG, \"addFragmentToActivity: fragment is added:\" + fragment.getClass().getName());\n            return;\n        }\n        FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();\n        fragmentTransaction.add(frameId, fragment);\n        if (addToBackStack) {\n            fragmentTransaction.addToBackStack(null);\n        }\n        fragmentTransaction.commit();\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/lqm/tomatoit/util/L.java",
    "content": "package com.lqm.tomatoit.util;\n\nimport android.util.Log;\n\n/**\n * Log统一管理类\n */\npublic class L {\n\n    private L() {\n        /* cannot be instantiated */\n        throw new UnsupportedOperationException(\"cannot be instantiated\");\n    }\n\n    public static boolean isDebug = true;// 是否需要打印bug，可以在application的onCreate函数里面初始化\n    private static final String TAG = \"way\";\n\n    // 下面四个是默认tag的函数  \n    public static void i(String msg) {\n        if (isDebug)\n            Log.i(TAG, msg);\n    }\n\n    public static void d(String msg) {\n        if (isDebug)\n            Log.d(TAG, msg);\n    }\n\n    public static void e(String msg) {\n        if (isDebug)\n            Log.e(TAG, msg);\n    }\n\n    public static void v(String msg) {\n        if (isDebug)\n            Log.v(TAG, msg);\n    }\n\n    // 下面是传入自定义tag的函数  \n    public static void i(String tag, String msg) {\n        if (isDebug)\n            Log.i(tag, msg);\n    }\n\n    public static void d(String tag, String msg) {\n        if (isDebug)\n            Log.d(tag, msg);\n    }\n\n    public static void e(String tag, String msg) {\n        if (isDebug)\n            Log.e(tag, msg);\n    }\n\n    public static void v(String tag, String msg) {\n        if (isDebug)\n            Log.v(tag, msg);\n    }\n}  "
  },
  {
    "path": "app/src/main/java/com/lqm/tomatoit/util/PrefUtils.java",
    "content": "package com.lqm.tomatoit.util;\n\nimport android.content.Context;\nimport android.content.SharedPreferences;\n\n/**\n * autour: lqm\n * desc: SharePreference的封装\n */\n\npublic class PrefUtils {\n\n    public static final String PREF_NAME = \"config\";\n\n    public static boolean getBoolean(Context ctx, String key,\n                                     boolean defaultValue) {\n        SharedPreferences sp = ctx.getSharedPreferences(PREF_NAME,\n                Context.MODE_PRIVATE);\n        return sp.getBoolean(key, defaultValue);\n    }\n\n    public static void setBoolean(Context ctx, String key, boolean value) {\n        SharedPreferences sp = ctx.getSharedPreferences(PREF_NAME,\n                Context.MODE_PRIVATE);\n        sp.edit().putBoolean(key, value).commit();\n    }\n\n    public static String getString(Context ctx, String key, String defaultValue) {\n        SharedPreferences sp = ctx.getSharedPreferences(PREF_NAME,\n                Context.MODE_PRIVATE);\n        return sp.getString(key, defaultValue);\n    }\n\n    public static void setString(Context ctx, String key, String value) {\n        SharedPreferences sp = ctx.getSharedPreferences(PREF_NAME,\n                Context.MODE_PRIVATE);\n        sp.edit().putString(key, value).commit();\n    }\n\n    public static int getInt(Context ctx, String key, int defaultValue) {\n        SharedPreferences sp = ctx.getSharedPreferences(PREF_NAME,\n                Context.MODE_PRIVATE);\n        return sp.getInt(key, defaultValue);\n    }\n\n    public static void setInt(Context ctx, String key, int value) {\n        SharedPreferences sp = ctx.getSharedPreferences(PREF_NAME,\n                Context.MODE_PRIVATE);\n        sp.edit().putInt(key, value).commit();\n    }\n\n    public static void clearData(Context ctx, String key) {\n        SharedPreferences sp = ctx.getSharedPreferences(PREF_NAME, Context.MODE_PRIVATE);\n        sp.edit().remove(key).clear().commit();\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/lqm/tomatoit/util/SharesUtils.java",
    "content": "package com.lqm.tomatoit.util;\n\nimport android.content.Context;\nimport android.content.Intent;\nimport android.net.Uri;\n\nimport com.lqm.tomatoit.R;\n\n\n/**\n * autour: lqm\n * desc: 系统自带的分享\n */\n\npublic class SharesUtils {\n\n    public static void share(Context context, int stringRes) {\n        share(context, context.getString(stringRes));\n    }\n\n\n    public static void shareImage(Context context, Uri uri, String title) {\n        Intent shareIntent = new Intent();\n        shareIntent.setAction(Intent.ACTION_SEND);\n        shareIntent.putExtra(Intent.EXTRA_STREAM, uri);\n        shareIntent.setType(\"image/jpeg\");\n        context.startActivity(Intent.createChooser(shareIntent, title));\n    }\n\n\n    public static void share(Context context, String extraText) {\n        Intent intent = new Intent(Intent.ACTION_SEND);\n        intent.setType(\"text/plain\");\n        intent.putExtra(Intent.EXTRA_SUBJECT, context.getString(R.string.action_share));\n        intent.putExtra(Intent.EXTRA_TEXT, extraText);\n        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);\n        context.startActivity(\n                Intent.createChooser(intent, context.getString(R.string.action_share)));\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/lqm/tomatoit/util/T.java",
    "content": "package com.lqm.tomatoit.util;\n\nimport android.content.Context;\nimport android.widget.Toast;\n\n/**\n * Toast统一管理类\n */\npublic class T {\n\n    private T() {\n        /* cannot be instantiated */\n        throw new UnsupportedOperationException(\"cannot be instantiated\");\n    }\n\n    public static boolean isShow = true;\n\n    /**\n     * 短时间显示Toast\n     *\n     * @param context\n     * @param message\n     */\n    public static void showShort(Context context, CharSequence message) {\n        if (isShow)\n            Toast.makeText(context, message, Toast.LENGTH_SHORT).show();\n    }\n\n    /**\n     * 短时间显示Toast\n     *\n     * @param context\n     * @param message\n     */\n    public static void showShort(Context context, int message) {\n        if (isShow)\n            Toast.makeText(context, message, Toast.LENGTH_SHORT).show();\n    }\n\n    /**\n     * 长时间显示Toast\n     *\n     * @param context\n     * @param message\n     */\n    public static void showLong(Context context, CharSequence message) {\n        if (isShow)\n            Toast.makeText(context, message, Toast.LENGTH_LONG).show();\n    }\n\n    /**\n     * 长时间显示Toast\n     *\n     * @param context\n     * @param message\n     */\n    public static void showLong(Context context, int message) {\n        if (isShow)\n            Toast.makeText(context, message, Toast.LENGTH_LONG).show();\n    }\n\n    /**\n     * 自定义显示Toast时间\n     *\n     * @param context\n     * @param message\n     * @param duration\n     */\n    public static void show(Context context, CharSequence message, int duration) {\n        if (isShow)\n            Toast.makeText(context, message, duration).show();\n    }\n\n    /**\n     * 自定义显示Toast时间\n     *\n     * @param context\n     * @param message\n     * @param duration\n     */\n    public static void show(Context context, int message, int duration) {\n        if (isShow)\n            Toast.makeText(context, message, duration).show();\n    }\n\n} "
  },
  {
    "path": "app/src/main/java/com/lqm/tomatoit/util/UIUtils.java",
    "content": "package com.lqm.tomatoit.util;\n\nimport android.content.Context;\nimport android.content.res.Resources;\n\nimport com.lqm.tomatoit.app.App;\n\n/**\n * @创建者 CSDN_LQR\n * @描述 和ui相关的工具类\n */\npublic class UIUtils {\n\n    /**\n     * 得到上下文\n     *\n     * @return\n     */\n    public static Context getContext() {\n        return App.getmContext();\n    }\n\n    /**\n     * 得到resources对象\n     *\n     * @return\n     */\n    public static Resources getResource() {\n        return getContext().getResources();\n    }\n\n    /**\n     * 得到string.xml中的字符串\n     *\n     * @param resId\n     * @return\n     */\n    public static String getString(int resId) {\n        return getResource().getString(resId);\n    }\n\n    /**\n     * 得到string.xml中的字符串，带点位符\n     *\n     * @return\n     */\n    public static String getString(int id, Object... formatArgs) {\n        return getResource().getString(id, formatArgs);\n    }\n\n    /**\n     * 得到string.xml中和字符串数组\n     *\n     * @param resId\n     * @return\n     */\n    public static String[] getStringArr(int resId) {\n        return getResource().getStringArray(resId);\n    }\n\n    /**\n     * 得到colors.xml中的颜色\n     * @param colorId\n     * @return\n     */\n    public static int getColor(int colorId) {\n        return getResource().getColor(colorId);\n    }\n\n    /**\n     * dip-->px\n     */\n    public static int dp2px(int dip) {\n        // px/dip = density;\n        // density = dpi/160\n        // 320*480 density = 1 1px = 1dp\n        // 1280*720 density = 2 2px = 1dp\n\n        float density = getResource().getDisplayMetrics().density;\n        int px = (int) (dip * density + 0.5f);\n        return px;\n    }\n\n    /**\n     * px-->dip\n     */\n    public static int px2dp(int px) {\n\n        float density = getResource().getDisplayMetrics().density;\n        int dip = (int) (px / density + 0.5f);\n        return dip;\n    }\n\n}\n"
  },
  {
    "path": "app/src/main/java/com/lqm/tomatoit/widget/AutoLinefeedLayout.java",
    "content": "package com.lqm.tomatoit.widget;\n\nimport android.content.Context;\nimport android.util.AttributeSet;\nimport android.view.View;\nimport android.view.ViewGroup;\n\n/**\n * @user  lqm\n * @desc  自动换行布局\n */\npublic class AutoLinefeedLayout extends ViewGroup {\n\n    public AutoLinefeedLayout(Context context, AttributeSet attrs, int defStyle) {\n        super(context, attrs, defStyle);\n    }\n\n    public AutoLinefeedLayout(Context context, AttributeSet attrs) {\n        this(context, attrs, 0);\n    }\n\n    public AutoLinefeedLayout(Context context) {\n        this(context, null);\n    }\n\n    @Override\n    protected void onLayout(boolean changed, int l, int t, int r, int b) {\n        layoutHorizontal();\n    }\n\n    private void layoutHorizontal() {\n        final int count = getChildCount();\n        final int lineWidth = getMeasuredWidth() - getPaddingLeft()\n                - getPaddingRight();\n        int paddingTop = getPaddingTop();\n        int childTop = 0;\n        int childLeft = getPaddingLeft();\n\n        int availableLineWidth = lineWidth;\n        int maxLineHight = 0;\n\n        for (int i = 0; i < count; i++) {\n            final View child = getChildAt(i);\n            if (child == null) {\n                continue;\n            } else if (child.getVisibility() != GONE) {\n                final int childWidth = child.getMeasuredWidth();\n                final int childHeight = child.getMeasuredHeight();\n\n                if (availableLineWidth < childWidth) {\n                    availableLineWidth = lineWidth;\n                    paddingTop = paddingTop + maxLineHight;\n                    childLeft = getPaddingLeft();\n                    maxLineHight = 0;\n                }\n                childTop = paddingTop;\n                setChildFrame(child, childLeft, childTop, childWidth,\n                        childHeight);\n                childLeft += childWidth;\n                availableLineWidth = availableLineWidth - childWidth;\n                maxLineHight = Math.max(maxLineHight, childHeight);\n            }\n        }\n    }\n\n    private void setChildFrame(View child, int left, int top, int width,\n                               int height) {\n        child.layout(left, top, left + width, top + height);\n    }\n\n    @Override\n    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {\n        final int heightMode = MeasureSpec.getMode(heightMeasureSpec);\n        int count = getChildCount();\n        for (int i = 0; i < count; i++) {\n            measureChild(getChildAt(i), widthMeasureSpec, heightMeasureSpec);\n        }\n        if (heightMode == MeasureSpec.AT_MOST||heightMode == MeasureSpec.UNSPECIFIED) {\n            final int width = MeasureSpec.getSize(widthMeasureSpec);\n            super.onMeasure(widthMeasureSpec, MeasureSpec.makeMeasureSpec(\n                    getDesiredHeight(width), MeasureSpec.EXACTLY));\n        } else {\n            super.onMeasure(widthMeasureSpec, heightMeasureSpec);\n        }\n    }\n\n    private int getDesiredHeight(int width) {\n        final int lineWidth = width - getPaddingLeft() - getPaddingRight();\n        int availableLineWidth = lineWidth;\n        int totalHeight = getPaddingTop() + getPaddingBottom();\n        int lineHeight = 0;\n        for (int i = 0; i < getChildCount(); i++) {\n            View child = getChildAt(i);\n            final int childWidth = child.getMeasuredWidth();\n            final int childHeight = child.getMeasuredHeight();\n            if (availableLineWidth < childWidth) {\n                availableLineWidth = lineWidth;\n                totalHeight = totalHeight + lineHeight;\n                lineHeight = 0;\n            }\n            availableLineWidth = availableLineWidth - childWidth;\n            lineHeight = Math.max(childHeight, lineHeight);\n        }\n        totalHeight = totalHeight + lineHeight;\n        return totalHeight;\n    }\n\n}\n"
  },
  {
    "path": "app/src/main/java/com/lqm/tomatoit/widget/CustomDialog.java",
    "content": "package com.lqm.tomatoit.widget;\n\nimport android.app.Dialog;\nimport android.content.Context;\nimport android.content.res.Resources;\nimport android.util.DisplayMetrics;\nimport android.view.Gravity;\nimport android.view.View;\nimport android.view.Window;\nimport android.view.WindowManager;\n\n/**\n * autour: lqm\n * desc: 自定义圆角的dialog\n */\npublic class CustomDialog extends Dialog {\n\n\n    /**\n     * 宽高由布局文件中指定（但是最底层的宽度无效，可以多嵌套一层解决）\n     */\n    public CustomDialog(Context context, View layout, int style) {\n\n        super(context, style);\n\n        setContentView(layout);\n\n        Window window = getWindow();\n\n        WindowManager.LayoutParams params = window.getAttributes();\n\n        params.gravity = Gravity.CENTER;\n\n        window.setAttributes(params);\n\n    }\n\n    /**\n     * 宽高由该方法的参数设置\n     */\n    public CustomDialog(Context context, int width, int height, View layout,\n                        int style) {\n        super(context, style);\n        // 设置内容\n        setContentView(layout);\n        // 设置窗口属性\n        Window window = getWindow();\n        WindowManager.LayoutParams params = window.getAttributes();\n        // 设置宽度、高度、密度、对齐方式\n        float density = getDensity(context);\n        params.width = (int) (width * density);\n        params.height = (int) (height * density);\n        params.gravity = Gravity.CENTER;\n        window.setAttributes(params);\n\n    }\n\n    /**\n     * 获取显示密度\n     *\n     * @param context\n     * @return\n     */\n    public float getDensity(Context context) {\n        Resources res = context.getResources();\n        DisplayMetrics dm = res.getDisplayMetrics();\n        return dm.density;\n    }\n\n}"
  },
  {
    "path": "app/src/main/java/com/lqm/tomatoit/widget/CustomPopWindow.java",
    "content": "package com.lqm.tomatoit.widget;\n\nimport android.app.Activity;\nimport android.content.Context;\nimport android.graphics.Color;\nimport android.graphics.drawable.ColorDrawable;\nimport android.os.Build;\nimport android.support.annotation.RequiresApi;\nimport android.util.Log;\nimport android.view.KeyEvent;\nimport android.view.LayoutInflater;\nimport android.view.MotionEvent;\nimport android.view.View;\nimport android.view.ViewGroup;\nimport android.view.Window;\nimport android.view.WindowManager;\nimport android.widget.PopupWindow;\n\n/**\n * user：lqm\n * desc：自定义PopWindow类，封装了PopWindow的一些常用属性，用Builder模式支持链式调用\n * src：https://github.com/pinguo-zhouwei/CustomPopwindow\n */\n\npublic class CustomPopWindow implements PopupWindow.OnDismissListener{\n    private static final String TAG = \"CustomPopWindow\";\n    private static final float DEFAULT_ALPHA = 0.7f;\n    private Context mContext;\n    private int mWidth;\n    private int mHeight;\n    private boolean mIsFocusable = true;\n    private boolean mIsOutside = true;\n    private int mResLayoutId = -1;\n    private View mContentView;\n    private PopupWindow mPopupWindow;\n    private int mAnimationStyle = -1;\n\n    private boolean mClippEnable = true;//default is true\n    private boolean mIgnoreCheekPress = false;\n    private int mInputMode = -1;\n    private PopupWindow.OnDismissListener mOnDismissListener;\n    private int mSoftInputMode = -1;\n    private boolean mTouchable = true;//default is ture\n    private View.OnTouchListener mOnTouchListener;\n\n    private Window mWindow;//当前Activity 的窗口\n    /**\n     * 弹出PopWindow 背景是否变暗，默认不会变暗。\n     */\n    private boolean mIsBackgroundDark = false;\n\n    private float mBackgroundDrakValue = 0;// 背景变暗的值，0 - 1\n    /**\n     * 设置是否允许点击 PopupWindow之外的地方，关闭PopupWindow\n     */\n    private boolean enableOutsideTouchDisMiss = true;// 默认点击pop之外的地方可以关闭\n\n    private CustomPopWindow(Context context){\n        mContext = context;\n    }\n\n    public int getWidth() {\n        return mWidth;\n    }\n\n    public int getHeight() {\n        return mHeight;\n    }\n\n    /**\n     *\n     * @param anchor\n     * @param xOff\n     * @param yOff\n     * @return\n     */\n    public CustomPopWindow showAsDropDown(View anchor, int xOff, int yOff){\n        if(mPopupWindow!=null){\n            mPopupWindow.showAsDropDown(anchor,xOff,yOff);\n        }\n        return this;\n    }\n\n    public CustomPopWindow showAsDropDown(View anchor){\n        if(mPopupWindow!=null){\n            mPopupWindow.showAsDropDown(anchor);\n        }\n        return this;\n    }\n\n    @RequiresApi(api = Build.VERSION_CODES.KITKAT)\n    public CustomPopWindow showAsDropDown(View anchor, int xOff, int yOff, int gravity){\n        if(mPopupWindow!=null){\n            mPopupWindow.showAsDropDown(anchor,xOff,yOff,gravity);\n        }\n        return this;\n    }\n\n\n    /**\n     * 相对于父控件的位置（通过设置Gravity.CENTER，下方Gravity.BOTTOM等 ），可以设置具体位置坐标\n     * @param parent 父控件\n     * @param gravity\n     * @param x the popup's x location offset\n     * @param y the popup's y location offset\n     * @return\n     */\n    public CustomPopWindow showAtLocation(View parent, int gravity, int x, int y){\n        if(mPopupWindow!=null){\n            mPopupWindow.showAtLocation(parent,gravity,x,y);\n        }\n        return this;\n    }\n\n    /**\n     * 添加一些属性设置\n     * @param popupWindow\n     */\n    private void apply(PopupWindow popupWindow){\n        popupWindow.setClippingEnabled(mClippEnable);\n        if(mIgnoreCheekPress){\n            popupWindow.setIgnoreCheekPress();\n        }\n        if(mInputMode!=-1){\n            popupWindow.setInputMethodMode(mInputMode);\n        }\n        if(mSoftInputMode!=-1){\n            popupWindow.setSoftInputMode(mSoftInputMode);\n        }\n        if(mOnDismissListener!=null){\n            popupWindow.setOnDismissListener(mOnDismissListener);\n        }\n        if(mOnTouchListener!=null){\n            popupWindow.setTouchInterceptor(mOnTouchListener);\n        }\n        popupWindow.setTouchable(mTouchable);\n\n\n\n    }\n\n    private PopupWindow build(){\n\n        if(mContentView == null){\n            mContentView = LayoutInflater.from(mContext).inflate(mResLayoutId,null);\n        }\n\n        // 2017.3.17 add\n        // 获取当前Activity的window\n        Activity activity = (Activity) mContentView.getContext();\n        if(activity!=null && mIsBackgroundDark){\n            //如果设置的值在0 - 1的范围内，则用设置的值，否则用默认值\n            final  float alpha = (mBackgroundDrakValue > 0 && mBackgroundDrakValue < 1) ? mBackgroundDrakValue : DEFAULT_ALPHA;\n            mWindow = activity.getWindow();\n            WindowManager.LayoutParams params = mWindow.getAttributes();\n            params.alpha = alpha;\n            mWindow.addFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND);\n            mWindow.setAttributes(params);\n        }\n\n\n        if(mWidth != 0 && mHeight!=0 ){\n            mPopupWindow = new PopupWindow(mContentView,mWidth,mHeight);\n        }else{\n            mPopupWindow = new PopupWindow(mContentView, ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);\n        }\n        if(mAnimationStyle!=-1){\n            mPopupWindow.setAnimationStyle(mAnimationStyle);\n        }\n\n        apply(mPopupWindow);//设置一些属性\n\n        if(mWidth == 0 || mHeight == 0){\n            mPopupWindow.getContentView().measure(View.MeasureSpec.UNSPECIFIED, View.MeasureSpec.UNSPECIFIED);\n            //如果外面没有设置宽高的情况下，计算宽高并赋值\n            mWidth = mPopupWindow.getContentView().getMeasuredWidth();\n            mHeight = mPopupWindow.getContentView().getMeasuredHeight();\n        }\n\n        // 添加dissmiss 监听\n        mPopupWindow.setOnDismissListener(this);\n\n        //2017.6.27 add:fix 设置  setOutsideTouchable（false）点击外部取消的bug.\n        // 判断是否点击PopupWindow之外的地方关闭 popWindow\n        if(!enableOutsideTouchDisMiss){\n            //注意这三个属性必须同时设置，不然不能disMiss，以下三行代码在Android 4.4 上是可以，然后在Android 6.0以上，下面的三行代码就不起作用了，就得用下面的方法\n            mPopupWindow.setFocusable(true);\n            mPopupWindow.setOutsideTouchable(false);\n            mPopupWindow.setBackgroundDrawable(null);\n            //注意下面这三个是contentView 不是PopupWindow\n            mPopupWindow.getContentView().setFocusable(true);\n            mPopupWindow.getContentView().setFocusableInTouchMode(true);\n            mPopupWindow.getContentView().setOnKeyListener(new View.OnKeyListener() {\n                @Override\n                public boolean onKey(View v, int keyCode, KeyEvent event) {\n                    if (keyCode == KeyEvent.KEYCODE_BACK) {\n                        mPopupWindow.dismiss();\n\n                        return true;\n                    }\n                    return false;\n                }\n            });\n            //在Android 6.0以上 ，只能通过拦截事件来解决\n            mPopupWindow.setTouchInterceptor(new View.OnTouchListener() {\n                @Override\n                public boolean onTouch(View v, MotionEvent event) {\n\n                    final int x = (int) event.getX();\n                    final int y = (int) event.getY();\n\n                    if ((event.getAction() == MotionEvent.ACTION_DOWN)\n                            && ((x < 0) || (x >= mWidth) || (y < 0) || (y >= mHeight))) {\n                        Log.e(TAG,\"out side \");\n                        Log.e(TAG,\"width:\"+mPopupWindow.getWidth()+\"height:\"+mPopupWindow.getHeight()+\" x:\"+x+\" y  :\"+y);\n                        return true;\n                    } else if (event.getAction() == MotionEvent.ACTION_OUTSIDE) {\n                        Log.e(TAG,\"out side ...\");\n                        return true;\n                    }\n                    return false;\n                }\n            });\n        }else{\n            mPopupWindow.setFocusable(mIsFocusable);\n            mPopupWindow.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));\n            mPopupWindow.setOutsideTouchable(mIsOutside);\n        }\n        // update\n        mPopupWindow.update();\n\n        return mPopupWindow;\n    }\n\n    @Override\n    public void onDismiss() {\n        dissmiss();\n    }\n\n    /**\n     * 关闭popWindow\n     */\n    public void dissmiss(){\n\n        if(mOnDismissListener!=null){\n            mOnDismissListener.onDismiss();\n        }\n\n        //如果设置了背景变暗，那么在dissmiss的时候需要还原\n        if(mWindow!=null){\n            WindowManager.LayoutParams params = mWindow.getAttributes();\n            params.alpha = 1.0f;\n            mWindow.setAttributes(params);\n        }\n        if(mPopupWindow!=null && mPopupWindow.isShowing()){\n            mPopupWindow.dismiss();\n        }\n    }\n\n    public PopupWindow getPopupWindow() {\n        return mPopupWindow;\n    }\n\n    public static class PopupWindowBuilder{\n        private CustomPopWindow mCustomPopWindow;\n\n        public PopupWindowBuilder(Context context){\n            mCustomPopWindow = new CustomPopWindow(context);\n        }\n        public PopupWindowBuilder size(int width,int height){\n            mCustomPopWindow.mWidth = width;\n            mCustomPopWindow.mHeight = height;\n            return this;\n        }\n\n\n        public PopupWindowBuilder setFocusable(boolean focusable){\n            mCustomPopWindow.mIsFocusable = focusable;\n            return this;\n        }\n\n\n\n        public PopupWindowBuilder setView(int resLayoutId){\n            mCustomPopWindow.mResLayoutId = resLayoutId;\n            mCustomPopWindow.mContentView = null;\n            return this;\n        }\n\n        public PopupWindowBuilder setView(View view){\n            mCustomPopWindow.mContentView = view;\n            mCustomPopWindow.mResLayoutId = -1;\n            return this;\n        }\n\n        public PopupWindowBuilder setOutsideTouchable(boolean outsideTouchable){\n            mCustomPopWindow.mIsOutside = outsideTouchable;\n            return this;\n        }\n\n        /**\n         * 设置弹窗动画\n         * @param animationStyle\n         * @return\n         */\n        public PopupWindowBuilder setAnimationStyle(int animationStyle){\n            mCustomPopWindow.mAnimationStyle = animationStyle;\n            return this;\n        }\n\n\n        public PopupWindowBuilder setClippingEnable(boolean enable){\n            mCustomPopWindow.mClippEnable =enable;\n            return this;\n        }\n\n\n        public PopupWindowBuilder setIgnoreCheekPress(boolean ignoreCheekPress){\n            mCustomPopWindow.mIgnoreCheekPress = ignoreCheekPress;\n            return this;\n        }\n\n        public PopupWindowBuilder setInputMethodMode(int mode){\n            mCustomPopWindow.mInputMode = mode;\n            return this;\n        }\n\n        public PopupWindowBuilder setOnDissmissListener(PopupWindow.OnDismissListener onDissmissListener){\n            mCustomPopWindow.mOnDismissListener = onDissmissListener;\n            return this;\n        }\n\n\n        public PopupWindowBuilder setSoftInputMode(int softInputMode){\n            mCustomPopWindow.mSoftInputMode = softInputMode;\n            return this;\n        }\n\n\n        public PopupWindowBuilder setTouchable(boolean touchable){\n            mCustomPopWindow.mTouchable = touchable;\n            return this;\n        }\n\n        public PopupWindowBuilder setTouchIntercepter(View.OnTouchListener touchIntercepter){\n            mCustomPopWindow.mOnTouchListener = touchIntercepter;\n            return this;\n        }\n\n        /**\n         * 设置背景变暗是否可用\n         * @param isDark\n         * @return\n         */\n        public PopupWindowBuilder enableBackgroundDark(boolean isDark){\n            mCustomPopWindow.mIsBackgroundDark = isDark;\n            return this;\n        }\n\n        /**\n         * 设置背景变暗的值\n         * @param darkValue\n         * @return\n         */\n        public PopupWindowBuilder setBgDarkAlpha(float darkValue){\n            mCustomPopWindow.mBackgroundDrakValue = darkValue;\n            return this;\n        }\n\n        /**\n         * 设置是否允许点击 PopupWindow之外的地方，关闭PopupWindow\n         * @param disMiss\n         * @return\n         */\n        public PopupWindowBuilder enableOutsideTouchableDissmiss(boolean disMiss){\n            mCustomPopWindow.enableOutsideTouchDisMiss = disMiss;\n            return this;\n        }\n\n\n        public CustomPopWindow create(){\n            //构建PopWindow\n            mCustomPopWindow.build();\n            return mCustomPopWindow;\n        }\n\n    }\n\n}\n"
  },
  {
    "path": "app/src/main/java/com/lqm/tomatoit/widget/DynamicWave.java",
    "content": "package com.lqm.tomatoit.widget;\n\nimport android.annotation.TargetApi;\nimport android.content.Context;\nimport android.graphics.Canvas;\nimport android.graphics.DrawFilter;\nimport android.graphics.Paint;\nimport android.graphics.PaintFlagsDrawFilter;\nimport android.os.Build;\nimport android.util.AttributeSet;\nimport android.view.View;\n\nimport com.lqm.tomatoit.R;\nimport com.lqm.tomatoit.util.UIUtils;\n\nimport java.util.concurrent.Executors;\nimport java.util.concurrent.ScheduledExecutorService;\nimport java.util.concurrent.TimeUnit;\n\n\n/**\n * autour: lqm\n * desc: 水波纹效果View\n * y = Asin(wx+b)+h：\n * A:振幅两个山峰最大的高度.如果A越大两个山峰越高和越低\n * h:你正弦曲线和y轴相交点.(影响正弦图初始高度的位置)\n * b:初相会让你图片向x轴平移\n * src: http://blog.csdn.net/qfanmingyiq/article/details/53038262\n * <p>\n * 修改者： Notzuonotdied\n */\npublic class DynamicWave extends View {\n    /**\n     * 第一条水波移动速度\n     */\n    private static final int TRANSLATE_X_SPEED_ONE = 7;\n    /**\n     * 第二条水波移动速度\n     */\n    private static final int TRANSLATE_X_SPEED_TWO = 5;\n    /**\n     * 第三条水波移动速度s\n     */\n    private static final int TRANSLATE_X_SPEED_THREE = 3;\n\n    private int mTotalWidth, mTotalHeight;\n\n    private ScheduledExecutorService executorService; //用于延迟绘制\n\n    /**\n     * 原始波纹的y值\n     */\n    private float[] mYPositions;\n    /**\n     * 第一个波纹移动速度的像素值\n     */\n    private int mXOffsetSpeedOne;\n    private int mXOffsetSpeedTwo;\n    private int mXOffsetSpeedThree;\n    /**\n     * 第一个波纹当前移动的距离\n     */\n    private int mXOneOffset;\n    private int mXTwoOffset;\n    private int mXThreeOffset;\n\n\n    private Paint mWavePaint;\n    private DrawFilter mDrawFilter;\n\n    public DynamicWave(Context context, AttributeSet attrs) {\n        super(context, attrs);\n        // 将dp转化为px，用于控制不同分辨率上移动速度基本一致\n        mXOffsetSpeedOne = UIUtils.dp2px(TRANSLATE_X_SPEED_ONE);\n        mXOffsetSpeedTwo = UIUtils.dp2px(TRANSLATE_X_SPEED_TWO);\n        mXOffsetSpeedThree = UIUtils.dp2px(TRANSLATE_X_SPEED_THREE);\n\n        // 初始绘制波纹的画笔\n        mWavePaint = new Paint();\n        // 去除画笔锯齿\n        mWavePaint.setAntiAlias(true);\n        // 设置风格为实线\n        mWavePaint.setStyle(Paint.Style.FILL);\n        // 设置画笔颜色\n        mWavePaint.setColor(getResources().getColor(R.color.white));\n        mDrawFilter = new PaintFlagsDrawFilter(0, Paint.ANTI_ALIAS_FLAG | Paint.FILTER_BITMAP_FLAG);\n\n        //\n         executorService = Executors\n                .newScheduledThreadPool(Runtime.getRuntime().availableProcessors());\n    }\n\n    @Override\n    protected void onDraw(Canvas canvas) {\n        super.onDraw(canvas);\n        // 从canvas层面去除绘制时锯齿\n        canvas.setDrawFilter(mDrawFilter);\n        // 控制波纹绘制的y在屏幕的位置,动态改变这个变量，可以形成波纹上升下降效果\n        for (int i = 0, j = 0, k = 0, f = 0; i < mTotalWidth; i++) {\n            if (i + mXOneOffset < mTotalWidth) {\n                canvas.drawLine(i, -mYPositions[mXOneOffset + i],\n                        i, mTotalHeight, mWavePaint);\n            } else {\n                canvas.drawLine(i, -mYPositions[j],\n                        i, mTotalHeight, mWavePaint);\n                j++;\n            }\n\n            if (i + mXTwoOffset < mTotalWidth) {\n                canvas.drawLine(i, -mYPositions[mXTwoOffset + i],\n                        i, mTotalHeight, mWavePaint);\n            } else {\n                canvas.drawLine(i, -mYPositions[k],\n                        i, mTotalHeight, mWavePaint);\n                k++;\n            }\n\n            if (i + mXThreeOffset < mTotalWidth) {\n                canvas.drawLine(i, -mYPositions[mXThreeOffset + i],\n                        i, mTotalHeight, mWavePaint);\n            } else {\n                canvas.drawLine(i, -mYPositions[f],\n                        i, mTotalHeight, mWavePaint);\n                f++;\n            }\n        }\n\n        // 改变两条波纹的移动点\n        mXOneOffset += mXOffsetSpeedOne;\n        mXTwoOffset += mXOffsetSpeedTwo;\n        mXThreeOffset += mXOffsetSpeedThree;\n\n        // 如果已经移动到结尾处，则重头记录\n        if (mXOneOffset >= mTotalWidth) {\n            mXOneOffset = 0;\n        }\n        if (mXTwoOffset > mTotalWidth) {\n            mXTwoOffset = 0;\n        }\n\n        if (mXThreeOffset > mTotalWidth) {\n            mXThreeOffset = 0;\n        }\n\n        // 引发view重绘，延迟233微秒绘制\n        executorService.schedule(this::invalidateWrap, 233, TimeUnit.MICROSECONDS);\n\n    }\n\n    /**\n     * 获取控件的高度和宽度\n     */\n    @Override\n    protected void onSizeChanged(int w, int h, int oldw, int oldh) {\n        super.onSizeChanged(w, h, oldw, oldh);\n        // 记录下view的宽高\n        mTotalWidth = w;\n        mTotalHeight = h;\n        // 用于保存原始波纹的y值\n        mYPositions = new float[mTotalWidth];\n        // y = Asin(wx+b)+h\n        // 将周期定为view总宽度\n        final float W = (float) (2 * Math.PI / mTotalWidth);\n        final float A = mTotalHeight / 2;\n        // 根据view总宽度得出所有对应的y值\n        for (int i = 0; i < mTotalWidth; i++) {\n            mYPositions[i] = (float) (A * Math.sin(W * i) - A);\n        }\n    }\n\n    @TargetApi(Build.VERSION_CODES.JELLY_BEAN)\n    private void invalidateWrap() {\n        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {\n            postInvalidateOnAnimation();\n        } else {\n            postInvalidate();\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/lqm/tomatoit/widget/IconFontTextView.java",
    "content": "package com.lqm.tomatoit.widget;\n\nimport android.content.Context;\nimport android.graphics.Typeface;\nimport android.util.AttributeSet;\n\n/**\n * @user  lqm\n * @desc  使用IConFont TextView\n */\npublic class IconFontTextView extends android.support.v7.widget.AppCompatTextView {\n\n    private Context mContext;\n\n    public IconFontTextView(Context context) {\n        super(context);\n        mContext = context;\n        initView();\n    }\n\n    public IconFontTextView(Context context, AttributeSet attrs) {\n        super(context, attrs);\n        mContext = context;\n        initView();\n    }\n\n    private void initView() {\n        Typeface iconfont = Typeface.createFromAsset(mContext.getAssets(), \"iconfont.ttf\");\n        setTypeface(iconfont);\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/lqm/tomatoit/widget/RoundImageView.java",
    "content": "package com.lqm.tomatoit.widget;\n\nimport android.annotation.SuppressLint;\nimport android.content.Context;\nimport android.content.res.TypedArray;\nimport android.graphics.Bitmap;\nimport android.graphics.BitmapShader;\nimport android.graphics.Canvas;\nimport android.graphics.Color;\nimport android.graphics.Matrix;\nimport android.graphics.Paint;\nimport android.graphics.Path;\nimport android.graphics.PixelFormat;\nimport android.graphics.RectF;\nimport android.graphics.Shader;\nimport android.graphics.drawable.BitmapDrawable;\nimport android.graphics.drawable.Drawable;\nimport android.support.annotation.ColorRes;\nimport android.util.AttributeSet;\nimport android.util.TypedValue;\nimport android.widget.ImageView;\n\nimport com.lqm.tomatoit.R;\n\n\n/**\n * 自定义的圆角矩形ImageView\n */\n@SuppressLint(\"AppCompatCustomView\")\npublic class RoundImageView extends ImageView {\n\n    /**\n     * 图片的类型，圆形or圆角\n     */\n    private int type;\n    public static final int TYPE_CIRCLE = 0;\n    public static final int TYPE_ROUND = 1;\n    public static final int TYPE_OVAL = 2;\n    /**\n     * 描边的颜色、宽度\n     */\n    private int mBorderColor;\n    private float mBorderWidth;\n    private int mProgressColor = R.color.gray;\n    /**\n     * 圆角的大小\n     */\n    private float mCornerRadius;\n    //左上角圆角大小\n    private float mLeftTopCornerRadius;\n    //右上角圆角大小\n    private float mRightTopCornerRadius;\n    //左下角圆角大小\n    private float mLeftBottomCornerRadius;\n    //右下角圆角大小\n    private float mRightBottomCornerRadius;\n\n    /**\n     * 绘图的Paint\n     */\n    private Paint mBitmapPaint;\n    private Paint mBorderPaint;\n    /**\n     * 圆角的半径\n     */\n    private float mRadius;\n    /**\n     * 3x3 矩阵，主要用于缩小放大\n     */\n    private Matrix mMatrix;\n    /**\n     * 渲染图像，使用图像为绘制图形着色\n     */\n    private BitmapShader mBitmapShader;\n    /**\n     * view的宽度\n     */\n    private int mWidth;\n    /**\n     * 圆角图片区域\n     */\n    private RectF mRoundRect;\n    private Path mRoundPath;\n    private int mBorderProgress = 0;\n    private static int num = 1;\n\n\n    public RoundImageView(Context context) {\n        this(context, null);\n    }\n\n    public RoundImageView(Context context, AttributeSet attrs) {\n        this(context, attrs, 0);\n    }\n\n    public RoundImageView(Context context, AttributeSet attrs, int defStyleAttr) {\n        super(context, attrs, defStyleAttr);\n\n        TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.RoundImageView, defStyleAttr, 0);\n\n        type = a.getInt(R.styleable.RoundImageView_type, TYPE_ROUND);\n        mBorderColor = a.getColor(R.styleable.RoundImageView_border_color, Color.WHITE);\n        mBorderWidth = a.getDimension(R.styleable.RoundImageView_border_width, 0);\n        mCornerRadius = a.getDimension(R.styleable.RoundImageView_corner_radius, dp2px(10));\n        mLeftTopCornerRadius = a.getDimension(R.styleable.RoundImageView_leftTop_corner_radius, 0);\n        mLeftBottomCornerRadius = a.getDimension(R.styleable.RoundImageView_leftBottom_corner_radius, 0);\n        mRightTopCornerRadius = a.getDimension(R.styleable.RoundImageView_rightTop_corner_radius, 0);\n        mRightBottomCornerRadius = a.getDimension(R.styleable.RoundImageView_rightBottom_corner_radius, 0);\n\n        a.recycle();\n\n        init();\n\n    }\n\n    private void init() {\n        mRoundPath = new Path();\n        mMatrix = new Matrix();\n        mBitmapPaint = new Paint();\n        mBitmapPaint.setAntiAlias(true);\n        mBorderPaint = new Paint();\n        mBorderPaint.setAntiAlias(true);\n        mBorderPaint.setStyle(Paint.Style.STROKE);\n        mBorderPaint.setStrokeCap(Paint.Cap.ROUND);\n    }\n\n    @Override\n    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {\n        super.onMeasure(widthMeasureSpec, heightMeasureSpec);\n\n        /**\n         * 如果类型是圆形，则强制改变view的宽高一致，以小值为准\n         */\n        if (type == TYPE_CIRCLE) {\n            mWidth = Math.min(MeasureSpec.getSize(widthMeasureSpec),\n                    MeasureSpec.getSize(heightMeasureSpec));\n            mRadius = mWidth / 2 - mBorderWidth / 2;\n            setMeasuredDimension(mWidth, mWidth);\n        }\n\n    }\n\n    @Override\n    protected void onSizeChanged(int w, int h, int oldw, int oldh) {\n        super.onSizeChanged(w, h, oldw, oldh);\n        // 圆角图片的范围\n        if (type == TYPE_ROUND || type == TYPE_OVAL) {\n            mRoundRect = new RectF(mBorderWidth / 2, mBorderWidth / 2, w - mBorderWidth / 2, h - mBorderWidth / 2);\n        }\n    }\n\n    @Override\n    protected void onDraw(Canvas canvas) {\n\n        mBorderPaint.setColor(mBorderColor);\n        mBorderPaint.setStrokeWidth(mBorderWidth);\n\n        if (getDrawable() == null) {\n            return;\n        }\n        setUpShader();\n\n        if (type == TYPE_ROUND) {\n            setRoundPath();\n\n            canvas.drawPath(mRoundPath, mBitmapPaint);\n\n            //绘制描边\n            canvas.drawPath(mRoundPath, mBorderPaint);\n        } else if (type == TYPE_CIRCLE) {\n\n            canvas.drawCircle(mRadius + mBorderWidth / 2, mRadius + mBorderWidth / 2, mRadius, mBitmapPaint);\n\n            //绘制描边\n            canvas.drawCircle(mRadius + mBorderWidth / 2, mRadius + mBorderWidth / 2, mRadius, mBorderPaint);\n\n            //进度\n            mBorderPaint.setColor(getResources().getColor(mProgressColor));\n            RectF rect = new RectF(mBorderWidth/2,mBorderWidth/2,mRadius*2 + mBorderWidth/2,mRadius*2 + mBorderWidth/2);\n            canvas.drawArc(rect,-90,mBorderProgress,false,mBorderPaint);\n\n        } else {\n            canvas.drawOval(mRoundRect, mBitmapPaint);\n\n            canvas.drawOval(mRoundRect, mBorderPaint);\n        }\n    }\n\n\n    private void setRoundPath() {\n        mRoundPath.reset();\n\n        /**\n         * 如果四个圆角大小都是默认值0，\n         * 则将四个圆角大小设置为mCornerRadius的值\n         */\n        if (mLeftTopCornerRadius == 0 &&\n                mLeftBottomCornerRadius == 0 &&\n                mRightTopCornerRadius == 0 &&\n                mRightBottomCornerRadius == 0) {\n\n            mRoundPath.addRoundRect(mRoundRect,\n                    new float[]{mCornerRadius, mCornerRadius,\n                            mCornerRadius, mCornerRadius,\n                            mCornerRadius, mCornerRadius,\n                            mCornerRadius, mCornerRadius},\n                    Path.Direction.CW);\n\n        } else {\n            mRoundPath.addRoundRect(mRoundRect,\n                    new float[]{mLeftTopCornerRadius, mLeftTopCornerRadius,\n                            mRightTopCornerRadius, mRightTopCornerRadius,\n                            mRightBottomCornerRadius, mRightBottomCornerRadius,\n                            mLeftBottomCornerRadius, mLeftBottomCornerRadius},\n                    Path.Direction.CW);\n        }\n\n    }\n\n\n    /**\n     * 初始化BitmapShader\n     */\n    private void setUpShader() {\n\n        Drawable drawable = getDrawable();\n        if (drawable == null) {\n            return;\n        }\n\n        Bitmap bmp = drawableToBitamp(drawable);\n        // 将bmp作为着色器，就是在指定区域内绘制bmp\n        mBitmapShader = new BitmapShader(bmp, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP);\n        float scale = 1.0f;\n        if (type == TYPE_CIRCLE) {\n            // 拿到bitmap宽或高的小值\n            int bSize = Math.min(bmp.getWidth(), bmp.getHeight());\n            scale = mWidth * 1.0f / bSize;\n            //使缩放后的图片居中\n            float dx = (bmp.getWidth() * scale - mWidth) / 2;\n            float dy = (bmp.getHeight() * scale - mWidth) / 2;\n            mMatrix.setTranslate(-dx, -dy);\n\n        } else if (type == TYPE_ROUND || type == TYPE_OVAL) {\n\n            if (!(bmp.getWidth() == getWidth() && bmp.getHeight() == getHeight())) {\n                // 如果图片的宽或者高与view的宽高不匹配，计算出需要缩放的比例；缩放后的图片的宽高，一定要大于我们view的宽高；所以我们这里取大值；\n                scale = Math.max(getWidth() * 1.0f / bmp.getWidth(),\n                        getHeight() * 1.0f / bmp.getHeight());\n                //使缩放后的图片居中\n                float dx = (scale * bmp.getWidth() - getWidth()) / 2;\n                float dy = (scale * bmp.getHeight() - getHeight()) / 2;\n                mMatrix.setTranslate(-dx, -dy);\n            }\n        }\n        // shader的变换矩阵，我们这里主要用于放大或者缩小\n        mMatrix.preScale(scale, scale);\n\n        mBitmapShader.setLocalMatrix(mMatrix);\n\n        // 设置变换矩阵\n        mBitmapShader.setLocalMatrix(mMatrix);\n        // 设置shader\n        mBitmapPaint.setShader(mBitmapShader);\n    }\n\n\n    /**\n     * drawable转bitmap\n     */\n    private Bitmap drawableToBitamp(Drawable drawable) {\n        try {\n            Bitmap bitmap;\n            if (drawable instanceof BitmapDrawable) {\n                BitmapDrawable bd = (BitmapDrawable) drawable;\n                return bd.getBitmap();\n            }\n            int w = drawable.getIntrinsicWidth();\n            int h = drawable.getIntrinsicHeight();\n            bitmap= Bitmap.createBitmap(w, h, drawable.getOpacity() != PixelFormat.OPAQUE\n                    ? Bitmap.Config.ARGB_4444 : Bitmap.Config.RGB_565);\n            Canvas canvas = new Canvas(bitmap);\n            drawable.setBounds(0, 0, w, h);\n            drawable.draw(canvas);\n            return bitmap;\n        }catch (Exception e){\n            e.printStackTrace();\n            return  null;\n        }\n    }\n\n    /**\n     * 设置图片类型:\n     * imageType=0 圆形图片\n     * imageType=1 圆角图片\n     * 默认为圆形图片\n     */\n    public RoundImageView setType(int imageType) {\n        if (this.type != imageType) {\n            this.type = imageType;\n            if (this.type != TYPE_ROUND && this.type != TYPE_CIRCLE && this.type != TYPE_OVAL) {\n                this.type = TYPE_OVAL;\n            }\n            requestLayout();\n        }\n        return this;\n    }\n\n\n    /**\n     * 设置圆角图片的圆角大小\n     */\n    public RoundImageView setCornerRadius(int cornerRadius) {\n        cornerRadius = dp2px(cornerRadius);\n        if (mCornerRadius != cornerRadius) {\n            mCornerRadius = cornerRadius;\n            invalidate();\n        }\n        return this;\n    }\n\n    /**\n     * 设置圆角图片的左上圆角大小\n     */\n    public RoundImageView setLeftTopCornerRadius(int cornerRadius) {\n        cornerRadius = dp2px(cornerRadius);\n        if (mLeftTopCornerRadius != cornerRadius) {\n            mLeftTopCornerRadius = cornerRadius;\n            invalidate();\n        }\n        return this;\n    }\n\n    /**\n     * 设置圆角图片的右上圆角大小\n     */\n    public RoundImageView setRightTopCornerRadius(int cornerRadius) {\n        cornerRadius = dp2px(cornerRadius);\n        if (mRightTopCornerRadius != cornerRadius) {\n            mRightTopCornerRadius = cornerRadius;\n            invalidate();\n        }\n        return this;\n    }\n\n    /**\n     * 设置圆角图片的左下圆角大小\n     */\n    public RoundImageView setLeftBottomCornerRadius(int cornerRadius) {\n        cornerRadius = dp2px(cornerRadius);\n        if (mLeftBottomCornerRadius != cornerRadius) {\n            mLeftBottomCornerRadius = cornerRadius;\n            invalidate();\n        }\n        return this;\n    }\n\n    /**\n     * 设置圆角图片的右下圆角大小\n     */\n    public RoundImageView setRightBottomCornerRadius(int cornerRadius) {\n        cornerRadius = dp2px(cornerRadius);\n        if (mRightBottomCornerRadius != cornerRadius) {\n            mRightBottomCornerRadius = cornerRadius;\n            invalidate();\n        }\n\n        return this;\n    }\n\n\n    /**\n     * 设置描边宽度\n     */\n    public RoundImageView setBorderWidth(int borderWidth) {\n        borderWidth = dp2px(borderWidth);\n        if (mBorderWidth != borderWidth) {\n            mBorderWidth = borderWidth;\n            invalidate();\n        }\n\n        return this;\n    }\n\n    /**\n     * 设置描边颜色\n     */\n    public RoundImageView setBorderColor(int borderColor) {\n        if (mBorderColor != borderColor) {\n            mBorderColor = borderColor;\n            invalidate();\n        }\n\n        return this;\n    }\n\n    private int dp2px(int dpVal) {\n        return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,\n                dpVal, getResources().getDisplayMetrics());\n    }\n\n    public void setProgress(int progress,@ColorRes int color){\n        mBorderProgress = progress;\n        mProgressColor = color;\n        invalidate();\n    }\n\n}"
  },
  {
    "path": "app/src/main/java/com/lqm/tomatoit/widget/WebViewFragment.java",
    "content": "package com.lqm.tomatoit.widget;\n\nimport android.os.Bundle;\nimport android.support.v4.app.Fragment;\nimport android.view.LayoutInflater;\nimport android.view.View;\nimport android.view.ViewGroup;\nimport android.webkit.WebView;\n\n/**\n * 一个包含WebView的Fragment，来自Android Sdk\n */\npublic class WebViewFragment extends Fragment {\n    private WebView mWebView;\n    private boolean mIsWebViewAvailable;\n\n    public WebViewFragment() {\n    }\n\n    /**\n     * Called to instantiate the view. Creates and returns the WebView.\n     */\n    @Override\n    public View onCreateView(LayoutInflater inflater, ViewGroup container,\n                             Bundle savedInstanceState) {\n        if (mWebView != null) {\n            mWebView.destroy();\n        }\n        mWebView = new WebView(getContext());\n        mIsWebViewAvailable = true;\n        return mWebView;\n    }\n\n    /**\n     * Called when the fragment is visible to the user and actively running. Resumes the WebView.\n     */\n    @Override\n    public void onPause() {\n        super.onPause();\n        mWebView.onPause();\n        mWebView.pauseTimers();\n    }\n\n    /**\n     * Called when the fragment is no longer resumed. Pauses the WebView.\n     */\n    @Override\n    public void onResume() {\n        mWebView.onResume();\n        mWebView.resumeTimers();\n        super.onResume();\n    }\n\n    /**\n     * Called when the WebView has been detached from the fragment.\n     * The WebView is no longer available after this time.\n     */\n    @Override\n    public void onDestroyView() {\n        mIsWebViewAvailable = false;\n        super.onDestroyView();\n    }\n\n    /**\n     * Called when the fragment is no longer in use. Destroys the internal state of the WebView.\n     */\n    @Override\n    public void onDestroy() {\n        if (mWebView != null) {\n            mWebView.destroy();\n            mWebView = null;\n        }\n        super.onDestroy();\n    }\n\n    /**\n     * Gets the WebView.\n     */\n    public WebView getWebView() {\n        return mIsWebViewAvailable ? mWebView : null;\n    }\n}\n"
  },
  {
    "path": "app/src/main/res/anim/slide_left_in.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<set xmlns:android=\"http://schemas.android.com/apk/res/android\" >\n\n    <translate\n        android:duration=\"400\"\n        android:fromXDelta=\"-100.0%p\"\n        android:toXDelta=\"0.0\" />\n\n</set>"
  },
  {
    "path": "app/src/main/res/anim/slide_left_out.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<set xmlns:android=\"http://schemas.android.com/apk/res/android\" >\n\n    <translate\n        android:duration=\"400\"\n        android:fromXDelta=\"0.0\"\n        android:toXDelta=\"-100.0%p\" />\n\n</set>"
  },
  {
    "path": "app/src/main/res/anim/slide_right_in.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<set xmlns:android=\"http://schemas.android.com/apk/res/android\" >\n\n    <translate\n        android:duration=\"400\"\n        android:fromXDelta=\"100.0%p\"\n        android:toXDelta=\"0.0\" />\n\n</set>"
  },
  {
    "path": "app/src/main/res/anim/slide_right_out.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<set xmlns:android=\"http://schemas.android.com/apk/res/android\" >\n\n    <translate\n        android:duration=\"400\"\n        android:fromXDelta=\"0.0\"\n        android:toXDelta=\"100.0%p\" />\n\n</set>"
  },
  {
    "path": "app/src/main/res/drawable/bg_round_frame_gray.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<shape xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:shape=\"rectangle\">\n\n    <corners android:radius=\"20dp\" />\n\n    <solid android:color=\"@color/white\" />\n    <stroke\n        android:width=\"1.5px\"\n        android:color=\"@color/line\" />\n\n\n</shape>"
  },
  {
    "path": "app/src/main/res/drawable/dialog_waiting.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<shape xmlns:android=\"http://schemas.android.com/apk/res/android\"\n       android:shape=\"rectangle\">\n    <corners android:radius=\"5dp\"/>\n    <solid android:color=\"@color/black\"/>\n</shape>"
  },
  {
    "path": "app/src/main/res/drawable/progress_bar_status.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<layer-list xmlns:android=\"http://schemas.android.com/apk/res/android\">\n\n    <item android:id=\"@android:id/background\">\n        <shape>\n            <gradient\n                android:angle=\"270\"\n                android:centerColor=\"#7c7c7c\"\n                android:centerY=\"0.75\"\n                android:endColor=\"#adadad\"\n                android:startColor=\"#c7c7c7\"/>\n        </shape>\n    </item>\n\n    <item android:id=\"@android:id/secondaryProgress\">\n        <clip>\n            <shape>\n                <gradient\n                    android:angle=\"270\"\n                    android:centerColor=\"#a0529124\"\n                    android:centerY=\"0.75\"\n                    android:endColor=\"#a04bc022\"\n                    android:startColor=\"#a04dc721\"/>\n            </shape>\n        </clip>\n    </item>\n\n    <item android:id=\"@android:id/progress\">\n        <clip>\n            <shape>\n                <gradient\n                    android:angle=\"270\"\n                    android:centerColor=\"#46bb1b\"\n                    android:centerY=\"0.75\"\n                    android:endColor=\"#46cc1b\"\n                    android:startColor=\"#46cc1b\"/>\n            </shape>\n        </clip>\n    </item>\n</layer-list>"
  },
  {
    "path": "app/src/main/res/drawable/sel_menu_item.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/gray\" android:state_selected=\"true\" />\n    <item android:drawable=\"@color/gray\" android:state_pressed=\"true\" />\n    <item android:drawable=\"@color/gray\" android:state_focused=\"true\" />\n    <item android:drawable=\"@color/white\" />\n</selector>"
  },
  {
    "path": "app/src/main/res/drawable/shape_bg_round_white.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<shape xmlns:android=\"http://schemas.android.com/apk/res/android\" >\n\n    <solid android:color=\"@color/text5\" />\n\n    <corners\n        android:radius=\"5dp\" />\n\n</shape>"
  },
  {
    "path": "app/src/main/res/drawable/shape_tag_nor.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<shape xmlns:android=\"http://schemas.android.com/apk/res/android\" >\n\n    <solid android:color=\"@color/white\" />\n\n    <corners\n        android:radius=\"5dp\" />\n\n</shape>"
  },
  {
    "path": "app/src/main/res/drawable/shape_tag_sel.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<shape xmlns:android=\"http://schemas.android.com/apk/res/android\" >\n\n    <solid android:color=\"@color/main\" />\n\n    <corners\n        android:radius=\"5dp\" />\n\n</shape>"
  },
  {
    "path": "app/src/main/res/layout/activity_about.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    <include layout=\"@layout/layout_topbar_nor\" />\n\n\n    <com.lqm.tomatoit.widget.RoundImageView\n        android:layout_width=\"180px\"\n        android:layout_height=\"180px\"\n        android:layout_gravity=\"center_horizontal\"\n        android:layout_margin=\"50px\"\n        android:scaleType=\"fitXY\"\n        android:src=\"@mipmap/ic_photo\"\n        app:type=\"circle\" />\n\n    <TextView\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:autoLink=\"web\"\n        android:padding=\"30px\"\n        android:text=\"@string/about_me_tip\"\n        android:textSize=\"@dimen/text_big_size\" />\n\n</LinearLayout>"
  },
  {
    "path": "app/src/main/res/layout/activity_collect.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    <include layout=\"@layout/layout_topbar_nor\" />\n\n    <android.support.v4.widget.SwipeRefreshLayout\n        android:id=\"@+id/swipe_refresh\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\">\n\n        <RelativeLayout\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\">\n\n            <android.support.v7.widget.RecyclerView\n                android:id=\"@+id/rv_content\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"match_parent\"\n                android:padding=\"30px\" />\n\n            <TextView\n                android:id=\"@+id/tv_no_collect\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:text=\"~~ 没有收藏数据 ~~\"\n                android:textColor=\"@color/text2\"\n                android:textSize=\"@dimen/text_big_size\"\n                android:layout_centerInParent=\"true\"\n                android:visibility=\"gone\"\n                />\n\n        </RelativeLayout>\n\n\n    </android.support.v4.widget.SwipeRefreshLayout>\n\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    <RelativeLayout\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:padding=\"50px\">\n\n        <com.lqm.tomatoit.widget.IconFontTextView\n            android:id=\"@+id/ic_close\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_alignParentRight=\"true\"\n            android:text=\"@string/ic_close\"\n            android:textColor=\"@color/text1\"\n            android:textSize=\"@dimen/top_icon_size\" />\n\n        <com.lqm.tomatoit.widget.RoundImageView\n            android:layout_width=\"150px\"\n            android:layout_height=\"150px\"\n            android:layout_below=\"@id/ic_close\"\n            android:layout_centerInParent=\"true\"\n            android:layout_marginTop=\"50px\"\n            android:scaleType=\"fitXY\"\n            android:src=\"@mipmap/ic_photo\"\n            app:type=\"circle\" />\n\n    </RelativeLayout>\n\n\n    <RelativeLayout\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:layout_margin=\"50px\">\n\n        <TextView\n            android:id=\"@+id/tv_name\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_centerVertical=\"true\"\n            android:text=\"用户名 : \"\n            android:textColor=\"@color/text0\"\n            android:textSize=\"@dimen/text_big_size\" />\n\n        <EditText\n            android:id=\"@+id/et_name\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:layout_centerVertical=\"true\"\n            android:layout_toRightOf=\"@id/tv_name\" />\n    </RelativeLayout>\n\n    <RelativeLayout\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:layout_margin=\"50px\">\n\n        <TextView\n            android:id=\"@+id/tv_password\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_centerVertical=\"true\"\n            android:text=\"密    码 : \"\n            android:textColor=\"@color/text0\"\n            android:textSize=\"@dimen/text_big_size\" />\n\n        <EditText\n            android:id=\"@+id/et_password\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:layout_centerVertical=\"true\"\n            android:inputType=\"numberPassword\"\n            android:layout_toRightOf=\"@id/tv_password\" />\n    </RelativeLayout>\n\n    <LinearLayout\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"100px\"\n        android:layout_marginLeft=\"50px\"\n        android:layout_marginRight=\"50px\"\n        android:orientation=\"horizontal\">\n\n        <Button\n            android:id=\"@+id/btn_regist\"\n            android:layout_width=\"0dp\"\n            android:layout_height=\"match_parent\"\n            android:layout_weight=\"1\"\n            android:text=\"注册\"\n            android:textColor=\"@color/text0\"\n            android:textSize=\"@dimen/text_big_size\"\n            />\n\n        <Button\n            android:id=\"@+id/btn_login\"\n            android:layout_width=\"0dp\"\n            android:layout_height=\"match_parent\"\n            android:layout_weight=\"1\"\n            android:text=\"登录\"\n            android:textColor=\"@color/text0\"\n            android:textSize=\"@dimen/text_big_size\" />\n    </LinearLayout>\n\n\n</LinearLayout>"
  },
  {
    "path": "app/src/main/res/layout/activity_main.xml",
    "content": "<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    <include layout=\"@layout/layout_topbar_home\"/>\n\n\n    <android.support.v4.view.ViewPager\n        android:id=\"@+id/viewpager\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"0dp\"\n        android:layout_weight=\"1\" />\n\n    <View\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"1.5px\"\n        android:background=\"@color/line\" />\n\n    <LinearLayout\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"100px\"\n        android:orientation=\"horizontal\">\n\n        <LinearLayout\n            android:id=\"@+id/ll_home\"\n            android:layout_width=\"0dp\"\n            android:layout_height=\"match_parent\"\n            android:layout_weight=\"1\"\n            android:gravity=\"center\"\n            android:orientation=\"vertical\">\n\n            <com.lqm.tomatoit.widget.IconFontTextView\n                android:id=\"@+id/if_home\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:text=\"@string/ic_home\"\n                android:textColor=\"@color/main\"\n                android:textSize=\"40px\" />\n\n            <TextView\n                android:id=\"@+id/tv_home\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:layout_marginTop=\"5px\"\n                android:text=\"首页\"\n                android:textColor=\"@color/main\"\n                android:textSize=\"@dimen/tab_text_size\" />\n\n\n        </LinearLayout>\n\n\n        <LinearLayout\n            android:id=\"@+id/ll_type\"\n            android:layout_width=\"0dp\"\n            android:layout_height=\"match_parent\"\n            android:layout_weight=\"1\"\n            android:gravity=\"center\"\n            android:orientation=\"vertical\">\n\n            <com.lqm.tomatoit.widget.IconFontTextView\n                android:id=\"@+id/if_type\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:text=\"@string/ic_type\"\n                android:textColor=\"@color/main\"\n                android:textSize=\"@dimen/tab_icon_size\" />\n\n            <TextView\n                android:id=\"@+id/tv_type\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:layout_marginTop=\"5px\"\n                android:text=\"分类\"\n                android:textColor=\"@color/main\"\n                android:textSize=\"@dimen/tab_text_size\" />\n\n        </LinearLayout>\n\n        <LinearLayout\n            android:id=\"@+id/ll_user\"\n            android:layout_width=\"0dp\"\n            android:layout_height=\"match_parent\"\n            android:layout_weight=\"1\"\n            android:gravity=\"center\"\n            android:orientation=\"vertical\">\n\n            <com.lqm.tomatoit.widget.IconFontTextView\n                android:id=\"@+id/if_user\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:text=\"@string/ic_user\"\n                android:textColor=\"@color/main\"\n                android:textSize=\"@dimen/tab_icon_size\" />\n\n            <TextView\n                android:id=\"@+id/tv_user\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:layout_marginTop=\"5px\"\n                android:text=\"个人\"\n                android:textColor=\"@color/main\"\n                android:textSize=\"@dimen/tab_text_size\" />\n\n        </LinearLayout>\n\n    </LinearLayout>\n\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    <RelativeLayout\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"@dimen/topbar_height\"\n        android:background=\"@color/colorPrimary\">\n\n        <RelativeLayout\n            android:id=\"@+id/rl_search\"\n            android:layout_width=\"560px\"\n            android:layout_height=\"78px\"\n            android:layout_marginBottom=\"15px\"\n            android:layout_marginLeft=\"50px\"\n            android:layout_marginTop=\"15px\"\n            android:background=\"@drawable/bg_round_frame_gray\">\n\n\n            <com.lqm.tomatoit.widget.IconFontTextView\n                android:id=\"@+id/tv_ic_search\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:layout_centerVertical=\"true\"\n                android:layout_marginLeft=\"40px\"\n                android:text=\"@string/ic_search\"\n                android:textSize=\"40px\" />\n\n            <EditText\n                android:id=\"@+id/et_search\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"match_parent\"\n                android:layout_toRightOf=\"@id/tv_ic_search\"\n                android:background=\"@color/transparent\"\n                android:gravity=\"center_vertical\"\n                android:hint=\"请输入关键字\"\n                android:paddingLeft=\"20px\"\n                android:paddingRight=\"30px\"\n                android:textColor=\"@color/text0\"\n                android:textColorHint=\"@color/text3\"\n                android:textSize=\"@dimen/text_medium_size\" />\n\n            <com.lqm.tomatoit.widget.IconFontTextView\n                android:id=\"@+id/tv_clean_input\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:layout_alignParentRight=\"true\"\n                android:layout_centerVertical=\"true\"\n                android:layout_marginRight=\"30px\"\n                android:text=\"@string/ic_close\"\n                android:textColor=\"@color/text1\" />\n\n        </RelativeLayout>\n\n        <TextView\n            android:id=\"@+id/tv_return\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"match_parent\"\n            android:layout_centerVertical=\"true\"\n            android:layout_marginLeft=\"30px\"\n            android:layout_toRightOf=\"@id/rl_search\"\n            android:gravity=\"center\"\n            android:text=\"取消\"\n            android:textColor=\"@color/white\"\n            android:textSize=\"@dimen/text_big_size\" />\n\n    </RelativeLayout>\n\n    <RelativeLayout\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        android:layout_marginLeft=\"20px\"\n        android:layout_marginRight=\"20px\"\n        android:layout_marginTop=\"30px\">\n\n\n        <LinearLayout\n            android:id=\"@+id/ll_hot_key\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:orientation=\"vertical\">\n\n            <TextView\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:text=\"热门搜索\"\n                android:textColor=\"@color/black\"\n                android:textSize=\"@dimen/text_big_size\"\n                android:textStyle=\"bold\" />\n\n            <com.lqm.tomatoit.widget.AutoLinefeedLayout\n                android:id=\"@+id/layout_hot_key\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:paddingTop=\"30px\" />\n\n        </LinearLayout>\n\n        <android.support.v7.widget.RecyclerView\n            android:id=\"@+id/rv_content\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:visibility=\"gone\" />\n\n    </RelativeLayout>\n\n</LinearLayout>"
  },
  {
    "path": "app/src/main/res/layout/activity_webview.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    android:orientation=\"vertical\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\">\n\n    <android.support.design.widget.AppBarLayout\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\">\n\n        <LinearLayout\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:orientation=\"vertical\"\n            app:layout_scrollFlags=\"scroll|enterAlways\">\n\n            <RelativeLayout\n                android:id=\"@+id/rl_topbar_layout\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"@dimen/topbar_height\"\n                android:background=\"@color/colorPrimary\">\n\n                <com.lqm.tomatoit.widget.IconFontTextView\n                    android:id=\"@+id/tv_return\"\n                    android:layout_width=\"@dimen/topbar_icon_width_height\"\n                    android:layout_height=\"match_parent\"\n                    android:layout_marginLeft=\"5px\"\n                    android:gravity=\"center\"\n                    android:text=\"@string/ic_return\"\n                    android:textColor=\"@color/white\"\n                    android:textSize=\"@dimen/top_icon_size\" />\n\n                <TextView\n                    android:id=\"@+id/tv_title\"\n                    android:layout_width=\"wrap_content\"\n                    android:layout_height=\"wrap_content\"\n                    android:layout_centerInParent=\"true\"\n                    android:layout_marginLeft=\"120px\"\n                    android:layout_marginRight=\"120px\"\n                    android:maxLines=\"1\"\n                    android:textColor=\"@color/white\"\n                    android:textSize=\"@dimen/text_big_size\" />\n\n                <com.lqm.tomatoit.widget.IconFontTextView\n                    android:id=\"@+id/tv_other\"\n                    android:layout_width=\"@dimen/topbar_icon_width_height\"\n                    android:layout_height=\"match_parent\"\n                    android:layout_alignParentRight=\"true\"\n                    android:gravity=\"center\"\n                    android:text=\"@string/ic_share\"\n                    android:textColor=\"@color/white\"\n                    android:textSize=\"55px\"\n                    android:visibility=\"visible\" />\n\n                <View\n                    style=\"@style/lineStyle\"\n                    android:layout_alignParentBottom=\"true\" />\n\n            </RelativeLayout>\n\n        </LinearLayout>\n    </android.support.design.widget.AppBarLayout>\n\n    <LinearLayout\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        android:orientation=\"vertical\"\n        app:layout_behavior=\"@string/appbar_scrolling_view_behavior\">\n\n        <ProgressBar\n            android:id=\"@+id/progress_bar\"\n            style=\"@style/Base.Widget.AppCompat.ProgressBar.Horizontal\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:indeterminate=\"false\"\n            android:indeterminateDrawable=\"@color/main\"\n            android:minHeight=\"6px\"\n            android:progressDrawable=\"@drawable/progress_bar_status\" />\n\n        <android.support.v4.widget.NestedScrollView\n            android:id=\"@+id/webview_container\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"match_parent\"\n            android:descendantFocusability=\"blocksDescendants\"\n            />\n    </LinearLayout>\n</android.support.design.widget.CoordinatorLayout>"
  },
  {
    "path": "app/src/main/res/layout/dialog_waiting.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<FrameLayout\n    xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\">\n\n    <RelativeLayout\n        android:layout_width=\"240dp\"\n        android:layout_height=\"80dp\"\n        android:background=\"@drawable/dialog_waiting\">\n\n\n        <TextView\n            android:id=\"@+id/tvTip\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_centerInParent=\"true\"\n            android:textColor=\"@color/white\"\n            android:textSize=\"32px\"/>\n\n        <ProgressBar\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_centerVertical=\"true\"\n            android:layout_marginRight=\"30px\"\n            android:layout_toLeftOf=\"@id/tvTip\"/>\n\n    </RelativeLayout>\n</FrameLayout>"
  },
  {
    "path": "app/src/main/res/layout/frag_home.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.v4.widget.SwipeRefreshLayout\n        android:id=\"@+id/swipe_refresh\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\">\n\n        <android.support.v7.widget.RecyclerView\n            android:id=\"@+id/rv_content\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"match_parent\"\n            android:padding=\"30px\"\n            />\n\n    </android.support.v4.widget.SwipeRefreshLayout>\n\n</LinearLayout>"
  },
  {
    "path": "app/src/main/res/layout/frag_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    android:id=\"@+id/ll_mian\"\n    >\n\n    <android.support.design.widget.TabLayout\n        android:id=\"@+id/tabLayout\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:background=\"@color/colorPrimaryDark\"\n        app:tabIndicatorColor=\"@color/TabIndicatorColor\"\n        app:tabSelectedTextColor=\"@color/TabSelectColor\"\n        app:tabTextAppearance=\"@style/MyTabLayoutTextAppearance\"\n        app:tabTextColor=\"@color/TabTextColor\" />\n\n    <com.zhy.autolayout.AutoRelativeLayout\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\">\n\n        <android.support.v7.widget.RecyclerView\n            android:id=\"@+id/rv_content\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:scrollbars=\"none\" />\n\n        <com.lqm.tomatoit.widget.AutoLinefeedLayout\n            android:id=\"@+id/ll_tag\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:padding=\"20px\"\n            android:visibility=\"gone\"\n            android:background=\"#cc000000\"\n            />\n\n\n        <include layout=\"@layout/layout_blank_tip\" />\n\n    </com.zhy.autolayout.AutoRelativeLayout>\n\n</LinearLayout>"
  },
  {
    "path": "app/src/main/res/layout/frag_user.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:background=\"@color/white\"\n    android:orientation=\"vertical\">\n\n    <RelativeLayout\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\">\n\n        <LinearLayout\n            android:id=\"@+id/ll_user_info\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"420px\"\n            android:background=\"@mipmap/bg_user\"\n            android:gravity=\"center_horizontal\"\n            android:orientation=\"vertical\">\n\n            <com.lqm.tomatoit.widget.RoundImageView\n                android:id=\"@+id/iv_photo\"\n                android:layout_width=\"200px\"\n                android:layout_height=\"200px\"\n                android:layout_centerInParent=\"true\"\n                android:layout_gravity=\"center_horizontal\"\n                android:layout_marginTop=\"60px\"\n                android:src=\"@mipmap/ic_photo\"\n                app:type=\"circle\" />\n\n            <TextView\n                android:id=\"@+id/tv_name\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:layout_marginTop=\"20px\"\n                android:text=\"用户名\"\n                android:textColor=\"@color/text0\"\n                android:textSize=\"@dimen/text_big_size\"\n                android:textStyle=\"bold\" />\n\n        </LinearLayout>\n\n        <com.lqm.tomatoit.widget.DynamicWave\n            android:id=\"@+id/dynamicWave\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"60px\"\n            android:layout_alignBottom=\"@id/ll_user_info\" />\n\n    </RelativeLayout>\n\n    <android.support.v7.widget.CardView\n        android:id=\"@+id/cv_collect\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"100px\"\n        android:layout_marginLeft=\"30px\"\n        android:layout_marginRight=\"30px\"\n        android:layout_marginTop=\"80px\"\n        app:cardCornerRadius=\"10dp\"\n        app:contentPadding=\"10dp\">\n\n        <TextView\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_gravity=\"center\"\n            android:text=\"我的收藏\"\n            android:textColor=\"@color/main\"\n            android:textSize=\"@dimen/text_special_size\" />\n\n    </android.support.v7.widget.CardView>\n\n    <android.support.v7.widget.CardView\n        android:id=\"@+id/cv_about\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"100px\"\n        android:layout_marginLeft=\"30px\"\n        android:layout_marginRight=\"30px\"\n        android:layout_marginTop=\"80px\"\n        app:cardCornerRadius=\"10dp\"\n        app:contentPadding=\"10dp\">\n\n        <TextView\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_gravity=\"center\"\n            android:text=\"关于我们\"\n            android:textColor=\"@color/main\"\n            android:textSize=\"@dimen/text_special_size\" />\n\n    </android.support.v7.widget.CardView>\n\n    <android.support.v7.widget.CardView\n        android:id=\"@+id/cv_logou\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"100px\"\n        android:layout_marginLeft=\"30px\"\n        android:layout_marginRight=\"30px\"\n        android:layout_marginTop=\"80px\"\n        app:cardCornerRadius=\"10dp\"\n        app:contentPadding=\"10dp\">\n\n        <TextView\n            android:id=\"@+id/tv_logou\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_gravity=\"center\"\n            android:text=\"退出登录\"\n            android:textColor=\"@color/main\"\n            android:textSize=\"@dimen/text_special_size\" />\n\n    </android.support.v7.widget.CardView>\n\n</LinearLayout>"
  },
  {
    "path": "app/src/main/res/layout/item_article.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\">\n\n    <android.support.v7.widget.CardView\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:layout_margin=\"5dp\"\n        android:layout_marginTop=\"30px\"\n        app:cardCornerRadius=\"10dp\"\n        app:contentPadding=\"10dp\">\n\n        <RelativeLayout\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\">\n\n            <com.lqm.tomatoit.widget.RoundImageView\n                android:id=\"@+id/iv_photo\"\n                android:layout_width=\"50px\"\n                android:layout_height=\"50px\"\n                android:scaleType=\"fitXY\"\n                android:src=\"@mipmap/ic_photo\"\n                app:type=\"circle\" />\n\n            <TextView\n                android:id=\"@+id/tv_author\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:layout_alignTop=\"@id/iv_photo\"\n                android:layout_marginLeft=\"10px\"\n                android:layout_marginTop=\"10px\"\n                android:layout_toRightOf=\"@id/iv_photo\"\n                android:text=\"作者\"\n                android:textColor=\"@color/main\"\n                android:textSize=\"@dimen/text_medium_size\" />\n\n            <TextView\n                android:id=\"@+id/tv_time\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:layout_alignParentRight=\"true\"\n                android:layout_alignTop=\"@id/iv_photo\"\n                android:text=\"1小时前\"\n                android:textColor=\"@color/main\"\n                android:textSize=\"@dimen/text_medium_size\" />\n\n            <TextView\n                android:id=\"@+id/tv_title\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:layout_below=\"@id/iv_photo\"\n                android:layout_marginRight=\"80px\"\n                android:text=\"文章标题文章标题文章标题文章标题文章标题文章标题\"\n                android:textColor=\"@color/text0\"\n                android:textSize=\"@dimen/text_big_size\"\n                android:layout_marginTop=\"30px\"\n                android:layout_marginLeft=\"10px\"\n                />\n\n\n            <TextView\n                android:id=\"@+id/tv_type\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:layout_below=\"@id/tv_title\"\n                android:layout_marginTop=\"30px\"\n                android:text=\"类别\"\n                android:textColor=\"@color/main\"\n                android:textSize=\"@dimen/text_medium_size\" />\n\n            <com.lqm.tomatoit.widget.IconFontTextView\n                android:id=\"@+id/tv_collect\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:layout_alignParentRight=\"true\"\n                android:layout_alignTop=\"@id/tv_type\"\n                android:text=\"@string/ic_collect_nor\"\n                android:textColor=\"@color/text3\"\n                android:textSize=\"50px\"\n\n                />\n\n\n        </RelativeLayout>\n    </android.support.v7.widget.CardView>\n\n\n</RelativeLayout>\n\n\n"
  },
  {
    "path": "app/src/main/res/layout/item_banner.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout\n    xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    android:orientation=\"vertical\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\">\n\n    <com.lqm.tomatoit.widget.RoundImageView\n        android:id=\"@+id/imageView\"\n        android:src=\"@mipmap/default_img\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        android:scaleType=\"fitXY\"\n        app:corner_radius=\"5dp\"\n        />\n\n</LinearLayout>"
  },
  {
    "path": "app/src/main/res/layout/item_hot_key.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:layout_width=\"wrap_content\"\n    android:layout_height=\"wrap_content\"\n    android:orientation=\"vertical\">\n\n    <TextView\n        android:id=\"@+id/textview\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"68px\"\n        android:layout_marginBottom=\"20px\"\n        android:layout_marginLeft=\"10px\"\n        android:layout_marginRight=\"10px\"\n        android:background=\"@drawable/bg_round_frame_gray\"\n        android:gravity=\"center\"\n        android:paddingLeft=\"40px\"\n        android:paddingRight=\"40px\"\n        android:text=\"热词\"\n        android:textColor=\"@color/text0\" />\n\n</LinearLayout>"
  },
  {
    "path": "app/src/main/res/layout/item_no_data.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout\n    android:id=\"@+id/loading_view\"\n    xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"36dp\"\n    android:gravity=\"center\"\n    android:orientation=\"horizontal\">\n\n    <TextView\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"30dp\"\n        android:gravity=\"center\"\n        android:text=\"-- 没有更多数据了 --\"\n        android:textColor=\"@android:color/darker_gray\"/>\n</LinearLayout>"
  },
  {
    "path": "app/src/main/res/layout/item_tag_layout.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:layout_width=\"wrap_content\"\n    android:layout_height=\"wrap_content\"\n    android:orientation=\"vertical\">\n\n    <TextView\n        android:id=\"@+id/tv_item\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"60px\"\n        android:layout_margin=\"18px\"\n        android:gravity=\"center\"\n        android:paddingLeft=\"20px\"\n        android:paddingRight=\"20px\"\n        android:text=\"热词\"\n        android:textColor=\"@color/text1\"\n        android:background=\"@drawable/shape_tag_nor\"\n        />\n\n</LinearLayout>"
  },
  {
    "path": "app/src/main/res/layout/layout_banner.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=\"wrap_content\"\n    android:orientation=\"vertical\">\n\n    <cn.bingoogolapple.bgabanner.BGABanner\n        android:id=\"@+id/banner\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"350px\"\n        app:banner_indicatorGravity=\"bottom|center_horizontal\"\n        app:banner_pageChangeDuration=\"1000\"\n        app:banner_pointAutoPlayAble=\"true\"\n        app:banner_pointAutoPlayInterval=\"3000\"\n        app:banner_pointContainerBackground=\"@color/transparent\"\n        app:banner_pointDrawable=\"@drawable/bga_banner_selector_point_hollow\"\n        app:banner_pointTopBottomMargin=\"6dp\"\n\n        />\n\n</LinearLayout>"
  },
  {
    "path": "app/src/main/res/layout/layout_blank_tip.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<com.zhy.autolayout.AutoLinearLayout\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    android:gravity=\"center\"\n    android:id=\"@+id/layout_blank\"\n    android:visibility=\"gone\"\n    >\n    <TextView\n        android:text=\"什么都没有~\"\n        android:textSize=\"38px\"\n        android:textColor=\"@color/main\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\" />\n\n</com.zhy.autolayout.AutoLinearLayout>"
  },
  {
    "path": "app/src/main/res/layout/layout_topbar_home.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    android:orientation=\"vertical\">\n\n    <RelativeLayout\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"@dimen/topbar_height\"\n        android:background=\"@color/main\">\n\n        <com.lqm.tomatoit.widget.IconFontTextView\n            android:id=\"@+id/tv_hot\"\n            style=\"@style/topbar_icon_style\"\n            android:layout_marginRight=\"20px\"\n            android:layout_toLeftOf=\"@+id/tv_search\"\n            android:text=\"@string/ic_hot\"\n            android:visibility=\"invisible\"\n            />\n\n        <com.lqm.tomatoit.widget.IconFontTextView\n            android:id=\"@+id/tv_search\"\n            style=\"@style/topbar_icon_style\"\n            android:layout_alignParentRight=\"true\"\n            android:layout_marginRight=\"20px\"\n            android:text=\"@string/ic_search\" />\n\n    </RelativeLayout>\n\n</LinearLayout>"
  },
  {
    "path": "app/src/main/res/layout/layout_topbar_nor.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<RelativeLayout\n      xmlns:android=\"http://schemas.android.com/apk/res/android\"\n      android:layout_width=\"match_parent\"\n      android:layout_height=\"@dimen/topbar_height\"\n      android:orientation=\"horizontal\"\n      android:gravity=\"center_vertical\"\n      android:background=\"@color/colorPrimary\"\n      android:id=\"@+id/rl_topbar_layout\"\n    >\n\n    <com.lqm.tomatoit.widget.IconFontTextView\n        android:id=\"@+id/tv_return\"\n        android:layout_width=\"@dimen/topbar_icon_width_height\"\n        android:layout_height=\"match_parent\"\n        android:textSize=\"@dimen/top_icon_size\"\n        android:gravity=\"center\"\n        android:textColor=\"@color/white\"\n        android:text=\"@string/ic_return\"\n        android:layout_marginLeft=\"5px\"\n        />\n\n    <TextView\n        android:id=\"@+id/tv_title\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_centerInParent=\"true\"\n        android:layout_marginLeft=\"120px\"\n        android:layout_marginRight=\"120px\"\n        android:maxLines=\"1\"\n        android:textColor=\"@color/white\"\n        android:textSize=\"@dimen/text_big_size\"\n        />\n\n    <com.lqm.tomatoit.widget.IconFontTextView\n        android:id=\"@+id/tv_other\"\n        android:layout_width=\"@dimen/topbar_icon_width_height\"\n        android:layout_height=\"match_parent\"\n        android:textSize=\"55px\"\n        android:text=\"@string/ic_share\"\n        android:gravity=\"center\"\n        android:textColor=\"@color/white\"\n        android:layout_alignParentRight=\"true\"\n        android:visibility=\"gone\"\n        />\n    <View\n        style=\"@style/lineStyle\"\n        android:layout_alignParentBottom=\"true\"\n        />\n\n</RelativeLayout>"
  },
  {
    "path": "app/src/main/res/layout/popup_webview_more.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:layout_width=\"wrap_content\"\n    android:layout_height=\"wrap_content\"\n    android:background=\"@drawable/shape_bg_round_white\"\n    android:orientation=\"vertical\">\n\n    <TextView\n        android:id=\"@+id/tv_shape\"\n        android:layout_width=\"380px\"\n        android:layout_height=\"90px\"\n        android:gravity=\"center\"\n        android:text=\"分享\"\n        android:textColor=\"@color/text0\"\n        android:textSize=\"@dimen/text_big_size\" />\n\n    <View android:layout_width=\"match_parent\"\n        android:layout_height=\"1px\"\n        android:background=\"@color/white\"/>\n\n    <TextView\n        android:id=\"@+id/tv_copy_link\"\n        android:layout_width=\"380px\"\n        android:layout_height=\"90px\"\n        android:gravity=\"center\"\n        android:text=\"复制链接\"\n        android:textColor=\"@color/text0\"\n        android:textSize=\"@dimen/text_big_size\" />\n\n    <View android:layout_width=\"match_parent\"\n        android:layout_height=\"1px\"\n        android:background=\"@color/white\"/>\n\n    <TextView\n        android:id=\"@+id/tv_open_out\"\n        android:layout_width=\"380px\"\n        android:layout_height=\"90px\"\n        android:gravity=\"center\"\n        android:text=\"使用系统浏览器打开\"\n        android:textColor=\"@color/text0\"\n        android:textSize=\"@dimen/text_big_size\" />\n</LinearLayout>"
  },
  {
    "path": "app/src/main/res/values/attrs.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <declare-styleable name=\"RoundImageView\">\n        <!-- 描边宽度-->\n        <attr name=\"border_width\" format=\"dimension\"/>\n        <!-- 描边颜色-->\n        <attr name=\"border_color\" format=\"color\"/>\n        <!--圆角大小-->\n        <attr name=\"corner_radius\" format=\"dimension\"/>\n        <!--左上圆角大小-->\n        <attr name=\"leftTop_corner_radius\" format=\"dimension\"/>\n        <!--右上圆角大小-->\n        <attr name=\"rightTop_corner_radius\" format=\"dimension\"/>\n        <!--左下圆角大小-->\n        <attr name=\"leftBottom_corner_radius\" format=\"dimension\"/>\n        <!--右下圆角大小-->\n        <attr name=\"rightBottom_corner_radius\" format=\"dimension\"/>\n        <!--图片类型：圆角或者圆形-->\n        <attr name=\"type\" format=\"enum\">\n            <enum name=\"oval\" value=\"2\"/>\n            <enum name=\"round\" value=\"1\"/>\n            <enum name=\"circle\" value=\"0\"/>\n        </attr>\n    </declare-styleable>\n\n</resources>"
  },
  {
    "path": "app/src/main/res/values/colors.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <color name=\"colorPrimary\">#2395FF</color>\n    <color name=\"colorPrimaryDark\">#1189F8</color>\n    <color name=\"colorAccent\">#FF4081</color>\n\n\n    <color name=\"white\">#fff</color>\n    <color name=\"black\" >#000</color>\n    <color name=\"gray\">#5000</color>\n    <color name=\"line\">#e7e7e7</color>\n    <color name=\"transparent\">#0000</color>\n    <color name=\"main\">#2395FF</color>\n    <color name=\"main_bg\">#F5F5F5</color>\n    <color name=\"black_light\">#3A3A3A</color>\n    <color name=\"orange\">#FF5301</color>\n    <color name=\"red_light\">#FF8880</color>\n    <color name=\"purple\">#A577FB</color>\n\n    <color name=\"black_transparent\">#8000</color>\n\n    <color name=\"text0\">#464646</color>\n    <color name=\"text1\">#7e7e7e</color>\n    <color name=\"text2\">#969696</color>\n    <color name=\"text3\">#c8969696</color>\n    <color name=\"text4\">#DDDDDD</color>\n    <color name=\"text5\">#EFEFEF</color>\n\n\n    <color name= \"tab_nor_color\">#969696</color>\n    <color name= \"tab_sel_color\">#2395FF</color>\n\n    <!--TabLayout-->\n    <color name=\"TabTextColor\">#FFFFFF</color>\n    <color name=\"TabSelectColor\">#FAFAFA</color>\n    <color name=\"TabIndicatorColor\">#FFFFFF</color>\n\n</resources>\n"
  },
  {
    "path": "app/src/main/res/values/dimens.xml",
    "content": "<resources>\n\n    <!--文字大小-->\n    <dimen name=\"text_special_size\">48px</dimen><!--40px以上-->\n    <dimen name=\"text_big_size\">36px</dimen><!--32-36-->\n    <dimen name=\"text_medium_size\">28px</dimen><!--24-32-->\n    <dimen name=\"text_small_size\">20px</dimen><!--16-22-->\n    <dimen name=\"text_small_size24\">24px</dimen><!--16-22-->\n    <dimen name=\"vertical_bar1_size\">40px</dimen>\n    <dimen name=\"vertical_layout_height\">105px</dimen>\n    <dimen name=\"vertical_layout_margin\">20px</dimen>\n\n    <dimen name=\"topbar_big_title_size\">58px</dimen>\n    <dimen name=\"item_title_size\">30px</dimen>\n\n\n    <dimen name=\"topbar_height\">98px</dimen>\n    <dimen name=\"topbar_icon_size\">44px</dimen>\n    <dimen name=\"topbar_icon_width_height\">98px</dimen>\n    <dimen name=\"content_left_right_margin_padding_small\">20px</dimen>\n    <dimen name=\"content_left_right_margin_padding_big\">30px</dimen>\n    <dimen name=\"setting_item_height\">125px</dimen>\n    <dimen name=\"top_icon_size\">65px</dimen>\n\n    <dimen name=\"tab_icon_size\">35px</dimen>\n    <dimen name=\"tab_text_size\">24px</dimen>\n\n\n    <dimen name=\"main_horizontal_margin\">30px</dimen>\n    <dimen name=\"item_margintop\">28px</dimen>\n    <dimen name=\"item_margintop_small\">20px</dimen>\n    <dimen name=\"main_v_margin_db\">7dp</dimen>\n    <dimen name=\"main_item_title_size\">38px</dimen>\n    <dimen name=\"topbar_big_icon_size\">66px</dimen>\n\n\n    //\n\n</resources>\n"
  },
  {
    "path": "app/src/main/res/values/strings.xml",
    "content": "<resources>\n    <string name=\"app_name\">玩Android</string>\n\n\n    <!--iconfont字体图标-->\n    <string name=\"tab_left\">&#xe620; </string> <!--左对齐-->\n    <string name=\"tab_right\">&#xe618; </string> <!--右对齐-->\n    <string name=\"ic_hot\">&#xe66d; </string> <!--火-->\n    <string name=\"ic_return\">&#xe6e5; </string> <!--返回-->\n    <string name=\"ic_share\">&#xe66c; </string> <!--分享-->\n    <string name=\"ic_search\">&#xe6a8; </string> <!--搜索-->\n    <string name=\"ic_collect_nor\">&#xe63c; </string> <!--未收藏-->\n    <string name=\"ic_collect_sel\">&#xe63b; </string> <!--已收藏-->\n    <string name=\"ic_about\">&#xe7ca; </string> <!--关于-->\n    <string name=\"ic_close\">&#xe80b; </string> <!--关闭的叉-->\n    <string name=\"ic_home\">&#xe611; </string> <!--首页-->\n    <string name=\"ic_type\">&#xe654; </string> <!--分类-->\n    <string name=\"ic_user\">&#xe652; </string> <!--用户-->\n    <string name=\"ic_more\">&#xe62b; </string> <!--更多-->\n\n\n    //\n    <string name=\"action_share\">分享</string>\n    <string name=\"copy_link\">复制链接</string>\n    <string name=\"copy_link_success\">已复制链接</string>\n\n\n    <string name=\"about_me_tip\">\n        项目所用到的接口为鸿洋大神建立的玩安卓网站提供： www.wanandroid.com. \\n\\n\n        本项目源码地址为 https://github.com/luqinmao/TomatoIt. \\n\\n 哈哈，如果觉得可以的话给个start吧！\\n\\n\n        项目主要技术框架技术： \\n\\n okgo+ rxjava+mvp\n    </string>\n\n</resources>\n"
  },
  {
    "path": "app/src/main/res/values/styles.xml",
    "content": "<resources>\n\n    <!-- Base application theme. -->\n    <style name=\"AppTheme\" parent=\"AppTheme.Base\">\n        <!-- Customize your theme here. -->\n\n    </style>\n    <style name=\"AppTheme.Base\" parent=\"Theme.AppCompat.Light.NoActionBar\">\n        <!-- Customize your theme here. -->\n        <item name=\"colorPrimary\">@color/colorPrimary</item>\n        <item name=\"colorPrimaryDark\">@color/colorPrimaryDark</item>\n        <item name=\"colorAccent\">@color/colorAccent</item>\n        <!--去掉系统默认的标题栏-->\n        <item name=\"windowNoTitle\">true</item>\n        <item name=\"windowActionBar\">false</item>\n        <!-- 设置activity切换动画 -->\n        <item name=\"android:windowAnimationStyle\">@style/activityAnimation</item>\n    </style>\n\n    <!-- animation 样式 -->\n    <style name=\"activityAnimation\" parent=\"@android:style/Animation\">\n        <item name=\"android:activityOpenEnterAnimation\">@anim/slide_right_in</item>\n        <item name=\"android:activityOpenExitAnimation\">@anim/slide_left_out</item>\n        <item name=\"android:activityCloseEnterAnimation\">@anim/slide_left_in</item>\n        <item name=\"android:activityCloseExitAnimation\">@anim/slide_right_out</item>\n    </style>\n\n\n    <!--圆角Dialog-->\n    <style name=\"MyDialog\" parent=\"@android:style/Theme.Dialog\">\n        <item name=\"android:windowFrame\">@null</item>\n        <item name=\"android:windowIsFloating\">true</item>\n        <item name=\"android:windowIsTranslucent\">true</item>\n        <item name=\"android:windowNoTitle\">true</item>\n        <item name=\"android:background\">@android:color/transparent</item>\n        <item name=\"android:windowBackground\">@android:color/transparent</item>\n        <item name=\"android:backgroundDimEnabled\">true</item>\n        <item name=\"android:backgroundDimAmount\">0.6</item>\n    </style>\n\n\n    <!--topbar iconfont style-->\n    <style name=\"topbar_icon_style\" >\n        <item name=\"android:layout_width\">@dimen/topbar_icon_width_height</item>\n        <item name=\"android:layout_height\">match_parent</item>\n        <item name=\"android:gravity\">center</item>\n        <item name=\"android:textColor\">@color/white</item>\n        <item name=\"android:textSize\">@dimen/topbar_icon_size</item>\n    </style>\n\n\n    <!--线样式-->\n    <style name=\"lineStyle\">\n        <item name=\"android:layout_width\">match_parent</item>\n        <item name=\"android:layout_height\">1.5px</item>\n        <item name=\"android:background\">@color/line</item>\n    </style>\n\n    <!--TabLayout-->\n    <style name=\"MyTabLayoutTextAppearance\" parent=\"TextAppearance.AppCompat.Widget.ActionBar.Title\">\n        <item name=\"android:textSize\">12sp</item>\n    </style>\n\n\n</resources>\n"
  },
  {
    "path": "app/src/test/java/com/lqm/tomatoit/ExampleUnitTest.java",
    "content": "package com.lqm.tomatoit;\n\nimport org.junit.Test;\n\nimport static org.junit.Assert.*;\n\n/**\n * Example local unit test, which will execute on the development machine (host).\n *\n * @see <a href=\"http://d.android.com/tools/testing\">Testing documentation</a>\n */\npublic class ExampleUnitTest {\n    @Test\n    public void addition_isCorrect() throws Exception {\n        assertEquals(4, 2 + 2);\n    }\n}"
  },
  {
    "path": "build.gradle",
    "content": "// Top-level build file where you can add configuration options common to all sub-projects/modules.\n\nbuildscript {\n    \n    repositories {\n        google()\n        jcenter()\n    }\n    dependencies {\n        classpath 'com.android.tools.build:gradle:3.0.1'\n        \n\n        // NOTE: Do not place your application dependencies here; they belong\n        // in the individual module build.gradle files\n    }\n}\n\nallprojects {\n    repositories {\n        google()\n        jcenter()\n        maven { url \"https://jitpack.io\" }\n    }\n}\n\ntask clean(type: Delete) {\n    delete rootProject.buildDir\n}\n"
  },
  {
    "path": "gradle/wrapper/gradle-wrapper.properties",
    "content": "#Tue Jan 02 09:34:21 CST 2018\ndistributionBase=GRADLE_USER_HOME\ndistributionPath=wrapper/dists\nzipStoreBase=GRADLE_USER_HOME\nzipStorePath=wrapper/dists\ndistributionUrl=https\\://services.gradle.org/distributions/gradle-4.1-all.zip\n"
  },
  {
    "path": "gradle.properties",
    "content": "# Project-wide Gradle settings.\n\n# IDE (e.g. Android Studio) users:\n# Gradle settings configured through the IDE *will override*\n# any settings specified in this file.\n\n# For more details on how to configure your build environment visit\n# http://www.gradle.org/docs/current/userguide/build_environment.html\n\n# Specifies the JVM arguments used for the daemon process.\n# The setting is particularly useful for tweaking memory settings.\norg.gradle.jvmargs=-Xmx1536m\n\n# When configured, Gradle will run in incubating parallel mode.\n# This option should only be used with decoupled projects. More details, visit\n# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects\n# org.gradle.parallel=true\n"
  },
  {
    "path": "gradlew",
    "content": "#!/usr/bin/env bash\n\n##############################################################################\n##\n##  Gradle start up script for UN*X\n##\n##############################################################################\n\n# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.\nDEFAULT_JVM_OPTS=\"\"\n\nAPP_NAME=\"Gradle\"\nAPP_BASE_NAME=`basename \"$0\"`\n\n# Use the maximum available, or set MAX_FD != -1 to use that value.\nMAX_FD=\"maximum\"\n\nwarn ( ) {\n    echo \"$*\"\n}\n\ndie ( ) {\n    echo\n    echo \"$*\"\n    echo\n    exit 1\n}\n\n# OS specific support (must be 'true' or 'false').\ncygwin=false\nmsys=false\ndarwin=false\ncase \"`uname`\" in\n  CYGWIN* )\n    cygwin=true\n    ;;\n  Darwin* )\n    darwin=true\n    ;;\n  MINGW* )\n    msys=true\n    ;;\nesac\n\n# Attempt to set APP_HOME\n# Resolve links: $0 may be a link\nPRG=\"$0\"\n# Need this for relative symlinks.\nwhile [ -h \"$PRG\" ] ; do\n    ls=`ls -ld \"$PRG\"`\n    link=`expr \"$ls\" : '.*-> \\(.*\\)$'`\n    if expr \"$link\" : '/.*' > /dev/null; then\n        PRG=\"$link\"\n    else\n        PRG=`dirname \"$PRG\"`\"/$link\"\n    fi\ndone\nSAVED=\"`pwd`\"\ncd \"`dirname \\\"$PRG\\\"`/\" >/dev/null\nAPP_HOME=\"`pwd -P`\"\ncd \"$SAVED\" >/dev/null\n\nCLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar\n\n# Determine the Java command to use to start the JVM.\nif [ -n \"$JAVA_HOME\" ] ; then\n    if [ -x \"$JAVA_HOME/jre/sh/java\" ] ; then\n        # IBM's JDK on AIX uses strange locations for the executables\n        JAVACMD=\"$JAVA_HOME/jre/sh/java\"\n    else\n        JAVACMD=\"$JAVA_HOME/bin/java\"\n    fi\n    if [ ! -x \"$JAVACMD\" ] ; then\n        die \"ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME\n\nPlease set the JAVA_HOME variable in your environment to match the\nlocation of your Java installation.\"\n    fi\nelse\n    JAVACMD=\"java\"\n    which java >/dev/null 2>&1 || die \"ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.\n\nPlease set the JAVA_HOME variable in your environment to match the\nlocation of your Java installation.\"\nfi\n\n# Increase the maximum file descriptors if we can.\nif [ \"$cygwin\" = \"false\" -a \"$darwin\" = \"false\" ] ; then\n    MAX_FD_LIMIT=`ulimit -H -n`\n    if [ $? -eq 0 ] ; then\n        if [ \"$MAX_FD\" = \"maximum\" -o \"$MAX_FD\" = \"max\" ] ; then\n            MAX_FD=\"$MAX_FD_LIMIT\"\n        fi\n        ulimit -n $MAX_FD\n        if [ $? -ne 0 ] ; then\n            warn \"Could not set maximum file descriptor limit: $MAX_FD\"\n        fi\n    else\n        warn \"Could not query maximum file descriptor limit: $MAX_FD_LIMIT\"\n    fi\nfi\n\n# For Darwin, add options to specify how the application appears in the dock\nif $darwin; then\n    GRADLE_OPTS=\"$GRADLE_OPTS \\\"-Xdock:name=$APP_NAME\\\" \\\"-Xdock:icon=$APP_HOME/media/gradle.icns\\\"\"\nfi\n\n# For Cygwin, switch paths to Windows format before running java\nif $cygwin ; then\n    APP_HOME=`cygpath --path --mixed \"$APP_HOME\"`\n    CLASSPATH=`cygpath --path --mixed \"$CLASSPATH\"`\n    JAVACMD=`cygpath --unix \"$JAVACMD\"`\n\n    # We build the pattern for arguments to be converted via cygpath\n    ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`\n    SEP=\"\"\n    for dir in $ROOTDIRSRAW ; do\n        ROOTDIRS=\"$ROOTDIRS$SEP$dir\"\n        SEP=\"|\"\n    done\n    OURCYGPATTERN=\"(^($ROOTDIRS))\"\n    # Add a user-defined pattern to the cygpath arguments\n    if [ \"$GRADLE_CYGPATTERN\" != \"\" ] ; then\n        OURCYGPATTERN=\"$OURCYGPATTERN|($GRADLE_CYGPATTERN)\"\n    fi\n    # Now convert the arguments - kludge to limit ourselves to /bin/sh\n    i=0\n    for arg in \"$@\" ; do\n        CHECK=`echo \"$arg\"|egrep -c \"$OURCYGPATTERN\" -`\n        CHECK2=`echo \"$arg\"|egrep -c \"^-\"`                                 ### Determine if an option\n\n        if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then                    ### Added a condition\n            eval `echo args$i`=`cygpath --path --ignore --mixed \"$arg\"`\n        else\n            eval `echo args$i`=\"\\\"$arg\\\"\"\n        fi\n        i=$((i+1))\n    done\n    case $i in\n        (0) set -- ;;\n        (1) set -- \"$args0\" ;;\n        (2) set -- \"$args0\" \"$args1\" ;;\n        (3) set -- \"$args0\" \"$args1\" \"$args2\" ;;\n        (4) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" ;;\n        (5) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" ;;\n        (6) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" \"$args5\" ;;\n        (7) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" \"$args5\" \"$args6\" ;;\n        (8) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" \"$args5\" \"$args6\" \"$args7\" ;;\n        (9) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" \"$args5\" \"$args6\" \"$args7\" \"$args8\" ;;\n    esac\nfi\n\n# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules\nfunction splitJvmOpts() {\n    JVM_OPTS=(\"$@\")\n}\neval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS\nJVM_OPTS[${#JVM_OPTS[*]}]=\"-Dorg.gradle.appname=$APP_BASE_NAME\"\n\nexec \"$JAVACMD\" \"${JVM_OPTS[@]}\" -classpath \"$CLASSPATH\" org.gradle.wrapper.GradleWrapperMain \"$@\"\n"
  },
  {
    "path": "gradlew.bat",
    "content": "@if \"%DEBUG%\" == \"\" @echo off\n@rem ##########################################################################\n@rem\n@rem  Gradle startup script for Windows\n@rem\n@rem ##########################################################################\n\n@rem Set local scope for the variables with windows NT shell\nif \"%OS%\"==\"Windows_NT\" setlocal\n\n@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.\nset DEFAULT_JVM_OPTS=\n\nset DIRNAME=%~dp0\nif \"%DIRNAME%\" == \"\" set DIRNAME=.\nset APP_BASE_NAME=%~n0\nset APP_HOME=%DIRNAME%\n\n@rem Find java.exe\nif defined JAVA_HOME goto findJavaFromJavaHome\n\nset JAVA_EXE=java.exe\n%JAVA_EXE% -version >NUL 2>&1\nif \"%ERRORLEVEL%\" == \"0\" goto init\n\necho.\necho ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.\necho.\necho Please set the JAVA_HOME variable in your environment to match the\necho location of your Java installation.\n\ngoto fail\n\n:findJavaFromJavaHome\nset JAVA_HOME=%JAVA_HOME:\"=%\nset JAVA_EXE=%JAVA_HOME%/bin/java.exe\n\nif exist \"%JAVA_EXE%\" goto init\n\necho.\necho ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%\necho.\necho Please set the JAVA_HOME variable in your environment to match the\necho location of your Java installation.\n\ngoto fail\n\n:init\n@rem Get command-line arguments, handling Windowz variants\n\nif not \"%OS%\" == \"Windows_NT\" goto win9xME_args\nif \"%@eval[2+2]\" == \"4\" goto 4NT_args\n\n:win9xME_args\n@rem Slurp the command line arguments.\nset CMD_LINE_ARGS=\nset _SKIP=2\n\n:win9xME_args_slurp\nif \"x%~1\" == \"x\" goto execute\n\nset CMD_LINE_ARGS=%*\ngoto execute\n\n:4NT_args\n@rem Get arguments from the 4NT Shell from JP Software\nset CMD_LINE_ARGS=%$\n\n:execute\n@rem Setup the command line\n\nset CLASSPATH=%APP_HOME%\\gradle\\wrapper\\gradle-wrapper.jar\n\n@rem Execute Gradle\n\"%JAVA_EXE%\" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% \"-Dorg.gradle.appname=%APP_BASE_NAME%\" -classpath \"%CLASSPATH%\" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%\n\n:end\n@rem End local scope for the variables with windows NT shell\nif \"%ERRORLEVEL%\"==\"0\" goto mainEnd\n\n:fail\nrem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of\nrem the _cmd.exe /c_ return code!\nif  not \"\" == \"%GRADLE_EXIT_CONSOLE%\" exit 1\nexit /b 1\n\n:mainEnd\nif \"%OS%\"==\"Windows_NT\" endlocal\n\n:omega\n"
  },
  {
    "path": "iconfile/demo.css",
    "content": "*{margin: 0;padding: 0;list-style: none;}\n/*\nKISSY CSS Reset\n理念：1. reset 的目的不是清除浏览器的默认样式，这仅是部分工作。清除和重置是紧密不可分的。\n2. reset 的目的不是让默认样式在所有浏览器下一致，而是减少默认样式有可能带来的问题。\n3. reset 期望提供一套普适通用的基础样式。但没有银弹，推荐根据具体需求，裁剪和修改后再使用。\n特色：1. 适应中文；2. 基于最新主流浏览器。\n维护：玉伯<lifesinger@gmail.com>, 正淳<ragecarrier@gmail.com>\n */\n\n/** 清除内外边距 **/\nbody, h1, h2, h3, h4, h5, h6, hr, p, blockquote, /* structural elements 结构元素 */\ndl, dt, dd, ul, ol, li, /* list elements 列表元素 */\npre, /* text formatting elements 文本格式元素 */\nform, fieldset, legend, button, input, textarea, /* form elements 表单元素 */\nth, td /* table elements 表格元素 */ {\n  margin: 0;\n  padding: 0;\n}\n\n/** 设置默认字体 **/\nbody,\nbutton, input, select, textarea /* for ie */ {\n  font: 12px/1.5 tahoma, arial, \\5b8b\\4f53, sans-serif;\n}\nh1, h2, h3, h4, h5, h6 { font-size: 100%; }\naddress, cite, dfn, em, var { font-style: normal; } /* 将斜体扶正 */\ncode, kbd, pre, samp { font-family: courier new, courier, monospace; } /* 统一等宽字体 */\nsmall { font-size: 12px; } /* 小于 12px 的中文很难阅读，让 small 正常化 */\n\n/** 重置列表元素 **/\nul, ol { list-style: none; }\n\n/** 重置文本格式元素 **/\na { text-decoration: none; }\na:hover { text-decoration: underline; }\n\n\n/** 重置表单元素 **/\nlegend { color: #000; } /* for ie6 */\nfieldset, img { border: 0; } /* img 搭车：让链接里的 img 无边框 */\nbutton, input, select, textarea { font-size: 100%; } /* 使得表单元素在 ie 下能继承字体大小 */\n/* 注：optgroup 无法扶正 */\n\n/** 重置表格元素 **/\ntable { border-collapse: collapse; border-spacing: 0; }\n\n/* 清除浮动 */\n.ks-clear:after, .clear:after {\n  content: '\\20';\n  display: block;\n  height: 0;\n  clear: both;\n}\n.ks-clear, .clear {\n  *zoom: 1;\n}\n\n.main {\n  padding: 30px 100px;\nwidth: 960px;\nmargin: 0 auto;\n}\n.main h1{font-size:36px; color:#333; text-align:left;margin-bottom:30px; border-bottom: 1px solid #eee;}\n\n.helps{margin-top:40px;}\n.helps pre{\n  padding:20px;\n  margin:10px 0;\n  border:solid 1px #e7e1cd;\n  background-color: #fffdef;\n  overflow: auto;\n}\n\n.icon_lists{\n  width: 100% !important;\n\n}\n\n.icon_lists li{\n  float:left;\n  width: 100px;\n  height:180px;\n  text-align: center;\n  list-style: none !important;\n}\n.icon_lists .icon{\n  font-size: 42px;\n  line-height: 100px;\n  margin: 10px 0;\n  color:#333;\n  -webkit-transition: font-size 0.25s ease-out 0s;\n  -moz-transition: font-size 0.25s ease-out 0s;\n  transition: font-size 0.25s ease-out 0s;\n\n}\n.icon_lists .icon:hover{\n  font-size: 100px;\n}\n\n\n\n.markdown {\n  color: #666;\n  font-size: 14px;\n  line-height: 1.8;\n}\n\n.highlight {\n  line-height: 1.5;\n}\n\n.markdown img {\n  vertical-align: middle;\n  max-width: 100%;\n}\n\n.markdown h1 {\n  color: #404040;\n  font-weight: 500;\n  line-height: 40px;\n  margin-bottom: 24px;\n}\n\n.markdown h2,\n.markdown h3,\n.markdown h4,\n.markdown h5,\n.markdown h6 {\n  color: #404040;\n  margin: 1.6em 0 0.6em 0;\n  font-weight: 500;\n  clear: both;\n}\n\n.markdown h1 {\n  font-size: 28px;\n}\n\n.markdown h2 {\n  font-size: 22px;\n}\n\n.markdown h3 {\n  font-size: 16px;\n}\n\n.markdown h4 {\n  font-size: 14px;\n}\n\n.markdown h5 {\n  font-size: 12px;\n}\n\n.markdown h6 {\n  font-size: 12px;\n}\n\n.markdown hr {\n  height: 1px;\n  border: 0;\n  background: #e9e9e9;\n  margin: 16px 0;\n  clear: both;\n}\n\n.markdown p,\n.markdown pre {\n  margin: 1em 0;\n}\n\n.markdown > p,\n.markdown > blockquote,\n.markdown > .highlight,\n.markdown > ol,\n.markdown > ul {\n  width: 80%;\n}\n\n.markdown ul > li {\n  list-style: circle;\n}\n\n.markdown > ul li,\n.markdown blockquote ul > li {\n  margin-left: 20px;\n  padding-left: 4px;\n}\n\n.markdown > ul li p,\n.markdown > ol li p {\n  margin: 0.6em 0;\n}\n\n.markdown ol > li {\n  list-style: decimal;\n}\n\n.markdown > ol li,\n.markdown blockquote ol > li {\n  margin-left: 20px;\n  padding-left: 4px;\n}\n\n.markdown code {\n  margin: 0 3px;\n  padding: 0 5px;\n  background: #eee;\n  border-radius: 3px;\n}\n\n.markdown pre {\n  border-radius: 6px;\n  background: #f7f7f7;\n  padding: 20px;\n}\n\n.markdown pre code {\n  border: none;\n  background: #f7f7f7;\n  margin: 0;\n}\n\n.markdown strong,\n.markdown b {\n  font-weight: 600;\n}\n\n.markdown > table {\n  border-collapse: collapse;\n  border-spacing: 0px;\n  empty-cells: show;\n  border: 1px solid #e9e9e9;\n  width: 95%;\n  margin-bottom: 24px;\n}\n\n.markdown > table th {\n  white-space: nowrap;\n  color: #333;\n  font-weight: 600;\n\n}\n\n.markdown > table th,\n.markdown > table td {\n  border: 1px solid #e9e9e9;\n  padding: 8px 16px;\n  text-align: left;\n}\n\n.markdown > table th {\n  background: #F7F7F7;\n}\n\n.markdown blockquote {\n  font-size: 90%;\n  color: #999;\n  border-left: 4px solid #e9e9e9;\n  padding-left: 0.8em;\n  margin: 1em 0;\n  font-style: italic;\n}\n\n.markdown blockquote p {\n  margin: 0;\n}\n\n.markdown .anchor {\n  opacity: 0;\n  transition: opacity 0.3s ease;\n  margin-left: 8px;\n}\n\n.markdown .waiting {\n  color: #ccc;\n}\n\n.markdown h1:hover .anchor,\n.markdown h2:hover .anchor,\n.markdown h3:hover .anchor,\n.markdown h4:hover .anchor,\n.markdown h5:hover .anchor,\n.markdown h6:hover .anchor {\n  opacity: 1;\n  display: inline-block;\n}\n\n.markdown > br,\n.markdown > p > br {\n  clear: both;\n}\n\n\n.hljs {\n  display: block;\n  background: white;\n  padding: 0.5em;\n  color: #333333;\n  overflow-x: auto;\n}\n\n.hljs-comment,\n.hljs-meta {\n  color: #969896;\n}\n\n.hljs-string,\n.hljs-variable,\n.hljs-template-variable,\n.hljs-strong,\n.hljs-emphasis,\n.hljs-quote {\n  color: #df5000;\n}\n\n.hljs-keyword,\n.hljs-selector-tag,\n.hljs-type {\n  color: #a71d5d;\n}\n\n.hljs-literal,\n.hljs-symbol,\n.hljs-bullet,\n.hljs-attribute {\n  color: #0086b3;\n}\n\n.hljs-section,\n.hljs-name {\n  color: #63a35c;\n}\n\n.hljs-tag {\n  color: #333333;\n}\n\n.hljs-title,\n.hljs-attr,\n.hljs-selector-id,\n.hljs-selector-class,\n.hljs-selector-attr,\n.hljs-selector-pseudo {\n  color: #795da3;\n}\n\n.hljs-addition {\n  color: #55a532;\n  background-color: #eaffea;\n}\n\n.hljs-deletion {\n  color: #bd2c00;\n  background-color: #ffecec;\n}\n\n.hljs-link {\n  text-decoration: underline;\n}\n\npre{\n  background: #fff;\n}\n\n\n\n\n\n"
  },
  {
    "path": "iconfile/demo_fontclass.html",
    "content": "\n<!DOCTYPE html>\n<html>\n<head>\n    <meta charset=\"utf-8\"/>\n    <title>IconFont</title>\n    <link rel=\"stylesheet\" href=\"demo.css\">\n    <link rel=\"stylesheet\" href=\"iconfont.css\">\n</head>\n<body>\n    <div class=\"main markdown\">\n        <h1>IconFont 图标</h1>\n        <ul class=\"icon_lists clear\">\n            \n                <li>\n                <i class=\"icon iconfont icon-qianjin\"></i>\n                    <div class=\"name\">前进</div>\n                    <div class=\"fontclass\">.icon-qianjin</div>\n                </li>\n            \n                <li>\n                <i class=\"icon iconfont icon-guanyu\"></i>\n                    <div class=\"name\">关于</div>\n                    <div class=\"fontclass\">.icon-guanyu</div>\n                </li>\n            \n                <li>\n                <i class=\"icon iconfont icon-huo1\"></i>\n                    <div class=\"name\">火</div>\n                    <div class=\"fontclass\">.icon-huo1</div>\n                </li>\n            \n                <li>\n                <i class=\"icon iconfont icon-yonghu\"></i>\n                    <div class=\"name\">用户</div>\n                    <div class=\"fontclass\">.icon-yonghu</div>\n                </li>\n            \n                <li>\n                <i class=\"icon iconfont icon-1\"></i>\n                    <div class=\"name\">首页</div>\n                    <div class=\"fontclass\">.icon-1</div>\n                </li>\n            \n                <li>\n                <i class=\"icon iconfont icon-shanchuguanbicha2\"></i>\n                    <div class=\"name\">删除关闭 叉2</div>\n                    <div class=\"fontclass\">.icon-shanchuguanbicha2</div>\n                </li>\n            \n                <li>\n                <i class=\"icon iconfont icon-shoucang\"></i>\n                    <div class=\"name\">收藏</div>\n                    <div class=\"fontclass\">.icon-shoucang</div>\n                </li>\n            \n                <li>\n                <i class=\"icon iconfont icon-gengduo\"></i>\n                    <div class=\"name\">更多</div>\n                    <div class=\"fontclass\">.icon-gengduo</div>\n                </li>\n            \n                <li>\n                <i class=\"icon iconfont icon-sousuo\"></i>\n                    <div class=\"name\">3.0-搜索</div>\n                    <div class=\"fontclass\">.icon-sousuo</div>\n                </li>\n            \n                <li>\n                <i class=\"icon iconfont icon-shezhi\"></i>\n                    <div class=\"name\">设置</div>\n                    <div class=\"fontclass\">.icon-shezhi</div>\n                </li>\n            \n                <li>\n                <i class=\"icon iconfont icon-shoucang1\"></i>\n                    <div class=\"name\">收藏</div>\n                    <div class=\"fontclass\">.icon-shoucang1</div>\n                </li>\n            \n                <li>\n                <i class=\"icon iconfont icon-fanhui\"></i>\n                    <div class=\"name\">返回</div>\n                    <div class=\"fontclass\">.icon-fanhui</div>\n                </li>\n            \n                <li>\n                <i class=\"icon iconfont icon-fenxiang\"></i>\n                    <div class=\"name\">分享</div>\n                    <div class=\"fontclass\">.icon-fenxiang</div>\n                </li>\n            \n                <li>\n                <i class=\"icon iconfont icon-youduiqi\"></i>\n                    <div class=\"name\">右对齐</div>\n                    <div class=\"fontclass\">.icon-youduiqi</div>\n                </li>\n            \n                <li>\n                <i class=\"icon iconfont icon-zuoduiqi\"></i>\n                    <div class=\"name\">左对齐</div>\n                    <div class=\"fontclass\">.icon-zuoduiqi</div>\n                </li>\n            \n                <li>\n                <i class=\"icon iconfont icon-fenxiang1\"></i>\n                    <div class=\"name\">分享</div>\n                    <div class=\"fontclass\">.icon-fenxiang1</div>\n                </li>\n            \n                <li>\n                <i class=\"icon iconfont icon-fenlei\"></i>\n                    <div class=\"name\">分类</div>\n                    <div class=\"fontclass\">.icon-fenlei</div>\n                </li>\n            \n                <li>\n                <i class=\"icon iconfont icon-fanhui1\"></i>\n                    <div class=\"name\">返回</div>\n                    <div class=\"fontclass\">.icon-fanhui1</div>\n                </li>\n            \n        </ul>\n\n        <h2 id=\"font-class-\">font-class引用</h2>\n        <hr>\n\n        <p>font-class是unicode使用方式的一种变种，主要是解决unicode书写不直观，语意不明确的问题。</p>\n        <p>与unicode使用方式相比，具有如下特点：</p>\n        <ul>\n        <li>兼容性良好，支持ie8+，及所有现代浏览器。</li>\n        <li>相比于unicode语意明确，书写更直观。可以很容易分辨这个icon是什么。</li>\n        <li>因为使用class来定义图标，所以当要替换图标时，只需要修改class里面的unicode引用。</li>\n        <li>不过因为本质上还是使用的字体，所以多色图标还是不支持的。</li>\n        </ul>\n        <p>使用步骤如下：</p>\n        <h3 id=\"-fontclass-\">第一步：引入项目下面生成的fontclass代码：</h3>\n\n\n        <pre><code class=\"lang-js hljs javascript\"><span class=\"hljs-comment\">&lt;link rel=\"stylesheet\" type=\"text/css\" href=\"./iconfont.css\"&gt;</span></code></pre>\n        <h3 id=\"-\">第二步：挑选相应图标并获取类名，应用于页面：</h3>\n        <pre><code class=\"lang-css hljs\">&lt;<span class=\"hljs-selector-tag\">i</span> <span class=\"hljs-selector-tag\">class</span>=\"<span class=\"hljs-selector-tag\">iconfont</span> <span class=\"hljs-selector-tag\">icon-xxx</span>\"&gt;&lt;/<span class=\"hljs-selector-tag\">i</span>&gt;</code></pre>\n        <blockquote>\n        <p>\"iconfont\"是你项目下的font-family。可以通过编辑项目查看，默认是\"iconfont\"。</p>\n        </blockquote>\n    </div>\n</body>\n</html>\n"
  },
  {
    "path": "iconfile/demo_symbol.html",
    "content": "\n<!DOCTYPE html>\n<html>\n<head>\n    <meta charset=\"utf-8\"/>\n    <title>IconFont</title>\n    <link rel=\"stylesheet\" href=\"demo.css\">\n    <script src=\"iconfont.js\"></script>\n\n    <style type=\"text/css\">\n        .icon {\n          /* 通过设置 font-size 来改变图标大小 */\n          width: 1em; height: 1em;\n          /* 图标和文字相邻时，垂直对齐 */\n          vertical-align: -0.15em;\n          /* 通过设置 color 来改变 SVG 的颜色/fill */\n          fill: currentColor;\n          /* path 和 stroke 溢出 viewBox 部分在 IE 下会显示\n             normalize.css 中也包含这行 */\n          overflow: hidden;\n        }\n\n    </style>\n</head>\n<body>\n    <div class=\"main markdown\">\n        <h1>IconFont 图标</h1>\n        <ul class=\"icon_lists clear\">\n            \n                <li>\n                    <svg class=\"icon\" aria-hidden=\"true\">\n                        <use xlink:href=\"#icon-qianjin\"></use>\n                    </svg>\n                    <div class=\"name\">前进</div>\n                    <div class=\"fontclass\">#icon-qianjin</div>\n                </li>\n            \n                <li>\n                    <svg class=\"icon\" aria-hidden=\"true\">\n                        <use xlink:href=\"#icon-guanyu\"></use>\n                    </svg>\n                    <div class=\"name\">关于</div>\n                    <div class=\"fontclass\">#icon-guanyu</div>\n                </li>\n            \n                <li>\n                    <svg class=\"icon\" aria-hidden=\"true\">\n                        <use xlink:href=\"#icon-huo1\"></use>\n                    </svg>\n                    <div class=\"name\">火</div>\n                    <div class=\"fontclass\">#icon-huo1</div>\n                </li>\n            \n                <li>\n                    <svg class=\"icon\" aria-hidden=\"true\">\n                        <use xlink:href=\"#icon-yonghu\"></use>\n                    </svg>\n                    <div class=\"name\">用户</div>\n                    <div class=\"fontclass\">#icon-yonghu</div>\n                </li>\n            \n                <li>\n                    <svg class=\"icon\" aria-hidden=\"true\">\n                        <use xlink:href=\"#icon-1\"></use>\n                    </svg>\n                    <div class=\"name\">首页</div>\n                    <div class=\"fontclass\">#icon-1</div>\n                </li>\n            \n                <li>\n                    <svg class=\"icon\" aria-hidden=\"true\">\n                        <use xlink:href=\"#icon-shanchuguanbicha2\"></use>\n                    </svg>\n                    <div class=\"name\">删除关闭 叉2</div>\n                    <div class=\"fontclass\">#icon-shanchuguanbicha2</div>\n                </li>\n            \n                <li>\n                    <svg class=\"icon\" aria-hidden=\"true\">\n                        <use xlink:href=\"#icon-shoucang\"></use>\n                    </svg>\n                    <div class=\"name\">收藏</div>\n                    <div class=\"fontclass\">#icon-shoucang</div>\n                </li>\n            \n                <li>\n                    <svg class=\"icon\" aria-hidden=\"true\">\n                        <use xlink:href=\"#icon-gengduo\"></use>\n                    </svg>\n                    <div class=\"name\">更多</div>\n                    <div class=\"fontclass\">#icon-gengduo</div>\n                </li>\n            \n                <li>\n                    <svg class=\"icon\" aria-hidden=\"true\">\n                        <use xlink:href=\"#icon-sousuo\"></use>\n                    </svg>\n                    <div class=\"name\">3.0-搜索</div>\n                    <div class=\"fontclass\">#icon-sousuo</div>\n                </li>\n            \n                <li>\n                    <svg class=\"icon\" aria-hidden=\"true\">\n                        <use xlink:href=\"#icon-shezhi\"></use>\n                    </svg>\n                    <div class=\"name\">设置</div>\n                    <div class=\"fontclass\">#icon-shezhi</div>\n                </li>\n            \n                <li>\n                    <svg class=\"icon\" aria-hidden=\"true\">\n                        <use xlink:href=\"#icon-shoucang1\"></use>\n                    </svg>\n                    <div class=\"name\">收藏</div>\n                    <div class=\"fontclass\">#icon-shoucang1</div>\n                </li>\n            \n                <li>\n                    <svg class=\"icon\" aria-hidden=\"true\">\n                        <use xlink:href=\"#icon-fanhui\"></use>\n                    </svg>\n                    <div class=\"name\">返回</div>\n                    <div class=\"fontclass\">#icon-fanhui</div>\n                </li>\n            \n                <li>\n                    <svg class=\"icon\" aria-hidden=\"true\">\n                        <use xlink:href=\"#icon-fenxiang\"></use>\n                    </svg>\n                    <div class=\"name\">分享</div>\n                    <div class=\"fontclass\">#icon-fenxiang</div>\n                </li>\n            \n                <li>\n                    <svg class=\"icon\" aria-hidden=\"true\">\n                        <use xlink:href=\"#icon-youduiqi\"></use>\n                    </svg>\n                    <div class=\"name\">右对齐</div>\n                    <div class=\"fontclass\">#icon-youduiqi</div>\n                </li>\n            \n                <li>\n                    <svg class=\"icon\" aria-hidden=\"true\">\n                        <use xlink:href=\"#icon-zuoduiqi\"></use>\n                    </svg>\n                    <div class=\"name\">左对齐</div>\n                    <div class=\"fontclass\">#icon-zuoduiqi</div>\n                </li>\n            \n                <li>\n                    <svg class=\"icon\" aria-hidden=\"true\">\n                        <use xlink:href=\"#icon-fenxiang1\"></use>\n                    </svg>\n                    <div class=\"name\">分享</div>\n                    <div class=\"fontclass\">#icon-fenxiang1</div>\n                </li>\n            \n                <li>\n                    <svg class=\"icon\" aria-hidden=\"true\">\n                        <use xlink:href=\"#icon-fenlei\"></use>\n                    </svg>\n                    <div class=\"name\">分类</div>\n                    <div class=\"fontclass\">#icon-fenlei</div>\n                </li>\n            \n                <li>\n                    <svg class=\"icon\" aria-hidden=\"true\">\n                        <use xlink:href=\"#icon-fanhui1\"></use>\n                    </svg>\n                    <div class=\"name\">返回</div>\n                    <div class=\"fontclass\">#icon-fanhui1</div>\n                </li>\n            \n        </ul>\n\n\n        <h2 id=\"symbol-\">symbol引用</h2>\n        <hr>\n\n        <p>这是一种全新的使用方式，应该说这才是未来的主流，也是平台目前推荐的用法。相关介绍可以参考这篇<a href=\"\">文章</a>\n        这种用法其实是做了一个svg的集合，与另外两种相比具有如下特点：</p>\n        <ul>\n          <li>支持多色图标了，不再受单色限制。</li>\n          <li>通过一些技巧，支持像字体那样，通过<code>font-size</code>,<code>color</code>来调整样式。</li>\n          <li>兼容性较差，支持 ie9+,及现代浏览器。</li>\n          <li>浏览器渲染svg的性能一般，还不如png。</li>\n        </ul>\n        <p>使用步骤如下：</p>\n        <h3 id=\"-symbol-\">第一步：引入项目下面生成的symbol代码：</h3>\n        <pre><code class=\"lang-js hljs javascript\"><span class=\"hljs-comment\">&lt;script src=\"./iconfont.js\"&gt;&lt;/script&gt;</span></code></pre>\n        <h3 id=\"-css-\">第二步：加入通用css代码（引入一次就行）：</h3>\n        <pre><code class=\"lang-js hljs javascript\">&lt;style type=<span class=\"hljs-string\">\"text/css\"</span>&gt;\n.icon {\n   width: <span class=\"hljs-number\">1</span>em; height: <span class=\"hljs-number\">1</span>em;\n   vertical-align: <span class=\"hljs-number\">-0.15</span>em;\n   fill: currentColor;\n   overflow: hidden;\n}\n&lt;<span class=\"hljs-regexp\">/style&gt;</span></code></pre>\n        <h3 id=\"-\">第三步：挑选相应图标并获取类名，应用于页面：</h3>\n        <pre><code class=\"lang-js hljs javascript\">&lt;svg <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span></span>=<span class=\"hljs-string\">\"icon\"</span> aria-hidden=<span class=\"hljs-string\">\"true\"</span>&gt;<span class=\"xml\"><span class=\"hljs-tag\">\n  &lt;<span class=\"hljs-name\">use</span> <span class=\"hljs-attr\">xlink:href</span>=<span class=\"hljs-string\">\"#icon-xxx\"</span>&gt;</span><span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">use</span>&gt;</span>\n</span>&lt;<span class=\"hljs-regexp\">/svg&gt;\n        </span></code></pre>\n    </div>\n</body>\n</html>\n"
  },
  {
    "path": "iconfile/demo_unicode.html",
    "content": "\n<!DOCTYPE html>\n<html>\n<head>\n    <meta charset=\"utf-8\"/>\n    <title>IconFont</title>\n    <link rel=\"stylesheet\" href=\"demo.css\">\n\n    <style type=\"text/css\">\n\n        @font-face {font-family: \"iconfont\";\n          src: url('iconfont.eot'); /* IE9*/\n          src: url('iconfont.eot#iefix') format('embedded-opentype'), /* IE6-IE8 */\n          url('iconfont.woff') format('woff'), /* chrome, firefox */\n          url('iconfont.ttf') format('truetype'), /* chrome, firefox, opera, Safari, Android, iOS 4.2+*/\n          url('iconfont.svg#iconfont') format('svg'); /* iOS 4.1- */\n        }\n\n        .iconfont {\n          font-family:\"iconfont\" !important;\n          font-size:16px;\n          font-style:normal;\n          -webkit-font-smoothing: antialiased;\n          -webkit-text-stroke-width: 0.2px;\n          -moz-osx-font-smoothing: grayscale;\n        }\n\n    </style>\n</head>\n<body>\n    <div class=\"main markdown\">\n        <h1>IconFont 图标</h1>\n        <ul class=\"icon_lists clear\">\n            \n                <li>\n                <i class=\"icon iconfont\">&#xe609;</i>\n                    <div class=\"name\">前进</div>\n                    <div class=\"code\">&amp;#xe609;</div>\n                </li>\n            \n                <li>\n                <i class=\"icon iconfont\">&#xe7ca;</i>\n                    <div class=\"name\">关于</div>\n                    <div class=\"code\">&amp;#xe7ca;</div>\n                </li>\n            \n                <li>\n                <i class=\"icon iconfont\">&#xe66d;</i>\n                    <div class=\"name\">火</div>\n                    <div class=\"code\">&amp;#xe66d;</div>\n                </li>\n            \n                <li>\n                <i class=\"icon iconfont\">&#xe652;</i>\n                    <div class=\"name\">用户</div>\n                    <div class=\"code\">&amp;#xe652;</div>\n                </li>\n            \n                <li>\n                <i class=\"icon iconfont\">&#xe611;</i>\n                    <div class=\"name\">首页</div>\n                    <div class=\"code\">&amp;#xe611;</div>\n                </li>\n            \n                <li>\n                <i class=\"icon iconfont\">&#xe80b;</i>\n                    <div class=\"name\">删除关闭 叉2</div>\n                    <div class=\"code\">&amp;#xe80b;</div>\n                </li>\n            \n                <li>\n                <i class=\"icon iconfont\">&#xe63b;</i>\n                    <div class=\"name\">收藏</div>\n                    <div class=\"code\">&amp;#xe63b;</div>\n                </li>\n            \n                <li>\n                <i class=\"icon iconfont\">&#xe62b;</i>\n                    <div class=\"name\">更多</div>\n                    <div class=\"code\">&amp;#xe62b;</div>\n                </li>\n            \n                <li>\n                <i class=\"icon iconfont\">&#xe6a8;</i>\n                    <div class=\"name\">3.0-搜索</div>\n                    <div class=\"code\">&amp;#xe6a8;</div>\n                </li>\n            \n                <li>\n                <i class=\"icon iconfont\">&#xe604;</i>\n                    <div class=\"name\">设置</div>\n                    <div class=\"code\">&amp;#xe604;</div>\n                </li>\n            \n                <li>\n                <i class=\"icon iconfont\">&#xe63c;</i>\n                    <div class=\"name\">收藏</div>\n                    <div class=\"code\">&amp;#xe63c;</div>\n                </li>\n            \n                <li>\n                <i class=\"icon iconfont\">&#xe617;</i>\n                    <div class=\"name\">返回</div>\n                    <div class=\"code\">&amp;#xe617;</div>\n                </li>\n            \n                <li>\n                <i class=\"icon iconfont\">&#xe63d;</i>\n                    <div class=\"name\">分享</div>\n                    <div class=\"code\">&amp;#xe63d;</div>\n                </li>\n            \n                <li>\n                <i class=\"icon iconfont\">&#xe618;</i>\n                    <div class=\"name\">右对齐</div>\n                    <div class=\"code\">&amp;#xe618;</div>\n                </li>\n            \n                <li>\n                <i class=\"icon iconfont\">&#xe620;</i>\n                    <div class=\"name\">左对齐</div>\n                    <div class=\"code\">&amp;#xe620;</div>\n                </li>\n            \n                <li>\n                <i class=\"icon iconfont\">&#xe66c;</i>\n                    <div class=\"name\">分享</div>\n                    <div class=\"code\">&amp;#xe66c;</div>\n                </li>\n            \n                <li>\n                <i class=\"icon iconfont\">&#xe654;</i>\n                    <div class=\"name\">分类</div>\n                    <div class=\"code\">&amp;#xe654;</div>\n                </li>\n            \n                <li>\n                <i class=\"icon iconfont\">&#xe6e5;</i>\n                    <div class=\"name\">返回</div>\n                    <div class=\"code\">&amp;#xe6e5;</div>\n                </li>\n            \n        </ul>\n        <h2 id=\"unicode-\">unicode引用</h2>\n        <hr>\n\n        <p>unicode是字体在网页端最原始的应用方式，特点是：</p>\n        <ul>\n        <li>兼容性最好，支持ie6+，及所有现代浏览器。</li>\n        <li>支持按字体的方式去动态调整图标大小，颜色等等。</li>\n        <li>但是因为是字体，所以不支持多色。只能使用平台里单色的图标，就算项目里有多色图标也会自动去色。</li>\n        </ul>\n        <blockquote>\n        <p>注意：新版iconfont支持多色图标，这些多色图标在unicode模式下将不能使用，如果有需求建议使用symbol的引用方式</p>\n        </blockquote>\n        <p>unicode使用步骤如下：</p>\n        <h3 id=\"-font-face\">第一步：拷贝项目下面生成的font-face</h3>\n        <pre><code class=\"lang-js hljs javascript\">@font-face {\n  font-family: <span class=\"hljs-string\">'iconfont'</span>;\n  src: url(<span class=\"hljs-string\">'iconfont.eot'</span>);\n  src: url(<span class=\"hljs-string\">'iconfont.eot?#iefix'</span>) format(<span class=\"hljs-string\">'embedded-opentype'</span>),\n  url(<span class=\"hljs-string\">'iconfont.woff'</span>) format(<span class=\"hljs-string\">'woff'</span>),\n  url(<span class=\"hljs-string\">'iconfont.ttf'</span>) format(<span class=\"hljs-string\">'truetype'</span>),\n  url(<span class=\"hljs-string\">'iconfont.svg#iconfont'</span>) format(<span class=\"hljs-string\">'svg'</span>);\n}\n</code></pre>\n        <h3 id=\"-iconfont-\">第二步：定义使用iconfont的样式</h3>\n        <pre><code class=\"lang-js hljs javascript\">.iconfont{\n  font-family:<span class=\"hljs-string\">\"iconfont\"</span> !important;\n  font-size:<span class=\"hljs-number\">16</span>px;font-style:normal;\n  -webkit-font-smoothing: antialiased;\n  -webkit-text-stroke-width: <span class=\"hljs-number\">0.2</span>px;\n  -moz-osx-font-smoothing: grayscale;\n}\n</code></pre>\n        <h3 id=\"-\">第三步：挑选相应图标并获取字体编码，应用于页面</h3>\n        <pre><code class=\"lang-js hljs javascript\">&lt;i <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span></span>=<span class=\"hljs-string\">\"iconfont\"</span>&gt;&amp;#x33;<span class=\"xml\"><span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">i</span>&gt;</span></span></code></pre>\n\n        <blockquote>\n        <p>\"iconfont\"是你项目下的font-family。可以通过编辑项目查看，默认是\"iconfont\"。</p>\n        </blockquote>\n    </div>\n\n\n</body>\n</html>\n"
  },
  {
    "path": "iconfile/iconfont.css",
    "content": "\n@font-face {font-family: \"iconfont\";\n  src: url('iconfont.eot?t=1517475467488'); /* IE9*/\n  src: url('iconfont.eot?t=1517475467488#iefix') format('embedded-opentype'), /* IE6-IE8 */\n  url('data:application/x-font-woff;charset=utf-8;base64,d09GRgABAAAAAA1EAAsAAAAAE8gAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAABHU1VCAAABCAAAADMAAABCsP6z7U9TLzIAAAE8AAAAQwAAAFZW7koLY21hcAAAAYAAAAD3AAAC3J+XDgVnbHlmAAACeAAACCEAAAtIGdZ12mhlYWQAAAqcAAAAMQAAADYRgzMTaGhlYQAACtAAAAAeAAAAJAkRBMdobXR4AAAK8AAAACIAAABQUSL//WxvY2EAAAsUAAAAKgAAACodYhp0bWF4cAAAC0AAAAAfAAAAIAEkAHFuYW1lAAALYAAAAUUAAAJtPlT+fXBvc3QAAAyoAAAAnAAAAOKpp9IFeJxjYGRgYOBikGPQYWB0cfMJYeBgYGGAAJAMY05meiJQDMoDyrGAaQ4gZoOIAgCKIwNPAHicY2Bk4WOcwMDKwMHUyXSGgYGhH0IzvmYwYuRgYGBiYGVmwAoC0lxTGBwYKl5wMzf8b2CIYW5gaAAKM4LkANi8C5AAeJzFks1tAkEMhd+EDbAs+dlwgOMqhygS6YDQBKIMuFMSFaQIykDisQXkTp7n7SFcklMUW99IYz2NPbYB3ALoiTdRAKlFQthR0ZTjPYxyvMCH7o1cOuxYsGTNGRvOueSKa2655+l8aKvL5ZtimhWLrNhcKX6ylDPZn7O/ZH/tPBQVbtDHHR7wiBJDjHGv/zyhVoUjTFT5QLL+L5n+0NL/pb62cT4/u9tE7DpUIgujfoKlUWfB2qjH4NSo2+DMqO9gYzQBcG4QbyyMpgK+m6iCS6NJgSsTO8i10fTAjUHk35rYOe5N7CNPJv5yPpjY47YyGHwBcgxa/QB4nJVWa2wU1xW+597Zmd3Z987sjHds79M7s17MGq/XuzZrvH6phoIfYNNSjFrRpKKCEksFhVQNsKVFoqaNqAptnT4itQnBFLmC/IiUoJK+okQlqtKQqlGaKmkDVQstQlRItPbQM7Nex1HVHx2Nzj1n7plzz+M7917iIOTBe+wyayASyZAOMkwmCAF+DSR9tBkSRiFH10A44Qirso8ZKSMhpJI5tgHUJC8r+WJBV3mB94MPotCZyBeNHDWgq9BHy5BXmgEijdpkKN0UYqdAbDCix82P0h9COJZq8vetNTe1VeR8XHIe8oRCkVDoa07e4XBSyvl9sF9VXA6XyJtPO/xa+HKslcbAEzG0LZ/wxhtDu08UHmlOqy6AahWkxrjv2UpQC+L7uKZIoYgQ8DobNG+qRYZD77sbJE+z/meCD2CsP2aULhAFhWKpqBug+0BBQ0jzJahAkd4H4DmP+ZTfaAI/bDB/6YNm3Q+fBMpBA1Bf1A1jGK3uN980f+PTo17YRsFBKNp+ic6wfuImfrTuAyEHRh+UoiClpE46A5X29grU6B+TT9LXVySoLL5EP73s33PsHTZBWghx6MVSHxh5RUCqhIQWaig82hRsaqB9XlFhYk2DrjcCi7sKUdcXtw3B6JWpIJfof97l3b+F+lTXeFjdfWr0U4c7enfQkUr/dzI7zde+/j5cy+u7Y6+dcDzy9nT2I9mxk6P75icJffDgQZVzsCrGoH44BuaDpG7wVE0UKFvH5qtH5xmbP1qd7+g6Mnu0a/YYcNyX6PbqOY47V5szR1rb1mZ7zfs7d2J67Py8webZJFlDhtB2QTf0dsgBAg3hwwuYZYSQ2hmMQr5YCq6MuDrrUJU8lqZCi0aqQ0/V8Kayed4ZPvlUsFVhSjb4g5NhJw/tWPLSZDdch9JUCeSWdjhccYYELB0I4AKn75jAISfAJVFyq2fOB/E5f0Z1SyKfWgfmNT2f16GtPsK6FBSGBB44gX/c5xIB8GdJsGOpcsSudcbqFiIoRC2Skk4kPtmOlUnqhQoYeqGYj0GpmFdkP6iKTONXzTsOB/ivXgW/w2HecYua68KCqMniT54R5Yj4zDlRk1znzousH2evrtJeGhfFCxdckiZeOCtGZPHsWVHWXM9eECPLuLnDLrEQia5UDSmmE1/FgpH14sceSp9fP51K7erZ9wSjucjWv4T8KX/oxjZtLWVP7GUh6Fq3rgvYkweHHkoffNHtBtH94sH0Q0MHvstwHd5qInYcfo2Dh3hJhGjEIERK9WGzqz6azEG6xssIF1ug+SjUhJc3Q7Y/C9gNmZQMx2uSXBfsr5YkQTWezcblZDiclD/gbJqxCKlh6SuY/yqur2OntEMtvFrMCBslRqOY9wLY2FXtjLC/3xWSWeBuXrx4k0M6fKQDW/quXApLi/3cK6dPv8LZVLrLF6vDNR2kbQZi565EfXKeCnUdpGTZjyvs56xCdpCHMfMdhm5gpttBR4Ta6DZSPrDQbeSsQYmBDV0hHIUYbjsIehyKFcAJC/t91gZUwqLhgL/jBPrflQNHvQsxEja70ek13Jw/E8yFKg2NAS6udqtNjlCTNhDKBY0A58m4nRvDSYBkeJNTzHi4gIGqA1pz0NGkdjfEuEBjQwVVM37ObbhdtmrCfHj9Fkq3rO8ZBRiFa6gyEGpDFfBkvK5laxtdvlYP4MJtoWE1srKwqgyjqhEAT6vPNWJbC29yeTIewIXbQgNqJGQtrMZ/D6M9PdYqPT2jdu7us+cYhztN4b9RW4esZOXPnrPTWcsCbtU2Q386sltRdo98dpZCuW3keiz23sjaXqCzk9CZZuvPd7ddHODSeaB7x/M7NGeLU/t45/hexnE70ukdHJs7UDqc3f4zp/PKx7JHSgfmzH+27UlxG7/RGvvmVi65p236MUq3d/v93dspfaxe72+xP7HPEJnEEfdQLGCtkwLwsgr2FlUwIJGDQhGPQkXmT8H33W6vu9ltlkURfoWMF1vqxOLbkqZJLC1FInAYvueOur2iaG5wN3vMvpo+zEBE1zQdm5vDNc+wm2wfaSfdZICMEpJO8kK6WNKNdC1RtbwpKsIktdICDj5cn2XYgtaOVATLNcsxWA2oze2bwuYRBuCE/XJXvDwGMFEujwOI5rfDG9L9U5RO9WeHZTjGwfTw0DSl019uLRa3FYtLr+Z6e3eVy/Tz+UFKB/MdQwBDb+aMdwMBLfKGgqflWLmMBR8rN2u/jcZhqr9/CrLJd4NB28rQ8DT9HFiGthWXfge9u9BYr3kehjrq5jDnDvtMguUzKYVZKCNa7PQKdqohYYWXSlgBSqt41dZZzdf06TjMBlQ1YD4aVJSlv7JLlrA4hnSByTZ/CycW6CGLX/qq9R3esn8w8DurqgkFQEmoi+MWRYm+vMzcUpIKvrfqGv/Ld+vmpCb68AiEhA9kxbo3FXS2ihdsndX8sv5F81HLFZhFV6hqex2wI1hYvGXzsuW77XXAjmDBNOwf3vp/fbfOlNfZj1iKrK0jzigYJeUDwMmq8CHACSt487f0hc0bPAh/i2U6BwEGO5Hy18OdscokpZOVWFcYUhSmKra4GG88LeP18qwCdLAzP2DRYPBpSbEVQAnPyZUpsITtpNYPVUcn5pQRAc8giRAXS6glQ4KSw7oSWpTOLe2hc3Ru8Qv/uH0blv7VCu/AH1qX/l3nAFsXSuarMzMzS4dB3Hrv3lZzANwT9+5NLN8T8ZzbTC/jKYf1KhlCh6B24BoJttkMvtB3ow/fF+A2/KLOk/8A5iob1QAAAHicY2BkYGAA4u9SDT3x/DZfGbhZGEDg2ozv3TD6////DazGzA1ALgcDE0gUAHV8DfAAAAB4nGNgZGBgbvjfwBDDavwfCFiNGYAiKEAEAKmyBuEAAHicY2FgYGB+ycDAwoCEWf7/R+HjxCB1ELWsxhAxAAQeB2sAAAAAAAAAdgCkAMYBBgE0AZoB4gIWAloCngM8A5YD0ARQBK4FDAVYBYoFpAAAeJxjYGRgYBBhSGVgYwABJiDmAkIGhv9gPgMAFM0BlgB4nGWPTU7DMBCFX/oHpBKqqGCH5AViASj9EatuWFRq911036ZOmyqJI8et1ANwHo7ACTgC3IA78EgnmzaWx9+8eWNPANzgBx6O3y33kT1cMjtyDRe4F65TfxBukF+Em2jjVbhF/U3YxzOmwm10YXmD17hi9oR3YQ8dfAjXcI1P4Tr1L+EG+Vu4iTv8CrfQ8erCPuZeV7iNRy/2x1YvnF6p5UHFockikzm/gple75KFrdLqnGtbxCZTg6BfSVOdaVvdU+zXQ+ciFVmTqgmrOkmMyq3Z6tAFG+fyUa8XiR6EJuVYY/62xgKOcQWFJQ6MMUIYZIjK6Og7VWb0r7FDwl57Vj3N53RbFNT/c4UBAvTPXFO6stJ5Ok+BPV8bUnV0K27LnpQ0kV7NSRKyQl7WtlRC6gE2ZVeOEXpc0Yk/KGdI/wAJWm7IAAAAeJxtjesOgjAUg1cv28C74oPMN5o4d2bMWQg5CfD0gsR/9k+bfG2qFmpWqf6rwgJLrLCGhoFFgRIbbLHDHgccccIZF1S4KnSmSZ5fiXUUz72sSLLTfeZIAndqyXNNMrF7qsnfbEtZas/RxMDxIVm3WdrJKAyUih92+umZJNln4G58iLbP8pDUJDtI/obih8Zu4HdIZp44pT7BUDb/') format('woff'),\n  url('iconfont.ttf?t=1517475467488') format('truetype'), /* chrome, firefox, opera, Safari, Android, iOS 4.2+*/\n  url('iconfont.svg?t=1517475467488#iconfont') format('svg'); /* iOS 4.1- */\n}\n\n.iconfont {\n  font-family:\"iconfont\" !important;\n  font-size:16px;\n  font-style:normal;\n  -webkit-font-smoothing: antialiased;\n  -moz-osx-font-smoothing: grayscale;\n}\n\n.icon-qianjin:before { content: \"\\e609\"; }\n\n.icon-guanyu:before { content: \"\\e7ca\"; }\n\n.icon-huo1:before { content: \"\\e66d\"; }\n\n.icon-yonghu:before { content: \"\\e652\"; }\n\n.icon-1:before { content: \"\\e611\"; }\n\n.icon-shanchuguanbicha2:before { content: \"\\e80b\"; }\n\n.icon-shoucang:before { content: \"\\e63b\"; }\n\n.icon-gengduo:before { content: \"\\e62b\"; }\n\n.icon-sousuo:before { content: \"\\e6a8\"; }\n\n.icon-shezhi:before { content: \"\\e604\"; }\n\n.icon-shoucang1:before { content: \"\\e63c\"; }\n\n.icon-fanhui:before { content: \"\\e617\"; }\n\n.icon-fenxiang:before { content: \"\\e63d\"; }\n\n.icon-youduiqi:before { content: \"\\e618\"; }\n\n.icon-zuoduiqi:before { content: \"\\e620\"; }\n\n.icon-fenxiang1:before { content: \"\\e66c\"; }\n\n.icon-fenlei:before { content: \"\\e654\"; }\n\n.icon-fanhui1:before { content: \"\\e6e5\"; }\n\n"
  },
  {
    "path": "iconfile/iconfont.js",
    "content": "(function(window){var svgSprite='<svg><symbol id=\"icon-qianjin\" viewBox=\"0 0 1024 1024\"><path d=\"M761.056 532.128c0.512-0.992 1.344-1.824 1.792-2.848 8.8-18.304 5.92-40.704-9.664-55.424L399.936 139.744c-19.264-18.208-49.632-17.344-67.872 1.888-18.208 19.264-17.376 49.632 1.888 67.872l316.96 299.84-315.712 304.288c-19.072 18.4-19.648 48.768-1.248 67.872 9.408 9.792 21.984 14.688 34.56 14.688 12 0 24-4.48 33.312-13.44l350.048-337.376c0.672-0.672 0.928-1.6 1.6-2.304 0.512-0.48 1.056-0.832 1.568-1.344C757.76 538.88 759.2 535.392 761.056 532.128z\"  ></path></symbol><symbol id=\"icon-guanyu\" viewBox=\"0 0 1024 1024\"><path d=\"M622.763175 175.034479c0 61.186548-49.578162 110.76471-110.763686 110.76471-61.153802 0-110.731964-49.578162-110.731964-110.76471 0-61.152778 49.578162-110.73094 110.731964-110.73094C573.185013 64.303538 622.763175 113.8817 622.763175 175.034479z\"  ></path><path d=\"M622.763175 959.696462 401.235802 959.696462 434.811502 349.706707 589.187475 349.706707Z\"  ></path></symbol><symbol id=\"icon-huo1\" viewBox=\"0 0 1024 1024\"><path d=\"M336 972.8c-60.8-128-28.8-201.6 19.2-268.8 51.2-76.8 64-150.4 64-150.4s41.6 51.2 25.6 134.4c70.4-80 83.2-208 73.6-256 160 112 230.4 358.4 137.6 537.6 492.8-281.6 121.6-700.8 57.6-745.6 22.4 48 25.6 128-19.2 166.4-73.6-281.6-256-336-256-336 22.4 144-76.8 300.8-172.8 419.2-3.2-57.6-6.4-96-38.4-153.6-6.4 105.6-86.4 188.8-108.8 294.4C89.6 758.4 140.8 860.8 336 972.8L336 972.8z\"  ></path></symbol><symbol id=\"icon-yonghu\" viewBox=\"0 0 1028 1024\"><path d=\"M815.814506 299.350645c0 165.306834-134.011812 299.350645-299.350645 299.350645s-299.350645-134.011812-299.350645-299.350645c0-165.306834 134.011812-299.350645 299.350645-299.350645s299.350645 134.011812 299.350645 299.350645z\"  ></path><path d=\"M763.52814 612.780851c-69.75782 55.070279-156.219118 85.661323-247.064279 85.661323-91.901128 0-179.1944-31.295022-249.27221-87.421268-184.698228 67.805881-267.19165 304.758476-267.19165 412.979094l1027.711884 0c0-107.260648-83.133402-342.549295-264.183744-411.18715z\"  ></path></symbol><symbol id=\"icon-1\" viewBox=\"0 0 1024 1024\"><path d=\"M936.741146 462.413652c-0.412392-14.641465-3.319605-25.442462-13.707187-40.293705-1.973958-3.010567-319.019801-341.836459-319.019801-341.836459-22.017456-23.469528-51.064003-34.71157-80.242556-34.738176L523.771603 45.311998c-0.418532-0.025583-0.938372 0.130983-1.457188 0.130983s-1.037632-0.156566-1.557472-0.130983l0 0.233314c-29.076222 0.025583-58.151421 11.268648-80.272231 34.738176 0 0-316.939419 338.825892-318.912353 341.836459-10.384511 14.851243-13.291724 25.65224-13.70821 40.293705 0 0 0 5.088902 0 5.504364 0 46.210461 37.488823 83.755566 83.70133 83.755566l20.041452 0 0 300.375162c0 48.91199 43.925419 88.529289 98.032734 88.529289 54.105269 0 97.927333-39.616276 97.927333-88.529289L407.566998 551.672558l113.190969 0 3.01466 0 113.162316 0 0 300.375162c0 48.91199 43.929512 88.529289 98.03478 88.529289s97.924263-39.616276 97.924263-88.529289L832.893986 551.672558l20.045545 0c46.314839 0 83.802638-37.543058 83.802638-83.755566 0-0.416486-0.102331-0.830925-0.102331-1.245364L936.741146 462.413652zM811.918255 159.621441l0.520863 0.649799 63.035662 66.618257c8.930393 9.397021 23.679305 9.813506 33.023114 0.933255 0.103354-0.051165 0.103354-0.155543 0.314155-0.258896l0.827855-0.778736c2.802836-2.90619 4.466732-5.502317 5.506411-10.488889 0.206708-0.934279 0.310062-1.973958 0.411369-2.959402 0.207731-1.090844 0.414439-2.128477 0.51984-3.428076l7.272637-123.629715c0.518816-9.009188-2.804882-17.029862-8.306176-22.949688l0-0.052189c-0.107447-0.077771-0.211824-0.181125-0.316202-0.258896-0.104377-0.104377-0.205685-0.207731-0.312108-0.338714l0 0.025583c-5.605671-5.865591-13.397125-9.605775-22.428825-9.578146l-123.889635 0.311085c-1.348718 0.052189-2.284019 0.130983-3.427052 0.234337-1.041726 0.076748-1.977028 0.104377-2.908236 0.284479-5.088902 0.75213-7.788383 2.232854-10.905374 4.958942l-0.831948 0.831948c0 0.051165-0.207731 0.128937-0.207731 0.181125-9.340739 8.905834-9.762341 23.651676-0.936325 33.04972L811.918255 159.621441z\"  ></path></symbol><symbol id=\"icon-shanchuguanbicha2\" viewBox=\"0 0 1024 1024\"><path d=\"M544 64C279.04 64 64 279.04 64 544S279.04 1024 544 1024c264.96 0 480-215.04 480-480S808.96 64 544 64zM759.04 758.4c-12.8 12.8-33.28 12.8-45.44 0L542.08 585.6l-174.08 172.16c-12.8 12.8-33.28 12.8-46.08 0-12.8-12.8-12.8-33.28 0-45.44l174.72-172.8L331.52 374.4c-12.8-12.8-12.8-33.28 0-45.44 12.8-12.8 33.28-12.8 45.44 0l165.12 165.76 167.68-165.76c12.8-12.8 33.28-12.8 46.08 0 12.8 12.8 12.8 33.28 0 45.44l-168.32 166.4 170.88 172.16C771.2 725.12 771.2 745.6 759.04 758.4z\"  ></path></symbol><symbol id=\"icon-shoucang\" viewBox=\"0 0 1024 1024\"><path d=\"M694.830025 110.467951c-76.670194 0-137.458675 38.335097-184.008874 101.313453-47.096644-62.978357-107.339704-101.313453-184.009897-101.313453-138.554636 0-251.372098 122.126478-251.372098 272.730545 0 89.814562 40.524972 152.793942 72.839959 203.178469 93.64582 147.31516 319.826166 305.58686 329.682651 313.254493 9.856485 7.667633 20.810978 10.951423 32.30987 10.951423 11.502985 0 22.454408-3.831258 32.30987-10.951423 9.860579-7.667633 236.036831-166.484755 330.23626-313.254493 32.30987-50.385551 72.833819-113.364931 72.833819-203.178469C945.653631 233.141898 832.842309 110.467951 694.830025 110.467951L694.830025 110.467951 694.830025 110.467951 694.830025 110.467951 694.830025 110.467951z\"  ></path></symbol><symbol id=\"icon-gengduo\" viewBox=\"0 0 1024 1024\"><path d=\"M197.844997 512m-74.694189 0a72.993 72.993 0 1 0 149.388379 0 72.993 72.993 0 1 0-149.388379 0Z\"  ></path><path d=\"M512 512m-74.694189 0a72.993 72.993 0 1 0 149.388379 0 72.993 72.993 0 1 0-149.388379 0Z\"  ></path><path d=\"M826.155003 512m-74.694189 0a72.993 72.993 0 1 0 149.388379 0 72.993 72.993 0 1 0-149.388379 0Z\"  ></path></symbol><symbol id=\"icon-sousuo\" viewBox=\"0 0 1024 1024\"><path d=\"M1004.8 915.2l-243.2-243.2c0 0-6.4-6.4-6.4-6.4C800 595.2 832 505.6 832 416 832 185.6 646.4 0 416 0S0 185.6 0 416 185.6 832 416 832c89.6 0 179.2-32 243.2-83.2 0 6.4 6.4 6.4 6.4 6.4l243.2 243.2c25.6 25.6 70.4 25.6 96 6.4C1030.4 979.2 1030.4 940.8 1004.8 915.2zM64 416C64 224 224 64 416 64S768 224 768 416 608 768 416 768 64 608 64 416z\"  ></path></symbol><symbol id=\"icon-shezhi\" viewBox=\"0 0 1024 1024\"><path d=\"M905.86 428.021l-0.002 0-71.797-15.945c-5.594-17.868-12.887-34.998-21.324-51.473l38.849-64.668c14.509-23.2 21.803-57.282 0-79.129l-39.588-39.547c-10.662-10.708-24.994-15.206-39.461-15.206-14.985 0-30.151 4.895-41.465 12.759l-62.972 40.112c-16.343-8.477-33.384-15.731-51.125-21.499l-16.121-72.621c-4.806-26.654-28.1-55.492-58.989-55.492l-55.932 0c-30.897 0-49.815 29.276-55.932 55.93l-17.963 71.746c-18.917 6.03-37.143 13.761-54.445 22.897l-64.538-41.075c-11.361-7.865-26.481-12.759-41.512-12.759-14.42 0-28.752 4.497-39.46 15.206l-39.543 39.547c-21.848 21.846-14.507 55.93 0 79.128l40.854 68.078c-7.644 15.469-14.461 31.374-19.705 48.064l-71.75 15.946c-26.654 4.812-55.495 28.099-55.495 58.995l0 55.93c0 30.889 29.277 49.813 55.932 55.93l72.665 18.13c5.029 15.428 11.273 30.237 18.4 44.569l-40.899 68.165c-14.508 23.157-21.807 57.24 0 79.087l39.588 39.548c10.663 10.704 24.994 15.248 39.455 15.248 14.991 0 30.151-4.894 41.471-12.758l64.672-41.249c17.432 9.217 35.744 17.041 54.795 23.071l17.917 71.573c6.118 26.653 25.035 55.931 55.932 55.931l55.933 0c30.89 0 54.184-28.84 58.989-55.493l16.122-72.838c17.565-5.685 34.433-12.853 50.559-21.194l63.1 40.199c11.313 7.866 26.481 12.76 41.465 12.76 14.467 0 28.8-4.546 39.461-15.248l39.588-39.548c21.803-21.847 14.509-55.93 0-79.089l-38.89-64.757c7.819-15.38 14.596-31.371 20.055-47.976l72.671-18.132c26.655-6.115 55.932-25.039 55.932-55.93l0-55.93C961.354 456.121 932.516 432.833 905.86 428.021zM514.684 648.029c-74.593 0-135.333-60.562-135.333-134.931s60.739-134.889 135.333-134.889c74.588 0 135.287 60.52 135.287 134.889S589.272 648.029 514.684 648.029z\"  ></path></symbol><symbol id=\"icon-shoucang1\" viewBox=\"0 0 1024 1024\"><path d=\"M702.131071 124.121212c-93.893818 0-161.150707 84.605414-190.140768 129.353697C482.974384 208.726626 415.747232 124.121212 321.858586 124.121212 187.126303 124.121212 77.550545 245.53503 77.550545 394.757172c0 69.772929 47.327677 169.808162 104.782869 222.157576 79.475071 102.110384 302.898424 285.923556 330.484364 285.923556 28.070788 0 246.702545-180.236929 327.611475-284.696566 58.46497-53.272566 106.020202-153.439677 106.020202-223.384566C946.449455 245.53503 836.858182 124.121212 702.131071 124.121212M888.84299 394.757172c0 55.802828-40.468687 139.081697-88.362667 181.838869-1.313616 1.197253-2.505697 2.504404-3.697778 3.944727C725.586101 673.303273 582.242909 788.363636 512.970343 838.758141 461.474263 801.065374 306.369293 683.62602 226.742949 580.176162c-1.071838-1.408-2.323394-2.721616-3.63701-3.943434-47.706505-42.702869-87.964444-125.763232-87.964444-181.475556 0-117.474263 83.752081-213.060525 186.717091-213.060525 66.368646 0 130.267798 71.83903 164.141253 143.066505 4.490343 9.438384 14.449778 15.317333 25.995636 15.317333 11.544566 0 21.500121-5.878949 26.020202-15.317333 33.842424-71.227475 97.711838-143.066505 164.115394-143.066505C805.090909 181.696646 888.84299 277.282909 888.84299 394.757172\" fill=\"#272636\" ></path></symbol><symbol id=\"icon-fanhui\" viewBox=\"0 0 1024 1024\"><path d=\"M143.895425 514.844444L557.176471 102.734641c14.222222-14.222222 14.222222-37.312418 0-51.534641l-12.883661-12.88366c-14.222222-14.222222-37.479739-14.222222-51.70196 0L40.491503 489.077124c-14.222222 14.222222-14.222222 37.312418 0 51.534641l452.099347 450.593464c14.222222 14.222222 37.479739 14.222222 51.70196 0l12.883661-12.88366c14.222222-14.222222 14.222222-37.312418 0-51.534641L143.895425 514.844444z\" fill=\"#252525\" ></path><path d=\"M948.873203 559.853595H143.895425c-24.930719 0-45.00915-20.245752-45.00915-45.009151 0-24.930719 20.245752-45.00915 45.00915-45.00915h804.977778c24.930719 0 45.00915 20.245752 45.00915 45.00915 0 24.763399-20.245752 45.00915-45.00915 45.009151z\" fill=\"#252525\" ></path></symbol><symbol id=\"icon-fenxiang\" viewBox=\"0 0 1024 1024\"><path d=\"M842.666667 682.666667c-61.866667 0-113.066667 34.133333-140.8 85.333333L315.733333 544c2.133333-10.666667 4.266667-21.333333 4.266667-32 0-17.066667-4.266667-34.133333-8.533333-51.2l364.8-211.2c25.6 29.866667 61.866667 46.933333 104.533333 46.933333 76.8 0 138.666667-61.866667 138.666667-138.666666S855.466667 21.333333 778.666667 21.333333C701.866667 21.333333 640 83.2 640 160c0 19.2 4.266667 38.4 10.666667 55.466667l-360.533334 209.066666C262.4 386.133333 219.733333 362.666667 170.666667 362.666667c-83.2 0-149.333333 66.133333-149.333334 149.333333s66.133333 149.333333 149.333334 149.333333c55.466667 0 104.533333-32 130.133333-76.8l386.133333 224c-2.133333 10.666667-4.266667 23.466667-4.266666 34.133334 0 87.466667 72.533333 160 160 160s160-72.533333 160-160-72.533333-160-160-160z m-64-618.666667C832 64 874.666667 106.666667 874.666667 160S832 256 778.666667 256 682.666667 213.333333 682.666667 160 725.333333 64 778.666667 64zM170.666667 618.666667c-59.733333 0-106.666667-46.933333-106.666667-106.666667s46.933333-106.666667 106.666667-106.666667 106.666667 46.933333 106.666666 106.666667-46.933333 106.666667-106.666666 106.666667z m672 341.333333c-64 0-117.333333-53.333333-117.333334-117.333333s53.333333-117.333333 117.333334-117.333334 117.333333 53.333333 117.333333 117.333334-53.333333 117.333333-117.333333 117.333333z\" fill=\"#666767\" ></path></symbol><symbol id=\"icon-youduiqi\" viewBox=\"0 0 1024 1024\"><path d=\"M590.848 0H984.615385a39.384615 39.384615 0 0 1 0 78.769231H590.848a39.384615 39.384615 0 0 1 0-78.769231zM39.384615 945.230769h945.23077a39.384615 39.384615 0 0 1 0 78.769231H39.384615a39.384615 39.384615 0 0 1 0-78.769231zM196.923077 236.307692h787.692308a39.384615 39.384615 0 0 1 0 78.769231h-787.692308a39.384615 39.384615 0 0 1 0-78.769231zM354.461538 472.615385h630.153847a39.384615 39.384615 0 0 1 0 78.76923h-630.153847a39.384615 39.384615 0 1 1 0-78.76923zM512 709.001846h472.615385a39.384615 39.384615 0 0 1 0 78.769231h-472.615385a39.384615 39.384615 0 0 1 0-78.769231z\" fill=\"#999999\" ></path></symbol><symbol id=\"icon-zuoduiqi\" viewBox=\"0 0 1024 1024\"><path d=\"M433.152 0H39.384615a39.384615 39.384615 0 0 0 0 78.769231h393.767385a39.384615 39.384615 0 0 0 0-78.769231zM984.615385 945.230769H39.384615a39.384615 39.384615 0 0 0 0 78.769231h945.23077a39.384615 39.384615 0 0 0 0-78.769231zM827.076923 236.307692H39.384615a39.384615 39.384615 0 0 0 0 78.769231h787.692308a39.384615 39.384615 0 0 0 0-78.769231zM669.538462 472.615385h-630.153847a39.384615 39.384615 0 0 0 0 78.76923h630.153847a39.384615 39.384615 0 1 0 0-78.76923zM512 709.001846h-472.615385a39.384615 39.384615 0 0 0 0 78.769231h472.615385a39.384615 39.384615 0 0 0 0-78.769231z\" fill=\"#999999\" ></path></symbol><symbol id=\"icon-fenxiang1\" viewBox=\"0 0 1024 1024\"><path d=\"M782.791111 643.982222c-47.786667 0-91.022222 22.755556-118.328889 59.164445l-282.168889-147.911111c4.551111-13.653333 4.551111-27.306667 4.551111-40.96 0-15.928889-2.275556-29.582222-6.826666-43.235556L614.4 304.924444c20.48 13.653333 43.235556 22.755556 70.542222 22.755556 65.991111 0 118.328889-52.337778 118.328889-118.328889S750.933333 93.297778 684.942222 93.297778s-118.328889 52.337778-118.328889 118.328889c0 11.377778 2.275556 22.755556 6.826667 34.133333L343.608889 409.6c-27.306667-25.031111-61.44-40.96-102.4-40.96-81.92 0-147.911111 65.991111-147.911111 147.911111s65.991111 147.911111 147.911111 147.911111c40.96 0 77.368889-15.928889 104.675555-43.235555L637.155556 773.688889c0 6.826667-2.275556 13.653333-2.275556 20.48 0 81.92 65.991111 147.911111 147.911111 147.911111s147.911111-65.991111 147.911111-147.911111-65.991111-150.186667-147.911111-150.186667z\" fill=\"\" ></path></symbol><symbol id=\"icon-fenlei\" viewBox=\"0 0 1331 1024\"><path d=\"M665.193292 620.907326L0 310.90556 665.193292 0l665.193292 310.90556zM427.495146 310.90556l237.698146 111.166814L903.795234 310.90556 665.193292 199.738747z\" fill=\"#272536\" ></path><path d=\"M666.097087 843.240953L148.222418 576.621359l40.670786-80.437776 477.203883 245.832304 476.300089-245.832304 40.670785 80.437776-516.970874 266.619594z\" fill=\"#272536\" ></path><path d=\"M666.097087 1024L148.222418 757.380406l40.670786-80.437776 477.203883 245.832304 476.300089-245.832304 40.670785 80.437776-516.970874 266.619594z\" fill=\"#272536\" ></path></symbol><symbol id=\"icon-fanhui1\" viewBox=\"0 0 1024 1024\"><path d=\"M843 444.6H348.2l185.7-185.8-62-61.9L242 426.8l-0.1-0.2-61.9 62.1h0.1l-0.1 0.1 61.9 62.1 0.1-0.2 229.9 229.9 62-61.9-185.7-185.8H843z\"  ></path></symbol></svg>';var script=function(){var scripts=document.getElementsByTagName(\"script\");return scripts[scripts.length-1]}();var shouldInjectCss=script.getAttribute(\"data-injectcss\");var ready=function(fn){if(document.addEventListener){if(~[\"complete\",\"loaded\",\"interactive\"].indexOf(document.readyState)){setTimeout(fn,0)}else{var loadFn=function(){document.removeEventListener(\"DOMContentLoaded\",loadFn,false);fn()};document.addEventListener(\"DOMContentLoaded\",loadFn,false)}}else if(document.attachEvent){IEContentLoaded(window,fn)}function IEContentLoaded(w,fn){var d=w.document,done=false,init=function(){if(!done){done=true;fn()}};var polling=function(){try{d.documentElement.doScroll(\"left\")}catch(e){setTimeout(polling,50);return}init()};polling();d.onreadystatechange=function(){if(d.readyState==\"complete\"){d.onreadystatechange=null;init()}}}};var before=function(el,target){target.parentNode.insertBefore(el,target)};var prepend=function(el,target){if(target.firstChild){before(el,target.firstChild)}else{target.appendChild(el)}};function appendSvg(){var div,svg;div=document.createElement(\"div\");div.innerHTML=svgSprite;svgSprite=null;svg=div.getElementsByTagName(\"svg\")[0];if(svg){svg.setAttribute(\"aria-hidden\",\"true\");svg.style.position=\"absolute\";svg.style.width=0;svg.style.height=0;svg.style.overflow=\"hidden\";prepend(svg,document.body)}}if(shouldInjectCss&&!window.__iconfont__svg__cssinject__){window.__iconfont__svg__cssinject__=true;try{document.write(\"<style>.svgfont {display: inline-block;width: 1em;height: 1em;fill: currentColor;vertical-align: -0.1em;font-size:16px;}</style>\")}catch(e){console&&console.log(e)}}ready(appendSvg)})(window)"
  },
  {
    "path": "iconfile/用浏览器打开deni_unicode可以查看相关icon.txt",
    "content": ""
  },
  {
    "path": "settings.gradle",
    "content": "include ':app'\n"
  }
]