[
  {
    "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/encodings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"Encoding\" addBOMForNewFiles=\"with NO BOM\" />\n</project>"
  },
  {
    "path": "README.md",
    "content": "# WanAndroid\n玩安卓http://www.wanandroid.com/ 客户端模块化设计app，包含MVP+Retrofit+Rxjava+Rxlifecycle+Glide+Eventbus+ARouter.\n构建一个平面化、简而美的玩安卓app客户端。<br/><br/>\n如果不清楚如何将Android工程模块化，请看<a href=\"https://blog.csdn.net/qq_37173653/article/details/84592893\">Android模块化使用</a>\n\n\n# API\napp采用<a href=\"http://www.wanandroid.com/blog/show/2\">玩安卓开放api</a>  \n\n# 主要功能\n首页:Banner<br/>\n首页:最新博文（5条）、最新项目（5条）<br/>\n体系:一级二级下面全部博文<br/>\n公众号:所有公众号列表<br/>\n公众号：某公众号下所有博文<br/>\n个人中心：登录、退出、收藏、清除缓存<br/>\n\n# 屏幕截图\n<img src=\"https://github.com/senonwx/WanAndroid/blob/master/screenshot/main2.png\"><img/><br/>\n<img src=\"https://github.com/senonwx/WanAndroid/blob/master/screenshot/main.png\"><img/><br/>\n<img src=\"https://github.com/senonwx/WanAndroid/blob/master/screenshot/main3.png\"><img/><br/></br>\n\n# 子模块打包\n工程采用的是模块化，如果想要单独跑或者打包各个子模块，那么请将gradle.properties改为</br>\nisBuildModule=true</br></br>\n如果需要整体打包app，则</br>\nisBuildModule=false</br>\n\n# 三方轮子\n<a href=\"https://github.com/ReactiveX/RxJava\">Rxjava</a> <br/>\n<a href=\"https://github.com/ReactiveX/RxAndroid\">RxAndroid</a><br/>\n<a href=\"https://github.com/square/retrofit\">Retrofit</a><br/>\n<a href=\"https://github.com/square/okhttp\">Okhttp</a><br/>\n<a href=\"https://github.com/alibaba/ARouter\">ARouter</a><br/>\n<a href=\"https://github.com/bumptech/glide\">Glide</a><br/>\n<a href=\"https://github.com/greenrobot/EventBus\">EventBus</a><br/>\n<a href=\"https://github.com/hongyangAndroid/FlowLayout\">FlowLayout</a><br/>\n<a href=\"https://github.com/pinguo-zhouwei/MZBannerView\">MZBannerView</a><br/>\n<a href=\"https://github.com/JessYanCoding/AndroidAutoSize\">AndroidAutoSize</a><br/>\n<a href=\"https://github.com/hanks-zyh/HTextView\">HTextView</a><br/>\n<a href=\"https://github.com/hdodenhof/CircleImageView\">CircleImageView</a><br/>\n<a href=\"https://github.com/jdsjlzx/LRecyclerView\">LRecyclerView</a><br/>\n<a href=\"https://github.com/pedant/sweet-alert-dialog\">Sweetalertdialog</a><br/>\n<a href=\"https://github.com/JsonChao/Awesome-WanAndroid\">Awesome-WanAndroid</a><br/>\n\n# APK下载\n<img src=\"https://github.com/senonwx/WanAndroid/blob/master/screenshot/qrcode.png\"><img/><br/>\n因为图方便，apk资源是放在leancloud上的，微信扫码下载不了，用手机浏览器扫码可下载。\n\n# 版本\n\n<h3>V 1.0.1</h3>\n1.修复各模块清单文件合并问题\n\n<h3>V 1.0.0</h3>\n1.第一版\n\n# Thanks\n感谢以上所有开源框架。项目用于学习交流，如果你觉得本项目好，谢谢star哦！\n\n"
  },
  {
    "path": "app/.gitignore",
    "content": "/build\n"
  },
  {
    "path": "app/build.gradle",
    "content": "apply plugin: 'com.android.application'\n\nandroid {\n    signingConfigs {\n        config {\n            keyAlias 'senon'\n            keyPassword '123456'\n            storeFile file('../senon.jks')\n            storePassword '123456'\n        }\n    }\n\n    compileSdkVersion rootProject.ext.android[\"compileSdkVersion\"]\n\n    defaultConfig {\n        applicationId \"com.senon.xfhmoudel\"\n\n        minSdkVersion rootProject.ext.android[\"minSdkVersion\"]\n        targetSdkVersion rootProject.ext.android[\"targetSdkVersion\"]\n        versionCode rootProject.ext.android[\"versionCode\"]\n        versionName rootProject.ext.android[\"versionName\"]\n\n        testInstrumentationRunner \"android.support.test.runner.AndroidJUnitRunner\"\n\n        javaCompileOptions {\n            annotationProcessorOptions {\n                includeCompileClasspath = true\n                arguments = [AROUTER_MODULE_NAME: project.getName()]\n            }\n        }\n    }\n    buildTypes {\n        release {\n            minifyEnabled false\n            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'\n        }\n        debug {\n            minifyEnabled false\n            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'\n            signingConfig signingConfigs.config\n        }\n    }\n    aaptOptions {\n        cruncherEnabled = false\n    }\n    lintOptions {\n        checkReleaseBuilds false\n        abortOnError false\n    }\n}\n\ndependencies {\n    implementation fileTree(dir: 'libs', include: ['*.jar'])\n    implementation 'com.android.support.constraint:constraint-layout:1.1.3'\n    androidTestImplementation 'com.android.support.test:runner:1.0.2'\n    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'\n    testImplementation rootProject.ext.dependencies[\"junit\"]\n\n\n\n    if (isBuildModule.toBoolean()) {\n        implementation project(':lib_common')\n    } else {\n        implementation project(':module_home')\n        implementation project(':module_life')\n        implementation project(':module_art')\n        implementation project(':module_talent')\n    }\n    annotationProcessor rootProject.ext.dependencies[\"butterknife-compiler\"]\n    annotationProcessor rootProject.ext.dependencies[\"router-compiler\"]\n\n    api rootProject.ext.dependencies[\"htextview-base\"]\n    api rootProject.ext.dependencies[\"htextview-fall\"]\n\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/senon/xfhmoudel/ExampleInstrumentedTest.java",
    "content": "package com.senon.xfhmoudel;\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.senon.xfhmoudel\", 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    xmlns:tools=\"http://schemas.android.com/tools\"\n    package=\"com.senon.xfhmoudel\">\n\n    <uses-permission android:name=\"android.permission.INTERNET\" />\n\n    <application\n        android:name=\".App\"\n        android:allowBackup=\"true\"\n        android:icon=\"@mipmap/ic_logo\"\n        android:label=\"@string/app_name\"\n        android:roundIcon=\"@mipmap/ic_launcher_round\"\n        android:supportsRtl=\"true\"\n        android:theme=\"@style/AppTheme\"\n        tools:replace=\"android:icon\">\n        <activity android:name=\".TestActivity\">\n\n        </activity>\n        <activity android:name=\".FragmentHomeActivity\"/>\n        <activity android:name=\".SplashActivity\">\n            <intent-filter>\n                <action android:name=\"android.intent.action.MAIN\" />\n\n                <category android:name=\"android.intent.category.LAUNCHER\" />\n            </intent-filter>\n        </activity>\n    </application>\n\n</manifest>"
  },
  {
    "path": "app/src/main/java/com/senon/xfhmoudel/App.java",
    "content": "package com.senon.xfhmoudel;\n\nimport com.alibaba.android.arouter.launcher.ARouter;\nimport com.senon.lib_common.base.BaseApplication;\nimport com.senon.lib_common.utils.ConstantUtils;\n\n/**\n * 工程Application\n */\npublic class App extends BaseApplication {\n    @Override\n    public void onCreate() {\n        super.onCreate();\n\n        initARouter();\n    }\n\n    private void initARouter() {\n        if (ConstantUtils.isAppDebug()) {\n            //开启InstantRun之后，一定要在ARouter.init之前调用openDebug\n            ARouter.openDebug();\n            ARouter.openLog();\n        }\n        ARouter.init(this);\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/senon/xfhmoudel/FragmentHomeActivity.java",
    "content": "package com.senon.xfhmoudel;\n\nimport android.support.annotation.Nullable;\nimport android.support.design.widget.TabLayout;\nimport android.support.v4.app.Fragment;\nimport android.support.v4.app.FragmentManager;\nimport android.support.v4.app.FragmentPagerAdapter;\nimport android.support.v4.content.ContextCompat;\nimport android.support.v4.view.ViewPager;\nimport android.support.v7.app.AppCompatActivity;\nimport android.os.Bundle;\nimport android.util.TypedValue;\nimport android.view.KeyEvent;\nimport android.view.LayoutInflater;\nimport android.view.View;\nimport android.widget.ImageView;\nimport android.widget.RelativeLayout;\nimport android.widget.TextView;\nimport com.alibaba.android.arouter.facade.annotation.Route;\nimport com.senon.lib_common.ComUtil;\nimport com.senon.lib_common.ConstantArouter;\nimport com.senon.lib_common.utils.StatusBarUtils;\nimport com.senon.lib_common.utils.ToastUtil;\nimport com.senon.module_art.fragment.ArtMainFragment;\nimport com.senon.module_home.fragment.HomeMainFragment;\nimport com.senon.module_life.fragment.LifeMainFragment;\nimport com.senon.module_talent.fragment.TalentMainFragment;\nimport java.util.ArrayList;\nimport java.util.List;\n\n/**\n * App主页\n */\n@Route(path = ConstantArouter.PATH_APP_FRAGMENTHOMEACTIVITY)\npublic class FragmentHomeActivity extends AppCompatActivity {\n\n    private ViewPager viewPager;\n    private TabLayout tabs;\n    private FragmentManager fragmentManager;//声明fragment管理\n    private List<Fragment> fragmentList = new ArrayList<>();\n\n    @Override\n    protected void onCreate(Bundle savedInstanceState) {\n        super.onCreate(savedInstanceState);\n\n        StatusBarUtils.with(this).init();\n        setContentView(R.layout.activity_fragment_home);\n        ComUtil.changeStatusBarTextColor(this,true);\n\n        viewPager = findViewById(R.id.vp);\n        tabs = findViewById(R.id.tabs);\n\n        initVp$Tab();\n    }\n\n    private void initVp$Tab() {\n        fragmentList.add(new HomeMainFragment());\n        fragmentList.add(new LifeMainFragment());\n        fragmentList.add(new ArtMainFragment());\n        fragmentList.add(new TalentMainFragment());\n\n        fragmentManager = getSupportFragmentManager();\n        FragmentPagerAdapter pagerAdapter = new MyFragmentPagerAdapter(fragmentManager);\n        viewPager.setAdapter(pagerAdapter);\n        viewPager.setOffscreenPageLimit(fragmentList.size());\n\n        tabs.setupWithViewPager(viewPager);//将TabLayout和ViewPager关联起来。\n        tabs.setTabsFromPagerAdapter(pagerAdapter);//给Tabs设置适配器\n\n        for (int i = 0; i < tabs.getTabCount(); i++) {\n            TabLayout.Tab tab = tabs.getTabAt(i);\n            if (tab != null) {\n                tab.setCustomView(getTabView(i));\n                View view = tab.getCustomView();\n                if(i == 0){\n                    setTextColor(view,0,true);\n                }\n            }\n        }\n\n        tabs.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {\n            @Override\n            public void onTabSelected(TabLayout.Tab tab) {\n                //在这里可以设置选中状态下  tab字体显示样式\n                View view = tab.getCustomView();\n                setTextColor(view,tab.getPosition(),true);\n            }\n            @Override\n            public void onTabUnselected(TabLayout.Tab tab) {\n                View view = tab.getCustomView();\n                setTextColor(view,tab.getPosition(),false);\n            }\n            @Override\n            public void onTabReselected(TabLayout.Tab tab) {\n            }\n        });\n    }\n\n    private String[] titles = {\"首页\",\"体系\",\"公众号\",\"我的\"};\n    private int[] colors = {R.color.login_bg_end_1,R.color.tablayout_tv_gray};\n    private int[] mipmaps = {R.mipmap.ic_tabbar_discover,R.mipmap.ic_tabbar_mainframe,R.mipmap.ic_tabbar_order,R.mipmap.ic_tabbar_me};\n    private int[] mipmaphls = {R.mipmap.ic_tabbar_discoverhl,R.mipmap.ic_tabbar_mainframehl,R.mipmap.ic_tabbar_orderhl,R.mipmap.ic_tabbar_mehl};\n\n    private View getTabView(int curPos) {\n        View view = LayoutInflater.from(this).inflate(R.layout.layout_fragmhome_tab, null);\n        ImageView igv = (ImageView) view.findViewById(R.id.tab_item_igv);\n        TextView tv = (TextView) view.findViewById(R.id.tab_item_tv);\n        tv.setText(titles[curPos]);\n        igv.setImageResource(mipmaps[curPos]);\n\n        setTextColor(tv,curPos,false);\n        return view;\n    }\n\n    private void setTextColor(View view,int position,boolean select){\n        if (null != view && view instanceof RelativeLayout) {\n            TextView tv = (TextView) view.findViewById(R.id.tab_item_tv);\n            ImageView igv = (ImageView) view.findViewById(R.id.tab_item_igv);\n\n            tv.setTextSize(TypedValue.COMPLEX_UNIT_MM,22);\n            tv.setTextColor(ContextCompat.getColor(this,select ? colors[0] : colors[1]));\n\n            igv.setImageResource(select ? mipmaphls[position] : mipmaps[position]);\n        }\n    }\n\n    //记录用户首次点击返回键的时间\n    private long firstTime=0;\n    @Override\n    public boolean onKeyUp(int keyCode, KeyEvent event) {\n        switch (keyCode) {\n            case KeyEvent.KEYCODE_BACK:\n                long secondTime = System.currentTimeMillis();\n                if (secondTime - firstTime > 2000) {\n                    ToastUtil.initToast(\"再按一次返回键退出程序\");\n                    firstTime = secondTime;\n                    return true;\n                } else {\n                    System.exit(0);\n                }\n                break;\n        }\n        return super.onKeyUp(keyCode, event);\n    }\n\n    //FragmentPagerAdapter\n    class MyFragmentPagerAdapter extends FragmentPagerAdapter {\n        public MyFragmentPagerAdapter(FragmentManager fm) {\n            super(fm);\n        }\n        @Override\n        public Fragment getItem(int position) {\n            return fragmentList.get(position);\n        }\n        @Override\n        public int getCount() {\n            return fragmentList.size();\n        }\n\n        @Nullable\n        @Override\n        public CharSequence getPageTitle(int position) {\n            return super.getPageTitle(position);\n        }\n    }\n}\n\n"
  },
  {
    "path": "app/src/main/java/com/senon/xfhmoudel/SplashActivity.java",
    "content": "package com.senon.xfhmoudel;\n\nimport android.content.pm.PackageManager;\nimport android.os.Bundle;\nimport android.support.v7.app.AppCompatActivity;\nimport android.view.View;\nimport android.widget.TextView;\nimport com.alibaba.android.arouter.facade.annotation.Route;\nimport com.alibaba.android.arouter.launcher.ARouter;\nimport com.hanks.htextview.base.HTextView;\nimport com.senon.lib_common.ComUtil;\nimport com.senon.lib_common.ConstantArouter;\nimport com.senon.lib_common.utils.LogUtils;\nimport com.senon.lib_common.utils.StatusBarUtils;\nimport java.util.concurrent.TimeUnit;\nimport io.reactivex.Observable;\nimport io.reactivex.Observer;\nimport io.reactivex.android.schedulers.AndroidSchedulers;\nimport io.reactivex.disposables.Disposable;\nimport io.reactivex.functions.Consumer;\nimport io.reactivex.functions.Function;\nimport io.reactivex.schedulers.Schedulers;\n\n/**\n * app 闪屏页\n */\n@Route(path = ConstantArouter.PATH_APP_SPLASHACTIVITY)\npublic class SplashActivity extends AppCompatActivity {\n\n    private final int count = 5;//count秒后跳过\n    private TextView version_tv,timmer_tv;\n    private Disposable disposable;\n    private HTextView anim_tv1, anim_tv2;\n\n    @Override\n    protected void onCreate(Bundle savedInstanceState) {\n        super.onCreate(savedInstanceState);\n        StatusBarUtils.with(this).init();\n        setContentView(R.layout.activity_splash);\n        ComUtil.changeStatusBarTextColor(this,true);\n\n        version_tv = findViewById(R.id.version_tv);\n        timmer_tv = findViewById(R.id.timmer_tv);\n        anim_tv1 = findViewById(R.id.anim_tv1);\n        anim_tv2 = findViewById(R.id.anim_tv2);\n\n        try {\n            version_tv.setText(\"版本 V\" + getPackageManager().getPackageInfo(this.getPackageName(), 0).versionName);\n        } catch (PackageManager.NameNotFoundException e) {\n            e.printStackTrace();\n            version_tv.setText(\"\");\n        }\n\n        timmer_tv.setOnClickListener(new View.OnClickListener() {\n            @Override\n            public void onClick(View view) {\n                if(disposable != null){\n                    disposable.dispose();\n                }\n                gotoMainAct();\n            }\n        });\n\n        initTimer();\n\n    }\n\n    private void initTimer() {\n        Observable.interval(0, 1, TimeUnit.SECONDS)//设置0延迟，每隔一秒发送一条数据\n                .take(count+1) //设置发送count+1次 因为是count~0秒\n                .map(new Function<Long, Long>() {\n                    @Override\n                    public Long apply(Long aLong) throws Exception {\n                        LogUtils.d(\"apply\"+(count-aLong));\n                        return count-aLong; //发送倒计时\n                    }\n                })\n                .doOnSubscribe(new Consumer<Disposable>() {// 观察者订阅时调用\n                    @Override\n                    public void accept(Disposable disposable){\n                        timmer_tv.setEnabled(true);//在发送数据的时候设置为可以跳过\n                        timmer_tv.setVisibility(View.VISIBLE);\n                    }\n                })\n                .subscribeOn(Schedulers.io())\n                .observeOn(AndroidSchedulers.mainThread())//操作UI要在UI线程\n                .subscribe(new Observer<Long>() {\n                    @Override\n                    public void onError(Throwable e) {\n                        e.printStackTrace();\n\n                    }\n\n                    @Override\n                    public void onComplete() {\n                        LogUtils.d(\"onCompleted: \"+System.currentTimeMillis());\n                        timmer_tv.setEnabled(false);\n\n                        gotoMainAct();\n                    }\n\n                    @Override\n                    public void onSubscribe(Disposable d) {\n                        timmer_tv.setText(count + \" 跳过\");\n\n                        disposable = d;\n                    }\n\n                    @Override\n                    public void onNext(Long aLong) { //接受到一条就是会操作一次UI\n                        LogUtils.d(\"onNext: \"+aLong);\n\n                        timmer_tv.setText(aLong + \" 跳过\");\n\n                        initHTextView(aLong);\n                    }\n                });\n    }\n\n\n    private void initHTextView(Long aLong) {\n        if(aLong == (2 * count / 3) + 1){//显示第一排文字的时间\n            anim_tv1.animateText(\"Talk is cheap.\");\n        }else if(aLong == count / 2 +1){//显示第二排文字的时间\n            anim_tv2.animateText(\"Show me the code!\");\n        }\n    }\n\n    private void gotoMainAct(){\n        ARouter.getInstance().build(ConstantArouter.PATH_APP_FRAGMENTHOMEACTIVITY)//指定跳到那个页面\n                .navigation();\n        finish();\n    }\n\n\n    @Override\n    protected void onDestroy() {\n        super.onDestroy();\n        if(disposable != null){\n            disposable.dispose();\n        }\n    }\n}\n\n"
  },
  {
    "path": "app/src/main/java/com/senon/xfhmoudel/TestActivity.java",
    "content": "package com.senon.xfhmoudel;\n\nimport android.support.v7.app.AppCompatActivity;\nimport android.os.Bundle;\nimport android.view.View;\n\nimport com.alibaba.android.arouter.facade.annotation.Route;\nimport com.alibaba.android.arouter.launcher.ARouter;\nimport com.senon.lib_common.ComUtil;\nimport com.senon.lib_common.ConstantArouter;\nimport com.senon.lib_common.ConstantLoginArouter;\nimport com.senon.lib_common.utils.StatusBarUtils;\n\n/**\n * app 模块主页面\n */\n@Route(path = ConstantLoginArouter.PATH_APP_MAINACTIVITY)\npublic class TestActivity extends AppCompatActivity {\n\n    @Override\n    protected void onCreate(Bundle savedInstanceState) {\n        super.onCreate(savedInstanceState);\n        StatusBarUtils.with(this).init();\n        setContentView(R.layout.activity_test);\n        ComUtil.changeStatusBarTextColor(this,true);\n\n    }\n\n    public void toA(View view){\n        // 1. 应用内简单的跳转(通过URL跳转在'进阶用法'中)\n//        ARouter.getInstance().build(ConstantLoginArouter.PATH_FIRST_MAINACTIVITY).navigation();\n\n//        String curUrl = ConstantLoginArouter.getCurRouter(this.getClass().getSimpleName());\n        String curUrl = ConstantLoginArouter.getCurRouter(ConstantLoginArouter.PATH_HOME_MAINACTIVITY);\n        ARouter.getInstance().build(ConstantLoginArouter.PATH_COMMON_LOGINACTIVITY)//指定跳到那个页面\n                .withString(\"targetUrl\",ConstantArouter.PATH_APP_FRAGMENTHOMEACTIVITY)//传入目标页面路由地址  可以在指定页面跳入到目标页面\n                .navigation();\n\n\n//        Uri testUriMix = Uri.parse(\"router://com.senon.firstmoduel/firstmoduel/firstmainactivity\");\n//        ARouter.getInstance().build(testUriMix)\n//                .withString(\"key1\", \"value1\")\n//                .navigation();\n    }\n\n    public void toB(View view){\n        ARouter.getInstance().build(ConstantArouter.PATH_APP_FRAGMENTHOMEACTIVITY)\n                .navigation();\n    }\n}\n\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_launcher_background.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"108dp\"\n    android:height=\"108dp\"\n    android:viewportHeight=\"108\"\n    android:viewportWidth=\"108\">\n    <path\n        android:fillColor=\"#26A69A\"\n        android:pathData=\"M0,0h108v108h-108z\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M9,0L9,108\"\n        android:strokeColor=\"#33FFFFFF\"\n        android:strokeWidth=\"0.8\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M19,0L19,108\"\n        android:strokeColor=\"#33FFFFFF\"\n        android:strokeWidth=\"0.8\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M29,0L29,108\"\n        android:strokeColor=\"#33FFFFFF\"\n        android:strokeWidth=\"0.8\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M39,0L39,108\"\n        android:strokeColor=\"#33FFFFFF\"\n        android:strokeWidth=\"0.8\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M49,0L49,108\"\n        android:strokeColor=\"#33FFFFFF\"\n        android:strokeWidth=\"0.8\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M59,0L59,108\"\n        android:strokeColor=\"#33FFFFFF\"\n        android:strokeWidth=\"0.8\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M69,0L69,108\"\n        android:strokeColor=\"#33FFFFFF\"\n        android:strokeWidth=\"0.8\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M79,0L79,108\"\n        android:strokeColor=\"#33FFFFFF\"\n        android:strokeWidth=\"0.8\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M89,0L89,108\"\n        android:strokeColor=\"#33FFFFFF\"\n        android:strokeWidth=\"0.8\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M99,0L99,108\"\n        android:strokeColor=\"#33FFFFFF\"\n        android:strokeWidth=\"0.8\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M0,9L108,9\"\n        android:strokeColor=\"#33FFFFFF\"\n        android:strokeWidth=\"0.8\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M0,19L108,19\"\n        android:strokeColor=\"#33FFFFFF\"\n        android:strokeWidth=\"0.8\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M0,29L108,29\"\n        android:strokeColor=\"#33FFFFFF\"\n        android:strokeWidth=\"0.8\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M0,39L108,39\"\n        android:strokeColor=\"#33FFFFFF\"\n        android:strokeWidth=\"0.8\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M0,49L108,49\"\n        android:strokeColor=\"#33FFFFFF\"\n        android:strokeWidth=\"0.8\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M0,59L108,59\"\n        android:strokeColor=\"#33FFFFFF\"\n        android:strokeWidth=\"0.8\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M0,69L108,69\"\n        android:strokeColor=\"#33FFFFFF\"\n        android:strokeWidth=\"0.8\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M0,79L108,79\"\n        android:strokeColor=\"#33FFFFFF\"\n        android:strokeWidth=\"0.8\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M0,89L108,89\"\n        android:strokeColor=\"#33FFFFFF\"\n        android:strokeWidth=\"0.8\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M0,99L108,99\"\n        android:strokeColor=\"#33FFFFFF\"\n        android:strokeWidth=\"0.8\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M19,29L89,29\"\n        android:strokeColor=\"#33FFFFFF\"\n        android:strokeWidth=\"0.8\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M19,39L89,39\"\n        android:strokeColor=\"#33FFFFFF\"\n        android:strokeWidth=\"0.8\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M19,49L89,49\"\n        android:strokeColor=\"#33FFFFFF\"\n        android:strokeWidth=\"0.8\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M19,59L89,59\"\n        android:strokeColor=\"#33FFFFFF\"\n        android:strokeWidth=\"0.8\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M19,69L89,69\"\n        android:strokeColor=\"#33FFFFFF\"\n        android:strokeWidth=\"0.8\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M19,79L89,79\"\n        android:strokeColor=\"#33FFFFFF\"\n        android:strokeWidth=\"0.8\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M29,19L29,89\"\n        android:strokeColor=\"#33FFFFFF\"\n        android:strokeWidth=\"0.8\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M39,19L39,89\"\n        android:strokeColor=\"#33FFFFFF\"\n        android:strokeWidth=\"0.8\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M49,19L49,89\"\n        android:strokeColor=\"#33FFFFFF\"\n        android:strokeWidth=\"0.8\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M59,19L59,89\"\n        android:strokeColor=\"#33FFFFFF\"\n        android:strokeWidth=\"0.8\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M69,19L69,89\"\n        android:strokeColor=\"#33FFFFFF\"\n        android:strokeWidth=\"0.8\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M79,19L79,89\"\n        android:strokeColor=\"#33FFFFFF\"\n        android:strokeWidth=\"0.8\" />\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/shape_splash_timer.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<shape xmlns:android=\"http://schemas.android.com/apk/res/android\" >\n\n    <!-- view背景色 -->\n    <solid android:color=\"#30000000\" />\n    <!-- 边框圆角 -->\n    <corners\n        android:radius=\"@dimen/mm30\" />\n\n</shape>"
  },
  {
    "path": "app/src/main/res/layout/activity_fragment_home.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    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\">\n\n    <android.support.v4.view.ViewPager\n        android:id=\"@+id/vp\"\n        android:layout_above=\"@+id/line_view\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\" />\n\n    <View\n        android:background=\"@color/color_232323\"\n        android:layout_above=\"@+id/tabs\"\n        android:id=\"@+id/line_view\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"@dimen/mm1\"/>\n    <android.support.design.widget.TabLayout\n        android:layout_alignParentBottom=\"true\"\n        android:id=\"@+id/tabs\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"@dimen/mm90\"\n        android:background=\"#fff\"\n        app:tabMode=\"scrollable\"\n        app:tabIndicatorColor=\"#00000000\"\n        app:tabMaxWidth=\"@dimen/mm187\"\n        app:tabMinWidth=\"@dimen/mm187\"\n        />\n\n</RelativeLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/activity_splash.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    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    >\n    <ImageView\n        android:scaleType=\"centerCrop\"\n        android:src=\"@mipmap/splash_bg\"\n        android:layout_centerVertical=\"true\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\" />\n    <ImageView\n        android:id=\"@+id/logo_igv\"\n        android:layout_marginTop=\"@dimen/mm400\"\n        android:scaleType=\"centerCrop\"\n        android:src=\"@mipmap/ic_logo\"\n        android:layout_centerHorizontal=\"true\"\n        android:layout_width=\"@dimen/mm100\"\n        android:layout_height=\"@dimen/mm100\" />\n    <ImageView\n        android:id=\"@+id/logo_tv\"\n        android:layout_marginTop=\"@dimen/mm30\"\n        android:layout_below=\"@+id/logo_igv\"\n        android:scaleType=\"centerCrop\"\n        android:src=\"@mipmap/splash_appname\"\n        android:layout_centerHorizontal=\"true\"\n        android:layout_width=\"@dimen/mm400\"\n        android:layout_height=\"@dimen/mm90\" />\n\n    <TextView\n        android:singleLine=\"true\"\n        android:layout_marginRight=\"@dimen/mm50\"\n        android:layout_marginTop=\"@dimen/mm80\"\n        android:layout_alignParentRight=\"true\"\n        android:id=\"@+id/timmer_tv\"\n        android:textColor=\"@color/common_white\"\n        android:background=\"@drawable/shape_splash_timer\"\n        android:text=\"跳过\"\n        android:textSize=\"@dimen/mm30\"\n        android:paddingLeft=\"@dimen/mm25\"\n        android:paddingRight=\"@dimen/mm25\"\n        android:paddingTop=\"@dimen/mm5\"\n        android:paddingBottom=\"@dimen/mm5\"\n        android:gravity=\"center_horizontal\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\" />\n    <TextView\n        android:layout_marginBottom=\"@dimen/mm50\"\n        android:layout_alignParentBottom=\"true\"\n        android:layout_centerHorizontal=\"true\"\n        android:id=\"@+id/version_tv\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:text=\"版本 V1.0\"\n        android:textColor=\"@color/common_black_777\"\n        android:textSize=\"@dimen/mm28\" />\n\n    <com.hanks.htextview.fall.FallTextView\n        android:layout_below=\"@+id/logo_tv\"\n        android:id=\"@+id/anim_tv1\"\n        android:layout_marginLeft=\"@dimen/mm100\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"@dimen/mm60\"\n        android:layout_marginTop=\"@dimen/mm150\"\n        android:gravity=\"center_vertical\"\n        android:textColor=\"@color/common_splash\"\n        android:textSize=\"@dimen/mm40\"/>\n\n    <com.hanks.htextview.fall.FallTextView\n        android:layout_alignParentRight=\"true\"\n        android:layout_below=\"@+id/anim_tv1\"\n        android:id=\"@+id/anim_tv2\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"@dimen/mm60\"\n        android:layout_marginTop=\"@dimen/mm30\"\n        android:gravity=\"center_vertical|right\"\n        android:layout_marginRight=\"@dimen/mm100\"\n        android:textColor=\"@color/common_splash\"\n        android:textSize=\"@dimen/mm40\"/>\n\n</RelativeLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/activity_test.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    android:orientation=\"vertical\"\n    >\n\n    <TextView\n        android:layout_marginTop=\"@dimen/mm500\"\n        android:layout_gravity=\"center\"\n        android:padding=\"@dimen/mm20\"\n        android:onClick=\"toA\"\n        android:background=\"#e4dada\"\n        android:textSize=\"@dimen/mm30\"\n        android:text=\"跳转到登录\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\" />\n    <TextView\n        android:layout_gravity=\"center\"\n        android:gravity=\"center\"\n        android:textSize=\"@dimen/mm36\"\n        android:onClick=\"toB\"\n        android:layout_marginTop=\"@dimen/mm50\"\n        android:background=\"#e4dada\"\n        android:padding=\"@dimen/mm20\"\n        android:text=\"不登录直接进入\"\n        android:layout_width=\"@dimen/mm500\"\n        android:layout_height=\"@dimen/mm200\" />\n</LinearLayout>\n"
  },
  {
    "path": "app/src/main/res/values/colors.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <color name=\"colorPrimary\">#3F51B5</color>\n    <color name=\"colorPrimaryDark\">#303F9F</color>\n    <color name=\"colorAccent\">#FF4081</color>\n</resources>\n"
  },
  {
    "path": "app/src/main/res/values/strings.xml",
    "content": "<resources>\n    <string name=\"app_name\">玩安卓</string>\n</resources>\n"
  },
  {
    "path": "app/src/main/res/values/styles.xml",
    "content": "<resources>\n\n    <style name=\"AppTheme\" parent=\"Theme.AppCompat.Light.NoActionBar\">\n        <!-- Customize your theme here. -->\n        <item name=\"colorPrimary\">@color/colorPrimary</item>\n        <item name=\"colorPrimaryDark\">@color/colorPrimaryDark</item>\n        <item name=\"colorAccent\">@color/colorAccent</item>\n    </style>\n\n\n</resources>\n"
  },
  {
    "path": "app/src/test/java/com/senon/xfhmoudel/ExampleUnitTest.java",
    "content": "package com.senon.xfhmoudel;\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.\napply from: \"dependencies.gradle\"\n\nbuildscript {\n    \n    repositories {\n        google()\n        jcenter()\n    }\n    dependencies {\n        classpath 'com.android.tools.build:gradle:3.0.1'\n\n        // NOTE: Do not place your application dependencies here; they belong\n        // in the individual module build.gradle files\n    }\n}\n\nallprojects {\n    repositories {\n        google()\n        jcenter()\n        maven { url \"https://jitpack.io\" }\n    }\n}\n\ntask clean(type: Delete) {\n    delete rootProject.buildDir\n}\n"
  },
  {
    "path": "dependencies.gradle",
    "content": "def supportVersion = \"27.1.1\"\ndef rxBindingVersion = \"3.0.0-alpha1\"\ndef retrofitVersion = \"2.4.0\"\ndef okHttpVersion = \"3.11.0\"\ndef stethoVersion = \"1.5.0\"\ndef butterKnifeVersion = \"8.5.1\"\ndef daggerVersion = \"2.8\"\ndef routerVersion = \"0.2.3\"\ndef htextviewVersion = \"0.1.6\"\n\nproject.ext {\n    android = [\n            compileSdkVersion: 27,\n            minSdkVersion    : 19,\n            targetSdkVersion : 27,\n            versionCode      : 2,\n            versionName      : \"1.0.1\"\n    ]\n\n    dependencies = [\n            //android-support\n            \"support-v4\"                  : \"com.android.support:support-v4:${supportVersion}\",\n            \"appcompat-v7\"                : \"com.android.support:appcompat-v7:${supportVersion}\",\n            \"design\"                      : \"com.android.support:design:${supportVersion}\",\n            \"recyclerview-v7\"             : \"com.android.support:recyclerview-v7:${supportVersion}\",\n            \"cardview-v7\"                 : \"com.android.support:cardview-v7:${supportVersion}\",\n            \"constraint-layout\"           : \"com.android.support.constraint:constraint-layout:1.1.3\",\n\n            //java8-support\n            \"stream\"                      : \"com.annimon:stream:1.0.8\",\n\n            //rx\n            \"rxjava\"                      : \"io.reactivex.rxjava2:rxjava:2.2.3\",\n            \"rxandroid\"                   : \"io.reactivex.rxjava2:rxandroid:2.1.0\",\n            \"rxlifecycle\"                 : \"com.trello.rxlifecycle2:rxlifecycle:2.2.1\",\n            \"rxlifecycle-components\"      : \"com.trello.rxlifecycle2:rxlifecycle-components:2.2.1\",\n            \"rxbinding\"                   : \"com.jakewharton.rxbinding3:rxbinding-core:${rxBindingVersion}\",\n            \"rxbinding-appcompat-v7\"      : \"com.jakewharton.rxbinding3:rxbinding-appcompat:${rxBindingVersion}\",\n            \"rxbinding-recyclerview-v7\"   : \"com.jakewharton.rxbinding3:rxbinding-recyclerview:${rxBindingVersion}\",\n\n            //retrofit\n            \"retrofit\"                    : \"com.squareup.retrofit2:retrofit:${retrofitVersion}\",\n            \"adapter-rxjava\"              : \"com.squareup.retrofit2:adapter-rxjava2:${retrofitVersion}\",\n            \"retrofit-converter\"          : \"com.squareup.retrofit2:converter-scalars:${retrofitVersion}\",\n            \"retrofit-converter-gson\"     : \"com.squareup.retrofit2:converter-gson:${retrofitVersion}\",\n\n            //dagger\n            \"dagger\"                      : \"com.google.dagger:dagger:${daggerVersion}\",\n            \"dagger-compiler\"             : \"com.google.dagger:dagger-compiler:${daggerVersion}\",\n\n            //router\n            // 替换成最新版本, 需要注意的是api\n            // 要与compiler匹配使用，均使用最新版可以保证兼容\n            \"router\"                      : \"com.alibaba:arouter-api:1.4.1\",\n            \"router-compiler\"             : \"com.alibaba:arouter-compiler:1.2.2\",\n\n            //butterKnife  子模块的libary与application转化   R 与R2文件转化（所以最好不用）\n            //https://www.jianshu.com/p/1fa69ad55b0e\n            \"butterknife\"                 : \"com.jakewharton:butterknife:${butterKnifeVersion}\",\n            \"butterknife-compiler\"        : \"com.jakewharton:butterknife-compiler:${butterKnifeVersion}\",\n\n            //facebook\n            \"stetho\"                      : \"com.facebook.stetho:stetho:${stethoVersion}\",\n            \"stetho-okhttp3\"              : \"com.facebook.stetho:stetho-okhttp3:${stethoVersion}\",\n\n            //okHttp3\n            \"okhttp3\"                     : \"com.squareup.okhttp3:okhttp:${okHttpVersion}\",\n            \"okhttp3-logging-interceptor\" : \"com.squareup.okhttp3:logging-interceptor:${okHttpVersion}\",\n\n            //others\n            \"ormlite-android\"             : \"com.j256.ormlite:ormlite-android:5.0\",\n            //test\n            \"junit\"                       : \"junit:junit:4.12\",\n\n            //sweet alert dialog\n            \"sweetalert\"                  : \"com.github.f0ris.sweetalert:library:1.5.1\",\n//            \"sweetalert\"                  : \"cn.pedant.sweetalert:library:1.3\",\n            //autosize\n            \"autosize\"                    : \"me.jessyan:autosize:1.0.6\",\n            \"lrecyclerview\"               : \"com.github.jdsjlzx:LRecyclerView:1.4.3\",\n            \"glide\"                       : \"com.github.bumptech.glide:glide:3.7.0\",\n            \"eventbus\"                    : \"org.greenrobot:eventbus:3.1.1\",\n            \"smartrefreshlayout\"          : \"com.scwang.smartrefresh:SmartRefreshLayout:1.1.0-alpha-20\",\n\n            \"bannerview\"                  : \"com.github.pinguo-zhouwei:MZBannerView:v2.0.2\",\n            \"flowlayout\"                  : \"com.hyman:flowlayout-lib:1.1.2\",\n            \"circleimageview\"             : \"de.hdodenhof:circleimageview:2.2.0\",\n\n            //好看的字体动画\n            \"htextview-base\"              : \"com.hanks:htextview-base:${htextviewVersion}\",\n            \"htextview-fall\"              : \"com.hanks:htextview-fall:${htextviewVersion}\",\n\n    ]\n}"
  },
  {
    "path": "gradle/wrapper/gradle-wrapper.properties",
    "content": "#Sat Nov 17 20:54:41 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\nandroid.enableAapt2 = false;\n\n#release\nisBuildModule=false\n\n#ģ\n#isBuildModule=true"
  },
  {
    "path": "gradlew",
    "content": "#!/usr/bin/env bash\n\n##############################################################################\n##\n##  Gradle start up script for UN*X\n##\n##############################################################################\n\n# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.\nDEFAULT_JVM_OPTS=\"\"\n\nAPP_NAME=\"Gradle\"\nAPP_BASE_NAME=`basename \"$0\"`\n\n# Use the maximum available, or set MAX_FD != -1 to use that value.\nMAX_FD=\"maximum\"\n\nwarn ( ) {\n    echo \"$*\"\n}\n\ndie ( ) {\n    echo\n    echo \"$*\"\n    echo\n    exit 1\n}\n\n# OS specific support (must be 'true' or 'false').\ncygwin=false\nmsys=false\ndarwin=false\ncase \"`uname`\" in\n  CYGWIN* )\n    cygwin=true\n    ;;\n  Darwin* )\n    darwin=true\n    ;;\n  MINGW* )\n    msys=true\n    ;;\nesac\n\n# Attempt to set APP_HOME\n# Resolve links: $0 may be a link\nPRG=\"$0\"\n# Need this for relative symlinks.\nwhile [ -h \"$PRG\" ] ; do\n    ls=`ls -ld \"$PRG\"`\n    link=`expr \"$ls\" : '.*-> \\(.*\\)$'`\n    if expr \"$link\" : '/.*' > /dev/null; then\n        PRG=\"$link\"\n    else\n        PRG=`dirname \"$PRG\"`\"/$link\"\n    fi\ndone\nSAVED=\"`pwd`\"\ncd \"`dirname \\\"$PRG\\\"`/\" >/dev/null\nAPP_HOME=\"`pwd -P`\"\ncd \"$SAVED\" >/dev/null\n\nCLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar\n\n# Determine the Java command to use to start the JVM.\nif [ -n \"$JAVA_HOME\" ] ; then\n    if [ -x \"$JAVA_HOME/jre/sh/java\" ] ; then\n        # IBM's JDK on AIX uses strange locations for the executables\n        JAVACMD=\"$JAVA_HOME/jre/sh/java\"\n    else\n        JAVACMD=\"$JAVA_HOME/bin/java\"\n    fi\n    if [ ! -x \"$JAVACMD\" ] ; then\n        die \"ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME\n\nPlease set the JAVA_HOME variable in your environment to match the\nlocation of your Java installation.\"\n    fi\nelse\n    JAVACMD=\"java\"\n    which java >/dev/null 2>&1 || die \"ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.\n\nPlease set the JAVA_HOME variable in your environment to match the\nlocation of your Java installation.\"\nfi\n\n# Increase the maximum file descriptors if we can.\nif [ \"$cygwin\" = \"false\" -a \"$darwin\" = \"false\" ] ; then\n    MAX_FD_LIMIT=`ulimit -H -n`\n    if [ $? -eq 0 ] ; then\n        if [ \"$MAX_FD\" = \"maximum\" -o \"$MAX_FD\" = \"max\" ] ; then\n            MAX_FD=\"$MAX_FD_LIMIT\"\n        fi\n        ulimit -n $MAX_FD\n        if [ $? -ne 0 ] ; then\n            warn \"Could not set maximum file descriptor limit: $MAX_FD\"\n        fi\n    else\n        warn \"Could not query maximum file descriptor limit: $MAX_FD_LIMIT\"\n    fi\nfi\n\n# For Darwin, add options to specify how the application appears in the dock\nif $darwin; then\n    GRADLE_OPTS=\"$GRADLE_OPTS \\\"-Xdock:name=$APP_NAME\\\" \\\"-Xdock:icon=$APP_HOME/media/gradle.icns\\\"\"\nfi\n\n# For Cygwin, switch paths to Windows format before running java\nif $cygwin ; then\n    APP_HOME=`cygpath --path --mixed \"$APP_HOME\"`\n    CLASSPATH=`cygpath --path --mixed \"$CLASSPATH\"`\n    JAVACMD=`cygpath --unix \"$JAVACMD\"`\n\n    # We build the pattern for arguments to be converted via cygpath\n    ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`\n    SEP=\"\"\n    for dir in $ROOTDIRSRAW ; do\n        ROOTDIRS=\"$ROOTDIRS$SEP$dir\"\n        SEP=\"|\"\n    done\n    OURCYGPATTERN=\"(^($ROOTDIRS))\"\n    # Add a user-defined pattern to the cygpath arguments\n    if [ \"$GRADLE_CYGPATTERN\" != \"\" ] ; then\n        OURCYGPATTERN=\"$OURCYGPATTERN|($GRADLE_CYGPATTERN)\"\n    fi\n    # Now convert the arguments - kludge to limit ourselves to /bin/sh\n    i=0\n    for arg in \"$@\" ; do\n        CHECK=`echo \"$arg\"|egrep -c \"$OURCYGPATTERN\" -`\n        CHECK2=`echo \"$arg\"|egrep -c \"^-\"`                                 ### Determine if an option\n\n        if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then                    ### Added a condition\n            eval `echo args$i`=`cygpath --path --ignore --mixed \"$arg\"`\n        else\n            eval `echo args$i`=\"\\\"$arg\\\"\"\n        fi\n        i=$((i+1))\n    done\n    case $i in\n        (0) set -- ;;\n        (1) set -- \"$args0\" ;;\n        (2) set -- \"$args0\" \"$args1\" ;;\n        (3) set -- \"$args0\" \"$args1\" \"$args2\" ;;\n        (4) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" ;;\n        (5) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" ;;\n        (6) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" \"$args5\" ;;\n        (7) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" \"$args5\" \"$args6\" ;;\n        (8) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" \"$args5\" \"$args6\" \"$args7\" ;;\n        (9) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" \"$args5\" \"$args6\" \"$args7\" \"$args8\" ;;\n    esac\nfi\n\n# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules\nfunction splitJvmOpts() {\n    JVM_OPTS=(\"$@\")\n}\neval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS\nJVM_OPTS[${#JVM_OPTS[*]}]=\"-Dorg.gradle.appname=$APP_BASE_NAME\"\n\nexec \"$JAVACMD\" \"${JVM_OPTS[@]}\" -classpath \"$CLASSPATH\" org.gradle.wrapper.GradleWrapperMain \"$@\"\n"
  },
  {
    "path": "gradlew.bat",
    "content": "@if \"%DEBUG%\" == \"\" @echo off\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": "lib_common/.gitignore",
    "content": "/build\n"
  },
  {
    "path": "lib_common/build.gradle",
    "content": "apply plugin: 'com.android.library'\n\nandroid {\n    compileSdkVersion rootProject.ext.android[\"compileSdkVersion\"]\n\n    defaultConfig {\n        minSdkVersion rootProject.ext.android[\"minSdkVersion\"]\n        targetSdkVersion rootProject.ext.android[\"targetSdkVersion\"]\n        versionCode rootProject.ext.android[\"versionCode\"]\n        versionName rootProject.ext.android[\"versionName\"]\n\n        testInstrumentationRunner \"android.support.test.runner.AndroidJUnitRunner\"\n\n        javaCompileOptions {\n            annotationProcessorOptions {\n                arguments = [AROUTER_MODULE_NAME: project.getName()]\n            }\n        }\n    }\n\n    buildTypes {\n        release {\n            minifyEnabled false\n            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'\n        }\n    }\n\n}\n\ndependencies {\n    implementation fileTree(dir: 'libs', include: ['*.jar'])\n    implementation 'com.android.support.constraint:constraint-layout:1.1.3'\n    androidTestImplementation 'com.android.support.test:runner:1.0.2'\n    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'\n    testImplementation rootProject.ext.dependencies[\"junit\"]\n\n\n    api project(':lib_opensource')\n    annotationProcessor rootProject.ext.dependencies[\"router-compiler\"]\n}\n"
  },
  {
    "path": "lib_common/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": "lib_common/src/androidTest/java/com/senon/lib_common/ExampleInstrumentedTest.java",
    "content": "package com.senon.lib_common;\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.senon.lib_common\", appContext.getPackageName());\n    }\n}\n"
  },
  {
    "path": "lib_common/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.senon.lib_common\">\n\n    <uses-permission android:name=\"android.permission.INTERNET\"/>\n    <uses-permission android:name=\"android.permission.ACCESS_NETWORK_STATE\"/>\n    <uses-permission android:name=\"android.permission.ACCESS_WIFI_STATE\" />\n\n    <application android:allowBackup=\"true\">\n\n        <!--autosize 配置屏幕适配参数-->\n        <meta-data\n            android:name=\"design_width_in_dp\"\n            android:value=\"750\" />\n        <meta-data\n            android:name=\"design_height_in_dp\"\n            android:value=\"1334\" />\n\n        <activity android:name=\".common.ui.Common_LoginActivity\" />\n        <activity android:name=\".common.ui.Common_RegisterActivity\" />\n        <activity android:name=\".common.ui.Common_WebviewActivity\"></activity>\n    </application>\n\n</manifest>"
  },
  {
    "path": "lib_common/src/main/java/com/senon/lib_common/AppConfig.java",
    "content": "package com.senon.lib_common;\n\nimport com.senon.lib_common.utils.ConstantUtils;\n\n/**\n * APP配置参数\n */\npublic class AppConfig {\n\n\n    public static final String BASE_URL = \"https://www.wanandroid.com/\";\n\n    public static final String PATH_DATA = ConstantUtils.getAPPContext().getCacheDir().getAbsolutePath()+\"/\"+\"data\";\n\n    public static final String PATH_CACHE = PATH_DATA+\"/\"+\"Cache\";\n\n}\n"
  },
  {
    "path": "lib_common/src/main/java/com/senon/lib_common/ComUtil.java",
    "content": "package com.senon.lib_common;\n\nimport android.app.Activity;\nimport android.content.Context;\nimport android.net.ConnectivityManager;\nimport android.os.Build;\nimport android.text.Editable;\nimport android.text.TextWatcher;\nimport android.util.DisplayMetrics;\nimport android.view.View;\nimport android.widget.EditText;\n\nimport com.senon.lib_common.utils.ConstantUtils;\nimport com.senon.lib_common.utils.MD5Utils;\nimport com.senon.lib_common.utils.ToastUtil;\nimport java.text.SimpleDateFormat;\nimport java.util.HashMap;\nimport java.util.Iterator;\nimport java.util.Map;\nimport java.util.regex.Matcher;\nimport java.util.regex.Pattern;\n\n/**\n * ComUtil\n */\npublic class ComUtil {\n\n\n    public static void changeStatusBarTextColor(Context context,boolean isBlack) {\n        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {\n            if (isBlack) {\n                //设置状态栏黑色字体\n                ((Activity)context).getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN |\n                        View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);\n            } else {\n                //恢复状态栏白色字体\n                ((Activity)context).getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);\n\n            }\n        }\n    }\n\n\n    public static boolean isNumeric(String str) {\n        Pattern pattern = Pattern.compile(\"^1[3|4|5|7|8|9][0-9]{9}$\");\n        Matcher isNum = pattern.matcher(str);\n        if (!isNum.matches()) {\n            return false;\n        }\n        return true;\n    }\n\n    public static boolean isChinese(String str) {\n        Pattern pattern = Pattern.compile(\"^[\\\\u4E00-\\\\u9FA5]+$\");\n        Matcher isNum = pattern.matcher(str);\n        if (!isNum.matches()) {\n            return false;\n        }\n        return true;\n    }\n\n    //long型时间转换为字符串时间类型\n    public static String longToString(Object longTime, String timeFormat) {\n        SimpleDateFormat formatter = new SimpleDateFormat(timeFormat == null ? \"yyyy-MM-dd\" : timeFormat);\n        long time = 0;\n        if (longTime instanceof Integer || longTime instanceof Long) {\n            return formatter.format(longTime);\n        } else if (longTime instanceof String) {\n            return formatter.format(Long.valueOf((String) longTime));\n        }\n        return \"时间获取错误\";\n    }\n\n    //检查是否有可用网络\n    public static boolean isNetworkConnected() {\n        ConnectivityManager connectivityManager = (ConnectivityManager) ConstantUtils.getAPPContext().\n                getSystemService(Context.CONNECTIVITY_SERVICE);\n        assert connectivityManager != null;\n        return connectivityManager.getActiveNetworkInfo() != null;\n    }\n\n    // 屏幕宽度（像素）\n    public static int getScreenWidth(Context context) {\n        DisplayMetrics metric = new DisplayMetrics();\n        ((Activity) context).getWindowManager().getDefaultDisplay().getMetrics(metric);\n        return metric.widthPixels;\n    }\n\n    public static int getScreenHeight(Context context) {\n        DisplayMetrics metric = new DisplayMetrics();\n        ((Activity) context).getWindowManager().getDefaultDisplay().getMetrics(metric);\n        return metric.heightPixels;\n    }\n\n    public static String getMd5Str(HashMap<String, String> map) {\n        StringBuffer sb = new StringBuffer();\n        Iterator iterator = map.entrySet().iterator();\n        while (iterator.hasNext()) {\n            Map.Entry entry = (Map.Entry) iterator.next();\n            sb.append(entry.getValue().toString());\n        }\n        return MD5Utils.getMd5(sb.toString() );\n    }\n\n    public static HashMap<String, String> getMd5Str(String[] keyArray, String[] valueArray) {\n        HashMap<String, String> map = new HashMap<>();\n        StringBuffer sb = new StringBuffer();\n        if (keyArray.length != valueArray.length) {\n            ToastUtil.initToast(\"key value长度不对应\");\n        } else {\n            for (int i = 0; i < keyArray.length; i++) {\n                map.put(keyArray[i], valueArray[i]);\n            }\n            for (int i = 0; i < valueArray.length; i++) {\n                sb.append(valueArray[i]);\n            }\n            map.put(\"secret\", MD5Utils.getMd5(sb.toString()));\n            return map;\n        }\n        return null;\n    }\n\n\n}\n"
  },
  {
    "path": "lib_common/src/main/java/com/senon/lib_common/ConstantArouter.java",
    "content": "package com.senon.lib_common;\n\n/**\n * 所有模块均依赖commonmoduel  所以路由跳转均写入本Constant方便调用\n * 常量类\n * 其中: 路由跳转命名统一用：path+模块名+Activity名\n */\npublic class ConstantArouter {\n\n    /**\n     * App\n     */\n    public static final String PATH_APP_SPLASHACTIVITY = \"/app/SplashActivity\";\n    public static final String PATH_APP_FRAGMENTHOMEACTIVITY = \"/app/FragmentHomeActivity\";\n\n\n    /**\n     * home 主页\n     */\n    public static final String PATH_HOME_MAINACTIVITY = \"/home/MainActivity\";\n    public static final String PATH_HOME_HOMEARTICLEACTIVITY = \"/home/HomeArticleActivity\";\n    public static final String PATH_HOME_HOMEPROJECTACTIVITY = \"/home/HomeProjectActivity\";\n\n    /**\n     * life 知识体系\n     */\n    public static final String PATH_LIFE_KNOWLEDGESYSTEMACTIVITY = \"/life/KnowledgeSystemActivity\";\n\n    /**\n     * common\n     */\n    public static final String PATH_COMMON_REGISTERACTIVITY = \"/lib_common/CommonRegisterActivity\";\n    public static final String PATH_COMMON_WEBVIEWCTIVITY = \"/lib_common/CommonWebviewActivity\";\n\n    /**\n     * talent 个人中心\n     */\n    public static final String PATH_TALENT_COLLECTIONACTIVITY = \"/talent/CollectionActivity\";\n    public static final String PATH_TALENT_ABOUTACTIVITY = \"/talent/AboutActivity\";\n\n\n}\n"
  },
  {
    "path": "lib_common/src/main/java/com/senon/lib_common/ConstantLoginArouter.java",
    "content": "package com.senon.lib_common;\n\nimport java.util.HashMap;\nimport java.util.Map;\n\n/**\n * 判断是某个模块登录的\n */\npublic class ConstantLoginArouter {\n\n    public static Map<String, String> activityRouterMap = new HashMap<>();\n\n    //app主页\n    public static final String PATH_APP_MAINACTIVITY = \"/app/MainActivity\";\n\n    //home主页\n    public static final String PATH_HOME_MAINACTIVITY = \"/home/HomeMainActivity\";\n    //Life首页\n    public static final String PATH_LIFE_MAINACTIVITY = \"/life/LifeMainActivity\";\n    //Art首页\n    public static final String PATH_ART_MAINACTIVITY = \"/art/ArtMainActivity\";\n    //Talent首页\n    public static final String PATH_TALENT_MAINACTIVITY = \"/talent/TalentMainActivity\";\n\n\n    //登录 注册\n    public static final String PATH_COMMON_LOGINACTIVITY = \"/lib_common/CommonLoginActivity\";\n\n    static {\n        activityRouterMap.put(getActivityName(PATH_APP_MAINACTIVITY), PATH_APP_MAINACTIVITY);\n        activityRouterMap.put(getActivityName(PATH_HOME_MAINACTIVITY), PATH_HOME_MAINACTIVITY);\n        activityRouterMap.put(getActivityName(PATH_LIFE_MAINACTIVITY), PATH_LIFE_MAINACTIVITY);\n        activityRouterMap.put(getActivityName(PATH_ART_MAINACTIVITY), PATH_ART_MAINACTIVITY);\n        activityRouterMap.put(getActivityName(PATH_TALENT_MAINACTIVITY), PATH_TALENT_MAINACTIVITY);\n\n        activityRouterMap.put(getActivityName(PATH_COMMON_LOGINACTIVITY), PATH_COMMON_LOGINACTIVITY);\n    }\n\n    private static String getActivityName(String routerUrl) {\n        int pos = routerUrl.lastIndexOf(\"/\");\n        return routerUrl.substring(pos + 1);\n    }\n\n    public static String getCurRouter(String activityName) {\n        return activityRouterMap.get(activityName);\n    }\n}\n"
  },
  {
    "path": "lib_common/src/main/java/com/senon/lib_common/adapter/CommonAdapter.java",
    "content": "package com.senon.lib_common.adapter;\n\nimport android.content.Context;\nimport android.view.LayoutInflater;\nimport android.view.View;\nimport android.view.ViewGroup;\nimport android.widget.BaseAdapter;\n\nimport java.util.List;\n\npublic abstract class CommonAdapter<T> extends BaseAdapter {\n    protected LayoutInflater mInflater;\n    protected Context mContext;\n    protected List<T> mDatas;\n    protected final int mItemLayoutId;\n\n    public CommonAdapter(Context context, List<T> mDatas, int itemLayoutId) {\n        mInflater = LayoutInflater.from(context);\n        this.mContext = context;\n        this.mDatas = mDatas;\n        this.mItemLayoutId = itemLayoutId;\n    }\n\n    @Override\n    public int getCount() {\n        return mDatas.size();\n    }\n\n    @Override\n    public T getItem(int position) {\n        return mDatas.get(position);\n    }\n\n\n    @Override\n    public long getItemId(int position) {\n        return position;\n    }\n\n    @Override\n    public View getView(int position, View convertView, ViewGroup parent) {\n        final CommonHolder viewHolder = getViewHolder(position, convertView, parent);\n        convert(viewHolder, getItem(position),position);\n        return viewHolder.getConvertView();\n\n    }\n\n    public abstract void convert(CommonHolder helper, T item,int position);\n\n    private CommonHolder getViewHolder(int position, View convertView, ViewGroup parent) {\n        return CommonHolder.get(mContext, convertView, parent, mItemLayoutId, position);\n    }\n} "
  },
  {
    "path": "lib_common/src/main/java/com/senon/lib_common/adapter/CommonHolder.java",
    "content": "package com.senon.lib_common.adapter;\n\nimport android.annotation.SuppressLint;\nimport android.app.Activity;\nimport android.content.Context;\nimport android.graphics.Bitmap;\nimport android.graphics.Paint;\nimport android.graphics.Typeface;\nimport android.graphics.drawable.Drawable;\nimport android.os.Build;\nimport android.text.util.Linkify;\nimport android.util.SparseArray;\nimport android.view.LayoutInflater;\nimport android.view.View;\nimport android.view.ViewGroup;\nimport android.view.animation.AlphaAnimation;\nimport android.widget.Checkable;\nimport android.widget.GridView;\nimport android.widget.ImageView;\nimport android.widget.ProgressBar;\nimport android.widget.RatingBar;\nimport android.widget.TextView;\nimport com.bumptech.glide.Glide;\n\n\npublic class CommonHolder {\n    private final SparseArray<View> mViews;\n    private int mPosition;\n    private View mConvertView;\n    private Context mContext;\n    private int mLayoutId;\n\n    private CommonHolder(Context context, ViewGroup parent, int layoutId, int position) {\n        this.mLayoutId = layoutId;\n        this.mContext = context;\n        this.mPosition = position;\n        this.mViews = new SparseArray<View>();\n        mConvertView = LayoutInflater.from(context).inflate(layoutId, parent, false);\n        //setTag  \n        mConvertView.setTag(this);\n    }\n\n\n    /**\n     * 拿到一个CommonHolder对象\n     *\n     * @param context\n     * @param convertView\n     * @param parent\n     * @param layoutId\n     * @param position\n     * @return\n     */\n    public static CommonHolder get(Context context, View convertView, ViewGroup parent, int layoutId, int position) {\n\n        if (convertView == null) {\n            return new CommonHolder(context, parent, layoutId, position);\n        }\n        return (CommonHolder) convertView.getTag();\n    }\n\n    /**\n     * 通过控件的Id获取对于的控件，如果没有则加入views\n     *\n     * @param viewId\n     * @return\n     */\n    public <T extends View> T getView(int viewId) {\n        View view = mViews.get(viewId);\n        if (view == null) {\n            view = mConvertView.findViewById(viewId);\n            mViews.put(viewId, view);\n        }\n        return (T) view;\n    }\n\n    public View getConvertView() {\n        return mConvertView;\n    }\n\n    /**\n     * 为TextView设置字符串\n     *\n     * @param viewId\n     * @param text\n     * @return\n     */\n    public CommonHolder setText(int viewId, String text) {\n        TextView view = getView(viewId);\n        view.setText(text);\n        return this;\n    }\n\n    public String getText(int viewId) {\n        TextView view = getView(viewId);\n        return view.getText().toString().trim();\n    }\n\n    public CommonHolder setEnabled(int viewId, boolean enabled) {\n        View view = getView(viewId);\n        view.setEnabled(enabled);\n        return this;\n    }\n\n    public CommonHolder setSelected(int viewId, boolean selected) {\n        View view = getView(viewId);\n        view.setSelected(selected);\n        return this;\n    }\n\n    /**\n     * 为ImageView设置图片\n     *\n     * @param viewId\n     * @param drawableId\n     * @return\n     */\n    public CommonHolder setImageResource(int viewId, int drawableId) {\n        ImageView view = getView(viewId);\n        view.setImageResource(drawableId);\n\n        return this;\n    }\n\n    /**\n     * 为ImageView设置图片\n     *\n     * @param viewId\n     * @param bm\n     * @return\n     */\n    public CommonHolder setImageBitmap(int viewId, Bitmap bm) {\n        ImageView view = getView(viewId);\n        view.setImageBitmap(bm);\n        return this;\n    }\n\n\n    public CommonHolder setColorFilter(int viewId, Integer colorFilter) {\n        ImageView imageView = getView(viewId);\n        if (colorFilter == null) imageView.setColorFilter(null);\n        else imageView.setColorFilter(colorFilter);\n        return this;\n    }\n\n    public CommonHolder setImageDrawable(int viewId, Drawable drawable) {\n        ImageView view = getView(viewId);\n        view.setImageDrawable(drawable);\n        return this;\n    }\n\n    public CommonHolder setBackgroundColor(int viewId, int color) {\n        View view = getView(viewId);\n        view.setBackgroundColor(color);\n        return this;\n    }\n\n    public CommonHolder setBackgroundRes(int viewId, int backgroundRes) {\n        View view = getView(viewId);\n        view.setBackgroundResource(backgroundRes);\n        return this;\n    }\n\n    public CommonHolder setTextColor(int viewId, int textColor) {\n        TextView view = getView(viewId);\n        view.setTextColor(textColor);\n        return this;\n    }\n\n    public CommonHolder setTextColorRes(int viewId, int textColorRes) {\n        TextView view = getView(viewId);\n        view.setTextColor(mContext.getResources().getColor(textColorRes));\n        return this;\n    }\n\n\n    @SuppressLint(\"NewApi\")\n    public CommonHolder setAlpha(int viewId, float value) {\n        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {\n            getView(viewId).setAlpha(value);\n        } else {\n            // Pre-honeycomb hack to set Alpha value\n            AlphaAnimation alpha = new AlphaAnimation(value, value);\n            alpha.setDuration(0);\n            alpha.setFillAfter(true);\n            getView(viewId).startAnimation(alpha);\n        }\n        return this;\n    }\n\n    public CommonHolder setVisible(int viewId, int visible) {\n        View view = getView(viewId);\n        view.setVisibility(visible);\n        return this;\n    }\n\n    public CommonHolder linkify(int viewId) {\n        TextView view = getView(viewId);\n        Linkify.addLinks(view, Linkify.ALL);\n        return this;\n    }\n\n    public CommonHolder setTypeface(Typeface typeface, int... viewIds) {\n        for (int viewId : viewIds) {\n            TextView view = getView(viewId);\n            view.setTypeface(typeface);\n            view.setPaintFlags(view.getPaintFlags() | Paint.SUBPIXEL_TEXT_FLAG);\n        }\n        return this;\n    }\n\n    public CommonHolder setProgress(int viewId, int progress) {\n        ProgressBar view = getView(viewId);\n        view.setProgress(progress);\n        return this;\n    }\n\n    public CommonHolder setProgress(int viewId, int progress, int max) {\n        ProgressBar view = getView(viewId);\n        view.setMax(max);\n        view.setProgress(progress);\n        return this;\n    }\n\n    public CommonHolder setMax(int viewId, int max) {\n        ProgressBar view = getView(viewId);\n        view.setMax(max);\n        return this;\n    }\n\n    public CommonHolder setRating(int viewId, float rating) {\n        RatingBar view = getView(viewId);\n        view.setRating(rating);\n        return this;\n    }\n\n    public CommonHolder setRating(int viewId, float rating, int max) {\n        RatingBar view = getView(viewId);\n        view.setMax(max);\n        view.setRating(rating);\n        return this;\n    }\n\n    public CommonHolder setTag(int viewId, Object tag) {\n        View view = getView(viewId);\n        view.setTag(tag);\n        return this;\n    }\n\n    public CommonHolder setTag(int viewId, int key, Object tag) {\n        View view = getView(viewId);\n        view.setTag(key, tag);\n        return this;\n    }\n\n    public CommonHolder setChecked(int viewId, boolean checked) {\n        Checkable view = (Checkable) getView(viewId);\n        view.setChecked(checked);\n        return this;\n    }\n\n    /**\n     * 关于事件的\n     */\n    public CommonHolder setOnClickListener(int viewId, View.OnClickListener listener) {\n        View view = getView(viewId);\n        view.setOnClickListener(listener);\n        return this;\n    }\n\n    public CommonHolder setOnTouchListener(int viewId, View.OnTouchListener listener) {\n        View view = getView(viewId);\n        view.setOnTouchListener(listener);\n        return this;\n    }\n\n    public CommonHolder setOnLongClickListener(int viewId, View.OnLongClickListener listener) {\n        View view = getView(viewId);\n        view.setOnLongClickListener(listener);\n        return this;\n    }\n\n    /**\n     * 设置中划线\n     *\n     * @return\n     */\n    public void setStrikeThruText(int viewID) {\n        TextView view = (TextView) getView(viewID);\n        view.getPaint().setFlags(Paint.STRIKE_THRU_TEXT_FLAG);\n    }\n\n    public int getPosition() {\n        return mPosition;\n    }\n\n    public GridView setData(int viewId) {\n        GridView gridView = getView(viewId);\n        return gridView;\n    }\n}  "
  },
  {
    "path": "lib_common/src/main/java/com/senon/lib_common/adapter/RecycleHolder.java",
    "content": "package com.senon.lib_common.adapter;\n\nimport android.app.Activity;\nimport android.graphics.Bitmap;\nimport android.support.v7.widget.RecyclerView;\nimport android.text.Spannable;\nimport android.text.SpannableString;\nimport android.text.SpannableStringBuilder;\nimport android.text.style.AbsoluteSizeSpan;\nimport android.text.style.ForegroundColorSpan;\nimport android.util.SparseArray;\nimport android.view.View;\nimport android.view.ViewGroup;\nimport android.widget.Checkable;\nimport android.widget.ImageView;\nimport android.widget.ProgressBar;\nimport android.widget.TextView;\nimport com.bumptech.glide.Glide;\nimport com.bumptech.glide.load.engine.DiskCacheStrategy;\n\n\npublic class RecycleHolder extends RecyclerView.ViewHolder {\n\n    /**\n     * 用于存储当前item当中的View\n     */\n    private SparseArray<View> mViews;\n\n    public RecycleHolder(View itemView) {\n        super(itemView);\n        mViews = new SparseArray<View>();\n    }\n\n    public <T extends View> T findView(int ViewId) {\n        View view = mViews.get(ViewId);\n        //集合中没有，则从item当中获取，并存入集合当中\n        if (view == null) {\n            view = itemView.findViewById(ViewId);\n            mViews.put(ViewId, view);\n        }\n        return (T) view;\n    }\n\n    public RecycleHolder setOnClickListener(int viewId, View.OnClickListener listener) {\n        View view = findView(viewId);\n        view.setOnClickListener(listener);\n        return this;\n    }\n\n    public RecycleHolder setOnClickListener(int viewId,int viewId2 ,View.OnClickListener listener) {\n        View view = findView(viewId);\n        view.setOnClickListener(listener);\n\n        View view2 = findView(viewId2);\n        view2.setOnClickListener(listener);\n        return this;\n    }\n\n    public RecycleHolder setOnLongClickListener(int viewId, View.OnLongClickListener listener) {\n        View view = findView(viewId);\n        view.setOnLongClickListener(listener);\n        return this;\n    }\n\n    public RecycleHolder setOnLongClickListener(int viewId,int viewId2, View.OnLongClickListener listener) {\n        View view = findView(viewId);\n        view.setOnLongClickListener(listener);\n\n        View view2 = findView(viewId2);\n        view2.setOnLongClickListener(listener);\n        return this;\n    }\n\n    public RecycleHolder setText(int viewId, String text) {\n        TextView tv = findView(viewId);\n        tv.setText(text);\n        return this;\n    }\n\n    public RecycleHolder setText(int viewId, SpannableStringBuilder text) {\n        TextView tv = findView(viewId);\n        tv.setText(text);\n        return this;\n    }\n\n    public RecycleHolder setMaxLine(int viewId, int lineCount) {\n        TextView tv = findView(viewId);\n        tv.setMaxLines(lineCount);\n        return this;\n    }\n\n    public RecycleHolder setPadding(int viewId, int left, int top, int right, int bottom) {\n        View tv = findView(viewId);\n        tv.setPadding(left, top, right, bottom);\n        return this;\n    }\n\n    public RecycleHolder setAppendTextColor(int viewId, CharSequence str, int resColorId, int resDimen) {\n        TextView tv = findView(viewId);\n        SpannableString spannableString = new SpannableString(str);\n        spannableString.setSpan(new ForegroundColorSpan(tv.getContext().getResources().getColor(resColorId)), 0, str.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);\n        spannableString.setSpan(new AbsoluteSizeSpan((int) tv.getContext().getResources().getDimension(resDimen)), 0, str.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);\n        tv.append(spannableString);\n        return this;\n    }\n\n    public RecycleHolder setSelected(int viewId, boolean selected) {\n        View tv = findView(viewId);\n        tv.setSelected(selected);\n        return this;\n    }\n\n    public RecycleHolder setEnabled(int viewId, boolean enabled) {\n        View tv = findView(viewId);\n        tv.setEnabled(enabled);\n        return this;\n    }\n    public RecycleHolder setEnabled_imgView(int viewId, boolean enabled) {\n        ImageView tv = findView(viewId);\n        tv.setEnabled(enabled);\n        return this;\n    }\n    public RecycleHolder setText(int viewId, int text) {\n        TextView tv = findView(viewId);\n        tv.setText(text);\n        return this;\n    }\n\n    public RecycleHolder setChecked(int viewId, boolean checked) {\n        Checkable view = findView(viewId);\n        view.setChecked(checked);\n        return this;\n    }\n\n    public RecycleHolder setTextColor(int viewId, int colorResId) {\n        TextView tv = findView(viewId);\n        tv.setTextColor(tv.getContext().getResources().getColor(colorResId));\n        return this;\n    }\n\n    public RecycleHolder setImageResource(int viewId, int ImageId) {\n        ImageView image = findView(viewId);\n        image.setImageResource(ImageId);\n        return this;\n    }\n\n    public RecycleHolder setLayoutParams(int viewId, ViewGroup.LayoutParams para) {\n        View view = findView(viewId);\n        view.setLayoutParams(para);\n        return this;\n    }\n\n\n    public RecycleHolder setImageBitmap(int viewId, Bitmap bitmap) {\n        ImageView image = findView(viewId);\n        image.setImageBitmap(bitmap);\n        return this;\n    }\n\n    public RecycleHolder setGlideImage(int viewId, String url,int placehodlerImg,Activity activity){\n        ImageView image = findView(viewId);\n        Glide.with(activity)\n                .load(url)\n                .error(placehodlerImg)\n                .placeholder(placehodlerImg)\n                .into(image);\n        return this;\n    }\n\n    public RecycleHolder setImageNet(int viewId, String url) {\n        ImageView image = findView(viewId);\n        //使用你所用的网络框架等\n        return this;\n    }\n\n    public RecycleHolder setBackgroundColor(int viewId, int color) {\n        View view = findView(viewId);\n        view.setBackgroundColor(color);\n        return this;\n    }\n\n    public RecycleHolder setBackgroundRes(int viewId, int backgroundRes) {\n        View view = findView(viewId);\n        view.setBackgroundResource(backgroundRes);\n        return this;\n    }\n\n    public RecycleHolder setVisible(int viewId, boolean visible) {\n        View image = findView(viewId);\n        image.setVisibility(visible ? View.VISIBLE : View.GONE);\n        //使用你所用的网络框架等\n        return this;\n    }\n\n    public RecycleHolder setVisible_invisible(int viewId, boolean visible) {\n        View image = findView(viewId);\n        image.setVisibility(visible ? View.VISIBLE : View.INVISIBLE);\n        //使用你所用的网络框架等\n        return this;\n    }\n\n    public RecycleHolder setProgesss(int viewId, int percent) {\n        ProgressBar progressBar = findView(viewId);\n        progressBar.setProgress(percent);\n        return this;\n    }\n\n    public boolean getVisible(int viewId) {\n        View view = findView(viewId);\n        return view.getVisibility() == View.VISIBLE;\n    }\n\n\n}\n"
  },
  {
    "path": "lib_common/src/main/java/com/senon/lib_common/adapter/RecyclerAdapter.java",
    "content": "package com.senon.lib_common.adapter;\n\nimport android.content.Context;\nimport android.support.v7.widget.RecyclerView;\nimport android.view.LayoutInflater;\nimport android.view.View;\nimport android.view.ViewGroup;\n\nimport java.util.List;\n\n\npublic abstract class RecyclerAdapter<T> extends RecyclerView.Adapter<RecycleHolder> {\n\n    private Context mContext;\n    private List<T> mDatas;\n    private int mLayoutId;\n    private LayoutInflater mInflater;\n\n    private OnItemClickListener onItemClickListener;\n\n    public RecyclerAdapter(Context mContext, List<T> mDatas, int mLayoutId) {\n        this.mContext = mContext;\n        this.mDatas = mDatas;\n        this.mLayoutId = mLayoutId;\n        mInflater = LayoutInflater.from(mContext);\n    }\n\n    @Override\n    public RecycleHolder onCreateViewHolder(ViewGroup parent, int viewType) {\n        return new RecycleHolder(mInflater.inflate(mLayoutId, parent, false));\n    }\n\n    @Override\n    public void onBindViewHolder(final RecycleHolder holder, int position) {\n        convert(holder, mDatas.get(position), position);\n        if (onItemClickListener != null) {\n            //设置背景\n            holder.itemView.setOnClickListener(new View.OnClickListener() {\n                @Override\n                public void onClick(View v) {\n                    //注意，这里的position不要用上面参数中的position，会出现位置错乱\\\n                    onItemClickListener.OnItemClickListener(holder.itemView, holder.getLayoutPosition());\n                }\n            });\n        }\n\n    }\n\n    public abstract void convert(RecycleHolder holder, T data, int position);\n\n    @Override\n    public int getItemCount() {\n        return mDatas.size();\n    }\n\n    public void setOnItemClickListener(OnItemClickListener onItemClickListener) {\n        this.onItemClickListener = onItemClickListener;\n    }\n\n   public interface OnItemClickListener {\n        void OnItemClickListener(View view, int position);\n    }\n}\n"
  },
  {
    "path": "lib_common/src/main/java/com/senon/lib_common/api/BaseApi.java",
    "content": "package com.senon.lib_common.api;\n\nimport com.senon.lib_common.bean.Banner;\nimport com.senon.lib_common.bean.CollectionArticle;\nimport com.senon.lib_common.bean.HomeArticle;\nimport com.senon.lib_common.bean.KnowledgeSysArticle;\nimport com.senon.lib_common.bean.KnowledgeSystem;\nimport com.senon.lib_common.bean.Login;\nimport com.senon.lib_common.base.BaseResponse;\nimport com.senon.lib_common.bean.ProjectArticle;\nimport com.senon.lib_common.bean.WXarticle;\nimport com.senon.lib_common.bean.WXchapters;\nimport java.util.List;\nimport java.util.Map;\nimport io.reactivex.Observable;\nimport retrofit2.http.Field;\nimport retrofit2.http.FieldMap;\nimport retrofit2.http.FormUrlEncoded;\nimport retrofit2.http.GET;\nimport retrofit2.http.POST;\nimport retrofit2.http.Path;\nimport retrofit2.http.Query;\n\n/**\n * 网络请求接口\n */\npublic interface BaseApi {\n\n\n    //登录\n    @POST(\"user/login\")\n    @FormUrlEncoded\n    Observable<BaseResponse<Login>> login(@FieldMap Map<String, String> map);\n    //登出\n    @GET(\"user/logout/json\")\n    Observable<BaseResponse> logout();\n    //注册\n    @POST(\"user/register\")\n    @FormUrlEncoded\n    Observable<BaseResponse<Login>> register(@FieldMap Map<String, String> map);\n\n    //首页banner\n    @GET(\"banner/json\")\n    Observable<BaseResponse<List<Banner>>> banner();\n    //首页文章列表\n    @GET(\"article/list/{page}/json\")\n    Observable<BaseResponse<HomeArticle>> getHomeArticle(@Path(\"page\") int page);\n    //首页最新项目\n    @GET(\"article/listproject/{page}/json\")\n    Observable<BaseResponse<ProjectArticle>> getHomeProject(@Path(\"page\") int page);\n\n    //项目列表数据\n    @GET(\"project/list/{page}/json\")\n    Observable<BaseResponse<ProjectArticle>> getProjectList(@Path(\"page\") int page, @Query(\"cid\") int cid);\n\n    //体系数据\n    @GET(\"tree/json\")\n    Observable<BaseResponse<List<KnowledgeSystem>>> getKnowledgeList();\n    //知识体系下的文章\n    @GET(\"article/list/{page}/json\")\n    Observable<BaseResponse<KnowledgeSysArticle>> getKnowledgeArticle(@Path(\"page\") int page, @Query(\"cid\") int cid);\n\n    //获取公众号列表\n    @GET(\"wxarticle/chapters/json\")\n    Observable<BaseResponse<List<WXchapters>>> getWXarticleChapters();\n    //查看某个公众号历史数据\n    @GET(\"wxarticle/list/{id}/{page}/json\")\n    Observable<BaseResponse<WXarticle>> getWXarticleList(@Path(\"id\") int id, @Path(\"page\") int page);\n\n    //收藏站内文章\n    @POST(\"lg/collect/{id}/json\")\n    Observable<BaseResponse> getCollect(@Path(\"id\") int id);\n    //取消收藏-->文章列表\n    @POST(\"lg/uncollect_originId/{id}/json\")\n    Observable<BaseResponse> getUncollectOriginId(@Path(\"id\") int id);\n    //取消收藏-->我的收藏页面\n    @POST(\"lg/uncollect/{id}/json\")\n    Observable<BaseResponse> getUncollect(@Path(\"id\") int id,@Query(\"originId\") int originId);\n\n    //收藏文章列表\n    @GET(\"lg/collect/list/{page}/json\")\n    Observable<BaseResponse<CollectionArticle>> getCollectList(@Path(\"page\") int page);\n}\n"
  },
  {
    "path": "lib_common/src/main/java/com/senon/lib_common/base/BaseActivity.java",
    "content": "package com.senon.lib_common.base;\n\nimport android.content.pm.ActivityInfo;\nimport android.os.Bundle;\nimport android.view.Window;\nimport com.alibaba.android.arouter.launcher.ARouter;\nimport com.trello.rxlifecycle2.components.support.RxAppCompatActivity;\n\n/**\n * 父类->基类->动态指定类型->泛型设计（通过泛型指定动态类型->由子类指定，父类只需要规定范围即可）\n */\npublic abstract class BaseActivity<V extends BaseViewImp,P extends BasePresenter<V>> extends RxAppCompatActivity {\n\n    //引用V层和P层\n    private P presenter;\n    private V view;\n    \n    public P getPresenter(){\n        return presenter;\n    }\n\n    @Override\n    protected void onCreate(Bundle savedInstanceState) {\n        super.onCreate(savedInstanceState);\n        requestWindowFeature(Window.FEATURE_NO_TITLE);\n        setContentView(getLayoutId());\n        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); // 禁止所有的activity横屏\n        ARouter.getInstance().inject(this);\n        if(presenter == null){\n            presenter = createPresenter();\n        }\n        if(view == null){\n            view = createView();\n        }\n        if(presenter != null && view != null){\n            presenter.attachView(view);\n        }\n        init();\n    }\n\n    //由子类指定具体类型\n    public abstract int getLayoutId();\n    public abstract P createPresenter();\n    public abstract V createView();\n    public abstract void init();\n\n    @Override\n    protected void onDestroy() {\n        super.onDestroy();\n        if(presenter != null){\n            presenter.detachView();\n        }\n    }\n}\n"
  },
  {
    "path": "lib_common/src/main/java/com/senon/lib_common/base/BaseAppDeletage.java",
    "content": "package com.senon.lib_common.base;\n\nimport android.app.Application;\nimport android.content.Context;\n\nimport com.scwang.smartrefresh.layout.SmartRefreshLayout;\nimport com.scwang.smartrefresh.layout.api.DefaultRefreshFooterCreator;\nimport com.scwang.smartrefresh.layout.api.DefaultRefreshHeaderCreator;\nimport com.scwang.smartrefresh.layout.api.RefreshFooter;\nimport com.scwang.smartrefresh.layout.api.RefreshHeader;\nimport com.scwang.smartrefresh.layout.api.RefreshLayout;\nimport com.scwang.smartrefresh.layout.footer.ClassicsFooter;\nimport com.scwang.smartrefresh.layout.header.ClassicsHeader;\nimport com.senon.lib_common.R;\nimport com.senon.lib_common.net.cookies.PersistentCookieStore;\nimport com.senon.lib_common.service.InitializeService;\nimport com.senon.lib_common.utils.ConstantUtils;\nimport com.senon.lib_common.utils.LogUtils;\nimport com.senon.lib_common.utils.PreferenceTool;\nimport com.senon.lib_common.utils.ToastUtil;\nimport me.jessyan.autosize.AutoSizeConfig;\nimport me.jessyan.autosize.unit.Subunits;\n\n\npublic class BaseAppDeletage {\n\n    private Application mApplication;\n\n    //static 代码段可以防止内存泄露\n    static {\n        //设置全局的Header构建器\n        SmartRefreshLayout.setDefaultRefreshHeaderCreator(new DefaultRefreshHeaderCreator() {\n            @Override\n            public RefreshHeader createRefreshHeader(Context context, RefreshLayout layout) {\n                // 指定为经典Header，默认是 贝塞尔雷达Header\n                return new ClassicsHeader(context);\n            }\n        });\n        //设置全局的Footer构建器\n        SmartRefreshLayout.setDefaultRefreshFooterCreator(new DefaultRefreshFooterCreator() {\n            @Override\n            public RefreshFooter createRefreshFooter(Context context, RefreshLayout layout) {\n                //指定为经典Footer，默认是 BallPulseFooter\n                return new ClassicsFooter(context).setDrawableSize(20);\n            }\n        });\n    }\n\n    public BaseAppDeletage(Application application) {\n        mApplication = application;\n    }\n\n    public void onCreate() {\n        ConstantUtils.init(mApplication);     //全局Utils\n        LogUtils.setLogEnable(ConstantUtils.isAppDebug());  //Log日志\n        PreferenceTool.init(mApplication);   //Preference参数\n        PersistentCookieStore.init(mApplication);   //Cookies持久化Preference参数\n        ToastUtil.init(mApplication);       //吐司初始化\n        initAutoSizeUnits();                 //配置全局 布局适配单位mm\n\n        InitializeService.start(mApplication);   //初始化服务Service\n    }\n\n    private void initAutoSizeUnits() {\n        AutoSizeConfig.getInstance().getUnitsManager()\n                //支持dp适配 默认true\n                .setSupportDP(false)\n                //支持sp适配 默认true\n                .setSupportSP(false)\n                .setSupportSubunits(Subunits.MM);\n        AutoSizeConfig.getInstance()\n                //按照宽度适配 默认true\n                .setBaseOnWidth(true)\n                //是否让框架支持自定义 Fragment 的适配参数, 由于这个需求是比较少见的, 所以须要使用者手动开启\n                //如果没有这个需求建议不开启\n                .setCustomFragment(true);\n    }\n}\n"
  },
  {
    "path": "lib_common/src/main/java/com/senon/lib_common/base/BaseApplication.java",
    "content": "package com.senon.lib_common.base;\n\nimport android.app.Application;\n\n/**\n * 要想使用BaseApplication，必须在组件中实现自己的Application，并且继承BaseApplication；\n * 组件模块中实现的Application必须在debug包中的AndroidManifest.xml中注册，否则无法使用；\n * 组件模块的Application需置于java/debug文件夹中，不得放于主代码；\n * 组件模块中获取Context的方法必须为:ConstantUtils.getAPPContext()，不允许其他写法；\n */\npublic class BaseApplication extends Application {\n\n    @Override\n    public void onCreate() {\n        super.onCreate();\n        BaseAppDeletage baseAppDeletage = new BaseAppDeletage(this);\n        baseAppDeletage.onCreate();\n    }\n}\n"
  },
  {
    "path": "lib_common/src/main/java/com/senon/lib_common/base/BaseFragment.java",
    "content": "package com.senon.lib_common.base;\n\nimport android.content.Context;\nimport android.os.Bundle;\nimport android.view.LayoutInflater;\nimport android.view.View;\nimport android.view.ViewGroup;\nimport com.trello.rxlifecycle2.components.support.RxFragment;\n\n/**\n * 父类->基类->动态指定类型->泛型设计（通过泛型指定动态类型->由子类指定，父类只需要规定范围即可）\n */\npublic abstract class BaseFragment<V extends BaseViewImp, P extends BasePresenter<V>> extends RxFragment {\n\n    //引用V层和P层\n    private P presenter;\n    private V view;\n    public Context mContext;\n\n    public P getPresenter() {\n        return presenter;\n    }\n\n    @Override\n    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {\n        View view = inflater.inflate(getLayoutId(), container, false);\n        mContext = getActivity();\n        if (presenter == null) {\n            presenter = createPresenter();\n        }\n        if (this.view == null) {\n            this.view = createView();\n        }\n        if (presenter != null && view != null) {\n            presenter.attachView(this.view);\n        }\n        init();\n        return view;\n    }\n\n    //由子类指定具体类型\n    public abstract int getLayoutId();\n    public abstract P createPresenter();\n    public abstract V createView();\n    public abstract void init();\n\n    @Override\n    public void onDestroyView() {\n        super.onDestroyView();\n        if (presenter != null) {\n            presenter.detachView();\n        }\n    }\n}"
  },
  {
    "path": "lib_common/src/main/java/com/senon/lib_common/base/BaseLazyFragment.java",
    "content": "package com.senon.lib_common.base;\n\nimport android.content.Context;\nimport android.os.Bundle;\nimport android.support.annotation.Nullable;\nimport android.view.LayoutInflater;\nimport android.view.View;\nimport android.view.ViewGroup;\nimport com.senon.lib_common.utils.LogUtils;\nimport com.trello.rxlifecycle2.components.support.RxFragment;\n\n/**\n * https://juejin.im/post/5adcb0e36fb9a07aa7673fbc\n * BaseLazyFragment 单fragment懒加载\n *\n *  * 生命周期执行的方法 如下：\n * 第一次生成页面-->可见\n * setUserVisibleHint: ----->false\n * setUserVisibleHint: ----->true\n * onCreateView: -----> onCreateView\n * onStart: -----> onStart\n * onFragmentFirst: 首次可见\n * onFragmentFirst: -----> 子fragment进行初始化操作\n * onResume: -----> onResume\n *\n * 可见-->第一次隐藏：\n * onPause: -----> onPause\n * onFragmentInVisible: 不可见\n *\n * 未销毁且不可见-->重新可见：\n * onStart: -----> onStart\n * onFragmentVisble: 可见\n * onFragmentVisble: -----> 子fragment每次可见时的操作\n * onResume: -----> onResume\n *\n * 可见-->销毁：\n * onPause: -----> onPause\n * onFragmentInVisible: 不可见\n * onDestroyView: -----> onDestroyView\n *\n * 我们可以更具以上生命周期来操作不同的业务逻辑，\n * 请务必运行此module demo，观看打印日志来自定义逻辑。\n */\npublic abstract class BaseLazyFragment<V extends BaseViewImp, P extends BasePresenter<V>> extends RxFragment {\n    //引用V层和P层\n    private P presenter;\n    private V view;\n    public Context mContext;\n\n    private View rootView;\n    private boolean mIsFirstVisible = true;/*当前Fragment是否首次可见，默认是首次可见**/\n    private boolean isViewCreated = false;/*当前Fragment的View是否已经创建**/\n    private boolean currentVisibleState = false;/*当前Fragment的可见状态，一种当前可见，一种当前不可见**/\n\n    public P getPresenter() {\n        return presenter;\n    }\n\n    @Nullable\n    @Override\n    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {\n        LogUtils.e(\"-----> onCreateView\");\n        if(rootView == null){\n            rootView = inflater.inflate(getLayoutId(), container, false);\n            mContext = getActivity();\n            if (presenter == null) {\n                presenter = createPresenter();\n            }\n            if (this.view == null) {\n                this.view = createView();\n            }\n            if (presenter != null && view != null) {\n                presenter.attachView(this.view);\n            }\n            init(rootView);\n        }\n        isViewCreated=true;//在onCreateView执行完毕，将isViewCreated改为true;\n        return rootView;\n    }\n\n    //由子类指定具体类型\n    public abstract int getLayoutId();\n    public abstract P createPresenter();\n    public abstract V createView();\n    public abstract void init(View rootView);\n\n    @Override\n    public void setUserVisibleHint(boolean isVisibleToUser) {\n        super.setUserVisibleHint(isVisibleToUser);\n        LogUtils.e(\"----->\"+isVisibleToUser);\n        if (isViewCreated) {\n            //Fragment可见且状态不是可见(从一个Fragment切换到另外一个Fragment,后一个设置状态为可见)\n            if (isVisibleToUser && !currentVisibleState) {\n                disPatchFragment(true);\n            } else if (!isVisibleToUser && currentVisibleState) {\n                //Fragment不可见且状态是可见(从一个Fragment切换到另外一个Fragment,前一个更改状态为不可见)\n                disPatchFragment(false);\n            }\n        }\n    }\n\n    @Override\n    public void onStart() {\n        super.onStart();\n        LogUtils.e(\"-----> onStart\");\n        //isHidden()是Fragment是否处于隐藏状态和isVisible()有区别\n        //getUserVisibleHint(),Fragement是否可见\n        if(!isHidden()&& getUserVisibleHint()){//如果Fragment没有隐藏且可见\n            //执行分发的方法,三种结果对应自Fragment的三个回调，对应的操作，Fragment首次加载，可见，不可见\n            disPatchFragment(true);\n        }\n    }\n\n    @Override\n    public void onResume() {\n        super.onResume();\n        LogUtils.e(\"-----> onResume\");\n        if(!mIsFirstVisible){\n            //表示点击home键又返回操作,设置可见状态为ture\n            if(!isHidden()&& !getUserVisibleHint() && currentVisibleState){\n                disPatchFragment(true);\n            }\n        }\n    }\n\n    @Override\n    public void onPause() {\n        super.onPause();\n        LogUtils.e(\"-----> onPause\");\n        //表示点击home键,原来可见的Fragment要走该方法，更改Fragment的状态为不可见\n        if(!isHidden()&& getUserVisibleHint()){\n            disPatchFragment(false);\n        }\n    }\n\n    @Override\n    public void onDestroyView() {\n        super.onDestroyView();\n        LogUtils.e(\"-----> onDestroyView\");\n        //当 View 被销毁的时候我们需要重新设置 isViewCreated mIsFirstVisible 的状态\n        isViewCreated = false;\n        mIsFirstVisible = true;\n\n        if (presenter != null) {\n            presenter.detachView();\n        }\n    }\n\n\n    /**\n     * @param visible Fragment当前是否可见，然后调用相关方法\n     */\n    public void disPatchFragment(boolean visible){\n        currentVisibleState=visible;\n        if(visible){//Fragment可见\n            if(mIsFirstVisible){//可见又是第一次\n                mIsFirstVisible=false;//改变首次可见的状态\n                onFragmentFirst();\n            }else{//可见但不是第一次\n                onFragmentVisble();\n            }\n        }else {//不可见\n            onFragmentInVisible();\n        }\n    }\n\n    //Fragemnet首次可见的方法\n    public void onFragmentFirst(){\n        LogUtils.e(\"首次可见\");\n    }\n    //Fragemnet可见的方法\n    public void onFragmentVisble(){//子Fragment调用次方法，执行可见操作\n        LogUtils.e(\"可见\");\n    }\n    //Fragemnet不可见的方法\n    public void onFragmentInVisible(){\n        LogUtils.e(\"不可见\");\n    }\n\n}\n"
  },
  {
    "path": "lib_common/src/main/java/com/senon/lib_common/base/BaseNestingLazyFragment.java",
    "content": "package com.senon.lib_common.base;\n\nimport android.annotation.SuppressLint;\nimport android.content.Context;\nimport android.os.Bundle;\nimport android.support.annotation.Nullable;\nimport android.support.v4.app.Fragment;\nimport android.support.v4.app.FragmentManager;\nimport android.view.LayoutInflater;\nimport android.view.View;\nimport android.view.ViewGroup;\nimport com.senon.lib_common.utils.LogUtils;\nimport com.trello.rxlifecycle2.components.support.RxFragment;\nimport java.util.List;\n\n/**\n * https://juejin.im/post/5adcb0e36fb9a07aa7673fbc\n *\n * BaseNestingLazyFragment  fragment嵌套fragment的懒加载父类\n */\npublic abstract class BaseNestingLazyFragment<V extends BaseViewImp, P extends BasePresenter<V>> extends RxFragment {\n    //引用V层和P层\n    private P presenter;\n    private V view;\n    public Context mContext;\n\n    private View rootView;\n    private boolean mIsFirstVisible = true;/*当前Fragment是否首次可见，默认是首次可见**/\n    private boolean isViewCreated = false;/*当前Fragment的View是否已经创建**/\n    private boolean currentVisibleState = false;/*当前Fragment的可见状态，一种当前可见，一种当前不可见**/\n\n    public P getPresenter() {\n        return presenter;\n    }\n\n    @Nullable\n    @Override\n    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {\n        LogUtils.e(\"-----> onCreateView\");\n        if (rootView == null) {\n            rootView = inflater.inflate(getLayoutId(), container, false);\n            mContext = getActivity();\n            if (presenter == null) {\n                presenter = createPresenter();\n            }\n            if (this.view == null) {\n                this.view = createView();\n            }\n            if (presenter != null && view != null) {\n                presenter.attachView(this.view);\n            }\n            init(rootView);\n        }\n        isViewCreated = true;//在onCreateView执行完毕，将isViewCreated改为true;\n        return rootView;\n    }\n\n    //由子类指定具体类型\n    public abstract int getLayoutId();\n\n    public abstract P createPresenter();\n\n    public abstract V createView();\n\n    public abstract void init(View rootView);\n\n    @Override\n    public void setUserVisibleHint(boolean isVisibleToUser) {\n        super.setUserVisibleHint(isVisibleToUser);\n        LogUtils.e(\"----->\" + isVisibleToUser);\n        if (isViewCreated) {\n            //Fragment可见且状态不是可见(从一个Fragment切换到另外一个Fragment,后一个设置状态为可见)\n            if (isVisibleToUser && !currentVisibleState) {\n                disPatchFragment(true);\n            } else if (!isVisibleToUser && currentVisibleState) {\n                //Fragment不可见且状态是可见(从一个Fragment切换到另外一个Fragment,前一个更改状态为不可见)\n                disPatchFragment(false);\n            }\n        }\n    }\n\n    @Override\n    public void onStart() {\n        super.onStart();\n        LogUtils.e(\"-----> onStart\");\n        //isHidden()是Fragment是否处于隐藏状态和isVisible()有区别\n        //getUserVisibleHint(),Fragement是否可见\n        if (!isHidden() && getUserVisibleHint()) {//如果Fragment没有隐藏且可见\n            //执行分发的方法,三种结果对应自Fragment的三个回调，对应的操作，Fragment首次加载，可见，不可见\n            disPatchFragment(true);\n        }\n\n    }\n\n    @Override\n    public void onResume() {\n        super.onResume();\n        LogUtils.e(\"-----> onResume\");\n        if (!mIsFirstVisible) {\n            //表示点击home键又返回操作,设置可见状态为ture\n            if (!isHidden() && !getUserVisibleHint() && currentVisibleState) {\n                disPatchFragment(true);\n            }\n        }\n    }\n\n    @Override\n    public void onPause() {\n        super.onPause();\n        LogUtils.e(\"-----> onPause\");\n        //表示点击home键,原来可见的Fragment要走该方法，更改Fragment的状态为不可见\n        if (!isHidden() && getUserVisibleHint()) {\n            disPatchFragment(false);\n        }\n    }\n\n    @Override\n    public void onDestroyView() {\n        super.onDestroyView();\n        LogUtils.e(\"-----> onDestroyView\");\n        //当 View 被销毁的时候我们需要重新设置 isViewCreated mIsFirstVisible 的状态\n        isViewCreated = false;\n        mIsFirstVisible = true;\n\n        if (presenter != null) {\n            presenter.detachView();\n        }\n\n    }\n\n\n    /**\n     * @param visible Fragment当前是否可见，然后调用相关方法\n     */\n    public void disPatchFragment(boolean visible) {\n        String aa = getClass().getSimpleName();\n        //如果父Fragment不可见,则不向下分发给子Fragment\n        if (visible && isParentFragmentVsible()) return;\n\n        // 如果当前的 Fragment 要分发的状态与 currentVisibleState 相同(都为false)我们就没有必要去做分发了。\n        if (currentVisibleState == visible) return;\n\n        currentVisibleState = visible;\n        if (visible) {//Fragment可见\n            if (mIsFirstVisible) {//可见又是第一次\n                mIsFirstVisible = false;//改变首次可见的状态\n                onFragmentFirst();\n            }else {//可见但不是第一次\n                onFragmentVisble();\n            }\n            //可见状态的时候内层 fragment 生命周期晚于外层 所以在 onFragmentResume 后分发\n            dispatchChildFragmentVisibleState(true);\n        } else {//不可见\n            onFragmentInVisible();\n            dispatchChildFragmentVisibleState(false);\n        }\n    }\n\n\n    /**\n     * 重新分发给子Fragment\n     *\n     * @param visible\n     */\n    private void dispatchChildFragmentVisibleState(boolean visible) {\n        FragmentManager childFragmentManager = getChildFragmentManager();\n        @SuppressLint(\"RestrictedApi\") List<Fragment> fragments = childFragmentManager.getFragments();\n        if (fragments != null) {\n            if (!fragments.isEmpty()) {\n                for (Fragment child : fragments) {\n                    if (child instanceof BaseNestingLazyFragment && !child.isHidden() && child.getUserVisibleHint()) {\n                        ((BaseNestingLazyFragment) child).disPatchFragment(visible);\n                    }\n                }\n            }\n        }\n\n    }\n\n    //Fragemnet首次可见的方法\n    public void onFragmentFirst() {\n        LogUtils.e(\"首次可见\");\n    }\n    //Fragemnet可见的方法\n    public void onFragmentVisble() {//子Fragment调用次方法，执行可见操作\n        LogUtils.e(\"可见\");\n    }\n    //Fragemnet不可见的方法\n    public void onFragmentInVisible() {\n        LogUtils.e(\"不可见\");\n    }\n\n    /**\n     * 判断多层嵌套的父Fragment是否显示\n     */\n    private boolean isParentFragmentVsible() {\n        BaseNestingLazyFragment fragment = (BaseNestingLazyFragment) getParentFragment();\n        return fragment != null && !fragment.getCurrentVisibleState();\n    }\n\n    private boolean getCurrentVisibleState() {\n        return currentVisibleState;\n    }\n\n}\n"
  },
  {
    "path": "lib_common/src/main/java/com/senon/lib_common/base/BasePresenter.java",
    "content": "package com.senon.lib_common.base;\n\n\n/**\n * BasePresenter\n */\npublic abstract class BasePresenter<V extends BaseViewImp>{\n\n    private V mView;\n\n    public V getView(){\n        return mView;\n    }\n\n    public void attachView(V v){\n        mView = v;\n    }\n\n    public void detachView(){\n        mView = null;\n    }\n\n\n}\n"
  },
  {
    "path": "lib_common/src/main/java/com/senon/lib_common/base/BaseResponse.java",
    "content": "package com.senon.lib_common.base;\n\nimport com.google.gson.annotations.SerializedName;\n\n/**\n * BaseResponse<T>\n */\npublic class BaseResponse<T> {\n\n    @SerializedName(\"errorMsg\")\n    private String msg;\n    @SerializedName(\"errorCode\")\n    private int code;\n    private T data;\n\n\n\n    public String getMsg() {\n        return msg;\n    }\n\n    public int getCode() {\n        return code;\n    }\n\n    public T getData() {\n        return data;\n    }\n\n\n}\n"
  },
  {
    "path": "lib_common/src/main/java/com/senon/lib_common/base/BaseViewImp.java",
    "content": "package com.senon.lib_common.base;\n\n/**\n * View 父类接口\n */\npublic interface BaseViewImp {\n}\n"
  },
  {
    "path": "lib_common/src/main/java/com/senon/lib_common/bean/Banner.java",
    "content": "package com.senon.lib_common.bean;\n\n/**\n * 首页Banner\n */\npublic class Banner {\n\n    /**\n     * desc : 一起来做个App吧\n     * id : 10\n     * imagePath : http://www.wanandroid.com/blogimgs/50c115c2-cf6c-4802-aa7b-a4334de444cd.png\n     * isVisible : 1\n     * order : 3\n     * title : 一起来做个App吧\n     * type : 0\n     * url : http://www.wanandroid.com/blog/show/2\n     */\n\n    private String desc;\n    private int id;\n    private String imagePath;\n    private int isVisible;\n    private int order;\n    private String title;\n    private int type;\n    private String url;\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 getId() {\n        return id;\n    }\n\n    public void setId(int id) {\n        this.id = id;\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 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 String getTitle() {\n        return title;\n    }\n\n    public void setTitle(String title) {\n        this.title = title;\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 String getUrl() {\n        return url;\n    }\n\n    public void setUrl(String url) {\n        this.url = url;\n    }\n}\n"
  },
  {
    "path": "lib_common/src/main/java/com/senon/lib_common/bean/CollectionArticle.java",
    "content": "package com.senon.lib_common.bean;\n\nimport java.util.List;\n\n/**\n * 收藏列表文章\n */\n\npublic class CollectionArticle {\n\n    /**\n     * curPage : 1\n     * datas : [{\"author\":\"xiangcman\",\"chapterId\":314,\"chapterName\":\"RV列表动效\",\"courseId\":13,\"desc\":\"快速利用RecyclerView的LayoutManager搭建流式布局  \",\"envelopePic\":\"http://www.wanandroid.com/blogimgs/36badc79-fb1e-460e-8368-6898c16ba723.png\",\"id\":9977,\"link\":\"http://www.wanandroid.com/blog/show/2112\",\"niceDate\":\"2018-05-02\",\"origin\":\"\",\"originId\":2829,\"publishTime\":1525237333000,\"title\":\"快速利用RecyclerView的LayoutManager搭建流式布局  \",\"userId\":1864,\"visible\":0,\"zan\":0}]\n     * offset : 0\n     * over : true\n     * pageCount : 1\n     * size : 20\n     * total : 5\n     */\n\n    private int curPage;\n    private int offset;\n    private boolean over;\n    private int pageCount;\n    private int size;\n    private int total;\n    private List<DatasBean> datas;\n\n    public int getCurPage() {\n        return curPage;\n    }\n\n    public void setCurPage(int curPage) {\n        this.curPage = curPage;\n    }\n\n    public int getOffset() {\n        return offset;\n    }\n\n    public void setOffset(int offset) {\n        this.offset = offset;\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 int getPageCount() {\n        return pageCount;\n    }\n\n    public void setPageCount(int pageCount) {\n        this.pageCount = pageCount;\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 List<DatasBean> getDatas() {\n        return datas;\n    }\n\n    public void setDatas(List<DatasBean> datas) {\n        this.datas = datas;\n    }\n\n    public static class DatasBean {\n        /**\n         * author : xiangcman\n         * chapterId : 314\n         * chapterName : RV列表动效\n         * courseId : 13\n         * desc : 快速利用RecyclerView的LayoutManager搭建流式布局\n         * envelopePic : http://www.wanandroid.com/blogimgs/36badc79-fb1e-460e-8368-6898c16ba723.png\n         * id : 9977\n         * link : http://www.wanandroid.com/blog/show/2112\n         * niceDate : 2018-05-02\n         * origin :\n         * originId : 2829\n         * publishTime : 1525237333000\n         * title : 快速利用RecyclerView的LayoutManager搭建流式布局\n         * userId : 1864\n         * visible : 0\n         * zan : 0\n         */\n\n        private String author;\n        private int chapterId;\n        private String chapterName;\n        private int courseId;\n        private String desc;\n        private String envelopePic;\n        private int id;\n        private String link;\n        private String niceDate;\n        private String origin;\n        private int originId;\n        private long publishTime;\n        private String title;\n        private int userId;\n        private int visible;\n        private int zan;\n\n        public String getAuthor() {\n            return author;\n        }\n\n        public void setAuthor(String author) {\n            this.author = author;\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 int getCourseId() {\n            return courseId;\n        }\n\n        public void setCourseId(int courseId) {\n            this.courseId = courseId;\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 String getEnvelopePic() {\n            return envelopePic;\n        }\n\n        public void setEnvelopePic(String envelopePic) {\n            this.envelopePic = envelopePic;\n        }\n\n        public int getId() {\n            return id;\n        }\n\n        public void setId(int id) {\n            this.id = id;\n        }\n\n        public String getLink() {\n            return link;\n        }\n\n        public void setLink(String link) {\n            this.link = link;\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 String getOrigin() {\n            return origin;\n        }\n\n        public void setOrigin(String 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 String getTitle() {\n            return title;\n        }\n\n        public void setTitle(String title) {\n            this.title = title;\n        }\n\n        public int getUserId() {\n            return userId;\n        }\n\n        public void setUserId(int userId) {\n            this.userId = userId;\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 getZan() {\n            return zan;\n        }\n\n        public void setZan(int zan) {\n            this.zan = zan;\n        }\n    }\n}\n"
  },
  {
    "path": "lib_common/src/main/java/com/senon/lib_common/bean/HomeArticle.java",
    "content": "package com.senon.lib_common.bean;\n\nimport java.util.List;\n\n/**\n * 首页文章\n */\n\npublic class HomeArticle {\n\n    /**\n     * curPage : 1\n     * datas : [{\"apkLink\":\"\",\"author\":\"tinycoder\",\"chapterId\":191,\"chapterName\":\"数据采集与埋点\",\n     * \"collect\":false,\"courseId\":13,\"desc\":\"\",\"envelopePic\":\"\",\"fresh\":true,\"id\":7656,\n     * \"link\":\"https://juejin.im/post/5c0e4117518825369c566f07\",\"niceDate\":\"15小时前\",\"origin\":\"\",\n     * \"projectLink\":\"\",\"publishTime\":1544631512000,\"superChapterId\":79,\"superChapterName\":\"热门专题\",\n     * \"tags\":[],\"title\":\"无埋点统计SDK实践\",\"type\":0,\"userId\":-1,\"visible\":1,\"zan\":0}]\n     * offset : 0\n     * over : false\n     * pageCount : 290\n     * size : 20\n     * total : 5798\n     */\n\n    private int curPage;\n    private int offset;\n    private boolean over;\n    private int pageCount;\n    private int size;\n    private int total;\n    private List<DatasBean> datas;\n\n    public int getCurPage() {\n        return curPage;\n    }\n\n    public void setCurPage(int curPage) {\n        this.curPage = curPage;\n    }\n\n    public int getOffset() {\n        return offset;\n    }\n\n    public void setOffset(int offset) {\n        this.offset = offset;\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 int getPageCount() {\n        return pageCount;\n    }\n\n    public void setPageCount(int pageCount) {\n        this.pageCount = pageCount;\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 List<DatasBean> getDatas() {\n        return datas;\n    }\n\n    public void setDatas(List<DatasBean> datas) {\n        this.datas = datas;\n    }\n\n    public static class DatasBean {\n        /**\n         * apkLink :\n         * author : tinycoder\n         * chapterId : 191\n         * chapterName : 数据采集与埋点\n         * collect : false\n         * courseId : 13\n         * desc :\n         * envelopePic :\n         * fresh : true\n         * id : 7656\n         * link : https://juejin.im/post/5c0e4117518825369c566f07\n         * niceDate : 15小时前\n         * origin :\n         * projectLink :\n         * publishTime : 1544631512000\n         * superChapterId : 79\n         * superChapterName : 热门专题\n         * tags : []\n         * title : 无埋点统计SDK实践\n         * type : 0\n         * userId : -1\n         * visible : 1\n         * zan : 0\n         */\n\n        private String apkLink;\n        private String author;\n        private int chapterId;\n        private String chapterName;\n        private boolean collect;\n        private int courseId;\n        private String desc;\n        private String envelopePic;\n        private boolean fresh;\n        private int id;\n        private String link;\n        private String niceDate;\n        private String origin;\n        private String projectLink;\n        private long publishTime;\n        private int superChapterId;\n        private String superChapterName;\n        private String title;\n        private int type;\n        private int userId;\n        private int visible;\n        private int zan;\n        private List<?> tags;\n\n        public String getApkLink() {\n            return apkLink;\n        }\n\n        public void setApkLink(String apkLink) {\n            this.apkLink = apkLink;\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 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 boolean isCollect() {\n            return collect;\n        }\n\n        public void setCollect(boolean collect) {\n            this.collect = collect;\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 String getDesc() {\n            return desc;\n        }\n\n        public void setDesc(String desc) {\n            this.desc = desc;\n        }\n\n        public String getEnvelopePic() {\n            return envelopePic;\n        }\n\n        public void setEnvelopePic(String envelopePic) {\n            this.envelopePic = envelopePic;\n        }\n\n        public boolean isFresh() {\n            return fresh;\n        }\n\n        public void setFresh(boolean fresh) {\n            this.fresh = fresh;\n        }\n\n        public int getId() {\n            return id;\n        }\n\n        public void setId(int id) {\n            this.id = id;\n        }\n\n        public String getLink() {\n            return link;\n        }\n\n        public void setLink(String link) {\n            this.link = link;\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 String getOrigin() {\n            return origin;\n        }\n\n        public void setOrigin(String origin) {\n            this.origin = origin;\n        }\n\n        public String getProjectLink() {\n            return projectLink;\n        }\n\n        public void setProjectLink(String projectLink) {\n            this.projectLink = projectLink;\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 int getSuperChapterId() {\n            return superChapterId;\n        }\n\n        public void setSuperChapterId(int superChapterId) {\n            this.superChapterId = superChapterId;\n        }\n\n        public String getSuperChapterName() {\n            return superChapterName;\n        }\n\n        public void setSuperChapterName(String superChapterName) {\n            this.superChapterName = superChapterName;\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 getType() {\n            return type;\n        }\n\n        public void setType(int type) {\n            this.type = type;\n        }\n\n        public int getUserId() {\n            return userId;\n        }\n\n        public void setUserId(int userId) {\n            this.userId = userId;\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 getZan() {\n            return zan;\n        }\n\n        public void setZan(int zan) {\n            this.zan = zan;\n        }\n\n        public List<?> getTags() {\n            return tags;\n        }\n\n        public void setTags(List<?> tags) {\n            this.tags = tags;\n        }\n    }\n}\n"
  },
  {
    "path": "lib_common/src/main/java/com/senon/lib_common/bean/KnowledgeSysArticle.java",
    "content": "package com.senon.lib_common.bean;\n\nimport java.util.List;\n\n/**\n * 知识体系文章\n */\npublic class KnowledgeSysArticle {\n\n    /**\n     * curPage : 1\n     * datas : [{\"apkLink\":\"\",\"author\":\"littledavid-tech\",\"chapterId\":294,\"chapterName\":\"完整项目\",\"collect\":false,\"courseId\":13,\"desc\":\"这个算是对Android学习总结，MVP架构+好多轮子\",\"envelopePic\":\"http://wanandroid.com/blogimgs/9be242c9-e53e-4a54-9f49-d69b04b463b9.png\",\"fresh\":false,\"id\":7641,\"link\":\"http://www.wanandroid.com/blog/show/2449\",\"niceDate\":\"2天前\",\"origin\":\"\",\"projectLink\":\"https://github.com/littledavid-tech/WanAndroidApp\",\"publishTime\":1544499146000,\"superChapterId\":294,\"superChapterName\":\"开源项目主Tab\",\"tags\":[{\"name\":\"项目\",\"url\":\"/project/list/1?cid=294\"}],\"title\":\"我的涂鸦之作WanAndroid第三方客户端\",\"type\":0,\"userId\":-1,\"visible\":1,\"zan\":0}]\n     * offset : 0\n     * over : false\n     * pageCount : 7\n     * size : 15\n     * total : 102\n     */\n\n    private int curPage;\n    private int offset;\n    private boolean over;\n    private int pageCount;\n    private int size;\n    private int total;\n    private List<DatasBean> datas;\n\n    public int getCurPage() {\n        return curPage;\n    }\n\n    public void setCurPage(int curPage) {\n        this.curPage = curPage;\n    }\n\n    public int getOffset() {\n        return offset;\n    }\n\n    public void setOffset(int offset) {\n        this.offset = offset;\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 int getPageCount() {\n        return pageCount;\n    }\n\n    public void setPageCount(int pageCount) {\n        this.pageCount = pageCount;\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 List<DatasBean> getDatas() {\n        return datas;\n    }\n\n    public void setDatas(List<DatasBean> datas) {\n        this.datas = datas;\n    }\n\n    public static class DatasBean {\n        /**\n         * apkLink :\n         * author : littledavid-tech\n         * chapterId : 294\n         * chapterName : 完整项目\n         * collect : false\n         * courseId : 13\n         * desc : 这个算是对Android学习总结，MVP架构+好多轮子\n         * envelopePic : http://wanandroid.com/blogimgs/9be242c9-e53e-4a54-9f49-d69b04b463b9.png\n         * fresh : false\n         * id : 7641\n         * link : http://www.wanandroid.com/blog/show/2449\n         * niceDate : 2天前\n         * origin :\n         * projectLink : https://github.com/littledavid-tech/WanAndroidApp\n         * publishTime : 1544499146000\n         * superChapterId : 294\n         * superChapterName : 开源项目主Tab\n         * tags : [{\"name\":\"项目\",\"url\":\"/project/list/1?cid=294\"}]\n         * title : 我的涂鸦之作WanAndroid第三方客户端\n         * type : 0\n         * userId : -1\n         * visible : 1\n         * zan : 0\n         */\n\n        private String apkLink;\n        private String author;\n        private int chapterId;\n        private String chapterName;\n        private boolean collect;\n        private int courseId;\n        private String desc;\n        private String envelopePic;\n        private boolean fresh;\n        private int id;\n        private String link;\n        private String niceDate;\n        private String origin;\n        private String projectLink;\n        private long publishTime;\n        private int superChapterId;\n        private String superChapterName;\n        private String title;\n        private int type;\n        private int userId;\n        private int visible;\n        private int zan;\n        private List<TagsBean> tags;\n\n        public String getApkLink() {\n            return apkLink;\n        }\n\n        public void setApkLink(String apkLink) {\n            this.apkLink = apkLink;\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 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 boolean isCollect() {\n            return collect;\n        }\n\n        public void setCollect(boolean collect) {\n            this.collect = collect;\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 String getDesc() {\n            return desc;\n        }\n\n        public void setDesc(String desc) {\n            this.desc = desc;\n        }\n\n        public String getEnvelopePic() {\n            return envelopePic;\n        }\n\n        public void setEnvelopePic(String envelopePic) {\n            this.envelopePic = envelopePic;\n        }\n\n        public boolean isFresh() {\n            return fresh;\n        }\n\n        public void setFresh(boolean fresh) {\n            this.fresh = fresh;\n        }\n\n        public int getId() {\n            return id;\n        }\n\n        public void setId(int id) {\n            this.id = id;\n        }\n\n        public String getLink() {\n            return link;\n        }\n\n        public void setLink(String link) {\n            this.link = link;\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 String getOrigin() {\n            return origin;\n        }\n\n        public void setOrigin(String origin) {\n            this.origin = origin;\n        }\n\n        public String getProjectLink() {\n            return projectLink;\n        }\n\n        public void setProjectLink(String projectLink) {\n            this.projectLink = projectLink;\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 int getSuperChapterId() {\n            return superChapterId;\n        }\n\n        public void setSuperChapterId(int superChapterId) {\n            this.superChapterId = superChapterId;\n        }\n\n        public String getSuperChapterName() {\n            return superChapterName;\n        }\n\n        public void setSuperChapterName(String superChapterName) {\n            this.superChapterName = superChapterName;\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 getType() {\n            return type;\n        }\n\n        public void setType(int type) {\n            this.type = type;\n        }\n\n        public int getUserId() {\n            return userId;\n        }\n\n        public void setUserId(int userId) {\n            this.userId = userId;\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 getZan() {\n            return zan;\n        }\n\n        public void setZan(int zan) {\n            this.zan = zan;\n        }\n\n        public List<TagsBean> getTags() {\n            return tags;\n        }\n\n        public void setTags(List<TagsBean> tags) {\n            this.tags = tags;\n        }\n\n        public static class TagsBean {\n            /**\n             * name : 项目\n             * url : /project/list/1?cid=294\n             */\n\n            private String name;\n            private String url;\n\n            public String getName() {\n                return name;\n            }\n\n            public void setName(String name) {\n                this.name = name;\n            }\n\n            public String getUrl() {\n                return url;\n            }\n\n            public void setUrl(String url) {\n                this.url = url;\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "lib_common/src/main/java/com/senon/lib_common/bean/KnowledgeSystem.java",
    "content": "package com.senon.lib_common.bean;\n\nimport java.util.List;\n\n/**\n * 知识体系\n */\npublic class KnowledgeSystem {\n\n    /**\n     * children : [{\"children\":[],\"courseId\":13,\"id\":60,\"name\":\"Android Studio相关\",\"order\":1000,\"parentChapterId\":150,\"userControlSetTop\":false,\"visible\":1},{\"children\":[],\"courseId\":13,\"id\":169,\"name\":\"gradle\",\"order\":1001,\"parentChapterId\":150,\"userControlSetTop\":false,\"visible\":1},{\"children\":[],\"courseId\":13,\"id\":269,\"name\":\"官方发布\",\"order\":1002,\"parentChapterId\":150,\"userControlSetTop\":false,\"visible\":1}]\n     * courseId : 13\n     * id : 150\n     * name : 开发环境\n     * order : 1\n     * parentChapterId : 0\n     * userControlSetTop : false\n     * visible : 1\n     */\n\n    private int courseId;\n    private int id;\n    private String name;\n    private int order;\n    private int parentChapterId;\n    private boolean userControlSetTop;\n    private int visible;\n    private List<ChildrenBean> children;\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 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 getOrder() {\n        return order;\n    }\n\n    public void setOrder(int order) {\n        this.order = order;\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 boolean isUserControlSetTop() {\n        return userControlSetTop;\n    }\n\n    public void setUserControlSetTop(boolean userControlSetTop) {\n        this.userControlSetTop = userControlSetTop;\n    }\n\n    public int getVisible() {\n        return visible;\n    }\n\n    public void setVisible(int visible) {\n        this.visible = visible;\n    }\n\n    public List<ChildrenBean> getChildren() {\n        return children;\n    }\n\n    public void setChildren(List<ChildrenBean> children) {\n        this.children = children;\n    }\n\n    public static class ChildrenBean {\n        /**\n         * children : []\n         * courseId : 13\n         * id : 60\n         * name : Android Studio相关\n         * order : 1000\n         * parentChapterId : 150\n         * userControlSetTop : false\n         * visible : 1\n         */\n\n        private int courseId;\n        private int id;\n        private String name;\n        private int order;\n        private int parentChapterId;\n        private boolean userControlSetTop;\n        private int visible;\n        private List<?> children;\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 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 getOrder() {\n            return order;\n        }\n\n        public void setOrder(int order) {\n            this.order = order;\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 boolean isUserControlSetTop() {\n            return userControlSetTop;\n        }\n\n        public void setUserControlSetTop(boolean userControlSetTop) {\n            this.userControlSetTop = userControlSetTop;\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}\n"
  },
  {
    "path": "lib_common/src/main/java/com/senon/lib_common/bean/Login.java",
    "content": "package com.senon.lib_common.bean;\n\nimport java.util.List;\n\n/**\n * 登录--实体\n */\npublic class Login {\n\n    /**\n     * chapterTops : []\n     * collectIds : [2683,2880,2875,2868,2831,2829,2807]\n     * email :\n     * icon :\n     * id : 1864\n     * password :\n     * token :\n     * type : 0\n     * username : senonwx\n     */\n\n    private String email;\n    private String icon;\n    private int id;\n    private String password;\n    private String token;\n    private int type;\n    private String username;\n    private List<?> chapterTops;\n    private List<Integer> collectIds;\n\n    public String getEmail() {\n        return email;\n    }\n\n    public void setEmail(String email) {\n        this.email = email;\n    }\n\n    public String getIcon() {\n        return icon;\n    }\n\n    public void setIcon(String icon) {\n        this.icon = icon;\n    }\n\n    public int getId() {\n        return id;\n    }\n\n    public void setId(int id) {\n        this.id = id;\n    }\n\n    public String getPassword() {\n        return password;\n    }\n\n    public void setPassword(String password) {\n        this.password = password;\n    }\n\n    public String getToken() {\n        return token;\n    }\n\n    public void setToken(String token) {\n        this.token = token;\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 String getUsername() {\n        return username;\n    }\n\n    public void setUsername(String username) {\n        this.username = username;\n    }\n\n    public List<?> getChapterTops() {\n        return chapterTops;\n    }\n\n    public void setChapterTops(List<?> chapterTops) {\n        this.chapterTops = chapterTops;\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": "lib_common/src/main/java/com/senon/lib_common/bean/ProjectArticle.java",
    "content": "package com.senon.lib_common.bean;\n\nimport java.util.List;\n\n/**\n * 项目列表\n */\n\npublic class ProjectArticle {\n\n    /**\n     * curPage : 1\n     * datas : [{\"apkLink\":\"\",\"author\":\"littledavid-tech\",\"chapterId\":294,\"chapterName\":\"完整项目\",\"collect\":false,\"courseId\":13,\"desc\":\"这个算是对Android学习总结，MVP架构+好多轮子\",\"envelopePic\":\"http://wanandroid.com/blogimgs/9be242c9-e53e-4a54-9f49-d69b04b463b9.png\",\"fresh\":false,\"id\":7641,\"link\":\"http://www.wanandroid.com/blog/show/2449\",\"niceDate\":\"2天前\",\"origin\":\"\",\"projectLink\":\"https://github.com/littledavid-tech/WanAndroidApp\",\"publishTime\":1544499146000,\"superChapterId\":294,\"superChapterName\":\"开源项目主Tab\",\"tags\":[{\"name\":\"项目\",\"url\":\"/project/list/1?cid=294\"}],\"title\":\"我的涂鸦之作WanAndroid第三方客户端\",\"type\":0,\"userId\":-1,\"visible\":1,\"zan\":0}]\n     * offset : 0\n     * over : false\n     * pageCount : 7\n     * size : 15\n     * total : 102\n     */\n\n    private int curPage;\n    private int offset;\n    private boolean over;\n    private int pageCount;\n    private int size;\n    private int total;\n    private List<DatasBean> datas;\n\n    public int getCurPage() {\n        return curPage;\n    }\n\n    public void setCurPage(int curPage) {\n        this.curPage = curPage;\n    }\n\n    public int getOffset() {\n        return offset;\n    }\n\n    public void setOffset(int offset) {\n        this.offset = offset;\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 int getPageCount() {\n        return pageCount;\n    }\n\n    public void setPageCount(int pageCount) {\n        this.pageCount = pageCount;\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 List<DatasBean> getDatas() {\n        return datas;\n    }\n\n    public void setDatas(List<DatasBean> datas) {\n        this.datas = datas;\n    }\n\n    public static class DatasBean {\n        /**\n         * apkLink :\n         * author : littledavid-tech\n         * chapterId : 294\n         * chapterName : 完整项目\n         * collect : false\n         * courseId : 13\n         * desc : 这个算是对Android学习总结，MVP架构+好多轮子\n         * envelopePic : http://wanandroid.com/blogimgs/9be242c9-e53e-4a54-9f49-d69b04b463b9.png\n         * fresh : false\n         * id : 7641\n         * link : http://www.wanandroid.com/blog/show/2449\n         * niceDate : 2天前\n         * origin :\n         * projectLink : https://github.com/littledavid-tech/WanAndroidApp\n         * publishTime : 1544499146000\n         * superChapterId : 294\n         * superChapterName : 开源项目主Tab\n         * tags : [{\"name\":\"项目\",\"url\":\"/project/list/1?cid=294\"}]\n         * title : 我的涂鸦之作WanAndroid第三方客户端\n         * type : 0\n         * userId : -1\n         * visible : 1\n         * zan : 0\n         */\n\n        private String apkLink;\n        private String author;\n        private int chapterId;\n        private String chapterName;\n        private boolean collect;\n        private int courseId;\n        private String desc;\n        private String envelopePic;\n        private boolean fresh;\n        private int id;\n        private String link;\n        private String niceDate;\n        private String origin;\n        private String projectLink;\n        private long publishTime;\n        private int superChapterId;\n        private String superChapterName;\n        private String title;\n        private int type;\n        private int userId;\n        private int visible;\n        private int zan;\n        private List<TagsBean> tags;\n\n        public String getApkLink() {\n            return apkLink;\n        }\n\n        public void setApkLink(String apkLink) {\n            this.apkLink = apkLink;\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 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 boolean isCollect() {\n            return collect;\n        }\n\n        public void setCollect(boolean collect) {\n            this.collect = collect;\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 String getDesc() {\n            return desc;\n        }\n\n        public void setDesc(String desc) {\n            this.desc = desc;\n        }\n\n        public String getEnvelopePic() {\n            return envelopePic;\n        }\n\n        public void setEnvelopePic(String envelopePic) {\n            this.envelopePic = envelopePic;\n        }\n\n        public boolean isFresh() {\n            return fresh;\n        }\n\n        public void setFresh(boolean fresh) {\n            this.fresh = fresh;\n        }\n\n        public int getId() {\n            return id;\n        }\n\n        public void setId(int id) {\n            this.id = id;\n        }\n\n        public String getLink() {\n            return link;\n        }\n\n        public void setLink(String link) {\n            this.link = link;\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 String getOrigin() {\n            return origin;\n        }\n\n        public void setOrigin(String origin) {\n            this.origin = origin;\n        }\n\n        public String getProjectLink() {\n            return projectLink;\n        }\n\n        public void setProjectLink(String projectLink) {\n            this.projectLink = projectLink;\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 int getSuperChapterId() {\n            return superChapterId;\n        }\n\n        public void setSuperChapterId(int superChapterId) {\n            this.superChapterId = superChapterId;\n        }\n\n        public String getSuperChapterName() {\n            return superChapterName;\n        }\n\n        public void setSuperChapterName(String superChapterName) {\n            this.superChapterName = superChapterName;\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 getType() {\n            return type;\n        }\n\n        public void setType(int type) {\n            this.type = type;\n        }\n\n        public int getUserId() {\n            return userId;\n        }\n\n        public void setUserId(int userId) {\n            this.userId = userId;\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 getZan() {\n            return zan;\n        }\n\n        public void setZan(int zan) {\n            this.zan = zan;\n        }\n\n        public List<TagsBean> getTags() {\n            return tags;\n        }\n\n        public void setTags(List<TagsBean> tags) {\n            this.tags = tags;\n        }\n\n        public static class TagsBean {\n            /**\n             * name : 项目\n             * url : /project/list/1?cid=294\n             */\n\n            private String name;\n            private String url;\n\n            public String getName() {\n                return name;\n            }\n\n            public void setName(String name) {\n                this.name = name;\n            }\n\n            public String getUrl() {\n                return url;\n            }\n\n            public void setUrl(String url) {\n                this.url = url;\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "lib_common/src/main/java/com/senon/lib_common/bean/WXarticle.java",
    "content": "package com.senon.lib_common.bean;\n\nimport java.util.List;\n\n/**\n * 公众号文章\n */\n\npublic class WXarticle {\n\n\n    /**\n     * curPage : 2\n     * datas : [{\"apkLink\":\"\",\"author\":\"鸿洋\",\"chapterId\":408,\"chapterName\":\"鸿洋\",\"collect\":false,\"courseId\":13,\"desc\":\"\",\"envelopePic\":\"\",\"fresh\":false,\"id\":7503,\"link\":\"https://mp.weixin.qq.com/s/m1MhhUYi71OO9eZCU3xEwA\",\"niceDate\":\"2018-11-12\",\"origin\":\"\",\"projectLink\":\"\",\"publishTime\":1541952000000,\"superChapterId\":408,\"superChapterName\":\"公众号\",\"tags\":[{\"name\":\"公众号\",\"url\":\"/wxarticle/list/408/1\"}],\"title\":\"Toast 不显示了？\",\"type\":0,\"userId\":-1,\"visible\":1,\"zan\":0}]\n     * offset : 20\n     * over : false\n     * pageCount : 33\n     * size : 20\n     * total : 641\n     */\n\n    private int curPage;\n    private int offset;\n    private boolean over;\n    private int pageCount;\n    private int size;\n    private int total;\n    private List<DatasBean> datas;\n\n    public int getCurPage() {\n        return curPage;\n    }\n\n    public void setCurPage(int curPage) {\n        this.curPage = curPage;\n    }\n\n    public int getOffset() {\n        return offset;\n    }\n\n    public void setOffset(int offset) {\n        this.offset = offset;\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 int getPageCount() {\n        return pageCount;\n    }\n\n    public void setPageCount(int pageCount) {\n        this.pageCount = pageCount;\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 List<DatasBean> getDatas() {\n        return datas;\n    }\n\n    public void setDatas(List<DatasBean> datas) {\n        this.datas = datas;\n    }\n\n    public static class DatasBean {\n        /**\n         * apkLink :\n         * author : 鸿洋\n         * chapterId : 408\n         * chapterName : 鸿洋\n         * collect : false\n         * courseId : 13\n         * desc :\n         * envelopePic :\n         * fresh : false\n         * id : 7503\n         * link : https://mp.weixin.qq.com/s/m1MhhUYi71OO9eZCU3xEwA\n         * niceDate : 2018-11-12\n         * origin :\n         * projectLink :\n         * publishTime : 1541952000000\n         * superChapterId : 408\n         * superChapterName : 公众号\n         * tags : [{\"name\":\"公众号\",\"url\":\"/wxarticle/list/408/1\"}]\n         * title : Toast 不显示了？\n         * type : 0\n         * userId : -1\n         * visible : 1\n         * zan : 0\n         */\n\n        private String apkLink;\n        private String author;\n        private int chapterId;\n        private String chapterName;\n        private boolean collect;\n        private int courseId;\n        private String desc;\n        private String envelopePic;\n        private boolean fresh;\n        private int id;\n        private String link;\n        private String niceDate;\n        private String origin;\n        private String projectLink;\n        private long publishTime;\n        private int superChapterId;\n        private String superChapterName;\n        private String title;\n        private int type;\n        private int userId;\n        private int visible;\n        private int zan;\n        private List<TagsBean> tags;\n\n        public String getApkLink() {\n            return apkLink;\n        }\n\n        public void setApkLink(String apkLink) {\n            this.apkLink = apkLink;\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 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 boolean isCollect() {\n            return collect;\n        }\n\n        public void setCollect(boolean collect) {\n            this.collect = collect;\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 String getDesc() {\n            return desc;\n        }\n\n        public void setDesc(String desc) {\n            this.desc = desc;\n        }\n\n        public String getEnvelopePic() {\n            return envelopePic;\n        }\n\n        public void setEnvelopePic(String envelopePic) {\n            this.envelopePic = envelopePic;\n        }\n\n        public boolean isFresh() {\n            return fresh;\n        }\n\n        public void setFresh(boolean fresh) {\n            this.fresh = fresh;\n        }\n\n        public int getId() {\n            return id;\n        }\n\n        public void setId(int id) {\n            this.id = id;\n        }\n\n        public String getLink() {\n            return link;\n        }\n\n        public void setLink(String link) {\n            this.link = link;\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 String getOrigin() {\n            return origin;\n        }\n\n        public void setOrigin(String origin) {\n            this.origin = origin;\n        }\n\n        public String getProjectLink() {\n            return projectLink;\n        }\n\n        public void setProjectLink(String projectLink) {\n            this.projectLink = projectLink;\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 int getSuperChapterId() {\n            return superChapterId;\n        }\n\n        public void setSuperChapterId(int superChapterId) {\n            this.superChapterId = superChapterId;\n        }\n\n        public String getSuperChapterName() {\n            return superChapterName;\n        }\n\n        public void setSuperChapterName(String superChapterName) {\n            this.superChapterName = superChapterName;\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 getType() {\n            return type;\n        }\n\n        public void setType(int type) {\n            this.type = type;\n        }\n\n        public int getUserId() {\n            return userId;\n        }\n\n        public void setUserId(int userId) {\n            this.userId = userId;\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 getZan() {\n            return zan;\n        }\n\n        public void setZan(int zan) {\n            this.zan = zan;\n        }\n\n        public List<TagsBean> getTags() {\n            return tags;\n        }\n\n        public void setTags(List<TagsBean> tags) {\n            this.tags = tags;\n        }\n\n        public static class TagsBean {\n            /**\n             * name : 公众号\n             * url : /wxarticle/list/408/1\n             */\n\n            private String name;\n            private String url;\n\n            public String getName() {\n                return name;\n            }\n\n            public void setName(String name) {\n                this.name = name;\n            }\n\n            public String getUrl() {\n                return url;\n            }\n\n            public void setUrl(String url) {\n                this.url = url;\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "lib_common/src/main/java/com/senon/lib_common/bean/WXchapters.java",
    "content": "package com.senon.lib_common.bean;\n\nimport java.util.List;\n\n/**\n * 微信公众号列表\n */\n\npublic class WXchapters {\n\n    /**\n     * children : []\n     * courseId : 13\n     * id : 408\n     * name : 鸿洋\n     * order : 190000\n     * parentChapterId : 407\n     * userControlSetTop : false\n     * visible : 1\n     */\n\n    private int courseId;\n    private int id;\n    private String name;\n    private int order;\n    private int parentChapterId;\n    private boolean userControlSetTop;\n    private int visible;\n    private List<?> children;\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 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 getOrder() {\n        return order;\n    }\n\n    public void setOrder(int order) {\n        this.order = order;\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 boolean isUserControlSetTop() {\n        return userControlSetTop;\n    }\n\n    public void setUserControlSetTop(boolean userControlSetTop) {\n        this.userControlSetTop = userControlSetTop;\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": "lib_common/src/main/java/com/senon/lib_common/common/contract/LoginContract.java",
    "content": "package com.senon.lib_common.common.contract;\n\n\nimport com.senon.lib_common.base.BasePresenter;\nimport com.senon.lib_common.base.BaseViewImp;\nimport com.senon.lib_common.base.BaseResponse;\nimport com.senon.lib_common.bean.Login;\n\nimport java.util.HashMap;\n\n/**\n * LoginContract\n */\npublic interface LoginContract {\n\n    //方法命名以 请求方法+Result  命名\n    interface View extends BaseViewImp {\n\n        void getLoginResult(BaseResponse<Login> data);\n\n        void getRegisterResult(BaseResponse<Login> data);\n\n    }\n\n    //方法命名以 get+方法  命名\n    abstract class Presenter extends BasePresenter<View> {\n\n        public abstract void getLogin(HashMap<String, String> map, boolean isDialog, boolean cancelable);\n\n        public abstract void getRegister(HashMap<String, String> map, boolean isDialog, boolean cancelable);\n\n    }\n}\n"
  },
  {
    "path": "lib_common/src/main/java/com/senon/lib_common/common/contract/WebviewContract.java",
    "content": "package com.senon.lib_common.common.contract;\n\n\nimport com.senon.lib_common.base.BasePresenter;\nimport com.senon.lib_common.base.BaseResponse;\nimport com.senon.lib_common.base.BaseViewImp;\nimport com.senon.lib_common.bean.Login;\n\nimport java.util.HashMap;\n\n/**\n * WebviewContract\n */\npublic interface WebviewContract {\n\n    //方法命名以 请求方法+Result  命名\n    interface View extends BaseViewImp {\n\n        void getCollectResult(int id,boolean isCollect);\n\n        void getCollFailResult(int id);\n\n    }\n\n    //方法命名以 get+方法  命名\n    abstract class Presenter extends BasePresenter<View> {\n\n        public abstract void getCollect(int id ,boolean isDialog, boolean cancelable);\n\n        public abstract void getUnollect(int id, boolean isDialog, boolean cancelable);\n\n\n    }\n}\n"
  },
  {
    "path": "lib_common/src/main/java/com/senon/lib_common/common/presenter/LoginPresenter.java",
    "content": "package com.senon.lib_common.common.presenter;\n\nimport android.content.Context;\n\nimport com.senon.lib_common.bean.Login;\nimport com.senon.lib_common.common.contract.LoginContract;\nimport com.senon.lib_common.net.ServerUtils;\nimport com.senon.lib_common.base.BaseResponse;\nimport com.senon.lib_common.net.callback.RequestCallback;\nimport com.senon.lib_common.net.callback.RxErrorHandler;\nimport com.senon.lib_common.utils.RetryWithDelay;\nimport com.senon.lib_common.utils.RxUtils;\nimport com.senon.lib_common.utils.ToastUtil;\nimport java.util.HashMap;\n\n/**\n * 登录 P\n */\npublic class LoginPresenter extends LoginContract.Presenter {\n\n    private Context context;\n\n    public LoginPresenter(Context context) {\n        this.context = context;\n    }\n\n    @Override\n    public void getLogin(HashMap<String, String> map, boolean isDialog, boolean cancelable) {\n        ServerUtils.getCommonApi().login(map)\n                .retryWhen(new RetryWithDelay(3,2))\n                .compose(RxUtils.<BaseResponse<Login>>bindToLifecycle(getView()))\n                .compose(RxUtils.<BaseResponse<Login>>getSchedulerTransformer())\n                .subscribe(new RequestCallback<BaseResponse<Login>>(context, RxErrorHandler.getInstance(),isDialog,cancelable) {\n                    @Override\n                    public void onNext(BaseResponse<Login> baseResponse) {\n                        super.onNext(baseResponse);\n                        if(baseResponse.getCode() == 0){\n                            getView().getLoginResult(baseResponse);\n                        }else{\n                            ToastUtil.initToast(baseResponse.getMsg());\n                        }\n                    }\n                    @Override\n                    public void onError(Throwable e) {\n                        super.onError(e);\n                    }\n                });\n    }\n\n    @Override\n    public void getRegister(HashMap<String, String> map, boolean isDialog, boolean cancelable) {\n        ServerUtils.getCommonApi().register(map)\n                .retryWhen(new RetryWithDelay(3,2))\n                .compose(RxUtils.<BaseResponse<Login>>bindToLifecycle(getView()))\n                .compose(RxUtils.<BaseResponse<Login>>getSchedulerTransformer())\n                .subscribe(new RequestCallback<BaseResponse<Login>>(context, RxErrorHandler.getInstance(),isDialog,cancelable) {\n                    @Override\n                    public void onNext(BaseResponse<Login> baseResponse) {\n                        super.onNext(baseResponse);\n                        if(baseResponse.getCode() == 0){\n                            getView().getRegisterResult(baseResponse);\n                        }else{\n                            ToastUtil.initToast(baseResponse.getMsg());\n                        }\n                    }\n                    @Override\n                    public void onError(Throwable e) {\n                        super.onError(e);\n                    }\n                });\n    }\n\n\n}\n"
  },
  {
    "path": "lib_common/src/main/java/com/senon/lib_common/common/presenter/WebviewPresenter.java",
    "content": "package com.senon.lib_common.common.presenter;\n\nimport android.content.Context;\nimport com.senon.lib_common.base.BaseResponse;\nimport com.senon.lib_common.bean.Login;\nimport com.senon.lib_common.common.contract.WebviewContract;\nimport com.senon.lib_common.net.ServerUtils;\nimport com.senon.lib_common.net.callback.RequestCallback;\nimport com.senon.lib_common.net.callback.RxErrorHandler;\nimport com.senon.lib_common.utils.RetryWithDelay;\nimport com.senon.lib_common.utils.RxUtils;\nimport com.senon.lib_common.utils.ToastUtil;\nimport java.util.HashMap;\n\n/**\n * Webview P\n */\npublic class WebviewPresenter extends WebviewContract.Presenter {\n\n    private Context context;\n    public WebviewPresenter(Context context) {\n        this.context = context;\n    }\n\n    @Override\n    public void getCollect(final int id, boolean isDialog, boolean cancelable) {\n        ServerUtils.getCommonApi().getCollect(id)\n                .retryWhen(new RetryWithDelay(3,2))\n                .compose(RxUtils.<BaseResponse>bindToLifecycle(getView()))\n                .compose(RxUtils.<BaseResponse>getSchedulerTransformer())\n                .subscribe(new RequestCallback<BaseResponse>(context, RxErrorHandler.getInstance(),isDialog,cancelable) {\n                    @Override\n                    public void onNext(BaseResponse baseResponse) {\n                        super.onNext(baseResponse);\n                        if(baseResponse.getCode() == 0){\n                            getView().getCollectResult(id,true);\n                        }else{\n                            getView().getCollFailResult(id);\n\n                            ToastUtil.initToast(baseResponse.getMsg());\n                        }\n                    }\n                    @Override\n                    public void onError(Throwable e) {\n                        super.onError(e);\n                    }\n                });\n    }\n\n    @Override\n    public void getUnollect(final int id, boolean isDialog, boolean cancelable) {\n        ServerUtils.getCommonApi().getUncollectOriginId(id)\n                .retryWhen(new RetryWithDelay(3,2))\n                .compose(RxUtils.<BaseResponse>bindToLifecycle(getView()))\n                .compose(RxUtils.<BaseResponse>getSchedulerTransformer())\n                .subscribe(new RequestCallback<BaseResponse>(context, RxErrorHandler.getInstance(),isDialog,cancelable) {\n                    @Override\n                    public void onNext(BaseResponse baseResponse) {\n                        super.onNext(baseResponse);\n                        if(baseResponse.getCode() == 0){\n                            getView().getCollectResult(id,false);\n                        }else{\n                            getView().getCollFailResult(id);\n\n                            ToastUtil.initToast(baseResponse.getMsg());\n                        }\n                    }\n                    @Override\n                    public void onError(Throwable e) {\n                        super.onError(e);\n                    }\n                });\n    }\n}\n"
  },
  {
    "path": "lib_common/src/main/java/com/senon/lib_common/common/ui/Common_LoginActivity.java",
    "content": "package com.senon.lib_common.common.ui;\n\nimport android.graphics.Paint;\nimport android.view.View;\nimport android.widget.EditText;\nimport android.widget.TextView;\nimport com.alibaba.android.arouter.facade.annotation.Autowired;\nimport com.alibaba.android.arouter.facade.annotation.Route;\nimport com.alibaba.android.arouter.launcher.ARouter;\nimport com.senon.lib_common.ConstantArouter;\nimport com.senon.lib_common.ConstantLoginArouter;\nimport com.senon.lib_common.R;\nimport com.senon.lib_common.base.BaseActivity;\nimport com.senon.lib_common.base.BaseResponse;\nimport com.senon.lib_common.ComUtil;\nimport com.senon.lib_common.bean.Login;\nimport com.senon.lib_common.common.contract.LoginContract;\nimport com.senon.lib_common.common.presenter.LoginPresenter;\nimport com.senon.lib_common.net.cookies.PersistentCookieStore;\nimport com.senon.lib_common.utils.BaseEvent;\nimport com.senon.lib_common.utils.StatusBarUtils;\nimport com.senon.lib_common.utils.ToastUtil;\nimport org.greenrobot.eventbus.EventBus;\nimport org.greenrobot.eventbus.Subscribe;\nimport org.greenrobot.eventbus.ThreadMode;\n\n/**\n * 所有模块统一登录页面\n */\n@Route(path = ConstantLoginArouter.PATH_COMMON_LOGINACTIVITY)\npublic class Common_LoginActivity extends BaseActivity<LoginContract.View, LoginContract.Presenter> implements\n        LoginContract.View {\n\n    @Autowired\n    String targetUrl;\n    private EditText account_edt,password_edt;\n    private TextView register_tv;\n\n\n    @Override\n    public int getLayoutId() {\n        StatusBarUtils.with(this).init();\n        return R.layout.activity_common__login;\n    }\n\n    @Override\n    public LoginContract.Presenter createPresenter() {\n        return new LoginPresenter(this);\n    }\n\n    @Override\n    public LoginContract.View createView() {\n        return this;\n    }\n\n    @Override\n    public void init() {\n        EventBus.getDefault().register(this);\n\n        account_edt = findViewById(R.id.account_edt);\n        password_edt = findViewById(R.id.password_edt);\n        register_tv = findViewById(R.id.register_tv);\n\n        register_tv.getPaint().setFlags(Paint.UNDERLINE_TEXT_FLAG);\n\n    }\n\n    @Override\n    public void getLoginResult(BaseResponse<Login> data) {\n        //登录成功时\n        //保存参数\n        PersistentCookieStore.getCookieStore().saveUserInfo(\n                data.getData().getUsername(),\n                password_edt.getText().toString().trim());\n\n        if(targetUrl != null){\n            //跳转到目标页\n            ARouter.getInstance().build(targetUrl).navigation();\n        }\n\n        BaseEvent event = new BaseEvent();\n        event.setCode(0);\n        EventBus.getDefault().post(event);\n\n        finish();\n    }\n\n    @Override\n    public void getRegisterResult(BaseResponse<Login> data) {\n    }\n\n    public void onClick(View view) {\n        int id = view.getId();\n        if(id == R.id.login_btn){\n            String account = account_edt.getText().toString();\n            String password = password_edt.getText().toString();\n            if (account.isEmpty()) {\n                ToastUtil.initToast(\"请输入账号\");\n                return;\n            }\n            if (password.isEmpty()) {\n                ToastUtil.initToast(\"请输入密码\");\n                return;\n            }\n            getPresenter().getLogin(ComUtil.getMd5Str(\n                    new String[]{\"username\", \"password\"},\n                    new String[]{account.trim(), password.trim()})\n                    , true, true);\n        }else if(id == R.id.visitor_tv){\n            // 跳转到目标页\n            if(targetUrl != null){\n                //跳转到目标页\n                ARouter.getInstance().build(targetUrl).navigation();\n            }\n            finish();\n        }else if(id == R.id.register_tv){\n            //跳转到注册页 同意用arouter跳转，便于以后移动模块的改动\n            ARouter.getInstance().build(ConstantArouter.PATH_COMMON_REGISTERACTIVITY)\n                    .withString(\"targetUrl\",targetUrl)\n                    .navigation();\n\n        }\n    }\n\n    @Override\n    protected void onDestroy() {\n        super.onDestroy();\n        EventBus.getDefault().unregister(this);\n    }\n\n    @Subscribe(threadMode = ThreadMode.MAIN) //在ui线程执行\n    public void onEventReceived(BaseEvent event) {\n        if(event.getCode() == 0){\n            finish();\n        }\n    }\n}\n"
  },
  {
    "path": "lib_common/src/main/java/com/senon/lib_common/common/ui/Common_RegisterActivity.java",
    "content": "package com.senon.lib_common.common.ui;\n\nimport android.graphics.Paint;\nimport android.view.View;\nimport android.widget.EditText;\nimport android.widget.TextView;\n\nimport com.alibaba.android.arouter.facade.annotation.Autowired;\nimport com.alibaba.android.arouter.facade.annotation.Route;\nimport com.alibaba.android.arouter.launcher.ARouter;\nimport com.senon.lib_common.ComUtil;\nimport com.senon.lib_common.ConstantArouter;\nimport com.senon.lib_common.ConstantLoginArouter;\nimport com.senon.lib_common.R;\nimport com.senon.lib_common.base.BaseActivity;\nimport com.senon.lib_common.base.BaseResponse;\nimport com.senon.lib_common.bean.Login;\nimport com.senon.lib_common.common.contract.LoginContract;\nimport com.senon.lib_common.common.presenter.LoginPresenter;\nimport com.senon.lib_common.net.cookies.PersistentCookieStore;\nimport com.senon.lib_common.utils.BaseEvent;\nimport com.senon.lib_common.utils.StatusBarUtils;\nimport com.senon.lib_common.utils.ToastUtil;\n\nimport org.greenrobot.eventbus.EventBus;\n\n/**\n * 所有模块统一注册页面\n */\n@Route(path = ConstantArouter.PATH_COMMON_REGISTERACTIVITY)\npublic class Common_RegisterActivity extends BaseActivity<LoginContract.View, LoginContract.Presenter> implements\n        LoginContract.View {\n\n    @Autowired\n    String targetUrl;\n    private EditText account_edt,password_edt,password_re_edt;\n    private TextView login_tv;\n\n    @Override\n    public int getLayoutId() {\n        StatusBarUtils.with(this).init();\n        return R.layout.activity_common__register;\n    }\n\n    @Override\n    public LoginContract.Presenter createPresenter() {\n        return new LoginPresenter(this);\n    }\n\n    @Override\n    public LoginContract.View createView() {\n        return this;\n    }\n\n    @Override\n    public void init() {\n        if (targetUrl == null) {\n            //默认跳转到MainActivity\n            targetUrl = ConstantLoginArouter.PATH_APP_MAINACTIVITY;\n        }\n        account_edt = findViewById(R.id.account_edt);\n        password_edt = findViewById(R.id.password_edt);\n        password_re_edt = findViewById(R.id.password_re_edt);\n        login_tv = findViewById(R.id.login_tv);\n\n        login_tv.getPaint().setFlags(Paint.UNDERLINE_TEXT_FLAG);\n    }\n\n    @Override\n    public void getLoginResult(BaseResponse<Login> data) {\n    }\n\n    @Override\n    public void getRegisterResult(BaseResponse<Login> data) {\n        //登录成功时\n        //保存参数\n        PersistentCookieStore.getCookieStore().saveUserInfo(\n                data.getData().getUsername(),\n                password_edt.getText().toString().trim());\n\n        //跳转到目标页\n        if(targetUrl != null){\n            ARouter.getInstance().build(targetUrl).navigation();\n        }\n\n        BaseEvent event = new BaseEvent();\n        event.setCode(0);\n        EventBus.getDefault().post(event);\n\n        finish();\n    }\n\n    public void onClick(View view) {\n        int id = view.getId();\n        if(id == R.id.register_btn){\n            String account = account_edt.getText().toString();\n            String password = password_edt.getText().toString();\n            String repassword = password_re_edt.getText().toString();\n            if (account.isEmpty()) {\n                ToastUtil.initToast(\"请输入账号\");\n                return;\n            }\n            if (password.isEmpty()) {\n                ToastUtil.initToast(\"请输入密码\");\n                return;\n            }\n            if (repassword.isEmpty()) {\n                ToastUtil.initToast(\"请输入确认密码\");\n                return;\n            }\n            if (!password.equals(repassword)) {\n                ToastUtil.initToast(\"确认密码与密码不同\");\n                return;\n            }\n            getPresenter().getRegister(ComUtil.getMd5Str(\n                    new String[]{\"username\", \"password\", \"repassword\"},\n                    new String[]{account.trim(), password.trim(),repassword.trim()})\n                    , true, true);\n        }else if(id == R.id.login_tv){\n            finish();\n        }\n\n    }\n\n}\n"
  },
  {
    "path": "lib_common/src/main/java/com/senon/lib_common/common/ui/Common_WebviewActivity.java",
    "content": "package com.senon.lib_common.common.ui;\n\nimport android.view.View;\nimport android.webkit.WebChromeClient;\nimport android.webkit.WebResourceRequest;\nimport android.webkit.WebSettings;\nimport android.webkit.WebView;\nimport android.webkit.WebViewClient;\nimport android.widget.ImageView;\nimport android.widget.ProgressBar;\nimport android.widget.TextView;\n\nimport com.alibaba.android.arouter.facade.annotation.Autowired;\nimport com.alibaba.android.arouter.facade.annotation.Route;\nimport com.alibaba.android.arouter.launcher.ARouter;\nimport com.senon.lib_common.ComUtil;\nimport com.senon.lib_common.ConstantArouter;\nimport com.senon.lib_common.ConstantLoginArouter;\nimport com.senon.lib_common.R;\nimport com.senon.lib_common.base.BaseActivity;\nimport com.senon.lib_common.base.BaseResponse;\nimport com.senon.lib_common.common.contract.WebviewContract;\nimport com.senon.lib_common.common.presenter.WebviewPresenter;\nimport com.senon.lib_common.utils.BaseEvent;\nimport com.senon.lib_common.utils.StatusBarUtils;\n\nimport org.greenrobot.eventbus.EventBus;\n\n/**\n * webview\n */\n@Route(path = ConstantArouter.PATH_COMMON_WEBVIEWCTIVITY)\npublic class Common_WebviewActivity extends BaseActivity<WebviewContract.View, WebviewContract.Presenter> implements\n        WebviewContract.View {\n\n    @Autowired\n    int id;\n    @Autowired\n    String url;\n    @Autowired\n    boolean isCollection;\n    @Autowired\n    String title;\n    private TextView toolbar_title_tv;\n    private ProgressBar progressBar;\n    private WebView webView;\n    private TextView collection_tv;\n\n\n    @Override\n    public int getLayoutId() {\n        StatusBarUtils.with(this).init();\n        return R.layout.activity_common__webview;\n    }\n\n    @Override\n    public WebviewContract.Presenter createPresenter() {\n        return new WebviewPresenter(this);\n    }\n\n    @Override\n    public WebviewContract.View createView() {\n        return this;\n    }\n\n    @Override\n    public void init() {\n        ComUtil.changeStatusBarTextColor(this,true);\n        progressBar = findViewById(R.id.progressBar);\n        webView = findViewById(R.id.webView);\n        collection_tv = findViewById(R.id.collection_tv);\n        toolbar_title_tv = findViewById(R.id.toolbar_title_tv);\n\n\n        initClickListener();\n        initWebView();\n    }\n\n    private void initClickListener() {\n        toolbar_title_tv.setText(title);\n        toolbar_title_tv.setOnClickListener(new View.OnClickListener() {\n            @Override\n            public void onClick(View v) {\n                webView.scrollTo(0,0);\n            }\n        });\n        findViewById(R.id.toolbar_back_igv).setOnClickListener(new View.OnClickListener() {\n            @Override\n            public void onClick(View v) {\n                finish();\n            }\n        });\n\n        if(id == 0){//id为空 则不设置收藏按钮\n            collection_tv.setVisibility(View.GONE);\n            return;\n        }\n\n        collection_tv.setText(isCollection ? \"已收藏\":\"收藏\");\n        collection_tv.setOnClickListener(new View.OnClickListener() {\n            @Override\n            public void onClick(View v) {\n                isCollection = !isCollection;//该为相反状态\n                collection_tv.setText(isCollection ? \"已收藏\":\"收藏\");\n                if(isCollection){\n                    getPresenter().getCollect(id,false,true);\n                }else{\n                    getPresenter().getUnollect(id,false,true);\n                }\n            }\n        });\n\n    }\n\n    private void initWebView() {\n        WebSettings webSettings = webView.getSettings();\n        webSettings.setJavaScriptEnabled(true); // 设置支持javascript脚本\n        webSettings.setPluginState(WebSettings.PluginState.ON);\n        webSettings.setUseWideViewPort(true);\n        webSettings.setLoadWithOverviewMode(true);\n        webSettings.setTextZoom(100);\n\n        webSettings.setAppCacheEnabled(true);\n        webSettings.setDomStorageEnabled(true);\n        webSettings.setDatabaseEnabled(true);\n        if (ComUtil.isNetworkConnected()) {\n            webSettings.setCacheMode(WebSettings.LOAD_DEFAULT);\n        } else {\n            webSettings.setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK);\n        }\n\n        webView.loadUrl(url);\n        webView.setWebViewClient(new WebViewClient() {\n            //实现点击webView页面的链接\n            @Override\n            public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {\n                view.loadUrl(url);\n                return true;\n            }\n        });\n        //设置WebViewClient用来辅助WebView处理各种通知请求事件等，如更新历史记录、网页开始加载/完毕、报告错误信息等\n        webView.setWebViewClient(new WebViewClient() {\n            // 以下方法避免 自动打开系统自带的浏览器，而是让新打开的网页在当前的WebView中显示\n            @Override\n            public boolean shouldOverrideUrlLoading(WebView view, String url) {\n                view.loadUrl(url);\n                return true;\n            }\n        });\n        // 用于辅助WebView处理JavaScript的对话框、网站图标、网站标题以及网页加载进度等\n        webView.setWebChromeClient(new WebChromeClient() {\n            @Override\n            public void onProgressChanged(WebView view, int newProgress) {\n                if (newProgress == 100) {\n                    progressBar.setVisibility(View.INVISIBLE);\n                } else {\n                    if (progressBar.getVisibility() == View.INVISIBLE) {\n                        progressBar.setVisibility(View.VISIBLE);\n                    }\n                    progressBar.setProgress(newProgress);\n                }\n                super.onProgressChanged(view, newProgress);\n            }\n            @Override\n            public void onShowCustomView(View view, CustomViewCallback callback) {\n                super.onShowCustomView(view, callback);\n            }\n            @Override\n            public void onHideCustomView() {\n                super.onHideCustomView();\n            }\n        });\n\n    }\n\n    @Override\n    public void getCollectResult(int id,boolean isCollect) {\n        BaseEvent event = new BaseEvent();\n        event.setCode(101);\n        event.setId(id);\n        event.setCollect(isCollect);\n        EventBus.getDefault().post(event);\n    }\n\n    @Override\n    public void getCollFailResult(int id) {\n        if(this.id == id){\n            isCollection = !isCollection;\n            collection_tv.setText(isCollection ? \"已收藏\":\"收藏\");\n        }\n        ARouter.getInstance().build(ConstantLoginArouter.PATH_COMMON_LOGINACTIVITY)\n                .navigation();\n    }\n}\n"
  },
  {
    "path": "lib_common/src/main/java/com/senon/lib_common/net/RequestInterceptor.java",
    "content": "package com.senon.lib_common.net;\n\nimport org.json.JSONObject;\nimport java.io.IOException;\nimport java.util.HashMap;\nimport java.util.Map;\nimport okhttp3.Interceptor;\nimport okhttp3.Request;\nimport okhttp3.Response;\n\n\n/**\n * 网络统一拦截\n */\npublic class RequestInterceptor implements Interceptor {\n\n    private final int DEVICE_TYPE = 1; // 设备类型\n\n    private RequestInterceptor() {\n    }\n\n    private static RequestInterceptor instance;\n\n    public static RequestInterceptor getInstance() {\n        if (instance == null) {\n            synchronized (RequestInterceptor.class) {\n                if (instance == null) {\n                    instance = new RequestInterceptor();\n                }\n            }\n        }\n        return instance;\n    }\n\n    @Override\n    public Response intercept(Chain chain) throws IOException {\n        Request original = chain.request();\n        Request.Builder requestBuilder = original.newBuilder()\n                .header(\"data\", fetchHeaderInfo())\n                .method(original.method(), original.body());\n        return chain.proceed(requestBuilder.build());\n    }\n\n    private String fetchHeaderInfo() {\n//        String deviceCode = MD5Utils.GetMD5Code(MobileInfo.phoneOnlyCode(context));\n\n\n        Map<String, String> map = new HashMap<>();\n//        map.put(\"DeviceType\", String.valueOf(DEVICE_TYPE));\n//        map.put(\"DeviceToken\", deviceCode);\n//        map.put(\"APPVersion\", APP_VERSION_NAME);\n//        map.put(\"RegistrationID\", jpushID);\n//        map.put(\"Authorization\", token);\n        JSONObject json = new JSONObject(map);\n        return json.toString();\n    }\n}\n"
  },
  {
    "path": "lib_common/src/main/java/com/senon/lib_common/net/ServerUtils.java",
    "content": "package com.senon.lib_common.net;\n\nimport com.senon.lib_common.AppConfig;\nimport com.senon.lib_common.ComUtil;\nimport com.senon.lib_common.api.BaseApi;\nimport com.senon.lib_common.net.cookies.CookiesManager;\nimport com.senon.lib_common.utils.ConstantUtils;\nimport java.io.File;\nimport java.io.IOException;\nimport java.security.cert.CertificateException;\nimport java.util.concurrent.TimeUnit;\nimport javax.net.ssl.SSLContext;\nimport javax.net.ssl.SSLSocketFactory;\nimport javax.net.ssl.TrustManager;\nimport javax.net.ssl.X509TrustManager;\nimport okhttp3.Cache;\nimport okhttp3.CacheControl;\nimport okhttp3.Interceptor;\nimport okhttp3.OkHttpClient;\nimport okhttp3.Request;\nimport okhttp3.Response;\nimport okhttp3.logging.HttpLoggingInterceptor;\nimport retrofit2.Retrofit;\nimport retrofit2.adapter.rxjava2.RxJava2CallAdapterFactory;\nimport retrofit2.converter.gson.GsonConverterFactory;\nimport retrofit2.converter.scalars.ScalarsConverterFactory;\n\n/**\n * 网络请求 工具\n */\npublic class ServerUtils {\n    private static final int TIME_OUT = 5 * 1000;//链接超时时间\n    private volatile static BaseApi mBaseApi;\n    private static File cacheFile = new File(AppConfig.PATH_CACHE);\n    private static Cache cache = new Cache(cacheFile, 1024 * 1024 * 50);\n\n    public static BaseApi getCommonApi() {\n        try {\n            if (mBaseApi == null) {\n                synchronized (ServerUtils.class) {\n                    if (mBaseApi == null) {\n                        mBaseApi = createService(BaseApi.class, AppConfig.BASE_URL);\n                    }\n                }\n            }\n        } catch (Exception e) {\n            e.printStackTrace();\n        }\n        return mBaseApi;\n    }\n\n    private static <S> S createService(Class<S> serviceClass, String url) throws Exception {\n        Retrofit.Builder builder =\n                new Retrofit.Builder()\n                        .baseUrl(url)\n                        .client(httpClient.build())\n                        .addCallAdapterFactory(RxJava2CallAdapterFactory.create())\n                        .addConverterFactory(ScalarsConverterFactory.create())\n                        .addConverterFactory(GsonConverterFactory.create());\n        Retrofit retrofit = builder.build();\n        return retrofit.create(serviceClass);\n    }\n\n    private static Interceptor cacheInterceptor = new Interceptor() {\n        @Override\n        public Response intercept(Chain chain) throws IOException {\n            Request request = chain.request();\n            if (!ComUtil.isNetworkConnected()) {\n                request = request.newBuilder()\n                        .cacheControl(CacheControl.FORCE_CACHE)\n                        .build();\n            }\n            Response response = chain.proceed(request);\n            if (ComUtil.isNetworkConnected()) {\n                int maxAge = 0;\n                // 有网络时, 不缓存, 最大保存时长为0\n                response.newBuilder()\n                        .header(\"Cache-Control\", \"public, max-age=\" + maxAge)\n                        .removeHeader(\"Pragma\")\n                        .build();\n            } else {\n                // 无网络时，设置超时为1周\n                int maxStale = 60 * 60 * 24 * 7;\n                response.newBuilder()\n                        .header(\"Cache-Control\", \"public, only-if-cached, max-stale=\" + maxStale)\n                        .removeHeader(\"Pragma\")\n                        .build();\n            }\n            return response;\n        }\n    };\n\n    private static OkHttpClient.Builder httpClient =\n            new OkHttpClient.Builder()\n                    //设置超时\n                    .readTimeout(TIME_OUT, TimeUnit.SECONDS)\n                    .writeTimeout(TIME_OUT, TimeUnit.SECONDS)\n                    .connectTimeout(TIME_OUT, TimeUnit.SECONDS)\n//                    .addInterceptor(RequestInterceptor.getInstance())//网络请求 统一拦截\n                    .addInterceptor(getLogInterceptor())\n                    .sslSocketFactory(getSSLSocketFactory())\n                    //设置缓存\n                    .addNetworkInterceptor(cacheInterceptor)\n                    .addInterceptor(cacheInterceptor)\n                    .cache(cache)\n                    //设置cookies\n                    .cookieJar(new CookiesManager())\n                    .hostnameVerifier(org.apache.http.conn.ssl.SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);\n\n\n    private static HttpLoggingInterceptor getLogInterceptor() {\n        HttpLoggingInterceptor loggingInterceptor = new HttpLoggingInterceptor();\n        if (ConstantUtils.isAppDebug()) {\n            loggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY);\n        } else {\n            loggingInterceptor.setLevel(HttpLoggingInterceptor.Level.NONE);\n        }\n        return loggingInterceptor;\n    }\n\n    /**\n     * 不验证证书\n     *\n     * @return\n     * @throws Exception\n     */\n    private static SSLSocketFactory getSSLSocketFactory() {\n        //创建一个不验证证书链的证书信任管理器。\n        final TrustManager[] trustAllCerts = new TrustManager[]{new X509TrustManager() {\n            @Override\n            public void checkClientTrusted(\n                    java.security.cert.X509Certificate[] chain,\n                    String authType) throws CertificateException {\n            }\n\n            @Override\n            public void checkServerTrusted(\n                    java.security.cert.X509Certificate[] chain,\n                    String authType) throws CertificateException {\n            }\n\n            @Override\n            public java.security.cert.X509Certificate[] getAcceptedIssuers() {\n                return new java.security.cert.X509Certificate[0];\n            }\n        }};\n\n        final SSLContext sslContext;\n        try {\n            sslContext = SSLContext.getInstance(\"TLS\");\n            sslContext.init(null, trustAllCerts,\n                    new java.security.SecureRandom());\n            return sslContext\n                    .getSocketFactory();\n        } catch (Exception e) {\n            e.printStackTrace();\n        }\n        return null;\n    }\n}\n"
  },
  {
    "path": "lib_common/src/main/java/com/senon/lib_common/net/callback/ErrorListener.java",
    "content": "package com.senon.lib_common.net.callback;\n\n\n\npublic interface ErrorListener {\n    void handleError(Throwable e);\n}"
  },
  {
    "path": "lib_common/src/main/java/com/senon/lib_common/net/callback/RequestCallback.java",
    "content": "package com.senon.lib_common.net.callback;\n\nimport android.content.Context;\nimport com.senon.lib_common.net.progress.ProgressCancelListener;\nimport com.senon.lib_common.net.progress.ProgressDialogHandler;\nimport io.reactivex.Observer;\nimport io.reactivex.annotations.NonNull;\nimport io.reactivex.disposables.Disposable;\n\n\n/**\n * RxJava 自定义回调\n */\npublic abstract class RequestCallback<T> implements Observer<T>,ProgressCancelListener {\n\n    private ErrorListener errorListener;\n    private Disposable mDisposable;\n    private Context mContext;\n    private boolean cancelable = false;//该dialog如果开启 则可以设置是否能够返回键取消请求\n    private ProgressDialogHandler mProgressDialogHandler;//默认为null  即不开启dialog\n\n    public RequestCallback(Context context,ErrorListener errorListener) {\n        this(context,errorListener,false);\n    }\n\n    /**\n     * 传这个构造默认开启dialog\n     * @param cancelable 该dialog如果开启 则可以设置是否能够返回键取消请求\n     */\n    public RequestCallback(Context context,ErrorListener errorListener,boolean cancelable) {\n        this(context,errorListener,true,cancelable);\n    }\n\n    public RequestCallback(Context context,ErrorListener errorListener,boolean showDialog,boolean cancelable) {\n        this.mContext = context;\n        this.errorListener = errorListener;\n        this.cancelable = cancelable;\n        if(showDialog){\n            this.mProgressDialogHandler = new ProgressDialogHandler(context, this, cancelable);\n        }\n    }\n\n    private void showProgressDialog() {\n        if (mProgressDialogHandler != null) {\n            mProgressDialogHandler.obtainMessage(ProgressDialogHandler.SHOW_PROGRESS_DIALOG).sendToTarget();\n        }\n    }\n\n    private void dismissProgressDialog() {\n        if (mProgressDialogHandler != null) {\n            mProgressDialogHandler.obtainMessage(ProgressDialogHandler.DISMISS_PROGRESS_DIALOG).sendToTarget();\n            mProgressDialogHandler = null;\n        }\n    }\n\n    @Override\n    public void onSubscribe(@NonNull Disposable d) {\n        this.mDisposable = d;\n        showProgressDialog();\n\n    }\n\n    @Override\n    public void onNext(@NonNull T t) {\n\n    }\n\n    @Override\n    public void onError(@NonNull Throwable e) {\n        e.printStackTrace();\n        dismissProgressDialog();\n\n        if (errorListener != null) {\n            errorListener.handleError(e);\n        }\n    }\n\n    @Override\n    public void onComplete() {\n        dismissProgressDialog();\n\n    }\n\n    @Override\n    public void onCancelProgress() {\n        //如果处于订阅状态，则取消订阅\n        if (!mDisposable.isDisposed()) {\n            mDisposable.dispose();\n        }\n    }\n}\n"
  },
  {
    "path": "lib_common/src/main/java/com/senon/lib_common/net/callback/RxErrorHandler.java",
    "content": "package com.senon.lib_common.net.callback;\n\n\nimport com.senon.lib_common.utils.LogUtils;\nimport com.senon.lib_common.utils.ToastUtil;\n\npublic class RxErrorHandler implements ErrorListener {\n\n    private volatile static RxErrorHandler rxErrorHandler;\n\n    private RxErrorHandler() {\n    }\n\n    public static RxErrorHandler getInstance() {\n        if (rxErrorHandler == null) {\n            synchronized (RxErrorHandler.class) {\n                if (rxErrorHandler == null) {\n                    rxErrorHandler = new RxErrorHandler();\n                }\n            }\n        }\n        return rxErrorHandler;\n    }\n\n    @Override\n    public void handleError(Throwable throwable) {\n        String errorString = throwable.toString();\n        LogUtils.e(\"网络错误信息为 ========>>>\" + throwable.toString());\n        //返回的错误为空\n        if (errorString == null) {\n            ToastUtil.initToast(\"网络数据异常，请重试\");\n\n        } else {\n            //请求超时\n            if (errorString.contains(\"TimeoutException\") || errorString.contains(\"SocketTimeoutException\")) {\n                ToastUtil.initToast(\"网络请求超时，请重试\");\n            }\n            //能识别的请求异常，忽略不提示\n            if (errorString.contains(\"SSLException\")) {\n\n            }\n            //403、404等服务错误\n            if (errorString.contains(\"ServiceConfigurationError\") || errorString.contains(\"AuthenticatorException\")) {\n                ToastUtil.initToast(\"网络数据异常，请重试\");\n            }\n            //网络未连接\n            if (errorString.contains(\"NetworkErrorException\") || errorString.contains(\"NoConnectionPendingException\") || errorString.contains(\"UnknownHostException\")) {\n                ToastUtil.initToast(\"您的网络不给力，请检查网络设置\");\n            }\n            //连接不到服务器\n            if (errorString.contains(\"ConnectException\")) {\n                ToastUtil.initToast(\"网络连接失败\");\n            }\n        }\n    }\n}"
  },
  {
    "path": "lib_common/src/main/java/com/senon/lib_common/net/cookies/CookiesManager.java",
    "content": "package com.senon.lib_common.net.cookies;\n\nimport android.support.annotation.NonNull;\n\nimport java.util.List;\n\nimport okhttp3.Cookie;\nimport okhttp3.CookieJar;\nimport okhttp3.HttpUrl;\n\n/**\n * @author lw\n * @date 2018/1/25\n */\n\npublic class CookiesManager implements CookieJar {\n\n    private static final PersistentCookieStore COOKIE_STORE = PersistentCookieStore.getCookieStore();\n\n    @Override\n    public void saveFromResponse(@NonNull HttpUrl url, @NonNull List<Cookie> cookies) {\n        if (cookies.size() > 0) {\n            for (Cookie item : cookies) {\n                COOKIE_STORE.add(url, item);\n            }\n        }\n    }\n\n    @Override\n    public List<Cookie> loadForRequest(@NonNull HttpUrl url) {\n        return COOKIE_STORE.get(url);\n    }\n\n    /**\n     * 清除所有cookie\n     */\n    public static void clearAllCookies() {\n        COOKIE_STORE.removeAll();\n    }\n\n    /**\n     * 清除指定cookie\n     *\n     * @param url HttpUrl\n     * @param cookie Cookie\n     * @return if clear cookies\n     */\n    public static boolean clearCookies(HttpUrl url, Cookie cookie) {\n        return COOKIE_STORE.remove(url, cookie);\n    }\n\n    /**\n     * 获取cookies\n     *\n     * @return List<Cookie>\n     */\n    public static List<Cookie> getCookies() {\n        return COOKIE_STORE.getCookies();\n    }\n\n}\n"
  },
  {
    "path": "lib_common/src/main/java/com/senon/lib_common/net/cookies/OkHttpCookies.java",
    "content": "package com.senon.lib_common.net.cookies;\n\nimport java.io.IOException;\nimport java.io.ObjectInputStream;\nimport java.io.ObjectOutputStream;\nimport java.io.Serializable;\n\nimport okhttp3.Cookie;\n\n/**\n * Cookies对象\n */\n\nclass OkHttpCookies implements Serializable {\n\n    private transient final Cookie cookies;\n    private transient Cookie clientCookies;\n\n    OkHttpCookies(Cookie cookies) {\n        this.cookies = cookies;\n    }\n\n    Cookie getCookies() {\n        Cookie bestCookies = cookies;\n        if (clientCookies != null) {\n            bestCookies = clientCookies;\n        }\n        return bestCookies;\n    }\n\n    private void writeObject(ObjectOutputStream out) throws IOException {\n        out.writeObject(cookies.name());\n        out.writeObject(cookies.value());\n        out.writeLong(cookies.expiresAt());\n        out.writeObject(cookies.domain());\n        out.writeObject(cookies.path());\n        out.writeBoolean(cookies.secure());\n        out.writeBoolean(cookies.httpOnly());\n        out.writeBoolean(cookies.hostOnly());\n        out.writeBoolean(cookies.persistent());\n    }\n\n    private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException {\n        String name = (String) in.readObject();\n        String value = (String) in.readObject();\n        long expiresAt = in.readLong();\n        String domain = (String) in.readObject();\n        String path = (String) in.readObject();\n        boolean secure = in.readBoolean();\n        boolean httpOnly = in.readBoolean();\n        boolean hostOnly = in.readBoolean();\n        Cookie.Builder builder = new Cookie.Builder();\n        builder = builder.name(name);\n        builder = builder.value(value);\n        builder = builder.expiresAt(expiresAt);\n        builder = hostOnly ? builder.hostOnlyDomain(domain) : builder.domain(domain);\n        builder = builder.path(path);\n        builder = secure ? builder.secure() : builder;\n        builder = httpOnly ? builder.httpOnly() : builder;\n        clientCookies = builder.build();\n    }\n}\n"
  },
  {
    "path": "lib_common/src/main/java/com/senon/lib_common/net/cookies/PersistentCookieStore.java",
    "content": "package com.senon.lib_common.net.cookies;\n\nimport android.content.Context;\nimport android.content.SharedPreferences;\nimport android.text.TextUtils;\nimport android.util.Log;\nimport java.io.ByteArrayInputStream;\nimport java.io.ByteArrayOutputStream;\nimport java.io.IOException;\nimport java.io.ObjectInputStream;\nimport java.io.ObjectOutputStream;\nimport java.util.ArrayList;\nimport java.util.HashMap;\nimport java.util.List;\nimport java.util.Locale;\nimport java.util.Map;\nimport java.util.concurrent.ConcurrentHashMap;\nimport okhttp3.Cookie;\nimport okhttp3.HttpUrl;\n\n/**\n * 持久化Cookies\n */\n\npublic class PersistentCookieStore {\n\n    private static final String LOG_TAG = \"PersistentCookieStore\";\n    private static final String COOKIE_PREFS = \"Cookies_Prefs\";\n    private static final String NAME = \"user_name\";\n    private static final String PASSWORD = \"user_password\";\n    private final Map<String, ConcurrentHashMap<String, Cookie>> cookies;\n    private final SharedPreferences cookiePrefs;\n    private static PersistentCookieStore cookieStore;\n\n    public static void init(Context context){\n        cookieStore = new PersistentCookieStore(context);\n    }\n\n    public static PersistentCookieStore getCookieStore(){\n        return cookieStore;\n    }\n\n    private PersistentCookieStore(Context context) {\n        cookies = new HashMap<>();\n        cookiePrefs = context.getSharedPreferences(COOKIE_PREFS, Context.MODE_PRIVATE);\n\n        //将持久化的cookies缓存到内存中 即map cookies\n        Map<String, ?> prefsMap = cookiePrefs.getAll();\n        for (Map.Entry<String, ?> entry : prefsMap.entrySet()) {\n            String[] cookieNames = TextUtils.split((String) entry.getValue(), \",\");\n            for (String name : cookieNames) {\n                String encodedCookie = cookiePrefs.getString(name, null);\n                if (encodedCookie != null) {\n                    Cookie decodedCookie = decodeCookie(encodedCookie);\n                    if (decodedCookie != null) {\n                        if (!cookies.containsKey(entry.getKey())) {\n                            cookies.put(entry.getKey(), new ConcurrentHashMap<String,Cookie>());\n                        }\n                        cookies.get(entry.getKey()).put(name, decodedCookie);\n                    }\n                }\n            }\n        }\n    }\n\n    private String getCookieToken(Cookie cookie) {\n        return cookie.name() + \"@\" + cookie.domain();\n    }\n\n    public void add(HttpUrl url, Cookie cookie) {\n        String name = getCookieToken(cookie);\n\n        //将cookies缓存到内存中 如果缓存过期 就重置此cookie\n        if (!cookie.persistent()) {\n            if (!cookies.containsKey(url.host())) {\n                cookies.put(url.host(), new ConcurrentHashMap<String,Cookie>(10));\n            }\n            cookies.get(url.host()).put(name, cookie);\n        } else {\n            if (cookies.containsKey(url.host())) {\n                cookies.get(url.host()).remove(name);\n            }\n        }\n\n        //将cookies持久化到本地\n        SharedPreferences.Editor prefsWriter = cookiePrefs.edit();\n        prefsWriter.putString(url.host(), TextUtils.join(\",\", cookies.get(url.host()).keySet()));//将key值存储用以查询\n        prefsWriter.putString(name, encodeCookie(new OkHttpCookies(cookie)));\n        prefsWriter.apply();\n    }\n\n    public List<Cookie> get(HttpUrl url) {\n        ArrayList<Cookie> ret = new ArrayList<>();\n        if (cookies.containsKey(url.host())) {\n            ret.addAll(cookies.get(url.host()).values());\n        }\n        return ret;\n    }\n\n    void removeAll() {\n        SharedPreferences.Editor prefsWriter = cookiePrefs.edit();\n        prefsWriter.clear();\n        prefsWriter.apply();\n        cookies.clear();\n    }\n\n    public void saveUserInfo(String username,String password){\n        //将userinfo持久化到本地\n        SharedPreferences.Editor prefsWriter = cookiePrefs.edit();\n        prefsWriter.putString(NAME,username);\n        prefsWriter.putString(PASSWORD,password);\n        prefsWriter.apply();\n    }\n\n    public boolean isLogin(){\n        if(cookiePrefs.getString(NAME,null) != null &&\n                cookiePrefs.getString(PASSWORD,null) != null){\n            return true;\n        }\n        return false;\n    }\n    public String getUsername(){\n        String name = cookiePrefs.getString(NAME,null);\n        if(cookiePrefs.getString(NAME,null) != null){\n            return name;\n        }\n        return \"未知用户\";\n    }\n\n    boolean remove(HttpUrl url, Cookie cookie) {\n        String name = getCookieToken(cookie);\n\n        if (cookies.containsKey(url.host()) && cookies.get(url.host()).containsKey(name)) {\n            cookies.get(url.host()).remove(name);\n\n            SharedPreferences.Editor prefsWriter = cookiePrefs.edit();\n            if (cookiePrefs.contains(name)) {\n                prefsWriter.remove(name);\n            }\n            prefsWriter.putString(url.host(), TextUtils.join(\",\", cookies.get(url.host()).keySet()));\n            prefsWriter.apply();\n\n            return true;\n        } else {\n            return false;\n        }\n    }\n\n    List<Cookie> getCookies() {\n        ArrayList<Cookie> ret = new ArrayList<>();\n        for (String key : cookies.keySet()) {\n            ret.addAll(cookies.get(key).values());\n        }\n        return ret;\n    }\n\n    /**\n     * cookies 序列化成 string\n     *\n     * @param cookie 要序列化的cookie\n     * @return 序列化之后的string\n     */\n    private String encodeCookie(OkHttpCookies cookie) {\n        if (cookie == null) {\n            return null;\n        }\n        ByteArrayOutputStream os = new ByteArrayOutputStream();\n        try {\n            ObjectOutputStream outputStream = new ObjectOutputStream(os);\n            outputStream.writeObject(cookie);\n        } catch (IOException e) {\n            Log.d(LOG_TAG, \"IOException in encodeCookie\", e);\n            return null;\n        }\n\n        return byteArrayToHexString(os.toByteArray());\n    }\n\n    /**\n     * 将字符串反序列化成cookies\n     *\n     * @param cookieString cookies string\n     * @return cookie object\n     */\n    private Cookie decodeCookie(String cookieString) {\n        byte[] bytes = hexStringToByteArray(cookieString);\n        ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(bytes);\n        Cookie cookie = null;\n        try {\n            ObjectInputStream objectInputStream = new ObjectInputStream(byteArrayInputStream);\n            cookie = ((OkHttpCookies) objectInputStream.readObject()).getCookies();\n        } catch (IOException e) {\n            Log.d(LOG_TAG, \"IOException in decodeCookie\", e);\n        } catch (ClassNotFoundException e) {\n            Log.d(LOG_TAG, \"ClassNotFoundException in decodeCookie\", e);\n        }\n\n        return cookie;\n    }\n\n    /**\n     * 二进制数组转十六进制字符串\n     *\n     * @param bytes byte array to be converted\n     * @return string containing hex values\n     */\n    private String byteArrayToHexString(byte[] bytes) {\n        StringBuilder sb = new StringBuilder(bytes.length * 2);\n        for (byte element : bytes) {\n            int v = element & 0xff;\n            if (v < 16) {\n                sb.append('0');\n            }\n            sb.append(Integer.toHexString(v));\n        }\n        return sb.toString().toUpperCase(Locale.US);\n    }\n\n    /**\n     * 十六进制字符串转二进制数组\n     *\n     * @param hexString string of hex-encoded values\n     * @return decoded byte array\n     */\n    private byte[] hexStringToByteArray(String hexString) {\n        int len = hexString.length();\n        byte[] data = new byte[len / 2];\n        for (int i = 0; i < len; i += 2) {\n            data[i / 2] = (byte) ((Character.digit(hexString.charAt(i), 16) << 4) + Character.digit(hexString.charAt(i + 1), 16));\n        }\n        return data;\n    }\n}\n"
  },
  {
    "path": "lib_common/src/main/java/com/senon/lib_common/net/progress/ProgressCancelListener.java",
    "content": "package com.senon.lib_common.net.progress;\n\n/**\n * 取消请求监听\n */\npublic interface ProgressCancelListener {\n    void onCancelProgress();\n}\n"
  },
  {
    "path": "lib_common/src/main/java/com/senon/lib_common/net/progress/ProgressDialogHandler.java",
    "content": "package com.senon.lib_common.net.progress;\n\nimport android.content.Context;\nimport android.content.DialogInterface;\nimport android.os.Handler;\nimport android.os.Message;\nimport cn.pedant.SweetAlert.SweetAlertDialog;\n\n/**\n * Dialog的进度控制\n */\npublic class ProgressDialogHandler extends Handler {\n    public static final int SHOW_PROGRESS_DIALOG = 1;\n    public static final int DISMISS_PROGRESS_DIALOG = 2;\n\n    private SweetAlertDialog sad;\n    private Context context;\n    private boolean cancelable;\n    private ProgressCancelListener mProgressCancelListener;\n\n    public ProgressDialogHandler(Context context, ProgressCancelListener mProgressCancelListener, boolean cancelable) {\n        super();\n        this.context = context;\n        this.mProgressCancelListener = mProgressCancelListener;\n        this.cancelable = cancelable;\n    }\n\n    private void initProgressDialog() {\n        if (sad == null) {\n            sad = new SweetAlertDialog(context);\n            sad.changeAlertType(SweetAlertDialog.PROGRESS_TYPE);\n            sad.setTitleText(\"正在加载...\");\n            sad.setCancelable(cancelable);\n\n            if (cancelable) {\n                sad.setOnCancelListener(new DialogInterface.OnCancelListener() {\n                    @Override\n                    public void onCancel(DialogInterface dialogInterface) {\n                        mProgressCancelListener.onCancelProgress();\n                    }\n                });\n            }\n\n            if (!sad.isShowing()) {\n                sad.show();\n            }\n        }\n    }\n\n    private void dismissProgressDialog() {\n        if (sad != null) {\n            sad.dismiss();\n            sad = null;\n        }\n    }\n\n    @Override\n    public void handleMessage(Message msg) {\n        switch (msg.what) {\n            case SHOW_PROGRESS_DIALOG:\n                initProgressDialog();\n                break;\n            case DISMISS_PROGRESS_DIALOG:\n                dismissProgressDialog();\n                break;\n        }\n    }\n}\n"
  },
  {
    "path": "lib_common/src/main/java/com/senon/lib_common/service/InitializeService.java",
    "content": "package com.senon.lib_common.service;\n\nimport android.app.IntentService;\nimport android.content.Context;\nimport android.content.Intent;\n\n/**\n * 在Service中 初始化耗时的SDK等（BaseAppDeletage调用）\n * 为了在application中 不进行耗时操作 影响冷启动 白屏时间增加\n *\n * IntentService特点：\n * 1.在任务完成后将自动停止。\n * 2.任务在队列中执行，是有先后顺序的。\n * 3.任务在子线程中运行，可以执行耗时任务。\n */\n\npublic class InitializeService extends IntentService {\n\n    private static final String ACTION_INIT = \"initApplication\";\n\n    public InitializeService() {\n        super(\"InitializeService\");\n    }\n\n    public static void start(Context context) {\n        Intent intent = new Intent(context, InitializeService.class);\n        intent.setAction(ACTION_INIT);\n        context.startService(intent);\n    }\n\n    @Override\n    protected void onHandleIntent(Intent intent) {\n        if (intent != null) {\n            final String action = intent.getAction();\n            if (ACTION_INIT.equals(action)) {\n\n                initApplication();\n            }\n        }\n    }\n\n    //初始化\n    private void initApplication() {\n\n    }\n\n}\n\n\n"
  },
  {
    "path": "lib_common/src/main/java/com/senon/lib_common/utils/ACache.java",
    "content": "package com.senon.lib_common.utils;\n\nimport android.content.Context;\nimport android.graphics.Bitmap;\nimport android.graphics.BitmapFactory;\nimport android.graphics.Canvas;\nimport android.graphics.PixelFormat;\nimport android.graphics.drawable.BitmapDrawable;\nimport android.graphics.drawable.Drawable;\nimport com.senon.lib_common.AppConfig;\nimport org.json.JSONArray;\nimport org.json.JSONObject;\nimport java.io.BufferedReader;\nimport java.io.BufferedWriter;\nimport java.io.ByteArrayInputStream;\nimport java.io.ByteArrayOutputStream;\nimport java.io.File;\nimport java.io.FileOutputStream;\nimport java.io.FileReader;\nimport java.io.FileWriter;\nimport java.io.IOException;\nimport java.io.ObjectInputStream;\nimport java.io.ObjectOutputStream;\nimport java.io.RandomAccessFile;\nimport java.io.Serializable;\nimport java.math.BigDecimal;\nimport java.util.Collections;\nimport java.util.HashMap;\nimport java.util.Map;\nimport java.util.Map.Entry;\nimport java.util.Set;\nimport java.util.concurrent.atomic.AtomicInteger;\nimport java.util.concurrent.atomic.AtomicLong;\n\n/**\n * @author Michael Yang（www.yangfuhai.com） update at 2013.08.07\n */\npublic class ACache {\n\n    public static final int TIME_HOUR = 60 * 60;\n    public static final int TIME_DAY = TIME_HOUR * 24;\n    private static final int MAX_SIZE = 1000 * 1000 * 50; // 50 mb\n    private static final int MAX_COUNT = Integer.MAX_VALUE; // 不限制存放数据的数量\n    private static Map<String, ACache> mInstanceMap = new HashMap<String, ACache>();\n    private ACacheManager mCache;\n\n\n    public static ACache get(Context ctx) {\n        return get(ctx, \"Data\");\n    }\n\n\n    public static ACache get(Context ctx, String cacheName) {\n        File f = new File(AppConfig.PATH_DATA, cacheName);\n        return get(f, MAX_SIZE, MAX_COUNT);\n    }\n\n\n    public static ACache get(File cacheDir) {\n        return get(cacheDir, MAX_SIZE, MAX_COUNT);\n    }\n\n\n    public static ACache get(Context ctx, long max_zise, int max_count) {\n        File f = new File(AppConfig.PATH_DATA, \"Data\");\n        return get(f, max_zise, max_count);\n    }\n\n\n    public static ACache get(File cacheDir, long max_zise, int max_count) {\n        ACache manager = mInstanceMap.get(cacheDir.getAbsoluteFile() + myPid());\n        if (manager == null) {\n            manager = new ACache(cacheDir, max_zise, max_count);\n            mInstanceMap.put(cacheDir.getAbsolutePath() + myPid(), manager);\n        }\n        return manager;\n    }\n\n    public static boolean deleteDir(File dir) {\n        if (dir != null && dir.isDirectory()) {\n            String[] children = dir.list();\n            for (String aChildren : children) {\n                boolean success = deleteDir(new File(dir, aChildren));\n                if (!success) {\n                    return false;\n                }\n            }\n        }\n        assert dir != null;\n        return dir.delete();\n    }\n\n    public static String getCacheSize(File file) {\n        return getFormatSize(getFolderSize(file));\n    }\n\n    public static long getFolderSize(File file) {\n        long size = 0;\n        try {\n            File[] fileList = file.listFiles();\n            for (File aFileList : fileList) {\n                // 如果下面还有文件\n                if (aFileList.isDirectory()) {\n                    size = size + getFolderSize(aFileList);\n                } else {\n                    size = size + aFileList.length();\n                }\n            }\n        } catch (Exception e) {\n            e.printStackTrace();\n        }\n        return size;\n    }\n\n    public static String getFormatSize(double size) {\n        double kiloByte = size / 1024;\n        if (kiloByte < 1) {\n//            return size + \"Byte\";\n            return \"0K\";\n        }\n\n        double megaByte = kiloByte / 1024;\n        if (megaByte < 1) {\n            BigDecimal result1 = new BigDecimal(Double.toString(kiloByte));\n            return result1.setScale(2, BigDecimal.ROUND_HALF_UP)\n                    .toPlainString() + \"KB\";\n        }\n\n        double gigaByte = megaByte / 1024;\n        if (gigaByte < 1) {\n            BigDecimal result2 = new BigDecimal(Double.toString(megaByte));\n            return result2.setScale(2, BigDecimal.ROUND_HALF_UP)\n                    .toPlainString() + \"MB\";\n        }\n\n        double teraBytes = gigaByte / 1024;\n        if (teraBytes < 1) {\n            BigDecimal result3 = new BigDecimal(Double.toString(gigaByte));\n            return result3.setScale(2, BigDecimal.ROUND_HALF_UP)\n                    .toPlainString() + \"GB\";\n        }\n        BigDecimal result4 = new BigDecimal(teraBytes);\n        return result4.setScale(2, BigDecimal.ROUND_HALF_UP).toPlainString()\n                + \"TB\";\n    }\n\n\n    private static String myPid() {\n        return \"_\" + android.os.Process.myPid();\n    }\n\n\n    private ACache(File cacheDir, long max_size, int max_count) {\n        if (!cacheDir.exists() && !cacheDir.mkdirs()) {\n            throw new RuntimeException(\"can't make dirs in \" + cacheDir.getAbsolutePath());\n        }\n        mCache = new ACacheManager(cacheDir, max_size, max_count);\n    }\n\n    // =======================================\n    // ============ String数据 读写 ==============\n    // =======================================\n\n\n    /**\n     * 保存 String数据 到 缓存中\n     *\n     * @param key 保存的key\n     * @param value 保存的String数据\n     */\n    public void put(String key, String value) {\n        File file = mCache.newFile(key);\n        BufferedWriter out = null;\n        try {\n            out = new BufferedWriter(new FileWriter(file), 1024);\n            out.write(value);\n        } catch (IOException e) {\n            e.printStackTrace();\n        } finally {\n            if (out != null) {\n                try {\n                    out.flush();\n                    out.close();\n                } catch (IOException e) {\n                    e.printStackTrace();\n                }\n            }\n            mCache.put(file);\n        }\n    }\n\n\n    /**\n     * 保存 String数据 到 缓存中\n     *\n     * @param key 保存的key\n     * @param value 保存的String数据\n     * @param saveTime 保存的时间，单位：秒\n     */\n    public void put(String key, String value, int saveTime) {\n        put(key, Utils.newStringWithDateInfo(saveTime, value));\n    }\n\n\n    /**\n     * 读取 String数据\n     *\n     * @return String 数据\n     */\n    public String getAsString(String key) {\n        File file = mCache.get(key);\n        if (!file.exists()) return null;\n        boolean removeFile = false;\n        BufferedReader in = null;\n        try {\n            in = new BufferedReader(new FileReader(file));\n            String readString = \"\";\n            String currentLine;\n            while ((currentLine = in.readLine()) != null) {\n                readString += currentLine;\n            }\n            if (!Utils.isDue(readString)) {\n                return Utils.clearDateInfo(readString);\n            }\n            else {\n                removeFile = true;\n                return null;\n            }\n        } catch (IOException e) {\n            e.printStackTrace();\n            return null;\n        } finally {\n            if (in != null) {\n                try {\n                    in.close();\n                } catch (IOException e) {\n                    e.printStackTrace();\n                }\n            }\n            if (removeFile) remove(key);\n        }\n    }\n\n    // =======================================\n    // ============= JSONObject 数据 读写 ==============\n    // =======================================\n\n\n    /**\n     * 保存 JSONObject数据 到 缓存中\n     *  @param key 保存的key\n     * @param value 保存的JSON数据\n     */\n    public void put(String key, JSONObject value) {\n        put(key, value.toString());\n    }\n\n\n    /**\n     * 保存 JSONObject数据 到 缓存中\n     *\n     * @param key 保存的key\n     * @param value 保存的JSONObject数据\n     * @param saveTime 保存的时间，单位：秒\n     */\n    public void put(String key, JSONObject value, int saveTime) {\n        put(key, value.toString(), saveTime);\n    }\n\n\n    /**\n     * 读取JSONObject数据\n     *\n     * @return JSONObject数据\n     */\n    public JSONObject getAsJSONObject(String key) {\n        String JSONString = getAsString(key);\n        try {\n            JSONObject obj = new JSONObject(JSONString);\n            return obj;\n        } catch (Exception e) {\n            e.printStackTrace();\n            return null;\n        }\n    }\n\n    // =======================================\n    // ============ JSONArray 数据 读写 =============\n    // =======================================\n\n\n    /**\n     * 保存 JSONArray数据 到 缓存中\n     *\n     * @param key 保存的key\n     * @param value 保存的JSONArray数据\n     */\n    public void put(String key, JSONArray value) {\n        put(key, value.toString());\n    }\n\n\n    /**\n     * 保存 JSONArray数据 到 缓存中\n     *\n     * @param key 保存的key\n     * @param value 保存的JSONArray数据\n     * @param saveTime 保存的时间，单位：秒\n     */\n    public void put(String key, JSONArray value, int saveTime) {\n        put(key, value.toString(), saveTime);\n    }\n\n\n    /**\n     * 读取JSONArray数据\n     *\n     * @return JSONArray数据\n     */\n    public JSONArray getAsJSONArray(String key) {\n        String JSONString = getAsString(key);\n        try {\n            JSONArray obj = new JSONArray(JSONString);\n            return obj;\n        } catch (Exception e) {\n            e.printStackTrace();\n            return null;\n        }\n    }\n\n    // =======================================\n    // ============== byte 数据 读写 =============\n    // =======================================\n\n\n    /**\n     * 保存 byte数据 到 缓存中\n     *\n     * @param key 保存的key\n     * @param value 保存的数据\n     */\n    public void put(String key, byte[] value) {\n        File file = mCache.newFile(key);\n        FileOutputStream out = null;\n        try {\n            out = new FileOutputStream(file);\n            out.write(value);\n        } catch (Exception e) {\n            e.printStackTrace();\n        } finally {\n            if (out != null) {\n                try {\n                    out.flush();\n                    out.close();\n                } catch (IOException e) {\n                    e.printStackTrace();\n                }\n            }\n            mCache.put(file);\n        }\n    }\n\n\n    /**\n     * 保存 byte数据 到 缓存中\n     *\n     * @param key 保存的key\n     * @param value 保存的数据\n     * @param saveTime 保存的时间，单位：秒\n     */\n    public void put(String key, byte[] value, int saveTime) {\n        put(key, Utils.newByteArrayWithDateInfo(saveTime, value));\n    }\n\n\n    /**\n     * 获取 byte 数据\n     *\n     * @return byte 数据\n     */\n    public byte[] getAsBinary(String key) {\n        RandomAccessFile RAFile = null;\n        boolean removeFile = false;\n        try {\n            File file = mCache.get(key);\n            if (!file.exists()) return null;\n            RAFile = new RandomAccessFile(file, \"r\");\n            byte[] byteArray = new byte[(int) RAFile.length()];\n            RAFile.read(byteArray);\n            if (!Utils.isDue(byteArray)) {\n                return Utils.clearDateInfo(byteArray);\n            }\n            else {\n                removeFile = true;\n                return null;\n            }\n        } catch (Exception e) {\n            e.printStackTrace();\n            return null;\n        } finally {\n            if (RAFile != null) {\n                try {\n                    RAFile.close();\n                } catch (IOException e) {\n                    e.printStackTrace();\n                }\n            }\n            if (removeFile) remove(key);\n        }\n    }\n\n    // =======================================\n    // ============= 序列化 数据 读写 ===============\n    // =======================================\n\n\n    /**\n     * 保存 Serializable数据 到 缓存中\n     *\n     * @param key 保存的key\n     * @param value 保存的value\n     */\n    public void put(String key, Serializable value) {\n        put(key, value, -1);\n    }\n\n\n    /**\n     * 保存 Serializable数据到 缓存中\n     *\n     * @param key 保存的key\n     * @param value 保存的value\n     * @param saveTime 保存的时间，单位：秒\n     */\n    public void put(String key, Serializable value, int saveTime) {\n        ByteArrayOutputStream baos = null;\n        ObjectOutputStream oos = null;\n        try {\n            baos = new ByteArrayOutputStream();\n            oos = new ObjectOutputStream(baos);\n            oos.writeObject(value);\n            byte[] data = baos.toByteArray();\n            if (saveTime != -1) {\n                put(key, data, saveTime);\n            }\n            else {\n                put(key, data);\n            }\n        } catch (Exception e) {\n            e.printStackTrace();\n        } finally {\n            try {\n                oos.close();\n            } catch (IOException e) {\n            }\n        }\n    }\n\n\n    /**\n     * 读取 Serializable数据\n     *\n     * @return Serializable 数据\n     */\n    public Object getAsObject(String key) {\n        byte[] data = getAsBinary(key);\n        if (data != null) {\n            ByteArrayInputStream bais = null;\n            ObjectInputStream ois = null;\n            try {\n                bais = new ByteArrayInputStream(data);\n                ois = new ObjectInputStream(bais);\n                Object reObject = ois.readObject();\n                return reObject;\n            } catch (Exception e) {\n                e.printStackTrace();\n                return null;\n            } finally {\n                try {\n                    if (bais != null) bais.close();\n                } catch (IOException e) {\n                    e.printStackTrace();\n                }\n                try {\n                    if (ois != null) ois.close();\n                } catch (IOException e) {\n                    e.printStackTrace();\n                }\n            }\n        }\n        return null;\n    }\n\n    // =======================================\n    // ============== bitmap 数据 读写 =============\n    // =======================================\n\n\n    /**\n     * 保存 bitmap 到 缓存中\n     *\n     * @param key 保存的key\n     * @param value 保存的bitmap数据\n     */\n    public void put(String key, Bitmap value) {\n        put(key, Utils.Bitmap2Bytes(value));\n    }\n\n\n    /**\n     * 保存 bitmap 到 缓存中\n     *\n     * @param key 保存的key\n     * @param value 保存的 bitmap 数据\n     * @param saveTime 保存的时间，单位：秒\n     */\n    public void put(String key, Bitmap value, int saveTime) {\n        put(key, Utils.Bitmap2Bytes(value), saveTime);\n    }\n\n\n    /**\n     * 读取 bitmap 数据\n     *\n     * @return bitmap 数据\n     */\n    public Bitmap getAsBitmap(String key) {\n        if (getAsBinary(key) == null) {\n            return null;\n        }\n        return Utils.Bytes2Bimap(getAsBinary(key));\n    }\n\n    // =======================================\n    // ============= drawable 数据 读写 =============\n    // =======================================\n\n\n    /**\n     * 保存 drawable 到 缓存中\n     *\n     * @param key 保存的key\n     * @param value 保存的drawable数据\n     */\n    public void put(String key, Drawable value) {\n        put(key, Utils.drawable2Bitmap(value));\n    }\n\n\n    /**\n     * 保存 drawable 到 缓存中\n     *\n     * @param key 保存的key\n     * @param value 保存的 drawable 数据\n     * @param saveTime 保存的时间，单位：秒\n     */\n    public void put(String key, Drawable value, int saveTime) {\n        put(key, Utils.drawable2Bitmap(value), saveTime);\n    }\n\n\n    /**\n     * 读取 Drawable 数据\n     *\n     * @return Drawable 数据\n     */\n    public Drawable getAsDrawable(String key) {\n        if (getAsBinary(key) == null) {\n            return null;\n        }\n        return Utils.bitmap2Drawable(Utils.Bytes2Bimap(getAsBinary(key)));\n    }\n\n\n    /**\n     * 获取缓存文件\n     *\n     * @return value 缓存的文件\n     */\n    public File file(String key) {\n        File f = mCache.newFile(key);\n        if (f.exists()) return f;\n        return null;\n    }\n\n\n    /**\n     * 移除某个key\n     *\n     * @return 是否移除成功\n     */\n    public boolean remove(String key) {\n        return mCache.remove(key);\n    }\n\n\n    /**\n     * 清除所有数据\n     */\n    public void clear() {\n        mCache.clear();\n    }\n\n\n    /**\n     * @author 杨福海（michael） www.yangfuhai.com\n     * @version 1.0\n     * @title 缓存管理器\n     */\n    public class ACacheManager {\n        private final AtomicLong cacheSize;\n        private final AtomicInteger cacheCount;\n        private final long sizeLimit;\n        private final int countLimit;\n        private final Map<File, Long> lastUsageDates = Collections.synchronizedMap(new HashMap<File, Long>());\n        protected File cacheDir;\n\n\n        private ACacheManager(File cacheDir, long sizeLimit, int countLimit) {\n            this.cacheDir = cacheDir;\n            this.sizeLimit = sizeLimit;\n            this.countLimit = countLimit;\n            cacheSize = new AtomicLong();\n            cacheCount = new AtomicInteger();\n            calculateCacheSizeAndCacheCount();\n        }\n\n\n        /**\n         * 计算 cacheSize和cacheCount\n         */\n        private void calculateCacheSizeAndCacheCount() {\n            new Thread(new Runnable() {\n                @Override public void run() {\n                    int size = 0;\n                    int count = 0;\n                    File[] cachedFiles = cacheDir.listFiles();\n                    if (cachedFiles != null) {\n                        for (File cachedFile : cachedFiles) {\n                            size += calculateSize(cachedFile);\n                            count += 1;\n                            lastUsageDates.put(cachedFile, cachedFile.lastModified());\n                        }\n                        cacheSize.set(size);\n                        cacheCount.set(count);\n                    }\n                }\n            }).start();\n        }\n\n\n        private void put(File file) {\n            int curCacheCount = cacheCount.get();\n            while (curCacheCount + 1 > countLimit) {\n                long freedSize = removeNext();\n                cacheSize.addAndGet(-freedSize);\n\n                curCacheCount = cacheCount.addAndGet(-1);\n            }\n            cacheCount.addAndGet(1);\n\n            long valueSize = calculateSize(file);\n            long curCacheSize = cacheSize.get();\n            while (curCacheSize + valueSize > sizeLimit) {\n                long freedSize = removeNext();\n                curCacheSize = cacheSize.addAndGet(-freedSize);\n            }\n            cacheSize.addAndGet(valueSize);\n\n            Long currentTime = System.currentTimeMillis();\n            file.setLastModified(currentTime);\n            lastUsageDates.put(file, currentTime);\n        }\n\n\n        private File get(String key) {\n            File file = newFile(key);\n            Long currentTime = System.currentTimeMillis();\n            file.setLastModified(currentTime);\n            lastUsageDates.put(file, currentTime);\n\n            return file;\n        }\n\n\n        private File newFile(String key) {\n            return new File(cacheDir, key.hashCode() + \"\");\n        }\n\n\n        private boolean remove(String key) {\n            File image = get(key);\n            return image.delete();\n        }\n\n\n        private void clear() {\n            lastUsageDates.clear();\n            cacheSize.set(0);\n            File[] files = cacheDir.listFiles();\n            if (files != null) {\n                for (File f : files) {\n                    f.delete();\n                }\n            }\n        }\n\n\n        /**\n         * 移除旧的文件\n         */\n        private long removeNext() {\n            if (lastUsageDates.isEmpty()) {\n                return 0;\n            }\n\n            Long oldestUsage = null;\n            File mostLongUsedFile = null;\n            Set<Entry<File, Long>> entries = lastUsageDates.entrySet();\n            synchronized (lastUsageDates) {\n                for (Entry<File, Long> entry : entries) {\n                    if (mostLongUsedFile == null) {\n                        mostLongUsedFile = entry.getKey();\n                        oldestUsage = entry.getValue();\n                    }\n                    else {\n                        Long lastValueUsage = entry.getValue();\n                        if (lastValueUsage < oldestUsage) {\n                            oldestUsage = lastValueUsage;\n                            mostLongUsedFile = entry.getKey();\n                        }\n                    }\n                }\n            }\n\n            long fileSize = calculateSize(mostLongUsedFile);\n            if (mostLongUsedFile.delete()) {\n                lastUsageDates.remove(mostLongUsedFile);\n            }\n            return fileSize;\n        }\n\n\n        private long calculateSize(File file) {\n            return file.length();\n        }\n    }\n\n    /**\n     * @author 杨福海（michael） www.yangfuhai.com\n     * @version 1.0\n     * @title 时间计算工具类\n     */\n    private static class Utils {\n\n        /**\n         * 判断缓存的String数据是否到期\n         *\n         * @return true：到期了 false：还没有到期\n         */\n        private static boolean isDue(String str) {\n            return isDue(str.getBytes());\n        }\n\n\n        /**\n         * 判断缓存的byte数据是否到期\n         *\n         * @return true：到期了 false：还没有到期\n         */\n        private static boolean isDue(byte[] data) {\n            String[] strs = getDateInfoFromDate(data);\n            if (strs != null && strs.length == 2) {\n                String saveTimeStr = strs[0];\n                while (saveTimeStr.startsWith(\"0\")) {\n                    saveTimeStr = saveTimeStr.substring(1, saveTimeStr.length());\n                }\n                long saveTime = Long.valueOf(saveTimeStr);\n                long deleteAfter = Long.valueOf(strs[1]);\n                if (System.currentTimeMillis() > saveTime + deleteAfter * 1000) {\n                    return true;\n                }\n            }\n            return false;\n        }\n\n\n        private static String newStringWithDateInfo(int second, String strInfo) {\n            return createDateInfo(second) + strInfo;\n        }\n\n\n        private static byte[] newByteArrayWithDateInfo(int second, byte[] data2) {\n            byte[] data1 = createDateInfo(second).getBytes();\n            byte[] retdata = new byte[data1.length + data2.length];\n            System.arraycopy(data1, 0, retdata, 0, data1.length);\n            System.arraycopy(data2, 0, retdata, data1.length, data2.length);\n            return retdata;\n        }\n\n\n        private static String clearDateInfo(String strInfo) {\n            if (strInfo != null && hasDateInfo(strInfo.getBytes())) {\n                strInfo = strInfo.substring(strInfo.indexOf(mSeparator) + 1, strInfo.length());\n            }\n            return strInfo;\n        }\n\n\n        private static byte[] clearDateInfo(byte[] data) {\n            if (hasDateInfo(data)) {\n                return copyOfRange(data, indexOf(data, mSeparator) + 1, data.length);\n            }\n            return data;\n        }\n\n\n        private static boolean hasDateInfo(byte[] data) {\n            return data != null && data.length > 15 && data[13] == '-' && indexOf(data, mSeparator) > 14;\n        }\n\n\n        private static String[] getDateInfoFromDate(byte[] data) {\n            if (hasDateInfo(data)) {\n                String saveDate = new String(copyOfRange(data, 0, 13));\n                String deleteAfter = new String(copyOfRange(data, 14, indexOf(data, mSeparator)));\n                return new String[] { saveDate, deleteAfter };\n            }\n            return null;\n        }\n\n\n        private static int indexOf(byte[] data, char c) {\n            for (int i = 0; i < data.length; i++) {\n                if (data[i] == c) {\n                    return i;\n                }\n            }\n            return -1;\n        }\n\n\n        private static byte[] copyOfRange(byte[] original, int from, int to) {\n            int newLength = to - from;\n            if (newLength < 0) throw new IllegalArgumentException(from + \" > \" + to);\n            byte[] copy = new byte[newLength];\n            System.arraycopy(original, from, copy, 0, Math.min(original.length - from, newLength));\n            return copy;\n        }\n\n\n        private static final char mSeparator = ' ';\n\n\n        private static String createDateInfo(int second) {\n            String currentTime = System.currentTimeMillis() + \"\";\n            while (currentTime.length() < 13) {\n                currentTime = \"0\" + currentTime;\n            }\n            return currentTime + \"-\" + second + mSeparator;\n        }\n\n\n        /*\n         * Bitmap → byte[]\n         */\n        private static byte[] Bitmap2Bytes(Bitmap bm) {\n            if (bm == null) {\n                return null;\n            }\n            ByteArrayOutputStream baos = new ByteArrayOutputStream();\n            bm.compress(Bitmap.CompressFormat.PNG, 100, baos);\n            return baos.toByteArray();\n        }\n\n\n        /*\n         * byte[] → Bitmap\n         */\n        private static Bitmap Bytes2Bimap(byte[] b) {\n            if (b.length == 0) {\n                return null;\n            }\n            return BitmapFactory.decodeByteArray(b, 0, b.length);\n        }\n\n\n        /*\n         * Drawable → Bitmap\n         */\n        private static Bitmap drawable2Bitmap(Drawable drawable) {\n            if (drawable == null) {\n                return null;\n            }\n            // 取 drawable 的长宽\n            int w = drawable.getIntrinsicWidth();\n            int h = drawable.getIntrinsicHeight();\n            // 取 drawable 的颜色格式\n            Bitmap.Config config = drawable.getOpacity() != PixelFormat.OPAQUE\n                    ? Bitmap.Config.ARGB_8888\n                    : Bitmap.Config.RGB_565;\n            // 建立对应 bitmap\n            Bitmap bitmap = Bitmap.createBitmap(w, h, config);\n            // 建立对应 bitmap 的画布\n            Canvas canvas = new Canvas(bitmap);\n            drawable.setBounds(0, 0, w, h);\n            // 把 drawable 内容画到画布中\n            drawable.draw(canvas);\n            return bitmap;\n        }\n\n\n        /*\n         * Bitmap → Drawable\n         */\n        @SuppressWarnings(\"deprecation\") private static Drawable bitmap2Drawable(Bitmap bm) {\n            if (bm == null) {\n                return null;\n            }\n            return new BitmapDrawable(bm);\n        }\n    }\n}"
  },
  {
    "path": "lib_common/src/main/java/com/senon/lib_common/utils/BaseEvent.java",
    "content": "package com.senon.lib_common.utils;\n\n/**\n * eventbus发送实体\n */\npublic class BaseEvent<T> {\n\n    /**\n//     * -1:退出登录时通知Mainactivity finish\n     * 0：登录成功   刷新所有主界面数据列表\n     * 1：退出成功   。。。\n     *\n     * 101:文章收藏/取消收藏  （HomeMainFragment、ArtMainFragment、HomeArticleActivity、HomeProjectActivity）\n     * 102:文章收藏/取消收藏失败 。。。\n     *\n     *\n     *\n     *\n     */\n    private int code;\n    private String msg;\n    private T data;\n    private boolean isCollect;\n    private int id;\n    private boolean ingored;\n\n\n    public int getCode() {\n        return code;\n    }\n\n    public void setCode(int code) {\n        this.code = code;\n    }\n\n    public String getMsg() {\n        return msg;\n    }\n\n    public void setMsg(String msg) {\n        this.msg = msg;\n    }\n\n    public T getData() {\n        return data;\n    }\n\n    public void setData(T data) {\n        this.data = data;\n    }\n\n    public boolean isCollect() {\n        return isCollect;\n    }\n\n    public void setCollect(boolean collect) {\n        isCollect = collect;\n    }\n\n    public int getId() {\n        return id;\n    }\n\n    public void setId(int id) {\n        this.id = id;\n    }\n\n    public boolean isIngored() {\n        return ingored;\n    }\n\n    public void setIngored(boolean ingored) {\n        this.ingored = ingored;\n    }\n\n\n}\n"
  },
  {
    "path": "lib_common/src/main/java/com/senon/lib_common/utils/ConstantUtils.java",
    "content": "package com.senon.lib_common.utils;\n\nimport android.content.Context;\nimport android.content.pm.ApplicationInfo;\nimport android.content.pm.PackageManager;\n\n/**\n * 基础常量工具类\n */\npublic class ConstantUtils {\n    private static Context context;\n    /**\n     * 初始化工具类\n     * @param context 上下文\n     */\n    public static void init(Context context) {\n        ConstantUtils.context = context.getApplicationContext();\n    }\n\n    /**\n     * 获取ApplicationContext\n     * @return ApplicationContext\n     */\n    public static Context getAPPContext() {\n        if (context != null) return context;\n        throw new NullPointerException(\"u should init first\");\n    }\n\n    /**\n     * 判断App是否是Debug版本\n     * @return {@code true}: 是<br>{@code false}: 否\n     */\n    public static boolean isAppDebug() {\n        String packageName = context.getPackageName();\n        if (packageName == null || packageName.trim().length() == 0)\n            return false;\n        try {\n            PackageManager pm = context.getPackageManager();\n            ApplicationInfo ai = pm.getApplicationInfo(context.getPackageName(), 0);\n            return ai != null && (ai.flags & ApplicationInfo.FLAG_DEBUGGABLE) != 0;\n        } catch (PackageManager.NameNotFoundException e) {\n            e.printStackTrace();\n            return false;\n        }\n    }\n}\n"
  },
  {
    "path": "lib_common/src/main/java/com/senon/lib_common/utils/LogUtils.java",
    "content": "package com.senon.lib_common.utils;\n\nimport android.util.Log;\n\nimport java.util.Locale;\n\n/**\n * 打印log日志工具类\n */\npublic class LogUtils {\n    private static boolean LOG = true;\n    private static boolean LOGV = true;\n    private static boolean LOGD = true;\n    private static boolean LOGI = true;\n    private static boolean LOGW = true;\n    private static boolean LOGE = true;\n\n    public static void setLogEnable(boolean enable) {\n        LOG = enable;\n    }\n\n    public static void v(String mess) {\n        if (LOG && LOGV) {\n            Log.v(getTag(), buildMessage(mess));\n        }\n    }\n\n    public static void d(String mess) {\n        if (LOG && LOGD) {\n            Log.d(getTag(), buildMessage(mess));\n        }\n    }\n\n    public static void i(String mess) {\n        if (LOG && LOGI) {\n            Log.i(getTag(), buildMessage(mess));\n        }\n    }\n\n    public static void w(String mess) {\n        if (LOG && LOGW) {\n            Log.w(getTag(), buildMessage(mess));\n        }\n    }\n\n    public static void e(String mess) {\n        if (LOG && LOGE) {\n            log(getTag(), buildMessage(mess));\n        }\n    }\n\n    public static void log(String tag, String msg){\n        if(msg.length() > 4000) {\n            for(int i=0;i<msg.length();i+=4000){\n                if(i+4000<msg.length())\n                    Log.e(tag,msg.substring(i, i+4000));\n                else\n                    Log.e(tag,msg.substring(i, msg.length()));\n            }\n        } else\n            Log.e(tag,msg);\n    }\n\n    private static String getTag() {\n        StackTraceElement[] trace = new Throwable().fillInStackTrace()\n                .getStackTrace();\n        String callingClass = \"\";\n        for (int i = 2; i < trace.length; i++) {\n            Class<?> clazz = trace[i].getClass();\n            if (!clazz.equals(LogUtils.class)) {\n                callingClass = trace[i].getClassName();\n                callingClass = callingClass.substring(callingClass\n                        .lastIndexOf('.') + 1);\n                break;\n            }\n        }\n        return callingClass;\n    }\n\n    private static String buildMessage(String msg) {\n        StackTraceElement[] trace = new Throwable().fillInStackTrace()\n                .getStackTrace();\n        String caller = \"\";\n        for (int i = 2; i < trace.length; i++) {\n            Class<?> clazz = trace[i].getClass();\n            if (!clazz.equals(LogUtils.class)) {\n                caller = trace[i].getMethodName();\n                break;\n            }\n        }\n        return String.format(Locale.US, \"[%d] %s: %s\", Thread.currentThread()\n                .getId(), caller, msg);\n    }\n\n}\n"
  },
  {
    "path": "lib_common/src/main/java/com/senon/lib_common/utils/MD5Utils.java",
    "content": "package com.senon.lib_common.utils;\n\nimport java.security.MessageDigest;\nimport java.security.NoSuchAlgorithmException;\n\n/**\n * MD5工具\n */\npublic class MD5Utils {\n    //静态方法，便于作为工具类\n    public static String getMd5(String plainText) {\n                try {\n                    MessageDigest md = MessageDigest.getInstance(\"MD5\");\n                    md.update(plainText.getBytes());\n                         byte b[] = md.digest();\n                         int i;\n                        StringBuffer buf = new StringBuffer(\"\");\n                        for (int offset = 0; offset < b.length; offset++) {\n                                i = b[offset];\n                                 if (i < 0)\n                                        i += 256;\n                                 if (i < 16)\n                                         buf.append(\"0\");\n                                 buf.append(Integer.toHexString(i));\n                             }\n                        //32位加密\n                         return buf.toString();\n                         // 16位的加密\n                         //return buf.toString().substring(8, 24);\n                     } catch (NoSuchAlgorithmException e) {\n                         e.printStackTrace();\n                         return null;\n                     }\n    }\n}\n"
  },
  {
    "path": "lib_common/src/main/java/com/senon/lib_common/utils/PreferenceTool.java",
    "content": "package com.senon.lib_common.utils;\n\nimport android.content.Context;\nimport android.content.SharedPreferences;\n\nimport com.senon.lib_opensource.BuildConfig;\n\nimport java.util.Map;\n\n/**\n * 共享参数工具类\n */\npublic class PreferenceTool {\n\n    private static final String PREF_NAME = BuildConfig.APPLICATION_ID + \"_preferences\";\n    private static SharedPreferences.Editor editor;\n    private static SharedPreferences pref;\n\n\n    public static void init(Context context) {\n        pref = context.getSharedPreferences(PREF_NAME, Context.MODE_PRIVATE);\n        editor = pref.edit();\n    }\n\n    public static void clear() {\n        if (editor == null) return;\n        editor.clear();\n    }\n\n    public static void commit() {\n        if (editor == null) return;\n        editor.commit();\n    }\n\n    public static void apply() {\n        if (editor == null) return;\n        editor.apply();\n    }\n\n    public static boolean contains(String key) {\n        return pref != null && pref.contains(key);\n    }\n\n    public static float getFloat(String key, float defValue) {\n        return pref != null ? pref.getFloat(key, defValue) : defValue;\n    }\n\n    public static int getInt(String key, int defValue) {\n        return pref != null ? pref.getInt(key, defValue) : defValue;\n    }\n\n    public static long getLong(String key, long defValue) {\n        return pref != null ? pref.getLong(key, defValue) : defValue;\n    }\n\n    public static String getString(String key) {\n        return pref != null ? pref.getString(key, \"\") : \"\";\n    }\n\n    public static String getString(String key, String defValue) {\n        return pref != null ? pref.getString(key, defValue) : defValue;\n    }\n\n    public static boolean getBoolean(String key, boolean defValue) {\n        return pref != null ? pref.getBoolean(key, defValue) : defValue;\n    }\n\n    public static Map<String, ?> getAll() {\n        return pref != null ? pref.getAll() : null;\n    }\n\n\n\n    public static void putFloat(String key, float value) {\n        if (editor == null) return;\n        editor.putFloat(key, value);\n    }\n\n    public static void putInt(String key, int value) {\n        if (editor == null) return;\n        editor.putInt(key, value);\n    }\n\n    public static void putLong(String key, long value) {\n        if (editor == null) return;\n        editor.putLong(key, value);\n    }\n\n    public static void putString(String key, String value) {\n        if (editor == null) return;\n        editor.putString(key, value);\n    }\n\n    public static void putBoolean(String key, boolean value) {\n        if (editor == null) return;\n        editor.putBoolean(key, value);\n    }\n\n    public static void remove(String key) {\n        if (editor == null) return;\n        editor.remove(key);\n    }\n}\n"
  },
  {
    "path": "lib_common/src/main/java/com/senon/lib_common/utils/RetryWithDelay.java",
    "content": "package com.senon.lib_common.utils;\n\n\nimport java.util.concurrent.TimeUnit;\n\nimport io.reactivex.Observable;\nimport io.reactivex.ObservableSource;\nimport io.reactivex.annotations.NonNull;\nimport io.reactivex.functions.Function;\n\npublic class RetryWithDelay implements Function<Observable<Throwable>, ObservableSource<?>> {\n\n    private final int maxRetries;\n    private final int retryDelaySecond;\n    private int retryCount;\n\n    public RetryWithDelay(int maxRetries, int retryDelaySecond) {\n        this.maxRetries = maxRetries;\n        this.retryDelaySecond = retryDelaySecond;\n    }\n\n    @Override\n    public ObservableSource<?> apply(@NonNull Observable<Throwable> throwableObservable) throws Exception {\n        return throwableObservable\n                .flatMap(new Function<Throwable, ObservableSource<?>>() {\n                    @Override\n                    public ObservableSource<?> apply(@NonNull Throwable throwable) throws Exception {\n                        if (++retryCount <= maxRetries) {\n                            // When this Observable calls onNext, the original Observable will be retried (i.e. re-subscribed).\n                            LogUtils.d(\"get error, it will try after \" + retryDelaySecond\n                                    + \" second, retry count \" + retryCount);\n                            return Observable.timer(retryDelaySecond,\n                                    TimeUnit.SECONDS);\n                        }\n                        // Max retries hit. Just pass the error along.\n                        return Observable.error(throwable);\n                    }\n                });\n    }\n}"
  },
  {
    "path": "lib_common/src/main/java/com/senon/lib_common/utils/RxUtils.java",
    "content": "package com.senon.lib_common.utils;\n\nimport com.senon.lib_common.base.BaseViewImp;\nimport com.trello.rxlifecycle2.LifecycleTransformer;\nimport com.trello.rxlifecycle2.android.ActivityEvent;\nimport com.trello.rxlifecycle2.android.FragmentEvent;\nimport com.trello.rxlifecycle2.components.support.RxAppCompatActivity;\nimport com.trello.rxlifecycle2.components.support.RxFragment;\nimport io.reactivex.Observable;\nimport io.reactivex.ObservableSource;\nimport io.reactivex.ObservableTransformer;\nimport io.reactivex.android.schedulers.AndroidSchedulers;\nimport io.reactivex.annotations.NonNull;\nimport io.reactivex.schedulers.Schedulers;\n\n/**\n * 在presenter中使用生命周期管理，防止内存泄漏\n */\npublic class RxUtils {\n\n    public static <T> LifecycleTransformer<T> bindToLifecycle(BaseViewImp view) {\n        if (view instanceof RxAppCompatActivity) {\n            return ((RxAppCompatActivity) view).bindToLifecycle();\n        } else if (view instanceof RxFragment) {\n            return ((RxFragment) view).bindToLifecycle();\n        } else {\n            throw new IllegalArgumentException(\"view isn't activity or fragment\");\n        }\n    }\n\n    public static <T> LifecycleTransformer<T> bindActivityUntilEvent(BaseViewImp view,ActivityEvent event) {\n        if (view instanceof RxAppCompatActivity) {\n            return ((RxAppCompatActivity) view).bindUntilEvent(event);\n        } else {\n            throw new IllegalArgumentException(\"view isn't activity\");\n        }\n    }\n\n    public static <T> LifecycleTransformer<T> bindFragmentUntilEvent(BaseViewImp view,FragmentEvent event) {\n        if (view instanceof RxFragment) {\n            return ((RxFragment) view).bindUntilEvent(event);\n        } else {\n            throw new IllegalArgumentException(\"view isn't fragment\");\n        }\n    }\n\n    public static <T> ObservableTransformer<T, T> getSchedulerTransformer(){\n        return new ObservableTransformer<T, T>() {\n            @Override\n            public ObservableSource<T> apply(@NonNull Observable<T> upstream) {\n                return upstream\n                        .subscribeOn(Schedulers.io())\n                        .unsubscribeOn(Schedulers.io())\n                        .observeOn(AndroidSchedulers.mainThread());\n            }\n        };\n    }\n\n}\n"
  },
  {
    "path": "lib_common/src/main/java/com/senon/lib_common/utils/StatusBarUtils.java",
    "content": "package com.senon.lib_common.utils;\n\nimport android.app.Activity;\nimport android.content.Context;\nimport android.graphics.Color;\nimport android.graphics.drawable.Drawable;\nimport android.os.Build;\nimport android.support.v4.widget.DrawerLayout;\nimport android.support.v7.app.ActionBar;\nimport android.support.v7.app.AppCompatActivity;\nimport android.util.Log;\nimport android.util.TypedValue;\nimport android.view.View;\nimport android.view.ViewGroup;\nimport android.view.Window;\nimport android.view.WindowManager;\nimport android.widget.LinearLayout;\n\n/**\n * 状态栏沉浸\n */\n\npublic class StatusBarUtils {\n    private Activity mActivity;\n    //状态栏颜色\n    private int mColor = -1;\n    //状态栏drawble\n    private Drawable mDrawable;\n    //是否是最外层布局是 DrawerLayout 的侧滑菜单\n    private boolean mIsDrawerLayout;\n    //是否包含 ActionBar\n    private boolean mIsActionBar;\n    //侧滑菜单页面的内容视图\n    private int mContentResourseIdInDrawer;\n\n    public StatusBarUtils(Activity activity) {\n        mActivity = activity;\n    }\n\n    public static StatusBarUtils with(Activity activity) {\n        return new StatusBarUtils(activity);\n    }\n\n    public int getColor() {\n        return mColor;\n    }\n\n    public StatusBarUtils setColor(int color) {\n        mColor = color;\n        return this;\n    }\n\n    public Drawable getDrawable() {\n        return mDrawable;\n    }\n\n    public StatusBarUtils setDrawable(Drawable drawable) {\n        mDrawable = drawable;\n        return this;\n    }\n\n    public boolean isDrawerLayout() {\n        return mIsDrawerLayout;\n    }\n\n    public boolean isActionBar() {\n        return mIsActionBar;\n    }\n\n    public StatusBarUtils setIsActionBar(boolean actionBar) {\n        mIsActionBar = actionBar;\n        return this;\n    }\n\n    /**\n     * 是否是最外层布局为 DrawerLayout 的侧滑菜单\n     *\n     * @param drawerLayout 是否最外层布局为 DrawerLayout\n     * @param contentId    内容视图的 id\n     * @return\n     */\n    public StatusBarUtils setDrawerLayoutContentId(boolean drawerLayout, int contentId) {\n        mIsDrawerLayout = drawerLayout;\n        mContentResourseIdInDrawer = contentId;\n        return this;\n    }\n\n    public void init() {\n        fullScreen(mActivity);\n        if (mColor != -1) {\n            //设置了状态栏颜色\n            addStatusViewWithColor(mActivity, mColor);\n        }\n        if (mDrawable != null) {\n            //设置了状态栏 drawble，例如渐变色\n            addStatusViewWithDrawble(mActivity, mDrawable);\n        }\n        if (isDrawerLayout()) {\n            //未设置 fitsSystemWindows 且是侧滑菜单，需要设置 fitsSystemWindows 以解决 4.4 上侧滑菜单上方白条问题\n            fitsSystemWindows(mActivity);\n        }\n        if (isActionBar()) {\n            //要增加内容视图的 paddingTop,否则内容被 ActionBar 遮盖\n            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {\n                ViewGroup rootView = (ViewGroup) mActivity.getWindow().getDecorView().findViewById(android.R.id.content);\n                rootView.setPadding(0, getStatusBarHeight(mActivity) + getActionBarHeight(mActivity), 0, 0);\n            }\n        }\n    }\n\n    /**\n     * 去除 ActionBar 阴影\n     */\n    public StatusBarUtils clearActionBarShadow() {\n        if (Build.VERSION.SDK_INT >= 21) {\n            ActionBar supportActionBar = ((AppCompatActivity) mActivity).getSupportActionBar();\n            if (supportActionBar != null) {\n                supportActionBar.setElevation(0);\n            }\n        }\n        return this;\n    }\n\n    /**\n     * 设置页面最外层布局 FitsSystemWindows 属性\n     *\n     * @param activity\n     */\n    private void fitsSystemWindows(Activity activity) {\n        ViewGroup contentFrameLayout = (ViewGroup) activity.findViewById(android.R.id.content);\n        View parentView = contentFrameLayout.getChildAt(0);\n        if (parentView != null && Build.VERSION.SDK_INT >= 14) {\n            parentView.setFitsSystemWindows(true);\n            //布局预留状态栏高度的 padding\n            if (parentView instanceof DrawerLayout) {\n                DrawerLayout drawer = (DrawerLayout) parentView;\n                //将主页面顶部延伸至status bar;虽默认为false,但经测试,DrawerLayout需显示设置\n                drawer.setClipToPadding(false);\n            }\n        }\n    }\n\n    /**\n     * 利用反射获取状态栏高度\n     *\n     * @return\n     */\n    public static int getStatusBarHeight(Activity activity) {\n        int result = 0;\n        //获取状态栏高度的资源id\n        int resourceId = activity.getResources().getIdentifier(\"status_bar_height\", \"dimen\", \"android\");\n        if (resourceId > 0) {\n            result = activity.getResources().getDimensionPixelSize(resourceId);\n        }\n        Log.e(\"getStatusBarHeight\", result + \"\");\n        return result;\n    }\n\n    /**\n     * 获得 ActionBar 的高度\n     *\n     * @param context\n     * @return\n     */\n    public static int getActionBarHeight(Context context) {\n        int result = 0;\n        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) {\n            TypedValue tv = new TypedValue();\n            context.getTheme().resolveAttribute(android.R.attr.actionBarSize, tv, true);\n            result = TypedValue.complexToDimensionPixelSize(tv.data, context.getResources().getDisplayMetrics());\n        }\n        return result;\n    }\n\n    /**\n     * 添加状态栏占位视图\n     *\n     * @param activity\n     */\n    private void addStatusViewWithColor(Activity activity, int color) {\n        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {\n            if (isDrawerLayout()) {\n                //要在内容布局增加状态栏，否则会盖在侧滑菜单上\n                ViewGroup rootView = (ViewGroup) activity.findViewById(android.R.id.content);\n                //DrawerLayout 则需要在第一个子视图即内容试图中添加padding\n                View parentView = rootView.getChildAt(0);\n                LinearLayout linearLayout = new LinearLayout(activity);\n                linearLayout.setOrientation(LinearLayout.VERTICAL);\n                View statusBarView = new View(activity);\n                ViewGroup.LayoutParams lp = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,\n                        getStatusBarHeight(activity));\n                statusBarView.setBackgroundColor(color);\n                //添加占位状态栏到线性布局中\n                linearLayout.addView(statusBarView, lp);\n                //侧滑菜单\n                DrawerLayout drawer = (DrawerLayout) parentView;\n                //内容视图\n                View content = activity.findViewById(mContentResourseIdInDrawer);\n                //将内容视图从 DrawerLayout 中移除\n                drawer.removeView(content);\n                //添加内容视图\n                linearLayout.addView(content, content.getLayoutParams());\n                //将带有占位状态栏的新的内容视图设置给 DrawerLayout\n                drawer.addView(linearLayout, 0);\n            } else {\n                //设置 paddingTop\n                ViewGroup rootView = (ViewGroup) mActivity.getWindow().getDecorView().findViewById(android.R.id.content);\n                rootView.setPadding(0, getStatusBarHeight(mActivity), 0, 0);\n                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {\n                    //直接设置状态栏颜色\n                    activity.getWindow().setStatusBarColor(color);\n                } else {\n                    //增加占位状态栏\n                    ViewGroup decorView = (ViewGroup) mActivity.getWindow().getDecorView();\n                    View statusBarView = new View(activity);\n                    ViewGroup.LayoutParams lp = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,\n                            getStatusBarHeight(activity));\n                    statusBarView.setBackgroundColor(color);\n                    decorView.addView(statusBarView, lp);\n                }\n            }\n        }\n    }\n\n    /**\n     * 添加状态栏占位视图\n     *\n     * @param activity\n     */\n    private void addStatusViewWithDrawble(Activity activity, Drawable drawable) {\n        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {\n            //占位状态栏\n            View statusBarView = new View(activity);\n            ViewGroup.LayoutParams lp = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,\n                    getStatusBarHeight(activity));\n            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {\n                statusBarView.setBackground(drawable);\n            } else {\n                statusBarView.setBackgroundDrawable(drawable);\n            }\n            if (isDrawerLayout()) {\n                //要在内容布局增加状态栏，否则会盖在侧滑菜单上\n                ViewGroup rootView = (ViewGroup) activity.findViewById(android.R.id.content);\n                //DrawerLayout 则需要在第一个子视图即内容试图中添加padding\n                View parentView = rootView.getChildAt(0);\n                LinearLayout linearLayout = new LinearLayout(activity);\n                linearLayout.setOrientation(LinearLayout.VERTICAL);\n                //添加占位状态栏到线性布局中\n                linearLayout.addView(statusBarView, lp);\n                //侧滑菜单\n                DrawerLayout drawer = (DrawerLayout) parentView;\n                //内容视图\n                View content = activity.findViewById(mContentResourseIdInDrawer);\n                //将内容视图从 DrawerLayout 中移除\n                drawer.removeView(content);\n                //添加内容视图\n                linearLayout.addView(content, content.getLayoutParams());\n                //将带有占位状态栏的新的内容视图设置给 DrawerLayout\n                drawer.addView(linearLayout, 0);\n            } else {\n                //增加占位状态栏，并增加状态栏高度的 paddingTop\n                ViewGroup decorView = (ViewGroup) mActivity.getWindow().getDecorView();\n                decorView.addView(statusBarView, lp);\n                //设置 paddingTop\n                ViewGroup rootView = (ViewGroup) mActivity.getWindow().getDecorView().findViewById(android.R.id.content);\n                rootView.setPadding(0, getStatusBarHeight(mActivity), 0, 0);\n            }\n        }\n    }\n\n    /**\n     * 通过设置全屏，设置状态栏透明\n     *\n     * @param activity\n     */\n    private void fullScreen(Activity activity) {\n        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {\n            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {\n                //5.x开始需要把颜色设置透明，否则导航栏会呈现系统默认的浅灰色\n                Window window = activity.getWindow();\n                View decorView = window.getDecorView();\n                //两个 flag 要结合使用，表示让应用的主体内容占用系统状态栏的空间\n                int option = View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN\n                        | View.SYSTEM_UI_FLAG_LAYOUT_STABLE;\n                window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);\n                decorView.setSystemUiVisibility(option);\n                window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);\n                window.setStatusBarColor(Color.TRANSPARENT);\n                //导航栏颜色也可以正常设置\n//                window.setNavigationBarColor(Color.TRANSPARENT);\n            } else {\n                Window window = activity.getWindow();\n                WindowManager.LayoutParams attributes = window.getAttributes();\n                int flagTranslucentStatus = WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS;\n                int flagTranslucentNavigation = WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION;\n                attributes.flags |= flagTranslucentStatus;\n//                attributes.flags |= flagTranslucentNavigation;\n                window.setAttributes(attributes);\n            }\n        }\n    }\n\n    /**\n     * 通过设置全屏，设置状态栏透明 导航栏黑色\n     *\n     * @param activity\n     */\n    public static void setStatusTransparent(Activity activity) {\n        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {\n            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {\n                Window window = activity.getWindow();\n\n                WindowManager.LayoutParams attributes = window.getAttributes();\n                int flagTranslucentStatus = WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS;\n                int flagTranslucentNavigation = WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION;\n//                attributes.flags |= flagTranslucentStatus;\n                attributes.flags |= flagTranslucentNavigation;\n                window.setAttributes(attributes);\n\n                window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN\n                        | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION\n                        | View.SYSTEM_UI_FLAG_LAYOUT_STABLE);\n                window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);\n                window.setStatusBarColor(Color.TRANSPARENT);\n                window.setNavigationBarColor(Color.TRANSPARENT);\n            } else {\n                Window window = activity.getWindow();\n                WindowManager.LayoutParams attributes = window.getAttributes();\n                int flagTranslucentStatus = WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS;\n                int flagTranslucentNavigation = WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION;\n                attributes.flags |= flagTranslucentStatus;\n                attributes.flags |= flagTranslucentNavigation;\n                window.setAttributes(attributes);\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "lib_common/src/main/java/com/senon/lib_common/utils/ToastUtil.java",
    "content": "package com.senon.lib_common.utils;\n\nimport android.app.Activity;\nimport android.content.Context;\nimport android.os.Handler;\nimport android.os.Looper;\nimport android.support.annotation.NonNull;\nimport android.support.v4.app.FragmentActivity;\nimport android.view.Gravity;\nimport android.view.LayoutInflater;\nimport android.view.View;\nimport android.widget.TextView;\nimport android.widget.Toast;\nimport com.senon.lib_common.R;\n\n\n/**\n * Toast工具类\n */\npublic class ToastUtil {\n\n    /**\n     * 可以在多线程里运行的toast\n     */\n    private static volatile Toast mToast;\n    private static final Object lock = new Object();\n    private static Context context;\n    private static TextView toastTv;\n\n    public static void init(Context con){\n        context = con;\n    }\n\n    public static void initToast(String msg) {\n        initToast(msg, context, true);\n    }\n\n    public static void initToast(int resId, Context context) {\n        if (context instanceof Activity || context instanceof FragmentActivity)\n            context = context.getApplicationContext();\n        initToast(context.getString(resId), context, true);\n    }\n\n    public static void initToast(String msg, Context context, boolean isSingleton) {\n        if (context instanceof Activity || context instanceof FragmentActivity)\n            context = context.getApplicationContext();\n        if (mToast != null && isSingleton) {\n            toastTv.setText(msg);\n        } else {\n            synchronized (lock) {\n//                mToast = Toast.makeText(context, msg, Toast.LENGTH_SHORT);\n                mToast = showToast(context,msg,Toast.LENGTH_SHORT);\n            }\n        }\n        mToast.setGravity(Gravity.CENTER, 0, 0);//默认显示位置\n        mToast.show();\n    }\n    //可以设置toast的位置\n    public static void setGravity(int gravity, int xOffset, int yOffset) {\n        mToast.setGravity(gravity, xOffset, yOffset);\n    }\n    //可以自定义toast的view\n    public void setView(View view) {\n        mToast.setView(view);\n    }\n\n\n    /**\n      当你在线程中使用toast时，请使用这个方法(可以控制显示多长时间)\n    */\n    public static void showInThread(@NonNull final Context context, final String msg, final int length) {\n        new Thread() {\n            @Override\n            public void run() {\n                Looper.prepare();//先移除\n                Toast.makeText(context, msg, length).show();\n                Looper.loop();// 进入loop中的循环，查看消息队列\n            }\n        }.start();\n    }\n\n    /**\n     * 以下全部代码为一个整体，可以控制显示时间的Toast\n     */\n    private static Handler mHandler = null;\n    private static int duration = 0;\n    private static int currDuration = 0;\n    private static final int DEFAULT = 2000;\n\n    public static void showByDuration(Context context, String msg, int duration) {\n        duration = duration;\n        currDuration = DEFAULT;\n//        mToast = Toast.makeText(context, msg, Toast.LENGTH_LONG);\n        mToast = showToast(context,msg,Toast.LENGTH_LONG);\n        mHandler = new Handler(context.getMainLooper());\n        mHandler.post(mToastThread);\n    }\n\n    private static Runnable mToastThread = new Runnable() {\n        public void run() {\n            mToast.show();\n            mHandler.postDelayed(mToastThread, DEFAULT);// 每隔2秒显示一次\n            if (duration != 0) {\n                if (currDuration <= duration) {\n                    currDuration += DEFAULT;\n                } else {\n                    cancel();\n                }\n            }\n        }\n    };\n\n    private static void cancel() {\n        mHandler.removeCallbacks(mToastThread);// 先把显示线程删除\n        mToast.cancel();// 把最后一个线程的显示效果cancel掉，就一了百了了\n        currDuration = DEFAULT;\n    }\n\n\n    private static Toast showToast(Context context, String msg, int duration) {\n        if (null != context) {\n            if (mToast == null) {\n                mToast = new Toast(context);\n                LayoutInflater inflater = LayoutInflater.from(context);\n                View layout = inflater.inflate(R.layout.toast_layout, null);\n                toastTv = layout.findViewById(R.id.message);\n                toastTv.setText(msg);\n                mToast.setDuration(duration);\n                mToast.setView(layout);\n            }else {\n                toastTv.setText(msg);\n            }\n        }\n        return mToast;\n    }\n\n}\n"
  },
  {
    "path": "lib_common/src/main/res/drawable/register_border.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<shape xmlns:android=\"http://schemas.android.com/apk/res/android\" >\n\n    <!-- view背景色 -->\n    <solid android:color=\"#40ffffff\" />\n    <!-- 边框圆角 -->\n    <corners\n        android:radius=\"@dimen/mm60\" />\n\n</shape>"
  },
  {
    "path": "lib_common/src/main/res/drawable/register_border_2.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<shape xmlns:android=\"http://schemas.android.com/apk/res/android\" >\n\n    <!-- view背景色 -->\n    <solid android:color=\"#ffffff\" />\n    <!-- 边框圆角 -->\n    <corners\n        android:radius=\"@dimen/mm60\" />\n\n</shape>"
  },
  {
    "path": "lib_common/src/main/res/drawable/register_border_9.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<shape xmlns:android=\"http://schemas.android.com/apk/res/android\" >\n\n    <!-- view背景色 -->\n    <solid android:color=\"@color/subscribe_item_selected_stroke\" />\n    <!-- 边框圆角 -->\n    <corners\n        android:radius=\"@dimen/mm60\" />\n\n</shape>"
  },
  {
    "path": "lib_common/src/main/res/drawable/shape_gradient.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<shape xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <gradient\n        android:angle=\"135\"\n        android:endColor=\"#FF8519\"\n        android:startColor=\"#FF8519\" />\n\n</shape>"
  },
  {
    "path": "lib_common/src/main/res/drawable/style_progress_bar.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<layer-list xmlns:android=\"http://schemas.android.com/apk/res/android\" >\n\n    <!-- 背景  gradient是渐变,corners定义的是圆角 -->\n    <item android:id=\"@android:id/background\">\n        <shape>\n            <!--<corners android:radius=\"10dp\" />-->\n\n            <solid android:color=\"@color/split\" />\n        </shape>\n    </item>\n    <!-- 第二条进度条颜色 -->\n    <item android:id=\"@android:id/secondaryProgress\">\n        <clip>\n            <shape>\n                <corners android:radius=\"10dip\" />\n\n                <gradient\n                    android:angle=\"90.0\"\n                    android:centerColor=\"#ac6079\"\n                    android:centerY=\"0.45\"\n                    android:endColor=\"#6c213a\"\n                    android:startColor=\"#e71a5e\" />\n            </shape>\n        </clip>\n    </item>\n    <!-- 进度条 -->\n    <item android:id=\"@android:id/progress\">\n        <clip>\n            <shape>\n                <!--<corners android:radius=\"10dip\" />-->\n\n                <solid android:color=\"@color/colorblue\" />\n            </shape>\n        </clip>\n    </item>\n\n</layer-list>"
  },
  {
    "path": "lib_common/src/main/res/drawable/toast_shape.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<shape xmlns:android=\"http://schemas.android.com/apk/res/android\">\n\n    <corners android:radius=\"@dimen/mm40\"/>\n    <solid android:color=\"#666666\"/>\n</shape>"
  },
  {
    "path": "lib_common/src/main/res/layout/activity_common__login.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:id=\"@+id/activity_login\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    android:background=\"@drawable/login_bg\"\n    android:orientation=\"vertical\">\n\n    <RelativeLayout\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        android:orientation=\"vertical\">\n\n        <ImageView\n            android:scaleType=\"centerCrop\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"match_parent\"\n            android:layout_centerHorizontal=\"true\"\n            android:src=\"@mipmap/splash_bg\" />\n\n        <ImageView\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"match_parent\"\n            android:alpha=\"0.5\"\n            android:background=\"#88000000\" />\n\n        <TextView\n            android:onClick=\"onClick\"\n            android:id=\"@+id/visitor_tv\"\n            android:layout_alignParentRight=\"true\"\n            android:textStyle=\"\"\n            android:layout_marginRight=\"@dimen/mm85\"\n            android:layout_marginTop=\"@dimen/mm85\"\n            android:textColor=\"@color/common_white\"\n            android:textSize=\"@dimen/mm30\"\n            android:text=\"游客登录\"\n            android:padding=\"@dimen/mm5\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\" />\n\n        <LinearLayout\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:layout_marginTop=\"@dimen/mm527\"\n            android:orientation=\"vertical\">\n\n            <RelativeLayout\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"@dimen/mm90\"\n                android:layout_marginLeft=\"@dimen/mm85\"\n                android:layout_marginRight=\"@dimen/mm85\"\n                android:background=\"@drawable/register_border\">\n\n                <ImageView\n                    android:layout_width=\"@dimen/mm30\"\n                    android:layout_height=\"@dimen/mm48\"\n                    android:layout_alignParentLeft=\"true\"\n                    android:layout_alignParentStart=\"true\"\n                    android:layout_centerVertical=\"true\"\n                    android:layout_marginLeft=\"@dimen/mm60\"\n                    android:src=\"@drawable/login_phone\" />\n\n                <EditText\n                    android:text=\"12341234\"\n                    android:maxLength=\"18\"\n                    android:digits=\"0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ@!$#%^*_-.\"\n                    android:id=\"@+id/account_edt\"\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"@dimen/mm90\"\n                    android:background=\"@drawable/register_bg_border_1\"\n                    android:hint=\"请输入账号\"\n                    android:paddingLeft=\"@dimen/mm119\"\n                    android:textColor=\"@color/common_white\"\n                    android:textColorHint=\"@color/common_white\"\n                    android:textSize=\"@dimen/mm32\" />\n            </RelativeLayout>\n\n            <RelativeLayout\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"@dimen/mm90\"\n                android:layout_marginLeft=\"@dimen/mm85\"\n                android:layout_marginRight=\"@dimen/mm85\"\n                android:layout_marginTop=\"@dimen/mm36\"\n                android:background=\"@drawable/register_border\">\n\n                <ImageView\n                    android:layout_width=\"@dimen/mm30\"\n                    android:layout_height=\"@dimen/mm48\"\n                    android:layout_alignParentLeft=\"true\"\n                    android:layout_alignParentStart=\"true\"\n                    android:layout_centerVertical=\"true\"\n                    android:layout_marginLeft=\"@dimen/mm60\"\n                    android:src=\"@drawable/login_password\" />\n\n                <EditText\n                    android:text=\"123456\"\n                    android:maxLength=\"18\"\n                    android:digits=\"0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ@!$#%^*_-.\"\n                    android:id=\"@+id/password_edt\"\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"@dimen/mm90\"\n                    android:background=\"@drawable/register_bg_border_1\"\n                    android:hint=\"请输入密码\"\n                    android:paddingLeft=\"@dimen/mm119\"\n                    android:password=\"true\"\n                    android:textColor=\"@color/common_white\"\n                    android:textColorHint=\"@color/common_white\"\n                    android:textSize=\"@dimen/mm32\" />\n            </RelativeLayout>\n\n            <Button\n                android:layout_marginLeft=\"@dimen/mm85\"\n                android:layout_marginRight=\"@dimen/mm85\"\n                android:layout_marginTop=\"@dimen/mm36\"\n                android:onClick=\"onClick\"\n                android:id=\"@+id/login_btn\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"@dimen/mm90\"\n                android:background=\"@drawable/register_border_2\"\n                android:text=\"登录\"\n                android:textColor=\"@color/login_btn_text\"\n                android:textSize=\"@dimen/mm36\" />\n\n            <TextView\n                android:onClick=\"onClick\"\n                android:id=\"@+id/register_tv\"\n                android:layout_marginRight=\"@dimen/mm85\"\n                android:layout_marginTop=\"@dimen/mm40\"\n                android:layout_gravity=\"right\"\n                android:textColor=\"@color/common_white\"\n                android:textSize=\"@dimen/mm30\"\n                android:text=\"还没有账号？去注册！\"\n                android:padding=\"@dimen/mm5\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\" />\n\n        </LinearLayout>\n\n    </RelativeLayout>\n\n</LinearLayout>\n"
  },
  {
    "path": "lib_common/src/main/res/layout/activity_common__register.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:id=\"@+id/activity_login\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    android:background=\"@drawable/login_bg\"\n    android:orientation=\"vertical\">\n\n    <RelativeLayout\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        android:orientation=\"vertical\">\n\n        <ImageView\n            android:scaleType=\"centerCrop\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"match_parent\"\n            android:layout_centerHorizontal=\"true\"\n            android:src=\"@mipmap/splash_bg\" />\n\n        <ImageView\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"match_parent\"\n            android:alpha=\"0.5\"\n            android:background=\"#88000000\" />\n\n        <LinearLayout\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:layout_marginTop=\"@dimen/mm527\"\n            android:orientation=\"vertical\">\n\n            <RelativeLayout\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"@dimen/mm90\"\n                android:layout_marginLeft=\"@dimen/mm85\"\n                android:layout_marginRight=\"@dimen/mm85\"\n                android:background=\"@drawable/register_border\">\n\n                <ImageView\n                    android:layout_width=\"@dimen/mm30\"\n                    android:layout_height=\"@dimen/mm48\"\n                    android:layout_alignParentLeft=\"true\"\n                    android:layout_alignParentStart=\"true\"\n                    android:layout_centerVertical=\"true\"\n                    android:layout_marginLeft=\"@dimen/mm60\"\n                    android:src=\"@drawable/login_phone\" />\n\n                <EditText\n                    android:text=\"\"\n                    android:maxLength=\"18\"\n                    android:digits=\"0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ@!$#%^*_-.\"\n                    android:id=\"@+id/account_edt\"\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"@dimen/mm90\"\n                    android:background=\"@drawable/register_bg_border_1\"\n                    android:hint=\"请输入账号\"\n                    android:paddingLeft=\"@dimen/mm119\"\n                    android:textColor=\"@color/common_white\"\n                    android:textColorHint=\"@color/common_white\"\n                    android:textSize=\"@dimen/mm32\" />\n            </RelativeLayout>\n\n            <RelativeLayout\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"@dimen/mm90\"\n                android:layout_marginLeft=\"@dimen/mm85\"\n                android:layout_marginRight=\"@dimen/mm85\"\n                android:layout_marginTop=\"@dimen/mm36\"\n                android:background=\"@drawable/register_border\">\n\n                <ImageView\n                    android:layout_width=\"@dimen/mm30\"\n                    android:layout_height=\"@dimen/mm48\"\n                    android:layout_alignParentLeft=\"true\"\n                    android:layout_alignParentStart=\"true\"\n                    android:layout_centerVertical=\"true\"\n                    android:layout_marginLeft=\"@dimen/mm60\"\n                    android:src=\"@drawable/login_password\" />\n\n                <EditText\n                    android:text=\"\"\n                    android:maxLength=\"18\"\n                    android:digits=\"0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ@!$#%^*_-.\"\n                    android:id=\"@+id/password_edt\"\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"@dimen/mm90\"\n                    android:background=\"@drawable/register_bg_border_1\"\n                    android:hint=\"请输入密码\"\n                    android:paddingLeft=\"@dimen/mm119\"\n                    android:password=\"true\"\n                    android:textColor=\"@color/common_white\"\n                    android:textColorHint=\"@color/common_white\"\n                    android:textSize=\"@dimen/mm32\" />\n            </RelativeLayout>\n\n            <RelativeLayout\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"@dimen/mm90\"\n                android:layout_marginLeft=\"@dimen/mm85\"\n                android:layout_marginRight=\"@dimen/mm85\"\n                android:layout_marginTop=\"@dimen/mm36\"\n                android:background=\"@drawable/register_border\">\n\n                <ImageView\n                    android:layout_width=\"@dimen/mm30\"\n                    android:layout_height=\"@dimen/mm48\"\n                    android:layout_alignParentLeft=\"true\"\n                    android:layout_alignParentStart=\"true\"\n                    android:layout_centerVertical=\"true\"\n                    android:layout_marginLeft=\"@dimen/mm60\"\n                    android:src=\"@drawable/login_password\" />\n\n                <EditText\n                    android:text=\"\"\n                    android:maxLength=\"18\"\n                    android:digits=\"0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ@!$#%^*_-.\"\n                    android:id=\"@+id/password_re_edt\"\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"@dimen/mm90\"\n                    android:background=\"@drawable/register_bg_border_1\"\n                    android:hint=\"请确认密码\"\n                    android:paddingLeft=\"@dimen/mm119\"\n                    android:password=\"true\"\n                    android:textColor=\"@color/common_white\"\n                    android:textColorHint=\"@color/common_white\"\n                    android:textSize=\"@dimen/mm32\" />\n            </RelativeLayout>\n\n            <Button\n                android:layout_marginLeft=\"@dimen/mm85\"\n                android:layout_marginRight=\"@dimen/mm85\"\n                android:layout_marginTop=\"@dimen/mm36\"\n                android:onClick=\"onClick\"\n                android:id=\"@+id/register_btn\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"@dimen/mm90\"\n                android:background=\"@drawable/register_border_2\"\n                android:text=\"注册\"\n                android:textColor=\"@color/login_btn_text\"\n                android:textSize=\"@dimen/mm36\" />\n            <TextView\n                android:onClick=\"onClick\"\n                android:id=\"@+id/login_tv\"\n                android:layout_marginRight=\"@dimen/mm85\"\n                android:layout_marginTop=\"@dimen/mm40\"\n                android:layout_gravity=\"right\"\n                android:textColor=\"@color/common_white\"\n                android:textSize=\"@dimen/mm30\"\n                android:text=\"已有账号，去登录！\"\n                android:padding=\"@dimen/mm5\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\" />\n        </LinearLayout>\n\n    </RelativeLayout>\n\n</LinearLayout>\n"
  },
  {
    "path": "lib_common/src/main/res/layout/activity_common__webview.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    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    >\n\n    <include\n        android:id=\"@+id/toolbar\"\n        layout=\"@layout/layout_toolbar\"\n        android:layout_height=\"wrap_content\"\n        android:layout_width=\"match_parent\" />\n\n    <WebView\n        android:layout_below=\"@+id/toolbar\"\n        android:id=\"@+id/webView\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"/>\n\n    <ProgressBar\n        android:layout_below=\"@+id/toolbar\"\n        style=\"?android:attr/progressBarStyleHorizontal\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"@dimen/mm4\"\n        android:id=\"@+id/progressBar\"\n        android:progressDrawable=\"@drawable/style_progress_bar\"\n        android:layout_gravity=\"center_horizontal|bottom\" />\n</RelativeLayout>\n"
  },
  {
    "path": "lib_common/src/main/res/layout/layout_fragmhome_tab.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    android:orientation=\"horizontal\">\n\n    <RelativeLayout\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_centerInParent=\"true\">\n\n        <ImageView\n            android:layout_marginTop=\"@dimen/mm8\"\n            android:layout_centerHorizontal=\"true\"\n            android:id=\"@+id/tab_item_igv\"\n            android:layout_width=\"@dimen/mm47\"\n            android:layout_height=\"@dimen/mm47\"\n            android:src=\"@mipmap/ic_tabbar_discoverhl\" />\n\n        <TextView\n            android:layout_centerHorizontal=\"true\"\n            android:id=\"@+id/tab_item_tv\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_below=\"@+id/tab_item_igv\"\n            android:text=\"标题\"\n            android:textSize=\"@dimen/mm22\" />\n    </RelativeLayout>\n\n</RelativeLayout>"
  },
  {
    "path": "lib_common/src/main/res/layout/layout_toolbar.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:layout_width=\"match_parent\"\n    android:background=\"@color/common_white\"\n    android:layout_height=\"match_parent\">\n\n    <RelativeLayout\n        android:layout_marginTop=\"@dimen/mm40\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"@dimen/mm90\">\n        <ImageView\n            android:paddingLeft=\"@dimen/mm10\"\n            android:paddingRight=\"@dimen/mm10\"\n            android:paddingTop=\"@dimen/mm5\"\n            android:paddingBottom=\"@dimen/mm5\"\n            android:layout_marginLeft=\"@dimen/mm20\"\n            android:id=\"@+id/toolbar_back_igv\"\n            android:layout_width=\"@dimen/mm45\"\n            android:layout_height=\"@dimen/mm40\"\n            android:layout_centerVertical=\"true\"\n            android:src=\"@mipmap/back_black\" />\n\n        <TextView\n            android:singleLine=\"true\"\n            android:textColor=\"@color/color_232323\"\n            android:textSize=\"@dimen/mm34\"\n            android:text=\"标题\"\n            android:gravity=\"center\"\n            android:id=\"@+id/toolbar_title_tv\"\n            android:layout_marginLeft=\"@dimen/mm115\"\n            android:layout_width=\"@dimen/mm500\"\n            android:layout_height=\"match_parent\" />\n\n        <TextView\n            android:textSize=\"@dimen/mm30\"\n            android:padding=\"@dimen/mm7\"\n            android:id=\"@+id/collection_tv\"\n            android:layout_alignParentRight=\"true\"\n            android:layout_centerVertical=\"true\"\n            android:layout_marginRight=\"@dimen/mm25\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\" />\n    </RelativeLayout>\n\n\n</RelativeLayout>"
  },
  {
    "path": "lib_common/src/main/res/layout/toast_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=\"match_parent\"\n              android:layout_height=\"match_parent\"\n              android:orientation=\"vertical\"\n              android:background=\"@drawable/toast_shape\">\n\n    <TextView\n        android:paddingRight=\"@dimen/mm40\"\n        android:paddingLeft=\"@dimen/mm40\"\n        android:paddingBottom=\"@dimen/mm20\"\n        android:paddingTop=\"@dimen/mm20\"\n        android:text=\"toast\"\n        android:id=\"@+id/message\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_weight=\"1\"\n        android:layout_gravity=\"center_horizontal\"\n        android:textColor=\"#fff\"\n        android:textSize=\"@dimen/mm30\"\n        android:shadowColor=\"#BB000000\"\n        android:shadowRadius=\"2.75\"\n        />\n\n</LinearLayout>"
  },
  {
    "path": "lib_common/src/main/res/values/colors.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <color name=\"colorPrimary\">#3F51B5</color>\n    <color name=\"colorPrimaryDark\">#303F9F</color>\n    <color name=\"colorAccent\">#FF4081</color>\n    <color name=\"blue_2bbbe6\">#2BBBE6</color>\n    <color name=\"transparent_bg\">#00ffffff</color>\n\n    <!--深黑-->\n    <color name=\"deep_black\">#282828</color>\n    <!--浅黑-->\n    <color name=\"shallow_black\">#666666</color>\n    <color name=\"common_white\">#FFFFFF</color>\n    <color name=\"login_btn_text\">#FF7219</color>\n    <color name=\"transport\">#80000000</color>\n    <color name=\"transport_2\">#99000000</color>\n    <color name=\"transport_3\">#dd000000</color>\n    <color name=\"black\">#ff000000</color>\n\n    <color name=\"line_color\">#BDBDBD</color>\n    <color name=\"line_bg_color\">#F0F0F0</color>\n    <color name=\"split\">#cccccc</color>\n    <color name=\"split_d\">#dddddd</color>\n    <color name=\"dark\">#5e5656</color>\n    <color name=\"group_divide_bg\">#f2f2f2</color>\n\n\n    <color name=\"login_bg_start_1\">#FF8519</color>\n    <color name=\"login_bg_start_2\">#EA5038</color>\n    <color name=\"login_bg_end_1\">#FF8519</color>\n    <color name=\"tablayout_tv_gray\">#999999</color>\n    <color name=\"user_system_tv_gray\">#B3B3B3</color>\n    <color name=\"tablayout_tv\">#FF8519</color>\n    <color name=\"group_tablayout_tv\">#303030</color>\n    <color name=\"shield_tv\">#a53c3c</color>\n    <color name=\"colorblue\">#5e99ff</color>\n    <color name=\"colorBackground\">#f1f0f6</color>\n    <color name=\"colorText\">#9b9b9b</color>\n\n    <!--//下拉刷新测试颜色-->\n    <color name=\"color_blue\">#5f93fb</color>\n    <color name=\"text_gray\">#aeb0b4</color>\n    <color name=\"common_black_777\">#777777</color>\n    <color name=\"common_black_999\">#999999</color>\n    <color name=\"common_black_aaa\">#aaaaaa</color>\n    <color name=\"elegant_bg\">#F5F5F5</color>\n    <color name=\"subscribe_item_selected_stroke\">#ffcc3131</color>\n    <color name=\"color_232323\">#232323</color>\n    <color name=\"group_red_bg\">#EA5038</color>\n    <color name=\"group_bule_bg\">#1086C2</color>\n    <color name=\"common_yellow\">#f9f8f2</color>\n    <color name=\"common_splash\">#e19917</color>\n\n\n\n</resources>\n"
  },
  {
    "path": "lib_common/src/main/res/values/dimens.xml",
    "content": "<resources>\n    <dimen name=\"mm_10\">-10mm</dimen>\n    <dimen name=\"mm_20\">-20mm</dimen>\n    <dimen name=\"mm0.5\">0.5mm</dimen>\n    <dimen name=\"mm1\">1.0mm</dimen>\n    <dimen name=\"mm2\">2.0mm</dimen>\n    <dimen name=\"mm3\">3.0mm</dimen>\n    <dimen name=\"mm4\">4.0mm</dimen>\n    <dimen name=\"mm5\">5.0mm</dimen>\n    <dimen name=\"mm6\">6.0mm</dimen>\n    <dimen name=\"mm7\">7.0mm</dimen>\n    <dimen name=\"mm8\">8.0mm</dimen>\n    <dimen name=\"mm9\">9.0mm</dimen>\n    <dimen name=\"mm10\">10.0mm</dimen>\n    <dimen name=\"mm11\">11.0mm</dimen>\n    <dimen name=\"mm12\">12.0mm</dimen>\n    <dimen name=\"mm13\">13.0mm</dimen>\n    <dimen name=\"mm14\">14.0mm</dimen>\n    <dimen name=\"mm15\">15.0mm</dimen>\n    <dimen name=\"mm16\">16.0mm</dimen>\n    <dimen name=\"mm17\">17.0mm</dimen>\n    <dimen name=\"mm18\">18.0mm</dimen>\n    <dimen name=\"mm19\">19.0mm</dimen>\n    <dimen name=\"mm20\">20.0mm</dimen>\n    <dimen name=\"mm21\">21.0mm</dimen>\n    <dimen name=\"mm22\">22.0mm</dimen>\n    <dimen name=\"mm23\">23.0mm</dimen>\n    <dimen name=\"mm24\">24.0mm</dimen>\n    <dimen name=\"mm25\">25.0mm</dimen>\n    <dimen name=\"mm26\">26.0mm</dimen>\n    <dimen name=\"mm27\">27.0mm</dimen>\n    <dimen name=\"mm28\">28.0mm</dimen>\n    <dimen name=\"mm29\">29.0mm</dimen>\n    <dimen name=\"mm30\">30.0mm</dimen>\n    <dimen name=\"mm31\">31.0mm</dimen>\n    <dimen name=\"mm32\">32.0mm</dimen>\n    <dimen name=\"mm33\">33.0mm</dimen>\n    <dimen name=\"mm34\">34.0mm</dimen>\n    <dimen name=\"mm35\">35.0mm</dimen>\n    <dimen name=\"mm36\">36.0mm</dimen>\n    <dimen name=\"mm37\">37.0mm</dimen>\n    <dimen name=\"mm38\">38.0mm</dimen>\n    <dimen name=\"mm39\">39.0mm</dimen>\n    <dimen name=\"mm40\">40.0mm</dimen>\n    <dimen name=\"mm41\">41.0mm</dimen>\n    <dimen name=\"mm42\">42.0mm</dimen>\n    <dimen name=\"mm43\">43.0mm</dimen>\n    <dimen name=\"mm44\">44.0mm</dimen>\n    <dimen name=\"mm45\">45.0mm</dimen>\n    <dimen name=\"mm46\">46.0mm</dimen>\n    <dimen name=\"mm47\">47.0mm</dimen>\n    <dimen name=\"mm48\">48.0mm</dimen>\n    <dimen name=\"mm49\">49.0mm</dimen>\n    <dimen name=\"mm50\">50.0mm</dimen>\n    <dimen name=\"mm51\">51.0mm</dimen>\n    <dimen name=\"mm52\">52.0mm</dimen>\n    <dimen name=\"mm53\">53.0mm</dimen>\n    <dimen name=\"mm54\">54.0mm</dimen>\n    <dimen name=\"mm55\">55.0mm</dimen>\n    <dimen name=\"mm56\">56.0mm</dimen>\n    <dimen name=\"mm57\">57.0mm</dimen>\n    <dimen name=\"mm58\">58.0mm</dimen>\n    <dimen name=\"mm59\">59.0mm</dimen>\n    <dimen name=\"mm60\">60.0mm</dimen>\n    <dimen name=\"mm61\">61.0mm</dimen>\n    <dimen name=\"mm62\">62.0mm</dimen>\n    <dimen name=\"mm63\">63.0mm</dimen>\n    <dimen name=\"mm64\">64.0mm</dimen>\n    <dimen name=\"mm65\">65.0mm</dimen>\n    <dimen name=\"mm66\">66.0mm</dimen>\n    <dimen name=\"mm67\">67.0mm</dimen>\n    <dimen name=\"mm68\">68.0mm</dimen>\n    <dimen name=\"mm69\">69.0mm</dimen>\n    <dimen name=\"mm70\">70.0mm</dimen>\n    <dimen name=\"mm71\">71.0mm</dimen>\n    <dimen name=\"mm72\">72.0mm</dimen>\n    <dimen name=\"mm73\">73.0mm</dimen>\n    <dimen name=\"mm74\">74.0mm</dimen>\n    <dimen name=\"mm75\">75.0mm</dimen>\n    <dimen name=\"mm76\">76.0mm</dimen>\n    <dimen name=\"mm77\">77.0mm</dimen>\n    <dimen name=\"mm78\">78.0mm</dimen>\n    <dimen name=\"mm79\">79.0mm</dimen>\n    <dimen name=\"mm80\">80.0mm</dimen>\n    <dimen name=\"mm81\">81.0mm</dimen>\n    <dimen name=\"mm82\">82.0mm</dimen>\n    <dimen name=\"mm83\">83.0mm</dimen>\n    <dimen name=\"mm84\">84.0mm</dimen>\n    <dimen name=\"mm85\">85.0mm</dimen>\n    <dimen name=\"mm86\">86.0mm</dimen>\n    <dimen name=\"mm87\">87.0mm</dimen>\n    <dimen name=\"mm88\">88.0mm</dimen>\n    <dimen name=\"mm89\">89.0mm</dimen>\n    <dimen name=\"mm90\">90.0mm</dimen>\n    <dimen name=\"mm91\">91.0mm</dimen>\n    <dimen name=\"mm92\">92.0mm</dimen>\n    <dimen name=\"mm93\">93.0mm</dimen>\n    <dimen name=\"mm94\">94.0mm</dimen>\n    <dimen name=\"mm95\">95.0mm</dimen>\n    <dimen name=\"mm96\">96.0mm</dimen>\n    <dimen name=\"mm97\">97.0mm</dimen>\n    <dimen name=\"mm98\">98.0mm</dimen>\n    <dimen name=\"mm99\">99.0mm</dimen>\n    <dimen name=\"mm100\">100.0mm</dimen>\n    <dimen name=\"mm101\">101.0mm</dimen>\n    <dimen name=\"mm102\">102.0mm</dimen>\n    <dimen name=\"mm103\">103.0mm</dimen>\n    <dimen name=\"mm104\">104.0mm</dimen>\n    <dimen name=\"mm105\">105.0mm</dimen>\n    <dimen name=\"mm106\">106.0mm</dimen>\n    <dimen name=\"mm107\">107.0mm</dimen>\n    <dimen name=\"mm108\">108.0mm</dimen>\n    <dimen name=\"mm109\">109.0mm</dimen>\n    <dimen name=\"mm110\">110.0mm</dimen>\n    <dimen name=\"mm111\">111.0mm</dimen>\n    <dimen name=\"mm112\">112.0mm</dimen>\n    <dimen name=\"mm113\">113.0mm</dimen>\n    <dimen name=\"mm114\">114.0mm</dimen>\n    <dimen name=\"mm115\">115.0mm</dimen>\n    <dimen name=\"mm116\">116.0mm</dimen>\n    <dimen name=\"mm117\">117.0mm</dimen>\n    <dimen name=\"mm118\">118.0mm</dimen>\n    <dimen name=\"mm119\">119.0mm</dimen>\n    <dimen name=\"mm120\">120.0mm</dimen>\n    <dimen name=\"mm121\">121.0mm</dimen>\n    <dimen name=\"mm122\">122.0mm</dimen>\n    <dimen name=\"mm123\">123.0mm</dimen>\n    <dimen name=\"mm124\">124.0mm</dimen>\n    <dimen name=\"mm125\">125.0mm</dimen>\n    <dimen name=\"mm126\">126.0mm</dimen>\n    <dimen name=\"mm127\">127.0mm</dimen>\n    <dimen name=\"mm128\">128.0mm</dimen>\n    <dimen name=\"mm129\">129.0mm</dimen>\n    <dimen name=\"mm130\">130.0mm</dimen>\n    <dimen name=\"mm131\">131.0mm</dimen>\n    <dimen name=\"mm132\">132.0mm</dimen>\n    <dimen name=\"mm133\">133.0mm</dimen>\n    <dimen name=\"mm134\">134.0mm</dimen>\n    <dimen name=\"mm135\">135.0mm</dimen>\n    <dimen name=\"mm136\">136.0mm</dimen>\n    <dimen name=\"mm137\">137.0mm</dimen>\n    <dimen name=\"mm138\">138.0mm</dimen>\n    <dimen name=\"mm139\">139.0mm</dimen>\n    <dimen name=\"mm140\">140.0mm</dimen>\n    <dimen name=\"mm141\">141.0mm</dimen>\n    <dimen name=\"mm142\">142.0mm</dimen>\n    <dimen name=\"mm143\">143.0mm</dimen>\n    <dimen name=\"mm144\">144.0mm</dimen>\n    <dimen name=\"mm145\">145.0mm</dimen>\n    <dimen name=\"mm146\">146.0mm</dimen>\n    <dimen name=\"mm147\">147.0mm</dimen>\n    <dimen name=\"mm148\">148.0mm</dimen>\n    <dimen name=\"mm149\">149.0mm</dimen>\n    <dimen name=\"mm150\">150.0mm</dimen>\n    <dimen name=\"mm151\">151.0mm</dimen>\n    <dimen name=\"mm152\">152.0mm</dimen>\n    <dimen name=\"mm153\">153.0mm</dimen>\n    <dimen name=\"mm154\">154.0mm</dimen>\n    <dimen name=\"mm155\">155.0mm</dimen>\n    <dimen name=\"mm156\">156.0mm</dimen>\n    <dimen name=\"mm157\">157.0mm</dimen>\n    <dimen name=\"mm158\">158.0mm</dimen>\n    <dimen name=\"mm159\">159.0mm</dimen>\n    <dimen name=\"mm160\">160.0mm</dimen>\n    <dimen name=\"mm161\">161.0mm</dimen>\n    <dimen name=\"mm162\">162.0mm</dimen>\n    <dimen name=\"mm163\">163.0mm</dimen>\n    <dimen name=\"mm164\">164.0mm</dimen>\n    <dimen name=\"mm165\">165.0mm</dimen>\n    <dimen name=\"mm166\">166.0mm</dimen>\n    <dimen name=\"mm167\">167.0mm</dimen>\n    <dimen name=\"mm168\">168.0mm</dimen>\n    <dimen name=\"mm169\">169.0mm</dimen>\n    <dimen name=\"mm170\">170.0mm</dimen>\n    <dimen name=\"mm171\">171.0mm</dimen>\n    <dimen name=\"mm172\">172.0mm</dimen>\n    <dimen name=\"mm173\">173.0mm</dimen>\n    <dimen name=\"mm174\">174.0mm</dimen>\n    <dimen name=\"mm175\">175.0mm</dimen>\n    <dimen name=\"mm176\">176.0mm</dimen>\n    <dimen name=\"mm177\">177.0mm</dimen>\n    <dimen name=\"mm178\">178.0mm</dimen>\n    <dimen name=\"mm179\">179.0mm</dimen>\n    <dimen name=\"mm180\">180.0mm</dimen>\n    <dimen name=\"mm181\">181.0mm</dimen>\n    <dimen name=\"mm182\">182.0mm</dimen>\n    <dimen name=\"mm183\">183.0mm</dimen>\n    <dimen name=\"mm184\">184.0mm</dimen>\n    <dimen name=\"mm185\">185.0mm</dimen>\n    <dimen name=\"mm186\">186.0mm</dimen>\n    <dimen name=\"mm187\">187.0mm</dimen>\n    <dimen name=\"mm188\">188.0mm</dimen>\n    <dimen name=\"mm189\">189.0mm</dimen>\n    <dimen name=\"mm190\">190.0mm</dimen>\n    <dimen name=\"mm191\">191.0mm</dimen>\n    <dimen name=\"mm192\">192.0mm</dimen>\n    <dimen name=\"mm193\">193.0mm</dimen>\n    <dimen name=\"mm194\">194.0mm</dimen>\n    <dimen name=\"mm195\">195.0mm</dimen>\n    <dimen name=\"mm196\">196.0mm</dimen>\n    <dimen name=\"mm197\">197.0mm</dimen>\n    <dimen name=\"mm198\">198.0mm</dimen>\n    <dimen name=\"mm199\">199.0mm</dimen>\n    <dimen name=\"mm200\">200.0mm</dimen>\n    <dimen name=\"mm201\">201.0mm</dimen>\n    <dimen name=\"mm202\">202.0mm</dimen>\n    <dimen name=\"mm203\">203.0mm</dimen>\n    <dimen name=\"mm204\">204.0mm</dimen>\n    <dimen name=\"mm205\">205.0mm</dimen>\n    <dimen name=\"mm206\">206.0mm</dimen>\n    <dimen name=\"mm207\">207.0mm</dimen>\n    <dimen name=\"mm208\">208.0mm</dimen>\n    <dimen name=\"mm209\">209.0mm</dimen>\n    <dimen name=\"mm210\">210.0mm</dimen>\n    <dimen name=\"mm211\">211.0mm</dimen>\n    <dimen name=\"mm212\">212.0mm</dimen>\n    <dimen name=\"mm213\">213.0mm</dimen>\n    <dimen name=\"mm214\">214.0mm</dimen>\n    <dimen name=\"mm215\">215.0mm</dimen>\n    <dimen name=\"mm216\">216.0mm</dimen>\n    <dimen name=\"mm217\">217.0mm</dimen>\n    <dimen name=\"mm218\">218.0mm</dimen>\n    <dimen name=\"mm219\">219.0mm</dimen>\n    <dimen name=\"mm220\">220.0mm</dimen>\n    <dimen name=\"mm221\">221.0mm</dimen>\n    <dimen name=\"mm222\">222.0mm</dimen>\n    <dimen name=\"mm223\">223.0mm</dimen>\n    <dimen name=\"mm224\">224.0mm</dimen>\n    <dimen name=\"mm225\">225.0mm</dimen>\n    <dimen name=\"mm226\">226.0mm</dimen>\n    <dimen name=\"mm227\">227.0mm</dimen>\n    <dimen name=\"mm228\">228.0mm</dimen>\n    <dimen name=\"mm229\">229.0mm</dimen>\n    <dimen name=\"mm230\">230.0mm</dimen>\n    <dimen name=\"mm231\">231.0mm</dimen>\n    <dimen name=\"mm232\">232.0mm</dimen>\n    <dimen name=\"mm233\">233.0mm</dimen>\n    <dimen name=\"mm234\">234.0mm</dimen>\n    <dimen name=\"mm235\">235.0mm</dimen>\n    <dimen name=\"mm236\">236.0mm</dimen>\n    <dimen name=\"mm237\">237.0mm</dimen>\n    <dimen name=\"mm238\">238.0mm</dimen>\n    <dimen name=\"mm239\">239.0mm</dimen>\n    <dimen name=\"mm240\">240.0mm</dimen>\n    <dimen name=\"mm241\">241.0mm</dimen>\n    <dimen name=\"mm242\">242.0mm</dimen>\n    <dimen name=\"mm243\">243.0mm</dimen>\n    <dimen name=\"mm244\">244.0mm</dimen>\n    <dimen name=\"mm245\">245.0mm</dimen>\n    <dimen name=\"mm246\">246.0mm</dimen>\n    <dimen name=\"mm247\">247.0mm</dimen>\n    <dimen name=\"mm248\">248.0mm</dimen>\n    <dimen name=\"mm249\">249.0mm</dimen>\n    <dimen name=\"mm250\">250.0mm</dimen>\n    <dimen name=\"mm251\">251.0mm</dimen>\n    <dimen name=\"mm252\">252.0mm</dimen>\n    <dimen name=\"mm253\">253.0mm</dimen>\n    <dimen name=\"mm254\">254.0mm</dimen>\n    <dimen name=\"mm255\">255.0mm</dimen>\n    <dimen name=\"mm256\">256.0mm</dimen>\n    <dimen name=\"mm257\">257.0mm</dimen>\n    <dimen name=\"mm258\">258.0mm</dimen>\n    <dimen name=\"mm259\">259.0mm</dimen>\n    <dimen name=\"mm260\">260.0mm</dimen>\n    <dimen name=\"mm261\">261.0mm</dimen>\n    <dimen name=\"mm262\">262.0mm</dimen>\n    <dimen name=\"mm263\">263.0mm</dimen>\n    <dimen name=\"mm264\">264.0mm</dimen>\n    <dimen name=\"mm265\">265.0mm</dimen>\n    <dimen name=\"mm266\">266.0mm</dimen>\n    <dimen name=\"mm267\">267.0mm</dimen>\n    <dimen name=\"mm268\">268.0mm</dimen>\n    <dimen name=\"mm269\">269.0mm</dimen>\n    <dimen name=\"mm270\">270.0mm</dimen>\n    <dimen name=\"mm271\">271.0mm</dimen>\n    <dimen name=\"mm272\">272.0mm</dimen>\n    <dimen name=\"mm273\">273.0mm</dimen>\n    <dimen name=\"mm274\">274.0mm</dimen>\n    <dimen name=\"mm275\">275.0mm</dimen>\n    <dimen name=\"mm276\">276.0mm</dimen>\n    <dimen name=\"mm277\">277.0mm</dimen>\n    <dimen name=\"mm278\">278.0mm</dimen>\n    <dimen name=\"mm279\">279.0mm</dimen>\n    <dimen name=\"mm280\">280.0mm</dimen>\n    <dimen name=\"mm281\">281.0mm</dimen>\n    <dimen name=\"mm282\">282.0mm</dimen>\n    <dimen name=\"mm283\">283.0mm</dimen>\n    <dimen name=\"mm284\">284.0mm</dimen>\n    <dimen name=\"mm285\">285.0mm</dimen>\n    <dimen name=\"mm286\">286.0mm</dimen>\n    <dimen name=\"mm287\">287.0mm</dimen>\n    <dimen name=\"mm288\">288.0mm</dimen>\n    <dimen name=\"mm289\">289.0mm</dimen>\n    <dimen name=\"mm290\">290.0mm</dimen>\n    <dimen name=\"mm291\">291.0mm</dimen>\n    <dimen name=\"mm292\">292.0mm</dimen>\n    <dimen name=\"mm293\">293.0mm</dimen>\n    <dimen name=\"mm294\">294.0mm</dimen>\n    <dimen name=\"mm295\">295.0mm</dimen>\n    <dimen name=\"mm296\">296.0mm</dimen>\n    <dimen name=\"mm297\">297.0mm</dimen>\n    <dimen name=\"mm298\">298.0mm</dimen>\n    <dimen name=\"mm299\">299.0mm</dimen>\n    <dimen name=\"mm300\">300.0mm</dimen>\n    <dimen name=\"mm301\">301.0mm</dimen>\n    <dimen name=\"mm302\">302.0mm</dimen>\n    <dimen name=\"mm303\">303.0mm</dimen>\n    <dimen name=\"mm304\">304.0mm</dimen>\n    <dimen name=\"mm305\">305.0mm</dimen>\n    <dimen name=\"mm306\">306.0mm</dimen>\n    <dimen name=\"mm307\">307.0mm</dimen>\n    <dimen name=\"mm308\">308.0mm</dimen>\n    <dimen name=\"mm309\">309.0mm</dimen>\n    <dimen name=\"mm310\">310.0mm</dimen>\n    <dimen name=\"mm311\">311.0mm</dimen>\n    <dimen name=\"mm312\">312.0mm</dimen>\n    <dimen name=\"mm313\">313.0mm</dimen>\n    <dimen name=\"mm314\">314.0mm</dimen>\n    <dimen name=\"mm315\">315.0mm</dimen>\n    <dimen name=\"mm316\">316.0mm</dimen>\n    <dimen name=\"mm317\">317.0mm</dimen>\n    <dimen name=\"mm318\">318.0mm</dimen>\n    <dimen name=\"mm319\">319.0mm</dimen>\n    <dimen name=\"mm320\">320.0mm</dimen>\n    <dimen name=\"mm321\">321.0mm</dimen>\n    <dimen name=\"mm322\">322.0mm</dimen>\n    <dimen name=\"mm323\">323.0mm</dimen>\n    <dimen name=\"mm324\">324.0mm</dimen>\n    <dimen name=\"mm325\">325.0mm</dimen>\n    <dimen name=\"mm326\">326.0mm</dimen>\n    <dimen name=\"mm327\">327.0mm</dimen>\n    <dimen name=\"mm328\">328.0mm</dimen>\n    <dimen name=\"mm329\">329.0mm</dimen>\n    <dimen name=\"mm330\">330.0mm</dimen>\n    <dimen name=\"mm331\">331.0mm</dimen>\n    <dimen name=\"mm332\">332.0mm</dimen>\n    <dimen name=\"mm333\">333.0mm</dimen>\n    <dimen name=\"mm334\">334.0mm</dimen>\n    <dimen name=\"mm335\">335.0mm</dimen>\n    <dimen name=\"mm336\">336.0mm</dimen>\n    <dimen name=\"mm337\">337.0mm</dimen>\n    <dimen name=\"mm338\">338.0mm</dimen>\n    <dimen name=\"mm339\">339.0mm</dimen>\n    <dimen name=\"mm340\">340.0mm</dimen>\n    <dimen name=\"mm341\">341.0mm</dimen>\n    <dimen name=\"mm342\">342.0mm</dimen>\n    <dimen name=\"mm343\">343.0mm</dimen>\n    <dimen name=\"mm344\">344.0mm</dimen>\n    <dimen name=\"mm345\">345.0mm</dimen>\n    <dimen name=\"mm346\">346.0mm</dimen>\n    <dimen name=\"mm347\">347.0mm</dimen>\n    <dimen name=\"mm348\">348.0mm</dimen>\n    <dimen name=\"mm349\">349.0mm</dimen>\n    <dimen name=\"mm350\">350.0mm</dimen>\n    <dimen name=\"mm351\">351.0mm</dimen>\n    <dimen name=\"mm352\">352.0mm</dimen>\n    <dimen name=\"mm353\">353.0mm</dimen>\n    <dimen name=\"mm354\">354.0mm</dimen>\n    <dimen name=\"mm355\">355.0mm</dimen>\n    <dimen name=\"mm356\">356.0mm</dimen>\n    <dimen name=\"mm357\">357.0mm</dimen>\n    <dimen name=\"mm358\">358.0mm</dimen>\n    <dimen name=\"mm359\">359.0mm</dimen>\n    <dimen name=\"mm360\">360.0mm</dimen>\n    <dimen name=\"mm361\">361.0mm</dimen>\n    <dimen name=\"mm362\">362.0mm</dimen>\n    <dimen name=\"mm363\">363.0mm</dimen>\n    <dimen name=\"mm364\">364.0mm</dimen>\n    <dimen name=\"mm365\">365.0mm</dimen>\n    <dimen name=\"mm366\">366.0mm</dimen>\n    <dimen name=\"mm367\">367.0mm</dimen>\n    <dimen name=\"mm368\">368.0mm</dimen>\n    <dimen name=\"mm369\">369.0mm</dimen>\n    <dimen name=\"mm370\">370.0mm</dimen>\n    <dimen name=\"mm371\">371.0mm</dimen>\n    <dimen name=\"mm372\">372.0mm</dimen>\n    <dimen name=\"mm373\">373.0mm</dimen>\n    <dimen name=\"mm374\">374.0mm</dimen>\n    <dimen name=\"mm375\">375.0mm</dimen>\n    <dimen name=\"mm376\">376.0mm</dimen>\n    <dimen name=\"mm377\">377.0mm</dimen>\n    <dimen name=\"mm378\">378.0mm</dimen>\n    <dimen name=\"mm379\">379.0mm</dimen>\n    <dimen name=\"mm380\">380.0mm</dimen>\n    <dimen name=\"mm381\">381.0mm</dimen>\n    <dimen name=\"mm382\">382.0mm</dimen>\n    <dimen name=\"mm383\">383.0mm</dimen>\n    <dimen name=\"mm384\">384.0mm</dimen>\n    <dimen name=\"mm385\">385.0mm</dimen>\n    <dimen name=\"mm386\">386.0mm</dimen>\n    <dimen name=\"mm387\">387.0mm</dimen>\n    <dimen name=\"mm388\">388.0mm</dimen>\n    <dimen name=\"mm389\">389.0mm</dimen>\n    <dimen name=\"mm390\">390.0mm</dimen>\n    <dimen name=\"mm391\">391.0mm</dimen>\n    <dimen name=\"mm392\">392.0mm</dimen>\n    <dimen name=\"mm393\">393.0mm</dimen>\n    <dimen name=\"mm394\">394.0mm</dimen>\n    <dimen name=\"mm395\">395.0mm</dimen>\n    <dimen name=\"mm396\">396.0mm</dimen>\n    <dimen name=\"mm397\">397.0mm</dimen>\n    <dimen name=\"mm398\">398.0mm</dimen>\n    <dimen name=\"mm399\">399.0mm</dimen>\n    <dimen name=\"mm400\">400.0mm</dimen>\n    <dimen name=\"mm401\">401.0mm</dimen>\n    <dimen name=\"mm402\">402.0mm</dimen>\n    <dimen name=\"mm403\">403.0mm</dimen>\n    <dimen name=\"mm404\">404.0mm</dimen>\n    <dimen name=\"mm405\">405.0mm</dimen>\n    <dimen name=\"mm406\">406.0mm</dimen>\n    <dimen name=\"mm407\">407.0mm</dimen>\n    <dimen name=\"mm408\">408.0mm</dimen>\n    <dimen name=\"mm409\">409.0mm</dimen>\n    <dimen name=\"mm410\">410.0mm</dimen>\n    <dimen name=\"mm411\">411.0mm</dimen>\n    <dimen name=\"mm412\">412.0mm</dimen>\n    <dimen name=\"mm413\">413.0mm</dimen>\n    <dimen name=\"mm414\">414.0mm</dimen>\n    <dimen name=\"mm415\">415.0mm</dimen>\n    <dimen name=\"mm416\">416.0mm</dimen>\n    <dimen name=\"mm417\">417.0mm</dimen>\n    <dimen name=\"mm418\">418.0mm</dimen>\n    <dimen name=\"mm419\">419.0mm</dimen>\n    <dimen name=\"mm420\">420.0mm</dimen>\n    <dimen name=\"mm421\">421.0mm</dimen>\n    <dimen name=\"mm422\">422.0mm</dimen>\n    <dimen name=\"mm423\">423.0mm</dimen>\n    <dimen name=\"mm424\">424.0mm</dimen>\n    <dimen name=\"mm425\">425.0mm</dimen>\n    <dimen name=\"mm426\">426.0mm</dimen>\n    <dimen name=\"mm427\">427.0mm</dimen>\n    <dimen name=\"mm428\">428.0mm</dimen>\n    <dimen name=\"mm429\">429.0mm</dimen>\n    <dimen name=\"mm430\">430.0mm</dimen>\n    <dimen name=\"mm431\">431.0mm</dimen>\n    <dimen name=\"mm432\">432.0mm</dimen>\n    <dimen name=\"mm433\">433.0mm</dimen>\n    <dimen name=\"mm434\">434.0mm</dimen>\n    <dimen name=\"mm435\">435.0mm</dimen>\n    <dimen name=\"mm436\">436.0mm</dimen>\n    <dimen name=\"mm437\">437.0mm</dimen>\n    <dimen name=\"mm438\">438.0mm</dimen>\n    <dimen name=\"mm439\">439.0mm</dimen>\n    <dimen name=\"mm440\">440.0mm</dimen>\n    <dimen name=\"mm441\">441.0mm</dimen>\n    <dimen name=\"mm442\">442.0mm</dimen>\n    <dimen name=\"mm443\">443.0mm</dimen>\n    <dimen name=\"mm444\">444.0mm</dimen>\n    <dimen name=\"mm445\">445.0mm</dimen>\n    <dimen name=\"mm446\">446.0mm</dimen>\n    <dimen name=\"mm447\">447.0mm</dimen>\n    <dimen name=\"mm448\">448.0mm</dimen>\n    <dimen name=\"mm449\">449.0mm</dimen>\n    <dimen name=\"mm450\">450.0mm</dimen>\n    <dimen name=\"mm451\">451.0mm</dimen>\n    <dimen name=\"mm452\">452.0mm</dimen>\n    <dimen name=\"mm453\">453.0mm</dimen>\n    <dimen name=\"mm454\">454.0mm</dimen>\n    <dimen name=\"mm455\">455.0mm</dimen>\n    <dimen name=\"mm456\">456.0mm</dimen>\n    <dimen name=\"mm457\">457.0mm</dimen>\n    <dimen name=\"mm458\">458.0mm</dimen>\n    <dimen name=\"mm459\">459.0mm</dimen>\n    <dimen name=\"mm460\">460.0mm</dimen>\n    <dimen name=\"mm461\">461.0mm</dimen>\n    <dimen name=\"mm462\">462.0mm</dimen>\n    <dimen name=\"mm463\">463.0mm</dimen>\n    <dimen name=\"mm464\">464.0mm</dimen>\n    <dimen name=\"mm465\">465.0mm</dimen>\n    <dimen name=\"mm466\">466.0mm</dimen>\n    <dimen name=\"mm467\">467.0mm</dimen>\n    <dimen name=\"mm468\">468.0mm</dimen>\n    <dimen name=\"mm469\">469.0mm</dimen>\n    <dimen name=\"mm470\">470.0mm</dimen>\n    <dimen name=\"mm471\">471.0mm</dimen>\n    <dimen name=\"mm472\">472.0mm</dimen>\n    <dimen name=\"mm473\">473.0mm</dimen>\n    <dimen name=\"mm474\">474.0mm</dimen>\n    <dimen name=\"mm475\">475.0mm</dimen>\n    <dimen name=\"mm476\">476.0mm</dimen>\n    <dimen name=\"mm477\">477.0mm</dimen>\n    <dimen name=\"mm478\">478.0mm</dimen>\n    <dimen name=\"mm479\">479.0mm</dimen>\n    <dimen name=\"mm480\">480.0mm</dimen>\n    <dimen name=\"mm481\">481.0mm</dimen>\n    <dimen name=\"mm482\">482.0mm</dimen>\n    <dimen name=\"mm483\">483.0mm</dimen>\n    <dimen name=\"mm484\">484.0mm</dimen>\n    <dimen name=\"mm485\">485.0mm</dimen>\n    <dimen name=\"mm486\">486.0mm</dimen>\n    <dimen name=\"mm487\">487.0mm</dimen>\n    <dimen name=\"mm488\">488.0mm</dimen>\n    <dimen name=\"mm489\">489.0mm</dimen>\n    <dimen name=\"mm490\">490.0mm</dimen>\n    <dimen name=\"mm491\">491.0mm</dimen>\n    <dimen name=\"mm492\">492.0mm</dimen>\n    <dimen name=\"mm493\">493.0mm</dimen>\n    <dimen name=\"mm494\">494.0mm</dimen>\n    <dimen name=\"mm495\">495.0mm</dimen>\n    <dimen name=\"mm496\">496.0mm</dimen>\n    <dimen name=\"mm497\">497.0mm</dimen>\n    <dimen name=\"mm498\">498.0mm</dimen>\n    <dimen name=\"mm499\">499.0mm</dimen>\n    <dimen name=\"mm500\">500.0mm</dimen>\n    <dimen name=\"mm501\">501.0mm</dimen>\n    <dimen name=\"mm502\">502.0mm</dimen>\n    <dimen name=\"mm503\">503.0mm</dimen>\n    <dimen name=\"mm504\">504.0mm</dimen>\n    <dimen name=\"mm505\">505.0mm</dimen>\n    <dimen name=\"mm506\">506.0mm</dimen>\n    <dimen name=\"mm507\">507.0mm</dimen>\n    <dimen name=\"mm508\">508.0mm</dimen>\n    <dimen name=\"mm509\">509.0mm</dimen>\n    <dimen name=\"mm510\">510.0mm</dimen>\n    <dimen name=\"mm511\">511.0mm</dimen>\n    <dimen name=\"mm512\">512.0mm</dimen>\n    <dimen name=\"mm513\">513.0mm</dimen>\n    <dimen name=\"mm514\">514.0mm</dimen>\n    <dimen name=\"mm515\">515.0mm</dimen>\n    <dimen name=\"mm516\">516.0mm</dimen>\n    <dimen name=\"mm517\">517.0mm</dimen>\n    <dimen name=\"mm518\">518.0mm</dimen>\n    <dimen name=\"mm519\">519.0mm</dimen>\n    <dimen name=\"mm520\">520.0mm</dimen>\n    <dimen name=\"mm521\">521.0mm</dimen>\n    <dimen name=\"mm522\">522.0mm</dimen>\n    <dimen name=\"mm523\">523.0mm</dimen>\n    <dimen name=\"mm524\">524.0mm</dimen>\n    <dimen name=\"mm525\">525.0mm</dimen>\n    <dimen name=\"mm526\">526.0mm</dimen>\n    <dimen name=\"mm527\">527.0mm</dimen>\n    <dimen name=\"mm528\">528.0mm</dimen>\n    <dimen name=\"mm529\">529.0mm</dimen>\n    <dimen name=\"mm530\">530.0mm</dimen>\n    <dimen name=\"mm531\">531.0mm</dimen>\n    <dimen name=\"mm532\">532.0mm</dimen>\n    <dimen name=\"mm533\">533.0mm</dimen>\n    <dimen name=\"mm534\">534.0mm</dimen>\n    <dimen name=\"mm535\">535.0mm</dimen>\n    <dimen name=\"mm536\">536.0mm</dimen>\n    <dimen name=\"mm537\">537.0mm</dimen>\n    <dimen name=\"mm538\">538.0mm</dimen>\n    <dimen name=\"mm539\">539.0mm</dimen>\n    <dimen name=\"mm540\">540.0mm</dimen>\n    <dimen name=\"mm541\">541.0mm</dimen>\n    <dimen name=\"mm542\">542.0mm</dimen>\n    <dimen name=\"mm543\">543.0mm</dimen>\n    <dimen name=\"mm544\">544.0mm</dimen>\n    <dimen name=\"mm545\">545.0mm</dimen>\n    <dimen name=\"mm546\">546.0mm</dimen>\n    <dimen name=\"mm547\">547.0mm</dimen>\n    <dimen name=\"mm548\">548.0mm</dimen>\n    <dimen name=\"mm549\">549.0mm</dimen>\n    <dimen name=\"mm550\">550.0mm</dimen>\n    <dimen name=\"mm551\">551.0mm</dimen>\n    <dimen name=\"mm552\">552.0mm</dimen>\n    <dimen name=\"mm553\">553.0mm</dimen>\n    <dimen name=\"mm554\">554.0mm</dimen>\n    <dimen name=\"mm555\">555.0mm</dimen>\n    <dimen name=\"mm556\">556.0mm</dimen>\n    <dimen name=\"mm557\">557.0mm</dimen>\n    <dimen name=\"mm558\">558.0mm</dimen>\n    <dimen name=\"mm559\">559.0mm</dimen>\n    <dimen name=\"mm560\">560.0mm</dimen>\n    <dimen name=\"mm561\">561.0mm</dimen>\n    <dimen name=\"mm562\">562.0mm</dimen>\n    <dimen name=\"mm563\">563.0mm</dimen>\n    <dimen name=\"mm564\">564.0mm</dimen>\n    <dimen name=\"mm565\">565.0mm</dimen>\n    <dimen name=\"mm566\">566.0mm</dimen>\n    <dimen name=\"mm567\">567.0mm</dimen>\n    <dimen name=\"mm568\">568.0mm</dimen>\n    <dimen name=\"mm569\">569.0mm</dimen>\n    <dimen name=\"mm570\">570.0mm</dimen>\n    <dimen name=\"mm571\">571.0mm</dimen>\n    <dimen name=\"mm572\">572.0mm</dimen>\n    <dimen name=\"mm573\">573.0mm</dimen>\n    <dimen name=\"mm574\">574.0mm</dimen>\n    <dimen name=\"mm575\">575.0mm</dimen>\n    <dimen name=\"mm576\">576.0mm</dimen>\n    <dimen name=\"mm577\">577.0mm</dimen>\n    <dimen name=\"mm578\">578.0mm</dimen>\n    <dimen name=\"mm579\">579.0mm</dimen>\n    <dimen name=\"mm580\">580.0mm</dimen>\n    <dimen name=\"mm581\">581.0mm</dimen>\n    <dimen name=\"mm582\">582.0mm</dimen>\n    <dimen name=\"mm583\">583.0mm</dimen>\n    <dimen name=\"mm584\">584.0mm</dimen>\n    <dimen name=\"mm585\">585.0mm</dimen>\n    <dimen name=\"mm586\">586.0mm</dimen>\n    <dimen name=\"mm587\">587.0mm</dimen>\n    <dimen name=\"mm588\">588.0mm</dimen>\n    <dimen name=\"mm589\">589.0mm</dimen>\n    <dimen name=\"mm590\">590.0mm</dimen>\n    <dimen name=\"mm591\">591.0mm</dimen>\n    <dimen name=\"mm592\">592.0mm</dimen>\n    <dimen name=\"mm593\">593.0mm</dimen>\n    <dimen name=\"mm594\">594.0mm</dimen>\n    <dimen name=\"mm595\">595.0mm</dimen>\n    <dimen name=\"mm596\">596.0mm</dimen>\n    <dimen name=\"mm597\">597.0mm</dimen>\n    <dimen name=\"mm598\">598.0mm</dimen>\n    <dimen name=\"mm599\">599.0mm</dimen>\n    <dimen name=\"mm600\">600.0mm</dimen>\n    <dimen name=\"mm601\">601.0mm</dimen>\n    <dimen name=\"mm602\">602.0mm</dimen>\n    <dimen name=\"mm603\">603.0mm</dimen>\n    <dimen name=\"mm604\">604.0mm</dimen>\n    <dimen name=\"mm605\">605.0mm</dimen>\n    <dimen name=\"mm606\">606.0mm</dimen>\n    <dimen name=\"mm607\">607.0mm</dimen>\n    <dimen name=\"mm608\">608.0mm</dimen>\n    <dimen name=\"mm609\">609.0mm</dimen>\n    <dimen name=\"mm610\">610.0mm</dimen>\n    <dimen name=\"mm611\">611.0mm</dimen>\n    <dimen name=\"mm612\">612.0mm</dimen>\n    <dimen name=\"mm613\">613.0mm</dimen>\n    <dimen name=\"mm614\">614.0mm</dimen>\n    <dimen name=\"mm615\">615.0mm</dimen>\n    <dimen name=\"mm616\">616.0mm</dimen>\n    <dimen name=\"mm617\">617.0mm</dimen>\n    <dimen name=\"mm618\">618.0mm</dimen>\n    <dimen name=\"mm619\">619.0mm</dimen>\n    <dimen name=\"mm620\">620.0mm</dimen>\n    <dimen name=\"mm621\">621.0mm</dimen>\n    <dimen name=\"mm622\">622.0mm</dimen>\n    <dimen name=\"mm623\">623.0mm</dimen>\n    <dimen name=\"mm624\">624.0mm</dimen>\n    <dimen name=\"mm625\">625.0mm</dimen>\n    <dimen name=\"mm626\">626.0mm</dimen>\n    <dimen name=\"mm627\">627.0mm</dimen>\n    <dimen name=\"mm628\">628.0mm</dimen>\n    <dimen name=\"mm629\">629.0mm</dimen>\n    <dimen name=\"mm630\">630.0mm</dimen>\n    <dimen name=\"mm631\">631.0mm</dimen>\n    <dimen name=\"mm632\">632.0mm</dimen>\n    <dimen name=\"mm633\">633.0mm</dimen>\n    <dimen name=\"mm634\">634.0mm</dimen>\n    <dimen name=\"mm635\">635.0mm</dimen>\n    <dimen name=\"mm636\">636.0mm</dimen>\n    <dimen name=\"mm637\">637.0mm</dimen>\n    <dimen name=\"mm638\">638.0mm</dimen>\n    <dimen name=\"mm639\">639.0mm</dimen>\n    <dimen name=\"mm640\">640.0mm</dimen>\n    <dimen name=\"mm641\">641.0mm</dimen>\n    <dimen name=\"mm642\">642.0mm</dimen>\n    <dimen name=\"mm643\">643.0mm</dimen>\n    <dimen name=\"mm644\">644.0mm</dimen>\n    <dimen name=\"mm645\">645.0mm</dimen>\n    <dimen name=\"mm646\">646.0mm</dimen>\n    <dimen name=\"mm647\">647.0mm</dimen>\n    <dimen name=\"mm648\">648.0mm</dimen>\n    <dimen name=\"mm649\">649.0mm</dimen>\n    <dimen name=\"mm650\">650.0mm</dimen>\n    <dimen name=\"mm651\">651.0mm</dimen>\n    <dimen name=\"mm652\">652.0mm</dimen>\n    <dimen name=\"mm653\">653.0mm</dimen>\n    <dimen name=\"mm654\">654.0mm</dimen>\n    <dimen name=\"mm655\">655.0mm</dimen>\n    <dimen name=\"mm656\">656.0mm</dimen>\n    <dimen name=\"mm657\">657.0mm</dimen>\n    <dimen name=\"mm658\">658.0mm</dimen>\n    <dimen name=\"mm659\">659.0mm</dimen>\n    <dimen name=\"mm660\">660.0mm</dimen>\n    <dimen name=\"mm661\">661.0mm</dimen>\n    <dimen name=\"mm662\">662.0mm</dimen>\n    <dimen name=\"mm663\">663.0mm</dimen>\n    <dimen name=\"mm664\">664.0mm</dimen>\n    <dimen name=\"mm665\">665.0mm</dimen>\n    <dimen name=\"mm666\">666.0mm</dimen>\n    <dimen name=\"mm667\">667.0mm</dimen>\n    <dimen name=\"mm668\">668.0mm</dimen>\n    <dimen name=\"mm669\">669.0mm</dimen>\n    <dimen name=\"mm670\">670.0mm</dimen>\n    <dimen name=\"mm671\">671.0mm</dimen>\n    <dimen name=\"mm672\">672.0mm</dimen>\n    <dimen name=\"mm673\">673.0mm</dimen>\n    <dimen name=\"mm674\">674.0mm</dimen>\n    <dimen name=\"mm675\">675.0mm</dimen>\n    <dimen name=\"mm676\">676.0mm</dimen>\n    <dimen name=\"mm677\">677.0mm</dimen>\n    <dimen name=\"mm678\">678.0mm</dimen>\n    <dimen name=\"mm679\">679.0mm</dimen>\n    <dimen name=\"mm680\">680.0mm</dimen>\n    <dimen name=\"mm681\">681.0mm</dimen>\n    <dimen name=\"mm682\">682.0mm</dimen>\n    <dimen name=\"mm683\">683.0mm</dimen>\n    <dimen name=\"mm684\">684.0mm</dimen>\n    <dimen name=\"mm685\">685.0mm</dimen>\n    <dimen name=\"mm686\">686.0mm</dimen>\n    <dimen name=\"mm687\">687.0mm</dimen>\n    <dimen name=\"mm688\">688.0mm</dimen>\n    <dimen name=\"mm689\">689.0mm</dimen>\n    <dimen name=\"mm690\">690.0mm</dimen>\n    <dimen name=\"mm691\">691.0mm</dimen>\n    <dimen name=\"mm692\">692.0mm</dimen>\n    <dimen name=\"mm693\">693.0mm</dimen>\n    <dimen name=\"mm694\">694.0mm</dimen>\n    <dimen name=\"mm695\">695.0mm</dimen>\n    <dimen name=\"mm696\">696.0mm</dimen>\n    <dimen name=\"mm697\">697.0mm</dimen>\n    <dimen name=\"mm698\">698.0mm</dimen>\n    <dimen name=\"mm699\">699.0mm</dimen>\n    <dimen name=\"mm700\">700.0mm</dimen>\n    <dimen name=\"mm701\">701.0mm</dimen>\n    <dimen name=\"mm702\">702.0mm</dimen>\n    <dimen name=\"mm703\">703.0mm</dimen>\n    <dimen name=\"mm704\">704.0mm</dimen>\n    <dimen name=\"mm705\">705.0mm</dimen>\n    <dimen name=\"mm706\">706.0mm</dimen>\n    <dimen name=\"mm707\">707.0mm</dimen>\n    <dimen name=\"mm708\">708.0mm</dimen>\n    <dimen name=\"mm709\">709.0mm</dimen>\n    <dimen name=\"mm710\">710.0mm</dimen>\n    <dimen name=\"mm711\">711.0mm</dimen>\n    <dimen name=\"mm712\">712.0mm</dimen>\n    <dimen name=\"mm713\">713.0mm</dimen>\n    <dimen name=\"mm714\">714.0mm</dimen>\n    <dimen name=\"mm715\">715.0mm</dimen>\n    <dimen name=\"mm716\">716.0mm</dimen>\n    <dimen name=\"mm717\">717.0mm</dimen>\n    <dimen name=\"mm718\">718.0mm</dimen>\n    <dimen name=\"mm719\">719.0mm</dimen>\n    <dimen name=\"mm720\">720.0mm</dimen>\n    <dimen name=\"mm721\">721.0mm</dimen>\n    <dimen name=\"mm722\">722.0mm</dimen>\n    <dimen name=\"mm723\">723.0mm</dimen>\n    <dimen name=\"mm724\">724.0mm</dimen>\n    <dimen name=\"mm725\">725.0mm</dimen>\n    <dimen name=\"mm726\">726.0mm</dimen>\n    <dimen name=\"mm727\">727.0mm</dimen>\n    <dimen name=\"mm728\">728.0mm</dimen>\n    <dimen name=\"mm729\">729.0mm</dimen>\n    <dimen name=\"mm730\">730.0mm</dimen>\n    <dimen name=\"mm731\">731.0mm</dimen>\n    <dimen name=\"mm732\">732.0mm</dimen>\n    <dimen name=\"mm733\">733.0mm</dimen>\n    <dimen name=\"mm734\">734.0mm</dimen>\n    <dimen name=\"mm735\">735.0mm</dimen>\n    <dimen name=\"mm736\">736.0mm</dimen>\n    <dimen name=\"mm737\">737.0mm</dimen>\n    <dimen name=\"mm738\">738.0mm</dimen>\n    <dimen name=\"mm739\">739.0mm</dimen>\n    <dimen name=\"mm740\">740.0mm</dimen>\n    <dimen name=\"mm741\">741.0mm</dimen>\n    <dimen name=\"mm742\">742.0mm</dimen>\n    <dimen name=\"mm743\">743.0mm</dimen>\n    <dimen name=\"mm744\">744.0mm</dimen>\n    <dimen name=\"mm745\">745.0mm</dimen>\n    <dimen name=\"mm746\">746.0mm</dimen>\n    <dimen name=\"mm747\">747.0mm</dimen>\n    <dimen name=\"mm748\">748.0mm</dimen>\n    <dimen name=\"mm749\">749.0mm</dimen>\n    <dimen name=\"mm750\">750.0mm</dimen>\n    <dimen name=\"mm751\">751.0mm</dimen>\n    <dimen name=\"mm752\">752.0mm</dimen>\n    <dimen name=\"mm753\">753.0mm</dimen>\n    <dimen name=\"mm754\">754.0mm</dimen>\n    <dimen name=\"mm755\">755.0mm</dimen>\n    <dimen name=\"mm756\">756.0mm</dimen>\n    <dimen name=\"mm757\">757.0mm</dimen>\n    <dimen name=\"mm758\">758.0mm</dimen>\n    <dimen name=\"mm759\">759.0mm</dimen>\n    <dimen name=\"mm760\">760.0mm</dimen>\n    <dimen name=\"mm761\">761.0mm</dimen>\n    <dimen name=\"mm762\">762.0mm</dimen>\n    <dimen name=\"mm763\">763.0mm</dimen>\n    <dimen name=\"mm764\">764.0mm</dimen>\n    <dimen name=\"mm765\">765.0mm</dimen>\n    <dimen name=\"mm766\">766.0mm</dimen>\n    <dimen name=\"mm767\">767.0mm</dimen>\n    <dimen name=\"mm768\">768.0mm</dimen>\n    <dimen name=\"mm769\">769.0mm</dimen>\n    <dimen name=\"mm770\">770.0mm</dimen>\n    <dimen name=\"mm771\">771.0mm</dimen>\n    <dimen name=\"mm772\">772.0mm</dimen>\n    <dimen name=\"mm773\">773.0mm</dimen>\n    <dimen name=\"mm774\">774.0mm</dimen>\n    <dimen name=\"mm775\">775.0mm</dimen>\n    <dimen name=\"mm776\">776.0mm</dimen>\n    <dimen name=\"mm777\">777.0mm</dimen>\n    <dimen name=\"mm778\">778.0mm</dimen>\n    <dimen name=\"mm779\">779.0mm</dimen>\n    <dimen name=\"mm780\">780.0mm</dimen>\n    <dimen name=\"mm781\">781.0mm</dimen>\n    <dimen name=\"mm782\">782.0mm</dimen>\n    <dimen name=\"mm783\">783.0mm</dimen>\n    <dimen name=\"mm784\">784.0mm</dimen>\n    <dimen name=\"mm785\">785.0mm</dimen>\n    <dimen name=\"mm786\">786.0mm</dimen>\n    <dimen name=\"mm787\">787.0mm</dimen>\n    <dimen name=\"mm788\">788.0mm</dimen>\n    <dimen name=\"mm789\">789.0mm</dimen>\n    <dimen name=\"mm790\">790.0mm</dimen>\n    <dimen name=\"mm791\">791.0mm</dimen>\n    <dimen name=\"mm792\">792.0mm</dimen>\n    <dimen name=\"mm793\">793.0mm</dimen>\n    <dimen name=\"mm794\">794.0mm</dimen>\n    <dimen name=\"mm795\">795.0mm</dimen>\n    <dimen name=\"mm796\">796.0mm</dimen>\n    <dimen name=\"mm797\">797.0mm</dimen>\n    <dimen name=\"mm798\">798.0mm</dimen>\n    <dimen name=\"mm799\">799.0mm</dimen>\n    <dimen name=\"mm800\">800.0mm</dimen>\n    <dimen name=\"mm801\">801.0mm</dimen>\n    <dimen name=\"mm802\">802.0mm</dimen>\n    <dimen name=\"mm803\">803.0mm</dimen>\n    <dimen name=\"mm804\">804.0mm</dimen>\n    <dimen name=\"mm805\">805.0mm</dimen>\n    <dimen name=\"mm806\">806.0mm</dimen>\n    <dimen name=\"mm807\">807.0mm</dimen>\n    <dimen name=\"mm808\">808.0mm</dimen>\n    <dimen name=\"mm809\">809.0mm</dimen>\n    <dimen name=\"mm810\">810.0mm</dimen>\n    <dimen name=\"mm811\">811.0mm</dimen>\n    <dimen name=\"mm812\">812.0mm</dimen>\n    <dimen name=\"mm813\">813.0mm</dimen>\n    <dimen name=\"mm814\">814.0mm</dimen>\n    <dimen name=\"mm815\">815.0mm</dimen>\n    <dimen name=\"mm816\">816.0mm</dimen>\n    <dimen name=\"mm817\">817.0mm</dimen>\n    <dimen name=\"mm818\">818.0mm</dimen>\n    <dimen name=\"mm819\">819.0mm</dimen>\n    <dimen name=\"mm820\">820.0mm</dimen>\n    <dimen name=\"mm821\">821.0mm</dimen>\n    <dimen name=\"mm822\">822.0mm</dimen>\n    <dimen name=\"mm823\">823.0mm</dimen>\n    <dimen name=\"mm824\">824.0mm</dimen>\n    <dimen name=\"mm825\">825.0mm</dimen>\n    <dimen name=\"mm826\">826.0mm</dimen>\n    <dimen name=\"mm827\">827.0mm</dimen>\n    <dimen name=\"mm828\">828.0mm</dimen>\n    <dimen name=\"mm829\">829.0mm</dimen>\n    <dimen name=\"mm830\">830.0mm</dimen>\n    <dimen name=\"mm831\">831.0mm</dimen>\n    <dimen name=\"mm832\">832.0mm</dimen>\n    <dimen name=\"mm833\">833.0mm</dimen>\n    <dimen name=\"mm834\">834.0mm</dimen>\n    <dimen name=\"mm835\">835.0mm</dimen>\n    <dimen name=\"mm836\">836.0mm</dimen>\n    <dimen name=\"mm837\">837.0mm</dimen>\n    <dimen name=\"mm838\">838.0mm</dimen>\n    <dimen name=\"mm839\">839.0mm</dimen>\n    <dimen name=\"mm840\">840.0mm</dimen>\n    <dimen name=\"mm841\">841.0mm</dimen>\n    <dimen name=\"mm842\">842.0mm</dimen>\n    <dimen name=\"mm843\">843.0mm</dimen>\n    <dimen name=\"mm844\">844.0mm</dimen>\n    <dimen name=\"mm845\">845.0mm</dimen>\n    <dimen name=\"mm846\">846.0mm</dimen>\n    <dimen name=\"mm847\">847.0mm</dimen>\n    <dimen name=\"mm848\">848.0mm</dimen>\n    <dimen name=\"mm849\">849.0mm</dimen>\n    <dimen name=\"mm850\">850.0mm</dimen>\n    <dimen name=\"mm851\">851.0mm</dimen>\n    <dimen name=\"mm852\">852.0mm</dimen>\n    <dimen name=\"mm853\">853.0mm</dimen>\n    <dimen name=\"mm854\">854.0mm</dimen>\n    <dimen name=\"mm855\">855.0mm</dimen>\n    <dimen name=\"mm856\">856.0mm</dimen>\n    <dimen name=\"mm857\">857.0mm</dimen>\n    <dimen name=\"mm858\">858.0mm</dimen>\n    <dimen name=\"mm859\">859.0mm</dimen>\n    <dimen name=\"mm860\">860.0mm</dimen>\n    <dimen name=\"mm861\">861.0mm</dimen>\n    <dimen name=\"mm862\">862.0mm</dimen>\n    <dimen name=\"mm863\">863.0mm</dimen>\n    <dimen name=\"mm864\">864.0mm</dimen>\n    <dimen name=\"mm865\">865.0mm</dimen>\n    <dimen name=\"mm866\">866.0mm</dimen>\n    <dimen name=\"mm867\">867.0mm</dimen>\n    <dimen name=\"mm868\">868.0mm</dimen>\n    <dimen name=\"mm869\">869.0mm</dimen>\n    <dimen name=\"mm870\">870.0mm</dimen>\n    <dimen name=\"mm871\">871.0mm</dimen>\n    <dimen name=\"mm872\">872.0mm</dimen>\n    <dimen name=\"mm873\">873.0mm</dimen>\n    <dimen name=\"mm874\">874.0mm</dimen>\n    <dimen name=\"mm875\">875.0mm</dimen>\n    <dimen name=\"mm876\">876.0mm</dimen>\n    <dimen name=\"mm877\">877.0mm</dimen>\n    <dimen name=\"mm878\">878.0mm</dimen>\n    <dimen name=\"mm879\">879.0mm</dimen>\n    <dimen name=\"mm880\">880.0mm</dimen>\n    <dimen name=\"mm881\">881.0mm</dimen>\n    <dimen name=\"mm882\">882.0mm</dimen>\n    <dimen name=\"mm883\">883.0mm</dimen>\n    <dimen name=\"mm884\">884.0mm</dimen>\n    <dimen name=\"mm885\">885.0mm</dimen>\n    <dimen name=\"mm886\">886.0mm</dimen>\n    <dimen name=\"mm887\">887.0mm</dimen>\n    <dimen name=\"mm888\">888.0mm</dimen>\n    <dimen name=\"mm889\">889.0mm</dimen>\n    <dimen name=\"mm890\">890.0mm</dimen>\n    <dimen name=\"mm891\">891.0mm</dimen>\n    <dimen name=\"mm892\">892.0mm</dimen>\n    <dimen name=\"mm893\">893.0mm</dimen>\n    <dimen name=\"mm894\">894.0mm</dimen>\n    <dimen name=\"mm895\">895.0mm</dimen>\n    <dimen name=\"mm896\">896.0mm</dimen>\n    <dimen name=\"mm897\">897.0mm</dimen>\n    <dimen name=\"mm898\">898.0mm</dimen>\n    <dimen name=\"mm899\">899.0mm</dimen>\n    <dimen name=\"mm900\">900.0mm</dimen>\n    <dimen name=\"mm901\">901.0mm</dimen>\n    <dimen name=\"mm902\">902.0mm</dimen>\n    <dimen name=\"mm903\">903.0mm</dimen>\n    <dimen name=\"mm904\">904.0mm</dimen>\n    <dimen name=\"mm905\">905.0mm</dimen>\n    <dimen name=\"mm906\">906.0mm</dimen>\n    <dimen name=\"mm907\">907.0mm</dimen>\n    <dimen name=\"mm908\">908.0mm</dimen>\n    <dimen name=\"mm909\">909.0mm</dimen>\n    <dimen name=\"mm910\">910.0mm</dimen>\n    <dimen name=\"mm911\">911.0mm</dimen>\n    <dimen name=\"mm912\">912.0mm</dimen>\n    <dimen name=\"mm913\">913.0mm</dimen>\n    <dimen name=\"mm914\">914.0mm</dimen>\n    <dimen name=\"mm915\">915.0mm</dimen>\n    <dimen name=\"mm916\">916.0mm</dimen>\n    <dimen name=\"mm917\">917.0mm</dimen>\n    <dimen name=\"mm918\">918.0mm</dimen>\n    <dimen name=\"mm919\">919.0mm</dimen>\n    <dimen name=\"mm920\">920.0mm</dimen>\n    <dimen name=\"mm921\">921.0mm</dimen>\n    <dimen name=\"mm922\">922.0mm</dimen>\n    <dimen name=\"mm923\">923.0mm</dimen>\n    <dimen name=\"mm924\">924.0mm</dimen>\n    <dimen name=\"mm925\">925.0mm</dimen>\n    <dimen name=\"mm926\">926.0mm</dimen>\n    <dimen name=\"mm927\">927.0mm</dimen>\n    <dimen name=\"mm928\">928.0mm</dimen>\n    <dimen name=\"mm929\">929.0mm</dimen>\n    <dimen name=\"mm930\">930.0mm</dimen>\n    <dimen name=\"mm931\">931.0mm</dimen>\n    <dimen name=\"mm932\">932.0mm</dimen>\n    <dimen name=\"mm933\">933.0mm</dimen>\n    <dimen name=\"mm934\">934.0mm</dimen>\n    <dimen name=\"mm935\">935.0mm</dimen>\n    <dimen name=\"mm936\">936.0mm</dimen>\n    <dimen name=\"mm937\">937.0mm</dimen>\n    <dimen name=\"mm938\">938.0mm</dimen>\n    <dimen name=\"mm939\">939.0mm</dimen>\n    <dimen name=\"mm940\">940.0mm</dimen>\n    <dimen name=\"mm941\">941.0mm</dimen>\n    <dimen name=\"mm942\">942.0mm</dimen>\n    <dimen name=\"mm943\">943.0mm</dimen>\n    <dimen name=\"mm944\">944.0mm</dimen>\n    <dimen name=\"mm945\">945.0mm</dimen>\n    <dimen name=\"mm946\">946.0mm</dimen>\n    <dimen name=\"mm947\">947.0mm</dimen>\n    <dimen name=\"mm948\">948.0mm</dimen>\n    <dimen name=\"mm949\">949.0mm</dimen>\n    <dimen name=\"mm950\">950.0mm</dimen>\n    <dimen name=\"mm951\">951.0mm</dimen>\n    <dimen name=\"mm952\">952.0mm</dimen>\n    <dimen name=\"mm953\">953.0mm</dimen>\n    <dimen name=\"mm954\">954.0mm</dimen>\n    <dimen name=\"mm955\">955.0mm</dimen>\n    <dimen name=\"mm956\">956.0mm</dimen>\n    <dimen name=\"mm957\">957.0mm</dimen>\n    <dimen name=\"mm958\">958.0mm</dimen>\n    <dimen name=\"mm959\">959.0mm</dimen>\n    <dimen name=\"mm960\">960.0mm</dimen>\n    <dimen name=\"mm961\">961.0mm</dimen>\n    <dimen name=\"mm962\">962.0mm</dimen>\n    <dimen name=\"mm963\">963.0mm</dimen>\n    <dimen name=\"mm964\">964.0mm</dimen>\n    <dimen name=\"mm965\">965.0mm</dimen>\n    <dimen name=\"mm966\">966.0mm</dimen>\n    <dimen name=\"mm967\">967.0mm</dimen>\n    <dimen name=\"mm968\">968.0mm</dimen>\n    <dimen name=\"mm969\">969.0mm</dimen>\n    <dimen name=\"mm970\">970.0mm</dimen>\n    <dimen name=\"mm971\">971.0mm</dimen>\n    <dimen name=\"mm972\">972.0mm</dimen>\n    <dimen name=\"mm973\">973.0mm</dimen>\n    <dimen name=\"mm974\">974.0mm</dimen>\n    <dimen name=\"mm975\">975.0mm</dimen>\n    <dimen name=\"mm976\">976.0mm</dimen>\n    <dimen name=\"mm977\">977.0mm</dimen>\n    <dimen name=\"mm978\">978.0mm</dimen>\n    <dimen name=\"mm979\">979.0mm</dimen>\n    <dimen name=\"mm980\">980.0mm</dimen>\n    <dimen name=\"mm981\">981.0mm</dimen>\n    <dimen name=\"mm982\">982.0mm</dimen>\n    <dimen name=\"mm983\">983.0mm</dimen>\n    <dimen name=\"mm984\">984.0mm</dimen>\n    <dimen name=\"mm985\">985.0mm</dimen>\n    <dimen name=\"mm986\">986.0mm</dimen>\n    <dimen name=\"mm987\">987.0mm</dimen>\n    <dimen name=\"mm988\">988.0mm</dimen>\n    <dimen name=\"mm989\">989.0mm</dimen>\n    <dimen name=\"mm990\">990.0mm</dimen>\n    <dimen name=\"mm991\">991.0mm</dimen>\n    <dimen name=\"mm992\">992.0mm</dimen>\n    <dimen name=\"mm993\">993.0mm</dimen>\n    <dimen name=\"mm994\">994.0mm</dimen>\n    <dimen name=\"mm995\">995.0mm</dimen>\n    <dimen name=\"mm996\">996.0mm</dimen>\n    <dimen name=\"mm997\">997.0mm</dimen>\n    <dimen name=\"mm998\">998.0mm</dimen>\n    <dimen name=\"mm999\">999.0mm</dimen>\n    <dimen name=\"mm1000\">1000.0mm</dimen>\n    <dimen name=\"mm1001\">1001.0mm</dimen>\n    <dimen name=\"mm1002\">1002.0mm</dimen>\n    <dimen name=\"mm1003\">1003.0mm</dimen>\n    <dimen name=\"mm1004\">1004.0mm</dimen>\n    <dimen name=\"mm1005\">1005.0mm</dimen>\n    <dimen name=\"mm1006\">1006.0mm</dimen>\n    <dimen name=\"mm1007\">1007.0mm</dimen>\n    <dimen name=\"mm1008\">1008.0mm</dimen>\n    <dimen name=\"mm1009\">1009.0mm</dimen>\n    <dimen name=\"mm1010\">1010.0mm</dimen>\n    <dimen name=\"mm1011\">1011.0mm</dimen>\n    <dimen name=\"mm1012\">1012.0mm</dimen>\n    <dimen name=\"mm1013\">1013.0mm</dimen>\n    <dimen name=\"mm1014\">1014.0mm</dimen>\n    <dimen name=\"mm1015\">1015.0mm</dimen>\n    <dimen name=\"mm1016\">1016.0mm</dimen>\n    <dimen name=\"mm1017\">1017.0mm</dimen>\n    <dimen name=\"mm1018\">1018.0mm</dimen>\n    <dimen name=\"mm1019\">1019.0mm</dimen>\n    <dimen name=\"mm1020\">1020.0mm</dimen>\n    <dimen name=\"mm1021\">1021.0mm</dimen>\n    <dimen name=\"mm1022\">1022.0mm</dimen>\n    <dimen name=\"mm1023\">1023.0mm</dimen>\n    <dimen name=\"mm1024\">1024.0mm</dimen>\n    <dimen name=\"mm1025\">1025.0mm</dimen>\n    <dimen name=\"mm1026\">1026.0mm</dimen>\n    <dimen name=\"mm1027\">1027.0mm</dimen>\n    <dimen name=\"mm1028\">1028.0mm</dimen>\n    <dimen name=\"mm1029\">1029.0mm</dimen>\n    <dimen name=\"mm1030\">1030.0mm</dimen>\n    <dimen name=\"mm1031\">1031.0mm</dimen>\n    <dimen name=\"mm1032\">1032.0mm</dimen>\n    <dimen name=\"mm1033\">1033.0mm</dimen>\n    <dimen name=\"mm1034\">1034.0mm</dimen>\n    <dimen name=\"mm1035\">1035.0mm</dimen>\n    <dimen name=\"mm1036\">1036.0mm</dimen>\n    <dimen name=\"mm1037\">1037.0mm</dimen>\n    <dimen name=\"mm1038\">1038.0mm</dimen>\n    <dimen name=\"mm1039\">1039.0mm</dimen>\n    <dimen name=\"mm1040\">1040.0mm</dimen>\n    <dimen name=\"mm1041\">1041.0mm</dimen>\n    <dimen name=\"mm1042\">1042.0mm</dimen>\n    <dimen name=\"mm1043\">1043.0mm</dimen>\n    <dimen name=\"mm1044\">1044.0mm</dimen>\n    <dimen name=\"mm1045\">1045.0mm</dimen>\n    <dimen name=\"mm1046\">1046.0mm</dimen>\n    <dimen name=\"mm1047\">1047.0mm</dimen>\n    <dimen name=\"mm1048\">1048.0mm</dimen>\n    <dimen name=\"mm1049\">1049.0mm</dimen>\n    <dimen name=\"mm1050\">1050.0mm</dimen>\n    <dimen name=\"mm1051\">1051.0mm</dimen>\n    <dimen name=\"mm1052\">1052.0mm</dimen>\n    <dimen name=\"mm1053\">1053.0mm</dimen>\n    <dimen name=\"mm1054\">1054.0mm</dimen>\n    <dimen name=\"mm1055\">1055.0mm</dimen>\n    <dimen name=\"mm1056\">1056.0mm</dimen>\n    <dimen name=\"mm1057\">1057.0mm</dimen>\n    <dimen name=\"mm1058\">1058.0mm</dimen>\n    <dimen name=\"mm1059\">1059.0mm</dimen>\n    <dimen name=\"mm1060\">1060.0mm</dimen>\n    <dimen name=\"mm1061\">1061.0mm</dimen>\n    <dimen name=\"mm1062\">1062.0mm</dimen>\n    <dimen name=\"mm1063\">1063.0mm</dimen>\n    <dimen name=\"mm1064\">1064.0mm</dimen>\n    <dimen name=\"mm1065\">1065.0mm</dimen>\n    <dimen name=\"mm1066\">1066.0mm</dimen>\n    <dimen name=\"mm1067\">1067.0mm</dimen>\n    <dimen name=\"mm1068\">1068.0mm</dimen>\n    <dimen name=\"mm1069\">1069.0mm</dimen>\n    <dimen name=\"mm1070\">1070.0mm</dimen>\n    <dimen name=\"mm1071\">1071.0mm</dimen>\n    <dimen name=\"mm1072\">1072.0mm</dimen>\n    <dimen name=\"mm1073\">1073.0mm</dimen>\n    <dimen name=\"mm1074\">1074.0mm</dimen>\n    <dimen name=\"mm1075\">1075.0mm</dimen>\n    <dimen name=\"mm1076\">1076.0mm</dimen>\n    <dimen name=\"mm1077\">1077.0mm</dimen>\n    <dimen name=\"mm1078\">1078.0mm</dimen>\n    <dimen name=\"mm1079\">1079.0mm</dimen>\n    <dimen name=\"mm1080\">1080.0mm</dimen>\n    <dimen name=\"mm1081\">1081.0mm</dimen>\n    <dimen name=\"mm1082\">1082.0mm</dimen>\n    <dimen name=\"mm1083\">1083.0mm</dimen>\n    <dimen name=\"mm1084\">1084.0mm</dimen>\n    <dimen name=\"mm1085\">1085.0mm</dimen>\n    <dimen name=\"mm1086\">1086.0mm</dimen>\n    <dimen name=\"mm1087\">1087.0mm</dimen>\n    <dimen name=\"mm1088\">1088.0mm</dimen>\n    <dimen name=\"mm1089\">1089.0mm</dimen>\n    <dimen name=\"mm1090\">1090.0mm</dimen>\n    <dimen name=\"mm1091\">1091.0mm</dimen>\n    <dimen name=\"mm1092\">1092.0mm</dimen>\n    <dimen name=\"mm1093\">1093.0mm</dimen>\n    <dimen name=\"mm1094\">1094.0mm</dimen>\n    <dimen name=\"mm1095\">1095.0mm</dimen>\n    <dimen name=\"mm1096\">1096.0mm</dimen>\n    <dimen name=\"mm1097\">1097.0mm</dimen>\n    <dimen name=\"mm1098\">1098.0mm</dimen>\n    <dimen name=\"mm1099\">1099.0mm</dimen>\n    <dimen name=\"mm1100\">1100.0mm</dimen>\n    <dimen name=\"mm1101\">1101.0mm</dimen>\n    <dimen name=\"mm1102\">1102.0mm</dimen>\n    <dimen name=\"mm1103\">1103.0mm</dimen>\n    <dimen name=\"mm1104\">1104.0mm</dimen>\n    <dimen name=\"mm1105\">1105.0mm</dimen>\n    <dimen name=\"mm1106\">1106.0mm</dimen>\n    <dimen name=\"mm1107\">1107.0mm</dimen>\n    <dimen name=\"mm1108\">1108.0mm</dimen>\n    <dimen name=\"mm1109\">1109.0mm</dimen>\n    <dimen name=\"mm1110\">1110.0mm</dimen>\n    <dimen name=\"mm1111\">1111.0mm</dimen>\n    <dimen name=\"mm1112\">1112.0mm</dimen>\n    <dimen name=\"mm1113\">1113.0mm</dimen>\n    <dimen name=\"mm1114\">1114.0mm</dimen>\n    <dimen name=\"mm1115\">1115.0mm</dimen>\n    <dimen name=\"mm1116\">1116.0mm</dimen>\n    <dimen name=\"mm1117\">1117.0mm</dimen>\n    <dimen name=\"mm1118\">1118.0mm</dimen>\n    <dimen name=\"mm1119\">1119.0mm</dimen>\n    <dimen name=\"mm1120\">1120.0mm</dimen>\n    <dimen name=\"mm1121\">1121.0mm</dimen>\n    <dimen name=\"mm1122\">1122.0mm</dimen>\n    <dimen name=\"mm1123\">1123.0mm</dimen>\n    <dimen name=\"mm1124\">1124.0mm</dimen>\n    <dimen name=\"mm1125\">1125.0mm</dimen>\n    <dimen name=\"mm1126\">1126.0mm</dimen>\n    <dimen name=\"mm1127\">1127.0mm</dimen>\n    <dimen name=\"mm1128\">1128.0mm</dimen>\n    <dimen name=\"mm1129\">1129.0mm</dimen>\n    <dimen name=\"mm1130\">1130.0mm</dimen>\n    <dimen name=\"mm1131\">1131.0mm</dimen>\n    <dimen name=\"mm1132\">1132.0mm</dimen>\n    <dimen name=\"mm1133\">1133.0mm</dimen>\n    <dimen name=\"mm1134\">1134.0mm</dimen>\n    <dimen name=\"mm1135\">1135.0mm</dimen>\n    <dimen name=\"mm1136\">1136.0mm</dimen>\n    <dimen name=\"mm1137\">1137.0mm</dimen>\n    <dimen name=\"mm1138\">1138.0mm</dimen>\n    <dimen name=\"mm1139\">1139.0mm</dimen>\n    <dimen name=\"mm1140\">1140.0mm</dimen>\n    <dimen name=\"mm1141\">1141.0mm</dimen>\n    <dimen name=\"mm1142\">1142.0mm</dimen>\n    <dimen name=\"mm1143\">1143.0mm</dimen>\n    <dimen name=\"mm1144\">1144.0mm</dimen>\n    <dimen name=\"mm1145\">1145.0mm</dimen>\n    <dimen name=\"mm1146\">1146.0mm</dimen>\n    <dimen name=\"mm1147\">1147.0mm</dimen>\n    <dimen name=\"mm1148\">1148.0mm</dimen>\n    <dimen name=\"mm1149\">1149.0mm</dimen>\n    <dimen name=\"mm1150\">1150.0mm</dimen>\n    <dimen name=\"mm1151\">1151.0mm</dimen>\n    <dimen name=\"mm1152\">1152.0mm</dimen>\n    <dimen name=\"mm1153\">1153.0mm</dimen>\n    <dimen name=\"mm1154\">1154.0mm</dimen>\n    <dimen name=\"mm1155\">1155.0mm</dimen>\n    <dimen name=\"mm1156\">1156.0mm</dimen>\n    <dimen name=\"mm1157\">1157.0mm</dimen>\n    <dimen name=\"mm1158\">1158.0mm</dimen>\n    <dimen name=\"mm1159\">1159.0mm</dimen>\n    <dimen name=\"mm1160\">1160.0mm</dimen>\n    <dimen name=\"mm1161\">1161.0mm</dimen>\n    <dimen name=\"mm1162\">1162.0mm</dimen>\n    <dimen name=\"mm1163\">1163.0mm</dimen>\n    <dimen name=\"mm1164\">1164.0mm</dimen>\n    <dimen name=\"mm1165\">1165.0mm</dimen>\n    <dimen name=\"mm1166\">1166.0mm</dimen>\n    <dimen name=\"mm1167\">1167.0mm</dimen>\n    <dimen name=\"mm1168\">1168.0mm</dimen>\n    <dimen name=\"mm1169\">1169.0mm</dimen>\n    <dimen name=\"mm1170\">1170.0mm</dimen>\n    <dimen name=\"mm1171\">1171.0mm</dimen>\n    <dimen name=\"mm1172\">1172.0mm</dimen>\n    <dimen name=\"mm1173\">1173.0mm</dimen>\n    <dimen name=\"mm1174\">1174.0mm</dimen>\n    <dimen name=\"mm1175\">1175.0mm</dimen>\n    <dimen name=\"mm1176\">1176.0mm</dimen>\n    <dimen name=\"mm1177\">1177.0mm</dimen>\n    <dimen name=\"mm1178\">1178.0mm</dimen>\n    <dimen name=\"mm1179\">1179.0mm</dimen>\n    <dimen name=\"mm1180\">1180.0mm</dimen>\n    <dimen name=\"mm1181\">1181.0mm</dimen>\n    <dimen name=\"mm1182\">1182.0mm</dimen>\n    <dimen name=\"mm1183\">1183.0mm</dimen>\n    <dimen name=\"mm1184\">1184.0mm</dimen>\n    <dimen name=\"mm1185\">1185.0mm</dimen>\n    <dimen name=\"mm1186\">1186.0mm</dimen>\n    <dimen name=\"mm1187\">1187.0mm</dimen>\n    <dimen name=\"mm1188\">1188.0mm</dimen>\n    <dimen name=\"mm1189\">1189.0mm</dimen>\n    <dimen name=\"mm1190\">1190.0mm</dimen>\n    <dimen name=\"mm1191\">1191.0mm</dimen>\n    <dimen name=\"mm1192\">1192.0mm</dimen>\n    <dimen name=\"mm1193\">1193.0mm</dimen>\n    <dimen name=\"mm1194\">1194.0mm</dimen>\n    <dimen name=\"mm1195\">1195.0mm</dimen>\n    <dimen name=\"mm1196\">1196.0mm</dimen>\n    <dimen name=\"mm1197\">1197.0mm</dimen>\n    <dimen name=\"mm1198\">1198.0mm</dimen>\n    <dimen name=\"mm1199\">1199.0mm</dimen>\n    <dimen name=\"mm1200\">1200.0mm</dimen>\n    <dimen name=\"mm1201\">1201.0mm</dimen>\n    <dimen name=\"mm1202\">1202.0mm</dimen>\n    <dimen name=\"mm1203\">1203.0mm</dimen>\n    <dimen name=\"mm1204\">1204.0mm</dimen>\n    <dimen name=\"mm1205\">1205.0mm</dimen>\n    <dimen name=\"mm1206\">1206.0mm</dimen>\n    <dimen name=\"mm1207\">1207.0mm</dimen>\n    <dimen name=\"mm1208\">1208.0mm</dimen>\n    <dimen name=\"mm1209\">1209.0mm</dimen>\n    <dimen name=\"mm1210\">1210.0mm</dimen>\n    <dimen name=\"mm1211\">1211.0mm</dimen>\n    <dimen name=\"mm1212\">1212.0mm</dimen>\n    <dimen name=\"mm1213\">1213.0mm</dimen>\n    <dimen name=\"mm1214\">1214.0mm</dimen>\n    <dimen name=\"mm1215\">1215.0mm</dimen>\n    <dimen name=\"mm1216\">1216.0mm</dimen>\n    <dimen name=\"mm1217\">1217.0mm</dimen>\n    <dimen name=\"mm1218\">1218.0mm</dimen>\n    <dimen name=\"mm1219\">1219.0mm</dimen>\n    <dimen name=\"mm1220\">1220.0mm</dimen>\n    <dimen name=\"mm1221\">1221.0mm</dimen>\n    <dimen name=\"mm1222\">1222.0mm</dimen>\n    <dimen name=\"mm1223\">1223.0mm</dimen>\n    <dimen name=\"mm1224\">1224.0mm</dimen>\n    <dimen name=\"mm1225\">1225.0mm</dimen>\n    <dimen name=\"mm1226\">1226.0mm</dimen>\n    <dimen name=\"mm1227\">1227.0mm</dimen>\n    <dimen name=\"mm1228\">1228.0mm</dimen>\n    <dimen name=\"mm1229\">1229.0mm</dimen>\n    <dimen name=\"mm1230\">1230.0mm</dimen>\n    <dimen name=\"mm1231\">1231.0mm</dimen>\n    <dimen name=\"mm1232\">1232.0mm</dimen>\n    <dimen name=\"mm1233\">1233.0mm</dimen>\n    <dimen name=\"mm1234\">1234.0mm</dimen>\n    <dimen name=\"mm1235\">1235.0mm</dimen>\n    <dimen name=\"mm1236\">1236.0mm</dimen>\n    <dimen name=\"mm1237\">1237.0mm</dimen>\n    <dimen name=\"mm1238\">1238.0mm</dimen>\n    <dimen name=\"mm1239\">1239.0mm</dimen>\n    <dimen name=\"mm1240\">1240.0mm</dimen>\n    <dimen name=\"mm1241\">1241.0mm</dimen>\n    <dimen name=\"mm1242\">1242.0mm</dimen>\n    <dimen name=\"mm1243\">1243.0mm</dimen>\n    <dimen name=\"mm1244\">1244.0mm</dimen>\n    <dimen name=\"mm1245\">1245.0mm</dimen>\n    <dimen name=\"mm1246\">1246.0mm</dimen>\n    <dimen name=\"mm1247\">1247.0mm</dimen>\n    <dimen name=\"mm1248\">1248.0mm</dimen>\n    <dimen name=\"mm1249\">1249.0mm</dimen>\n    <dimen name=\"mm1250\">1250.0mm</dimen>\n    <dimen name=\"mm1251\">1251.0mm</dimen>\n    <dimen name=\"mm1252\">1252.0mm</dimen>\n    <dimen name=\"mm1253\">1253.0mm</dimen>\n    <dimen name=\"mm1254\">1254.0mm</dimen>\n    <dimen name=\"mm1255\">1255.0mm</dimen>\n    <dimen name=\"mm1256\">1256.0mm</dimen>\n    <dimen name=\"mm1257\">1257.0mm</dimen>\n    <dimen name=\"mm1258\">1258.0mm</dimen>\n    <dimen name=\"mm1259\">1259.0mm</dimen>\n    <dimen name=\"mm1260\">1260.0mm</dimen>\n    <dimen name=\"mm1261\">1261.0mm</dimen>\n    <dimen name=\"mm1262\">1262.0mm</dimen>\n    <dimen name=\"mm1263\">1263.0mm</dimen>\n    <dimen name=\"mm1264\">1264.0mm</dimen>\n    <dimen name=\"mm1265\">1265.0mm</dimen>\n    <dimen name=\"mm1266\">1266.0mm</dimen>\n    <dimen name=\"mm1267\">1267.0mm</dimen>\n    <dimen name=\"mm1268\">1268.0mm</dimen>\n    <dimen name=\"mm1269\">1269.0mm</dimen>\n    <dimen name=\"mm1270\">1270.0mm</dimen>\n    <dimen name=\"mm1271\">1271.0mm</dimen>\n    <dimen name=\"mm1272\">1272.0mm</dimen>\n    <dimen name=\"mm1273\">1273.0mm</dimen>\n    <dimen name=\"mm1274\">1274.0mm</dimen>\n    <dimen name=\"mm1275\">1275.0mm</dimen>\n    <dimen name=\"mm1276\">1276.0mm</dimen>\n    <dimen name=\"mm1277\">1277.0mm</dimen>\n    <dimen name=\"mm1278\">1278.0mm</dimen>\n    <dimen name=\"mm1279\">1279.0mm</dimen>\n    <dimen name=\"mm1280\">1280.0mm</dimen>\n    <dimen name=\"mm1281\">1281.0mm</dimen>\n    <dimen name=\"mm1282\">1282.0mm</dimen>\n    <dimen name=\"mm1283\">1283.0mm</dimen>\n    <dimen name=\"mm1284\">1284.0mm</dimen>\n    <dimen name=\"mm1285\">1285.0mm</dimen>\n    <dimen name=\"mm1286\">1286.0mm</dimen>\n    <dimen name=\"mm1287\">1287.0mm</dimen>\n    <dimen name=\"mm1288\">1288.0mm</dimen>\n    <dimen name=\"mm1289\">1289.0mm</dimen>\n    <dimen name=\"mm1290\">1290.0mm</dimen>\n    <dimen name=\"mm1291\">1291.0mm</dimen>\n    <dimen name=\"mm1292\">1292.0mm</dimen>\n    <dimen name=\"mm1293\">1293.0mm</dimen>\n    <dimen name=\"mm1294\">1294.0mm</dimen>\n    <dimen name=\"mm1295\">1295.0mm</dimen>\n    <dimen name=\"mm1296\">1296.0mm</dimen>\n    <dimen name=\"mm1297\">1297.0mm</dimen>\n    <dimen name=\"mm1298\">1298.0mm</dimen>\n    <dimen name=\"mm1299\">1299.0mm</dimen>\n    <dimen name=\"mm1300\">1300.0mm</dimen>\n    <dimen name=\"mm1301\">1301.0mm</dimen>\n    <dimen name=\"mm1302\">1302.0mm</dimen>\n    <dimen name=\"mm1303\">1303.0mm</dimen>\n    <dimen name=\"mm1304\">1304.0mm</dimen>\n    <dimen name=\"mm1305\">1305.0mm</dimen>\n    <dimen name=\"mm1306\">1306.0mm</dimen>\n    <dimen name=\"mm1307\">1307.0mm</dimen>\n    <dimen name=\"mm1308\">1308.0mm</dimen>\n    <dimen name=\"mm1309\">1309.0mm</dimen>\n    <dimen name=\"mm1310\">1310.0mm</dimen>\n    <dimen name=\"mm1311\">1311.0mm</dimen>\n    <dimen name=\"mm1312\">1312.0mm</dimen>\n    <dimen name=\"mm1313\">1313.0mm</dimen>\n    <dimen name=\"mm1314\">1314.0mm</dimen>\n    <dimen name=\"mm1315\">1315.0mm</dimen>\n    <dimen name=\"mm1316\">1316.0mm</dimen>\n    <dimen name=\"mm1317\">1317.0mm</dimen>\n    <dimen name=\"mm1318\">1318.0mm</dimen>\n    <dimen name=\"mm1319\">1319.0mm</dimen>\n    <dimen name=\"mm1320\">1320.0mm</dimen>\n    <dimen name=\"mm1321\">1321.0mm</dimen>\n    <dimen name=\"mm1322\">1322.0mm</dimen>\n    <dimen name=\"mm1323\">1323.0mm</dimen>\n    <dimen name=\"mm1324\">1324.0mm</dimen>\n    <dimen name=\"mm1325\">1325.0mm</dimen>\n    <dimen name=\"mm1326\">1326.0mm</dimen>\n    <dimen name=\"mm1327\">1327.0mm</dimen>\n    <dimen name=\"mm1328\">1328.0mm</dimen>\n    <dimen name=\"mm1329\">1329.0mm</dimen>\n    <dimen name=\"mm1330\">1330.0mm</dimen>\n    <dimen name=\"mm1331\">1331.0mm</dimen>\n    <dimen name=\"mm1332\">1332.0mm</dimen>\n    <dimen name=\"mm1333\">1333.0mm</dimen>\n    <dimen name=\"mm1334\">1334mm</dimen>\n\n</resources>"
  },
  {
    "path": "lib_common/src/main/res/values/strings.xml",
    "content": "<resources>\n    <string name=\"app_name\">lib_common</string>\n</resources>\n"
  },
  {
    "path": "lib_common/src/main/res/values/styles.xml",
    "content": "<resources>\n\n    <!-- Base application theme. -->\n    <style name=\"AppTheme\" parent=\"Theme.AppCompat.Light.NoActionBar\">\n        <!-- Customize your theme here. -->\n        <item name=\"colorPrimary\">@color/colorPrimary</item>\n        <item name=\"colorPrimaryDark\">@color/colorPrimaryDark</item>\n        <item name=\"colorAccent\">@color/colorAccent</item>\n    </style>\n\n    <!--沉浸式状态栏-->\n    <style name=\"TranslucentTheme\" parent=\"Theme.AppCompat.Light.NoActionBar\">\n        <item name=\"colorPrimary\">@color/colorPrimary</item>\n        <item name=\"colorPrimaryDark\">@color/colorPrimaryDark</item>\n        <item name=\"colorAccent\">@color/colorAccent</item>\n    </style>\n\n</resources>\n"
  },
  {
    "path": "lib_common/src/test/java/com/senon/lib_common/ExampleUnitTest.java",
    "content": "package com.senon.lib_common;\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": "lib_opensource/.gitignore",
    "content": "/build\n"
  },
  {
    "path": "lib_opensource/build.gradle",
    "content": "apply plugin: 'com.android.library'\n\nandroid {\n    compileSdkVersion rootProject.ext.android[\"compileSdkVersion\"]\n\n    defaultConfig {\n        minSdkVersion rootProject.ext.android[\"minSdkVersion\"]\n        targetSdkVersion rootProject.ext.android[\"targetSdkVersion\"]\n        versionCode rootProject.ext.android[\"versionCode\"]\n        versionName rootProject.ext.android[\"versionName\"]\n\n        testInstrumentationRunner \"android.support.test.runner.AndroidJUnitRunner\"\n\n    }\n\n    buildTypes {\n        release {\n            minifyEnabled false\n            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'\n        }\n    }\n\n}\n\ndependencies {\n    implementation fileTree(dir: 'libs', include: ['*.jar'])\n    testImplementation rootProject.ext.dependencies[\"junit\"]\n\n    api rootProject.ext.dependencies[\"support-v4\"]\n    api rootProject.ext.dependencies[\"appcompat-v7\"]\n    api rootProject.ext.dependencies[\"design\"]\n    api rootProject.ext.dependencies[\"recyclerview-v7\"]\n    api rootProject.ext.dependencies[\"cardview-v7\"]\n\n    api rootProject.ext.dependencies[\"rxandroid\"]\n    api rootProject.ext.dependencies[\"retrofit\"]\n    api rootProject.ext.dependencies[\"rxlifecycle\"]\n    api rootProject.ext.dependencies[\"rxlifecycle-components\"]\n    api rootProject.ext.dependencies[\"adapter-rxjava\"]\n    api rootProject.ext.dependencies[\"retrofit-converter\"]\n    api rootProject.ext.dependencies[\"retrofit-converter-gson\"]\n\n    api rootProject.ext.dependencies[\"stetho\"]\n    api rootProject.ext.dependencies[\"stetho-okhttp3\"]\n\n    api rootProject.ext.dependencies[\"okhttp3\"]\n    api rootProject.ext.dependencies[\"okhttp3-logging-interceptor\"]\n\n    api rootProject.ext.dependencies[\"router\"]\n\n    api rootProject.ext.dependencies[\"sweetalert\"]\n    api rootProject.ext.dependencies[\"autosize\"]\n    api (rootProject.ext.dependencies[\"lrecyclerview\"]) {\n        exclude group: 'com.android.support'\n    }\n    api rootProject.ext.dependencies[\"smartrefreshlayout\"]\n\n    api rootProject.ext.dependencies[\"glide\"]\n    api rootProject.ext.dependencies[\"eventbus\"]\n    api rootProject.ext.dependencies[\"circleimageview\"]\n\n\n\n}\n"
  },
  {
    "path": "lib_opensource/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": "lib_opensource/src/androidTest/java/com/senon/lib_opensource/ExampleInstrumentedTest.java",
    "content": "package com.senon.lib_opensource;\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.senon.lib_opensource\", appContext.getPackageName());\n    }\n}\n"
  },
  {
    "path": "lib_opensource/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.senon.lib_opensource\">\n\n    <application>\n\n    </application>\n\n</manifest>"
  },
  {
    "path": "lib_opensource/src/test/java/com/senon/lib_opensource/ExampleUnitTest.java",
    "content": "package com.senon.lib_opensource;\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": "module_art/.gitignore",
    "content": "/build\n"
  },
  {
    "path": "module_art/build.gradle",
    "content": "if(isBuildModule.toBoolean()){\n    apply plugin: 'com.android.application'\n}else{\n    apply plugin: 'com.android.library'\n}\n\nandroid {\n    compileSdkVersion rootProject.ext.android[\"compileSdkVersion\"]\n\n    resourcePrefix \"art_\"\n\n    sourceSets {\n        main {\n            if (isBuildModule.toBoolean()) {\n                manifest.srcFile 'src/main/debug/AndroidManifest.xml'\n            } else {\n                manifest.srcFile 'src/main/release/AndroidManifest.xml'\n                java{\n                    //全部Module一起编译的时候剔除debug目录\n                    exclude '**/**/debug/**'\n                }\n            }\n        }\n    }\n\n    defaultConfig {\n        if(isBuildModule.toBoolean()){\n            applicationId \"com.senon.module_art\"\n        }\n        minSdkVersion rootProject.ext.android[\"minSdkVersion\"]\n        targetSdkVersion rootProject.ext.android[\"targetSdkVersion\"]\n        versionCode rootProject.ext.android[\"versionCode\"]\n        versionName rootProject.ext.android[\"versionName\"]\n\n        testInstrumentationRunner \"android.support.test.runner.AndroidJUnitRunner\"\n        javaCompileOptions {\n            annotationProcessorOptions {\n                arguments = [AROUTER_MODULE_NAME: project.getName()]\n            }\n        }\n    }\n\n    buildTypes {\n        release {\n            minifyEnabled false\n            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'\n        }\n    }\n\n}\n\ndependencies {\n    implementation fileTree(dir: 'libs', include: ['*.jar'])\n    androidTestImplementation 'com.android.support.test:runner:1.0.2'\n    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'\n    testImplementation rootProject.ext.dependencies[\"junit\"]\n\n    api project(':lib_common')\n    annotationProcessor rootProject.ext.dependencies[\"router-compiler\"]\n}\n"
  },
  {
    "path": "module_art/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": "module_art/src/androidTest/java/com/senon/module_art/ExampleInstrumentedTest.java",
    "content": "package com.senon.module_art;\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.senon.module_art\", appContext.getPackageName());\n    }\n}\n"
  },
  {
    "path": "module_art/src/main/debug/AndroidManifest.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    package=\"com.senon.module_art\">\n\n    <uses-permission android:name=\"android.permission.INTERNET\"/>\n\n\n    <application\n        android:name=\".App_Art\"\n        android:allowBackup=\"true\"\n        android:icon=\"@mipmap/ic_logo\"\n        android:label=\"@string/art_app_name\"\n        android:roundIcon=\"@mipmap/art_ic_launcher_round\"\n        android:supportsRtl=\"true\"\n        tools:replace=\"android:icon,label\"\n        android:theme=\"@style/AppTheme\">\n        <activity android:name=\".MainActivity\">\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 android:name=\".SplashActivity\"/>\n\n    </application>\n\n</manifest>"
  },
  {
    "path": "module_art/src/main/java/com/senon/module_art/App_Art.java",
    "content": "package com.senon.module_art;\n\nimport com.alibaba.android.arouter.launcher.ARouter;\nimport com.senon.lib_common.base.BaseApplication;\nimport com.senon.lib_common.utils.ConstantUtils;\n\n/**\n * art debug  Application\n */\npublic class App_Art extends BaseApplication {\n    @Override\n    public void onCreate() {\n        super.onCreate();\n\n        initARouter();\n    }\n\n    private void initARouter() {\n        if (ConstantUtils.isAppDebug()) {\n            //开启InstantRun之后，一定要在ARouter.init之前调用openDebug\n            ARouter.openDebug();\n            ARouter.openLog();\n        }\n        ARouter.init(this);\n    }\n}\n"
  },
  {
    "path": "module_art/src/main/java/com/senon/module_art/MainActivity.java",
    "content": "package com.senon.module_art;\n\nimport android.support.v4.app.Fragment;\nimport android.support.v4.app.FragmentManager;\nimport android.support.v4.app.FragmentPagerAdapter;\nimport android.support.v4.view.ViewPager;\nimport android.support.v7.app.AppCompatActivity;\nimport android.os.Bundle;\nimport com.alibaba.android.arouter.facade.annotation.Route;\nimport com.alibaba.android.arouter.launcher.ARouter;\nimport com.senon.lib_common.ComUtil;\nimport com.senon.lib_common.ConstantLoginArouter;\nimport com.senon.lib_common.utils.ConstantUtils;\nimport com.senon.lib_common.utils.LogUtils;\nimport com.senon.lib_common.utils.StatusBarUtils;\nimport com.senon.module_art.fragment.ArtMainFragment;\n\n/**\n * 公众号 art fragment\n */\n@Route(path = ConstantLoginArouter.PATH_ART_MAINACTIVITY)\npublic class MainActivity extends AppCompatActivity {\n    private ViewPager viewPager;\n    private FragmentManager fragmentManager;//声明fragment管理\n    private ArtMainFragment fragment;\n\n    @Override\n    protected void onCreate(Bundle savedInstanceState) {\n        super.onCreate(savedInstanceState);\n        StatusBarUtils.with(this).init();\n        setContentView(R.layout.art_activity_main);\n        ComUtil.changeStatusBarTextColor(this,true);\n\n        ARouter.getInstance().inject(this);\n        LogUtils.e(\"------->isAppDebug=====  \"+ ConstantUtils.isAppDebug());\n        findView();\n\n    }\n\n    private void findView() {\n        viewPager = findViewById(R.id.art_main_vp);\n        fragmentManager = getSupportFragmentManager();\n        fragment = new ArtMainFragment();\n        viewPager.setAdapter(new MyFragmentPagerAdapter(fragmentManager));\n\n    }\n\n\n    //FragmentPagerAdapter\n    class MyFragmentPagerAdapter extends FragmentPagerAdapter {\n        public MyFragmentPagerAdapter(FragmentManager fm) {\n            super(fm);\n        }\n        @Override\n        public Fragment getItem(int position) {\n            return fragment;\n        }\n        @Override\n        public int getCount() {\n            return 1;\n        }\n    }\n\n}\n"
  },
  {
    "path": "module_art/src/main/java/com/senon/module_art/SplashActivity.java",
    "content": "package com.senon.module_art;\n\nimport android.os.Bundle;\nimport android.support.v7.app.AppCompatActivity;\nimport android.view.View;\n\nimport com.alibaba.android.arouter.launcher.ARouter;\nimport com.senon.lib_common.ConstantLoginArouter;\n\npublic class SplashActivity extends AppCompatActivity {\n\n    @Override\n    protected void onCreate(Bundle savedInstanceState) {\n        super.onCreate(savedInstanceState);\n        setContentView(R.layout.art_activity_splash);\n\n        findViewById(R.id.art_main_login_tv).setOnClickListener(new View.OnClickListener() {\n            @Override\n            public void onClick(View view) {\n                String curUrl = ConstantLoginArouter.PATH_ART_MAINACTIVITY;\n                ARouter.getInstance().build(ConstantLoginArouter.PATH_COMMON_LOGINACTIVITY)\n                        .withString(\"targetUrl\",curUrl)\n                        .navigation();\n            }\n        });\n    }\n}\n"
  },
  {
    "path": "module_art/src/main/java/com/senon/module_art/adapter/ArtMainAdapter.java",
    "content": "package com.senon.module_art.adapter;\n\nimport android.content.Context;\nimport android.support.v7.widget.LinearLayoutManager;\nimport android.support.v7.widget.RecyclerView;\nimport android.text.Html;\nimport android.view.LayoutInflater;\nimport android.view.View;\nimport android.view.ViewGroup;\nimport android.widget.RelativeLayout;\nimport android.widget.TextView;\n\nimport com.alibaba.android.arouter.launcher.ARouter;\nimport com.senon.lib_common.ConstantArouter;\nimport com.senon.lib_common.adapter.RecycleHolder;\nimport com.senon.lib_common.adapter.RecyclerAdapter;\nimport com.senon.lib_common.bean.WXarticle;\nimport com.senon.lib_common.bean.WXchapters;\nimport com.senon.module_art.R;\nimport com.senon.module_art.fragment.ArtMainFragment;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\n\n/**\n * art主界面--列表Recycleview适配器\n */\npublic class ArtMainAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> implements View.OnClickListener {\n\n    private int ITEM_ONE = 2;\n    private int ITEM_HEAD = 1;\n    private int headViewCount = 1;\n    private OnItemClickListener onItemClickListener;\n    private Context mContext;\n    private List<WXchapters> chapters = new ArrayList<>();//公众号列表\n    private List<WXarticle.DatasBean> articles = new ArrayList<>();//公众号文章\n    private int id = ArtMainFragment.ID;\n    private boolean refreshHead = true;\n\n    public void notifyDataChanged() {\n        notifyDataSetChanged();\n    }\n\n\n    //设置公众号文章\n    public void setArticleDatas(List<WXarticle.DatasBean> datas) {\n        if (datas != null) {\n            this.articles.clear();\n            this.articles.addAll(datas);\n            notifyDataChanged();\n        }\n    }\n    //设置公众号列表\n    public void setChaptersDatas(List<WXchapters> datas,int id) {\n        if (datas != null) {\n            this.chapters.clear();\n            this.chapters.addAll(datas);\n            this.id = id;\n            notifyDataChanged();\n        }\n    }\n\n    public ArtMainAdapter(Context context) {\n        mContext = context;\n    }\n\n    @Override\n    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {\n        if (viewType == ITEM_HEAD) {\n            View view = LayoutInflater.from(mContext).inflate(R.layout.art_adapter_artmain_fragment_head, parent, false);\n            return new HeaderViewHolder(view);\n        } else if (viewType == ITEM_ONE) {\n            View view = LayoutInflater.from(mContext).inflate(R.layout.art_adapter_artmain_fragment_article, parent, false);\n            return new OneViewHolder(view);\n        }\n        return null;\n    }\n\n    @Override\n    public void onBindViewHolder(final RecyclerView.ViewHolder holder, final int mPosition) {\n        if (holder instanceof HeaderViewHolder) {\n            if(chapters.size() > 0 && refreshHead){\n                refreshHead = false;\n                ((HeaderViewHolder) holder).lrv.setLayoutManager(new LinearLayoutManager(mContext, LinearLayoutManager.HORIZONTAL, false));\n                ((HeaderViewHolder) holder).adapter = new RecyclerAdapter<WXchapters>(mContext, chapters, R.layout.art_adapter_artmain_fragment_head_item) {\n                    @Override\n                    public void convert(final RecycleHolder helper, final WXchapters item, final int position) {\n                        helper.setText(R.id.tv,item.getName());\n                        if(item.getId() == id){\n                            helper.setBackgroundRes(R.id.tv,R.drawable.art_shape_yellow_con20);\n                        }else{\n                            helper.setBackgroundRes(R.id.tv,R.drawable.art_shape_transp_con20);\n                        }\n                        helper.setTextColor(R.id.tv,item.getId() == id ? R.color.login_bg_start_1 :R.color.shallow_black);\n                        helper.setOnClickListener(R.id.tv, new View.OnClickListener() {\n                            @Override\n                            public void onClick(View v) {\n                                id = item.getId();\n                                if(onItemClickListener != null){\n                                    onItemClickListener.onHeadItemClick(v,position,item.getId());\n                                }\n                                ((HeaderViewHolder) holder).adapter.notifyDataSetChanged();\n                                for (int i = 0; i < chapters.size(); i++) {\n                                    if(id == chapters.get(i).getId()){\n                                        ((HeaderViewHolder) holder).lrv.smoothScrollToPosition(i);\n                                    }\n                                }\n                            }\n                        });\n                    }\n                };\n                ((HeaderViewHolder) holder).lrv.setAdapter(((HeaderViewHolder) holder).adapter);\n            }\n\n\n        } else if (holder instanceof OneViewHolder) {\n            //注意除去头布局\n            final int position = mPosition - 1;\n            final WXarticle.DatasBean data = articles.get(position);\n            ((OneViewHolder) holder).itemView.setTag(position);\n\n            ((OneViewHolder) holder).type_tv.setText(data.getSuperChapterName() + \"/\" + data.getChapterName());\n            ((OneViewHolder) holder).content_tv.setText(Html.fromHtml(data.getTitle()));\n            ((OneViewHolder) holder).user_tv.setText(data.getAuthor());\n            ((OneViewHolder) holder).time_tv.setText(data.getNiceDate());\n            ((OneViewHolder) holder).author_tv.setVisibility(position == 0 ? View.VISIBLE : View.GONE);\n            ((OneViewHolder) holder).art_placeholder_tv.setVisibility(position == articles.size()-1 ? View.VISIBLE : View.GONE);\n            ((OneViewHolder) holder).author_tv.setText(data.getAuthor());\n            ((OneViewHolder) holder).content_lay.setOnClickListener(new View.OnClickListener() {\n                @Override\n                public void onClick(View v) {\n                    ARouter.getInstance().build(ConstantArouter.PATH_COMMON_WEBVIEWCTIVITY)\n                            .withInt(\"id\",data.getId())\n                            .withString(\"url\",data.getLink())\n                            .withString(\"title\",data.getTitle())\n                            .withBoolean(\"isCollection\",data.isCollect())\n                            .navigation();\n                }\n            });\n\n        }\n    }\n\n    @Override\n    public int getItemCount() {\n        return articles.size() + headViewCount;\n    }\n\n    @Override\n    public int getItemViewType(int position) {\n        if (isHeadView(position)) {\n            return ITEM_HEAD;\n        }\n        return ITEM_ONE;\n    }\n\n    public boolean isHeadView(int position) {\n        return headViewCount != 0 && position < headViewCount;\n    }\n\n    @Override\n    public void onClick(View view) {\n        if (onItemClickListener != null) {\n            onItemClickListener.onItemClick(view, (Integer) view.getTag());\n        }\n    }\n\n    //公众号列表\n    class HeaderViewHolder extends RecyclerView.ViewHolder {\n        private RecyclerView lrv;\n        private RecyclerAdapter<WXchapters> adapter;\n        public HeaderViewHolder(View itemView) {\n            super(itemView);\n            lrv = itemView.findViewById(R.id.art_main_fragment_head_lrv);\n        }\n    }\n\n    //最新博文\n    class OneViewHolder extends RecyclerView.ViewHolder {\n        private RelativeLayout content_lay;\n        private TextView author_tv;\n        private TextView type_tv, content_tv, user_tv, time_tv;\n        private View art_placeholder_tv;\n\n        public OneViewHolder(View itemView) {\n            super(itemView);\n            content_lay = itemView.findViewById(R.id.content_lay);\n            author_tv = itemView.findViewById(R.id.author_tv);\n            type_tv = itemView.findViewById(R.id.type_tv);\n            content_tv = itemView.findViewById(R.id.content_tv);\n            user_tv = itemView.findViewById(R.id.user_tv);\n            time_tv = itemView.findViewById(R.id.time_tv);\n            art_placeholder_tv = itemView.findViewById(R.id.art_placeholder_tv);\n        }\n    }\n\n\n    public void setOnItemClickListener(OnItemClickListener onItemClickListener) {\n        this.onItemClickListener = onItemClickListener;\n    }\n    public interface OnItemClickListener {\n        void onHeadItemClick(View view, int position,int mId);\n        void onItemClick(View view, int position);\n    }\n\n\n}\n\n"
  },
  {
    "path": "module_art/src/main/java/com/senon/module_art/contract/ArtMainFragmentCon.java",
    "content": "package com.senon.module_art.contract;\n\nimport com.senon.lib_common.base.BasePresenter;\nimport com.senon.lib_common.base.BaseResponse;\nimport com.senon.lib_common.base.BaseViewImp;\nimport com.senon.lib_common.bean.Banner;\nimport com.senon.lib_common.bean.HomeArticle;\nimport com.senon.lib_common.bean.ProjectArticle;\nimport com.senon.lib_common.bean.WXarticle;\nimport com.senon.lib_common.bean.WXchapters;\n\nimport java.util.List;\n\n/**\n * ArtMainFragmentCon  V 、P契约类\n */\npublic interface ArtMainFragmentCon {\n\n    interface View extends BaseViewImp {\n\n        void getWXartChapResult(BaseResponse<List<WXchapters>> data);\n\n        void getWXartListResult(BaseResponse<WXarticle> data);\n\n\n    }\n\n    abstract class Presenter extends BasePresenter<View> {\n\n        public abstract void getWXarticleChapters(boolean isDialog, boolean cancelable);\n\n        public abstract void getWXarticleList(int id,int page,boolean isDialog, boolean cancelable);\n\n\n    }\n}\n"
  },
  {
    "path": "module_art/src/main/java/com/senon/module_art/fragment/ArtMainFragment.java",
    "content": "package com.senon.module_art.fragment;\n\nimport android.support.v7.widget.LinearLayoutManager;\nimport android.support.v7.widget.RecyclerView;\nimport android.view.View;\nimport android.widget.TextView;\nimport com.github.jdsjlzx.interfaces.OnLoadMoreListener;\nimport com.github.jdsjlzx.interfaces.OnRefreshListener;\nimport com.github.jdsjlzx.recyclerview.LRecyclerView;\nimport com.github.jdsjlzx.recyclerview.LRecyclerViewAdapter;\nimport com.github.jdsjlzx.recyclerview.ProgressStyle;\nimport com.scwang.smartrefresh.layout.SmartRefreshLayout;\nimport com.scwang.smartrefresh.layout.api.RefreshLayout;\nimport com.senon.lib_common.ComUtil;\nimport com.senon.lib_common.base.BaseLazyFragment;\nimport com.senon.lib_common.base.BaseResponse;\nimport com.senon.lib_common.bean.Banner;\nimport com.senon.lib_common.bean.HomeArticle;\nimport com.senon.lib_common.bean.ProjectArticle;\nimport com.senon.lib_common.bean.WXarticle;\nimport com.senon.lib_common.bean.WXchapters;\nimport com.senon.lib_common.utils.BaseEvent;\nimport com.senon.lib_common.utils.LogUtils;\nimport com.senon.lib_common.utils.ToastUtil;\nimport com.senon.module_art.R;\nimport com.senon.module_art.adapter.ArtMainAdapter;\nimport com.senon.module_art.contract.ArtMainFragmentCon;\nimport com.senon.module_art.presenter.ArtMainFragmentPre;\nimport org.greenrobot.eventbus.EventBus;\nimport org.greenrobot.eventbus.Subscribe;\nimport org.greenrobot.eventbus.ThreadMode;\nimport java.util.ArrayList;\nimport java.util.List;\n\n/**\n * art mian fragment\n */\npublic class ArtMainFragment extends BaseLazyFragment<ArtMainFragmentCon.View, ArtMainFragmentCon.Presenter> implements\n        ArtMainFragmentCon.View {\n\n    public final static int ID = -1;\n    private final static int PAGE = 1;\n    private RecyclerView lrv;\n    private SmartRefreshLayout home_refreshLayout;\n    private TextView home_homefragment_title_tv;\n    private List<WXchapters> chapters = new ArrayList<>();\n    private WXarticle articles;\n    private int page = PAGE;//公众号页码\n    private int id = ID;//公众号id\n    private ArtMainAdapter adapter;\n    private LinearLayoutManager layoutManager;\n\n\n    @Override\n    public int getLayoutId() {\n        return R.layout.art_fragment_main;\n    }\n    @Override\n    public ArtMainFragmentCon.Presenter createPresenter() {\n        return new ArtMainFragmentPre(mContext);\n    }\n    @Override\n    public ArtMainFragmentCon.View createView() {\n        return this;\n    }\n    @Override\n    public void init(View rootView) {\n        lrv = rootView.findViewById(R.id.home_homefragment_lrv);\n        home_refreshLayout = rootView.findViewById(R.id.home_refreshLayout);\n        home_homefragment_title_tv = rootView.findViewById(R.id.home_homefragment_title_tv);\n        home_homefragment_title_tv.setOnClickListener(new View.OnClickListener() {\n            @Override\n            public void onClick(View v) {\n                if(lrv != null && adapter!= null){\n                    lrv.smoothScrollToPosition(0);\n                }\n            }\n        });\n    }\n\n    @Override\n    public void onFragmentFirst() {\n        super.onFragmentFirst();\n        //第一次可见时，自动加载页面\n        LogUtils.e(\"-----> 子fragment进行初始化操作\");\n\n        EventBus.getDefault().register(this);\n\n        //初始化adapter 设置适配器\n        initAdapter();\n\n        //添加滑动位置监听\n        addLrvListener();\n\n    }\n\n    private void addLrvListener() {\n        lrv.addOnScrollListener(new RecyclerView.OnScrollListener() {\n            @Override\n            public void onScrolled(RecyclerView recyclerView, int dx, int dy) {\n                super.onScrolled(recyclerView, dx, dy);\n                //在此做处理\n                if (null != layoutManager) {\n                    //当前条目索引\n                    int position = layoutManager.findFirstVisibleItemPosition();\n                    if(position > 1){\n                        home_homefragment_title_tv.setVisibility(View.VISIBLE);\n                    }else{\n                        //根据view的高度来做显示隐藏判断\n                        //根据索引来获取对应的itemView\n                        View firstVisiableChildView = layoutManager.findViewByPosition(position);\n                        //获取当前显示条目的高度\n                        int itemHeight = firstVisiableChildView.getHeight();\n                        //获取当前Recyclerview 偏移量\n                        int offset = - firstVisiableChildView.getTop();\n                        if (offset > itemHeight / 4) {\n                            //做显示布局操作\n                            home_homefragment_title_tv.setVisibility(View.VISIBLE);\n                        } else {\n                            //做隐藏布局操作\n                            home_homefragment_title_tv.setVisibility(View.GONE);\n                        }\n                    }\n                }\n            }\n        });\n    }\n\n    private void initAdapter() {\n        adapter = new ArtMainAdapter(mContext);\n        layoutManager = new LinearLayoutManager(mContext, LinearLayoutManager.VERTICAL, false);\n        lrv.setLayoutManager(layoutManager);\n        lrv.setAdapter(adapter);\n\n        home_refreshLayout.setOnRefreshListener(new com.scwang.smartrefresh.layout.listener.OnRefreshListener() {\n            @Override\n            public void onRefresh(RefreshLayout refreshlayout) {\n                getWXarticleChapters();\n            }\n        });\n        home_refreshLayout.setOnLoadMoreListener(new com.scwang.smartrefresh.layout.listener.OnLoadMoreListener() {\n            @Override\n            public void onLoadMore(RefreshLayout refreshlayout) {\n                getWXarticleList(id,++page);\n            }\n        });\n\n        adapter.setOnItemClickListener(new ArtMainAdapter.OnItemClickListener() {\n            @Override\n            public void onHeadItemClick(View view, int position,int mId) {\n                id = mId;\n                page = PAGE;//初始化页码为第一页\n                getWXarticleList(id,page);\n            }\n            @Override\n            public void onItemClick(View view, int position) {\n            }\n        });\n\n        home_refreshLayout.autoRefresh(100);\n    }\n\n    //获取公众号列表\n    private void getWXarticleChapters(){\n        getPresenter().getWXarticleChapters(false, true);\n    }\n\n    //查看某个公众号历史数据\n    private void getWXarticleList(int id,int page){\n        getPresenter().getWXarticleList(id,page,false, true);\n    }\n\n    //完成数据加载\n    private void refreshData(){\n        home_refreshLayout.finishRefresh();\n        home_refreshLayout.finishLoadMore();\n        adapter.notifyDataChanged();\n    }\n\n    @Override\n    public void onFragmentVisble() {\n        super.onFragmentVisble();\n        //之后每次可见的操作\n        LogUtils.e(\"-----> 子fragment每次可见时的操作\");\n\n    }\n\n\n    @Override\n    public void getWXartChapResult(BaseResponse<List<WXchapters>> data) {\n        if(data.getData() != null && !data.getData().isEmpty()){\n            chapters.clear();\n            chapters.addAll(data.getData());\n\n            if(id == ID){\n                id = chapters.get(0).getId();//初始id为第一个id\n            }\n\n            adapter.setChaptersDatas(chapters,id);\n\n            page = PAGE;//初始化页码为第一页\n            getWXarticleList(id,page);\n\n        }\n\n    }\n\n\n    @Override\n    public void getWXartListResult(BaseResponse<WXarticle> data) {\n        if(data.getData().getDatas() != null && !data.getData().getDatas().isEmpty()){\n            if(page == PAGE){\n                articles = data.getData();\n            }else{\n                articles.getDatas().addAll(data.getData().getDatas());\n            }\n\n            adapter.setArticleDatas(articles.getDatas());\n        }\n\n        refreshData();\n    }\n\n    @Override\n    public void onDestroyView() {\n        super.onDestroyView();\n        EventBus.getDefault().unregister(this);\n    }\n\n    @Subscribe(threadMode = ThreadMode.MAIN) //在ui线程执行\n    public void onEventReceived(BaseEvent event) {\n        if(event.getCode() == 1){//退出登录  刷新列表\n            getWXarticleChapters();\n        }else if (event.getCode() == 101) {\n            int id = event.getId();\n            boolean isCollect = event.isCollect();\n            for (WXarticle.DatasBean bean : articles.getDatas()) {\n                if(bean.getId() == id){\n                    bean.setCollect(isCollect);\n\n                    adapter.notifyDataChanged();\n                    return;\n                }\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "module_art/src/main/java/com/senon/module_art/presenter/ArtMainFragmentPre.java",
    "content": "package com.senon.module_art.presenter;\n\nimport android.content.Context;\nimport com.senon.lib_common.base.BaseResponse;\nimport com.senon.lib_common.bean.Banner;\nimport com.senon.lib_common.bean.HomeArticle;\nimport com.senon.lib_common.bean.ProjectArticle;\nimport com.senon.lib_common.bean.WXarticle;\nimport com.senon.lib_common.bean.WXchapters;\nimport com.senon.lib_common.net.ServerUtils;\nimport com.senon.lib_common.net.callback.RequestCallback;\nimport com.senon.lib_common.net.callback.RxErrorHandler;\nimport com.senon.lib_common.utils.RetryWithDelay;\nimport com.senon.lib_common.utils.RxUtils;\nimport com.senon.lib_common.utils.ToastUtil;\nimport com.senon.module_art.contract.ArtMainFragmentCon;\nimport java.util.List;\n\n/**\n * HomeMainFragmentCon  P\n */\npublic class ArtMainFragmentPre extends ArtMainFragmentCon.Presenter{\n\n    private Context context;\n    public ArtMainFragmentPre(Context context) {\n        this.context = context;\n    }\n\n    @Override\n    public void getWXarticleChapters(boolean isDialog, boolean cancelable) {\n        ServerUtils.getCommonApi().getWXarticleChapters()\n                .retryWhen(new RetryWithDelay(3,2))\n                .compose(RxUtils.<BaseResponse<List<WXchapters>>>bindToLifecycle(getView()))\n                .compose(RxUtils.<BaseResponse<List<WXchapters>>>getSchedulerTransformer())\n                .subscribe(new RequestCallback<BaseResponse<List<WXchapters>>>(context, RxErrorHandler.getInstance(),isDialog,cancelable) {\n                    @Override\n                    public void onNext(BaseResponse<List<WXchapters>> baseResponse) {\n                        super.onNext(baseResponse);\n                        if(baseResponse.getCode() == 0){\n                            getView().getWXartChapResult(baseResponse);\n                        }else{\n                            ToastUtil.initToast(baseResponse.getMsg());\n                        }\n                    }\n                    @Override\n                    public void onError(Throwable e) {\n                        super.onError(e);\n                    }\n                });\n    }\n\n    @Override\n    public void getWXarticleList(int id,int page, boolean isDialog, boolean cancelable) {\n        ServerUtils.getCommonApi().getWXarticleList(id,page)\n                .retryWhen(new RetryWithDelay(3,2))\n                .compose(RxUtils.<BaseResponse<WXarticle>>bindToLifecycle(getView()))\n                .compose(RxUtils.<BaseResponse<WXarticle>>getSchedulerTransformer())\n                .subscribe(new RequestCallback<BaseResponse<WXarticle>>(context, RxErrorHandler.getInstance(),isDialog,cancelable) {\n                    @Override\n                    public void onNext(BaseResponse<WXarticle> baseResponse) {\n                        super.onNext(baseResponse);\n                        if(baseResponse.getCode() == 0){\n                            getView().getWXartListResult(baseResponse);\n                        }else{\n                            ToastUtil.initToast(baseResponse.getMsg());\n                        }\n                    }\n                    @Override\n                    public void onError(Throwable e) {\n                        super.onError(e);\n                    }\n                });\n\n    }\n}\n"
  },
  {
    "path": "module_art/src/main/release/AndroidManifest.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    package=\"com.senon.module_art\">\n\n    <uses-permission android:name=\"android.permission.INTERNET\"/>\n\n    <application\n        android:allowBackup=\"true\"\n        >\n        <activity android:name=\"com.senon.module_art.MainActivity\">\n            <intent-filter>\n                <category android:name=\"android.intent.category.DEFAULT\" />\n                <category android:name=\"android.intent.category.BROWSABLE\" />\n\n                <action android:name=\"android.intent.action.VIEW\" />\n                <data android:host=\"com.senon.module_art\"\n                    android:scheme=\"router\" />\n            </intent-filter>\n        </activity>\n    </application>\n\n</manifest>"
  },
  {
    "path": "module_art/src/main/res/drawable/art_launcher_background.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"108dp\"\n    android:height=\"108dp\"\n    android:viewportHeight=\"108\"\n    android:viewportWidth=\"108\">\n    <path\n        android:fillColor=\"#26A69A\"\n        android:pathData=\"M0,0h108v108h-108z\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M9,0L9,108\"\n        android:strokeColor=\"#33FFFFFF\"\n        android:strokeWidth=\"0.8\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M19,0L19,108\"\n        android:strokeColor=\"#33FFFFFF\"\n        android:strokeWidth=\"0.8\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M29,0L29,108\"\n        android:strokeColor=\"#33FFFFFF\"\n        android:strokeWidth=\"0.8\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M39,0L39,108\"\n        android:strokeColor=\"#33FFFFFF\"\n        android:strokeWidth=\"0.8\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M49,0L49,108\"\n        android:strokeColor=\"#33FFFFFF\"\n        android:strokeWidth=\"0.8\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M59,0L59,108\"\n        android:strokeColor=\"#33FFFFFF\"\n        android:strokeWidth=\"0.8\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M69,0L69,108\"\n        android:strokeColor=\"#33FFFFFF\"\n        android:strokeWidth=\"0.8\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M79,0L79,108\"\n        android:strokeColor=\"#33FFFFFF\"\n        android:strokeWidth=\"0.8\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M89,0L89,108\"\n        android:strokeColor=\"#33FFFFFF\"\n        android:strokeWidth=\"0.8\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M99,0L99,108\"\n        android:strokeColor=\"#33FFFFFF\"\n        android:strokeWidth=\"0.8\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M0,9L108,9\"\n        android:strokeColor=\"#33FFFFFF\"\n        android:strokeWidth=\"0.8\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M0,19L108,19\"\n        android:strokeColor=\"#33FFFFFF\"\n        android:strokeWidth=\"0.8\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M0,29L108,29\"\n        android:strokeColor=\"#33FFFFFF\"\n        android:strokeWidth=\"0.8\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M0,39L108,39\"\n        android:strokeColor=\"#33FFFFFF\"\n        android:strokeWidth=\"0.8\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M0,49L108,49\"\n        android:strokeColor=\"#33FFFFFF\"\n        android:strokeWidth=\"0.8\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M0,59L108,59\"\n        android:strokeColor=\"#33FFFFFF\"\n        android:strokeWidth=\"0.8\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M0,69L108,69\"\n        android:strokeColor=\"#33FFFFFF\"\n        android:strokeWidth=\"0.8\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M0,79L108,79\"\n        android:strokeColor=\"#33FFFFFF\"\n        android:strokeWidth=\"0.8\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M0,89L108,89\"\n        android:strokeColor=\"#33FFFFFF\"\n        android:strokeWidth=\"0.8\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M0,99L108,99\"\n        android:strokeColor=\"#33FFFFFF\"\n        android:strokeWidth=\"0.8\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M19,29L89,29\"\n        android:strokeColor=\"#33FFFFFF\"\n        android:strokeWidth=\"0.8\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M19,39L89,39\"\n        android:strokeColor=\"#33FFFFFF\"\n        android:strokeWidth=\"0.8\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M19,49L89,49\"\n        android:strokeColor=\"#33FFFFFF\"\n        android:strokeWidth=\"0.8\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M19,59L89,59\"\n        android:strokeColor=\"#33FFFFFF\"\n        android:strokeWidth=\"0.8\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M19,69L89,69\"\n        android:strokeColor=\"#33FFFFFF\"\n        android:strokeWidth=\"0.8\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M19,79L89,79\"\n        android:strokeColor=\"#33FFFFFF\"\n        android:strokeWidth=\"0.8\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M29,19L29,89\"\n        android:strokeColor=\"#33FFFFFF\"\n        android:strokeWidth=\"0.8\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M39,19L39,89\"\n        android:strokeColor=\"#33FFFFFF\"\n        android:strokeWidth=\"0.8\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M49,19L49,89\"\n        android:strokeColor=\"#33FFFFFF\"\n        android:strokeWidth=\"0.8\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M59,19L59,89\"\n        android:strokeColor=\"#33FFFFFF\"\n        android:strokeWidth=\"0.8\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M69,19L69,89\"\n        android:strokeColor=\"#33FFFFFF\"\n        android:strokeWidth=\"0.8\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M79,19L79,89\"\n        android:strokeColor=\"#33FFFFFF\"\n        android:strokeWidth=\"0.8\" />\n</vector>\n"
  },
  {
    "path": "module_art/src/main/res/drawable/art_shape_transp_con20.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<shape xmlns:android=\"http://schemas.android.com/apk/res/android\" >\n\n    <!-- view背景色 -->\n    <solid android:color=\"@color/common_white\" />\n    <!-- 边框圆角 -->\n    <corners\n        android:radius=\"@dimen/mm30\" />\n    <stroke android:width=\"@dimen/mm2\"\n        android:color=\"@color/common_yellow\"/>\n</shape>"
  },
  {
    "path": "module_art/src/main/res/drawable/art_shape_white_con30.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<shape xmlns:android=\"http://schemas.android.com/apk/res/android\" >\n\n    <!-- view背景色 -->\n    <solid android:color=\"@color/common_white\" />\n    <!--<solid android:color=\"#000\" />-->\n    <!-- 边框圆角 -->\n    <corners\n        android:radius=\"@dimen/mm15\" />\n\n</shape>"
  },
  {
    "path": "module_art/src/main/res/drawable/art_shape_yellow_con20.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<shape xmlns:android=\"http://schemas.android.com/apk/res/android\" >\n\n    <!-- view背景色 -->\n    <solid android:color=\"@color/common_yellow\" />\n    <!--<solid android:color=\"#000\" />-->\n    <!-- 边框圆角 -->\n    <corners\n        android:radius=\"@dimen/mm30\" />\n    <stroke android:width=\"@dimen/mm2\"\n        android:color=\"@color/login_bg_start_1\"/>\n</shape>"
  },
  {
    "path": "module_art/src/main/res/layout/art_activity_main.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    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    tools:context=\"com.senon.module_art.MainActivity\">\n\n\n    <android.support.v4.view.ViewPager\n        android:id=\"@+id/art_main_vp\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"/>\n\n</RelativeLayout>\n"
  },
  {
    "path": "module_art/src/main/res/layout/art_activity_splash.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    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    tools:context=\"com.senon.module_art.MainActivity\">\n\n    <TextView\n        android:id=\"@+id/art_main_login_tv\"\n        android:background=\"#d4cccc\"\n        android:layout_centerInParent=\"true\"\n        android:padding=\"@dimen/mm10\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:text=\"跳转到登录\"\n        android:textSize=\"@dimen/mm30\"\n        />\n\n</RelativeLayout>\n"
  },
  {
    "path": "module_art/src/main/res/layout/art_adapter_artmain_fragment_article.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:layout_width=\"match_parent\" android:layout_height=\"wrap_content\">\n\n\n    <TextView\n        android:id=\"@+id/author_tv\"\n        android:layout_marginTop=\"@dimen/mm30\"\n        android:gravity=\"center_vertical\"\n        android:textStyle=\"bold\"\n        android:layout_marginLeft=\"@dimen/mm20\"\n        android:textColor=\"@color/color_232323\"\n        android:text=\"作者\"\n        android:textSize=\"@dimen/mm40\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"@dimen/mm80\" />\n\n    <RelativeLayout\n        android:background=\"@drawable/art_shape_white_con30\"\n        android:id=\"@+id/content_lay\"\n        android:layout_marginTop=\"@dimen/mm15\"\n        android:layout_below=\"@+id/author_tv\"\n        android:layout_marginLeft=\"@dimen/mm20\"\n        android:layout_marginRight=\"@dimen/mm20\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\">\n        <TextView\n            android:id=\"@+id/type_tv\"\n            android:layout_marginTop=\"@dimen/mm15\"\n            android:layout_marginLeft=\"@dimen/mm20\"\n            android:layout_marginRight=\"@dimen/mm20\"\n            android:textColor=\"@color/common_black_777\"\n            android:text=\"分类\"\n            android:textSize=\"@dimen/mm26\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\" />\n        <TextView\n            android:id=\"@+id/content_tv\"\n            android:singleLine=\"true\"\n            android:layout_below=\"@+id/type_tv\"\n            android:layout_marginTop=\"@dimen/mm7\"\n            android:layout_marginLeft=\"@dimen/mm20\"\n            android:layout_marginRight=\"@dimen/mm20\"\n            android:textColor=\"@color/color_232323\"\n            android:text=\"标题\"\n            android:textSize=\"@dimen/mm32\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\" />\n        <TextView\n            android:layout_below=\"@+id/content_tv\"\n            android:id=\"@+id/user_tv\"\n            android:layout_marginTop=\"@dimen/mm7\"\n            android:layout_marginLeft=\"@dimen/mm20\"\n            android:layout_marginRight=\"@dimen/mm30\"\n            android:layout_marginBottom=\"@dimen/mm15\"\n            android:textColor=\"@color/common_black_999\"\n            android:text=\"姓名\"\n            android:textSize=\"@dimen/mm24\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\" />\n        <TextView\n            android:layout_toRightOf=\"@+id/user_tv\"\n            android:layout_below=\"@+id/content_tv\"\n            android:id=\"@+id/time_tv\"\n            android:layout_marginTop=\"@dimen/mm7\"\n            android:layout_marginRight=\"@dimen/mm30\"\n            android:textColor=\"@color/common_black_999\"\n            android:text=\"时间\"\n            android:textSize=\"@dimen/mm24\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\" />\n\n    </RelativeLayout>\n\n    <View\n        android:layout_below=\"@+id/content_lay\"\n        android:id=\"@+id/art_placeholder_tv\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"@dimen/mm50\"/>\n\n</RelativeLayout>"
  },
  {
    "path": "module_art/src/main/res/layout/art_adapter_artmain_fragment_head.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\">\n\n    <TextView\n        android:textStyle=\"bold\"\n        android:id=\"@+id/textview\"\n        android:layout_marginTop=\"@dimen/mm40\"\n        android:layout_marginLeft=\"@dimen/mm20\"\n        android:text=\"公众号\"\n        android:textSize=\"@dimen/mm56\"\n        android:textColor=\"@color/transport_3\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\" />\n\n    <android.support.v7.widget.RecyclerView\n        android:layout_marginLeft=\"@dimen/mm20\"\n        android:layout_marginRight=\"@dimen/mm20\"\n        android:layout_marginTop=\"@dimen/mm50\"\n        android:layout_below=\"@+id/textview\"\n        android:id=\"@+id/art_main_fragment_head_lrv\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"/>\n</RelativeLayout>"
  },
  {
    "path": "module_art/src/main/res/layout/art_adapter_artmain_fragment_head_item.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:layout_width=\"wrap_content\"\n    android:layout_height=\"wrap_content\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\">\n\n    <TextView\n        android:layout_margin=\"@dimen/mm10\"\n        android:id=\"@+id/tv\"\n        android:paddingLeft=\"@dimen/mm25\"\n        android:paddingRight=\"@dimen/mm25\"\n        android:paddingTop=\"@dimen/mm10\"\n        android:paddingBottom=\"@dimen/mm10\"\n        android:text=\"公众号\"\n        android:textSize=\"@dimen/mm36\"\n        android:textColor=\"@color/shallow_black\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\" />\n\n</RelativeLayout>"
  },
  {
    "path": "module_art/src/main/res/layout/art_fragment_main.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=\"match_parent\"\n    android:orientation=\"vertical\">\n\n    <TextView\n        android:id=\"@+id/placeholder\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"@dimen/mm40\" />\n\n    <RelativeLayout\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        android:layout_below=\"@+id/placeholder\">\n\n        <com.scwang.smartrefresh.layout.SmartRefreshLayout\n            android:id=\"@+id/home_refreshLayout\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"match_parent\"\n            app:srlEnablePreviewInEditMode=\"true\">\n\n            <android.support.v7.widget.RecyclerView\n                android:id=\"@+id/home_homefragment_lrv\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"match_parent\" />\n\n        </com.scwang.smartrefresh.layout.SmartRefreshLayout>\n\n        <ImageView\n            android:id=\"@+id/empty_igv\"\n            android:layout_width=\"@dimen/mm350\"\n            android:layout_height=\"@dimen/mm350\"\n            android:layout_centerInParent=\"true\"\n            android:visibility=\"gone\" />\n\n        <TextView\n            android:id=\"@+id/home_homefragment_title_tv\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"@dimen/mm90\"\n            android:background=\"@color/common_white\"\n            android:gravity=\"center\"\n            android:text=\"公众号\"\n            android:textColor=\"@color/color_232323\"\n            android:textSize=\"@dimen/mm42\"\n            android:visibility=\"gone\" />\n\n    </RelativeLayout>\n\n</RelativeLayout>\n"
  },
  {
    "path": "module_art/src/main/res/values/colors.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n\n</resources>\n"
  },
  {
    "path": "module_art/src/main/res/values/strings.xml",
    "content": "<resources>\n    <string name=\"art_app_name\">玩安卓_公众号</string>\n</resources>\n"
  },
  {
    "path": "module_art/src/main/res/values/styles.xml",
    "content": "<resources>\n\n    <!-- Base application theme. -->\n    <style name=\"ArtAppTheme\" 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    </style>\n\n</resources>\n"
  },
  {
    "path": "module_art/src/test/java/com/senon/module_art/ExampleUnitTest.java",
    "content": "package com.senon.module_art;\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": "module_home/.gitignore",
    "content": "/build\n"
  },
  {
    "path": "module_home/build.gradle",
    "content": "if (isBuildModule.toBoolean()) {\n    apply plugin: 'com.android.application'\n} else {\n    apply plugin: 'com.android.library'\n}\n\nandroid {\n    compileSdkVersion rootProject.ext.android[\"compileSdkVersion\"]\n\n    resourcePrefix \"home_\"\n\n    sourceSets {\n        main {\n            if (isBuildModule.toBoolean()) {\n                manifest.srcFile 'src/main/debug/AndroidManifest.xml'\n            } else {\n                manifest.srcFile 'src/main/release/AndroidManifest.xml'\n                java {\n                    //全部Module一起编译的时候剔除debug目录\n                    exclude '**/**/debug/**'\n                }\n            }\n        }\n    }\n\n    defaultConfig {\n        if (isBuildModule.toBoolean()) {\n            applicationId \"com.senon.module_home\"\n        }\n        minSdkVersion rootProject.ext.android[\"minSdkVersion\"]\n        targetSdkVersion rootProject.ext.android[\"targetSdkVersion\"]\n        versionCode rootProject.ext.android[\"versionCode\"]\n        versionName rootProject.ext.android[\"versionName\"]\n\n        testInstrumentationRunner \"android.support.test.runner.AndroidJUnitRunner\"\n        javaCompileOptions {\n            annotationProcessorOptions {\n                arguments = [AROUTER_MODULE_NAME: project.getName()]\n            }\n        }\n    }\n\n    buildTypes {\n        release {\n            minifyEnabled false\n            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'\n        }\n    }\n\n}\n\ndependencies {\n    implementation fileTree(dir: 'libs', include: ['*.jar'])\n    implementation 'com.android.support.constraint:constraint-layout:1.1.3'\n    androidTestImplementation 'com.android.support.test:runner:1.0.2'\n    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'\n    testImplementation rootProject.ext.dependencies[\"junit\"]\n\n    api project(':lib_common')\n    annotationProcessor rootProject.ext.dependencies[\"router-compiler\"]\n    api rootProject.ext.dependencies[\"bannerview\"]\n\n\n}\n"
  },
  {
    "path": "module_home/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": "module_home/src/androidTest/java/com/senon/module_home/ExampleInstrumentedTest.java",
    "content": "package com.senon.module_home;\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.senon.module_home\", appContext.getPackageName());\n    }\n}\n"
  },
  {
    "path": "module_home/src/main/debug/AndroidManifest.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    package=\"com.senon.module_home\">\n\n    <uses-permission android:name=\"android.permission.INTERNET\" />\n\n    <application\n        android:name=\".App_Home\"\n        android:allowBackup=\"true\"\n        android:icon=\"@mipmap/ic_logo\"\n        android:label=\"@string/home_app_name\"\n        android:roundIcon=\"@mipmap/home_ic_launcher_round\"\n        android:supportsRtl=\"true\"\n        android:theme=\"@style/AppTheme\"\n        tools:replace=\"android:icon,label\">\n        <activity android:name=\".MainActivity\">\n            <intent-filter>\n                <action android:name=\"android.intent.action.MAIN\" />\n\n                <category android:name=\"android.intent.category.LAUNCHER\" />\n            </intent-filter>\n        </activity>\n        <activity android:name=\".SplashActivity\"></activity>\n        <activity android:name=\".activity.HomeArticleActivity\"></activity>\n        <activity android:name=\".activity.HomeProjectActivity\"></activity>\n    </application>\n\n</manifest>"
  },
  {
    "path": "module_home/src/main/java/com/senon/module_home/App_Home.java",
    "content": "package com.senon.module_home;\n\nimport com.alibaba.android.arouter.launcher.ARouter;\nimport com.senon.lib_common.base.BaseApplication;\nimport com.senon.lib_common.utils.ConstantUtils;\n\n/**\n * home debug  Application\n */\npublic class App_Home extends BaseApplication {\n    @Override\n    public void onCreate() {\n        super.onCreate();\n\n        initARouter();\n    }\n\n    private void initARouter() {\n        if (ConstantUtils.isAppDebug()) {\n            //开启InstantRun之后，一定要在ARouter.init之前调用openDebug\n            ARouter.openDebug();\n            ARouter.openLog();\n        }\n        ARouter.init(this);\n    }\n}\n"
  },
  {
    "path": "module_home/src/main/java/com/senon/module_home/MainActivity.java",
    "content": "package com.senon.module_home;\n\nimport android.os.Bundle;\nimport android.support.v4.app.Fragment;\nimport android.support.v4.app.FragmentManager;\nimport android.support.v4.app.FragmentPagerAdapter;\nimport android.support.v4.view.ViewPager;\nimport android.support.v7.app.AppCompatActivity;\nimport com.alibaba.android.arouter.facade.annotation.Route;\nimport com.alibaba.android.arouter.launcher.ARouter;\nimport com.senon.lib_common.ComUtil;\nimport com.senon.lib_common.ConstantLoginArouter;\nimport com.senon.lib_common.utils.ConstantUtils;\nimport com.senon.lib_common.utils.LogUtils;\nimport com.senon.lib_common.utils.StatusBarUtils;\nimport com.senon.module_home.fragment.HomeMainFragment;\n\n/**\n * home 首页\n */\n@Route(path = ConstantLoginArouter.PATH_HOME_MAINACTIVITY)\npublic class MainActivity extends AppCompatActivity {\n\n    private ViewPager viewPager;\n    private FragmentManager fragmentManager;//声明fragment管理\n    private HomeMainFragment fragment;\n\n    @Override\n    protected void onCreate(Bundle savedInstanceState) {\n        super.onCreate(savedInstanceState);\n        StatusBarUtils.with(this).init();\n        setContentView(R.layout.home_activity_main);\n        ComUtil.changeStatusBarTextColor(this,true);\n\n        ARouter.getInstance().inject(this);\n        LogUtils.e(\"------->isAppDebug=====  \"+ ConstantUtils.isAppDebug());\n        findView();\n\n    }\n\n    private void findView() {\n        viewPager = findViewById(R.id.home_main_vp);\n        fragmentManager = getSupportFragmentManager();\n        fragment = new HomeMainFragment();\n        viewPager.setAdapter(new MyFragmentPagerAdapter(fragmentManager));\n\n    }\n\n\n    //FragmentPagerAdapter\n    class MyFragmentPagerAdapter extends FragmentPagerAdapter {\n        public MyFragmentPagerAdapter(FragmentManager fm) {\n            super(fm);\n        }\n        @Override\n        public Fragment getItem(int position) {\n            return fragment;\n        }\n        @Override\n        public int getCount() {\n            return 1;\n        }\n    }\n\n}\n"
  },
  {
    "path": "module_home/src/main/java/com/senon/module_home/SplashActivity.java",
    "content": "package com.senon.module_home;\n\nimport android.support.v7.app.AppCompatActivity;\nimport android.os.Bundle;\nimport android.view.View;\n\nimport com.alibaba.android.arouter.launcher.ARouter;\nimport com.senon.lib_common.ConstantLoginArouter;\n\npublic class SplashActivity extends AppCompatActivity {\n\n    @Override\n    protected void onCreate(Bundle savedInstanceState) {\n        super.onCreate(savedInstanceState);\n        setContentView(R.layout.home_activity_splash);\n\n        findViewById(R.id.home_main_login_tv).setOnClickListener(new View.OnClickListener() {\n            @Override\n            public void onClick(View view) {\n                String curUrl = ConstantLoginArouter.PATH_HOME_MAINACTIVITY;\n                ARouter.getInstance().build(ConstantLoginArouter.PATH_COMMON_LOGINACTIVITY)\n                        .withString(\"targetUrl\",curUrl)\n                        .navigation();\n            }\n        });\n    }\n}\n"
  },
  {
    "path": "module_home/src/main/java/com/senon/module_home/activity/HomeArticleActivity.java",
    "content": "package com.senon.module_home.activity;\n\nimport android.support.v7.widget.LinearLayoutManager;\nimport android.text.Html;\nimport android.view.View;\nimport android.widget.TextView;\n\nimport com.alibaba.android.arouter.facade.annotation.Route;\nimport com.alibaba.android.arouter.launcher.ARouter;\nimport com.github.jdsjlzx.interfaces.OnLoadMoreListener;\nimport com.github.jdsjlzx.interfaces.OnRefreshListener;\nimport com.github.jdsjlzx.recyclerview.LRecyclerView;\nimport com.github.jdsjlzx.recyclerview.LRecyclerViewAdapter;\nimport com.github.jdsjlzx.recyclerview.ProgressStyle;\nimport com.senon.lib_common.ComUtil;\nimport com.senon.lib_common.ConstantArouter;\nimport com.senon.lib_common.ConstantLoginArouter;\nimport com.senon.lib_common.adapter.RecycleHolder;\nimport com.senon.lib_common.adapter.RecyclerAdapter;\nimport com.senon.lib_common.base.BaseActivity;\nimport com.senon.lib_common.base.BaseResponse;\nimport com.senon.lib_common.bean.HomeArticle;\nimport com.senon.lib_common.bean.ProjectArticle;\nimport com.senon.lib_common.utils.BaseEvent;\nimport com.senon.lib_common.utils.StatusBarUtils;\nimport com.senon.module_home.R;\nimport com.senon.module_home.contract.HomeArticleActivityCon;\nimport com.senon.module_home.presenter.HomeArticleActivityPre;\n\nimport org.greenrobot.eventbus.EventBus;\nimport org.greenrobot.eventbus.Subscribe;\nimport org.greenrobot.eventbus.ThreadMode;\n\nimport java.util.ArrayList;\nimport java.util.HashMap;\nimport java.util.List;\n\nimport retrofit2.http.HEAD;\n\n/**\n * 最新博文列表页\n */\n\n@Route(path = ConstantArouter.PATH_HOME_HOMEARTICLEACTIVITY)\npublic class HomeArticleActivity extends BaseActivity<HomeArticleActivityCon.View,HomeArticleActivityCon.Presenter> implements\n        HomeArticleActivityCon.View {\n\n    private LRecyclerView lrv;\n    private TextView toolbar_title_tv;\n    private boolean isLoadMore = false;//是否加载更多\n    private boolean isDownRefesh = false;//是否下拉刷新\n    private int currentPage = 0;//当前页数\n    private RecyclerAdapter<HomeArticle.DatasBean> adapter;\n    private HomeArticle articles;\n    private ArrayList<HomeArticle.DatasBean> mData = new ArrayList<>();//原始数据\n    private ArrayList<HomeArticle.DatasBean> tempData = new ArrayList<>();//间接数据\n    private LRecyclerViewAdapter mLRecyclerViewAdapter;//Lrecyclerview的包装适配器\n\n    @Override\n    public int getLayoutId() {\n        StatusBarUtils.with(this).init();\n        return R.layout.home_activity_home_article;\n    }\n    @Override\n    public HomeArticleActivityCon.Presenter createPresenter() {\n        return new HomeArticleActivityPre(this);\n    }\n    @Override\n    public HomeArticleActivityCon.View createView() {\n        return this;\n    }\n\n    @Override\n    public void init() {\n        ComUtil.changeStatusBarTextColor(this,true);\n        EventBus.getDefault().register(this);\n\n        lrv = findViewById(R.id.lrv);\n        toolbar_title_tv = ((TextView)findViewById(R.id.toolbar_title_tv));\n        toolbar_title_tv.setText(\"最新博文\");\n        toolbar_title_tv.setOnClickListener(new View.OnClickListener() {\n            @Override\n            public void onClick(View v) {\n                lrv.smoothScrollToPosition(0);\n            }\n        });\n        findViewById(R.id.toolbar_back_igv).setOnClickListener(new View.OnClickListener() {\n            @Override\n            public void onClick(View v) {\n                finish();\n            }\n        });\n\n        initLRecyclerVeiw();\n    }\n\n    private void initLRecyclerVeiw() {\n        LinearLayoutManager manager = new LinearLayoutManager(this);\n        lrv.setLayoutManager(manager);\n        lrv.setRefreshProgressStyle(ProgressStyle.LineSpinFadeLoader); //设置下拉刷新Progress的样式\n        lrv.setArrowImageView(R.mipmap.news_renovate);  //设置下拉刷新箭头\n        lrv.setLoadingMoreProgressStyle(ProgressStyle.BallSpinFadeLoader);\n        adapter = new RecyclerAdapter<HomeArticle.DatasBean>(this, mData,R.layout.home_adapter_homemain_fragment_article) {\n            @Override\n            public void convert(final RecycleHolder helper, final HomeArticle.DatasBean data, final int position) {\n                helper.setText(R.id.type_tv,data.getSuperChapterName() + \"/\" + data.getChapterName());\n                helper.setText(R.id.content_tv, Html.fromHtml(data.getTitle()).toString());\n                helper.setText(R.id.user_tv,data.getAuthor());\n                helper.setText(R.id.time_tv,data.getNiceDate());\n                helper.setText(R.id.collection_tv,data.isCollect() ? \"已收藏\":\"收藏\");\n                helper.setVisible(R.id.new_tv,data.isFresh());\n                helper.setVisible(R.id.top_layout,false);\n\n                helper.setOnClickListener(R.id.content_lay, new View.OnClickListener() {\n                    @Override\n                    public void onClick(View v) {\n                        ARouter.getInstance().build(ConstantArouter.PATH_COMMON_WEBVIEWCTIVITY)\n                                .withInt(\"id\",data.getId())\n                                .withString(\"url\",data.getLink())\n                                .withString(\"title\",data.getTitle())\n                                .withBoolean(\"isCollection\",data.isCollect())\n                                .navigation();\n                    }\n                });\n                helper.setOnClickListener(R.id.collection_tv, new View.OnClickListener() {\n                    @Override\n                    public void onClick(View v) {\n                        if(data.isCollect()){//已收藏\n                            helper.setText(R.id.collection_tv,\"收藏\");\n                            data.setCollect(!data.isCollect());\n                            getPresenter().getUnollect(data.getId(),false,true);\n                        }else{\n                            helper.setText(R.id.collection_tv,\"已收藏\");\n                            data.setCollect(!data.isCollect());\n                            getPresenter().getCollect(data.getId(),false,true);\n                        }\n                    }\n                });\n            }\n        };\n        mLRecyclerViewAdapter = new LRecyclerViewAdapter(adapter);\n        lrv.setAdapter(mLRecyclerViewAdapter);\n        //设置底部加载颜色\n        lrv.setFooterViewColor(R.color.color_blue, R.color.text_gray, R.color.elegant_bg);\n        lrv.setHeaderViewColor(R.color.color_blue, R.color.text_gray, R.color.elegant_bg);\n        lrv.setOnRefreshListener(new OnRefreshListener() {\n            @Override\n            public void onRefresh() {\n                getFirstPageData();\n            }\n        });\n        lrv.setOnLoadMoreListener(new OnLoadMoreListener() {\n            @Override\n            public void onLoadMore() {\n                isLoadMore = true;\n                currentPage++;\n                getOrderList();\n            }\n        });\n\n        lrv.forceToRefresh();\n    }\n\n\n    private void getFirstPageData() {\n        isDownRefesh = true;\n        currentPage = 0;\n        getOrderList();\n    }\n\n    private void getOrderList() {\n        getPresenter().getData(currentPage,false,true);\n    }\n\n    private void refreshData() {\n        if (lrv == null) {\n            return;\n        }\n        lrv.refreshComplete(currentPage);\n        mLRecyclerViewAdapter.notifyDataSetChanged();\n        isDownRefesh = false;\n        isLoadMore = false;\n    }\n    \n    @Override\n    public void getDataResult(BaseResponse<HomeArticle> data) {\n        articles = data.getData();\n\n        tempData.clear();\n        tempData.addAll(data.getData().getDatas());\n        if (tempData.size() == 0 && mData.size() > 0 && isLoadMore) {//最后一页时\n            lrv.setNoMore(true);\n            isLoadMore = false;\n        } else if (isDownRefesh) {//下拉刷新时\n            mData.clear();\n            mData.addAll(tempData);\n            refreshData();\n        } else {//加载更多时\n            mData.addAll(tempData);\n            refreshData();\n        }\n    }\n\n    @Override\n    public void getCollectResult(int id, boolean isCollect) {\n        BaseEvent event = new BaseEvent();\n        event.setCode(101);\n        event.setId(id);\n        event.setCollect(isCollect);\n        EventBus.getDefault().post(event);\n    }\n\n    @Override\n    public void getCollFailResult(int id) {\n        for (HomeArticle.DatasBean bean : mData) {\n            if(bean.getId() == id){\n                bean.setCollect(!bean.isCollect());\n\n                mLRecyclerViewAdapter.notifyDataSetChanged();\n                break;\n            }\n        }\n\n        ARouter.getInstance().build(ConstantLoginArouter.PATH_COMMON_LOGINACTIVITY)\n                .navigation();\n    }\n\n    @Subscribe(threadMode = ThreadMode.MAIN) //在ui线程执行\n    public void onEventReceived(BaseEvent event) {\n        if (event.getCode() == 101) {\n            int id = event.getId();\n            boolean isCollect = event.isCollect();\n            for (HomeArticle.DatasBean bean : mData) {\n                if(bean.getId() == id){\n                    bean.setCollect(isCollect);\n\n                    mLRecyclerViewAdapter.notifyDataSetChanged();\n                    return;\n                }\n            }\n        }\n    }\n\n    @Override\n    protected void onDestroy() {\n        super.onDestroy();\n        EventBus.getDefault().unregister(this);\n    }\n}\n"
  },
  {
    "path": "module_home/src/main/java/com/senon/module_home/activity/HomeProjectActivity.java",
    "content": "package com.senon.module_home.activity;\n\nimport android.support.v7.widget.LinearLayoutManager;\nimport android.text.Html;\nimport android.view.View;\nimport android.widget.ImageView;\nimport android.widget.TextView;\nimport com.alibaba.android.arouter.facade.annotation.Route;\nimport com.alibaba.android.arouter.launcher.ARouter;\nimport com.bumptech.glide.Glide;\nimport com.github.jdsjlzx.interfaces.OnLoadMoreListener;\nimport com.github.jdsjlzx.interfaces.OnRefreshListener;\nimport com.github.jdsjlzx.recyclerview.LRecyclerView;\nimport com.github.jdsjlzx.recyclerview.LRecyclerViewAdapter;\nimport com.github.jdsjlzx.recyclerview.ProgressStyle;\nimport com.senon.lib_common.ComUtil;\nimport com.senon.lib_common.ConstantArouter;\nimport com.senon.lib_common.adapter.RecycleHolder;\nimport com.senon.lib_common.adapter.RecyclerAdapter;\nimport com.senon.lib_common.base.BaseActivity;\nimport com.senon.lib_common.base.BaseResponse;\nimport com.senon.lib_common.bean.HomeArticle;\nimport com.senon.lib_common.bean.ProjectArticle;\nimport com.senon.lib_common.utils.BaseEvent;\nimport com.senon.lib_common.utils.StatusBarUtils;\nimport com.senon.module_home.R;\nimport com.senon.module_home.contract.HomeProjectActivityCon;\nimport com.senon.module_home.presenter.HomeProjectActivityPre;\n\nimport org.greenrobot.eventbus.EventBus;\nimport org.greenrobot.eventbus.Subscribe;\nimport org.greenrobot.eventbus.ThreadMode;\n\nimport java.util.ArrayList;\n\n/**\n * 最新项目列表页\n */\n\n@Route(path = ConstantArouter.PATH_HOME_HOMEPROJECTACTIVITY)\npublic class HomeProjectActivity extends BaseActivity<HomeProjectActivityCon.View,HomeProjectActivityCon.Presenter> implements\n        HomeProjectActivityCon.View {\n\n    private LRecyclerView lrv;\n    private TextView toolbar_title_tv;\n    private boolean isLoadMore = false;//是否加载更多\n    private boolean isDownRefesh = false;//是否下拉刷新\n    private int currentPage = 1;//当前页数\n    private RecyclerAdapter<ProjectArticle.DatasBean> adapter;\n    private ProjectArticle projects;\n    private ArrayList<ProjectArticle.DatasBean> mData = new ArrayList<>();//原始数据\n    private ArrayList<ProjectArticle.DatasBean> tempData = new ArrayList<>();//间接数据\n    private LRecyclerViewAdapter mLRecyclerViewAdapter;//Lrecyclerview的包装适配器\n\n    @Override\n    public int getLayoutId() {\n        StatusBarUtils.with(this).init();\n        return R.layout.home_activity_home_project;\n    }\n    @Override\n    public HomeProjectActivityCon.Presenter createPresenter() {\n        return new HomeProjectActivityPre(this);\n    }\n    @Override\n    public HomeProjectActivityCon.View createView() {\n        return this;\n    }\n\n    @Override\n    public void init() {\n        ComUtil.changeStatusBarTextColor(this,true);\n        EventBus.getDefault().register(this);\n\n        lrv = findViewById(R.id.lrv);\n        toolbar_title_tv = ((TextView)findViewById(R.id.toolbar_title_tv));\n        toolbar_title_tv.setText(\"最新项目\");\n        toolbar_title_tv.setOnClickListener(new View.OnClickListener() {\n            @Override\n            public void onClick(View v) {\n                lrv.smoothScrollToPosition(0);\n            }\n        });\n        findViewById(R.id.toolbar_back_igv).setOnClickListener(new View.OnClickListener() {\n            @Override\n            public void onClick(View v) {\n                finish();\n            }\n        });\n\n        initLRecyclerVeiw();\n    }\n\n    private void initLRecyclerVeiw() {\n        LinearLayoutManager manager = new LinearLayoutManager(this);\n        lrv.setLayoutManager(manager);\n        lrv.setRefreshProgressStyle(ProgressStyle.LineSpinFadeLoader); //设置下拉刷新Progress的样式\n        lrv.setArrowImageView(R.mipmap.news_renovate);  //设置下拉刷新箭头\n        lrv.setLoadingMoreProgressStyle(ProgressStyle.BallSpinFadeLoader);\n        adapter = new RecyclerAdapter<ProjectArticle.DatasBean>(this, mData,R.layout.home_adapter_homemain_fragment_project) {\n            @Override\n            public void convert(final RecycleHolder helper, final ProjectArticle.DatasBean data, final int position) {\n                helper.setImageBitmap(R.id.content_igv,null);\n                Glide.with(HomeProjectActivity.this).load(data.getEnvelopePic()).into((ImageView) helper.findView(R.id.content_igv));\n                helper.setText(R.id.content_tv,Html.fromHtml(data.getTitle()).toString());\n                helper.setText(R.id.title_tv, Html.fromHtml(data.getTitle()).toString());\n                helper.setText(R.id.user_tv,data.getAuthor());\n                helper.setText(R.id.time_tv,data.getNiceDate());\n                helper.setVisible(R.id.top_layout,false);\n                helper.setVisible(R.id.home_placeholder_tv,position == mData.size()-1);\n\n                helper.setOnClickListener(R.id.content_lay, new View.OnClickListener() {\n                    @Override\n                    public void onClick(View v) {\n                        ARouter.getInstance().build(ConstantArouter.PATH_COMMON_WEBVIEWCTIVITY)\n                                .withInt(\"id\",data.getId())\n                                .withString(\"url\",data.getLink())\n                                .withString(\"title\",data.getTitle())\n                                .withBoolean(\"isCollection\",data.isCollect())\n                                .navigation();\n                    }\n                });\n            }\n        };\n        mLRecyclerViewAdapter = new LRecyclerViewAdapter(adapter);\n        lrv.setAdapter(mLRecyclerViewAdapter);\n        //设置底部加载颜色\n        lrv.setFooterViewColor(R.color.color_blue, R.color.text_gray, R.color.elegant_bg);\n        lrv.setHeaderViewColor(R.color.color_blue, R.color.text_gray, R.color.elegant_bg);\n        lrv.setOnRefreshListener(new OnRefreshListener() {\n            @Override\n            public void onRefresh() {\n                getFirstPageData();\n            }\n        });\n        lrv.setOnLoadMoreListener(new OnLoadMoreListener() {\n            @Override\n            public void onLoadMore() {\n                isLoadMore = true;\n                currentPage++;\n                getOrderList();\n            }\n        });\n\n        lrv.forceToRefresh();\n    }\n\n\n    private void getFirstPageData() {\n        isDownRefesh = true;\n        currentPage = 1;\n        getOrderList();\n    }\n\n    private void getOrderList() {\n        getPresenter().getData(currentPage,false,true);\n    }\n\n    private void refreshData() {\n        if (lrv == null) {\n            return;\n        }\n        lrv.refreshComplete(currentPage);\n        mLRecyclerViewAdapter.notifyDataSetChanged();\n        isDownRefesh = false;\n        isLoadMore = false;\n    }\n    \n    @Override\n    public void getDataResult(BaseResponse<ProjectArticle> data) {\n        projects = data.getData();\n\n        tempData.clear();\n        tempData.addAll(data.getData().getDatas());\n        if (tempData.size() == 0 && mData.size() > 0 && isLoadMore) {//最后一页时\n            lrv.setNoMore(true);\n            isLoadMore = false;\n        } else if (isDownRefesh) {//下拉刷新时\n            mData.clear();\n            mData.addAll(tempData);\n            refreshData();\n        } else {//加载更多时\n            mData.addAll(tempData);\n            refreshData();\n        }\n    }\n\n    @Subscribe(threadMode = ThreadMode.MAIN) //在ui线程执行\n    public void onEventReceived(BaseEvent event) {\n        if (event.getCode() == 101) {\n            int id = event.getId();\n            boolean isCollect = event.isCollect();\n            for (ProjectArticle.DatasBean bean : mData) {\n                if(bean.getId() == id){\n                    bean.setCollect(isCollect);\n\n                    mLRecyclerViewAdapter.notifyDataSetChanged();\n                    return;\n                }\n            }\n        }\n    }\n\n    @Override\n    protected void onDestroy() {\n        super.onDestroy();\n        EventBus.getDefault().unregister(this);\n    }\n\n}\n"
  },
  {
    "path": "module_home/src/main/java/com/senon/module_home/adapter/HomeMainAdapter.java",
    "content": "package com.senon.module_home.adapter;\n\nimport android.content.Context;\nimport android.support.v7.widget.RecyclerView;\nimport android.view.LayoutInflater;\nimport android.view.View;\nimport android.view.ViewGroup;\nimport android.widget.ImageView;\nimport android.widget.RelativeLayout;\nimport android.widget.TextView;\n\nimport com.alibaba.android.arouter.launcher.ARouter;\nimport com.bumptech.glide.Glide;\nimport com.senon.lib_common.ConstantArouter;\nimport com.senon.lib_common.bean.Banner;\nimport com.senon.lib_common.bean.HomeArticle;\nimport com.senon.lib_common.bean.ProjectArticle;\nimport com.senon.lib_common.utils.ToastUtil;\nimport com.senon.module_home.R;\nimport com.zhouwei.mzbanner.MZBannerView;\nimport com.zhouwei.mzbanner.holder.MZHolderCreator;\nimport com.zhouwei.mzbanner.holder.MZViewHolder;\nimport java.util.ArrayList;\nimport java.util.List;\n\n\n/**\n * Home主界面--列表Recycleview适配器\n */\npublic class HomeMainAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> implements View.OnClickListener {\n\n    private int ITEM_ONE = 1;\n    private int ITEM_TWO = 2;\n    private int ITEM_HEAD = 3;\n    private int headViewCount = 1;\n    private OnItemClickListener onItemClickListener;\n    private Context mContext;\n    private List<Banner> banners = new ArrayList<>();//banner图\n    private List<HomeArticle.DatasBean> articles = new ArrayList<>();//最新博文\n    private List<ProjectArticle.DatasBean> projects = new ArrayList<>();//最新项目\n    private int bannerRefresh = 0;//0：设置banner     1：设置了 并且start     2：设置了 并且pause\n\n    public void notifyDataChanged() {\n        notifyDataSetChanged();\n    }\n\n    //设置banner图\n    public void setBannerDatas(List<Banner> datas) {\n        if (datas != null) {\n            this.banners.clear();\n            this.banners.addAll(datas);\n            bannerRefresh = 0;\n            notifyDataChanged();\n        }\n    }\n    public void setBannerStatus(int bannerRefresh){\n        this.bannerRefresh = bannerRefresh;\n        notifyDataChanged();\n    }\n\n    //设置最新博文\n    public void setArticleDatas(List<HomeArticle.DatasBean> datas) {\n        if (datas != null) {\n            this.articles.clear();\n            this.articles.addAll(datas);\n            notifyDataChanged();\n        }\n    }\n\n    //设置最新项目\n    public void setProjectDatas(List<ProjectArticle.DatasBean> datas) {\n        if (datas != null) {\n            this.projects.clear();\n            this.projects.addAll(datas);\n            notifyDataChanged();\n        }\n    }\n\n    public HomeMainAdapter(Context context) {\n        mContext = context;\n    }\n\n    @Override\n    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {\n        if (viewType == ITEM_HEAD) {\n            View view = LayoutInflater.from(mContext).inflate(R.layout.home_adapter_homemain_fragment_head, parent, false);\n            return new HeaderViewHolder(view);\n        } else if (viewType == ITEM_ONE) {\n            View view = LayoutInflater.from(mContext).inflate(R.layout.home_adapter_homemain_fragment_article, parent, false);\n            return new OneViewHolder(view);\n        } else if (viewType == ITEM_TWO) {\n            View view = LayoutInflater.from(mContext).inflate(R.layout.home_adapter_homemain_fragment_project, parent, false);\n            return new TwoViewHolder(view);\n        }\n        return null;\n    }\n\n    @Override\n    public void onBindViewHolder(final RecyclerView.ViewHolder holder, final int mPosition) {\n        if (holder instanceof HeaderViewHolder) {\n            if(bannerRefresh == 0){\n                bannerRefresh = -1;\n                // 设置页面点击事件\n                ((HeaderViewHolder) holder).banner.setBannerPageClickListener(new MZBannerView.BannerPageClickListener() {\n                    @Override\n                    public void onPageClick(View view, int position) {\n                        ARouter.getInstance().build(ConstantArouter.PATH_COMMON_WEBVIEWCTIVITY)\n                                .withString(\"url\",banners.get(position).getUrl())\n                                .withString(\"title\",banners.get(position).getTitle())\n                                .navigation();\n                    }\n                });\n                // 设置数据\n                ((HeaderViewHolder) holder).banner.setPages(banners, new MZHolderCreator<BannerViewHolder>() {\n                    @Override\n                    public BannerViewHolder createViewHolder() {\n                        return new BannerViewHolder();\n                    }\n                });\n                ((HeaderViewHolder) holder).banner.start();\n            }else if(bannerRefresh == 1){\n                bannerRefresh = -1;\n                ((HeaderViewHolder) holder).banner.start();\n            }else if(bannerRefresh == 2){\n                bannerRefresh = -1;\n                ((HeaderViewHolder) holder).banner.pause();\n            }\n        } else if (holder instanceof OneViewHolder) {\n            //注意除去头布局\n            final int position = mPosition - 1;\n            final HomeArticle.DatasBean data = articles.get(position);\n            ((OneViewHolder) holder).itemView.setTag(position);\n\n            ((OneViewHolder) holder).type_tv.setText(data.getSuperChapterName() + \"/\" + data.getChapterName());\n            ((OneViewHolder) holder).content_tv.setText(data.getTitle());\n            ((OneViewHolder) holder).user_tv.setText(data.getAuthor());\n            ((OneViewHolder) holder).time_tv.setText(data.getNiceDate());\n            ((OneViewHolder) holder).new_tv.setVisibility(data.isFresh() ? View.VISIBLE : View.GONE);\n            ((OneViewHolder) holder).top_layout.setVisibility(position == 0 ? View.VISIBLE : View.GONE);\n            ((OneViewHolder) holder).collection_tv.setVisibility(View.GONE);\n\n            ((OneViewHolder) holder).more_tv.setOnClickListener(new View.OnClickListener() {\n                @Override\n                public void onClick(View view) {\n                    ARouter.getInstance()\n                            .build(ConstantArouter.PATH_HOME_HOMEARTICLEACTIVITY)\n                            .navigation();\n                }\n            });\n            ((OneViewHolder) holder).content_lay.setOnClickListener(new View.OnClickListener() {\n                @Override\n                public void onClick(View view) {\n                    ARouter.getInstance().build(ConstantArouter.PATH_COMMON_WEBVIEWCTIVITY)\n                            .withInt(\"id\",data.getId())\n                            .withString(\"url\",data.getLink())\n                            .withString(\"title\",data.getTitle())\n                            .withBoolean(\"isCollection\",data.isCollect())\n                            .navigation();\n                }\n            });\n\n        } else if (holder instanceof TwoViewHolder) {\n            //注意除去头布局\n            final int position = mPosition - 1 - articles.size();\n            final ProjectArticle.DatasBean data = projects.get(position);\n            ((TwoViewHolder) holder).itemView.setTag(position);\n\n            ((TwoViewHolder) holder).content_igv.setImageBitmap(null);\n            Glide.with(mContext).load(data.getEnvelopePic()).into(((TwoViewHolder) holder).content_igv);\n            ((TwoViewHolder) holder).content_tv.setText(data.getDesc());\n            ((TwoViewHolder) holder).title_tv.setText(data.getTitle());\n            ((TwoViewHolder) holder).user_tv.setText(data.getAuthor());\n            ((TwoViewHolder) holder).time_tv.setText(data.getNiceDate());\n            ((TwoViewHolder) holder).top_layout.setVisibility(position == 0 ? View.VISIBLE : View.GONE);\n            ((TwoViewHolder) holder).home_placeholder_tv.setVisibility(position == projects.size()-1 ? View.VISIBLE : View.GONE);\n\n            ((TwoViewHolder) holder).more_tv.setOnClickListener(new View.OnClickListener() {\n                @Override\n                public void onClick(View view) {\n                    ARouter.getInstance()\n                            .build(ConstantArouter.PATH_HOME_HOMEPROJECTACTIVITY)\n                            .navigation();\n                }\n            });\n            ((TwoViewHolder) holder).content_lay.setOnClickListener(new View.OnClickListener() {\n                @Override\n                public void onClick(View view) {\n                    ARouter.getInstance().build(ConstantArouter.PATH_COMMON_WEBVIEWCTIVITY)\n                            .withInt(\"id\",data.getId())\n                            .withString(\"url\",data.getLink())\n                            .withString(\"title\",data.getTitle())\n                            .withBoolean(\"isCollection\",data.isCollect())\n                            .navigation();\n                }\n            });\n        }\n    }\n\n    @Override\n    public int getItemCount() {\n        return articles.size() + projects.size() + headViewCount;\n    }\n\n    @Override\n    public int getItemViewType(int position) {\n        if (isHeadView(position)) {\n            return ITEM_HEAD;\n        } else if (isItemOne(position)) {\n            return ITEM_ONE;\n        } else if (isItemTwo(position)) {\n            return ITEM_TWO;\n        }\n        return 0;\n    }\n\n    public boolean isHeadView(int position) {\n        return headViewCount != 0 && position < headViewCount;\n    }\n\n    public boolean isItemOne(int position) {\n        if (articles.size() == 0) {\n            return false;\n        } else if (position <= articles.size()) {\n            return true;\n        }\n        return false;\n    }\n\n    public boolean isItemTwo(int position) {\n        if (projects.size() == 0) {\n            return false;\n        } else if (position <= articles.size() + projects.size()) {\n            return true;\n        }\n        return false;\n    }\n\n    @Override\n    public void onClick(View view) {\n        if (onItemClickListener != null) {\n            onItemClickListener.onItemClick(view, (Integer) view.getTag());\n        }\n    }\n\n    //头布局--轮播图\n    class HeaderViewHolder extends RecyclerView.ViewHolder {\n        private MZBannerView banner;\n\n        public HeaderViewHolder(View itemView) {\n            super(itemView);\n            banner = itemView.findViewById(R.id.banner);\n\n        }\n    }\n\n    //最新博文\n    class OneViewHolder extends RecyclerView.ViewHolder {\n        private RelativeLayout top_layout,content_lay;\n        private TextView more_tv, type_tv, content_tv, user_tv, time_tv;\n        private TextView new_tv,collection_tv;\n\n        public OneViewHolder(View itemView) {\n            super(itemView);\n            top_layout = itemView.findViewById(R.id.top_layout);\n            content_lay = itemView.findViewById(R.id.content_lay);\n            more_tv = itemView.findViewById(R.id.more_tv);\n            type_tv = itemView.findViewById(R.id.type_tv);\n            content_tv = itemView.findViewById(R.id.content_tv);\n            user_tv = itemView.findViewById(R.id.user_tv);\n            time_tv = itemView.findViewById(R.id.time_tv);\n            new_tv = itemView.findViewById(R.id.new_tv);\n            collection_tv = itemView.findViewById(R.id.collection_tv);\n        }\n    }\n\n    //最新项目\n    class TwoViewHolder extends RecyclerView.ViewHolder {\n        private RelativeLayout top_layout,content_lay;\n        private ImageView content_igv;\n        private TextView more_tv, title_tv, content_tv, user_tv, time_tv;\n        private View home_placeholder_tv;\n\n        public TwoViewHolder(View itemView) {\n            super(itemView);\n            top_layout = itemView.findViewById(R.id.top_layout);\n            content_lay = itemView.findViewById(R.id.content_lay);\n            content_igv = itemView.findViewById(R.id.content_igv);\n            more_tv = itemView.findViewById(R.id.more_tv);\n            title_tv = itemView.findViewById(R.id.title_tv);\n            content_tv = itemView.findViewById(R.id.content_tv);\n            user_tv = itemView.findViewById(R.id.user_tv);\n            time_tv = itemView.findViewById(R.id.time_tv);\n            home_placeholder_tv = itemView.findViewById(R.id.home_placeholder_tv);\n        }\n    }\n\n    public void setOnItemClickListener(OnItemClickListener onItemClickListener) {\n        this.onItemClickListener = onItemClickListener;\n    }\n\n    public interface OnItemClickListener {\n        void onHeadItemClick(View view, int position);\n\n        void onItemClick(View view, int position);\n    }\n\n    public static class BannerViewHolder implements MZViewHolder<Banner> {\n        private ImageView igv;\n        @Override\n        public View createView(Context context) {\n            // 返回页面布局文件\n            View view = LayoutInflater.from(context).inflate(R.layout.home_adapter_homemain_fragment_banneritem,null);\n            igv = view.findViewById(R.id.igv);\n            return view;\n        }\n        @Override\n        public void onBind(Context context, int i, Banner banner) {\n            // 数据绑定\n            Glide.with(context).load(banner.getImagePath()).into(igv);\n        }\n\n    }\n\n\n}\n\n"
  },
  {
    "path": "module_home/src/main/java/com/senon/module_home/contract/HomeArticleActivityCon.java",
    "content": "package com.senon.module_home.contract;\n\nimport com.senon.lib_common.base.BasePresenter;\nimport com.senon.lib_common.base.BaseResponse;\nimport com.senon.lib_common.base.BaseViewImp;\nimport com.senon.lib_common.bean.HomeArticle;\n\n\npublic interface HomeArticleActivityCon {\n\n    interface View extends BaseViewImp {\n\n        void getDataResult(BaseResponse<HomeArticle> data);\n\n        void getCollectResult(int id,boolean isCollect);\n\n        void getCollFailResult(int id);\n\n    }\n\n    abstract class Presenter extends BasePresenter<View> {\n\n        public abstract void getData(int page,boolean isDialog, boolean cancelable);\n\n        public abstract void getCollect(int id ,boolean isDialog, boolean cancelable);\n\n        public abstract void getUnollect(int id, boolean isDialog, boolean cancelable);\n    }\n}\n"
  },
  {
    "path": "module_home/src/main/java/com/senon/module_home/contract/HomeMainFragmentCon.java",
    "content": "package com.senon.module_home.contract;\n\nimport com.senon.lib_common.base.BasePresenter;\nimport com.senon.lib_common.base.BaseViewImp;\nimport com.senon.lib_common.base.BaseResponse;\nimport com.senon.lib_common.bean.Banner;\nimport com.senon.lib_common.bean.HomeArticle;\nimport com.senon.lib_common.bean.ProjectArticle;\n\nimport java.util.List;\n\n/**\n * HomeMainFragmentCon  V 、P契约类\n */\npublic interface HomeMainFragmentCon {\n\n    interface View extends BaseViewImp {\n\n        void getBannerResult(BaseResponse<List<Banner>> data);\n\n        void getHomeArticleResult(BaseResponse<HomeArticle> data);\n\n        void getHomeProjectResult(BaseResponse<ProjectArticle> data);\n\n    }\n\n    abstract class Presenter extends BasePresenter<View> {\n\n        public abstract void getBanner(boolean isDialog, boolean cancelable);\n\n        public abstract void getHomeArticle(int page,boolean isDialog, boolean cancelable);\n\n        public abstract void getHomeProject(int page,boolean isDialog, boolean cancelable);\n\n    }\n}\n"
  },
  {
    "path": "module_home/src/main/java/com/senon/module_home/contract/HomeProjectActivityCon.java",
    "content": "package com.senon.module_home.contract;\n\nimport com.senon.lib_common.base.BasePresenter;\nimport com.senon.lib_common.base.BaseResponse;\nimport com.senon.lib_common.base.BaseViewImp;\nimport com.senon.lib_common.bean.ProjectArticle;\n\n\npublic interface HomeProjectActivityCon {\n\n    interface View extends BaseViewImp {\n\n        void getDataResult(BaseResponse<ProjectArticle> data);\n\n    }\n\n    abstract class Presenter extends BasePresenter<View> {\n\n        public abstract void getData(int page,boolean isDialog, boolean cancelable);\n\n\n    }\n}\n"
  },
  {
    "path": "module_home/src/main/java/com/senon/module_home/fragment/HomeMainFragment.java",
    "content": "package com.senon.module_home.fragment;\n\nimport android.support.v7.widget.LinearLayoutManager;\nimport android.support.v7.widget.RecyclerView;\nimport android.view.View;\nimport android.widget.TextView;\n\nimport com.github.jdsjlzx.interfaces.OnLoadMoreListener;\nimport com.github.jdsjlzx.interfaces.OnRefreshListener;\nimport com.github.jdsjlzx.recyclerview.LRecyclerView;\nimport com.github.jdsjlzx.recyclerview.LRecyclerViewAdapter;\nimport com.github.jdsjlzx.recyclerview.ProgressStyle;\nimport com.scwang.smartrefresh.layout.SmartRefreshLayout;\nimport com.scwang.smartrefresh.layout.api.RefreshLayout;\nimport com.senon.lib_common.ComUtil;\nimport com.senon.lib_common.base.BaseLazyFragment;\nimport com.senon.lib_common.base.BaseResponse;\nimport com.senon.lib_common.bean.Banner;\nimport com.senon.lib_common.bean.HomeArticle;\nimport com.senon.lib_common.bean.ProjectArticle;\nimport com.senon.lib_common.utils.BaseEvent;\nimport com.senon.lib_common.utils.LogUtils;\nimport com.senon.module_home.R;\nimport com.senon.module_home.adapter.HomeMainAdapter;\nimport com.senon.module_home.contract.HomeMainFragmentCon;\nimport com.senon.module_home.presenter.HomeMainFragmentPre;\n\nimport org.greenrobot.eventbus.EventBus;\nimport org.greenrobot.eventbus.Subscribe;\nimport org.greenrobot.eventbus.ThreadMode;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\n/**\n * home mian fragment\n */\npublic class HomeMainFragment extends BaseLazyFragment<HomeMainFragmentCon.View, HomeMainFragmentCon.Presenter> implements\n        HomeMainFragmentCon.View {\n\n    private RecyclerView lrv;\n    private SmartRefreshLayout home_refreshLayout;\n    private TextView home_homefragment_title_tv;\n    private List<Banner> banners = new ArrayList<>();\n    private HomeArticle article;\n    private ProjectArticle project;\n    private final int articlePage = 0;//首页文章页码\n    private final int projectPage = 1;//首页最新项目\n    private HomeMainAdapter adapter;\n    private LinearLayoutManager layoutManager;\n\n\n    @Override\n    public int getLayoutId() {\n        return R.layout.home_fragment_main;\n    }\n    @Override\n    public HomeMainFragmentCon.Presenter createPresenter() {\n        return new HomeMainFragmentPre(mContext);\n    }\n    @Override\n    public HomeMainFragmentCon.View createView() {\n        return this;\n    }\n    @Override\n    public void init(View rootView) {\n        lrv = rootView.findViewById(R.id.home_homefragment_lrv);\n        home_refreshLayout = rootView.findViewById(R.id.home_refreshLayout);\n        home_homefragment_title_tv = rootView.findViewById(R.id.home_homefragment_title_tv);\n        home_homefragment_title_tv.setOnClickListener(new View.OnClickListener() {\n            @Override\n            public void onClick(View v) {\n                if(lrv != null && adapter!= null){\n                    lrv.smoothScrollToPosition(0);\n                }\n            }\n        });\n    }\n\n    @Override\n    public void onFragmentFirst() {\n        super.onFragmentFirst();\n        //第一次可见时，自动加载页面\n        LogUtils.e(\"-----> 子fragment进行初始化操作\");\n\n        //注册eventbus\n        EventBus.getDefault().register(this);\n        //初始化adapter 设置适配器\n        initAdapter();\n\n        //添加滑动位置监听\n        addLrvListener();\n\n    }\n\n    private void addLrvListener() {\n        lrv.addOnScrollListener(new RecyclerView.OnScrollListener() {\n            @Override\n            public void onScrolled(RecyclerView recyclerView, int dx, int dy) {\n                super.onScrolled(recyclerView, dx, dy);\n                //在此做处理\n                if (null != layoutManager) {\n                    //当前条目索引\n                    int position = layoutManager.findFirstVisibleItemPosition();\n                    if(position > 1){\n                        home_homefragment_title_tv.setVisibility(View.VISIBLE);\n                    }else{\n                        //根据view的高度来做显示隐藏判断\n                        //根据索引来获取对应的itemView\n                        View firstVisiableChildView = layoutManager.findViewByPosition(position);\n                        //获取当前显示条目的高度\n                        int itemHeight = firstVisiableChildView.getHeight();\n                        //获取当前Recyclerview 偏移量\n                        int offset = - firstVisiableChildView.getTop();\n                        if (offset > itemHeight / 4) {\n                            //做显示布局操作\n                            home_homefragment_title_tv.setVisibility(View.VISIBLE);\n                        } else {\n                            //做隐藏布局操作\n                            home_homefragment_title_tv.setVisibility(View.GONE);\n                        }\n                    }\n                }\n            }\n        });\n    }\n\n    private void initAdapter() {\n        adapter = new HomeMainAdapter(mContext);\n        layoutManager = new LinearLayoutManager(mContext, LinearLayoutManager.VERTICAL, false);\n        lrv.setLayoutManager(layoutManager);\n        lrv.setAdapter(adapter);\n\n        home_refreshLayout.setOnRefreshListener(new com.scwang.smartrefresh.layout.listener.OnRefreshListener() {\n            @Override\n            public void onRefresh(RefreshLayout refreshlayout) {\n                getFirstData();\n            }\n        });\n\n        home_refreshLayout.setEnableLoadMore(false);\n        home_refreshLayout.autoRefresh(100);\n    }\n\n    private void getFirstData(){\n        //加载banner\n        getPresenter().getBanner(false, true);\n        //加载首页最新文章\n        getPresenter().getHomeArticle(articlePage,false, true);\n        //加载项目列表数据-完整项目模块\n        getPresenter().getHomeProject(projectPage,false, true);\n    }\n\n    @Override\n    public void onFragmentVisble() {\n        super.onFragmentVisble();\n        //之后每次可见的操作\n        LogUtils.e(\"-----> 子fragment每次可见时的操作\");\n\n    }\n\n    @Override\n    public void getBannerResult(BaseResponse<List<Banner>> data) {\n        banners = data.getData();\n        adapter.setBannerDatas(banners);\n        refreshData();\n\n    }\n\n    @Override\n    public void getHomeArticleResult(BaseResponse<HomeArticle> data) {\n        List<HomeArticle.DatasBean> list = new ArrayList<>();\n        if(data.getData() != null){\n            for (int i = 0; i < data.getData().getDatas().size(); i++) {\n                if(i < 5){\n                    list.add(data.getData().getDatas().get(i));\n                }\n            }\n        }\n        data.getData().setDatas(list);\n\n        article = data.getData();\n        adapter.setArticleDatas(article.getDatas());\n        refreshData();\n\n    }\n\n    @Override\n    public void getHomeProjectResult(BaseResponse<ProjectArticle> data) {\n        List<ProjectArticle.DatasBean> list = new ArrayList<>();\n        if(data.getData() != null){\n            for (int i = 0; i < data.getData().getDatas().size(); i++) {\n                if(i < 5){\n                    list.add(data.getData().getDatas().get(i));\n                }\n            }\n        }\n        data.getData().setDatas(list);\n\n        project = data.getData();\n        adapter.setProjectDatas(project.getDatas());\n        refreshData();\n    }\n\n    @Override\n    public void onResume() {\n        super.onResume();\n        if(adapter != null){//banner生命周期需要调用的方法start\n            adapter.setBannerStatus(1);\n        }\n    }\n    @Override\n    public void onPause() {\n        super.onPause();\n        if(adapter != null){//banner生命周期需要调用的方法pause\n            adapter.setBannerStatus(2);\n        }\n    }\n\n    @Override\n    public void onDestroyView() {\n        super.onDestroyView();\n        EventBus.getDefault().unregister(this);\n    }\n\n    //完成数据加载\n    private void refreshData(){\n        home_refreshLayout.finishRefresh();\n        adapter.notifyDataChanged();\n    }\n\n    @Subscribe(threadMode = ThreadMode.MAIN) //在ui线程执行\n    public void onEventReceived(BaseEvent event) {\n        if(event.getCode() == 1){//退出登录  刷新列表\n            getFirstData();\n        }else if (event.getCode() == 101) {\n            int id = event.getId();\n            boolean isCollect = event.isCollect();\n            for (HomeArticle.DatasBean bean : article.getDatas()) {\n                if(bean.getId() == id){\n                    bean.setCollect(isCollect);\n                    return;\n                }\n            }\n            for (ProjectArticle.DatasBean bean : project.getDatas()) {\n                if(bean.getId() == id){\n                    bean.setCollect(isCollect);\n                    return;\n                }\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "module_home/src/main/java/com/senon/module_home/presenter/HomeArticleActivityPre.java",
    "content": "package com.senon.module_home.presenter;\n\nimport android.content.Context;\nimport com.senon.lib_common.base.BaseResponse;\nimport com.senon.lib_common.bean.Banner;\nimport com.senon.lib_common.bean.HomeArticle;\nimport com.senon.lib_common.net.ServerUtils;\nimport com.senon.lib_common.net.callback.RequestCallback;\nimport com.senon.lib_common.net.callback.RxErrorHandler;\nimport com.senon.lib_common.utils.RetryWithDelay;\nimport com.senon.lib_common.utils.RxUtils;\nimport com.senon.lib_common.utils.ToastUtil;\nimport com.senon.module_home.contract.HomeArticleActivityCon;\nimport java.util.List;\n\n/**\n * HomeArticleActivityCon  P\n */\npublic class HomeArticleActivityPre extends HomeArticleActivityCon.Presenter{\n\n    private Context context;\n\n    public HomeArticleActivityPre(Context context) {\n        this.context = context;\n    }\n\n    @Override\n    public void getData(int page,boolean isDialog, boolean cancelable) {\n        ServerUtils.getCommonApi().getHomeArticle(page)\n                .retryWhen(new RetryWithDelay(3,2))\n                .compose(RxUtils.<BaseResponse<HomeArticle>>bindToLifecycle(getView()))\n                .compose(RxUtils.<BaseResponse<HomeArticle>>getSchedulerTransformer())\n                .subscribe(new RequestCallback<BaseResponse<HomeArticle>>(context, RxErrorHandler.getInstance(),isDialog,cancelable) {\n                    @Override\n                    public void onNext(BaseResponse<HomeArticle> baseResponse) {\n                        super.onNext(baseResponse);\n                        if(baseResponse.getCode() == 0){\n                            getView().getDataResult(baseResponse);\n                        }else{\n                            ToastUtil.initToast(baseResponse.getMsg());\n                        }\n                    }\n                    @Override\n                    public void onError(Throwable e) {\n                        super.onError(e);\n                    }\n                });\n    }\n\n    @Override\n    public void getCollect(final int id, boolean isDialog, boolean cancelable) {\n        ServerUtils.getCommonApi().getCollect(id)\n                .retryWhen(new RetryWithDelay(3,2))\n                .compose(RxUtils.<BaseResponse>bindToLifecycle(getView()))\n                .compose(RxUtils.<BaseResponse>getSchedulerTransformer())\n                .subscribe(new RequestCallback<BaseResponse>(context, RxErrorHandler.getInstance(),isDialog,cancelable) {\n                    @Override\n                    public void onNext(BaseResponse baseResponse) {\n                        super.onNext(baseResponse);\n                        if(baseResponse.getCode() == 0){\n                            getView().getCollectResult(id,true);\n                        }else{\n                            getView().getCollFailResult(id);\n                            ToastUtil.initToast(baseResponse.getMsg());\n                        }\n                    }\n                    @Override\n                    public void onError(Throwable e) {\n                        super.onError(e);\n                    }\n                });\n    }\n\n    @Override\n    public void getUnollect(final int id, boolean isDialog, boolean cancelable) {\n        ServerUtils.getCommonApi().getUncollectOriginId(id)\n                .retryWhen(new RetryWithDelay(3,2))\n                .compose(RxUtils.<BaseResponse>bindToLifecycle(getView()))\n                .compose(RxUtils.<BaseResponse>getSchedulerTransformer())\n                .subscribe(new RequestCallback<BaseResponse>(context, RxErrorHandler.getInstance(),isDialog,cancelable) {\n                    @Override\n                    public void onNext(BaseResponse baseResponse) {\n                        super.onNext(baseResponse);\n                        if(baseResponse.getCode() == 0){\n                            getView().getCollectResult(id,false);\n                        }else{\n                            getView().getCollFailResult(id);\n\n                            ToastUtil.initToast(baseResponse.getMsg());\n                        }\n                    }\n                    @Override\n                    public void onError(Throwable e) {\n                        super.onError(e);\n                    }\n                });\n    }\n\n}\n"
  },
  {
    "path": "module_home/src/main/java/com/senon/module_home/presenter/HomeMainFragmentPre.java",
    "content": "package com.senon.module_home.presenter;\n\nimport android.content.Context;\n\nimport com.senon.lib_common.bean.Banner;\nimport com.senon.lib_common.bean.HomeArticle;\nimport com.senon.lib_common.bean.Login;\nimport com.senon.lib_common.bean.ProjectArticle;\nimport com.senon.lib_common.net.ServerUtils;\nimport com.senon.lib_common.base.BaseResponse;\nimport com.senon.lib_common.net.callback.RequestCallback;\nimport com.senon.lib_common.net.callback.RxErrorHandler;\nimport com.senon.lib_common.utils.RetryWithDelay;\nimport com.senon.lib_common.utils.RxUtils;\nimport com.senon.lib_common.utils.ToastUtil;\nimport com.senon.module_home.contract.HomeMainFragmentCon;\n\nimport java.util.List;\n\n/**\n * HomeMainFragmentCon  P\n */\npublic class HomeMainFragmentPre extends HomeMainFragmentCon.Presenter{\n\n    private Context context;\n\n    public HomeMainFragmentPre(Context context) {\n        this.context = context;\n    }\n\n    @Override\n    public void getBanner(boolean isDialog, boolean cancelable) {\n        ServerUtils.getCommonApi().banner()\n                .retryWhen(new RetryWithDelay(3,2))\n                .compose(RxUtils.<BaseResponse<List<Banner>>>bindToLifecycle(getView()))\n                .compose(RxUtils.<BaseResponse<List<Banner>>>getSchedulerTransformer())\n                .subscribe(new RequestCallback<BaseResponse<List<Banner>>>(context, RxErrorHandler.getInstance(),isDialog,cancelable) {\n                    @Override\n                    public void onNext(BaseResponse<List<Banner>> baseResponse) {\n                        super.onNext(baseResponse);\n                        if(baseResponse.getCode() == 0){\n                            getView().getBannerResult(baseResponse);\n                        }else{\n                            ToastUtil.initToast(baseResponse.getMsg());\n                        }\n                    }\n                    @Override\n                    public void onError(Throwable e) {\n                        super.onError(e);\n                    }\n                });\n    }\n\n    @Override\n    public void getHomeArticle(int page, boolean isDialog, boolean cancelable) {\n        ServerUtils.getCommonApi().getHomeArticle(page)\n                .retryWhen(new RetryWithDelay(3,2))\n                .compose(RxUtils.<BaseResponse<HomeArticle>>bindToLifecycle(getView()))\n                .compose(RxUtils.<BaseResponse<HomeArticle>>getSchedulerTransformer())\n                .subscribe(new RequestCallback<BaseResponse<HomeArticle>>(context, RxErrorHandler.getInstance(),isDialog,cancelable) {\n                    @Override\n                    public void onNext(BaseResponse<HomeArticle> baseResponse) {\n                        super.onNext(baseResponse);\n                        if(baseResponse.getCode() == 0){\n                            getView().getHomeArticleResult(baseResponse);\n                        }else{\n                            ToastUtil.initToast(baseResponse.getMsg());\n                        }\n                    }\n                    @Override\n                    public void onError(Throwable e) {\n                        super.onError(e);\n                    }\n                });\n    }\n\n    @Override\n    public void getHomeProject(int page, boolean isDialog, boolean cancelable) {\n        ServerUtils.getCommonApi().getHomeProject(page)\n                .retryWhen(new RetryWithDelay(3,2))\n                .compose(RxUtils.<BaseResponse<ProjectArticle>>bindToLifecycle(getView()))\n                .compose(RxUtils.<BaseResponse<ProjectArticle>>getSchedulerTransformer())\n                .subscribe(new RequestCallback<BaseResponse<ProjectArticle>>(context, RxErrorHandler.getInstance(),isDialog,cancelable) {\n                    @Override\n                    public void onNext(BaseResponse<ProjectArticle> baseResponse) {\n                        super.onNext(baseResponse);\n                        if(baseResponse.getCode() == 0){\n                            getView().getHomeProjectResult(baseResponse);\n                        }else{\n                            ToastUtil.initToast(baseResponse.getMsg());\n                        }\n                    }\n                    @Override\n                    public void onError(Throwable e) {\n                        super.onError(e);\n                    }\n                });\n    }\n}\n"
  },
  {
    "path": "module_home/src/main/java/com/senon/module_home/presenter/HomeProjectActivityPre.java",
    "content": "package com.senon.module_home.presenter;\n\nimport android.content.Context;\nimport com.senon.lib_common.base.BaseResponse;\nimport com.senon.lib_common.bean.ProjectArticle;\nimport com.senon.lib_common.net.ServerUtils;\nimport com.senon.lib_common.net.callback.RequestCallback;\nimport com.senon.lib_common.net.callback.RxErrorHandler;\nimport com.senon.lib_common.utils.RetryWithDelay;\nimport com.senon.lib_common.utils.RxUtils;\nimport com.senon.lib_common.utils.ToastUtil;\nimport com.senon.module_home.contract.HomeProjectActivityCon;\n\n/**\n * HomeProjectActivityCon  P\n */\npublic class HomeProjectActivityPre extends HomeProjectActivityCon.Presenter{\n\n    private Context context;\n\n    public HomeProjectActivityPre(Context context) {\n        this.context = context;\n    }\n\n    @Override\n    public void getData(int page,boolean isDialog, boolean cancelable) {\n        ServerUtils.getCommonApi().getHomeProject(page)\n                .retryWhen(new RetryWithDelay(3,2))\n                .compose(RxUtils.<BaseResponse<ProjectArticle>>bindToLifecycle(getView()))\n                .compose(RxUtils.<BaseResponse<ProjectArticle>>getSchedulerTransformer())\n                .subscribe(new RequestCallback<BaseResponse<ProjectArticle>>(context, RxErrorHandler.getInstance(),isDialog,cancelable) {\n                    @Override\n                    public void onNext(BaseResponse<ProjectArticle> baseResponse) {\n                        super.onNext(baseResponse);\n                        if(baseResponse.getCode() == 0){\n                            getView().getDataResult(baseResponse);\n                        }else{\n                            ToastUtil.initToast(baseResponse.getMsg());\n                        }\n                    }\n                    @Override\n                    public void onError(Throwable e) {\n                        super.onError(e);\n                    }\n                });\n    }\n\n}\n"
  },
  {
    "path": "module_home/src/main/release/AndroidManifest.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    package=\"com.senon.module_home\">\n\n    <uses-permission android:name=\"android.permission.INTERNET\" />\n\n    <application\n        android:allowBackup=\"true\"\n        >\n        <activity android:name=\".MainActivity\">\n            <intent-filter>\n                <category android:name=\"android.intent.category.DEFAULT\" />\n                <category android:name=\"android.intent.category.BROWSABLE\" />\n                <action android:name=\"android.intent.action.VIEW\" />\n\n                <data\n                    android:host=\"com.senon.module_home\"\n                    android:scheme=\"router\" />\n            </intent-filter>\n        </activity>\n\n        <activity android:name=\".activity.HomeArticleActivity\"></activity>\n        <activity android:name=\".activity.HomeProjectActivity\"></activity>\n\n    </application>\n\n</manifest>"
  },
  {
    "path": "module_home/src/main/res/drawable/home_ic_launcher_background.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"108dp\"\n    android:height=\"108dp\"\n    android:viewportHeight=\"108\"\n    android:viewportWidth=\"108\">\n    <path\n        android:fillColor=\"#26A69A\"\n        android:pathData=\"M0,0h108v108h-108z\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M9,0L9,108\"\n        android:strokeColor=\"#33FFFFFF\"\n        android:strokeWidth=\"0.8\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M19,0L19,108\"\n        android:strokeColor=\"#33FFFFFF\"\n        android:strokeWidth=\"0.8\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M29,0L29,108\"\n        android:strokeColor=\"#33FFFFFF\"\n        android:strokeWidth=\"0.8\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M39,0L39,108\"\n        android:strokeColor=\"#33FFFFFF\"\n        android:strokeWidth=\"0.8\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M49,0L49,108\"\n        android:strokeColor=\"#33FFFFFF\"\n        android:strokeWidth=\"0.8\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M59,0L59,108\"\n        android:strokeColor=\"#33FFFFFF\"\n        android:strokeWidth=\"0.8\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M69,0L69,108\"\n        android:strokeColor=\"#33FFFFFF\"\n        android:strokeWidth=\"0.8\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M79,0L79,108\"\n        android:strokeColor=\"#33FFFFFF\"\n        android:strokeWidth=\"0.8\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M89,0L89,108\"\n        android:strokeColor=\"#33FFFFFF\"\n        android:strokeWidth=\"0.8\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M99,0L99,108\"\n        android:strokeColor=\"#33FFFFFF\"\n        android:strokeWidth=\"0.8\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M0,9L108,9\"\n        android:strokeColor=\"#33FFFFFF\"\n        android:strokeWidth=\"0.8\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M0,19L108,19\"\n        android:strokeColor=\"#33FFFFFF\"\n        android:strokeWidth=\"0.8\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M0,29L108,29\"\n        android:strokeColor=\"#33FFFFFF\"\n        android:strokeWidth=\"0.8\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M0,39L108,39\"\n        android:strokeColor=\"#33FFFFFF\"\n        android:strokeWidth=\"0.8\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M0,49L108,49\"\n        android:strokeColor=\"#33FFFFFF\"\n        android:strokeWidth=\"0.8\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M0,59L108,59\"\n        android:strokeColor=\"#33FFFFFF\"\n        android:strokeWidth=\"0.8\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M0,69L108,69\"\n        android:strokeColor=\"#33FFFFFF\"\n        android:strokeWidth=\"0.8\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M0,79L108,79\"\n        android:strokeColor=\"#33FFFFFF\"\n        android:strokeWidth=\"0.8\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M0,89L108,89\"\n        android:strokeColor=\"#33FFFFFF\"\n        android:strokeWidth=\"0.8\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M0,99L108,99\"\n        android:strokeColor=\"#33FFFFFF\"\n        android:strokeWidth=\"0.8\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M19,29L89,29\"\n        android:strokeColor=\"#33FFFFFF\"\n        android:strokeWidth=\"0.8\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M19,39L89,39\"\n        android:strokeColor=\"#33FFFFFF\"\n        android:strokeWidth=\"0.8\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M19,49L89,49\"\n        android:strokeColor=\"#33FFFFFF\"\n        android:strokeWidth=\"0.8\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M19,59L89,59\"\n        android:strokeColor=\"#33FFFFFF\"\n        android:strokeWidth=\"0.8\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M19,69L89,69\"\n        android:strokeColor=\"#33FFFFFF\"\n        android:strokeWidth=\"0.8\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M19,79L89,79\"\n        android:strokeColor=\"#33FFFFFF\"\n        android:strokeWidth=\"0.8\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M29,19L29,89\"\n        android:strokeColor=\"#33FFFFFF\"\n        android:strokeWidth=\"0.8\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M39,19L39,89\"\n        android:strokeColor=\"#33FFFFFF\"\n        android:strokeWidth=\"0.8\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M49,19L49,89\"\n        android:strokeColor=\"#33FFFFFF\"\n        android:strokeWidth=\"0.8\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M59,19L59,89\"\n        android:strokeColor=\"#33FFFFFF\"\n        android:strokeWidth=\"0.8\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M69,19L69,89\"\n        android:strokeColor=\"#33FFFFFF\"\n        android:strokeWidth=\"0.8\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M79,19L79,89\"\n        android:strokeColor=\"#33FFFFFF\"\n        android:strokeWidth=\"0.8\" />\n</vector>\n"
  },
  {
    "path": "module_home/src/main/res/drawable/home_shape_stro_red_con30.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<shape xmlns:android=\"http://schemas.android.com/apk/res/android\" >\n\n    <!-- view背景色 -->\n    <solid android:color=\"@color/common_white\" />\n    <!-- 边框圆角 -->\n    <corners\n        android:radius=\"@dimen/mm8\" />\n    <stroke android:width=\"@dimen/mm2\"\n        android:color=\"@color/group_red_bg\"/>\n</shape>"
  },
  {
    "path": "module_home/src/main/res/drawable/home_shape_white_con30.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<shape xmlns:android=\"http://schemas.android.com/apk/res/android\" >\n\n    <!-- view背景色 -->\n    <solid android:color=\"@color/common_white\" />\n    <!--<solid android:color=\"#000\" />-->\n    <!-- 边框圆角 -->\n    <corners\n        android:radius=\"@dimen/mm15\" />\n\n</shape>"
  },
  {
    "path": "module_home/src/main/res/layout/home_activity_home_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    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    tools:context=\"com.senon.module_home.activity.HomeArticleActivity\">\n\n\n    <include\n        android:id=\"@+id/toolbar\"\n        layout=\"@layout/layout_toolbar\"\n        android:layout_height=\"wrap_content\"\n        android:layout_width=\"match_parent\" />\n\n    <com.github.jdsjlzx.recyclerview.LRecyclerView\n        android:layout_below=\"@+id/toolbar\"\n        android:id=\"@+id/lrv\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"/>\n\n</RelativeLayout>\n"
  },
  {
    "path": "module_home/src/main/res/layout/home_activity_home_project.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    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    tools:context=\"com.senon.module_home.activity.HomeProjectActivity\">\n\n    <include\n        android:id=\"@+id/toolbar\"\n        android:layout_below=\"@+id/textview\"\n        layout=\"@layout/layout_toolbar\"\n        android:layout_height=\"wrap_content\"\n        android:layout_width=\"match_parent\" />\n\n    <com.github.jdsjlzx.recyclerview.LRecyclerView\n        android:layout_below=\"@+id/toolbar\"\n        android:id=\"@+id/lrv\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"/>\n\n</RelativeLayout>\n"
  },
  {
    "path": "module_home/src/main/res/layout/home_activity_main.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    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    tools:context=\"com.senon.module_home.MainActivity\">\n\n\n    <android.support.v4.view.ViewPager\n        android:id=\"@+id/home_main_vp\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"/>\n\n</RelativeLayout>\n"
  },
  {
    "path": "module_home/src/main/res/layout/home_activity_splash.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    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    tools:context=\"com.senon.module_home.MainActivity\">\n\n    <TextView\n        android:id=\"@+id/home_main_login_tv\"\n        android:background=\"#d4cccc\"\n        android:layout_centerInParent=\"true\"\n        android:padding=\"@dimen/mm10\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:text=\"跳转到登录\"\n        android:textSize=\"@dimen/mm30\"\n        />\n\n</RelativeLayout>\n"
  },
  {
    "path": "module_home/src/main/res/layout/home_adapter_homemain_fragment_article.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\">\n\n\n    <RelativeLayout\n        android:visibility=\"gone\"\n        android:id=\"@+id/top_layout\"\n        android:layout_marginTop=\"@dimen/mm40\"\n        android:paddingLeft=\"@dimen/mm20\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"@dimen/mm80\">\n        <TextView\n            android:background=\"@drawable/shape_gradient\"\n            android:layout_centerVertical=\"true\"\n            android:layout_width=\"@dimen/mm5\"\n            android:layout_height=\"@dimen/mm40\" />\n        <TextView\n            android:textStyle=\"bold\"\n            android:layout_centerVertical=\"true\"\n            android:layout_marginLeft=\"@dimen/mm20\"\n            android:textColor=\"@color/color_232323\"\n            android:text=\"最新博文\"\n            android:textSize=\"@dimen/mm40\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\" />\n        <TextView\n            android:id=\"@+id/more_tv\"\n            android:layout_marginRight=\"@dimen/mm20\"\n            android:layout_centerVertical=\"true\"\n            android:layout_alignParentRight=\"true\"\n            android:layout_marginLeft=\"@dimen/mm20\"\n            android:textColor=\"@color/common_black_999\"\n            android:text=\"查看全部\"\n            android:textSize=\"@dimen/mm28\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\" />\n    </RelativeLayout>\n\n    <RelativeLayout\n        android:id=\"@+id/content_lay\"\n        android:layout_marginTop=\"@dimen/mm15\"\n        android:layout_below=\"@+id/top_layout\"\n        android:background=\"@drawable/home_shape_white_con30\"\n        android:layout_marginLeft=\"@dimen/mm20\"\n        android:layout_marginRight=\"@dimen/mm20\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\">\n        <TextView\n            android:id=\"@+id/type_tv\"\n            android:layout_marginTop=\"@dimen/mm15\"\n            android:layout_marginLeft=\"@dimen/mm20\"\n            android:layout_marginRight=\"@dimen/mm20\"\n            android:textColor=\"@color/common_black_777\"\n            android:text=\"分类\"\n            android:textSize=\"@dimen/mm26\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\" />\n        <TextView\n            android:id=\"@+id/content_tv\"\n            android:singleLine=\"true\"\n            android:layout_below=\"@+id/type_tv\"\n            android:layout_marginTop=\"@dimen/mm7\"\n            android:layout_marginLeft=\"@dimen/mm20\"\n            android:layout_marginRight=\"@dimen/mm20\"\n            android:textColor=\"@color/color_232323\"\n            android:text=\"标题\"\n            android:textSize=\"@dimen/mm32\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\" />\n        <TextView\n            android:layout_below=\"@+id/content_tv\"\n            android:id=\"@+id/user_tv\"\n            android:layout_marginTop=\"@dimen/mm7\"\n            android:layout_marginLeft=\"@dimen/mm20\"\n            android:layout_marginRight=\"@dimen/mm30\"\n            android:layout_marginBottom=\"@dimen/mm15\"\n            android:textColor=\"@color/common_black_999\"\n            android:text=\"姓名\"\n            android:textSize=\"@dimen/mm24\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\" />\n        <TextView\n            android:layout_toRightOf=\"@+id/user_tv\"\n            android:layout_below=\"@+id/content_tv\"\n            android:id=\"@+id/time_tv\"\n            android:layout_marginTop=\"@dimen/mm7\"\n            android:layout_marginRight=\"@dimen/mm30\"\n            android:textColor=\"@color/common_black_999\"\n            android:text=\"时间\"\n            android:textSize=\"@dimen/mm24\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\" />\n        <TextView\n            android:background=\"@drawable/home_shape_stro_red_con30\"\n            android:layout_alignParentRight=\"true\"\n            android:id=\"@+id/new_tv\"\n            android:layout_marginTop=\"@dimen/mm15\"\n            android:layout_marginRight=\"@dimen/mm30\"\n            android:textColor=\"@color/group_red_bg\"\n            android:paddingTop=\"@dimen/mm2\"\n            android:paddingBottom=\"@dimen/mm2\"\n            android:paddingLeft=\"@dimen/mm10\"\n            android:paddingRight=\"@dimen/mm10\"\n            android:text=\"新\"\n            android:textSize=\"@dimen/mm28\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\" />\n\n        <TextView\n            android:padding=\"@dimen/mm5\"\n            android:layout_below=\"@+id/content_tv\"\n            android:layout_alignParentRight=\"true\"\n            android:id=\"@+id/collection_tv\"\n            android:layout_marginRight=\"@dimen/mm25\"\n            android:textColor=\"@color/common_black_999\"\n            android:text=\"收藏\"\n            android:textSize=\"@dimen/mm26\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\" />\n    </RelativeLayout>\n\n</RelativeLayout>"
  },
  {
    "path": "module_home/src/main/res/layout/home_adapter_homemain_fragment_banneritem.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:orientation=\"vertical\" android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\">\n\n\n    <ImageView\n        android:id=\"@+id/igv\"\n        android:scaleType=\"centerCrop\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\" />\n\n</LinearLayout>"
  },
  {
    "path": "module_home/src/main/res/layout/home_adapter_homemain_fragment_head.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\">\n\n    <TextView\n        android:textStyle=\"bold\"\n        android:id=\"@+id/textview\"\n        android:layout_marginTop=\"@dimen/mm40\"\n        android:layout_marginLeft=\"@dimen/mm20\"\n        android:layout_marginBottom=\"@dimen/mm40\"\n        android:text=\"首页\"\n        android:textSize=\"@dimen/mm56\"\n        android:textColor=\"@color/transport_3\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\" />\n\n    <com.zhouwei.mzbanner.MZBannerView\n        android:layout_marginLeft=\"@dimen/mm20\"\n        android:layout_marginRight=\"@dimen/mm20\"\n        android:layout_below=\"@+id/textview\"\n        android:id=\"@+id/banner\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"@dimen/mm320\"\n        app:open_mz_mode=\"true\"\n        app:canLoop=\"true\"\n        app:indicatorAlign=\"center\"\n        app:indicatorPaddingLeft=\"@dimen/mm20\"\n        />\n</RelativeLayout>"
  },
  {
    "path": "module_home/src/main/res/layout/home_adapter_homemain_fragment_project.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:layout_width=\"match_parent\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    android:layout_height=\"wrap_content\">\n\n    <RelativeLayout\n        android:visibility=\"gone\"\n        android:id=\"@+id/top_layout\"\n        android:layout_marginTop=\"@dimen/mm40\"\n        android:paddingLeft=\"@dimen/mm20\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"@dimen/mm80\">\n        <TextView\n            android:background=\"@drawable/shape_gradient\"\n            android:layout_centerVertical=\"true\"\n            android:layout_width=\"@dimen/mm5\"\n            android:layout_height=\"@dimen/mm40\" />\n        <TextView\n            android:textStyle=\"bold\"\n            android:layout_centerVertical=\"true\"\n            android:layout_marginLeft=\"@dimen/mm20\"\n            android:textColor=\"@color/color_232323\"\n            android:text=\"最新项目\"\n            android:textSize=\"@dimen/mm40\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\" />\n        <TextView\n            android:id=\"@+id/more_tv\"\n            android:layout_marginRight=\"@dimen/mm20\"\n            android:layout_centerVertical=\"true\"\n            android:layout_alignParentRight=\"true\"\n            android:layout_marginLeft=\"@dimen/mm20\"\n            android:textColor=\"@color/common_black_999\"\n            android:text=\"查看全部\"\n            android:textSize=\"@dimen/mm28\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\" />\n    </RelativeLayout>\n\n    <RelativeLayout\n        android:id=\"@+id/content_lay\"\n        android:background=\"@drawable/home_shape_white_con30\"\n        android:layout_marginTop=\"@dimen/mm15\"\n        android:layout_marginLeft=\"@dimen/mm20\"\n        android:layout_marginRight=\"@dimen/mm20\"\n        android:padding=\"@dimen/mm20\"\n        android:layout_below=\"@+id/top_layout\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"@dimen/mm260\">\n\n        <android.support.v7.widget.CardView\n            android:id=\"@+id/cardview\"\n            android:layout_width=\"@dimen/mm200\"\n            android:layout_height=\"@dimen/mm220\"\n            app:cardCornerRadius=\"@dimen/mm8\"\n            app:cardElevation=\"0px\">\n            <ImageView\n                android:scaleType=\"centerCrop\"\n                android:id=\"@+id/content_igv\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"match_parent\" />\n        </android.support.v7.widget.CardView>\n\n        <TextView\n            android:id=\"@+id/title_tv\"\n            android:singleLine=\"true\"\n            android:layout_toRightOf=\"@+id/cardview\"\n            android:layout_marginTop=\"@dimen/mm3\"\n            android:layout_marginLeft=\"@dimen/mm20\"\n            android:layout_marginRight=\"@dimen/mm20\"\n            android:textColor=\"@color/color_232323\"\n            android:text=\"标题\"\n            android:textSize=\"@dimen/mm34\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\" />\n\n        <TextView\n            android:id=\"@+id/content_tv\"\n            android:maxLines=\"3\"\n            android:layout_toRightOf=\"@+id/cardview\"\n            android:layout_below=\"@+id/title_tv\"\n            android:layout_marginTop=\"@dimen/mm18\"\n            android:layout_marginLeft=\"@dimen/mm20\"\n            android:layout_marginRight=\"@dimen/mm20\"\n            android:text=\"分类分类分分类分类分类类分类分类分类分类分类分类分类分类分类分类\"\n            android:textSize=\"@dimen/mm28\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\" />\n\n        <TextView\n            android:layout_alignParentBottom=\"true\"\n            android:id=\"@+id/user_tv\"\n            android:layout_toRightOf=\"@+id/cardview\"\n            android:layout_marginLeft=\"@dimen/mm20\"\n            android:layout_marginRight=\"@dimen/mm30\"\n            android:layout_marginBottom=\"@dimen/mm5\"\n            android:textColor=\"@color/common_black_999\"\n            android:text=\"姓名\"\n            android:textSize=\"@dimen/mm26\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\" />\n\n        <TextView\n            android:layout_toRightOf=\"@+id/user_tv\"\n            android:layout_alignParentBottom=\"true\"\n            android:layout_marginBottom=\"@dimen/mm5\"\n            android:id=\"@+id/time_tv\"\n            android:layout_marginTop=\"@dimen/mm10\"\n            android:layout_marginRight=\"@dimen/mm30\"\n            android:textColor=\"@color/common_black_999\"\n            android:text=\"时间\"\n            android:textSize=\"@dimen/mm26\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\" />\n\n    </RelativeLayout>\n\n    <View\n        android:layout_below=\"@+id/content_lay\"\n        android:id=\"@+id/home_placeholder_tv\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"@dimen/mm50\"/>\n</RelativeLayout>"
  },
  {
    "path": "module_home/src/main/res/layout/home_fragment_main.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:layout_width=\"match_parent\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    android:orientation=\"vertical\"\n    android:layout_height=\"match_parent\">\n\n    <TextView\n        android:id=\"@+id/placeholder\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"@dimen/mm40\" />\n\n    <RelativeLayout\n        android:layout_below=\"@+id/placeholder\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\">\n\n        <com.scwang.smartrefresh.layout.SmartRefreshLayout\n            android:id=\"@+id/home_refreshLayout\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"match_parent\"\n            app:srlEnablePreviewInEditMode=\"true\">\n\n            <android.support.v7.widget.RecyclerView\n                android:id=\"@+id/home_homefragment_lrv\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"match_parent\" />\n\n        </com.scwang.smartrefresh.layout.SmartRefreshLayout>\n\n        <ImageView\n            android:visibility=\"gone\"\n            android:layout_centerInParent=\"true\"\n            android:id=\"@+id/empty_igv\"\n            android:layout_width=\"@dimen/mm350\"\n            android:layout_height=\"@dimen/mm350\" />\n\n        <TextView\n            android:visibility=\"gone\"\n            android:background=\"@color/common_white\"\n            android:id=\"@+id/home_homefragment_title_tv\"\n            android:gravity=\"center\"\n            android:textColor=\"@color/color_232323\"\n            android:text=\"首页\"\n            android:textSize=\"@dimen/mm42\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"@dimen/mm90\" />\n    </RelativeLayout>\n\n</RelativeLayout>\n"
  },
  {
    "path": "module_home/src/main/res/values/colors.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <color name=\"home_colorPrimary\">#3F51B5</color>\n    <color name=\"home_colorPrimaryDark\">#303F9F</color>\n    <color name=\"home_colorAccent\">#FF4081</color>\n</resources>\n"
  },
  {
    "path": "module_home/src/main/res/values/strings.xml",
    "content": "<resources>\n    <string name=\"home_app_name\">玩安卓_主页</string>\n</resources>\n"
  },
  {
    "path": "module_home/src/main/res/values/styles.xml",
    "content": "<resources>\n\n    <!-- Base application theme. -->\n    <style name=\"home_AppTheme\" 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    </style>\n\n</resources>\n"
  },
  {
    "path": "module_home/src/test/java/com/senon/module_home/ExampleUnitTest.java",
    "content": "package com.senon.module_home;\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": "module_life/.gitignore",
    "content": "/build\n"
  },
  {
    "path": "module_life/build.gradle",
    "content": "if(isBuildModule.toBoolean()){\n    apply plugin: 'com.android.application'\n}else{\n    apply plugin: 'com.android.library'\n}\n\nandroid {\n    compileSdkVersion rootProject.ext.android[\"compileSdkVersion\"]\n\n    resourcePrefix \"life_\"\n\n    sourceSets {\n        main {\n            if (isBuildModule.toBoolean()) {\n                manifest.srcFile 'src/main/debug/AndroidManifest.xml'\n            } else {\n                manifest.srcFile 'src/main/release/AndroidManifest.xml'\n                java{\n                    //全部Module一起编译的时候剔除debug目录\n                    exclude '**/**/debug/**'\n                }\n            }\n        }\n    }\n\n    defaultConfig {\n        if(isBuildModule.toBoolean()){\n            applicationId \"com.senon.module_life\"\n        }\n        minSdkVersion rootProject.ext.android[\"minSdkVersion\"]\n        targetSdkVersion rootProject.ext.android[\"targetSdkVersion\"]\n        versionCode rootProject.ext.android[\"versionCode\"]\n        versionName rootProject.ext.android[\"versionName\"]\n\n        testInstrumentationRunner \"android.support.test.runner.AndroidJUnitRunner\"\n        javaCompileOptions {\n            annotationProcessorOptions {\n                arguments = [AROUTER_MODULE_NAME: project.getName()]\n            }\n        }\n    }\n\n    buildTypes {\n        release {\n            minifyEnabled false\n            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'\n        }\n    }\n\n}\n\ndependencies {\n    implementation fileTree(dir: 'libs', include: ['*.jar'])\n    androidTestImplementation 'com.android.support.test:runner:1.0.2'\n    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'\n    testImplementation rootProject.ext.dependencies[\"junit\"]\n\n    api project(':lib_common')\n    annotationProcessor rootProject.ext.dependencies[\"router-compiler\"]\n    api rootProject.ext.dependencies[\"flowlayout\"]\n\n\n}\n"
  },
  {
    "path": "module_life/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": "module_life/src/androidTest/java/com/senon/module_life/ExampleInstrumentedTest.java",
    "content": "package com.senon.module_life;\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.senon.module_life\", appContext.getPackageName());\n    }\n}\n"
  },
  {
    "path": "module_life/src/main/debug/AndroidManifest.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    package=\"com.senon.module_life\">\n\n    <uses-permission android:name=\"android.permission.INTERNET\"/>\n\n\n    <application\n        android:name=\".App_Life\"\n        android:allowBackup=\"true\"\n        android:icon=\"@mipmap/ic_logo\"\n        android:label=\"@string/life_app_name\"\n        android:roundIcon=\"@mipmap/life_ic_launcher_round\"\n        android:supportsRtl=\"true\"\n        tools:replace=\"android:icon,label\"\n        android:theme=\"@style/AppTheme\">\n        <activity android:name=\".MainActivity\">\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 android:name=\".SplashActivity\"></activity>\n        <activity android:name=\".activity.KnowledgeSystemActivity\"></activity>\n\n    </application>\n\n</manifest>"
  },
  {
    "path": "module_life/src/main/java/com/senon/module_life/App_Life.java",
    "content": "package com.senon.module_life;\n\nimport com.alibaba.android.arouter.launcher.ARouter;\nimport com.senon.lib_common.base.BaseApplication;\nimport com.senon.lib_common.utils.ConstantUtils;\n\n/**\n * life debug  Application\n */\npublic class App_Life extends BaseApplication {\n    @Override\n    public void onCreate() {\n        super.onCreate();\n\n        initARouter();\n    }\n\n    private void initARouter() {\n        if (ConstantUtils.isAppDebug()) {\n            //开启InstantRun之后，一定要在ARouter.init之前调用openDebug\n            ARouter.openDebug();\n            ARouter.openLog();\n        }\n        ARouter.init(this);\n    }\n}\n"
  },
  {
    "path": "module_life/src/main/java/com/senon/module_life/MainActivity.java",
    "content": "package com.senon.module_life;\n\nimport android.support.v4.app.Fragment;\nimport android.support.v4.app.FragmentManager;\nimport android.support.v4.app.FragmentPagerAdapter;\nimport android.support.v4.view.ViewPager;\nimport android.support.v7.app.AppCompatActivity;\nimport android.os.Bundle;\nimport com.alibaba.android.arouter.facade.annotation.Route;\nimport com.alibaba.android.arouter.launcher.ARouter;\nimport com.senon.lib_common.ComUtil;\nimport com.senon.lib_common.ConstantLoginArouter;\nimport com.senon.lib_common.utils.StatusBarUtils;\nimport com.senon.module_life.fragment.LifeMainFragment;\n\n/**\n * life 首页\n */\n@Route(path = ConstantLoginArouter.PATH_LIFE_MAINACTIVITY)\npublic class MainActivity extends AppCompatActivity {\n\n    private ViewPager viewPager;\n    private FragmentManager fragmentManager;//声明fragment管理\n    private LifeMainFragment fragment;\n    @Override\n    protected void onCreate(Bundle savedInstanceState) {\n        super.onCreate(savedInstanceState);\n        StatusBarUtils.with(this).init();\n        setContentView(R.layout.life_activity_main);\n        ComUtil.changeStatusBarTextColor(this,true);\n        ARouter.getInstance().inject(this);\n        findView();\n    }\n\n    private void findView() {\n        viewPager = findViewById(R.id.life_main_vp);\n        fragmentManager = getSupportFragmentManager();\n        fragment = new LifeMainFragment();\n        viewPager.setAdapter(new MyFragmentPagerAdapter(fragmentManager));\n\n    }\n\n\n    //FragmentPagerAdapter\n    class MyFragmentPagerAdapter extends FragmentPagerAdapter {\n        public MyFragmentPagerAdapter(FragmentManager fm) {\n            super(fm);\n        }\n        @Override\n        public Fragment getItem(int position) {\n            return fragment;\n        }\n        @Override\n        public int getCount() {\n            return 1;\n        }\n    }\n}\n"
  },
  {
    "path": "module_life/src/main/java/com/senon/module_life/SplashActivity.java",
    "content": "package com.senon.module_life;\n\nimport android.os.Bundle;\nimport android.support.v7.app.AppCompatActivity;\nimport android.view.View;\n\nimport com.alibaba.android.arouter.launcher.ARouter;\nimport com.senon.lib_common.ConstantLoginArouter;\n\npublic class SplashActivity extends AppCompatActivity {\n\n    @Override\n    protected void onCreate(Bundle savedInstanceState) {\n        super.onCreate(savedInstanceState);\n        setContentView(R.layout.life_activity_splash);\n\n        findViewById(R.id.life_main_login_tv).setOnClickListener(new View.OnClickListener() {\n            @Override\n            public void onClick(View view) {\n                String curUrl = ConstantLoginArouter.PATH_LIFE_MAINACTIVITY;\n                ARouter.getInstance().build(ConstantLoginArouter.PATH_COMMON_LOGINACTIVITY)\n                        .withString(\"targetUrl\",curUrl)\n                        .navigation();\n            }\n        });\n    }\n}\n"
  },
  {
    "path": "module_life/src/main/java/com/senon/module_life/activity/KnowledgeSystemActivity.java",
    "content": "package com.senon.module_life.activity;\n\nimport android.support.v7.widget.LinearLayoutManager;\nimport android.text.Html;\nimport android.view.View;\nimport android.widget.TextView;\n\nimport com.alibaba.android.arouter.facade.annotation.Autowired;\nimport com.alibaba.android.arouter.facade.annotation.Route;\nimport com.alibaba.android.arouter.launcher.ARouter;\nimport com.github.jdsjlzx.interfaces.OnLoadMoreListener;\nimport com.github.jdsjlzx.interfaces.OnRefreshListener;\nimport com.github.jdsjlzx.recyclerview.LRecyclerView;\nimport com.github.jdsjlzx.recyclerview.LRecyclerViewAdapter;\nimport com.github.jdsjlzx.recyclerview.ProgressStyle;\nimport com.senon.lib_common.ComUtil;\nimport com.senon.lib_common.ConstantArouter;\nimport com.senon.lib_common.ConstantLoginArouter;\nimport com.senon.lib_common.adapter.RecycleHolder;\nimport com.senon.lib_common.adapter.RecyclerAdapter;\nimport com.senon.lib_common.base.BaseActivity;\nimport com.senon.lib_common.base.BaseResponse;\nimport com.senon.lib_common.bean.HomeArticle;\nimport com.senon.lib_common.bean.KnowledgeSysArticle;\nimport com.senon.lib_common.utils.BaseEvent;\nimport com.senon.lib_common.utils.StatusBarUtils;\nimport com.senon.module_life.R;\nimport com.senon.module_life.contract.KnowledgeSysActivityCon;\nimport com.senon.module_life.presenter.KnowledgeSysActivityPre;\nimport org.greenrobot.eventbus.EventBus;\nimport org.greenrobot.eventbus.Subscribe;\nimport org.greenrobot.eventbus.ThreadMode;\nimport java.util.ArrayList;\n\n/**\n * 体系列表页\n */\n@Route(path = ConstantArouter.PATH_LIFE_KNOWLEDGESYSTEMACTIVITY)\npublic class KnowledgeSystemActivity extends BaseActivity<KnowledgeSysActivityCon.View,KnowledgeSysActivityCon.Presenter> implements\n        KnowledgeSysActivityCon.View {\n\n    @Autowired\n    int cid;\n    @Autowired\n    String title;\n    private LRecyclerView lrv;\n    private TextView toolbar_title_tv;\n    private boolean isLoadMore = false;//是否加载更多\n    private boolean isDownRefesh = false;//是否下拉刷新\n    private int currentPage = 0;//当前页数\n    private RecyclerAdapter<KnowledgeSysArticle.DatasBean> adapter;\n    private KnowledgeSysArticle project;\n    private ArrayList<KnowledgeSysArticle.DatasBean> mData = new ArrayList<>();//原始数据\n    private ArrayList<KnowledgeSysArticle.DatasBean> tempData = new ArrayList<>();//间接数据\n    private LRecyclerViewAdapter mLRecyclerViewAdapter;//Lrecyclerview的包装适配器\n\n    @Override\n    public int getLayoutId() {\n        StatusBarUtils.with(this).init();\n        return R.layout.life_activity_home_article;\n    }\n    @Override\n    public KnowledgeSysActivityCon.Presenter createPresenter() {\n        return new KnowledgeSysActivityPre(this);\n    }\n    @Override\n    public KnowledgeSysActivityCon.View createView() {\n        return this;\n    }\n\n    @Override\n    public void init() {\n        ComUtil.changeStatusBarTextColor(this,true);\n        EventBus.getDefault().register(this);\n\n        lrv = findViewById(R.id.lrv);\n        toolbar_title_tv = ((TextView)findViewById(R.id.toolbar_title_tv));\n        toolbar_title_tv.setText(title);\n        toolbar_title_tv.setOnClickListener(new View.OnClickListener() {\n            @Override\n            public void onClick(View v) {\n                lrv.smoothScrollToPosition(0);\n            }\n        });\n        findViewById(R.id.toolbar_back_igv).setOnClickListener(new View.OnClickListener() {\n            @Override\n            public void onClick(View v) {\n                finish();\n            }\n        });\n\n        initLRecyclerVeiw();\n    }\n\n    private void initLRecyclerVeiw() {\n        LinearLayoutManager manager = new LinearLayoutManager(this);\n        lrv.setLayoutManager(manager);\n        lrv.setRefreshProgressStyle(ProgressStyle.LineSpinFadeLoader); //设置下拉刷新Progress的样式\n        lrv.setArrowImageView(R.mipmap.news_renovate);  //设置下拉刷新箭头\n        lrv.setLoadingMoreProgressStyle(ProgressStyle.BallSpinFadeLoader);\n        adapter = new RecyclerAdapter<KnowledgeSysArticle.DatasBean>(this, mData,R.layout.life_adapter_knowledgesys_item) {\n            @Override\n            public void convert(final RecycleHolder helper, final KnowledgeSysArticle.DatasBean data, final int position) {\n                helper.setText(R.id.content_tv, Html.fromHtml(data.getTitle()).toString());\n                helper.setText(R.id.user_tv,data.getAuthor());\n                helper.setText(R.id.time_tv,data.getNiceDate());\n                helper.setText(R.id.collection_tv,data.isCollect() ? \"已收藏\":\"收藏\");\n                helper.setVisible(R.id.top_layout,false);\n\n                helper.setOnClickListener(R.id.content_lay, new View.OnClickListener() {\n                    @Override\n                    public void onClick(View v) {\n                        ARouter.getInstance().build(ConstantArouter.PATH_COMMON_WEBVIEWCTIVITY)\n                                .withInt(\"id\",data.getId())\n                                .withString(\"url\",data.getLink())\n                                .withString(\"title\",data.getTitle())\n                                .withBoolean(\"isCollection\",data.isCollect())\n                                .navigation();\n                    }\n                });\n                helper.setOnClickListener(R.id.collection_tv, new View.OnClickListener() {\n                    @Override\n                    public void onClick(View v) {\n                        if(data.isCollect()){//已收藏\n                            helper.setText(R.id.collection_tv,\"收藏\");\n                            data.setCollect(!data.isCollect());\n                            getPresenter().getUnollect(data.getId(),false,true);\n                        }else{\n                            helper.setText(R.id.collection_tv,\"已收藏\");\n                            data.setCollect(!data.isCollect());\n                            getPresenter().getCollect(data.getId(),false,true);\n                        }\n                    }\n                });\n            }\n        };\n        mLRecyclerViewAdapter = new LRecyclerViewAdapter(adapter);\n        lrv.setAdapter(mLRecyclerViewAdapter);\n        //设置底部加载颜色\n        lrv.setFooterViewColor(R.color.color_blue, R.color.text_gray, R.color.elegant_bg);\n        lrv.setHeaderViewColor(R.color.color_blue, R.color.text_gray, R.color.elegant_bg);\n        lrv.setOnRefreshListener(new OnRefreshListener() {\n            @Override\n            public void onRefresh() {\n                getFirstPageData();\n            }\n        });\n        lrv.setOnLoadMoreListener(new OnLoadMoreListener() {\n            @Override\n            public void onLoadMore() {\n                isLoadMore = true;\n                currentPage++;\n                getOrderList();\n            }\n        });\n\n        lrv.forceToRefresh();\n    }\n\n\n    private void getFirstPageData() {\n        isDownRefesh = true;\n        currentPage = 0;\n        getOrderList();\n    }\n\n    private void getOrderList() {\n        getPresenter().getData(cid,currentPage,false,true);\n    }\n\n    private void refreshData() {\n        if (lrv == null) {\n            return;\n        }\n        lrv.refreshComplete(currentPage);\n        mLRecyclerViewAdapter.notifyDataSetChanged();\n        isDownRefesh = false;\n        isLoadMore = false;\n    }\n    \n    @Override\n    public void getDataResult(BaseResponse<KnowledgeSysArticle> data) {\n        project = data.getData();\n\n        tempData.clear();\n        tempData.addAll(data.getData().getDatas());\n        if (tempData.size() == 0 && mData.size() > 0 && isLoadMore) {//最后一页时\n            lrv.setNoMore(true);\n            isLoadMore = false;\n        } else if (isDownRefesh) {//下拉刷新时\n            mData.clear();\n            mData.addAll(tempData);\n            refreshData();\n        } else {//加载更多时\n            mData.addAll(tempData);\n            refreshData();\n        }\n    }\n\n    @Subscribe(threadMode = ThreadMode.MAIN) //在ui线程执行\n    public void onEventReceived(BaseEvent event) {\n        if (event.getCode() == 101) {\n            int id = event.getId();\n            boolean isCollect = event.isCollect();\n            for (KnowledgeSysArticle.DatasBean bean : mData) {\n                if(bean.getId() == id){\n                    bean.setCollect(isCollect);\n\n                    mLRecyclerViewAdapter.notifyDataSetChanged();\n                    return;\n                }\n            }\n        }\n    }\n\n    @Override\n    public void getCollectResult(int id, boolean isCollect) {\n        BaseEvent event = new BaseEvent();\n        event.setCode(101);\n        event.setId(id);\n        event.setCollect(isCollect);\n        EventBus.getDefault().post(event);\n    }\n\n    @Override\n    public void getCollFailResult(int id) {\n        for (KnowledgeSysArticle.DatasBean bean : mData) {\n            if(bean.getId() == id){\n                bean.setCollect(!bean.isCollect());\n\n                mLRecyclerViewAdapter.notifyDataSetChanged();\n                break;\n            }\n        }\n\n        ARouter.getInstance().build(ConstantLoginArouter.PATH_COMMON_LOGINACTIVITY)\n                .navigation();\n    }\n\n    @Override\n    protected void onDestroy() {\n        super.onDestroy();\n        EventBus.getDefault().unregister(this);\n    }\n}\n"
  },
  {
    "path": "module_life/src/main/java/com/senon/module_life/contract/KnowledgeSysActivityCon.java",
    "content": "package com.senon.module_life.contract;\n\nimport com.senon.lib_common.base.BasePresenter;\nimport com.senon.lib_common.base.BaseResponse;\nimport com.senon.lib_common.base.BaseViewImp;\nimport com.senon.lib_common.bean.KnowledgeSysArticle;\n\n\npublic interface KnowledgeSysActivityCon {\n\n    interface View extends BaseViewImp {\n\n        void getDataResult(BaseResponse<KnowledgeSysArticle> data);\n\n        void getCollectResult(int id,boolean isCollect);\n\n        void getCollFailResult(int id);\n\n    }\n\n    abstract class Presenter extends BasePresenter<View> {\n\n        public abstract void getData(int cid,int page,boolean isDialog, boolean cancelable);\n\n        public abstract void getCollect(int id ,boolean isDialog, boolean cancelable);\n\n        public abstract void getUnollect(int id, boolean isDialog, boolean cancelable);\n    }\n}\n"
  },
  {
    "path": "module_life/src/main/java/com/senon/module_life/contract/LifeMainFragmentCon.java",
    "content": "package com.senon.module_life.contract;\n\nimport com.senon.lib_common.base.BasePresenter;\nimport com.senon.lib_common.base.BaseViewImp;\nimport com.senon.lib_common.base.BaseResponse;\nimport com.senon.lib_common.bean.KnowledgeSystem;\n\nimport java.util.HashMap;\nimport java.util.List;\n\n/**\n * LifeMainFragmentCon  V 、P契约类\n */\npublic interface LifeMainFragmentCon {\n\n    interface View extends BaseViewImp {\n\n        void getKnowledgeListResult(BaseResponse<List<KnowledgeSystem>> data);\n\n    }\n\n    abstract class Presenter extends BasePresenter<View> {\n\n        public abstract void getKnowledgeList(boolean isDialog, boolean cancelable);\n\n    }\n}\n"
  },
  {
    "path": "module_life/src/main/java/com/senon/module_life/fragment/LifeMainFragment.java",
    "content": "package com.senon.module_life.fragment;\n\nimport android.support.v7.widget.LinearLayoutManager;\nimport android.support.v7.widget.RecyclerView;\nimport android.view.LayoutInflater;\nimport android.view.View;\nimport android.widget.ImageView;\nimport android.widget.TextView;\n\nimport com.alibaba.android.arouter.launcher.ARouter;\nimport com.github.jdsjlzx.interfaces.OnLoadMoreListener;\nimport com.github.jdsjlzx.interfaces.OnRefreshListener;\nimport com.github.jdsjlzx.recyclerview.LRecyclerView;\nimport com.github.jdsjlzx.recyclerview.LRecyclerViewAdapter;\nimport com.github.jdsjlzx.recyclerview.ProgressStyle;\nimport com.scwang.smartrefresh.layout.SmartRefreshLayout;\nimport com.scwang.smartrefresh.layout.api.RefreshLayout;\nimport com.senon.lib_common.ConstantArouter;\nimport com.senon.lib_common.adapter.RecycleHolder;\nimport com.senon.lib_common.adapter.RecyclerAdapter;\nimport com.senon.lib_common.base.BaseLazyFragment;\nimport com.senon.lib_common.base.BaseResponse;\nimport com.senon.lib_common.bean.Banner;\nimport com.senon.lib_common.bean.KnowledgeSystem;\nimport com.senon.lib_common.utils.BaseEvent;\nimport com.senon.lib_common.utils.LogUtils;\nimport com.senon.lib_common.utils.ToastUtil;\nimport com.senon.module_life.R;\nimport com.senon.module_life.contract.LifeMainFragmentCon;\nimport com.senon.module_life.presenter.LifeMainFragmentPre;\nimport com.zhy.view.flowlayout.FlowLayout;\nimport com.zhy.view.flowlayout.TagAdapter;\nimport com.zhy.view.flowlayout.TagFlowLayout;\n\nimport org.greenrobot.eventbus.EventBus;\nimport org.greenrobot.eventbus.Subscribe;\nimport org.greenrobot.eventbus.ThreadMode;\n\nimport java.util.ArrayList;\nimport java.util.HashMap;\nimport java.util.List;\n\n/**\n * 体系homefragment\n */\npublic class LifeMainFragment extends BaseLazyFragment<LifeMainFragmentCon.View, LifeMainFragmentCon.Presenter> implements\n        LifeMainFragmentCon.View {\n\n    private RecyclerView lrv;\n    private SmartRefreshLayout life_refreshLayout;\n    private TextView life_homefragment_title_tv;\n    private List<KnowledgeSystem> knowledges = new ArrayList<>();\n    private LinearLayoutManager layoutManager;\n    private RecyclerAdapter<KnowledgeSystem> adapter;\n\n    @Override\n    public int getLayoutId() {\n        return R.layout.life_fragment_main;\n    }\n    @Override\n    public LifeMainFragmentCon.Presenter createPresenter() {\n        return new LifeMainFragmentPre(mContext);\n    }\n    @Override\n    public LifeMainFragmentCon.View createView() {\n        return this;\n    }\n    @Override\n    public void init(View rootView) {\n        lrv = rootView.findViewById(R.id.life_homefragment_lrv);\n        life_refreshLayout = rootView.findViewById(R.id.life_refreshLayout);\n        life_homefragment_title_tv = rootView.findViewById(R.id.life_homefragment_title_tv);\n        life_homefragment_title_tv.setOnClickListener(new View.OnClickListener() {\n            @Override\n            public void onClick(View v) {\n                if(lrv != null && adapter!= null){\n                    lrv.smoothScrollToPosition(0);\n                }\n            }\n        });\n    }\n\n    @Override\n    public void onFragmentFirst() {\n        super.onFragmentFirst();\n        //第一次可见时，自动加载页面\n        LogUtils.e(\"-----> 子fragment进行初始化操作\");\n\n        //注册eventbus\n        EventBus.getDefault().register(this);\n        //初始化adapter 设置适配器\n        initAdapter();\n        //添加滑动位置监听\n        addLrvListener();\n    }\n\n    private void addLrvListener() {\n        lrv.addOnScrollListener(new RecyclerView.OnScrollListener() {\n            @Override\n            public void onScrolled(RecyclerView recyclerView, int dx, int dy) {\n                super.onScrolled(recyclerView, dx, dy);\n                //在此做处理\n                if (null != layoutManager) {\n                    //当前条目索引\n                    int position = layoutManager.findFirstVisibleItemPosition();\n                    if(position > 1){\n                        life_homefragment_title_tv.setVisibility(View.VISIBLE);\n                    }else if(position >= 0){\n                        //根据view的高度来做显示隐藏判断\n                        //根据索引来获取对应的itemView\n                        View firstVisiableChildView = layoutManager.findViewByPosition(position);\n                        //获取当前显示条目的高度\n                        int itemHeight = firstVisiableChildView.getHeight();\n                        //获取当前Recyclerview 偏移量\n                        int offset = - firstVisiableChildView.getTop();\n                        if (offset > itemHeight / 4) {\n                            //做显示布局操作\n                            life_homefragment_title_tv.setVisibility(View.VISIBLE);\n                        } else {\n                            //做隐藏布局操作\n                            life_homefragment_title_tv.setVisibility(View.GONE);\n                        }\n                    }\n                }\n            }\n        });\n\n    }\n\n    private void getFirstData() {\n        getPresenter().getKnowledgeList(false,true);\n    }\n\n    private void initAdapter() {\n        layoutManager = new LinearLayoutManager(getContext(), LinearLayoutManager.VERTICAL, false);\n        lrv.setLayoutManager(layoutManager);\n        adapter = new RecyclerAdapter<KnowledgeSystem>(getContext(), knowledges, R.layout.life_adapter_lifemain_fragment) {\n            @Override\n            public void convert(final RecycleHolder helper, final KnowledgeSystem item, final int position) {\n                helper.setVisible(R.id.textview,position == 0?true:false);\n                helper.setVisible(R.id.home_placeholder_tv,position == knowledges.size() - 1?true:false);\n                helper.setText(R.id.content_tv,item.getName());\n\n                final TagFlowLayout flowLayout = helper.findView(R.id.flowlayout);\n                flowLayout.setAdapter(new TagAdapter<KnowledgeSystem.ChildrenBean>(item.getChildren()){\n                    @Override\n                    public View getView(FlowLayout parent, int position, KnowledgeSystem.ChildrenBean bean){\n                        TextView tv = (TextView) LayoutInflater.from(mContext).inflate(\n                                R.layout.life_adapter_lifemain_flowlayout_item, flowLayout, false);\n                        tv.setText(item.getChildren().get(position).getName());\n                        return tv;\n                    }\n                });\n                flowLayout.setOnTagClickListener(new TagFlowLayout.OnTagClickListener(){\n                    @Override\n                    public boolean onTagClick(View view, int position, FlowLayout parent){\n                        ARouter.getInstance().build(ConstantArouter.PATH_LIFE_KNOWLEDGESYSTEMACTIVITY)\n                                .withString(\"title\",item.getChildren().get(position).getName())\n                                .withInt(\"cid\",item.getChildren().get(position).getId())\n                                .navigation();\n                        return true;\n                    }\n                });\n\n            }\n        };\n        lrv.setAdapter(adapter);\n\n        life_refreshLayout.setOnRefreshListener(new com.scwang.smartrefresh.layout.listener.OnRefreshListener() {\n            @Override\n            public void onRefresh(RefreshLayout refreshlayout) {\n                getFirstData();\n            }\n        });\n        life_refreshLayout.setEnableLoadMore(false);\n        life_refreshLayout.autoRefresh(100);\n    }\n\n    @Override\n    public void onFragmentVisble() {\n        super.onFragmentVisble();\n        //之后每次可见的操作\n        LogUtils.e(\"-----> 子fragment每次可见时的操作\");\n\n    }\n\n    @Override\n    public void getKnowledgeListResult(BaseResponse<List<KnowledgeSystem>> data) {\n        knowledges.clear();\n        knowledges.addAll(data.getData());\n\n        adapter.notifyDataSetChanged();\n        life_refreshLayout.finishRefresh();\n    }\n\n    @Override\n    public void onDestroyView() {\n        super.onDestroyView();\n        EventBus.getDefault().unregister(this);\n    }\n\n    @Subscribe(threadMode = ThreadMode.MAIN)\n    public void onEventReceived(BaseEvent event) {\n        if(event.getCode() == 1){//退出登录  刷新列表\n            getFirstData();\n        }\n    }\n}\n"
  },
  {
    "path": "module_life/src/main/java/com/senon/module_life/presenter/KnowledgeSysActivityPre.java",
    "content": "package com.senon.module_life.presenter;\n\nimport android.content.Context;\nimport com.senon.lib_common.base.BaseResponse;\nimport com.senon.lib_common.bean.KnowledgeSysArticle;\nimport com.senon.lib_common.bean.ProjectArticle;\nimport com.senon.lib_common.net.ServerUtils;\nimport com.senon.lib_common.net.callback.RequestCallback;\nimport com.senon.lib_common.net.callback.RxErrorHandler;\nimport com.senon.lib_common.utils.RetryWithDelay;\nimport com.senon.lib_common.utils.RxUtils;\nimport com.senon.lib_common.utils.ToastUtil;\nimport com.senon.module_life.contract.KnowledgeSysActivityCon;\n\n/**\n * KnowledgeSysActivity  P\n */\npublic class KnowledgeSysActivityPre extends KnowledgeSysActivityCon.Presenter{\n\n    private Context context;\n\n    public KnowledgeSysActivityPre(Context context) {\n        this.context = context;\n    }\n\n    @Override\n    public void getData(int cid ,int page,boolean isDialog, boolean cancelable) {\n        ServerUtils.getCommonApi().getKnowledgeArticle(page,cid)\n                .retryWhen(new RetryWithDelay(3,2))\n                .compose(RxUtils.<BaseResponse<KnowledgeSysArticle>>bindToLifecycle(getView()))\n                .compose(RxUtils.<BaseResponse<KnowledgeSysArticle>>getSchedulerTransformer())\n                .subscribe(new RequestCallback<BaseResponse<KnowledgeSysArticle>>(context, RxErrorHandler.getInstance(),isDialog,cancelable) {\n                    @Override\n                    public void onNext(BaseResponse<KnowledgeSysArticle> baseResponse) {\n                        super.onNext(baseResponse);\n                        if(baseResponse.getCode() == 0){\n                            getView().getDataResult(baseResponse);\n                        }else{\n                            ToastUtil.initToast(baseResponse.getMsg());\n                        }\n                    }\n                    @Override\n                    public void onError(Throwable e) {\n                        super.onError(e);\n                    }\n                });\n    }\n\n    @Override\n    public void getCollect(final int id, boolean isDialog, boolean cancelable) {\n        ServerUtils.getCommonApi().getCollect(id)\n                .retryWhen(new RetryWithDelay(3,2))\n                .compose(RxUtils.<BaseResponse>bindToLifecycle(getView()))\n                .compose(RxUtils.<BaseResponse>getSchedulerTransformer())\n                .subscribe(new RequestCallback<BaseResponse>(context, RxErrorHandler.getInstance(),isDialog,cancelable) {\n                    @Override\n                    public void onNext(BaseResponse baseResponse) {\n                        super.onNext(baseResponse);\n                        if(baseResponse.getCode() == 0){\n                            getView().getCollectResult(id,true);\n                        }else{\n                            getView().getCollFailResult(id);\n\n                            ToastUtil.initToast(baseResponse.getMsg());\n                        }\n                    }\n                    @Override\n                    public void onError(Throwable e) {\n                        super.onError(e);\n                    }\n                });\n    }\n\n    @Override\n    public void getUnollect(final int id, boolean isDialog, boolean cancelable) {\n        ServerUtils.getCommonApi().getUncollectOriginId(id)\n                .retryWhen(new RetryWithDelay(3,2))\n                .compose(RxUtils.<BaseResponse>bindToLifecycle(getView()))\n                .compose(RxUtils.<BaseResponse>getSchedulerTransformer())\n                .subscribe(new RequestCallback<BaseResponse>(context, RxErrorHandler.getInstance(),isDialog,cancelable) {\n                    @Override\n                    public void onNext(BaseResponse baseResponse) {\n                        super.onNext(baseResponse);\n                        if(baseResponse.getCode() == 0){\n                            getView().getCollectResult(id,false);\n                        }else{\n                            getView().getCollFailResult(id);\n\n                            ToastUtil.initToast(baseResponse.getMsg());\n                        }\n                    }\n                    @Override\n                    public void onError(Throwable e) {\n                        super.onError(e);\n                    }\n                });\n    }\n}\n"
  },
  {
    "path": "module_life/src/main/java/com/senon/module_life/presenter/LifeMainFragmentPre.java",
    "content": "package com.senon.module_life.presenter;\n\nimport android.content.Context;\n\nimport com.senon.lib_common.bean.KnowledgeSystem;\nimport com.senon.lib_common.bean.Login;\nimport com.senon.lib_common.net.ServerUtils;\nimport com.senon.lib_common.base.BaseResponse;\nimport com.senon.lib_common.net.callback.RequestCallback;\nimport com.senon.lib_common.net.callback.RxErrorHandler;\nimport com.senon.lib_common.utils.RetryWithDelay;\nimport com.senon.lib_common.utils.RxUtils;\nimport com.senon.lib_common.utils.ToastUtil;\nimport com.senon.module_life.contract.LifeMainFragmentCon;\n\nimport java.util.HashMap;\nimport java.util.List;\n\n/**\n * LifeMainFragmentCon  P\n */\npublic class LifeMainFragmentPre extends LifeMainFragmentCon.Presenter{\n\n    private Context context;\n\n    public LifeMainFragmentPre(Context context) {\n        this.context = context;\n    }\n\n\n    @Override\n    public void getKnowledgeList(boolean isDialog, boolean cancelable) {\n        ServerUtils.getCommonApi().getKnowledgeList()\n                .retryWhen(new RetryWithDelay(3,2))\n                .compose(RxUtils.<BaseResponse<List<KnowledgeSystem>>>bindToLifecycle(getView()))\n                .compose(RxUtils.<BaseResponse<List<KnowledgeSystem>>>getSchedulerTransformer())\n                .subscribe(new RequestCallback<BaseResponse<List<KnowledgeSystem>>>(context, RxErrorHandler.getInstance(),isDialog,cancelable) {\n                    @Override\n                    public void onNext(BaseResponse<List<KnowledgeSystem>> baseResponse) {\n                        super.onNext(baseResponse);\n                        if(baseResponse.getCode() == 0){\n                            getView().getKnowledgeListResult(baseResponse);\n                        }else{\n                            ToastUtil.initToast(baseResponse.getMsg());\n                        }\n                    }\n                    @Override\n                    public void onError(Throwable e) {\n                        super.onError(e);\n                    }\n                });\n    }\n}\n"
  },
  {
    "path": "module_life/src/main/release/AndroidManifest.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    package=\"com.senon.module_life\">\n\n    <uses-permission android:name=\"android.permission.INTERNET\"/>\n\n    <application\n        android:allowBackup=\"true\"\n        >\n        <activity android:name=\".MainActivity\">\n            <intent-filter>\n                <category android:name=\"android.intent.category.DEFAULT\" />\n                <category android:name=\"android.intent.category.BROWSABLE\" />\n\n                <action android:name=\"android.intent.action.VIEW\" />\n                <data android:host=\"com.senon.module_life\"\n                    android:scheme=\"router\" />\n            </intent-filter>\n        </activity>\n\n        <activity android:name=\".activity.KnowledgeSystemActivity\"></activity>\n\n    </application>\n\n</manifest>"
  },
  {
    "path": "module_life/src/main/res/drawable/life_ic_launcher_background.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"108dp\"\n    android:height=\"108dp\"\n    android:viewportHeight=\"108\"\n    android:viewportWidth=\"108\">\n    <path\n        android:fillColor=\"#26A69A\"\n        android:pathData=\"M0,0h108v108h-108z\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M9,0L9,108\"\n        android:strokeColor=\"#33FFFFFF\"\n        android:strokeWidth=\"0.8\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M19,0L19,108\"\n        android:strokeColor=\"#33FFFFFF\"\n        android:strokeWidth=\"0.8\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M29,0L29,108\"\n        android:strokeColor=\"#33FFFFFF\"\n        android:strokeWidth=\"0.8\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M39,0L39,108\"\n        android:strokeColor=\"#33FFFFFF\"\n        android:strokeWidth=\"0.8\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M49,0L49,108\"\n        android:strokeColor=\"#33FFFFFF\"\n        android:strokeWidth=\"0.8\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M59,0L59,108\"\n        android:strokeColor=\"#33FFFFFF\"\n        android:strokeWidth=\"0.8\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M69,0L69,108\"\n        android:strokeColor=\"#33FFFFFF\"\n        android:strokeWidth=\"0.8\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M79,0L79,108\"\n        android:strokeColor=\"#33FFFFFF\"\n        android:strokeWidth=\"0.8\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M89,0L89,108\"\n        android:strokeColor=\"#33FFFFFF\"\n        android:strokeWidth=\"0.8\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M99,0L99,108\"\n        android:strokeColor=\"#33FFFFFF\"\n        android:strokeWidth=\"0.8\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M0,9L108,9\"\n        android:strokeColor=\"#33FFFFFF\"\n        android:strokeWidth=\"0.8\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M0,19L108,19\"\n        android:strokeColor=\"#33FFFFFF\"\n        android:strokeWidth=\"0.8\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M0,29L108,29\"\n        android:strokeColor=\"#33FFFFFF\"\n        android:strokeWidth=\"0.8\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M0,39L108,39\"\n        android:strokeColor=\"#33FFFFFF\"\n        android:strokeWidth=\"0.8\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M0,49L108,49\"\n        android:strokeColor=\"#33FFFFFF\"\n        android:strokeWidth=\"0.8\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M0,59L108,59\"\n        android:strokeColor=\"#33FFFFFF\"\n        android:strokeWidth=\"0.8\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M0,69L108,69\"\n        android:strokeColor=\"#33FFFFFF\"\n        android:strokeWidth=\"0.8\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M0,79L108,79\"\n        android:strokeColor=\"#33FFFFFF\"\n        android:strokeWidth=\"0.8\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M0,89L108,89\"\n        android:strokeColor=\"#33FFFFFF\"\n        android:strokeWidth=\"0.8\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M0,99L108,99\"\n        android:strokeColor=\"#33FFFFFF\"\n        android:strokeWidth=\"0.8\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M19,29L89,29\"\n        android:strokeColor=\"#33FFFFFF\"\n        android:strokeWidth=\"0.8\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M19,39L89,39\"\n        android:strokeColor=\"#33FFFFFF\"\n        android:strokeWidth=\"0.8\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M19,49L89,49\"\n        android:strokeColor=\"#33FFFFFF\"\n        android:strokeWidth=\"0.8\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M19,59L89,59\"\n        android:strokeColor=\"#33FFFFFF\"\n        android:strokeWidth=\"0.8\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M19,69L89,69\"\n        android:strokeColor=\"#33FFFFFF\"\n        android:strokeWidth=\"0.8\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M19,79L89,79\"\n        android:strokeColor=\"#33FFFFFF\"\n        android:strokeWidth=\"0.8\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M29,19L29,89\"\n        android:strokeColor=\"#33FFFFFF\"\n        android:strokeWidth=\"0.8\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M39,19L39,89\"\n        android:strokeColor=\"#33FFFFFF\"\n        android:strokeWidth=\"0.8\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M49,19L49,89\"\n        android:strokeColor=\"#33FFFFFF\"\n        android:strokeWidth=\"0.8\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M59,19L59,89\"\n        android:strokeColor=\"#33FFFFFF\"\n        android:strokeWidth=\"0.8\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M69,19L69,89\"\n        android:strokeColor=\"#33FFFFFF\"\n        android:strokeWidth=\"0.8\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M79,19L79,89\"\n        android:strokeColor=\"#33FFFFFF\"\n        android:strokeWidth=\"0.8\" />\n</vector>\n"
  },
  {
    "path": "module_life/src/main/res/drawable/life_shape_gray_10.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<shape xmlns:android=\"http://schemas.android.com/apk/res/android\" >\n\n    <!-- view背景色 -->\n    <solid android:color=\"@color/group_divide_bg\" />\n    <!--<solid android:color=\"#000\" />-->\n    <!-- 边框圆角 -->\n    <corners\n        android:radius=\"@dimen/mm10\" />\n\n</shape>"
  },
  {
    "path": "module_life/src/main/res/drawable/life_shape_white_con30.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<shape xmlns:android=\"http://schemas.android.com/apk/res/android\" >\n\n    <!-- view背景色 -->\n    <solid android:color=\"@color/common_white\" />\n    <!--<solid android:color=\"#000\" />-->\n    <!-- 边框圆角 -->\n    <corners\n        android:radius=\"@dimen/mm15\" />\n\n</shape>"
  },
  {
    "path": "module_life/src/main/res/layout/life_activity_home_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    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    >\n\n    <include\n        android:id=\"@+id/toolbar\"\n        layout=\"@layout/layout_toolbar\"\n        android:layout_height=\"wrap_content\"\n        android:layout_width=\"match_parent\" />\n\n    <com.github.jdsjlzx.recyclerview.LRecyclerView\n        android:layout_below=\"@+id/toolbar\"\n        android:id=\"@+id/lrv\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"/>\n\n</RelativeLayout>\n"
  },
  {
    "path": "module_life/src/main/res/layout/life_activity_main.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    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    >\n\n\n    <android.support.v4.view.ViewPager\n        android:id=\"@+id/life_main_vp\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"/>\n\n</RelativeLayout>\n"
  },
  {
    "path": "module_life/src/main/res/layout/life_activity_splash.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    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    >\n\n    <TextView\n        android:id=\"@+id/life_main_login_tv\"\n        android:background=\"#d4cccc\"\n        android:layout_centerInParent=\"true\"\n        android:padding=\"@dimen/mm10\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:text=\"跳转到登录\"\n        android:textSize=\"@dimen/mm30\"\n        />\n\n</RelativeLayout>\n"
  },
  {
    "path": "module_life/src/main/res/layout/life_adapter_knowledgesys_item.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\">\n\n\n    <RelativeLayout\n        android:visibility=\"gone\"\n        android:id=\"@+id/top_layout\"\n        android:layout_marginTop=\"@dimen/mm40\"\n        android:paddingLeft=\"@dimen/mm20\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"@dimen/mm80\">\n        <TextView\n            android:background=\"@drawable/shape_gradient\"\n            android:layout_centerVertical=\"true\"\n            android:layout_width=\"@dimen/mm5\"\n            android:layout_height=\"@dimen/mm40\" />\n        <TextView\n            android:textStyle=\"bold\"\n            android:layout_centerVertical=\"true\"\n            android:layout_marginLeft=\"@dimen/mm20\"\n            android:textColor=\"@color/color_232323\"\n            android:text=\"最新博文\"\n            android:textSize=\"@dimen/mm40\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\" />\n        <TextView\n            android:id=\"@+id/more_tv\"\n            android:layout_marginRight=\"@dimen/mm20\"\n            android:layout_centerVertical=\"true\"\n            android:layout_alignParentRight=\"true\"\n            android:layout_marginLeft=\"@dimen/mm20\"\n            android:textColor=\"@color/common_black_999\"\n            android:text=\"查看全部\"\n            android:textSize=\"@dimen/mm28\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\" />\n    </RelativeLayout>\n\n    <RelativeLayout\n        android:id=\"@+id/content_lay\"\n        android:layout_marginTop=\"@dimen/mm15\"\n        android:layout_below=\"@+id/top_layout\"\n        android:background=\"@drawable/life_shape_white_con30\"\n        android:layout_marginLeft=\"@dimen/mm20\"\n        android:layout_marginRight=\"@dimen/mm20\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\">\n        <TextView\n            android:id=\"@+id/content_tv\"\n            android:singleLine=\"true\"\n            android:layout_marginTop=\"@dimen/mm20\"\n            android:layout_marginLeft=\"@dimen/mm20\"\n            android:layout_marginRight=\"@dimen/mm20\"\n            android:textColor=\"@color/color_232323\"\n            android:text=\"标题\"\n            android:textSize=\"@dimen/mm32\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\" />\n        <TextView\n            android:layout_below=\"@+id/content_tv\"\n            android:id=\"@+id/user_tv\"\n            android:layout_marginTop=\"@dimen/mm10\"\n            android:layout_marginLeft=\"@dimen/mm20\"\n            android:layout_marginRight=\"@dimen/mm30\"\n            android:layout_marginBottom=\"@dimen/mm15\"\n            android:textColor=\"@color/common_black_999\"\n            android:text=\"姓名\"\n            android:textSize=\"@dimen/mm24\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\" />\n        <TextView\n            android:layout_toRightOf=\"@+id/user_tv\"\n            android:layout_below=\"@+id/content_tv\"\n            android:id=\"@+id/time_tv\"\n            android:layout_marginTop=\"@dimen/mm10\"\n            android:layout_marginRight=\"@dimen/mm30\"\n            android:textColor=\"@color/common_black_999\"\n            android:text=\"时间\"\n            android:textSize=\"@dimen/mm24\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\" />\n\n        <TextView\n            android:padding=\"@dimen/mm5\"\n            android:layout_below=\"@+id/content_tv\"\n            android:layout_alignParentRight=\"true\"\n            android:id=\"@+id/collection_tv\"\n            android:layout_marginRight=\"@dimen/mm25\"\n            android:textColor=\"@color/common_black_999\"\n            android:text=\"收藏\"\n            android:textSize=\"@dimen/mm26\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\" />\n    </RelativeLayout>\n\n</RelativeLayout>"
  },
  {
    "path": "module_life/src/main/res/layout/life_adapter_lifemain_flowlayout_item.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<TextView\n    android:layout_marginRight=\"@dimen/mm15\"\n    android:layout_marginBottom=\"@dimen/mm15\"\n    android:paddingLeft=\"@dimen/mm12\"\n    android:paddingRight=\"@dimen/mm12\"\n    android:paddingTop=\"@dimen/mm7\"\n    android:paddingBottom=\"@dimen/mm7\"\n    android:background=\"@drawable/life_shape_gray_10\"\n    android:textSize=\"@dimen/mm30\"\n    android:id=\"@+id/flowlayout_item_tv\"\n    android:text=\"标签\"\n    android:layout_width=\"wrap_content\"\n    android:layout_height=\"wrap_content\"\n    xmlns:android=\"http://schemas.android.com/apk/res/android\" />"
  },
  {
    "path": "module_life/src/main/res/layout/life_adapter_lifemain_fragment.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\"\n    xmlns:zhy=\"http://schemas.android.com/tools\">\n\n    <TextView\n        android:textStyle=\"bold\"\n        android:id=\"@+id/textview\"\n        android:layout_marginTop=\"@dimen/mm40\"\n        android:layout_marginLeft=\"@dimen/mm20\"\n        android:layout_marginBottom=\"@dimen/mm40\"\n        android:text=\"体系\"\n        android:textSize=\"@dimen/mm56\"\n        android:textColor=\"@color/transport_3\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\" />\n\n    <RelativeLayout\n        android:id=\"@+id/relativelay\"\n        android:layout_marginTop=\"@dimen/mm15\"\n        android:layout_below=\"@+id/textview\"\n        android:background=\"@drawable/life_shape_white_con30\"\n        android:layout_marginLeft=\"@dimen/mm20\"\n        android:layout_marginRight=\"@dimen/mm20\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\">\n\n        <TextView\n            android:id=\"@+id/content_tv\"\n            android:singleLine=\"true\"\n            android:layout_marginTop=\"@dimen/mm15\"\n            android:layout_marginLeft=\"@dimen/mm20\"\n            android:layout_marginRight=\"@dimen/mm20\"\n            android:textColor=\"@color/color_232323\"\n            android:text=\"标题\"\n            android:textSize=\"@dimen/mm32\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\" />\n        <com.zhy.view.flowlayout.TagFlowLayout\n            android:layout_marginLeft=\"@dimen/mm15\"\n            android:layout_marginTop=\"@dimen/mm20\"\n            android:layout_marginBottom=\"@dimen/mm5\"\n            android:layout_below=\"@+id/content_tv\"\n            android:id=\"@+id/flowlayout\"\n            zhy:max_select=\"1\"\n            android:layout_width=\"fill_parent\"\n            android:layout_height=\"wrap_content\"\n            >\n            <!--android:padding=\"@dimen/mm20\"-->\n        </com.zhy.view.flowlayout.TagFlowLayout>\n    </RelativeLayout>\n\n    <View\n        android:layout_below=\"@+id/relativelay\"\n        android:id=\"@+id/home_placeholder_tv\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"@dimen/mm50\"/>\n\n</RelativeLayout>"
  },
  {
    "path": "module_life/src/main/res/layout/life_fragment_main.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:layout_width=\"match_parent\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    android:orientation=\"vertical\"\n    android:layout_height=\"match_parent\">\n\n    <TextView\n        android:id=\"@+id/placeholder\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"@dimen/mm40\" />\n\n    <RelativeLayout\n        android:layout_below=\"@+id/placeholder\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\">\n\n        <com.scwang.smartrefresh.layout.SmartRefreshLayout\n            android:id=\"@+id/life_refreshLayout\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"match_parent\"\n            app:srlEnablePreviewInEditMode=\"true\">\n\n            <android.support.v7.widget.RecyclerView\n                android:id=\"@+id/life_homefragment_lrv\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"match_parent\" />\n\n        </com.scwang.smartrefresh.layout.SmartRefreshLayout>\n\n        <ImageView\n            android:visibility=\"gone\"\n            android:layout_centerInParent=\"true\"\n            android:id=\"@+id/empty_igv\"\n            android:layout_width=\"@dimen/mm350\"\n            android:layout_height=\"@dimen/mm350\" />\n\n        <TextView\n            android:visibility=\"gone\"\n            android:background=\"@color/common_white\"\n            android:id=\"@+id/life_homefragment_title_tv\"\n            android:gravity=\"center\"\n            android:textColor=\"@color/color_232323\"\n            android:text=\"体系\"\n            android:textSize=\"@dimen/mm42\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"@dimen/mm90\" />\n    </RelativeLayout>\n\n</RelativeLayout>\n"
  },
  {
    "path": "module_life/src/main/res/values/colors.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <color name=\"colorPrimary\">#3F51B5</color>\n    <color name=\"colorPrimaryDark\">#303F9F</color>\n    <color name=\"colorAccent\">#FF4081</color>\n</resources>\n"
  },
  {
    "path": "module_life/src/main/res/values/strings.xml",
    "content": "<resources>\n    <string name=\"life_app_name\">玩安卓_体系</string>\n</resources>\n"
  },
  {
    "path": "module_life/src/main/res/values/styles.xml",
    "content": "<resources>\n\n    <!-- Base application theme. -->\n    <style name=\"AppTheme\" parent=\"Theme.AppCompat.Light.NoActionBar\">\n        <!-- Customize your theme here. -->\n        <item name=\"colorPrimary\">@color/colorPrimary</item>\n        <item name=\"colorPrimaryDark\">@color/colorPrimaryDark</item>\n        <item name=\"colorAccent\">@color/colorAccent</item>\n    </style>\n\n</resources>\n"
  },
  {
    "path": "module_life/src/test/java/com/senon/module_life/ExampleUnitTest.java",
    "content": "package com.senon.module_life;\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": "module_talent/.gitignore",
    "content": "/build\n"
  },
  {
    "path": "module_talent/build.gradle",
    "content": "if (isBuildModule.toBoolean()) {\n    apply plugin: 'com.android.application'\n} else {\n    apply plugin: 'com.android.library'\n}\n\nandroid {\n    compileSdkVersion rootProject.ext.android[\"compileSdkVersion\"]\n\n    resourcePrefix \"talent_\"\n\n    sourceSets {\n        main {\n            if (isBuildModule.toBoolean()) {\n                manifest.srcFile 'src/main/debug/AndroidManifest.xml'\n            } else {\n                manifest.srcFile 'src/main/release/AndroidManifest.xml'\n                java {\n                    //全部Module一起编译的时候剔除debug目录\n                    exclude '**/**/debug/**'\n                }\n            }\n        }\n    }\n\n    defaultConfig {\n        if (isBuildModule.toBoolean()) {\n            applicationId \"com.senon.module_talent\"\n        }\n        minSdkVersion rootProject.ext.android[\"minSdkVersion\"]\n        targetSdkVersion rootProject.ext.android[\"targetSdkVersion\"]\n        versionCode rootProject.ext.android[\"versionCode\"]\n        versionName rootProject.ext.android[\"versionName\"]\n\n        testInstrumentationRunner \"android.support.test.runner.AndroidJUnitRunner\"\n        javaCompileOptions {\n            annotationProcessorOptions {\n                arguments = [AROUTER_MODULE_NAME: project.getName()]\n            }\n        }\n    }\n\n    buildTypes {\n        release {\n            minifyEnabled false\n            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'\n        }\n    }\n\n}\n\ndependencies {\n    implementation fileTree(dir: 'libs', include: ['*.jar'])\n    implementation 'com.android.support.constraint:constraint-layout:1.1.3'\n    androidTestImplementation 'com.android.support.test:runner:1.0.2'\n    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'\n    testImplementation rootProject.ext.dependencies[\"junit\"]\n\n    api project(':lib_common')\n    annotationProcessor rootProject.ext.dependencies[\"router-compiler\"]\n}\n"
  },
  {
    "path": "module_talent/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": "module_talent/src/androidTest/java/com/senon/module_talent/ExampleInstrumentedTest.java",
    "content": "package com.senon.module_talent;\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.senon.module_talent\", appContext.getPackageName());\n    }\n}\n"
  },
  {
    "path": "module_talent/src/main/debug/AndroidManifest.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    package=\"com.senon.module_talent\">\n\n\n\n    <application\n        android:name=\".App_Talent\"\n        android:allowBackup=\"true\"\n        android:icon=\"@mipmap/ic_logo\"\n        android:label=\"@string/talent_app_name\"\n        android:roundIcon=\"@mipmap/talent_ic_launcher_round\"\n        android:supportsRtl=\"true\"\n        tools:replace=\"android:icon,label\"\n        android:theme=\"@style/TranslucentTheme\">\n        <activity android:name=\".MainActivity\">\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        <activity android:name=\".activity.CollectionActivity\"/>\n        <activity android:name=\".activity.AboutActivity\"/>\n    </application>\n\n</manifest>"
  },
  {
    "path": "module_talent/src/main/java/com/senon/module_talent/App_Talent.java",
    "content": "package com.senon.module_talent;\n\nimport com.alibaba.android.arouter.launcher.ARouter;\nimport com.senon.lib_common.base.BaseApplication;\nimport com.senon.lib_common.utils.ConstantUtils;\n\n/**\n * home debug  Application\n */\npublic class App_Talent extends BaseApplication {\n    @Override\n    public void onCreate() {\n        super.onCreate();\n\n        initARouter();\n    }\n\n    private void initARouter() {\n        if (ConstantUtils.isAppDebug()) {\n            //开启InstantRun之后，一定要在ARouter.init之前调用openDebug\n            ARouter.openDebug();\n            ARouter.openLog();\n        }\n        ARouter.init(this);\n    }\n}\n"
  },
  {
    "path": "module_talent/src/main/java/com/senon/module_talent/MainActivity.java",
    "content": "package com.senon.module_talent;\n\nimport android.support.v4.app.Fragment;\nimport android.support.v4.app.FragmentManager;\nimport android.support.v4.app.FragmentPagerAdapter;\nimport android.support.v4.view.ViewPager;\nimport android.support.v7.app.AppCompatActivity;\nimport android.os.Bundle;\nimport com.alibaba.android.arouter.facade.annotation.Route;\nimport com.alibaba.android.arouter.launcher.ARouter;\nimport com.senon.lib_common.ComUtil;\nimport com.senon.lib_common.ConstantLoginArouter;\nimport com.senon.lib_common.utils.StatusBarUtils;\nimport com.senon.module_talent.fragment.TalentMainFragment;\n\n/**\n * talent 首页\n */\n@Route(path = ConstantLoginArouter.PATH_TALENT_MAINACTIVITY)\npublic class MainActivity extends AppCompatActivity {\n\n    private ViewPager viewPager;\n    private FragmentManager fragmentManager;//声明fragment管理\n    private TalentMainFragment fragment;\n\n    @Override\n    protected void onCreate(Bundle savedInstanceState) {\n        super.onCreate(savedInstanceState);\n        StatusBarUtils.with(this).init();\n        setContentView(R.layout.talent_activity_main);\n        ComUtil.changeStatusBarTextColor(this,true);\n        ARouter.getInstance().inject(this);\n\n        findView();\n    }\n\n    private void findView() {\n        viewPager = findViewById(R.id.talent_main_vp);\n        fragmentManager = getSupportFragmentManager();\n        fragment = new TalentMainFragment();\n        viewPager.setAdapter(new MyFragmentPagerAdapter(fragmentManager));\n\n    }\n\n\n    //FragmentPagerAdapter\n    class MyFragmentPagerAdapter extends FragmentPagerAdapter {\n        public MyFragmentPagerAdapter(FragmentManager fm) {\n            super(fm);\n        }\n        @Override\n        public Fragment getItem(int position) {\n            return fragment;\n        }\n        @Override\n        public int getCount() {\n            return 1;\n        }\n    }\n\n}\n"
  },
  {
    "path": "module_talent/src/main/java/com/senon/module_talent/activity/AboutActivity.java",
    "content": "package com.senon.module_talent.activity;\n\n\nimport android.content.pm.PackageManager;\nimport android.text.Html;\nimport android.text.method.LinkMovementMethod;\nimport android.view.View;\nimport android.widget.TextView;\n\nimport com.alibaba.android.arouter.facade.annotation.Route;\nimport com.senon.lib_common.ComUtil;\nimport com.senon.lib_common.ConstantArouter;\nimport com.senon.lib_common.base.BaseActivity;\nimport com.senon.lib_common.base.BasePresenter;\nimport com.senon.lib_common.base.BaseViewImp;\nimport com.senon.lib_common.utils.StatusBarUtils;\nimport com.senon.module_talent.R;\n\n/**\n * 关于 页面\n */\n@Route(path = ConstantArouter.PATH_TALENT_ABOUTACTIVITY)\npublic class AboutActivity extends BaseActivity<BaseViewImp,BasePresenter<BaseViewImp>> implements\n        BaseViewImp{\n\n    private TextView version_tv,content_tv,toolbar_title_tv;\n\n\n    @Override\n    public int getLayoutId() {\n        StatusBarUtils.with(this).init();\n        return R.layout.talent_activity_about;\n    }\n    @Override\n    public BasePresenter createPresenter() {\n        return getPresenter();\n    }\n    @Override\n    public BaseViewImp createView() {\n        return this;\n    }\n\n    @Override\n    public void init() {\n        ComUtil.changeStatusBarTextColor(this,true);\n\n        version_tv = findViewById(R.id.version_tv);\n        content_tv = findViewById(R.id.content_tv);\n        toolbar_title_tv = findViewById(R.id.toolbar_title_tv);\n        toolbar_title_tv.setText(\"关于\");\n\n        content_tv.setText(Html.fromHtml(getString(R.string.talent_about_content)));\n        content_tv.setMovementMethod(LinkMovementMethod.getInstance());\n        try {\n            String versionStr = getString(R.string.talent_wanandroid)\n                    + \"  V\" + getPackageManager().getPackageInfo(getPackageName(), 0).versionName;\n            version_tv.setText(versionStr);\n        } catch (PackageManager.NameNotFoundException e) {\n            e.printStackTrace();\n        }\n\n        findViewById(R.id.toolbar_back_igv).setOnClickListener(new View.OnClickListener() {\n            @Override\n            public void onClick(View v) {\n                finish();\n            }\n        });\n    }\n}\n"
  },
  {
    "path": "module_talent/src/main/java/com/senon/module_talent/activity/CollectionActivity.java",
    "content": "package com.senon.module_talent.activity;\n\nimport android.support.v7.widget.LinearLayoutManager;\nimport android.text.Html;\nimport android.view.View;\nimport android.widget.TextView;\nimport com.alibaba.android.arouter.facade.annotation.Autowired;\nimport com.alibaba.android.arouter.facade.annotation.Route;\nimport com.alibaba.android.arouter.launcher.ARouter;\nimport com.github.jdsjlzx.interfaces.OnLoadMoreListener;\nimport com.github.jdsjlzx.interfaces.OnRefreshListener;\nimport com.github.jdsjlzx.recyclerview.LRecyclerView;\nimport com.github.jdsjlzx.recyclerview.LRecyclerViewAdapter;\nimport com.github.jdsjlzx.recyclerview.ProgressStyle;\nimport com.senon.lib_common.ComUtil;\nimport com.senon.lib_common.ConstantArouter;\nimport com.senon.lib_common.ConstantLoginArouter;\nimport com.senon.lib_common.adapter.RecycleHolder;\nimport com.senon.lib_common.adapter.RecyclerAdapter;\nimport com.senon.lib_common.base.BaseActivity;\nimport com.senon.lib_common.base.BaseResponse;\nimport com.senon.lib_common.bean.CollectionArticle;\nimport com.senon.lib_common.utils.BaseEvent;\nimport com.senon.lib_common.utils.StatusBarUtils;\nimport com.senon.lib_common.utils.ToastUtil;\nimport com.senon.module_talent.R;\nimport com.senon.module_talent.contract.CollectionActivityCon;\nimport com.senon.module_talent.presenter.CollectionActivityPre;\nimport org.greenrobot.eventbus.EventBus;\nimport org.greenrobot.eventbus.Subscribe;\nimport org.greenrobot.eventbus.ThreadMode;\nimport java.util.ArrayList;\n\n/**\n * 我的收藏列表页\n */\n@Route(path = ConstantArouter.PATH_TALENT_COLLECTIONACTIVITY)\npublic class CollectionActivity extends BaseActivity<CollectionActivityCon.View,CollectionActivityCon.Presenter> implements\n        CollectionActivityCon.View {\n\n\n    private LRecyclerView lrv;\n    private TextView toolbar_title_tv;\n    private boolean isLoadMore = false;//是否加载更多\n    private boolean isDownRefesh = false;//是否下拉刷新\n    private int currentPage = 0;//当前页数\n    private RecyclerAdapter<CollectionArticle.DatasBean> adapter;\n    private CollectionArticle article;\n    private ArrayList<CollectionArticle.DatasBean> mData = new ArrayList<>();//原始数据\n    private ArrayList<CollectionArticle.DatasBean> tempData = new ArrayList<>();//间接数据\n    private LRecyclerViewAdapter mLRecyclerViewAdapter;//Lrecyclerview的包装适配器\n\n    @Override\n    public int getLayoutId() {\n        StatusBarUtils.with(this).init();\n        return R.layout.talent_activity_collection;\n    }\n    @Override\n    public CollectionActivityCon.Presenter createPresenter() {\n        return new CollectionActivityPre(this);\n    }\n    @Override\n    public CollectionActivityCon.View createView() {\n        return this;\n    }\n\n    @Override\n    public void init() {\n        ComUtil.changeStatusBarTextColor(this,true);\n        EventBus.getDefault().register(this);\n\n        lrv = findViewById(R.id.lrv);\n        toolbar_title_tv = ((TextView)findViewById(R.id.toolbar_title_tv));\n        toolbar_title_tv.setText(\"我的收藏\");\n        toolbar_title_tv.setOnClickListener(new View.OnClickListener() {\n            @Override\n            public void onClick(View v) {\n                lrv.smoothScrollToPosition(0);\n            }\n        });\n        findViewById(R.id.toolbar_back_igv).setOnClickListener(new View.OnClickListener() {\n            @Override\n            public void onClick(View v) {\n                finish();\n            }\n        });\n\n        initLRecyclerVeiw();\n    }\n\n    private void initLRecyclerVeiw() {\n        LinearLayoutManager manager = new LinearLayoutManager(this);\n        lrv.setLayoutManager(manager);\n        lrv.setRefreshProgressStyle(ProgressStyle.LineSpinFadeLoader); //设置下拉刷新Progress的样式\n        lrv.setArrowImageView(R.mipmap.news_renovate);  //设置下拉刷新箭头\n        lrv.setLoadingMoreProgressStyle(ProgressStyle.BallSpinFadeLoader);\n        adapter = new RecyclerAdapter<CollectionArticle.DatasBean>(this, mData,R.layout.talent_adapter_collection) {\n            @Override\n            public void convert(final RecycleHolder helper, final CollectionArticle.DatasBean data, final int position) {\n                helper.setText(R.id.type_tv,data.getChapterName());\n                helper.setText(R.id.content_tv, Html.fromHtml(data.getTitle()).toString());\n                helper.setText(R.id.user_tv,data.getAuthor());\n                helper.setText(R.id.time_tv,data.getNiceDate());\n                helper.setText(R.id.collection_tv,\"已收藏\");\n\n                helper.setOnClickListener(R.id.content_lay, new View.OnClickListener() {\n                    @Override\n                    public void onClick(View v) {\n                        ARouter.getInstance().build(ConstantArouter.PATH_COMMON_WEBVIEWCTIVITY)\n                                .withInt(\"id\",data.getOriginId())\n                                .withString(\"url\",data.getLink())\n                                .withString(\"title\",data.getTitle())\n                                .withBoolean(\"isCollection\",true)\n                                .navigation();\n                    }\n                });\n                helper.setOnClickListener(R.id.collection_tv, new View.OnClickListener() {\n                    @Override\n                    public void onClick(View v) {\n                        int originId = data.getOriginId() == 0 ? -1 : data.getOriginId();\n                        getPresenter().getUnollect(data.getId(),originId,false,true);\n                    }\n                });\n            }\n        };\n        mLRecyclerViewAdapter = new LRecyclerViewAdapter(adapter);\n        lrv.setAdapter(mLRecyclerViewAdapter);\n        //设置底部加载颜色\n        lrv.setFooterViewColor(R.color.color_blue, R.color.text_gray, R.color.elegant_bg);\n        lrv.setHeaderViewColor(R.color.color_blue, R.color.text_gray, R.color.elegant_bg);\n        lrv.setOnRefreshListener(new OnRefreshListener() {\n            @Override\n            public void onRefresh() {\n                getFirstPageData();\n            }\n        });\n        lrv.setOnLoadMoreListener(new OnLoadMoreListener() {\n            @Override\n            public void onLoadMore() {\n                isLoadMore = true;\n                currentPage++;\n                getOrderList();\n            }\n        });\n\n        lrv.forceToRefresh();\n    }\n\n\n    private void getFirstPageData() {\n        isDownRefesh = true;\n        currentPage = 0;\n        getOrderList();\n    }\n\n    private void getOrderList() {\n        getPresenter().getData(currentPage,false,true);\n    }\n\n    private void refreshData() {\n        if (lrv == null) {\n            return;\n        }\n        lrv.refreshComplete(currentPage);\n        mLRecyclerViewAdapter.notifyDataSetChanged();\n        isDownRefesh = false;\n        isLoadMore = false;\n    }\n    \n    @Override\n    public void getDataResult(BaseResponse<CollectionArticle> data) {\n        if(data.getCode() == 0){\n            article = data.getData();\n\n            tempData.clear();\n            tempData.addAll(data.getData().getDatas());\n            if (tempData.size() == 0 && mData.size() > 0 && isLoadMore) {//最后一页时\n                lrv.setNoMore(true);\n                isLoadMore = false;\n            } else if (isDownRefesh) {//下拉刷新时\n                mData.clear();\n                mData.addAll(tempData);\n                refreshData();\n            } else {//加载更多时\n                mData.addAll(tempData);\n                refreshData();\n            }\n        }else{\n            ToastUtil.initToast(data.getMsg());\n            refreshData();\n            ARouter.getInstance().build(ConstantLoginArouter.PATH_COMMON_LOGINACTIVITY)\n                    .navigation();\n        }\n\n    }\n\n    @Subscribe(threadMode = ThreadMode.MAIN) //在ui线程执行\n    public void onEventReceived(BaseEvent event) {\n        if (event.getCode() == 101 && !event.isIngored()) {\n            lrv.smoothScrollToPosition(0);\n            lrv.forceToRefresh();\n        }else if(event.getCode() == 0){\n            lrv.forceToRefresh();\n        }\n    }\n\n    @Override\n    public void getCollectResult(int id, boolean isCollect) {\n        BaseEvent event = new BaseEvent();\n        event.setCode(101);\n        event.setId(id);\n        event.setCollect(isCollect);\n        event.setIngored(true);\n        EventBus.getDefault().post(event);\n\n        for (int i = 0; i < mData.size(); i++) {\n            if(id == mData.get(i).getId()){\n                mData.remove(i);\n                mLRecyclerViewAdapter.notifyDataSetChanged();\n                return;\n            }\n        }\n    }\n\n    @Override\n    protected void onDestroy() {\n        super.onDestroy();\n        EventBus.getDefault().unregister(this);\n    }\n}\n"
  },
  {
    "path": "module_talent/src/main/java/com/senon/module_talent/contract/CollectionActivityCon.java",
    "content": "package com.senon.module_talent.contract;\n\nimport com.senon.lib_common.base.BasePresenter;\nimport com.senon.lib_common.base.BaseResponse;\nimport com.senon.lib_common.base.BaseViewImp;\nimport com.senon.lib_common.bean.CollectionArticle;\n\n\npublic interface CollectionActivityCon {\n\n    interface View extends BaseViewImp {\n\n        void getDataResult(BaseResponse<CollectionArticle> data);\n\n        void getCollectResult(int id, boolean isCollect);\n\n    }\n\n    abstract class Presenter extends BasePresenter<View> {\n\n        public abstract void getData(int page,boolean isDialog, boolean cancelable);\n\n        public abstract void getUnollect(int id,int originId, boolean isDialog, boolean cancelable);\n    }\n}\n"
  },
  {
    "path": "module_talent/src/main/java/com/senon/module_talent/contract/TalentMainFragmentCon.java",
    "content": "package com.senon.module_talent.contract;\n\nimport com.senon.lib_common.base.BasePresenter;\nimport com.senon.lib_common.base.BaseViewImp;\nimport com.senon.lib_common.base.BaseResponse;\n\nimport java.util.HashMap;\n\n/**\n * TalentMainFragmentCon  V 、P契约类\n */\npublic interface TalentMainFragmentCon {\n\n    interface View extends BaseViewImp {\n\n        void getLogoutResult(BaseResponse data);\n\n    }\n\n    abstract class Presenter extends BasePresenter<View> {\n\n        public abstract void getLogout(boolean isDialog, boolean cancelable);\n\n    }\n}\n"
  },
  {
    "path": "module_talent/src/main/java/com/senon/module_talent/fragment/TalentMainFragment.java",
    "content": "package com.senon.module_talent.fragment;\n\nimport android.view.View;\nimport android.widget.RelativeLayout;\nimport android.widget.TextView;\n\nimport com.alibaba.android.arouter.launcher.ARouter;\nimport com.senon.lib_common.AppConfig;\nimport com.senon.lib_common.ComUtil;\nimport com.senon.lib_common.ConstantArouter;\nimport com.senon.lib_common.ConstantLoginArouter;\nimport com.senon.lib_common.base.BaseLazyFragment;\nimport com.senon.lib_common.base.BaseResponse;\nimport com.senon.lib_common.net.cookies.CookiesManager;\nimport com.senon.lib_common.net.cookies.PersistentCookieStore;\nimport com.senon.lib_common.utils.ACache;\nimport com.senon.lib_common.utils.BaseEvent;\nimport com.senon.lib_common.utils.LogUtils;\nimport com.senon.module_talent.R;\nimport com.senon.module_talent.contract.TalentMainFragmentCon;\nimport com.senon.module_talent.presenter.TalentMainFragmentPre;\n\nimport org.greenrobot.eventbus.EventBus;\n\nimport java.io.File;\n\n/**\n * talent mian fragment\n */\npublic class TalentMainFragment extends BaseLazyFragment<TalentMainFragmentCon.View, TalentMainFragmentCon.Presenter> implements\n        TalentMainFragmentCon.View {\n\n\n    private RelativeLayout collect_lay,login_lay,about_lay,cache_lay;\n    private TextView username_tv,login_tv,cache_tv;\n    private File cacheFile;\n\n    @Override\n    public int getLayoutId() {\n        return R.layout.talent_fragment_main;\n    }\n    @Override\n    public TalentMainFragmentCon.Presenter createPresenter() {\n        return new TalentMainFragmentPre(mContext);\n    }\n    @Override\n    public TalentMainFragmentCon.View createView() {\n        return this;\n    }\n    @Override\n    public void init(View rootView) {\n        collect_lay = rootView.findViewById(R.id.collect_lay);\n        login_lay = rootView.findViewById(R.id.login_lay);\n        about_lay = rootView.findViewById(R.id.about_lay);\n        cache_lay = rootView.findViewById(R.id.cache_lay);\n        username_tv = rootView.findViewById(R.id.username_tv);\n        login_tv = rootView.findViewById(R.id.login_tv);\n        cache_tv = rootView.findViewById(R.id.cache_tv);\n\n    }\n\n    @Override\n    public void onFragmentFirst() {\n        super.onFragmentFirst();\n        //第一次可见时，自动加载页面\n        LogUtils.e(\"-----> 子fragment进行初始化操作\");\n\n        getLoginInfo();\n        initViewListener();\n    }\n\n    private void initViewListener() {\n        cacheFile = new File(AppConfig.PATH_CACHE);\n        cache_tv.setText(ACache.getCacheSize(cacheFile));\n\n        collect_lay.setOnClickListener(new View.OnClickListener() {\n            @Override\n            public void onClick(View v) {\n                if(PersistentCookieStore.getCookieStore().isLogin()) {//已经登录过了\n                    ARouter.getInstance().build(ConstantArouter.PATH_TALENT_COLLECTIONACTIVITY)\n                            .navigation();\n                }else{\n                    ARouter.getInstance().build(ConstantLoginArouter.PATH_COMMON_LOGINACTIVITY)\n                            .navigation();\n                }\n            }\n        });\n        about_lay.setOnClickListener(new View.OnClickListener() {\n            @Override\n            public void onClick(View v) {\n                ARouter.getInstance().build(ConstantArouter.PATH_TALENT_ABOUTACTIVITY)\n                        .navigation();\n            }\n        });\n        cache_lay.setOnClickListener(new View.OnClickListener() {\n            @Override\n            public void onClick(View v) {\n                ACache.deleteDir(cacheFile);\n                cache_tv.setText(ACache.getCacheSize(cacheFile));\n            }\n        });\n    }\n\n    @Override\n    public void onFragmentVisble() {\n        super.onFragmentVisble();\n        //之后每次可见的操作\n        LogUtils.e(\"-----> 子fragment每次可见时的操作\");\n\n        getLoginInfo();\n        cache_tv.setText(ACache.getCacheSize(cacheFile));\n    }\n\n    private void getLoginInfo(){\n        if(PersistentCookieStore.getCookieStore().isLogin()){//已经登录过了\n            username_tv.setText(PersistentCookieStore.getCookieStore().getUsername());\n            login_tv.setText(\"退出\");\n            login_lay.setOnClickListener(new View.OnClickListener() {\n                @Override\n                public void onClick(View v) {\n                    CookiesManager.clearAllCookies();//清空缓存\n                    getPresenter().getLogout(true,true);\n\n                    sendMsgForLog(1);//退出需要发送eventbus\n                }\n            });\n\n        }else{\n            username_tv.setText(\"游客\");\n            login_tv.setText(\"登录\");\n            login_lay.setOnClickListener(new View.OnClickListener() {\n                @Override\n                public void onClick(View v) {\n                    ARouter.getInstance().build(ConstantLoginArouter.PATH_COMMON_LOGINACTIVITY)\n                            .navigation();\n                }\n            });\n\n        }\n    }\n\n    private void sendMsgForLog(int code){\n        BaseEvent event = new BaseEvent();\n        event.setCode(code);\n        EventBus.getDefault().post(event);\n    }\n\n    @Override\n    public void getLogoutResult(BaseResponse data) {\n        CookiesManager.clearAllCookies();//清空缓存\n        getLoginInfo();\n    }\n\n\n}\n"
  },
  {
    "path": "module_talent/src/main/java/com/senon/module_talent/presenter/CollectionActivityPre.java",
    "content": "package com.senon.module_talent.presenter;\n\nimport android.content.Context;\n\nimport com.alibaba.android.arouter.launcher.ARouter;\nimport com.senon.lib_common.ConstantLoginArouter;\nimport com.senon.lib_common.base.BaseResponse;\nimport com.senon.lib_common.bean.CollectionArticle;\nimport com.senon.lib_common.net.ServerUtils;\nimport com.senon.lib_common.net.callback.RequestCallback;\nimport com.senon.lib_common.net.callback.RxErrorHandler;\nimport com.senon.lib_common.utils.RetryWithDelay;\nimport com.senon.lib_common.utils.RxUtils;\nimport com.senon.lib_common.utils.ToastUtil;\nimport com.senon.module_talent.contract.CollectionActivityCon;\n\n/**\n * CollectionActivity  P\n */\npublic class CollectionActivityPre extends CollectionActivityCon.Presenter{\n\n    private Context context;\n\n    public CollectionActivityPre(Context context) {\n        this.context = context;\n    }\n\n    @Override\n    public void getData(int page,boolean isDialog, boolean cancelable) {\n        ServerUtils.getCommonApi().getCollectList(page)\n                .retryWhen(new RetryWithDelay(3,2))\n                .compose(RxUtils.<BaseResponse<CollectionArticle>>bindToLifecycle(getView()))\n                .compose(RxUtils.<BaseResponse<CollectionArticle>>getSchedulerTransformer())\n                .subscribe(new RequestCallback<BaseResponse<CollectionArticle>>(context, RxErrorHandler.getInstance(),isDialog,cancelable) {\n                    @Override\n                    public void onNext(BaseResponse<CollectionArticle> baseResponse) {\n                        super.onNext(baseResponse);\n\n                        getView().getDataResult(baseResponse);\n                    }\n                    @Override\n                    public void onError(Throwable e) {\n                        super.onError(e);\n                    }\n                });\n    }\n\n    @Override\n    public void getUnollect(final int id,int originId, boolean isDialog, boolean cancelable) {\n        ServerUtils.getCommonApi().getUncollect(id,originId)\n                .retryWhen(new RetryWithDelay(3,2))\n                .compose(RxUtils.<BaseResponse>bindToLifecycle(getView()))\n                .compose(RxUtils.<BaseResponse>getSchedulerTransformer())\n                .subscribe(new RequestCallback<BaseResponse>(context, RxErrorHandler.getInstance(),isDialog,cancelable) {\n                    @Override\n                    public void onNext(BaseResponse baseResponse) {\n                        super.onNext(baseResponse);\n                        if(baseResponse.getCode() == 0){\n                            getView().getCollectResult(id,false);\n                        }else{\n\n                            ToastUtil.initToast(baseResponse.getMsg());\n                        }\n                    }\n                    @Override\n                    public void onError(Throwable e) {\n                        super.onError(e);\n                    }\n                });\n    }\n}\n"
  },
  {
    "path": "module_talent/src/main/java/com/senon/module_talent/presenter/TalentMainFragmentPre.java",
    "content": "package com.senon.module_talent.presenter;\n\nimport android.content.Context;\nimport com.senon.lib_common.bean.Login;\nimport com.senon.lib_common.net.ServerUtils;\nimport com.senon.lib_common.base.BaseResponse;\nimport com.senon.lib_common.net.callback.RequestCallback;\nimport com.senon.lib_common.net.callback.RxErrorHandler;\nimport com.senon.lib_common.utils.RetryWithDelay;\nimport com.senon.lib_common.utils.RxUtils;\nimport com.senon.lib_common.utils.ToastUtil;\nimport com.senon.module_talent.contract.TalentMainFragmentCon;\nimport java.util.HashMap;\n\n/**\n * HomeMainFragmentCon  P\n */\npublic class TalentMainFragmentPre extends TalentMainFragmentCon.Presenter{\n\n    private Context context;\n\n    public TalentMainFragmentPre(Context context) {\n        this.context = context;\n    }\n\n    @Override\n    public void getLogout( boolean isDialog, boolean cancelable) {\n        ServerUtils.getCommonApi().logout()\n                .retryWhen(new RetryWithDelay(3,2))\n                .compose(RxUtils.<BaseResponse>bindToLifecycle(getView()))\n                .compose(RxUtils.<BaseResponse>getSchedulerTransformer())\n                .subscribe(new RequestCallback<BaseResponse>(context, RxErrorHandler.getInstance(),isDialog,cancelable) {\n                    @Override\n                    public void onNext(BaseResponse baseResponse) {\n                        super.onNext(baseResponse);\n                        BaseResponse response = baseResponse;\n                        if(response.getCode()==0){\n                            getView().getLogoutResult(response);\n                        }else{\n                            ToastUtil.initToast(response.getMsg());\n                        }\n                    }\n                    @Override\n                    public void onError(Throwable e) {\n                        super.onError(e);\n                    }\n                });\n    }\n}\n"
  },
  {
    "path": "module_talent/src/main/release/AndroidManifest.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    package=\"com.senon.module_talent\">\n\n    <uses-permission android:name=\"android.permission.INTERNET\" />\n\n    <application\n        android:allowBackup=\"true\"\n        >\n        <activity android:name=\".MainActivity\">\n            <intent-filter>\n                <category android:name=\"android.intent.category.DEFAULT\" />\n                <category android:name=\"android.intent.category.BROWSABLE\" />\n\n                <action android:name=\"android.intent.action.VIEW\" />\n\n                <data\n                    android:host=\"com.senon.module_talent\"\n                    android:scheme=\"router\" />\n            </intent-filter>\n        </activity>\n        <activity android:name=\".activity.CollectionActivity\" />\n        <activity android:name=\".activity.AboutActivity\"/>\n    </application>\n\n</manifest>"
  },
  {
    "path": "module_talent/src/main/res/drawable/talent_ic_launcher_background.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"108dp\"\n    android:height=\"108dp\"\n    android:viewportHeight=\"108\"\n    android:viewportWidth=\"108\">\n    <path\n        android:fillColor=\"#26A69A\"\n        android:pathData=\"M0,0h108v108h-108z\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M9,0L9,108\"\n        android:strokeColor=\"#33FFFFFF\"\n        android:strokeWidth=\"0.8\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M19,0L19,108\"\n        android:strokeColor=\"#33FFFFFF\"\n        android:strokeWidth=\"0.8\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M29,0L29,108\"\n        android:strokeColor=\"#33FFFFFF\"\n        android:strokeWidth=\"0.8\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M39,0L39,108\"\n        android:strokeColor=\"#33FFFFFF\"\n        android:strokeWidth=\"0.8\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M49,0L49,108\"\n        android:strokeColor=\"#33FFFFFF\"\n        android:strokeWidth=\"0.8\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M59,0L59,108\"\n        android:strokeColor=\"#33FFFFFF\"\n        android:strokeWidth=\"0.8\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M69,0L69,108\"\n        android:strokeColor=\"#33FFFFFF\"\n        android:strokeWidth=\"0.8\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M79,0L79,108\"\n        android:strokeColor=\"#33FFFFFF\"\n        android:strokeWidth=\"0.8\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M89,0L89,108\"\n        android:strokeColor=\"#33FFFFFF\"\n        android:strokeWidth=\"0.8\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M99,0L99,108\"\n        android:strokeColor=\"#33FFFFFF\"\n        android:strokeWidth=\"0.8\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M0,9L108,9\"\n        android:strokeColor=\"#33FFFFFF\"\n        android:strokeWidth=\"0.8\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M0,19L108,19\"\n        android:strokeColor=\"#33FFFFFF\"\n        android:strokeWidth=\"0.8\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M0,29L108,29\"\n        android:strokeColor=\"#33FFFFFF\"\n        android:strokeWidth=\"0.8\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M0,39L108,39\"\n        android:strokeColor=\"#33FFFFFF\"\n        android:strokeWidth=\"0.8\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M0,49L108,49\"\n        android:strokeColor=\"#33FFFFFF\"\n        android:strokeWidth=\"0.8\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M0,59L108,59\"\n        android:strokeColor=\"#33FFFFFF\"\n        android:strokeWidth=\"0.8\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M0,69L108,69\"\n        android:strokeColor=\"#33FFFFFF\"\n        android:strokeWidth=\"0.8\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M0,79L108,79\"\n        android:strokeColor=\"#33FFFFFF\"\n        android:strokeWidth=\"0.8\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M0,89L108,89\"\n        android:strokeColor=\"#33FFFFFF\"\n        android:strokeWidth=\"0.8\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M0,99L108,99\"\n        android:strokeColor=\"#33FFFFFF\"\n        android:strokeWidth=\"0.8\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M19,29L89,29\"\n        android:strokeColor=\"#33FFFFFF\"\n        android:strokeWidth=\"0.8\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M19,39L89,39\"\n        android:strokeColor=\"#33FFFFFF\"\n        android:strokeWidth=\"0.8\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M19,49L89,49\"\n        android:strokeColor=\"#33FFFFFF\"\n        android:strokeWidth=\"0.8\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M19,59L89,59\"\n        android:strokeColor=\"#33FFFFFF\"\n        android:strokeWidth=\"0.8\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M19,69L89,69\"\n        android:strokeColor=\"#33FFFFFF\"\n        android:strokeWidth=\"0.8\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M19,79L89,79\"\n        android:strokeColor=\"#33FFFFFF\"\n        android:strokeWidth=\"0.8\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M29,19L29,89\"\n        android:strokeColor=\"#33FFFFFF\"\n        android:strokeWidth=\"0.8\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M39,19L39,89\"\n        android:strokeColor=\"#33FFFFFF\"\n        android:strokeWidth=\"0.8\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M49,19L49,89\"\n        android:strokeColor=\"#33FFFFFF\"\n        android:strokeWidth=\"0.8\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M59,19L59,89\"\n        android:strokeColor=\"#33FFFFFF\"\n        android:strokeWidth=\"0.8\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M69,19L69,89\"\n        android:strokeColor=\"#33FFFFFF\"\n        android:strokeWidth=\"0.8\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M79,19L79,89\"\n        android:strokeColor=\"#33FFFFFF\"\n        android:strokeWidth=\"0.8\" />\n</vector>\n"
  },
  {
    "path": "module_talent/src/main/res/drawable/talent_shape_white_con30.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<shape xmlns:android=\"http://schemas.android.com/apk/res/android\" >\n\n    <!-- view背景色 -->\n    <solid android:color=\"@color/common_white\" />\n    <!--<solid android:color=\"#000\" />-->\n    <!-- 边框圆角 -->\n    <corners\n        android:radius=\"@dimen/mm15\" />\n\n</shape>"
  },
  {
    "path": "module_talent/src/main/res/layout/talent_activity_about.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    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    >\n\n    <include\n        android:id=\"@+id/toolbar\"\n        layout=\"@layout/layout_toolbar\"\n        android:layout_height=\"wrap_content\"\n        android:layout_width=\"match_parent\" />\n\n    <LinearLayout\n        android:layout_below=\"@+id/toolbar\"\n        android:layout_marginTop=\"@dimen/mm30\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:orientation=\"vertical\"\n        android:paddingTop=\"@dimen/mm10\">\n\n        <TextView\n            android:id=\"@+id/version_tv\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_gravity=\"center\"\n            android:layout_marginTop=\"@dimen/mm30\"\n            android:layout_marginBottom=\"@dimen/mm30\"\n            android:drawableTop=\"@mipmap/ic_logo\"\n            android:gravity=\"center\"\n            android:text=\"@string/talent_wanandroid\"\n            android:textAllCaps=\"false\"\n            android:textColor=\"@color/color_232323\"\n            android:textSize=\"@dimen/mm36\" />\n\n        <TextView\n            android:padding=\"@dimen/mm50\"\n            android:id=\"@+id/content_tv\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:textSize=\"@dimen/mm30\"\n            tools:text=\"@string/talent_about_content\"\n            android:textColor=\"@color/deep_black\" />\n    </LinearLayout>\n\n\n</RelativeLayout>\n"
  },
  {
    "path": "module_talent/src/main/res/layout/talent_activity_collection.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    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    >\n\n    <include\n        android:id=\"@+id/toolbar\"\n        layout=\"@layout/layout_toolbar\"\n        android:layout_height=\"wrap_content\"\n        android:layout_width=\"match_parent\" />\n\n    <com.github.jdsjlzx.recyclerview.LRecyclerView\n        android:layout_below=\"@+id/toolbar\"\n        android:id=\"@+id/lrv\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"/>\n\n</RelativeLayout>\n"
  },
  {
    "path": "module_talent/src/main/res/layout/talent_activity_main.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    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    >\n\n\n    <android.support.v4.view.ViewPager\n        android:id=\"@+id/talent_main_vp\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"/>\n\n</RelativeLayout>\n"
  },
  {
    "path": "module_talent/src/main/res/layout/talent_adapter_collection.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\">\n\n\n    <RelativeLayout\n        android:id=\"@+id/content_lay\"\n        android:layout_marginTop=\"@dimen/mm15\"\n        android:background=\"@drawable/talent_shape_white_con30\"\n        android:layout_marginLeft=\"@dimen/mm20\"\n        android:layout_marginRight=\"@dimen/mm20\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\">\n        <TextView\n            android:id=\"@+id/type_tv\"\n            android:layout_marginTop=\"@dimen/mm15\"\n            android:layout_marginLeft=\"@dimen/mm20\"\n            android:layout_marginRight=\"@dimen/mm20\"\n            android:textColor=\"@color/common_black_777\"\n            android:text=\"分类\"\n            android:textSize=\"@dimen/mm26\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\" />\n        <TextView\n            android:id=\"@+id/content_tv\"\n            android:singleLine=\"true\"\n            android:layout_below=\"@+id/type_tv\"\n            android:layout_marginTop=\"@dimen/mm7\"\n            android:layout_marginLeft=\"@dimen/mm20\"\n            android:layout_marginRight=\"@dimen/mm20\"\n            android:textColor=\"@color/color_232323\"\n            android:text=\"标题\"\n            android:textSize=\"@dimen/mm32\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\" />\n        <TextView\n            android:layout_below=\"@+id/content_tv\"\n            android:id=\"@+id/user_tv\"\n            android:layout_marginTop=\"@dimen/mm7\"\n            android:layout_marginLeft=\"@dimen/mm20\"\n            android:layout_marginRight=\"@dimen/mm30\"\n            android:layout_marginBottom=\"@dimen/mm15\"\n            android:textColor=\"@color/common_black_999\"\n            android:text=\"姓名\"\n            android:textSize=\"@dimen/mm24\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\" />\n        <TextView\n            android:layout_toRightOf=\"@+id/user_tv\"\n            android:layout_below=\"@+id/content_tv\"\n            android:id=\"@+id/time_tv\"\n            android:layout_marginTop=\"@dimen/mm7\"\n            android:layout_marginRight=\"@dimen/mm30\"\n            android:textColor=\"@color/common_black_999\"\n            android:text=\"时间\"\n            android:textSize=\"@dimen/mm24\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\" />\n\n        <TextView\n            android:padding=\"@dimen/mm5\"\n            android:layout_below=\"@+id/content_tv\"\n            android:layout_alignParentRight=\"true\"\n            android:id=\"@+id/collection_tv\"\n            android:layout_marginRight=\"@dimen/mm25\"\n            android:textColor=\"@color/common_black_999\"\n            android:text=\"收藏\"\n            android:textSize=\"@dimen/mm26\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\" />\n    </RelativeLayout>\n\n</RelativeLayout>"
  },
  {
    "path": "module_talent/src/main/res/layout/talent_fragment_main.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:layout_width=\"match_parent\"\n    android:orientation=\"vertical\"\n    android:layout_height=\"match_parent\">\n\n\n    <ImageView\n        android:id=\"@+id/bg_igv\"\n        android:scaleType=\"centerCrop\"\n        android:src=\"@mipmap/talent_mainfragmbg\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"@dimen/mm400\" />\n    <TextView\n        android:layout_alignBottom=\"@+id/bg_igv\"\n        android:textColor=\"@color/common_white\"\n        android:layout_toRightOf=\"@+id/talent_igv\"\n        android:layout_marginLeft=\"@dimen/mm30\"\n        android:layout_marginBottom=\"@dimen/mm20\"\n        android:text=\"游客\"\n        android:gravity=\"center\"\n        android:textSize=\"@dimen/mm34\"\n        android:id=\"@+id/username_tv\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\" />\n    <View\n        android:id=\"@+id/view1\"\n        android:layout_below=\"@+id/bg_igv\"\n        android:background=\"@color/common_white\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"@dimen/mm120\"/>\n    <de.hdodenhof.circleimageview.CircleImageView\n        xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n        android:layout_marginTop=\"@dimen/mm320\"\n        android:layout_marginLeft=\"@dimen/mm30\"\n        android:id=\"@+id/talent_igv\"\n        android:layout_width=\"@dimen/mm160\"\n        android:layout_height=\"@dimen/mm160\"\n        android:src=\"@mipmap/talent_conan\"\n        app:civ_border_width=\"@dimen/mm2\"\n        app:civ_border_color=\"@color/common_white\"/>\n\n    <LinearLayout\n        android:layout_below=\"@+id/view1\"\n        android:orientation=\"vertical\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\">\n        <RelativeLayout\n            android:id=\"@+id/collect_lay\"\n            android:background=\"@color/common_white\"\n            android:layout_marginTop=\"@dimen/mm30\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"@dimen/mm90\">\n            <ImageView\n                android:src=\"@mipmap/talent_ic_collect\"\n                android:layout_centerVertical=\"true\"\n                android:id=\"@+id/collect_igv\"\n                android:layout_marginLeft=\"@dimen/mm30\"\n                android:layout_width=\"@dimen/mm45\"\n                android:layout_height=\"@dimen/mm50\" />\n            <TextView\n                android:textColor=\"@color/dark\"\n                android:layout_toRightOf=\"@+id/collect_igv\"\n                android:layout_marginLeft=\"@dimen/mm30\"\n                android:text=\"收藏\"\n                android:gravity=\"center\"\n                android:textSize=\"@dimen/mm30\"\n                android:id=\"@+id/collect_tv\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"match_parent\" />\n            <ImageView\n                android:layout_alignParentRight=\"true\"\n                android:layout_marginRight=\"@dimen/mm30\"\n                android:src=\"@mipmap/ic_right\"\n                android:layout_centerVertical=\"true\"\n                android:layout_width=\"@dimen/mm22\"\n                android:layout_height=\"@dimen/mm26\" />\n            <View\n                android:layout_alignParentBottom=\"true\"\n                android:background=\"@color/split_d\"\n                android:layout_marginLeft=\"@dimen/mm30\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"@dimen/mm1\"/>\n        </RelativeLayout>\n\n        <RelativeLayout\n            android:id=\"@+id/login_lay\"\n            android:background=\"@color/common_white\"\n            android:layout_below=\"@+id/view1\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"@dimen/mm90\">\n            <ImageView\n                android:src=\"@mipmap/talent_ic_login\"\n                android:layout_centerVertical=\"true\"\n                android:id=\"@+id/login_igv\"\n                android:layout_marginLeft=\"@dimen/mm30\"\n                android:layout_width=\"@dimen/mm45\"\n                android:layout_height=\"@dimen/mm50\" />\n            <TextView\n                android:textColor=\"@color/dark\"\n                android:layout_toRightOf=\"@+id/login_igv\"\n                android:layout_marginLeft=\"@dimen/mm30\"\n                android:text=\"登录\"\n                android:gravity=\"center\"\n                android:textSize=\"@dimen/mm30\"\n                android:id=\"@+id/login_tv\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"match_parent\" />\n            <ImageView\n                android:layout_alignParentRight=\"true\"\n                android:layout_marginRight=\"@dimen/mm30\"\n                android:src=\"@mipmap/ic_right\"\n                android:layout_centerVertical=\"true\"\n                android:layout_width=\"@dimen/mm22\"\n                android:layout_height=\"@dimen/mm26\" />\n        </RelativeLayout>\n\n        <RelativeLayout\n            android:id=\"@+id/about_lay\"\n            android:background=\"@color/common_white\"\n            android:layout_marginTop=\"@dimen/mm30\"\n            android:layout_below=\"@+id/view1\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"@dimen/mm90\">\n            <ImageView\n                android:src=\"@mipmap/talent_ic_about\"\n                android:layout_centerVertical=\"true\"\n                android:id=\"@+id/about_igv\"\n                android:layout_marginLeft=\"@dimen/mm30\"\n                android:layout_width=\"@dimen/mm45\"\n                android:layout_height=\"@dimen/mm50\" />\n            <TextView\n                android:textColor=\"@color/dark\"\n                android:layout_toRightOf=\"@+id/about_igv\"\n                android:layout_marginLeft=\"@dimen/mm30\"\n                android:text=\"关于\"\n                android:gravity=\"center\"\n                android:textSize=\"@dimen/mm30\"\n                android:id=\"@+id/about_tv\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"match_parent\" />\n            <ImageView\n                android:layout_alignParentRight=\"true\"\n                android:layout_marginRight=\"@dimen/mm30\"\n                android:src=\"@mipmap/ic_right\"\n                android:layout_centerVertical=\"true\"\n                android:layout_width=\"@dimen/mm22\"\n                android:layout_height=\"@dimen/mm26\" />\n            <View\n                android:layout_alignParentBottom=\"true\"\n                android:background=\"@color/split_d\"\n                android:layout_marginLeft=\"@dimen/mm30\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"@dimen/mm1\"/>\n        </RelativeLayout>\n\n        <RelativeLayout\n            android:id=\"@+id/cache_lay\"\n            android:background=\"@color/common_white\"\n            android:layout_below=\"@+id/view1\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"@dimen/mm90\">\n            <ImageView\n                android:src=\"@mipmap/talent_ic_cache\"\n                android:layout_centerVertical=\"true\"\n                android:id=\"@+id/cache_igv\"\n                android:layout_marginLeft=\"@dimen/mm30\"\n                android:layout_width=\"@dimen/mm45\"\n                android:layout_height=\"@dimen/mm50\" />\n            <TextView\n                android:textColor=\"@color/dark\"\n                android:layout_toRightOf=\"@+id/cache_igv\"\n                android:layout_marginLeft=\"@dimen/mm30\"\n                android:text=\"清除缓存\"\n                android:gravity=\"center\"\n                android:textSize=\"@dimen/mm30\"\n                android:id=\"@+id/cache_textview\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"match_parent\" />\n            <ImageView\n                android:id=\"@+id/right_igv\"\n                android:layout_alignParentRight=\"true\"\n                android:layout_marginRight=\"@dimen/mm30\"\n                android:src=\"@mipmap/ic_right\"\n                android:layout_centerVertical=\"true\"\n                android:layout_width=\"@dimen/mm22\"\n                android:layout_height=\"@dimen/mm26\" />\n            <TextView\n                android:textColor=\"@color/dark\"\n                android:layout_toLeftOf=\"@+id/right_igv\"\n                android:layout_marginRight=\"@dimen/mm20\"\n                android:text=\"\"\n                android:gravity=\"center\"\n                android:textSize=\"@dimen/mm30\"\n                android:id=\"@+id/cache_tv\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"match_parent\" />\n\n        </RelativeLayout>\n\n    </LinearLayout>\n\n\n\n</RelativeLayout>\n"
  },
  {
    "path": "module_talent/src/main/res/values/colors.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <color name=\"colorPrimary\">#3F51B5</color>\n    <color name=\"colorPrimaryDark\">#303F9F</color>\n    <color name=\"colorAccent\">#FF4081</color>\n</resources>\n"
  },
  {
    "path": "module_talent/src/main/res/values/strings.xml",
    "content": "<resources>\n    <string name=\"talent_app_name\">玩安卓_我的</string>\n\n    <string name=\"talent_about_content\"><![CDATA[\n        <h2>网站内容</h2>\n        <p>\\t\\t\\t\\t本网站内容来源于<a href=\"http://www.wanandroid.com/\" target=\"_blank\">鸿洋wanandroid</a>，网站内提供大量优质技术博客、平时开发过程中常用的工具以及常用的网址导航。</p>\n        <p>目前本App含有如下功能：</p>\n            \\t\\t\\t\\t首页：包含Banner、最新博文、最新项目\n            <br/>\\t\\t\\t\\t体系：一级、二级全部博文\n            <br/>\\t\\t\\t\\t公众号：所有公众号及公众号博文\n            <br/>\\t\\t\\t\\t个人中心：登录、退出、收藏、清除缓存\n            <br/><br/><br/>\n        <h2>项目源码</h2>\n        <p>\\t\\t本软件为开源软件，地址<a href=\"https://github.com/senonwx/WanAndroid\" target=\"_blank\">GitHub</a>，如有交流，请提<b>issue。</b>测试账号：12341234，密码123456。</p>\n    ]]></string>\n\n    <string name=\"talent_wanandroid\">WanAndroid </string>\n\n\n</resources>\n"
  },
  {
    "path": "module_talent/src/main/res/values/styles.xml",
    "content": "<resources>\n\n    <!-- Base application theme. -->\n    <style name=\"talent_AppTheme\" 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    </style>\n\n\n</resources>\n"
  },
  {
    "path": "module_talent/src/test/java/com/senon/module_talent/ExampleUnitTest.java",
    "content": "package com.senon.module_talent;\n\nimport org.junit.Test;\n\nimport static org.junit.Assert.*;\n\n/**\n * Example local unit test, which will execute on the development machine (host).\n *\n * @see <a href=\"http://d.android.com/tools/testing\">Testing documentation</a>\n */\npublic class ExampleUnitTest {\n    @Test\n    public void addition_isCorrect() throws Exception {\n        assertEquals(4, 2 + 2);\n    }\n}"
  },
  {
    "path": "settings.gradle",
    "content": "include ':app', ':module_home', ':module_life', ':module_art', ':module_talent', ':lib_opensource', ':lib_common'\n"
  }
]