Full Code of senonwx/WanAndroid for AI

master 548831d6c068 cached
230 files
550.5 KB
148.4k tokens
1194 symbols
1 requests
Download .txt
Showing preview only (635K chars total). Download the full file or copy to clipboard to get everything.
Repository: senonwx/WanAndroid
Branch: master
Commit: 548831d6c068
Files: 230
Total size: 550.5 KB

Directory structure:
gitextract_lw_97uwb/

├── .gitignore
├── .idea/
│   └── encodings.xml
├── README.md
├── app/
│   ├── .gitignore
│   ├── build.gradle
│   ├── proguard-rules.pro
│   └── src/
│       ├── androidTest/
│       │   └── java/
│       │       └── com/
│       │           └── senon/
│       │               └── xfhmoudel/
│       │                   └── ExampleInstrumentedTest.java
│       ├── main/
│       │   ├── AndroidManifest.xml
│       │   ├── java/
│       │   │   └── com/
│       │   │       └── senon/
│       │   │           └── xfhmoudel/
│       │   │               ├── App.java
│       │   │               ├── FragmentHomeActivity.java
│       │   │               ├── SplashActivity.java
│       │   │               └── TestActivity.java
│       │   └── res/
│       │       ├── drawable/
│       │       │   ├── ic_launcher_background.xml
│       │       │   └── shape_splash_timer.xml
│       │       ├── layout/
│       │       │   ├── activity_fragment_home.xml
│       │       │   ├── activity_splash.xml
│       │       │   └── activity_test.xml
│       │       └── values/
│       │           ├── colors.xml
│       │           ├── strings.xml
│       │           └── styles.xml
│       └── test/
│           └── java/
│               └── com/
│                   └── senon/
│                       └── xfhmoudel/
│                           └── ExampleUnitTest.java
├── build.gradle
├── dependencies.gradle
├── gradle/
│   └── wrapper/
│       ├── gradle-wrapper.jar
│       └── gradle-wrapper.properties
├── gradle.properties
├── gradlew
├── gradlew.bat
├── lib_common/
│   ├── .gitignore
│   ├── build.gradle
│   ├── proguard-rules.pro
│   └── src/
│       ├── androidTest/
│       │   └── java/
│       │       └── com/
│       │           └── senon/
│       │               └── lib_common/
│       │                   └── ExampleInstrumentedTest.java
│       ├── main/
│       │   ├── AndroidManifest.xml
│       │   ├── java/
│       │   │   └── com/
│       │   │       └── senon/
│       │   │           └── lib_common/
│       │   │               ├── AppConfig.java
│       │   │               ├── ComUtil.java
│       │   │               ├── ConstantArouter.java
│       │   │               ├── ConstantLoginArouter.java
│       │   │               ├── adapter/
│       │   │               │   ├── CommonAdapter.java
│       │   │               │   ├── CommonHolder.java
│       │   │               │   ├── RecycleHolder.java
│       │   │               │   └── RecyclerAdapter.java
│       │   │               ├── api/
│       │   │               │   └── BaseApi.java
│       │   │               ├── base/
│       │   │               │   ├── BaseActivity.java
│       │   │               │   ├── BaseAppDeletage.java
│       │   │               │   ├── BaseApplication.java
│       │   │               │   ├── BaseFragment.java
│       │   │               │   ├── BaseLazyFragment.java
│       │   │               │   ├── BaseNestingLazyFragment.java
│       │   │               │   ├── BasePresenter.java
│       │   │               │   ├── BaseResponse.java
│       │   │               │   └── BaseViewImp.java
│       │   │               ├── bean/
│       │   │               │   ├── Banner.java
│       │   │               │   ├── CollectionArticle.java
│       │   │               │   ├── HomeArticle.java
│       │   │               │   ├── KnowledgeSysArticle.java
│       │   │               │   ├── KnowledgeSystem.java
│       │   │               │   ├── Login.java
│       │   │               │   ├── ProjectArticle.java
│       │   │               │   ├── WXarticle.java
│       │   │               │   └── WXchapters.java
│       │   │               ├── common/
│       │   │               │   ├── contract/
│       │   │               │   │   ├── LoginContract.java
│       │   │               │   │   └── WebviewContract.java
│       │   │               │   ├── presenter/
│       │   │               │   │   ├── LoginPresenter.java
│       │   │               │   │   └── WebviewPresenter.java
│       │   │               │   └── ui/
│       │   │               │       ├── Common_LoginActivity.java
│       │   │               │       ├── Common_RegisterActivity.java
│       │   │               │       └── Common_WebviewActivity.java
│       │   │               ├── net/
│       │   │               │   ├── RequestInterceptor.java
│       │   │               │   ├── ServerUtils.java
│       │   │               │   ├── callback/
│       │   │               │   │   ├── ErrorListener.java
│       │   │               │   │   ├── RequestCallback.java
│       │   │               │   │   └── RxErrorHandler.java
│       │   │               │   ├── cookies/
│       │   │               │   │   ├── CookiesManager.java
│       │   │               │   │   ├── OkHttpCookies.java
│       │   │               │   │   └── PersistentCookieStore.java
│       │   │               │   └── progress/
│       │   │               │       ├── ProgressCancelListener.java
│       │   │               │       └── ProgressDialogHandler.java
│       │   │               ├── service/
│       │   │               │   └── InitializeService.java
│       │   │               └── utils/
│       │   │                   ├── ACache.java
│       │   │                   ├── BaseEvent.java
│       │   │                   ├── ConstantUtils.java
│       │   │                   ├── LogUtils.java
│       │   │                   ├── MD5Utils.java
│       │   │                   ├── PreferenceTool.java
│       │   │                   ├── RetryWithDelay.java
│       │   │                   ├── RxUtils.java
│       │   │                   ├── StatusBarUtils.java
│       │   │                   └── ToastUtil.java
│       │   └── res/
│       │       ├── drawable/
│       │       │   ├── register_border.xml
│       │       │   ├── register_border_2.xml
│       │       │   ├── register_border_9.xml
│       │       │   ├── shape_gradient.xml
│       │       │   ├── style_progress_bar.xml
│       │       │   └── toast_shape.xml
│       │       ├── layout/
│       │       │   ├── activity_common__login.xml
│       │       │   ├── activity_common__register.xml
│       │       │   ├── activity_common__webview.xml
│       │       │   ├── layout_fragmhome_tab.xml
│       │       │   ├── layout_toolbar.xml
│       │       │   └── toast_layout.xml
│       │       └── values/
│       │           ├── colors.xml
│       │           ├── dimens.xml
│       │           ├── strings.xml
│       │           └── styles.xml
│       └── test/
│           └── java/
│               └── com/
│                   └── senon/
│                       └── lib_common/
│                           └── ExampleUnitTest.java
├── lib_opensource/
│   ├── .gitignore
│   ├── build.gradle
│   ├── proguard-rules.pro
│   └── src/
│       ├── androidTest/
│       │   └── java/
│       │       └── com/
│       │           └── senon/
│       │               └── lib_opensource/
│       │                   └── ExampleInstrumentedTest.java
│       ├── main/
│       │   └── AndroidManifest.xml
│       └── test/
│           └── java/
│               └── com/
│                   └── senon/
│                       └── lib_opensource/
│                           └── ExampleUnitTest.java
├── module_art/
│   ├── .gitignore
│   ├── build.gradle
│   ├── proguard-rules.pro
│   └── src/
│       ├── androidTest/
│       │   └── java/
│       │       └── com/
│       │           └── senon/
│       │               └── module_art/
│       │                   └── ExampleInstrumentedTest.java
│       ├── main/
│       │   ├── debug/
│       │   │   └── AndroidManifest.xml
│       │   ├── java/
│       │   │   └── com/
│       │   │       └── senon/
│       │   │           └── module_art/
│       │   │               ├── App_Art.java
│       │   │               ├── MainActivity.java
│       │   │               ├── SplashActivity.java
│       │   │               ├── adapter/
│       │   │               │   └── ArtMainAdapter.java
│       │   │               ├── contract/
│       │   │               │   └── ArtMainFragmentCon.java
│       │   │               ├── fragment/
│       │   │               │   └── ArtMainFragment.java
│       │   │               └── presenter/
│       │   │                   └── ArtMainFragmentPre.java
│       │   ├── release/
│       │   │   └── AndroidManifest.xml
│       │   └── res/
│       │       ├── drawable/
│       │       │   ├── art_launcher_background.xml
│       │       │   ├── art_shape_transp_con20.xml
│       │       │   ├── art_shape_white_con30.xml
│       │       │   └── art_shape_yellow_con20.xml
│       │       ├── layout/
│       │       │   ├── art_activity_main.xml
│       │       │   ├── art_activity_splash.xml
│       │       │   ├── art_adapter_artmain_fragment_article.xml
│       │       │   ├── art_adapter_artmain_fragment_head.xml
│       │       │   ├── art_adapter_artmain_fragment_head_item.xml
│       │       │   └── art_fragment_main.xml
│       │       └── values/
│       │           ├── colors.xml
│       │           ├── strings.xml
│       │           └── styles.xml
│       └── test/
│           └── java/
│               └── com/
│                   └── senon/
│                       └── module_art/
│                           └── ExampleUnitTest.java
├── module_home/
│   ├── .gitignore
│   ├── build.gradle
│   ├── proguard-rules.pro
│   └── src/
│       ├── androidTest/
│       │   └── java/
│       │       └── com/
│       │           └── senon/
│       │               └── module_home/
│       │                   └── ExampleInstrumentedTest.java
│       ├── main/
│       │   ├── debug/
│       │   │   └── AndroidManifest.xml
│       │   ├── java/
│       │   │   └── com/
│       │   │       └── senon/
│       │   │           └── module_home/
│       │   │               ├── App_Home.java
│       │   │               ├── MainActivity.java
│       │   │               ├── SplashActivity.java
│       │   │               ├── activity/
│       │   │               │   ├── HomeArticleActivity.java
│       │   │               │   └── HomeProjectActivity.java
│       │   │               ├── adapter/
│       │   │               │   └── HomeMainAdapter.java
│       │   │               ├── contract/
│       │   │               │   ├── HomeArticleActivityCon.java
│       │   │               │   ├── HomeMainFragmentCon.java
│       │   │               │   └── HomeProjectActivityCon.java
│       │   │               ├── fragment/
│       │   │               │   └── HomeMainFragment.java
│       │   │               └── presenter/
│       │   │                   ├── HomeArticleActivityPre.java
│       │   │                   ├── HomeMainFragmentPre.java
│       │   │                   └── HomeProjectActivityPre.java
│       │   ├── release/
│       │   │   └── AndroidManifest.xml
│       │   └── res/
│       │       ├── drawable/
│       │       │   ├── home_ic_launcher_background.xml
│       │       │   ├── home_shape_stro_red_con30.xml
│       │       │   └── home_shape_white_con30.xml
│       │       ├── layout/
│       │       │   ├── home_activity_home_article.xml
│       │       │   ├── home_activity_home_project.xml
│       │       │   ├── home_activity_main.xml
│       │       │   ├── home_activity_splash.xml
│       │       │   ├── home_adapter_homemain_fragment_article.xml
│       │       │   ├── home_adapter_homemain_fragment_banneritem.xml
│       │       │   ├── home_adapter_homemain_fragment_head.xml
│       │       │   ├── home_adapter_homemain_fragment_project.xml
│       │       │   └── home_fragment_main.xml
│       │       └── values/
│       │           ├── colors.xml
│       │           ├── strings.xml
│       │           └── styles.xml
│       └── test/
│           └── java/
│               └── com/
│                   └── senon/
│                       └── module_home/
│                           └── ExampleUnitTest.java
├── module_life/
│   ├── .gitignore
│   ├── build.gradle
│   ├── proguard-rules.pro
│   └── src/
│       ├── androidTest/
│       │   └── java/
│       │       └── com/
│       │           └── senon/
│       │               └── module_life/
│       │                   └── ExampleInstrumentedTest.java
│       ├── main/
│       │   ├── debug/
│       │   │   └── AndroidManifest.xml
│       │   ├── java/
│       │   │   └── com/
│       │   │       └── senon/
│       │   │           └── module_life/
│       │   │               ├── App_Life.java
│       │   │               ├── MainActivity.java
│       │   │               ├── SplashActivity.java
│       │   │               ├── activity/
│       │   │               │   └── KnowledgeSystemActivity.java
│       │   │               ├── contract/
│       │   │               │   ├── KnowledgeSysActivityCon.java
│       │   │               │   └── LifeMainFragmentCon.java
│       │   │               ├── fragment/
│       │   │               │   └── LifeMainFragment.java
│       │   │               └── presenter/
│       │   │                   ├── KnowledgeSysActivityPre.java
│       │   │                   └── LifeMainFragmentPre.java
│       │   ├── release/
│       │   │   └── AndroidManifest.xml
│       │   └── res/
│       │       ├── drawable/
│       │       │   ├── life_ic_launcher_background.xml
│       │       │   ├── life_shape_gray_10.xml
│       │       │   └── life_shape_white_con30.xml
│       │       ├── layout/
│       │       │   ├── life_activity_home_article.xml
│       │       │   ├── life_activity_main.xml
│       │       │   ├── life_activity_splash.xml
│       │       │   ├── life_adapter_knowledgesys_item.xml
│       │       │   ├── life_adapter_lifemain_flowlayout_item.xml
│       │       │   ├── life_adapter_lifemain_fragment.xml
│       │       │   └── life_fragment_main.xml
│       │       └── values/
│       │           ├── colors.xml
│       │           ├── strings.xml
│       │           └── styles.xml
│       └── test/
│           └── java/
│               └── com/
│                   └── senon/
│                       └── module_life/
│                           └── ExampleUnitTest.java
├── module_talent/
│   ├── .gitignore
│   ├── build.gradle
│   ├── proguard-rules.pro
│   └── src/
│       ├── androidTest/
│       │   └── java/
│       │       └── com/
│       │           └── senon/
│       │               └── module_talent/
│       │                   └── ExampleInstrumentedTest.java
│       ├── main/
│       │   ├── debug/
│       │   │   └── AndroidManifest.xml
│       │   ├── java/
│       │   │   └── com/
│       │   │       └── senon/
│       │   │           └── module_talent/
│       │   │               ├── App_Talent.java
│       │   │               ├── MainActivity.java
│       │   │               ├── activity/
│       │   │               │   ├── AboutActivity.java
│       │   │               │   └── CollectionActivity.java
│       │   │               ├── contract/
│       │   │               │   ├── CollectionActivityCon.java
│       │   │               │   └── TalentMainFragmentCon.java
│       │   │               ├── fragment/
│       │   │               │   └── TalentMainFragment.java
│       │   │               └── presenter/
│       │   │                   ├── CollectionActivityPre.java
│       │   │                   └── TalentMainFragmentPre.java
│       │   ├── release/
│       │   │   └── AndroidManifest.xml
│       │   └── res/
│       │       ├── drawable/
│       │       │   ├── talent_ic_launcher_background.xml
│       │       │   └── talent_shape_white_con30.xml
│       │       ├── layout/
│       │       │   ├── talent_activity_about.xml
│       │       │   ├── talent_activity_collection.xml
│       │       │   ├── talent_activity_main.xml
│       │       │   ├── talent_adapter_collection.xml
│       │       │   └── talent_fragment_main.xml
│       │       └── values/
│       │           ├── colors.xml
│       │           ├── strings.xml
│       │           └── styles.xml
│       └── test/
│           └── java/
│               └── com/
│                   └── senon/
│                       └── module_talent/
│                           └── ExampleUnitTest.java
├── senon.jks
└── settings.gradle

================================================
FILE CONTENTS
================================================

================================================
FILE: .gitignore
================================================
*.iml
.gradle
/local.properties
/.idea/workspace.xml
/.idea/libraries
.DS_Store
/build
/captures
.externalNativeBuild


================================================
FILE: .idea/encodings.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
  <component name="Encoding" addBOMForNewFiles="with NO BOM" />
</project>

================================================
FILE: README.md
================================================
# WanAndroid
玩安卓http://www.wanandroid.com/ 客户端模块化设计app,包含MVP+Retrofit+Rxjava+Rxlifecycle+Glide+Eventbus+ARouter.
构建一个平面化、简而美的玩安卓app客户端。<br/><br/>
如果不清楚如何将Android工程模块化,请看<a href="https://blog.csdn.net/qq_37173653/article/details/84592893">Android模块化使用</a>


# API
app采用<a href="http://www.wanandroid.com/blog/show/2">玩安卓开放api</a>  

# 主要功能
首页:Banner<br/>
首页:最新博文(5条)、最新项目(5条)<br/>
体系:一级二级下面全部博文<br/>
公众号:所有公众号列表<br/>
公众号:某公众号下所有博文<br/>
个人中心:登录、退出、收藏、清除缓存<br/>

# 屏幕截图
<img src="https://github.com/senonwx/WanAndroid/blob/master/screenshot/main2.png"><img/><br/>
<img src="https://github.com/senonwx/WanAndroid/blob/master/screenshot/main.png"><img/><br/>
<img src="https://github.com/senonwx/WanAndroid/blob/master/screenshot/main3.png"><img/><br/></br>

# 子模块打包
工程采用的是模块化,如果想要单独跑或者打包各个子模块,那么请将gradle.properties改为</br>
isBuildModule=true</br></br>
如果需要整体打包app,则</br>
isBuildModule=false</br>

# 三方轮子
<a href="https://github.com/ReactiveX/RxJava">Rxjava</a> <br/>
<a href="https://github.com/ReactiveX/RxAndroid">RxAndroid</a><br/>
<a href="https://github.com/square/retrofit">Retrofit</a><br/>
<a href="https://github.com/square/okhttp">Okhttp</a><br/>
<a href="https://github.com/alibaba/ARouter">ARouter</a><br/>
<a href="https://github.com/bumptech/glide">Glide</a><br/>
<a href="https://github.com/greenrobot/EventBus">EventBus</a><br/>
<a href="https://github.com/hongyangAndroid/FlowLayout">FlowLayout</a><br/>
<a href="https://github.com/pinguo-zhouwei/MZBannerView">MZBannerView</a><br/>
<a href="https://github.com/JessYanCoding/AndroidAutoSize">AndroidAutoSize</a><br/>
<a href="https://github.com/hanks-zyh/HTextView">HTextView</a><br/>
<a href="https://github.com/hdodenhof/CircleImageView">CircleImageView</a><br/>
<a href="https://github.com/jdsjlzx/LRecyclerView">LRecyclerView</a><br/>
<a href="https://github.com/pedant/sweet-alert-dialog">Sweetalertdialog</a><br/>
<a href="https://github.com/JsonChao/Awesome-WanAndroid">Awesome-WanAndroid</a><br/>

# APK下载
<img src="https://github.com/senonwx/WanAndroid/blob/master/screenshot/qrcode.png"><img/><br/>
因为图方便,apk资源是放在leancloud上的,微信扫码下载不了,用手机浏览器扫码可下载。

# 版本

<h3>V 1.0.1</h3>
1.修复各模块清单文件合并问题

<h3>V 1.0.0</h3>
1.第一版

# Thanks
感谢以上所有开源框架。项目用于学习交流,如果你觉得本项目好,谢谢star哦!



================================================
FILE: app/.gitignore
================================================
/build


================================================
FILE: app/build.gradle
================================================
apply plugin: 'com.android.application'

android {
    signingConfigs {
        config {
            keyAlias 'senon'
            keyPassword '123456'
            storeFile file('../senon.jks')
            storePassword '123456'
        }
    }

    compileSdkVersion rootProject.ext.android["compileSdkVersion"]

    defaultConfig {
        applicationId "com.senon.xfhmoudel"

        minSdkVersion rootProject.ext.android["minSdkVersion"]
        targetSdkVersion rootProject.ext.android["targetSdkVersion"]
        versionCode rootProject.ext.android["versionCode"]
        versionName rootProject.ext.android["versionName"]

        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"

        javaCompileOptions {
            annotationProcessorOptions {
                includeCompileClasspath = true
                arguments = [AROUTER_MODULE_NAME: project.getName()]
            }
        }
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
        debug {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            signingConfig signingConfigs.config
        }
    }
    aaptOptions {
        cruncherEnabled = false
    }
    lintOptions {
        checkReleaseBuilds false
        abortOnError false
    }
}

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation 'com.android.support.constraint:constraint-layout:1.1.3'
    androidTestImplementation 'com.android.support.test:runner:1.0.2'
    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
    testImplementation rootProject.ext.dependencies["junit"]



    if (isBuildModule.toBoolean()) {
        implementation project(':lib_common')
    } else {
        implementation project(':module_home')
        implementation project(':module_life')
        implementation project(':module_art')
        implementation project(':module_talent')
    }
    annotationProcessor rootProject.ext.dependencies["butterknife-compiler"]
    annotationProcessor rootProject.ext.dependencies["router-compiler"]

    api rootProject.ext.dependencies["htextview-base"]
    api rootProject.ext.dependencies["htextview-fall"]

}


================================================
FILE: app/proguard-rules.pro
================================================
# Add project specific ProGuard rules here.
# You can control the set of applied configuration files using the
# proguardFiles setting in build.gradle.
#
# For more details, see
#   http://developer.android.com/guide/developing/tools/proguard.html

# If your project uses WebView with JS, uncomment the following
# and specify the fully qualified class name to the JavaScript interface
# class:
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
#   public *;
#}

# Uncomment this to preserve the line number information for
# debugging stack traces.
#-keepattributes SourceFile,LineNumberTable

# If you keep the line number information, uncomment this to
# hide the original source file name.
#-renamesourcefileattribute SourceFile


================================================
FILE: app/src/androidTest/java/com/senon/xfhmoudel/ExampleInstrumentedTest.java
================================================
package com.senon.xfhmoudel;

import android.content.Context;
import android.support.test.InstrumentationRegistry;
import android.support.test.runner.AndroidJUnit4;

import org.junit.Test;
import org.junit.runner.RunWith;

import static org.junit.Assert.*;

/**
 * Instrumented test, which will execute on an Android device.
 *
 * @see <a href="http://d.android.com/tools/testing">Testing documentation</a>
 */
@RunWith(AndroidJUnit4.class)
public class ExampleInstrumentedTest {
    @Test
    public void useAppContext() throws Exception {
        // Context of the app under test.
        Context appContext = InstrumentationRegistry.getTargetContext();

        assertEquals("com.senon.xfhmoudel", appContext.getPackageName());
    }
}


================================================
FILE: app/src/main/AndroidManifest.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    package="com.senon.xfhmoudel">

    <uses-permission android:name="android.permission.INTERNET" />

    <application
        android:name=".App"
        android:allowBackup="true"
        android:icon="@mipmap/ic_logo"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme"
        tools:replace="android:icon">
        <activity android:name=".TestActivity">

        </activity>
        <activity android:name=".FragmentHomeActivity"/>
        <activity android:name=".SplashActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

================================================
FILE: app/src/main/java/com/senon/xfhmoudel/App.java
================================================
package com.senon.xfhmoudel;

import com.alibaba.android.arouter.launcher.ARouter;
import com.senon.lib_common.base.BaseApplication;
import com.senon.lib_common.utils.ConstantUtils;

/**
 * 工程Application
 */
public class App extends BaseApplication {
    @Override
    public void onCreate() {
        super.onCreate();

        initARouter();
    }

    private void initARouter() {
        if (ConstantUtils.isAppDebug()) {
            //开启InstantRun之后,一定要在ARouter.init之前调用openDebug
            ARouter.openDebug();
            ARouter.openLog();
        }
        ARouter.init(this);
    }
}


================================================
FILE: app/src/main/java/com/senon/xfhmoudel/FragmentHomeActivity.java
================================================
package com.senon.xfhmoudel;

import android.support.annotation.Nullable;
import android.support.design.widget.TabLayout;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
import android.support.v4.content.ContextCompat;
import android.support.v4.view.ViewPager;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.TypedValue;
import android.view.KeyEvent;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.ImageView;
import android.widget.RelativeLayout;
import android.widget.TextView;
import com.alibaba.android.arouter.facade.annotation.Route;
import com.senon.lib_common.ComUtil;
import com.senon.lib_common.ConstantArouter;
import com.senon.lib_common.utils.StatusBarUtils;
import com.senon.lib_common.utils.ToastUtil;
import com.senon.module_art.fragment.ArtMainFragment;
import com.senon.module_home.fragment.HomeMainFragment;
import com.senon.module_life.fragment.LifeMainFragment;
import com.senon.module_talent.fragment.TalentMainFragment;
import java.util.ArrayList;
import java.util.List;

/**
 * App主页
 */
@Route(path = ConstantArouter.PATH_APP_FRAGMENTHOMEACTIVITY)
public class FragmentHomeActivity extends AppCompatActivity {

    private ViewPager viewPager;
    private TabLayout tabs;
    private FragmentManager fragmentManager;//声明fragment管理
    private List<Fragment> fragmentList = new ArrayList<>();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        StatusBarUtils.with(this).init();
        setContentView(R.layout.activity_fragment_home);
        ComUtil.changeStatusBarTextColor(this,true);

        viewPager = findViewById(R.id.vp);
        tabs = findViewById(R.id.tabs);

        initVp$Tab();
    }

    private void initVp$Tab() {
        fragmentList.add(new HomeMainFragment());
        fragmentList.add(new LifeMainFragment());
        fragmentList.add(new ArtMainFragment());
        fragmentList.add(new TalentMainFragment());

        fragmentManager = getSupportFragmentManager();
        FragmentPagerAdapter pagerAdapter = new MyFragmentPagerAdapter(fragmentManager);
        viewPager.setAdapter(pagerAdapter);
        viewPager.setOffscreenPageLimit(fragmentList.size());

        tabs.setupWithViewPager(viewPager);//将TabLayout和ViewPager关联起来。
        tabs.setTabsFromPagerAdapter(pagerAdapter);//给Tabs设置适配器

        for (int i = 0; i < tabs.getTabCount(); i++) {
            TabLayout.Tab tab = tabs.getTabAt(i);
            if (tab != null) {
                tab.setCustomView(getTabView(i));
                View view = tab.getCustomView();
                if(i == 0){
                    setTextColor(view,0,true);
                }
            }
        }

        tabs.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
            @Override
            public void onTabSelected(TabLayout.Tab tab) {
                //在这里可以设置选中状态下  tab字体显示样式
                View view = tab.getCustomView();
                setTextColor(view,tab.getPosition(),true);
            }
            @Override
            public void onTabUnselected(TabLayout.Tab tab) {
                View view = tab.getCustomView();
                setTextColor(view,tab.getPosition(),false);
            }
            @Override
            public void onTabReselected(TabLayout.Tab tab) {
            }
        });
    }

    private String[] titles = {"首页","体系","公众号","我的"};
    private int[] colors = {R.color.login_bg_end_1,R.color.tablayout_tv_gray};
    private int[] mipmaps = {R.mipmap.ic_tabbar_discover,R.mipmap.ic_tabbar_mainframe,R.mipmap.ic_tabbar_order,R.mipmap.ic_tabbar_me};
    private int[] mipmaphls = {R.mipmap.ic_tabbar_discoverhl,R.mipmap.ic_tabbar_mainframehl,R.mipmap.ic_tabbar_orderhl,R.mipmap.ic_tabbar_mehl};

    private View getTabView(int curPos) {
        View view = LayoutInflater.from(this).inflate(R.layout.layout_fragmhome_tab, null);
        ImageView igv = (ImageView) view.findViewById(R.id.tab_item_igv);
        TextView tv = (TextView) view.findViewById(R.id.tab_item_tv);
        tv.setText(titles[curPos]);
        igv.setImageResource(mipmaps[curPos]);

        setTextColor(tv,curPos,false);
        return view;
    }

    private void setTextColor(View view,int position,boolean select){
        if (null != view && view instanceof RelativeLayout) {
            TextView tv = (TextView) view.findViewById(R.id.tab_item_tv);
            ImageView igv = (ImageView) view.findViewById(R.id.tab_item_igv);

            tv.setTextSize(TypedValue.COMPLEX_UNIT_MM,22);
            tv.setTextColor(ContextCompat.getColor(this,select ? colors[0] : colors[1]));

            igv.setImageResource(select ? mipmaphls[position] : mipmaps[position]);
        }
    }

    //记录用户首次点击返回键的时间
    private long firstTime=0;
    @Override
    public boolean onKeyUp(int keyCode, KeyEvent event) {
        switch (keyCode) {
            case KeyEvent.KEYCODE_BACK:
                long secondTime = System.currentTimeMillis();
                if (secondTime - firstTime > 2000) {
                    ToastUtil.initToast("再按一次返回键退出程序");
                    firstTime = secondTime;
                    return true;
                } else {
                    System.exit(0);
                }
                break;
        }
        return super.onKeyUp(keyCode, event);
    }

    //FragmentPagerAdapter
    class MyFragmentPagerAdapter extends FragmentPagerAdapter {
        public MyFragmentPagerAdapter(FragmentManager fm) {
            super(fm);
        }
        @Override
        public Fragment getItem(int position) {
            return fragmentList.get(position);
        }
        @Override
        public int getCount() {
            return fragmentList.size();
        }

        @Nullable
        @Override
        public CharSequence getPageTitle(int position) {
            return super.getPageTitle(position);
        }
    }
}



================================================
FILE: app/src/main/java/com/senon/xfhmoudel/SplashActivity.java
================================================
package com.senon.xfhmoudel;

import android.content.pm.PackageManager;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.TextView;
import com.alibaba.android.arouter.facade.annotation.Route;
import com.alibaba.android.arouter.launcher.ARouter;
import com.hanks.htextview.base.HTextView;
import com.senon.lib_common.ComUtil;
import com.senon.lib_common.ConstantArouter;
import com.senon.lib_common.utils.LogUtils;
import com.senon.lib_common.utils.StatusBarUtils;
import java.util.concurrent.TimeUnit;
import io.reactivex.Observable;
import io.reactivex.Observer;
import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.disposables.Disposable;
import io.reactivex.functions.Consumer;
import io.reactivex.functions.Function;
import io.reactivex.schedulers.Schedulers;

/**
 * app 闪屏页
 */
@Route(path = ConstantArouter.PATH_APP_SPLASHACTIVITY)
public class SplashActivity extends AppCompatActivity {

    private final int count = 5;//count秒后跳过
    private TextView version_tv,timmer_tv;
    private Disposable disposable;
    private HTextView anim_tv1, anim_tv2;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        StatusBarUtils.with(this).init();
        setContentView(R.layout.activity_splash);
        ComUtil.changeStatusBarTextColor(this,true);

        version_tv = findViewById(R.id.version_tv);
        timmer_tv = findViewById(R.id.timmer_tv);
        anim_tv1 = findViewById(R.id.anim_tv1);
        anim_tv2 = findViewById(R.id.anim_tv2);

        try {
            version_tv.setText("版本 V" + getPackageManager().getPackageInfo(this.getPackageName(), 0).versionName);
        } catch (PackageManager.NameNotFoundException e) {
            e.printStackTrace();
            version_tv.setText("");
        }

        timmer_tv.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if(disposable != null){
                    disposable.dispose();
                }
                gotoMainAct();
            }
        });

        initTimer();

    }

    private void initTimer() {
        Observable.interval(0, 1, TimeUnit.SECONDS)//设置0延迟,每隔一秒发送一条数据
                .take(count+1) //设置发送count+1次 因为是count~0秒
                .map(new Function<Long, Long>() {
                    @Override
                    public Long apply(Long aLong) throws Exception {
                        LogUtils.d("apply"+(count-aLong));
                        return count-aLong; //发送倒计时
                    }
                })
                .doOnSubscribe(new Consumer<Disposable>() {// 观察者订阅时调用
                    @Override
                    public void accept(Disposable disposable){
                        timmer_tv.setEnabled(true);//在发送数据的时候设置为可以跳过
                        timmer_tv.setVisibility(View.VISIBLE);
                    }
                })
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())//操作UI要在UI线程
                .subscribe(new Observer<Long>() {
                    @Override
                    public void onError(Throwable e) {
                        e.printStackTrace();

                    }

                    @Override
                    public void onComplete() {
                        LogUtils.d("onCompleted: "+System.currentTimeMillis());
                        timmer_tv.setEnabled(false);

                        gotoMainAct();
                    }

                    @Override
                    public void onSubscribe(Disposable d) {
                        timmer_tv.setText(count + " 跳过");

                        disposable = d;
                    }

                    @Override
                    public void onNext(Long aLong) { //接受到一条就是会操作一次UI
                        LogUtils.d("onNext: "+aLong);

                        timmer_tv.setText(aLong + " 跳过");

                        initHTextView(aLong);
                    }
                });
    }


    private void initHTextView(Long aLong) {
        if(aLong == (2 * count / 3) + 1){//显示第一排文字的时间
            anim_tv1.animateText("Talk is cheap.");
        }else if(aLong == count / 2 +1){//显示第二排文字的时间
            anim_tv2.animateText("Show me the code!");
        }
    }

    private void gotoMainAct(){
        ARouter.getInstance().build(ConstantArouter.PATH_APP_FRAGMENTHOMEACTIVITY)//指定跳到那个页面
                .navigation();
        finish();
    }


    @Override
    protected void onDestroy() {
        super.onDestroy();
        if(disposable != null){
            disposable.dispose();
        }
    }
}



================================================
FILE: app/src/main/java/com/senon/xfhmoudel/TestActivity.java
================================================
package com.senon.xfhmoudel;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;

import com.alibaba.android.arouter.facade.annotation.Route;
import com.alibaba.android.arouter.launcher.ARouter;
import com.senon.lib_common.ComUtil;
import com.senon.lib_common.ConstantArouter;
import com.senon.lib_common.ConstantLoginArouter;
import com.senon.lib_common.utils.StatusBarUtils;

/**
 * app 模块主页面
 */
@Route(path = ConstantLoginArouter.PATH_APP_MAINACTIVITY)
public class TestActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        StatusBarUtils.with(this).init();
        setContentView(R.layout.activity_test);
        ComUtil.changeStatusBarTextColor(this,true);

    }

    public void toA(View view){
        // 1. 应用内简单的跳转(通过URL跳转在'进阶用法'中)
//        ARouter.getInstance().build(ConstantLoginArouter.PATH_FIRST_MAINACTIVITY).navigation();

//        String curUrl = ConstantLoginArouter.getCurRouter(this.getClass().getSimpleName());
        String curUrl = ConstantLoginArouter.getCurRouter(ConstantLoginArouter.PATH_HOME_MAINACTIVITY);
        ARouter.getInstance().build(ConstantLoginArouter.PATH_COMMON_LOGINACTIVITY)//指定跳到那个页面
                .withString("targetUrl",ConstantArouter.PATH_APP_FRAGMENTHOMEACTIVITY)//传入目标页面路由地址  可以在指定页面跳入到目标页面
                .navigation();


//        Uri testUriMix = Uri.parse("router://com.senon.firstmoduel/firstmoduel/firstmainactivity");
//        ARouter.getInstance().build(testUriMix)
//                .withString("key1", "value1")
//                .navigation();
    }

    public void toB(View view){
        ARouter.getInstance().build(ConstantArouter.PATH_APP_FRAGMENTHOMEACTIVITY)
                .navigation();
    }
}



================================================
FILE: app/src/main/res/drawable/ic_launcher_background.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
    android:width="108dp"
    android:height="108dp"
    android:viewportHeight="108"
    android:viewportWidth="108">
    <path
        android:fillColor="#26A69A"
        android:pathData="M0,0h108v108h-108z" />
    <path
        android:fillColor="#00000000"
        android:pathData="M9,0L9,108"
        android:strokeColor="#33FFFFFF"
        android:strokeWidth="0.8" />
    <path
        android:fillColor="#00000000"
        android:pathData="M19,0L19,108"
        android:strokeColor="#33FFFFFF"
        android:strokeWidth="0.8" />
    <path
        android:fillColor="#00000000"
        android:pathData="M29,0L29,108"
        android:strokeColor="#33FFFFFF"
        android:strokeWidth="0.8" />
    <path
        android:fillColor="#00000000"
        android:pathData="M39,0L39,108"
        android:strokeColor="#33FFFFFF"
        android:strokeWidth="0.8" />
    <path
        android:fillColor="#00000000"
        android:pathData="M49,0L49,108"
        android:strokeColor="#33FFFFFF"
        android:strokeWidth="0.8" />
    <path
        android:fillColor="#00000000"
        android:pathData="M59,0L59,108"
        android:strokeColor="#33FFFFFF"
        android:strokeWidth="0.8" />
    <path
        android:fillColor="#00000000"
        android:pathData="M69,0L69,108"
        android:strokeColor="#33FFFFFF"
        android:strokeWidth="0.8" />
    <path
        android:fillColor="#00000000"
        android:pathData="M79,0L79,108"
        android:strokeColor="#33FFFFFF"
        android:strokeWidth="0.8" />
    <path
        android:fillColor="#00000000"
        android:pathData="M89,0L89,108"
        android:strokeColor="#33FFFFFF"
        android:strokeWidth="0.8" />
    <path
        android:fillColor="#00000000"
        android:pathData="M99,0L99,108"
        android:strokeColor="#33FFFFFF"
        android:strokeWidth="0.8" />
    <path
        android:fillColor="#00000000"
        android:pathData="M0,9L108,9"
        android:strokeColor="#33FFFFFF"
        android:strokeWidth="0.8" />
    <path
        android:fillColor="#00000000"
        android:pathData="M0,19L108,19"
        android:strokeColor="#33FFFFFF"
        android:strokeWidth="0.8" />
    <path
        android:fillColor="#00000000"
        android:pathData="M0,29L108,29"
        android:strokeColor="#33FFFFFF"
        android:strokeWidth="0.8" />
    <path
        android:fillColor="#00000000"
        android:pathData="M0,39L108,39"
        android:strokeColor="#33FFFFFF"
        android:strokeWidth="0.8" />
    <path
        android:fillColor="#00000000"
        android:pathData="M0,49L108,49"
        android:strokeColor="#33FFFFFF"
        android:strokeWidth="0.8" />
    <path
        android:fillColor="#00000000"
        android:pathData="M0,59L108,59"
        android:strokeColor="#33FFFFFF"
        android:strokeWidth="0.8" />
    <path
        android:fillColor="#00000000"
        android:pathData="M0,69L108,69"
        android:strokeColor="#33FFFFFF"
        android:strokeWidth="0.8" />
    <path
        android:fillColor="#00000000"
        android:pathData="M0,79L108,79"
        android:strokeColor="#33FFFFFF"
        android:strokeWidth="0.8" />
    <path
        android:fillColor="#00000000"
        android:pathData="M0,89L108,89"
        android:strokeColor="#33FFFFFF"
        android:strokeWidth="0.8" />
    <path
        android:fillColor="#00000000"
        android:pathData="M0,99L108,99"
        android:strokeColor="#33FFFFFF"
        android:strokeWidth="0.8" />
    <path
        android:fillColor="#00000000"
        android:pathData="M19,29L89,29"
        android:strokeColor="#33FFFFFF"
        android:strokeWidth="0.8" />
    <path
        android:fillColor="#00000000"
        android:pathData="M19,39L89,39"
        android:strokeColor="#33FFFFFF"
        android:strokeWidth="0.8" />
    <path
        android:fillColor="#00000000"
        android:pathData="M19,49L89,49"
        android:strokeColor="#33FFFFFF"
        android:strokeWidth="0.8" />
    <path
        android:fillColor="#00000000"
        android:pathData="M19,59L89,59"
        android:strokeColor="#33FFFFFF"
        android:strokeWidth="0.8" />
    <path
        android:fillColor="#00000000"
        android:pathData="M19,69L89,69"
        android:strokeColor="#33FFFFFF"
        android:strokeWidth="0.8" />
    <path
        android:fillColor="#00000000"
        android:pathData="M19,79L89,79"
        android:strokeColor="#33FFFFFF"
        android:strokeWidth="0.8" />
    <path
        android:fillColor="#00000000"
        android:pathData="M29,19L29,89"
        android:strokeColor="#33FFFFFF"
        android:strokeWidth="0.8" />
    <path
        android:fillColor="#00000000"
        android:pathData="M39,19L39,89"
        android:strokeColor="#33FFFFFF"
        android:strokeWidth="0.8" />
    <path
        android:fillColor="#00000000"
        android:pathData="M49,19L49,89"
        android:strokeColor="#33FFFFFF"
        android:strokeWidth="0.8" />
    <path
        android:fillColor="#00000000"
        android:pathData="M59,19L59,89"
        android:strokeColor="#33FFFFFF"
        android:strokeWidth="0.8" />
    <path
        android:fillColor="#00000000"
        android:pathData="M69,19L69,89"
        android:strokeColor="#33FFFFFF"
        android:strokeWidth="0.8" />
    <path
        android:fillColor="#00000000"
        android:pathData="M79,19L79,89"
        android:strokeColor="#33FFFFFF"
        android:strokeWidth="0.8" />
</vector>


================================================
FILE: app/src/main/res/drawable/shape_splash_timer.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" >

    <!-- view背景色 -->
    <solid android:color="#30000000" />
    <!-- 边框圆角 -->
    <corners
        android:radius="@dimen/mm30" />

</shape>

================================================
FILE: app/src/main/res/layout/activity_fragment_home.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <android.support.v4.view.ViewPager
        android:id="@+id/vp"
        android:layout_above="@+id/line_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

    <View
        android:background="@color/color_232323"
        android:layout_above="@+id/tabs"
        android:id="@+id/line_view"
        android:layout_width="match_parent"
        android:layout_height="@dimen/mm1"/>
    <android.support.design.widget.TabLayout
        android:layout_alignParentBottom="true"
        android:id="@+id/tabs"
        android:layout_width="match_parent"
        android:layout_height="@dimen/mm90"
        android:background="#fff"
        app:tabMode="scrollable"
        app:tabIndicatorColor="#00000000"
        app:tabMaxWidth="@dimen/mm187"
        app:tabMinWidth="@dimen/mm187"
        />

</RelativeLayout>


================================================
FILE: app/src/main/res/layout/activity_splash.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    >
    <ImageView
        android:scaleType="centerCrop"
        android:src="@mipmap/splash_bg"
        android:layout_centerVertical="true"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
    <ImageView
        android:id="@+id/logo_igv"
        android:layout_marginTop="@dimen/mm400"
        android:scaleType="centerCrop"
        android:src="@mipmap/ic_logo"
        android:layout_centerHorizontal="true"
        android:layout_width="@dimen/mm100"
        android:layout_height="@dimen/mm100" />
    <ImageView
        android:id="@+id/logo_tv"
        android:layout_marginTop="@dimen/mm30"
        android:layout_below="@+id/logo_igv"
        android:scaleType="centerCrop"
        android:src="@mipmap/splash_appname"
        android:layout_centerHorizontal="true"
        android:layout_width="@dimen/mm400"
        android:layout_height="@dimen/mm90" />

    <TextView
        android:singleLine="true"
        android:layout_marginRight="@dimen/mm50"
        android:layout_marginTop="@dimen/mm80"
        android:layout_alignParentRight="true"
        android:id="@+id/timmer_tv"
        android:textColor="@color/common_white"
        android:background="@drawable/shape_splash_timer"
        android:text="跳过"
        android:textSize="@dimen/mm30"
        android:paddingLeft="@dimen/mm25"
        android:paddingRight="@dimen/mm25"
        android:paddingTop="@dimen/mm5"
        android:paddingBottom="@dimen/mm5"
        android:gravity="center_horizontal"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />
    <TextView
        android:layout_marginBottom="@dimen/mm50"
        android:layout_alignParentBottom="true"
        android:layout_centerHorizontal="true"
        android:id="@+id/version_tv"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="版本 V1.0"
        android:textColor="@color/common_black_777"
        android:textSize="@dimen/mm28" />

    <com.hanks.htextview.fall.FallTextView
        android:layout_below="@+id/logo_tv"
        android:id="@+id/anim_tv1"
        android:layout_marginLeft="@dimen/mm100"
        android:layout_width="wrap_content"
        android:layout_height="@dimen/mm60"
        android:layout_marginTop="@dimen/mm150"
        android:gravity="center_vertical"
        android:textColor="@color/common_splash"
        android:textSize="@dimen/mm40"/>

    <com.hanks.htextview.fall.FallTextView
        android:layout_alignParentRight="true"
        android:layout_below="@+id/anim_tv1"
        android:id="@+id/anim_tv2"
        android:layout_width="wrap_content"
        android:layout_height="@dimen/mm60"
        android:layout_marginTop="@dimen/mm30"
        android:gravity="center_vertical|right"
        android:layout_marginRight="@dimen/mm100"
        android:textColor="@color/common_splash"
        android:textSize="@dimen/mm40"/>

</RelativeLayout>


================================================
FILE: app/src/main/res/layout/activity_test.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    >

    <TextView
        android:layout_marginTop="@dimen/mm500"
        android:layout_gravity="center"
        android:padding="@dimen/mm20"
        android:onClick="toA"
        android:background="#e4dada"
        android:textSize="@dimen/mm30"
        android:text="跳转到登录"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />
    <TextView
        android:layout_gravity="center"
        android:gravity="center"
        android:textSize="@dimen/mm36"
        android:onClick="toB"
        android:layout_marginTop="@dimen/mm50"
        android:background="#e4dada"
        android:padding="@dimen/mm20"
        android:text="不登录直接进入"
        android:layout_width="@dimen/mm500"
        android:layout_height="@dimen/mm200" />
</LinearLayout>


================================================
FILE: app/src/main/res/values/colors.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <color name="colorPrimary">#3F51B5</color>
    <color name="colorPrimaryDark">#303F9F</color>
    <color name="colorAccent">#FF4081</color>
</resources>


================================================
FILE: app/src/main/res/values/strings.xml
================================================
<resources>
    <string name="app_name">玩安卓</string>
</resources>


================================================
FILE: app/src/main/res/values/styles.xml
================================================
<resources>

    <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
        <!-- Customize your theme here. -->
        <item name="colorPrimary">@color/colorPrimary</item>
        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
        <item name="colorAccent">@color/colorAccent</item>
    </style>


</resources>


================================================
FILE: app/src/test/java/com/senon/xfhmoudel/ExampleUnitTest.java
================================================
package com.senon.xfhmoudel;

import org.junit.Test;

import static org.junit.Assert.*;

/**
 * Example local unit test, which will execute on the development machine (host).
 *
 * @see <a href="http://d.android.com/tools/testing">Testing documentation</a>
 */
public class ExampleUnitTest {
    @Test
    public void addition_isCorrect() throws Exception {
        assertEquals(4, 2 + 2);
    }
}

================================================
FILE: build.gradle
================================================
// Top-level build file where you can add configuration options common to all sub-projects/modules.
apply from: "dependencies.gradle"

buildscript {
    
    repositories {
        google()
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:3.0.1'

        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }
}

allprojects {
    repositories {
        google()
        jcenter()
        maven { url "https://jitpack.io" }
    }
}

task clean(type: Delete) {
    delete rootProject.buildDir
}


================================================
FILE: dependencies.gradle
================================================
def supportVersion = "27.1.1"
def rxBindingVersion = "3.0.0-alpha1"
def retrofitVersion = "2.4.0"
def okHttpVersion = "3.11.0"
def stethoVersion = "1.5.0"
def butterKnifeVersion = "8.5.1"
def daggerVersion = "2.8"
def routerVersion = "0.2.3"
def htextviewVersion = "0.1.6"

project.ext {
    android = [
            compileSdkVersion: 27,
            minSdkVersion    : 19,
            targetSdkVersion : 27,
            versionCode      : 2,
            versionName      : "1.0.1"
    ]

    dependencies = [
            //android-support
            "support-v4"                  : "com.android.support:support-v4:${supportVersion}",
            "appcompat-v7"                : "com.android.support:appcompat-v7:${supportVersion}",
            "design"                      : "com.android.support:design:${supportVersion}",
            "recyclerview-v7"             : "com.android.support:recyclerview-v7:${supportVersion}",
            "cardview-v7"                 : "com.android.support:cardview-v7:${supportVersion}",
            "constraint-layout"           : "com.android.support.constraint:constraint-layout:1.1.3",

            //java8-support
            "stream"                      : "com.annimon:stream:1.0.8",

            //rx
            "rxjava"                      : "io.reactivex.rxjava2:rxjava:2.2.3",
            "rxandroid"                   : "io.reactivex.rxjava2:rxandroid:2.1.0",
            "rxlifecycle"                 : "com.trello.rxlifecycle2:rxlifecycle:2.2.1",
            "rxlifecycle-components"      : "com.trello.rxlifecycle2:rxlifecycle-components:2.2.1",
            "rxbinding"                   : "com.jakewharton.rxbinding3:rxbinding-core:${rxBindingVersion}",
            "rxbinding-appcompat-v7"      : "com.jakewharton.rxbinding3:rxbinding-appcompat:${rxBindingVersion}",
            "rxbinding-recyclerview-v7"   : "com.jakewharton.rxbinding3:rxbinding-recyclerview:${rxBindingVersion}",

            //retrofit
            "retrofit"                    : "com.squareup.retrofit2:retrofit:${retrofitVersion}",
            "adapter-rxjava"              : "com.squareup.retrofit2:adapter-rxjava2:${retrofitVersion}",
            "retrofit-converter"          : "com.squareup.retrofit2:converter-scalars:${retrofitVersion}",
            "retrofit-converter-gson"     : "com.squareup.retrofit2:converter-gson:${retrofitVersion}",

            //dagger
            "dagger"                      : "com.google.dagger:dagger:${daggerVersion}",
            "dagger-compiler"             : "com.google.dagger:dagger-compiler:${daggerVersion}",

            //router
            // 替换成最新版本, 需要注意的是api
            // 要与compiler匹配使用,均使用最新版可以保证兼容
            "router"                      : "com.alibaba:arouter-api:1.4.1",
            "router-compiler"             : "com.alibaba:arouter-compiler:1.2.2",

            //butterKnife  子模块的libary与application转化   R 与R2文件转化(所以最好不用)
            //https://www.jianshu.com/p/1fa69ad55b0e
            "butterknife"                 : "com.jakewharton:butterknife:${butterKnifeVersion}",
            "butterknife-compiler"        : "com.jakewharton:butterknife-compiler:${butterKnifeVersion}",

            //facebook
            "stetho"                      : "com.facebook.stetho:stetho:${stethoVersion}",
            "stetho-okhttp3"              : "com.facebook.stetho:stetho-okhttp3:${stethoVersion}",

            //okHttp3
            "okhttp3"                     : "com.squareup.okhttp3:okhttp:${okHttpVersion}",
            "okhttp3-logging-interceptor" : "com.squareup.okhttp3:logging-interceptor:${okHttpVersion}",

            //others
            "ormlite-android"             : "com.j256.ormlite:ormlite-android:5.0",
            //test
            "junit"                       : "junit:junit:4.12",

            //sweet alert dialog
            "sweetalert"                  : "com.github.f0ris.sweetalert:library:1.5.1",
//            "sweetalert"                  : "cn.pedant.sweetalert:library:1.3",
            //autosize
            "autosize"                    : "me.jessyan:autosize:1.0.6",
            "lrecyclerview"               : "com.github.jdsjlzx:LRecyclerView:1.4.3",
            "glide"                       : "com.github.bumptech.glide:glide:3.7.0",
            "eventbus"                    : "org.greenrobot:eventbus:3.1.1",
            "smartrefreshlayout"          : "com.scwang.smartrefresh:SmartRefreshLayout:1.1.0-alpha-20",

            "bannerview"                  : "com.github.pinguo-zhouwei:MZBannerView:v2.0.2",
            "flowlayout"                  : "com.hyman:flowlayout-lib:1.1.2",
            "circleimageview"             : "de.hdodenhof:circleimageview:2.2.0",

            //好看的字体动画
            "htextview-base"              : "com.hanks:htextview-base:${htextviewVersion}",
            "htextview-fall"              : "com.hanks:htextview-fall:${htextviewVersion}",

    ]
}

================================================
FILE: gradle/wrapper/gradle-wrapper.properties
================================================
#Sat Nov 17 20:54:41 CST 2018
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-4.1-all.zip


================================================
FILE: gradle.properties
================================================
# Project-wide Gradle settings.

# IDE (e.g. Android Studio) users:
# Gradle settings configured through the IDE *will override*
# any settings specified in this file.

# For more details on how to configure your build environment visit
# http://www.gradle.org/docs/current/userguide/build_environment.html

# Specifies the JVM arguments used for the daemon process.
# The setting is particularly useful for tweaking memory settings.
org.gradle.jvmargs=-Xmx1536m

# When configured, Gradle will run in incubating parallel mode.
# This option should only be used with decoupled projects. More details, visit
# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
# org.gradle.parallel=true
android.enableAapt2 = false;

#release
isBuildModule=false

#ģ
#isBuildModule=true

================================================
FILE: gradlew
================================================
#!/usr/bin/env bash

##############################################################################
##
##  Gradle start up script for UN*X
##
##############################################################################

# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
DEFAULT_JVM_OPTS=""

APP_NAME="Gradle"
APP_BASE_NAME=`basename "$0"`

# Use the maximum available, or set MAX_FD != -1 to use that value.
MAX_FD="maximum"

warn ( ) {
    echo "$*"
}

die ( ) {
    echo
    echo "$*"
    echo
    exit 1
}

# OS specific support (must be 'true' or 'false').
cygwin=false
msys=false
darwin=false
case "`uname`" in
  CYGWIN* )
    cygwin=true
    ;;
  Darwin* )
    darwin=true
    ;;
  MINGW* )
    msys=true
    ;;
esac

# Attempt to set APP_HOME
# Resolve links: $0 may be a link
PRG="$0"
# Need this for relative symlinks.
while [ -h "$PRG" ] ; do
    ls=`ls -ld "$PRG"`
    link=`expr "$ls" : '.*-> \(.*\)$'`
    if expr "$link" : '/.*' > /dev/null; then
        PRG="$link"
    else
        PRG=`dirname "$PRG"`"/$link"
    fi
done
SAVED="`pwd`"
cd "`dirname \"$PRG\"`/" >/dev/null
APP_HOME="`pwd -P`"
cd "$SAVED" >/dev/null

CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar

# Determine the Java command to use to start the JVM.
if [ -n "$JAVA_HOME" ] ; then
    if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
        # IBM's JDK on AIX uses strange locations for the executables
        JAVACMD="$JAVA_HOME/jre/sh/java"
    else
        JAVACMD="$JAVA_HOME/bin/java"
    fi
    if [ ! -x "$JAVACMD" ] ; then
        die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME

Please set the JAVA_HOME variable in your environment to match the
location of your Java installation."
    fi
else
    JAVACMD="java"
    which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.

Please set the JAVA_HOME variable in your environment to match the
location of your Java installation."
fi

# Increase the maximum file descriptors if we can.
if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then
    MAX_FD_LIMIT=`ulimit -H -n`
    if [ $? -eq 0 ] ; then
        if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
            MAX_FD="$MAX_FD_LIMIT"
        fi
        ulimit -n $MAX_FD
        if [ $? -ne 0 ] ; then
            warn "Could not set maximum file descriptor limit: $MAX_FD"
        fi
    else
        warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
    fi
fi

# For Darwin, add options to specify how the application appears in the dock
if $darwin; then
    GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
fi

# For Cygwin, switch paths to Windows format before running java
if $cygwin ; then
    APP_HOME=`cygpath --path --mixed "$APP_HOME"`
    CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
    JAVACMD=`cygpath --unix "$JAVACMD"`

    # We build the pattern for arguments to be converted via cygpath
    ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
    SEP=""
    for dir in $ROOTDIRSRAW ; do
        ROOTDIRS="$ROOTDIRS$SEP$dir"
        SEP="|"
    done
    OURCYGPATTERN="(^($ROOTDIRS))"
    # Add a user-defined pattern to the cygpath arguments
    if [ "$GRADLE_CYGPATTERN" != "" ] ; then
        OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
    fi
    # Now convert the arguments - kludge to limit ourselves to /bin/sh
    i=0
    for arg in "$@" ; do
        CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
        CHECK2=`echo "$arg"|egrep -c "^-"`                                 ### Determine if an option

        if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then                    ### Added a condition
            eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
        else
            eval `echo args$i`="\"$arg\""
        fi
        i=$((i+1))
    done
    case $i in
        (0) set -- ;;
        (1) set -- "$args0" ;;
        (2) set -- "$args0" "$args1" ;;
        (3) set -- "$args0" "$args1" "$args2" ;;
        (4) set -- "$args0" "$args1" "$args2" "$args3" ;;
        (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
        (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
        (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
        (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
        (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
    esac
fi

# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules
function splitJvmOpts() {
    JVM_OPTS=("$@")
}
eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS
JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME"

exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@"


================================================
FILE: gradlew.bat
================================================
@if "%DEBUG%" == "" @echo off
@rem ##########################################################################
@rem
@rem  Gradle startup script for Windows
@rem
@rem ##########################################################################

@rem Set local scope for the variables with windows NT shell
if "%OS%"=="Windows_NT" setlocal

@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
set DEFAULT_JVM_OPTS=

set DIRNAME=%~dp0
if "%DIRNAME%" == "" set DIRNAME=.
set APP_BASE_NAME=%~n0
set APP_HOME=%DIRNAME%

@rem Find java.exe
if defined JAVA_HOME goto findJavaFromJavaHome

set JAVA_EXE=java.exe
%JAVA_EXE% -version >NUL 2>&1
if "%ERRORLEVEL%" == "0" goto init

echo.
echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
echo.
echo Please set the JAVA_HOME variable in your environment to match the
echo location of your Java installation.

goto fail

:findJavaFromJavaHome
set JAVA_HOME=%JAVA_HOME:"=%
set JAVA_EXE=%JAVA_HOME%/bin/java.exe

if exist "%JAVA_EXE%" goto init

echo.
echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
echo.
echo Please set the JAVA_HOME variable in your environment to match the
echo location of your Java installation.

goto fail

:init
@rem Get command-line arguments, handling Windowz variants

if not "%OS%" == "Windows_NT" goto win9xME_args
if "%@eval[2+2]" == "4" goto 4NT_args

:win9xME_args
@rem Slurp the command line arguments.
set CMD_LINE_ARGS=
set _SKIP=2

:win9xME_args_slurp
if "x%~1" == "x" goto execute

set CMD_LINE_ARGS=%*
goto execute

:4NT_args
@rem Get arguments from the 4NT Shell from JP Software
set CMD_LINE_ARGS=%$

:execute
@rem Setup the command line

set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar

@rem Execute Gradle
"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%

:end
@rem End local scope for the variables with windows NT shell
if "%ERRORLEVEL%"=="0" goto mainEnd

:fail
rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
rem the _cmd.exe /c_ return code!
if  not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
exit /b 1

:mainEnd
if "%OS%"=="Windows_NT" endlocal

:omega


================================================
FILE: lib_common/.gitignore
================================================
/build


================================================
FILE: lib_common/build.gradle
================================================
apply plugin: 'com.android.library'

android {
    compileSdkVersion rootProject.ext.android["compileSdkVersion"]

    defaultConfig {
        minSdkVersion rootProject.ext.android["minSdkVersion"]
        targetSdkVersion rootProject.ext.android["targetSdkVersion"]
        versionCode rootProject.ext.android["versionCode"]
        versionName rootProject.ext.android["versionName"]

        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"

        javaCompileOptions {
            annotationProcessorOptions {
                arguments = [AROUTER_MODULE_NAME: project.getName()]
            }
        }
    }

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }

}

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation 'com.android.support.constraint:constraint-layout:1.1.3'
    androidTestImplementation 'com.android.support.test:runner:1.0.2'
    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
    testImplementation rootProject.ext.dependencies["junit"]


    api project(':lib_opensource')
    annotationProcessor rootProject.ext.dependencies["router-compiler"]
}


================================================
FILE: lib_common/proguard-rules.pro
================================================
# Add project specific ProGuard rules here.
# You can control the set of applied configuration files using the
# proguardFiles setting in build.gradle.
#
# For more details, see
#   http://developer.android.com/guide/developing/tools/proguard.html

# If your project uses WebView with JS, uncomment the following
# and specify the fully qualified class name to the JavaScript interface
# class:
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
#   public *;
#}

# Uncomment this to preserve the line number information for
# debugging stack traces.
#-keepattributes SourceFile,LineNumberTable

# If you keep the line number information, uncomment this to
# hide the original source file name.
#-renamesourcefileattribute SourceFile


================================================
FILE: lib_common/src/androidTest/java/com/senon/lib_common/ExampleInstrumentedTest.java
================================================
package com.senon.lib_common;

import android.content.Context;
import android.support.test.InstrumentationRegistry;
import android.support.test.runner.AndroidJUnit4;

import org.junit.Test;
import org.junit.runner.RunWith;

import static org.junit.Assert.*;

/**
 * Instrumented test, which will execute on an Android device.
 *
 * @see <a href="http://d.android.com/tools/testing">Testing documentation</a>
 */
@RunWith(AndroidJUnit4.class)
public class ExampleInstrumentedTest {
    @Test
    public void useAppContext() throws Exception {
        // Context of the app under test.
        Context appContext = InstrumentationRegistry.getTargetContext();

        assertEquals("com.senon.lib_common", appContext.getPackageName());
    }
}


================================================
FILE: lib_common/src/main/AndroidManifest.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.senon.lib_common">

    <uses-permission android:name="android.permission.INTERNET"/>
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />

    <application android:allowBackup="true">

        <!--autosize 配置屏幕适配参数-->
        <meta-data
            android:name="design_width_in_dp"
            android:value="750" />
        <meta-data
            android:name="design_height_in_dp"
            android:value="1334" />

        <activity android:name=".common.ui.Common_LoginActivity" />
        <activity android:name=".common.ui.Common_RegisterActivity" />
        <activity android:name=".common.ui.Common_WebviewActivity"></activity>
    </application>

</manifest>

================================================
FILE: lib_common/src/main/java/com/senon/lib_common/AppConfig.java
================================================
package com.senon.lib_common;

import com.senon.lib_common.utils.ConstantUtils;

/**
 * APP配置参数
 */
public class AppConfig {


    public static final String BASE_URL = "https://www.wanandroid.com/";

    public static final String PATH_DATA = ConstantUtils.getAPPContext().getCacheDir().getAbsolutePath()+"/"+"data";

    public static final String PATH_CACHE = PATH_DATA+"/"+"Cache";

}


================================================
FILE: lib_common/src/main/java/com/senon/lib_common/ComUtil.java
================================================
package com.senon.lib_common;

import android.app.Activity;
import android.content.Context;
import android.net.ConnectivityManager;
import android.os.Build;
import android.text.Editable;
import android.text.TextWatcher;
import android.util.DisplayMetrics;
import android.view.View;
import android.widget.EditText;

import com.senon.lib_common.utils.ConstantUtils;
import com.senon.lib_common.utils.MD5Utils;
import com.senon.lib_common.utils.ToastUtil;
import java.text.SimpleDateFormat;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * ComUtil
 */
public class ComUtil {


    public static void changeStatusBarTextColor(Context context,boolean isBlack) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            if (isBlack) {
                //设置状态栏黑色字体
                ((Activity)context).getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN |
                        View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);
            } else {
                //恢复状态栏白色字体
                ((Activity)context).getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);

            }
        }
    }


    public static boolean isNumeric(String str) {
        Pattern pattern = Pattern.compile("^1[3|4|5|7|8|9][0-9]{9}$");
        Matcher isNum = pattern.matcher(str);
        if (!isNum.matches()) {
            return false;
        }
        return true;
    }

    public static boolean isChinese(String str) {
        Pattern pattern = Pattern.compile("^[\\u4E00-\\u9FA5]+$");
        Matcher isNum = pattern.matcher(str);
        if (!isNum.matches()) {
            return false;
        }
        return true;
    }

    //long型时间转换为字符串时间类型
    public static String longToString(Object longTime, String timeFormat) {
        SimpleDateFormat formatter = new SimpleDateFormat(timeFormat == null ? "yyyy-MM-dd" : timeFormat);
        long time = 0;
        if (longTime instanceof Integer || longTime instanceof Long) {
            return formatter.format(longTime);
        } else if (longTime instanceof String) {
            return formatter.format(Long.valueOf((String) longTime));
        }
        return "时间获取错误";
    }

    //检查是否有可用网络
    public static boolean isNetworkConnected() {
        ConnectivityManager connectivityManager = (ConnectivityManager) ConstantUtils.getAPPContext().
                getSystemService(Context.CONNECTIVITY_SERVICE);
        assert connectivityManager != null;
        return connectivityManager.getActiveNetworkInfo() != null;
    }

    // 屏幕宽度(像素)
    public static int getScreenWidth(Context context) {
        DisplayMetrics metric = new DisplayMetrics();
        ((Activity) context).getWindowManager().getDefaultDisplay().getMetrics(metric);
        return metric.widthPixels;
    }

    public static int getScreenHeight(Context context) {
        DisplayMetrics metric = new DisplayMetrics();
        ((Activity) context).getWindowManager().getDefaultDisplay().getMetrics(metric);
        return metric.heightPixels;
    }

    public static String getMd5Str(HashMap<String, String> map) {
        StringBuffer sb = new StringBuffer();
        Iterator iterator = map.entrySet().iterator();
        while (iterator.hasNext()) {
            Map.Entry entry = (Map.Entry) iterator.next();
            sb.append(entry.getValue().toString());
        }
        return MD5Utils.getMd5(sb.toString() );
    }

    public static HashMap<String, String> getMd5Str(String[] keyArray, String[] valueArray) {
        HashMap<String, String> map = new HashMap<>();
        StringBuffer sb = new StringBuffer();
        if (keyArray.length != valueArray.length) {
            ToastUtil.initToast("key value长度不对应");
        } else {
            for (int i = 0; i < keyArray.length; i++) {
                map.put(keyArray[i], valueArray[i]);
            }
            for (int i = 0; i < valueArray.length; i++) {
                sb.append(valueArray[i]);
            }
            map.put("secret", MD5Utils.getMd5(sb.toString()));
            return map;
        }
        return null;
    }


}


================================================
FILE: lib_common/src/main/java/com/senon/lib_common/ConstantArouter.java
================================================
package com.senon.lib_common;

/**
 * 所有模块均依赖commonmoduel  所以路由跳转均写入本Constant方便调用
 * 常量类
 * 其中: 路由跳转命名统一用:path+模块名+Activity名
 */
public class ConstantArouter {

    /**
     * App
     */
    public static final String PATH_APP_SPLASHACTIVITY = "/app/SplashActivity";
    public static final String PATH_APP_FRAGMENTHOMEACTIVITY = "/app/FragmentHomeActivity";


    /**
     * home 主页
     */
    public static final String PATH_HOME_MAINACTIVITY = "/home/MainActivity";
    public static final String PATH_HOME_HOMEARTICLEACTIVITY = "/home/HomeArticleActivity";
    public static final String PATH_HOME_HOMEPROJECTACTIVITY = "/home/HomeProjectActivity";

    /**
     * life 知识体系
     */
    public static final String PATH_LIFE_KNOWLEDGESYSTEMACTIVITY = "/life/KnowledgeSystemActivity";

    /**
     * common
     */
    public static final String PATH_COMMON_REGISTERACTIVITY = "/lib_common/CommonRegisterActivity";
    public static final String PATH_COMMON_WEBVIEWCTIVITY = "/lib_common/CommonWebviewActivity";

    /**
     * talent 个人中心
     */
    public static final String PATH_TALENT_COLLECTIONACTIVITY = "/talent/CollectionActivity";
    public static final String PATH_TALENT_ABOUTACTIVITY = "/talent/AboutActivity";


}


================================================
FILE: lib_common/src/main/java/com/senon/lib_common/ConstantLoginArouter.java
================================================
package com.senon.lib_common;

import java.util.HashMap;
import java.util.Map;

/**
 * 判断是某个模块登录的
 */
public class ConstantLoginArouter {

    public static Map<String, String> activityRouterMap = new HashMap<>();

    //app主页
    public static final String PATH_APP_MAINACTIVITY = "/app/MainActivity";

    //home主页
    public static final String PATH_HOME_MAINACTIVITY = "/home/HomeMainActivity";
    //Life首页
    public static final String PATH_LIFE_MAINACTIVITY = "/life/LifeMainActivity";
    //Art首页
    public static final String PATH_ART_MAINACTIVITY = "/art/ArtMainActivity";
    //Talent首页
    public static final String PATH_TALENT_MAINACTIVITY = "/talent/TalentMainActivity";


    //登录 注册
    public static final String PATH_COMMON_LOGINACTIVITY = "/lib_common/CommonLoginActivity";

    static {
        activityRouterMap.put(getActivityName(PATH_APP_MAINACTIVITY), PATH_APP_MAINACTIVITY);
        activityRouterMap.put(getActivityName(PATH_HOME_MAINACTIVITY), PATH_HOME_MAINACTIVITY);
        activityRouterMap.put(getActivityName(PATH_LIFE_MAINACTIVITY), PATH_LIFE_MAINACTIVITY);
        activityRouterMap.put(getActivityName(PATH_ART_MAINACTIVITY), PATH_ART_MAINACTIVITY);
        activityRouterMap.put(getActivityName(PATH_TALENT_MAINACTIVITY), PATH_TALENT_MAINACTIVITY);

        activityRouterMap.put(getActivityName(PATH_COMMON_LOGINACTIVITY), PATH_COMMON_LOGINACTIVITY);
    }

    private static String getActivityName(String routerUrl) {
        int pos = routerUrl.lastIndexOf("/");
        return routerUrl.substring(pos + 1);
    }

    public static String getCurRouter(String activityName) {
        return activityRouterMap.get(activityName);
    }
}


================================================
FILE: lib_common/src/main/java/com/senon/lib_common/adapter/CommonAdapter.java
================================================
package com.senon.lib_common.adapter;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;

import java.util.List;

public abstract class CommonAdapter<T> extends BaseAdapter {
    protected LayoutInflater mInflater;
    protected Context mContext;
    protected List<T> mDatas;
    protected final int mItemLayoutId;

    public CommonAdapter(Context context, List<T> mDatas, int itemLayoutId) {
        mInflater = LayoutInflater.from(context);
        this.mContext = context;
        this.mDatas = mDatas;
        this.mItemLayoutId = itemLayoutId;
    }

    @Override
    public int getCount() {
        return mDatas.size();
    }

    @Override
    public T getItem(int position) {
        return mDatas.get(position);
    }


    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        final CommonHolder viewHolder = getViewHolder(position, convertView, parent);
        convert(viewHolder, getItem(position),position);
        return viewHolder.getConvertView();

    }

    public abstract void convert(CommonHolder helper, T item,int position);

    private CommonHolder getViewHolder(int position, View convertView, ViewGroup parent) {
        return CommonHolder.get(mContext, convertView, parent, mItemLayoutId, position);
    }
} 

================================================
FILE: lib_common/src/main/java/com/senon/lib_common/adapter/CommonHolder.java
================================================
package com.senon.lib_common.adapter;

import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Paint;
import android.graphics.Typeface;
import android.graphics.drawable.Drawable;
import android.os.Build;
import android.text.util.Linkify;
import android.util.SparseArray;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.animation.AlphaAnimation;
import android.widget.Checkable;
import android.widget.GridView;
import android.widget.ImageView;
import android.widget.ProgressBar;
import android.widget.RatingBar;
import android.widget.TextView;
import com.bumptech.glide.Glide;


public class CommonHolder {
    private final SparseArray<View> mViews;
    private int mPosition;
    private View mConvertView;
    private Context mContext;
    private int mLayoutId;

    private CommonHolder(Context context, ViewGroup parent, int layoutId, int position) {
        this.mLayoutId = layoutId;
        this.mContext = context;
        this.mPosition = position;
        this.mViews = new SparseArray<View>();
        mConvertView = LayoutInflater.from(context).inflate(layoutId, parent, false);
        //setTag  
        mConvertView.setTag(this);
    }


    /**
     * 拿到一个CommonHolder对象
     *
     * @param context
     * @param convertView
     * @param parent
     * @param layoutId
     * @param position
     * @return
     */
    public static CommonHolder get(Context context, View convertView, ViewGroup parent, int layoutId, int position) {

        if (convertView == null) {
            return new CommonHolder(context, parent, layoutId, position);
        }
        return (CommonHolder) convertView.getTag();
    }

    /**
     * 通过控件的Id获取对于的控件,如果没有则加入views
     *
     * @param viewId
     * @return
     */
    public <T extends View> T getView(int viewId) {
        View view = mViews.get(viewId);
        if (view == null) {
            view = mConvertView.findViewById(viewId);
            mViews.put(viewId, view);
        }
        return (T) view;
    }

    public View getConvertView() {
        return mConvertView;
    }

    /**
     * 为TextView设置字符串
     *
     * @param viewId
     * @param text
     * @return
     */
    public CommonHolder setText(int viewId, String text) {
        TextView view = getView(viewId);
        view.setText(text);
        return this;
    }

    public String getText(int viewId) {
        TextView view = getView(viewId);
        return view.getText().toString().trim();
    }

    public CommonHolder setEnabled(int viewId, boolean enabled) {
        View view = getView(viewId);
        view.setEnabled(enabled);
        return this;
    }

    public CommonHolder setSelected(int viewId, boolean selected) {
        View view = getView(viewId);
        view.setSelected(selected);
        return this;
    }

    /**
     * 为ImageView设置图片
     *
     * @param viewId
     * @param drawableId
     * @return
     */
    public CommonHolder setImageResource(int viewId, int drawableId) {
        ImageView view = getView(viewId);
        view.setImageResource(drawableId);

        return this;
    }

    /**
     * 为ImageView设置图片
     *
     * @param viewId
     * @param bm
     * @return
     */
    public CommonHolder setImageBitmap(int viewId, Bitmap bm) {
        ImageView view = getView(viewId);
        view.setImageBitmap(bm);
        return this;
    }


    public CommonHolder setColorFilter(int viewId, Integer colorFilter) {
        ImageView imageView = getView(viewId);
        if (colorFilter == null) imageView.setColorFilter(null);
        else imageView.setColorFilter(colorFilter);
        return this;
    }

    public CommonHolder setImageDrawable(int viewId, Drawable drawable) {
        ImageView view = getView(viewId);
        view.setImageDrawable(drawable);
        return this;
    }

    public CommonHolder setBackgroundColor(int viewId, int color) {
        View view = getView(viewId);
        view.setBackgroundColor(color);
        return this;
    }

    public CommonHolder setBackgroundRes(int viewId, int backgroundRes) {
        View view = getView(viewId);
        view.setBackgroundResource(backgroundRes);
        return this;
    }

    public CommonHolder setTextColor(int viewId, int textColor) {
        TextView view = getView(viewId);
        view.setTextColor(textColor);
        return this;
    }

    public CommonHolder setTextColorRes(int viewId, int textColorRes) {
        TextView view = getView(viewId);
        view.setTextColor(mContext.getResources().getColor(textColorRes));
        return this;
    }


    @SuppressLint("NewApi")
    public CommonHolder setAlpha(int viewId, float value) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
            getView(viewId).setAlpha(value);
        } else {
            // Pre-honeycomb hack to set Alpha value
            AlphaAnimation alpha = new AlphaAnimation(value, value);
            alpha.setDuration(0);
            alpha.setFillAfter(true);
            getView(viewId).startAnimation(alpha);
        }
        return this;
    }

    public CommonHolder setVisible(int viewId, int visible) {
        View view = getView(viewId);
        view.setVisibility(visible);
        return this;
    }

    public CommonHolder linkify(int viewId) {
        TextView view = getView(viewId);
        Linkify.addLinks(view, Linkify.ALL);
        return this;
    }

    public CommonHolder setTypeface(Typeface typeface, int... viewIds) {
        for (int viewId : viewIds) {
            TextView view = getView(viewId);
            view.setTypeface(typeface);
            view.setPaintFlags(view.getPaintFlags() | Paint.SUBPIXEL_TEXT_FLAG);
        }
        return this;
    }

    public CommonHolder setProgress(int viewId, int progress) {
        ProgressBar view = getView(viewId);
        view.setProgress(progress);
        return this;
    }

    public CommonHolder setProgress(int viewId, int progress, int max) {
        ProgressBar view = getView(viewId);
        view.setMax(max);
        view.setProgress(progress);
        return this;
    }

    public CommonHolder setMax(int viewId, int max) {
        ProgressBar view = getView(viewId);
        view.setMax(max);
        return this;
    }

    public CommonHolder setRating(int viewId, float rating) {
        RatingBar view = getView(viewId);
        view.setRating(rating);
        return this;
    }

    public CommonHolder setRating(int viewId, float rating, int max) {
        RatingBar view = getView(viewId);
        view.setMax(max);
        view.setRating(rating);
        return this;
    }

    public CommonHolder setTag(int viewId, Object tag) {
        View view = getView(viewId);
        view.setTag(tag);
        return this;
    }

    public CommonHolder setTag(int viewId, int key, Object tag) {
        View view = getView(viewId);
        view.setTag(key, tag);
        return this;
    }

    public CommonHolder setChecked(int viewId, boolean checked) {
        Checkable view = (Checkable) getView(viewId);
        view.setChecked(checked);
        return this;
    }

    /**
     * 关于事件的
     */
    public CommonHolder setOnClickListener(int viewId, View.OnClickListener listener) {
        View view = getView(viewId);
        view.setOnClickListener(listener);
        return this;
    }

    public CommonHolder setOnTouchListener(int viewId, View.OnTouchListener listener) {
        View view = getView(viewId);
        view.setOnTouchListener(listener);
        return this;
    }

    public CommonHolder setOnLongClickListener(int viewId, View.OnLongClickListener listener) {
        View view = getView(viewId);
        view.setOnLongClickListener(listener);
        return this;
    }

    /**
     * 设置中划线
     *
     * @return
     */
    public void setStrikeThruText(int viewID) {
        TextView view = (TextView) getView(viewID);
        view.getPaint().setFlags(Paint.STRIKE_THRU_TEXT_FLAG);
    }

    public int getPosition() {
        return mPosition;
    }

    public GridView setData(int viewId) {
        GridView gridView = getView(viewId);
        return gridView;
    }
}  

================================================
FILE: lib_common/src/main/java/com/senon/lib_common/adapter/RecycleHolder.java
================================================
package com.senon.lib_common.adapter;

import android.app.Activity;
import android.graphics.Bitmap;
import android.support.v7.widget.RecyclerView;
import android.text.Spannable;
import android.text.SpannableString;
import android.text.SpannableStringBuilder;
import android.text.style.AbsoluteSizeSpan;
import android.text.style.ForegroundColorSpan;
import android.util.SparseArray;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Checkable;
import android.widget.ImageView;
import android.widget.ProgressBar;
import android.widget.TextView;
import com.bumptech.glide.Glide;
import com.bumptech.glide.load.engine.DiskCacheStrategy;


public class RecycleHolder extends RecyclerView.ViewHolder {

    /**
     * 用于存储当前item当中的View
     */
    private SparseArray<View> mViews;

    public RecycleHolder(View itemView) {
        super(itemView);
        mViews = new SparseArray<View>();
    }

    public <T extends View> T findView(int ViewId) {
        View view = mViews.get(ViewId);
        //集合中没有,则从item当中获取,并存入集合当中
        if (view == null) {
            view = itemView.findViewById(ViewId);
            mViews.put(ViewId, view);
        }
        return (T) view;
    }

    public RecycleHolder setOnClickListener(int viewId, View.OnClickListener listener) {
        View view = findView(viewId);
        view.setOnClickListener(listener);
        return this;
    }

    public RecycleHolder setOnClickListener(int viewId,int viewId2 ,View.OnClickListener listener) {
        View view = findView(viewId);
        view.setOnClickListener(listener);

        View view2 = findView(viewId2);
        view2.setOnClickListener(listener);
        return this;
    }

    public RecycleHolder setOnLongClickListener(int viewId, View.OnLongClickListener listener) {
        View view = findView(viewId);
        view.setOnLongClickListener(listener);
        return this;
    }

    public RecycleHolder setOnLongClickListener(int viewId,int viewId2, View.OnLongClickListener listener) {
        View view = findView(viewId);
        view.setOnLongClickListener(listener);

        View view2 = findView(viewId2);
        view2.setOnLongClickListener(listener);
        return this;
    }

    public RecycleHolder setText(int viewId, String text) {
        TextView tv = findView(viewId);
        tv.setText(text);
        return this;
    }

    public RecycleHolder setText(int viewId, SpannableStringBuilder text) {
        TextView tv = findView(viewId);
        tv.setText(text);
        return this;
    }

    public RecycleHolder setMaxLine(int viewId, int lineCount) {
        TextView tv = findView(viewId);
        tv.setMaxLines(lineCount);
        return this;
    }

    public RecycleHolder setPadding(int viewId, int left, int top, int right, int bottom) {
        View tv = findView(viewId);
        tv.setPadding(left, top, right, bottom);
        return this;
    }

    public RecycleHolder setAppendTextColor(int viewId, CharSequence str, int resColorId, int resDimen) {
        TextView tv = findView(viewId);
        SpannableString spannableString = new SpannableString(str);
        spannableString.setSpan(new ForegroundColorSpan(tv.getContext().getResources().getColor(resColorId)), 0, str.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
        spannableString.setSpan(new AbsoluteSizeSpan((int) tv.getContext().getResources().getDimension(resDimen)), 0, str.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
        tv.append(spannableString);
        return this;
    }

    public RecycleHolder setSelected(int viewId, boolean selected) {
        View tv = findView(viewId);
        tv.setSelected(selected);
        return this;
    }

    public RecycleHolder setEnabled(int viewId, boolean enabled) {
        View tv = findView(viewId);
        tv.setEnabled(enabled);
        return this;
    }
    public RecycleHolder setEnabled_imgView(int viewId, boolean enabled) {
        ImageView tv = findView(viewId);
        tv.setEnabled(enabled);
        return this;
    }
    public RecycleHolder setText(int viewId, int text) {
        TextView tv = findView(viewId);
        tv.setText(text);
        return this;
    }

    public RecycleHolder setChecked(int viewId, boolean checked) {
        Checkable view = findView(viewId);
        view.setChecked(checked);
        return this;
    }

    public RecycleHolder setTextColor(int viewId, int colorResId) {
        TextView tv = findView(viewId);
        tv.setTextColor(tv.getContext().getResources().getColor(colorResId));
        return this;
    }

    public RecycleHolder setImageResource(int viewId, int ImageId) {
        ImageView image = findView(viewId);
        image.setImageResource(ImageId);
        return this;
    }

    public RecycleHolder setLayoutParams(int viewId, ViewGroup.LayoutParams para) {
        View view = findView(viewId);
        view.setLayoutParams(para);
        return this;
    }


    public RecycleHolder setImageBitmap(int viewId, Bitmap bitmap) {
        ImageView image = findView(viewId);
        image.setImageBitmap(bitmap);
        return this;
    }

    public RecycleHolder setGlideImage(int viewId, String url,int placehodlerImg,Activity activity){
        ImageView image = findView(viewId);
        Glide.with(activity)
                .load(url)
                .error(placehodlerImg)
                .placeholder(placehodlerImg)
                .into(image);
        return this;
    }

    public RecycleHolder setImageNet(int viewId, String url) {
        ImageView image = findView(viewId);
        //使用你所用的网络框架等
        return this;
    }

    public RecycleHolder setBackgroundColor(int viewId, int color) {
        View view = findView(viewId);
        view.setBackgroundColor(color);
        return this;
    }

    public RecycleHolder setBackgroundRes(int viewId, int backgroundRes) {
        View view = findView(viewId);
        view.setBackgroundResource(backgroundRes);
        return this;
    }

    public RecycleHolder setVisible(int viewId, boolean visible) {
        View image = findView(viewId);
        image.setVisibility(visible ? View.VISIBLE : View.GONE);
        //使用你所用的网络框架等
        return this;
    }

    public RecycleHolder setVisible_invisible(int viewId, boolean visible) {
        View image = findView(viewId);
        image.setVisibility(visible ? View.VISIBLE : View.INVISIBLE);
        //使用你所用的网络框架等
        return this;
    }

    public RecycleHolder setProgesss(int viewId, int percent) {
        ProgressBar progressBar = findView(viewId);
        progressBar.setProgress(percent);
        return this;
    }

    public boolean getVisible(int viewId) {
        View view = findView(viewId);
        return view.getVisibility() == View.VISIBLE;
    }


}


================================================
FILE: lib_common/src/main/java/com/senon/lib_common/adapter/RecyclerAdapter.java
================================================
package com.senon.lib_common.adapter;

import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

import java.util.List;


public abstract class RecyclerAdapter<T> extends RecyclerView.Adapter<RecycleHolder> {

    private Context mContext;
    private List<T> mDatas;
    private int mLayoutId;
    private LayoutInflater mInflater;

    private OnItemClickListener onItemClickListener;

    public RecyclerAdapter(Context mContext, List<T> mDatas, int mLayoutId) {
        this.mContext = mContext;
        this.mDatas = mDatas;
        this.mLayoutId = mLayoutId;
        mInflater = LayoutInflater.from(mContext);
    }

    @Override
    public RecycleHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        return new RecycleHolder(mInflater.inflate(mLayoutId, parent, false));
    }

    @Override
    public void onBindViewHolder(final RecycleHolder holder, int position) {
        convert(holder, mDatas.get(position), position);
        if (onItemClickListener != null) {
            //设置背景
            holder.itemView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    //注意,这里的position不要用上面参数中的position,会出现位置错乱\
                    onItemClickListener.OnItemClickListener(holder.itemView, holder.getLayoutPosition());
                }
            });
        }

    }

    public abstract void convert(RecycleHolder holder, T data, int position);

    @Override
    public int getItemCount() {
        return mDatas.size();
    }

    public void setOnItemClickListener(OnItemClickListener onItemClickListener) {
        this.onItemClickListener = onItemClickListener;
    }

   public interface OnItemClickListener {
        void OnItemClickListener(View view, int position);
    }
}


================================================
FILE: lib_common/src/main/java/com/senon/lib_common/api/BaseApi.java
================================================
package com.senon.lib_common.api;

import com.senon.lib_common.bean.Banner;
import com.senon.lib_common.bean.CollectionArticle;
import com.senon.lib_common.bean.HomeArticle;
import com.senon.lib_common.bean.KnowledgeSysArticle;
import com.senon.lib_common.bean.KnowledgeSystem;
import com.senon.lib_common.bean.Login;
import com.senon.lib_common.base.BaseResponse;
import com.senon.lib_common.bean.ProjectArticle;
import com.senon.lib_common.bean.WXarticle;
import com.senon.lib_common.bean.WXchapters;
import java.util.List;
import java.util.Map;
import io.reactivex.Observable;
import retrofit2.http.Field;
import retrofit2.http.FieldMap;
import retrofit2.http.FormUrlEncoded;
import retrofit2.http.GET;
import retrofit2.http.POST;
import retrofit2.http.Path;
import retrofit2.http.Query;

/**
 * 网络请求接口
 */
public interface BaseApi {


    //登录
    @POST("user/login")
    @FormUrlEncoded
    Observable<BaseResponse<Login>> login(@FieldMap Map<String, String> map);
    //登出
    @GET("user/logout/json")
    Observable<BaseResponse> logout();
    //注册
    @POST("user/register")
    @FormUrlEncoded
    Observable<BaseResponse<Login>> register(@FieldMap Map<String, String> map);

    //首页banner
    @GET("banner/json")
    Observable<BaseResponse<List<Banner>>> banner();
    //首页文章列表
    @GET("article/list/{page}/json")
    Observable<BaseResponse<HomeArticle>> getHomeArticle(@Path("page") int page);
    //首页最新项目
    @GET("article/listproject/{page}/json")
    Observable<BaseResponse<ProjectArticle>> getHomeProject(@Path("page") int page);

    //项目列表数据
    @GET("project/list/{page}/json")
    Observable<BaseResponse<ProjectArticle>> getProjectList(@Path("page") int page, @Query("cid") int cid);

    //体系数据
    @GET("tree/json")
    Observable<BaseResponse<List<KnowledgeSystem>>> getKnowledgeList();
    //知识体系下的文章
    @GET("article/list/{page}/json")
    Observable<BaseResponse<KnowledgeSysArticle>> getKnowledgeArticle(@Path("page") int page, @Query("cid") int cid);

    //获取公众号列表
    @GET("wxarticle/chapters/json")
    Observable<BaseResponse<List<WXchapters>>> getWXarticleChapters();
    //查看某个公众号历史数据
    @GET("wxarticle/list/{id}/{page}/json")
    Observable<BaseResponse<WXarticle>> getWXarticleList(@Path("id") int id, @Path("page") int page);

    //收藏站内文章
    @POST("lg/collect/{id}/json")
    Observable<BaseResponse> getCollect(@Path("id") int id);
    //取消收藏-->文章列表
    @POST("lg/uncollect_originId/{id}/json")
    Observable<BaseResponse> getUncollectOriginId(@Path("id") int id);
    //取消收藏-->我的收藏页面
    @POST("lg/uncollect/{id}/json")
    Observable<BaseResponse> getUncollect(@Path("id") int id,@Query("originId") int originId);

    //收藏文章列表
    @GET("lg/collect/list/{page}/json")
    Observable<BaseResponse<CollectionArticle>> getCollectList(@Path("page") int page);
}


================================================
FILE: lib_common/src/main/java/com/senon/lib_common/base/BaseActivity.java
================================================
package com.senon.lib_common.base;

import android.content.pm.ActivityInfo;
import android.os.Bundle;
import android.view.Window;
import com.alibaba.android.arouter.launcher.ARouter;
import com.trello.rxlifecycle2.components.support.RxAppCompatActivity;

/**
 * 父类->基类->动态指定类型->泛型设计(通过泛型指定动态类型->由子类指定,父类只需要规定范围即可)
 */
public abstract class BaseActivity<V extends BaseViewImp,P extends BasePresenter<V>> extends RxAppCompatActivity {

    //引用V层和P层
    private P presenter;
    private V view;
    
    public P getPresenter(){
        return presenter;
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        setContentView(getLayoutId());
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); // 禁止所有的activity横屏
        ARouter.getInstance().inject(this);
        if(presenter == null){
            presenter = createPresenter();
        }
        if(view == null){
            view = createView();
        }
        if(presenter != null && view != null){
            presenter.attachView(view);
        }
        init();
    }

    //由子类指定具体类型
    public abstract int getLayoutId();
    public abstract P createPresenter();
    public abstract V createView();
    public abstract void init();

    @Override
    protected void onDestroy() {
        super.onDestroy();
        if(presenter != null){
            presenter.detachView();
        }
    }
}


================================================
FILE: lib_common/src/main/java/com/senon/lib_common/base/BaseAppDeletage.java
================================================
package com.senon.lib_common.base;

import android.app.Application;
import android.content.Context;

import com.scwang.smartrefresh.layout.SmartRefreshLayout;
import com.scwang.smartrefresh.layout.api.DefaultRefreshFooterCreator;
import com.scwang.smartrefresh.layout.api.DefaultRefreshHeaderCreator;
import com.scwang.smartrefresh.layout.api.RefreshFooter;
import com.scwang.smartrefresh.layout.api.RefreshHeader;
import com.scwang.smartrefresh.layout.api.RefreshLayout;
import com.scwang.smartrefresh.layout.footer.ClassicsFooter;
import com.scwang.smartrefresh.layout.header.ClassicsHeader;
import com.senon.lib_common.R;
import com.senon.lib_common.net.cookies.PersistentCookieStore;
import com.senon.lib_common.service.InitializeService;
import com.senon.lib_common.utils.ConstantUtils;
import com.senon.lib_common.utils.LogUtils;
import com.senon.lib_common.utils.PreferenceTool;
import com.senon.lib_common.utils.ToastUtil;
import me.jessyan.autosize.AutoSizeConfig;
import me.jessyan.autosize.unit.Subunits;


public class BaseAppDeletage {

    private Application mApplication;

    //static 代码段可以防止内存泄露
    static {
        //设置全局的Header构建器
        SmartRefreshLayout.setDefaultRefreshHeaderCreator(new DefaultRefreshHeaderCreator() {
            @Override
            public RefreshHeader createRefreshHeader(Context context, RefreshLayout layout) {
                // 指定为经典Header,默认是 贝塞尔雷达Header
                return new ClassicsHeader(context);
            }
        });
        //设置全局的Footer构建器
        SmartRefreshLayout.setDefaultRefreshFooterCreator(new DefaultRefreshFooterCreator() {
            @Override
            public RefreshFooter createRefreshFooter(Context context, RefreshLayout layout) {
                //指定为经典Footer,默认是 BallPulseFooter
                return new ClassicsFooter(context).setDrawableSize(20);
            }
        });
    }

    public BaseAppDeletage(Application application) {
        mApplication = application;
    }

    public void onCreate() {
        ConstantUtils.init(mApplication);     //全局Utils
        LogUtils.setLogEnable(ConstantUtils.isAppDebug());  //Log日志
        PreferenceTool.init(mApplication);   //Preference参数
        PersistentCookieStore.init(mApplication);   //Cookies持久化Preference参数
        ToastUtil.init(mApplication);       //吐司初始化
        initAutoSizeUnits();                 //配置全局 布局适配单位mm

        InitializeService.start(mApplication);   //初始化服务Service
    }

    private void initAutoSizeUnits() {
        AutoSizeConfig.getInstance().getUnitsManager()
                //支持dp适配 默认true
                .setSupportDP(false)
                //支持sp适配 默认true
                .setSupportSP(false)
                .setSupportSubunits(Subunits.MM);
        AutoSizeConfig.getInstance()
                //按照宽度适配 默认true
                .setBaseOnWidth(true)
                //是否让框架支持自定义 Fragment 的适配参数, 由于这个需求是比较少见的, 所以须要使用者手动开启
                //如果没有这个需求建议不开启
                .setCustomFragment(true);
    }
}


================================================
FILE: lib_common/src/main/java/com/senon/lib_common/base/BaseApplication.java
================================================
package com.senon.lib_common.base;

import android.app.Application;

/**
 * 要想使用BaseApplication,必须在组件中实现自己的Application,并且继承BaseApplication;
 * 组件模块中实现的Application必须在debug包中的AndroidManifest.xml中注册,否则无法使用;
 * 组件模块的Application需置于java/debug文件夹中,不得放于主代码;
 * 组件模块中获取Context的方法必须为:ConstantUtils.getAPPContext(),不允许其他写法;
 */
public class BaseApplication extends Application {

    @Override
    public void onCreate() {
        super.onCreate();
        BaseAppDeletage baseAppDeletage = new BaseAppDeletage(this);
        baseAppDeletage.onCreate();
    }
}


================================================
FILE: lib_common/src/main/java/com/senon/lib_common/base/BaseFragment.java
================================================
package com.senon.lib_common.base;

import android.content.Context;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import com.trello.rxlifecycle2.components.support.RxFragment;

/**
 * 父类->基类->动态指定类型->泛型设计(通过泛型指定动态类型->由子类指定,父类只需要规定范围即可)
 */
public abstract class BaseFragment<V extends BaseViewImp, P extends BasePresenter<V>> extends RxFragment {

    //引用V层和P层
    private P presenter;
    private V view;
    public Context mContext;

    public P getPresenter() {
        return presenter;
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view = inflater.inflate(getLayoutId(), container, false);
        mContext = getActivity();
        if (presenter == null) {
            presenter = createPresenter();
        }
        if (this.view == null) {
            this.view = createView();
        }
        if (presenter != null && view != null) {
            presenter.attachView(this.view);
        }
        init();
        return view;
    }

    //由子类指定具体类型
    public abstract int getLayoutId();
    public abstract P createPresenter();
    public abstract V createView();
    public abstract void init();

    @Override
    public void onDestroyView() {
        super.onDestroyView();
        if (presenter != null) {
            presenter.detachView();
        }
    }
}

================================================
FILE: lib_common/src/main/java/com/senon/lib_common/base/BaseLazyFragment.java
================================================
package com.senon.lib_common.base;

import android.content.Context;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import com.senon.lib_common.utils.LogUtils;
import com.trello.rxlifecycle2.components.support.RxFragment;

/**
 * https://juejin.im/post/5adcb0e36fb9a07aa7673fbc
 * BaseLazyFragment 单fragment懒加载
 *
 *  * 生命周期执行的方法 如下:
 * 第一次生成页面-->可见
 * setUserVisibleHint: ----->false
 * setUserVisibleHint: ----->true
 * onCreateView: -----> onCreateView
 * onStart: -----> onStart
 * onFragmentFirst: 首次可见
 * onFragmentFirst: -----> 子fragment进行初始化操作
 * onResume: -----> onResume
 *
 * 可见-->第一次隐藏:
 * onPause: -----> onPause
 * onFragmentInVisible: 不可见
 *
 * 未销毁且不可见-->重新可见:
 * onStart: -----> onStart
 * onFragmentVisble: 可见
 * onFragmentVisble: -----> 子fragment每次可见时的操作
 * onResume: -----> onResume
 *
 * 可见-->销毁:
 * onPause: -----> onPause
 * onFragmentInVisible: 不可见
 * onDestroyView: -----> onDestroyView
 *
 * 我们可以更具以上生命周期来操作不同的业务逻辑,
 * 请务必运行此module demo,观看打印日志来自定义逻辑。
 */
public abstract class BaseLazyFragment<V extends BaseViewImp, P extends BasePresenter<V>> extends RxFragment {
    //引用V层和P层
    private P presenter;
    private V view;
    public Context mContext;

    private View rootView;
    private boolean mIsFirstVisible = true;/*当前Fragment是否首次可见,默认是首次可见**/
    private boolean isViewCreated = false;/*当前Fragment的View是否已经创建**/
    private boolean currentVisibleState = false;/*当前Fragment的可见状态,一种当前可见,一种当前不可见**/

    public P getPresenter() {
        return presenter;
    }

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        LogUtils.e("-----> onCreateView");
        if(rootView == null){
            rootView = inflater.inflate(getLayoutId(), container, false);
            mContext = getActivity();
            if (presenter == null) {
                presenter = createPresenter();
            }
            if (this.view == null) {
                this.view = createView();
            }
            if (presenter != null && view != null) {
                presenter.attachView(this.view);
            }
            init(rootView);
        }
        isViewCreated=true;//在onCreateView执行完毕,将isViewCreated改为true;
        return rootView;
    }

    //由子类指定具体类型
    public abstract int getLayoutId();
    public abstract P createPresenter();
    public abstract V createView();
    public abstract void init(View rootView);

    @Override
    public void setUserVisibleHint(boolean isVisibleToUser) {
        super.setUserVisibleHint(isVisibleToUser);
        LogUtils.e("----->"+isVisibleToUser);
        if (isViewCreated) {
            //Fragment可见且状态不是可见(从一个Fragment切换到另外一个Fragment,后一个设置状态为可见)
            if (isVisibleToUser && !currentVisibleState) {
                disPatchFragment(true);
            } else if (!isVisibleToUser && currentVisibleState) {
                //Fragment不可见且状态是可见(从一个Fragment切换到另外一个Fragment,前一个更改状态为不可见)
                disPatchFragment(false);
            }
        }
    }

    @Override
    public void onStart() {
        super.onStart();
        LogUtils.e("-----> onStart");
        //isHidden()是Fragment是否处于隐藏状态和isVisible()有区别
        //getUserVisibleHint(),Fragement是否可见
        if(!isHidden()&& getUserVisibleHint()){//如果Fragment没有隐藏且可见
            //执行分发的方法,三种结果对应自Fragment的三个回调,对应的操作,Fragment首次加载,可见,不可见
            disPatchFragment(true);
        }
    }

    @Override
    public void onResume() {
        super.onResume();
        LogUtils.e("-----> onResume");
        if(!mIsFirstVisible){
            //表示点击home键又返回操作,设置可见状态为ture
            if(!isHidden()&& !getUserVisibleHint() && currentVisibleState){
                disPatchFragment(true);
            }
        }
    }

    @Override
    public void onPause() {
        super.onPause();
        LogUtils.e("-----> onPause");
        //表示点击home键,原来可见的Fragment要走该方法,更改Fragment的状态为不可见
        if(!isHidden()&& getUserVisibleHint()){
            disPatchFragment(false);
        }
    }

    @Override
    public void onDestroyView() {
        super.onDestroyView();
        LogUtils.e("-----> onDestroyView");
        //当 View 被销毁的时候我们需要重新设置 isViewCreated mIsFirstVisible 的状态
        isViewCreated = false;
        mIsFirstVisible = true;

        if (presenter != null) {
            presenter.detachView();
        }
    }


    /**
     * @param visible Fragment当前是否可见,然后调用相关方法
     */
    public void disPatchFragment(boolean visible){
        currentVisibleState=visible;
        if(visible){//Fragment可见
            if(mIsFirstVisible){//可见又是第一次
                mIsFirstVisible=false;//改变首次可见的状态
                onFragmentFirst();
            }else{//可见但不是第一次
                onFragmentVisble();
            }
        }else {//不可见
            onFragmentInVisible();
        }
    }

    //Fragemnet首次可见的方法
    public void onFragmentFirst(){
        LogUtils.e("首次可见");
    }
    //Fragemnet可见的方法
    public void onFragmentVisble(){//子Fragment调用次方法,执行可见操作
        LogUtils.e("可见");
    }
    //Fragemnet不可见的方法
    public void onFragmentInVisible(){
        LogUtils.e("不可见");
    }

}


================================================
FILE: lib_common/src/main/java/com/senon/lib_common/base/BaseNestingLazyFragment.java
================================================
package com.senon.lib_common.base;

import android.annotation.SuppressLint;
import android.content.Context;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import com.senon.lib_common.utils.LogUtils;
import com.trello.rxlifecycle2.components.support.RxFragment;
import java.util.List;

/**
 * https://juejin.im/post/5adcb0e36fb9a07aa7673fbc
 *
 * BaseNestingLazyFragment  fragment嵌套fragment的懒加载父类
 */
public abstract class BaseNestingLazyFragment<V extends BaseViewImp, P extends BasePresenter<V>> extends RxFragment {
    //引用V层和P层
    private P presenter;
    private V view;
    public Context mContext;

    private View rootView;
    private boolean mIsFirstVisible = true;/*当前Fragment是否首次可见,默认是首次可见**/
    private boolean isViewCreated = false;/*当前Fragment的View是否已经创建**/
    private boolean currentVisibleState = false;/*当前Fragment的可见状态,一种当前可见,一种当前不可见**/

    public P getPresenter() {
        return presenter;
    }

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        LogUtils.e("-----> onCreateView");
        if (rootView == null) {
            rootView = inflater.inflate(getLayoutId(), container, false);
            mContext = getActivity();
            if (presenter == null) {
                presenter = createPresenter();
            }
            if (this.view == null) {
                this.view = createView();
            }
            if (presenter != null && view != null) {
                presenter.attachView(this.view);
            }
            init(rootView);
        }
        isViewCreated = true;//在onCreateView执行完毕,将isViewCreated改为true;
        return rootView;
    }

    //由子类指定具体类型
    public abstract int getLayoutId();

    public abstract P createPresenter();

    public abstract V createView();

    public abstract void init(View rootView);

    @Override
    public void setUserVisibleHint(boolean isVisibleToUser) {
        super.setUserVisibleHint(isVisibleToUser);
        LogUtils.e("----->" + isVisibleToUser);
        if (isViewCreated) {
            //Fragment可见且状态不是可见(从一个Fragment切换到另外一个Fragment,后一个设置状态为可见)
            if (isVisibleToUser && !currentVisibleState) {
                disPatchFragment(true);
            } else if (!isVisibleToUser && currentVisibleState) {
                //Fragment不可见且状态是可见(从一个Fragment切换到另外一个Fragment,前一个更改状态为不可见)
                disPatchFragment(false);
            }
        }
    }

    @Override
    public void onStart() {
        super.onStart();
        LogUtils.e("-----> onStart");
        //isHidden()是Fragment是否处于隐藏状态和isVisible()有区别
        //getUserVisibleHint(),Fragement是否可见
        if (!isHidden() && getUserVisibleHint()) {//如果Fragment没有隐藏且可见
            //执行分发的方法,三种结果对应自Fragment的三个回调,对应的操作,Fragment首次加载,可见,不可见
            disPatchFragment(true);
        }

    }

    @Override
    public void onResume() {
        super.onResume();
        LogUtils.e("-----> onResume");
        if (!mIsFirstVisible) {
            //表示点击home键又返回操作,设置可见状态为ture
            if (!isHidden() && !getUserVisibleHint() && currentVisibleState) {
                disPatchFragment(true);
            }
        }
    }

    @Override
    public void onPause() {
        super.onPause();
        LogUtils.e("-----> onPause");
        //表示点击home键,原来可见的Fragment要走该方法,更改Fragment的状态为不可见
        if (!isHidden() && getUserVisibleHint()) {
            disPatchFragment(false);
        }
    }

    @Override
    public void onDestroyView() {
        super.onDestroyView();
        LogUtils.e("-----> onDestroyView");
        //当 View 被销毁的时候我们需要重新设置 isViewCreated mIsFirstVisible 的状态
        isViewCreated = false;
        mIsFirstVisible = true;

        if (presenter != null) {
            presenter.detachView();
        }

    }


    /**
     * @param visible Fragment当前是否可见,然后调用相关方法
     */
    public void disPatchFragment(boolean visible) {
        String aa = getClass().getSimpleName();
        //如果父Fragment不可见,则不向下分发给子Fragment
        if (visible && isParentFragmentVsible()) return;

        // 如果当前的 Fragment 要分发的状态与 currentVisibleState 相同(都为false)我们就没有必要去做分发了。
        if (currentVisibleState == visible) return;

        currentVisibleState = visible;
        if (visible) {//Fragment可见
            if (mIsFirstVisible) {//可见又是第一次
                mIsFirstVisible = false;//改变首次可见的状态
                onFragmentFirst();
            }else {//可见但不是第一次
                onFragmentVisble();
            }
            //可见状态的时候内层 fragment 生命周期晚于外层 所以在 onFragmentResume 后分发
            dispatchChildFragmentVisibleState(true);
        } else {//不可见
            onFragmentInVisible();
            dispatchChildFragmentVisibleState(false);
        }
    }


    /**
     * 重新分发给子Fragment
     *
     * @param visible
     */
    private void dispatchChildFragmentVisibleState(boolean visible) {
        FragmentManager childFragmentManager = getChildFragmentManager();
        @SuppressLint("RestrictedApi") List<Fragment> fragments = childFragmentManager.getFragments();
        if (fragments != null) {
            if (!fragments.isEmpty()) {
                for (Fragment child : fragments) {
                    if (child instanceof BaseNestingLazyFragment && !child.isHidden() && child.getUserVisibleHint()) {
                        ((BaseNestingLazyFragment) child).disPatchFragment(visible);
                    }
                }
            }
        }

    }

    //Fragemnet首次可见的方法
    public void onFragmentFirst() {
        LogUtils.e("首次可见");
    }
    //Fragemnet可见的方法
    public void onFragmentVisble() {//子Fragment调用次方法,执行可见操作
        LogUtils.e("可见");
    }
    //Fragemnet不可见的方法
    public void onFragmentInVisible() {
        LogUtils.e("不可见");
    }

    /**
     * 判断多层嵌套的父Fragment是否显示
     */
    private boolean isParentFragmentVsible() {
        BaseNestingLazyFragment fragment = (BaseNestingLazyFragment) getParentFragment();
        return fragment != null && !fragment.getCurrentVisibleState();
    }

    private boolean getCurrentVisibleState() {
        return currentVisibleState;
    }

}


================================================
FILE: lib_common/src/main/java/com/senon/lib_common/base/BasePresenter.java
================================================
package com.senon.lib_common.base;


/**
 * BasePresenter
 */
public abstract class BasePresenter<V extends BaseViewImp>{

    private V mView;

    public V getView(){
        return mView;
    }

    public void attachView(V v){
        mView = v;
    }

    public void detachView(){
        mView = null;
    }


}


================================================
FILE: lib_common/src/main/java/com/senon/lib_common/base/BaseResponse.java
================================================
package com.senon.lib_common.base;

import com.google.gson.annotations.SerializedName;

/**
 * BaseResponse<T>
 */
public class BaseResponse<T> {

    @SerializedName("errorMsg")
    private String msg;
    @SerializedName("errorCode")
    private int code;
    private T data;



    public String getMsg() {
        return msg;
    }

    public int getCode() {
        return code;
    }

    public T getData() {
        return data;
    }


}


================================================
FILE: lib_common/src/main/java/com/senon/lib_common/base/BaseViewImp.java
================================================
package com.senon.lib_common.base;

/**
 * View 父类接口
 */
public interface BaseViewImp {
}


================================================
FILE: lib_common/src/main/java/com/senon/lib_common/bean/Banner.java
================================================
package com.senon.lib_common.bean;

/**
 * 首页Banner
 */
public class Banner {

    /**
     * desc : 一起来做个App吧
     * id : 10
     * imagePath : http://www.wanandroid.com/blogimgs/50c115c2-cf6c-4802-aa7b-a4334de444cd.png
     * isVisible : 1
     * order : 3
     * title : 一起来做个App吧
     * type : 0
     * url : http://www.wanandroid.com/blog/show/2
     */

    private String desc;
    private int id;
    private String imagePath;
    private int isVisible;
    private int order;
    private String title;
    private int type;
    private String url;

    public String getDesc() {
        return desc;
    }

    public void setDesc(String desc) {
        this.desc = desc;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getImagePath() {
        return imagePath;
    }

    public void setImagePath(String imagePath) {
        this.imagePath = imagePath;
    }

    public int getIsVisible() {
        return isVisible;
    }

    public void setIsVisible(int isVisible) {
        this.isVisible = isVisible;
    }

    public int getOrder() {
        return order;
    }

    public void setOrder(int order) {
        this.order = order;
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public int getType() {
        return type;
    }

    public void setType(int type) {
        this.type = type;
    }

    public String getUrl() {
        return url;
    }

    public void setUrl(String url) {
        this.url = url;
    }
}


================================================
FILE: lib_common/src/main/java/com/senon/lib_common/bean/CollectionArticle.java
================================================
package com.senon.lib_common.bean;

import java.util.List;

/**
 * 收藏列表文章
 */

public class CollectionArticle {

    /**
     * curPage : 1
     * 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}]
     * offset : 0
     * over : true
     * pageCount : 1
     * size : 20
     * total : 5
     */

    private int curPage;
    private int offset;
    private boolean over;
    private int pageCount;
    private int size;
    private int total;
    private List<DatasBean> datas;

    public int getCurPage() {
        return curPage;
    }

    public void setCurPage(int curPage) {
        this.curPage = curPage;
    }

    public int getOffset() {
        return offset;
    }

    public void setOffset(int offset) {
        this.offset = offset;
    }

    public boolean isOver() {
        return over;
    }

    public void setOver(boolean over) {
        this.over = over;
    }

    public int getPageCount() {
        return pageCount;
    }

    public void setPageCount(int pageCount) {
        this.pageCount = pageCount;
    }

    public int getSize() {
        return size;
    }

    public void setSize(int size) {
        this.size = size;
    }

    public int getTotal() {
        return total;
    }

    public void setTotal(int total) {
        this.total = total;
    }

    public List<DatasBean> getDatas() {
        return datas;
    }

    public void setDatas(List<DatasBean> datas) {
        this.datas = datas;
    }

    public static class DatasBean {
        /**
         * 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
         */

        private String author;
        private int chapterId;
        private String chapterName;
        private int courseId;
        private String desc;
        private String envelopePic;
        private int id;
        private String link;
        private String niceDate;
        private String origin;
        private int originId;
        private long publishTime;
        private String title;
        private int userId;
        private int visible;
        private int zan;

        public String getAuthor() {
            return author;
        }

        public void setAuthor(String author) {
            this.author = author;
        }

        public int getChapterId() {
            return chapterId;
        }

        public void setChapterId(int chapterId) {
            this.chapterId = chapterId;
        }

        public String getChapterName() {
            return chapterName;
        }

        public void setChapterName(String chapterName) {
            this.chapterName = chapterName;
        }

        public int getCourseId() {
            return courseId;
        }

        public void setCourseId(int courseId) {
            this.courseId = courseId;
        }

        public String getDesc() {
            return desc;
        }

        public void setDesc(String desc) {
            this.desc = desc;
        }

        public String getEnvelopePic() {
            return envelopePic;
        }

        public void setEnvelopePic(String envelopePic) {
            this.envelopePic = envelopePic;
        }

        public int getId() {
            return id;
        }

        public void setId(int id) {
            this.id = id;
        }

        public String getLink() {
            return link;
        }

        public void setLink(String link) {
            this.link = link;
        }

        public String getNiceDate() {
            return niceDate;
        }

        public void setNiceDate(String niceDate) {
            this.niceDate = niceDate;
        }

        public String getOrigin() {
            return origin;
        }

        public void setOrigin(String origin) {
            this.origin = origin;
        }

        public int getOriginId() {
            return originId;
        }

        public void setOriginId(int originId) {
            this.originId = originId;
        }

        public long getPublishTime() {
            return publishTime;
        }

        public void setPublishTime(long publishTime) {
            this.publishTime = publishTime;
        }

        public String getTitle() {
            return title;
        }

        public void setTitle(String title) {
            this.title = title;
        }

        public int getUserId() {
            return userId;
        }

        public void setUserId(int userId) {
            this.userId = userId;
        }

        public int getVisible() {
            return visible;
        }

        public void setVisible(int visible) {
            this.visible = visible;
        }

        public int getZan() {
            return zan;
        }

        public void setZan(int zan) {
            this.zan = zan;
        }
    }
}


================================================
FILE: lib_common/src/main/java/com/senon/lib_common/bean/HomeArticle.java
================================================
package com.senon.lib_common.bean;

import java.util.List;

/**
 * 首页文章
 */

public class HomeArticle {

    /**
     * curPage : 1
     * datas : [{"apkLink":"","author":"tinycoder","chapterId":191,"chapterName":"数据采集与埋点",
     * "collect":false,"courseId":13,"desc":"","envelopePic":"","fresh":true,"id":7656,
     * "link":"https://juejin.im/post/5c0e4117518825369c566f07","niceDate":"15小时前","origin":"",
     * "projectLink":"","publishTime":1544631512000,"superChapterId":79,"superChapterName":"热门专题",
     * "tags":[],"title":"无埋点统计SDK实践","type":0,"userId":-1,"visible":1,"zan":0}]
     * offset : 0
     * over : false
     * pageCount : 290
     * size : 20
     * total : 5798
     */

    private int curPage;
    private int offset;
    private boolean over;
    private int pageCount;
    private int size;
    private int total;
    private List<DatasBean> datas;

    public int getCurPage() {
        return curPage;
    }

    public void setCurPage(int curPage) {
        this.curPage = curPage;
    }

    public int getOffset() {
        return offset;
    }

    public void setOffset(int offset) {
        this.offset = offset;
    }

    public boolean isOver() {
        return over;
    }

    public void setOver(boolean over) {
        this.over = over;
    }

    public int getPageCount() {
        return pageCount;
    }

    public void setPageCount(int pageCount) {
        this.pageCount = pageCount;
    }

    public int getSize() {
        return size;
    }

    public void setSize(int size) {
        this.size = size;
    }

    public int getTotal() {
        return total;
    }

    public void setTotal(int total) {
        this.total = total;
    }

    public List<DatasBean> getDatas() {
        return datas;
    }

    public void setDatas(List<DatasBean> datas) {
        this.datas = datas;
    }

    public static class DatasBean {
        /**
         * apkLink :
         * author : tinycoder
         * chapterId : 191
         * chapterName : 数据采集与埋点
         * collect : false
         * courseId : 13
         * desc :
         * envelopePic :
         * fresh : true
         * id : 7656
         * link : https://juejin.im/post/5c0e4117518825369c566f07
         * niceDate : 15小时前
         * origin :
         * projectLink :
         * publishTime : 1544631512000
         * superChapterId : 79
         * superChapterName : 热门专题
         * tags : []
         * title : 无埋点统计SDK实践
         * type : 0
         * userId : -1
         * visible : 1
         * zan : 0
         */

        private String apkLink;
        private String author;
        private int chapterId;
        private String chapterName;
        private boolean collect;
        private int courseId;
        private String desc;
        private String envelopePic;
        private boolean fresh;
        private int id;
        private String link;
        private String niceDate;
        private String origin;
        private String projectLink;
        private long publishTime;
        private int superChapterId;
        private String superChapterName;
        private String title;
        private int type;
        private int userId;
        private int visible;
        private int zan;
        private List<?> tags;

        public String getApkLink() {
            return apkLink;
        }

        public void setApkLink(String apkLink) {
            this.apkLink = apkLink;
        }

        public String getAuthor() {
            return author;
        }

        public void setAuthor(String author) {
            this.author = author;
        }

        public int getChapterId() {
            return chapterId;
        }

        public void setChapterId(int chapterId) {
            this.chapterId = chapterId;
        }

        public String getChapterName() {
            return chapterName;
        }

        public void setChapterName(String chapterName) {
            this.chapterName = chapterName;
        }

        public boolean isCollect() {
            return collect;
        }

        public void setCollect(boolean collect) {
            this.collect = collect;
        }

        public int getCourseId() {
            return courseId;
        }

        public void setCourseId(int courseId) {
            this.courseId = courseId;
        }

        public String getDesc() {
            return desc;
        }

        public void setDesc(String desc) {
            this.desc = desc;
        }

        public String getEnvelopePic() {
            return envelopePic;
        }

        public void setEnvelopePic(String envelopePic) {
            this.envelopePic = envelopePic;
        }

        public boolean isFresh() {
            return fresh;
        }

        public void setFresh(boolean fresh) {
            this.fresh = fresh;
        }

        public int getId() {
            return id;
        }

        public void setId(int id) {
            this.id = id;
        }

        public String getLink() {
            return link;
        }

        public void setLink(String link) {
            this.link = link;
        }

        public String getNiceDate() {
            return niceDate;
        }

        public void setNiceDate(String niceDate) {
            this.niceDate = niceDate;
        }

        public String getOrigin() {
            return origin;
        }

        public void setOrigin(String origin) {
            this.origin = origin;
        }

        public String getProjectLink() {
            return projectLink;
        }

        public void setProjectLink(String projectLink) {
            this.projectLink = projectLink;
        }

        public long getPublishTime() {
            return publishTime;
        }

        public void setPublishTime(long publishTime) {
            this.publishTime = publishTime;
        }

        public int getSuperChapterId() {
            return superChapterId;
        }

        public void setSuperChapterId(int superChapterId) {
            this.superChapterId = superChapterId;
        }

        public String getSuperChapterName() {
            return superChapterName;
        }

        public void setSuperChapterName(String superChapterName) {
            this.superChapterName = superChapterName;
        }

        public String getTitle() {
            return title;
        }

        public void setTitle(String title) {
            this.title = title;
        }

        public int getType() {
            return type;
        }

        public void setType(int type) {
            this.type = type;
        }

        public int getUserId() {
            return userId;
        }

        public void setUserId(int userId) {
            this.userId = userId;
        }

        public int getVisible() {
            return visible;
        }

        public void setVisible(int visible) {
            this.visible = visible;
        }

        public int getZan() {
            return zan;
        }

        public void setZan(int zan) {
            this.zan = zan;
        }

        public List<?> getTags() {
            return tags;
        }

        public void setTags(List<?> tags) {
            this.tags = tags;
        }
    }
}


================================================
FILE: lib_common/src/main/java/com/senon/lib_common/bean/KnowledgeSysArticle.java
================================================
package com.senon.lib_common.bean;

import java.util.List;

/**
 * 知识体系文章
 */
public class KnowledgeSysArticle {

    /**
     * curPage : 1
     * 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}]
     * offset : 0
     * over : false
     * pageCount : 7
     * size : 15
     * total : 102
     */

    private int curPage;
    private int offset;
    private boolean over;
    private int pageCount;
    private int size;
    private int total;
    private List<DatasBean> datas;

    public int getCurPage() {
        return curPage;
    }

    public void setCurPage(int curPage) {
        this.curPage = curPage;
    }

    public int getOffset() {
        return offset;
    }

    public void setOffset(int offset) {
        this.offset = offset;
    }

    public boolean isOver() {
        return over;
    }

    public void setOver(boolean over) {
        this.over = over;
    }

    public int getPageCount() {
        return pageCount;
    }

    public void setPageCount(int pageCount) {
        this.pageCount = pageCount;
    }

    public int getSize() {
        return size;
    }

    public void setSize(int size) {
        this.size = size;
    }

    public int getTotal() {
        return total;
    }

    public void setTotal(int total) {
        this.total = total;
    }

    public List<DatasBean> getDatas() {
        return datas;
    }

    public void setDatas(List<DatasBean> datas) {
        this.datas = datas;
    }

    public static class DatasBean {
        /**
         * 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
         */

        private String apkLink;
        private String author;
        private int chapterId;
        private String chapterName;
        private boolean collect;
        private int courseId;
        private String desc;
        private String envelopePic;
        private boolean fresh;
        private int id;
        private String link;
        private String niceDate;
        private String origin;
        private String projectLink;
        private long publishTime;
        private int superChapterId;
        private String superChapterName;
        private String title;
        private int type;
        private int userId;
        private int visible;
        private int zan;
        private List<TagsBean> tags;

        public String getApkLink() {
            return apkLink;
        }

        public void setApkLink(String apkLink) {
            this.apkLink = apkLink;
        }

        public String getAuthor() {
            return author;
        }

        public void setAuthor(String author) {
            this.author = author;
        }

        public int getChapterId() {
            return chapterId;
        }

        public void setChapterId(int chapterId) {
            this.chapterId = chapterId;
        }

        public String getChapterName() {
            return chapterName;
        }

        public void setChapterName(String chapterName) {
            this.chapterName = chapterName;
        }

        public boolean isCollect() {
            return collect;
        }

        public void setCollect(boolean collect) {
            this.collect = collect;
        }

        public int getCourseId() {
            return courseId;
        }

        public void setCourseId(int courseId) {
            this.courseId = courseId;
        }

        public String getDesc() {
            return desc;
        }

        public void setDesc(String desc) {
            this.desc = desc;
        }

        public String getEnvelopePic() {
            return envelopePic;
        }

        public void setEnvelopePic(String envelopePic) {
            this.envelopePic = envelopePic;
        }

        public boolean isFresh() {
            return fresh;
        }

        public void setFresh(boolean fresh) {
            this.fresh = fresh;
        }

        public int getId() {
            return id;
        }

        public void setId(int id) {
            this.id = id;
        }

        public String getLink() {
            return link;
        }

        public void setLink(String link) {
            this.link = link;
        }

        public String getNiceDate() {
            return niceDate;
        }

        public void setNiceDate(String niceDate) {
            this.niceDate = niceDate;
        }

        public String getOrigin() {
            return origin;
        }

        public void setOrigin(String origin) {
            this.origin = origin;
        }

        public String getProjectLink() {
            return projectLink;
        }

        public void setProjectLink(String projectLink) {
            this.projectLink = projectLink;
        }

        public long getPublishTime() {
            return publishTime;
        }

        public void setPublishTime(long publishTime) {
            this.publishTime = publishTime;
        }

        public int getSuperChapterId() {
            return superChapterId;
        }

        public void setSuperChapterId(int superChapterId) {
            this.superChapterId = superChapterId;
        }

        public String getSuperChapterName() {
            return superChapterName;
        }

        public void setSuperChapterName(String superChapterName) {
            this.superChapterName = superChapterName;
        }

        public String getTitle() {
            return title;
        }

        public void setTitle(String title) {
            this.title = title;
        }

        public int getType() {
            return type;
        }

        public void setType(int type) {
            this.type = type;
        }

        public int getUserId() {
            return userId;
        }

        public void setUserId(int userId) {
            this.userId = userId;
        }

        public int getVisible() {
            return visible;
        }

        public void setVisible(int visible) {
            this.visible = visible;
        }

        public int getZan() {
            return zan;
        }

        public void setZan(int zan) {
            this.zan = zan;
        }

        public List<TagsBean> getTags() {
            return tags;
        }

        public void setTags(List<TagsBean> tags) {
            this.tags = tags;
        }

        public static class TagsBean {
            /**
             * name : 项目
             * url : /project/list/1?cid=294
             */

            private String name;
            private String url;

            public String getName() {
                return name;
            }

            public void setName(String name) {
                this.name = name;
            }

            public String getUrl() {
                return url;
            }

            public void setUrl(String url) {
                this.url = url;
            }
        }
    }
}


================================================
FILE: lib_common/src/main/java/com/senon/lib_common/bean/KnowledgeSystem.java
================================================
package com.senon.lib_common.bean;

import java.util.List;

/**
 * 知识体系
 */
public class KnowledgeSystem {

    /**
     * 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}]
     * courseId : 13
     * id : 150
     * name : 开发环境
     * order : 1
     * parentChapterId : 0
     * userControlSetTop : false
     * visible : 1
     */

    private int courseId;
    private int id;
    private String name;
    private int order;
    private int parentChapterId;
    private boolean userControlSetTop;
    private int visible;
    private List<ChildrenBean> children;

    public int getCourseId() {
        return courseId;
    }

    public void setCourseId(int courseId) {
        this.courseId = courseId;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getOrder() {
        return order;
    }

    public void setOrder(int order) {
        this.order = order;
    }

    public int getParentChapterId() {
        return parentChapterId;
    }

    public void setParentChapterId(int parentChapterId) {
        this.parentChapterId = parentChapterId;
    }

    public boolean isUserControlSetTop() {
        return userControlSetTop;
    }

    public void setUserControlSetTop(boolean userControlSetTop) {
        this.userControlSetTop = userControlSetTop;
    }

    public int getVisible() {
        return visible;
    }

    public void setVisible(int visible) {
        this.visible = visible;
    }

    public List<ChildrenBean> getChildren() {
        return children;
    }

    public void setChildren(List<ChildrenBean> children) {
        this.children = children;
    }

    public static class ChildrenBean {
        /**
         * children : []
         * courseId : 13
         * id : 60
         * name : Android Studio相关
         * order : 1000
         * parentChapterId : 150
         * userControlSetTop : false
         * visible : 1
         */

        private int courseId;
        private int id;
        private String name;
        private int order;
        private int parentChapterId;
        private boolean userControlSetTop;
        private int visible;
        private List<?> children;

        public int getCourseId() {
            return courseId;
        }

        public void setCourseId(int courseId) {
            this.courseId = courseId;
        }

        public int getId() {
            return id;
        }

        public void setId(int id) {
            this.id = id;
        }

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }

        public int getOrder() {
            return order;
        }

        public void setOrder(int order) {
            this.order = order;
        }

        public int getParentChapterId() {
            return parentChapterId;
        }

        public void setParentChapterId(int parentChapterId) {
            this.parentChapterId = parentChapterId;
        }

        public boolean isUserControlSetTop() {
            return userControlSetTop;
        }

        public void setUserControlSetTop(boolean userControlSetTop) {
            this.userControlSetTop = userControlSetTop;
        }

        public int getVisible() {
            return visible;
        }

        public void setVisible(int visible) {
            this.visible = visible;
        }

        public List<?> getChildren() {
            return children;
        }

        public void setChildren(List<?> children) {
            this.children = children;
        }
    }
}


================================================
FILE: lib_common/src/main/java/com/senon/lib_common/bean/Login.java
================================================
package com.senon.lib_common.bean;

import java.util.List;

/**
 * 登录--实体
 */
public class Login {

    /**
     * chapterTops : []
     * collectIds : [2683,2880,2875,2868,2831,2829,2807]
     * email :
     * icon :
     * id : 1864
     * password :
     * token :
     * type : 0
     * username : senonwx
     */

    private String email;
    private String icon;
    private int id;
    private String password;
    private String token;
    private int type;
    private String username;
    private List<?> chapterTops;
    private List<Integer> collectIds;

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public String getIcon() {
        return icon;
    }

    public void setIcon(String icon) {
        this.icon = icon;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getToken() {
        return token;
    }

    public void setToken(String token) {
        this.token = token;
    }

    public int getType() {
        return type;
    }

    public void setType(int type) {
        this.type = type;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public List<?> getChapterTops() {
        return chapterTops;
    }

    public void setChapterTops(List<?> chapterTops) {
        this.chapterTops = chapterTops;
    }

    public List<Integer> getCollectIds() {
        return collectIds;
    }

    public void setCollectIds(List<Integer> collectIds) {
        this.collectIds = collectIds;
    }
}


================================================
FILE: lib_common/src/main/java/com/senon/lib_common/bean/ProjectArticle.java
================================================
package com.senon.lib_common.bean;

import java.util.List;

/**
 * 项目列表
 */

public class ProjectArticle {

    /**
     * curPage : 1
     * 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}]
     * offset : 0
     * over : false
     * pageCount : 7
     * size : 15
     * total : 102
     */

    private int curPage;
    private int offset;
    private boolean over;
    private int pageCount;
    private int size;
    private int total;
    private List<DatasBean> datas;

    public int getCurPage() {
        return curPage;
    }

    public void setCurPage(int curPage) {
        this.curPage = curPage;
    }

    public int getOffset() {
        return offset;
    }

    public void setOffset(int offset) {
        this.offset = offset;
    }

    public boolean isOver() {
        return over;
    }

    public void setOver(boolean over) {
        this.over = over;
    }

    public int getPageCount() {
        return pageCount;
    }

    public void setPageCount(int pageCount) {
        this.pageCount = pageCount;
    }

    public int getSize() {
        return size;
    }

    public void setSize(int size) {
        this.size = size;
    }

    public int getTotal() {
        return total;
    }

    public void setTotal(int total) {
        this.total = total;
    }

    public List<DatasBean> getDatas() {
        return datas;
    }

    public void setDatas(List<DatasBean> datas) {
        this.datas = datas;
    }

    public static class DatasBean {
        /**
         * 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
         */

        private String apkLink;
        private String author;
        private int chapterId;
        private String chapterName;
        private boolean collect;
        private int courseId;
        private String desc;
        private String envelopePic;
        private boolean fresh;
        private int id;
        private String link;
        private String niceDate;
        private String origin;
        private String projectLink;
        private long publishTime;
        private int superChapterId;
        private String superChapterName;
        private String title;
        private int type;
        private int userId;
        private int visible;
        private int zan;
        private List<TagsBean> tags;

        public String getApkLink() {
            return apkLink;
        }

        public void setApkLink(String apkLink) {
            this.apkLink = apkLink;
        }

        public String getAuthor() {
            return author;
        }

        public void setAuthor(String author) {
            this.author = author;
        }

        public int getChapterId() {
            return chapterId;
        }

        public void setChapterId(int chapterId) {
            this.chapterId = chapterId;
        }

        public String getChapterName() {
            return chapterName;
        }

        public void setChapterName(String chapterName) {
            this.chapterName = chapterName;
        }

        public boolean isCollect() {
            return collect;
        }

        public void setCollect(boolean collect) {
            this.collect = collect;
        }

        public int getCourseId() {
            return courseId;
        }

        public void setCourseId(int courseId) {
            this.courseId = courseId;
        }

        public String getDesc() {
            return desc;
        }

        public void setDesc(String desc) {
            this.desc = desc;
        }

        public String getEnvelopePic() {
            return envelopePic;
        }

        public void setEnvelopePic(String envelopePic) {
            this.envelopePic = envelopePic;
        }

        public boolean isFresh() {
            return fresh;
        }

        public void setFresh(boolean fresh) {
            this.fresh = fresh;
        }

        public int getId() {
            return id;
        }

        public void setId(int id) {
            this.id = id;
        }

        public String getLink() {
            return link;
        }

        public void setLink(String link) {
            this.link = link;
        }

        public String getNiceDate() {
            return niceDate;
        }

        public void setNiceDate(String niceDate) {
            this.niceDate = niceDate;
        }

        public String getOrigin() {
            return origin;
        }

        public void setOrigin(String origin) {
            this.origin = origin;
        }

        public String getProjectLink() {
            return projectLink;
        }

        public void setProjectLink(String projectLink) {
            this.projectLink = projectLink;
        }

        public long getPublishTime() {
            return publishTime;
        }

        public void setPublishTime(long publishTime) {
            this.publishTime = publishTime;
        }

        public int getSuperChapterId() {
            return superChapterId;
        }

        public void setSuperChapterId(int superChapterId) {
            this.superChapterId = superChapterId;
        }

        public String getSuperChapterName() {
            return superChapterName;
        }

        public void setSuperChapterName(String superChapterName) {
            this.superChapterName = superChapterName;
        }

        public String getTitle() {
            return title;
        }

        public void setTitle(String title) {
            this.title = title;
        }

        public int getType() {
            return type;
        }

        public void setType(int type) {
            this.type = type;
        }

        public int getUserId() {
            return userId;
        }

        public void setUserId(int userId) {
            this.userId = userId;
        }

        public int getVisible() {
            return visible;
        }

        public void setVisible(int visible) {
            this.visible = visible;
        }

        public int getZan() {
            return zan;
        }

        public void setZan(int zan) {
            this.zan = zan;
        }

        public List<TagsBean> getTags() {
            return tags;
        }

        public void setTags(List<TagsBean> tags) {
            this.tags = tags;
        }

        public static class TagsBean {
            /**
             * name : 项目
             * url : /project/list/1?cid=294
             */

            private String name;
            private String url;

            public String getName() {
                return name;
            }

            public void setName(String name) {
                this.name = name;
            }

            public String getUrl() {
                return url;
            }

            public void setUrl(String url) {
                this.url = url;
            }
        }
    }
}


================================================
FILE: lib_common/src/main/java/com/senon/lib_common/bean/WXarticle.java
================================================
package com.senon.lib_common.bean;

import java.util.List;

/**
 * 公众号文章
 */

public class WXarticle {


    /**
     * curPage : 2
     * 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}]
     * offset : 20
     * over : false
     * pageCount : 33
     * size : 20
     * total : 641
     */

    private int curPage;
    private int offset;
    private boolean over;
    private int pageCount;
    private int size;
    private int total;
    private List<DatasBean> datas;

    public int getCurPage() {
        return curPage;
    }

    public void setCurPage(int curPage) {
        this.curPage = curPage;
    }

    public int getOffset() {
        return offset;
    }

    public void setOffset(int offset) {
        this.offset = offset;
    }

    public boolean isOver() {
        return over;
    }

    public void setOver(boolean over) {
        this.over = over;
    }

    public int getPageCount() {
        return pageCount;
    }

    public void setPageCount(int pageCount) {
        this.pageCount = pageCount;
    }

    public int getSize() {
        return size;
    }

    public void setSize(int size) {
        this.size = size;
    }

    public int getTotal() {
        return total;
    }

    public void setTotal(int total) {
        this.total = total;
    }

    public List<DatasBean> getDatas() {
        return datas;
    }

    public void setDatas(List<DatasBean> datas) {
        this.datas = datas;
    }

    public static class DatasBean {
        /**
         * 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
         */

        private String apkLink;
        private String author;
        private int chapterId;
        private String chapterName;
        private boolean collect;
        private int courseId;
        private String desc;
        private String envelopePic;
        private boolean fresh;
        private int id;
        private String link;
        private String niceDate;
        private String origin;
        private String projectLink;
        private long publishTime;
        private int superChapterId;
        private String superChapterName;
        private String title;
        private int type;
        private int userId;
        private int visible;
        private int zan;
        private List<TagsBean> tags;

        public String getApkLink() {
            return apkLink;
        }

        public void setApkLink(String apkLink) {
            this.apkLink = apkLink;
        }

        public String getAuthor() {
            return author;
        }

        public void setAuthor(String author) {
            this.author = author;
        }

        public int getChapterId() {
            return chapterId;
        }

        public void setChapterId(int chapterId) {
            this.chapterId = chapterId;
        }

        public String getChapterName() {
            return chapterName;
        }

        public void setChapterName(String chapterName) {
            this.chapterName = chapterName;
        }

        public boolean isCollect() {
            return collect;
        }

        public void setCollect(boolean collect) {
            this.collect = collect;
        }

        public int getCourseId() {
            return courseId;
        }

        public void setCourseId(int courseId) {
            this.courseId = courseId;
        }

        public String getDesc() {
            return desc;
        }

        public void setDesc(String desc) {
            this.desc = desc;
        }

        public String getEnvelopePic() {
            return envelopePic;
        }

        public void setEnvelopePic(String envelopePic) {
            this.envelopePic = envelopePic;
        }

        public boolean isFresh() {
            return fresh;
        }

        public void setFresh(boolean fresh) {
            this.fresh = fresh;
        }

        public int getId() {
            return id;
        }

        public void setId(int id) {
            this.id = id;
        }

        public String getLink() {
            return link;
        }

        public void setLink(String link) {
            this.link = link;
        }

        public String getNiceDate() {
            return niceDate;
        }

        public void setNiceDate(String niceDate) {
            this.niceDate = niceDate;
        }

        public String getOrigin() {
            return origin;
        }

        public void setOrigin(String origin) {
            this.origin = origin;
        }

        public String getProjectLink() {
            return projectLink;
        }

        public void setProjectLink(String projectLink) {
            this.projectLink = projectLink;
        }

        public long getPublishTime() {
            return publishTime;
        }

        public void setPublishTime(long publishTime) {
            this.publishTime = publishTime;
        }

        public int getSuperChapterId() {
            return superChapterId;
        }

        public void setSuperChapterId(int superChapterId) {
            this.superChapterId = superChapterId;
        }

        public String getSuperChapterName() {
            return superChapterName;
        }

        public void setSuperChapterName(String superChapterName) {
            this.superChapterName = superChapterName;
        }

        public String getTitle() {
            return title;
        }

        public void setTitle(String title) {
            this.title = title;
        }

        public int getType() {
            return type;
        }

        public void setType(int type) {
            this.type = type;
        }

        public int getUserId() {
            return userId;
        }

        public void setUserId(int userId) {
            this.userId = userId;
        }

        public int getVisible() {
            return visible;
        }

        public void setVisible(int visible) {
            this.visible = visible;
        }

        public int getZan() {
            return zan;
        }

        public void setZan(int zan) {
            this.zan = zan;
        }

        public List<TagsBean> getTags() {
            return tags;
        }

        public void setTags(List<TagsBean> tags) {
            this.tags = tags;
        }

        public static class TagsBean {
            /**
             * name : 公众号
             * url : /wxarticle/list/408/1
             */

            private String name;
            private String url;

            public String getName() {
                return name;
            }

            public void setName(String name) {
                this.name = name;
            }

            public String getUrl() {
                return url;
            }

            public void setUrl(String url) {
                this.url = url;
            }
        }
    }
}


================================================
FILE: lib_common/src/main/java/com/senon/lib_common/bean/WXchapters.java
================================================
package com.senon.lib_common.bean;

import java.util.List;

/**
 * 微信公众号列表
 */

public class WXchapters {

    /**
     * children : []
     * courseId : 13
     * id : 408
     * name : 鸿洋
     * order : 190000
     * parentChapterId : 407
     * userControlSetTop : false
     * visible : 1
     */

    private int courseId;
    private int id;
    private String name;
    private int order;
    private int parentChapterId;
    private boolean userControlSetTop;
    private int visible;
    private List<?> children;

    public int getCourseId() {
        return courseId;
    }

    public void setCourseId(int courseId) {
        this.courseId = courseId;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getOrder() {
        return order;
    }

    public void setOrder(int order) {
        this.order = order;
    }

    public int getParentChapterId() {
        return parentChapterId;
    }

    public void setParentChapterId(int parentChapterId) {
        this.parentChapterId = parentChapterId;
    }

    public boolean isUserControlSetTop() {
        return userControlSetTop;
    }

    public void setUserControlSetTop(boolean userControlSetTop) {
        this.userControlSetTop = userControlSetTop;
    }

    public int getVisible() {
        return visible;
    }

    public void setVisible(int visible) {
        this.visible = visible;
    }

    public List<?> getChildren() {
        return children;
    }

    public void setChildren(List<?> children) {
        this.children = children;
    }
}


================================================
FILE: lib_common/src/main/java/com/senon/lib_common/common/contract/LoginContract.java
================================================
package com.senon.lib_common.common.contract;


import com.senon.lib_common.base.BasePresenter;
import com.senon.lib_common.base.BaseViewImp;
import com.senon.lib_common.base.BaseResponse;
import com.senon.lib_common.bean.Login;

import java.util.HashMap;

/**
 * LoginContract
 */
public interface LoginContract {

    //方法命名以 请求方法+Result  命名
    interface View extends BaseViewImp {

        void getLoginResult(BaseResponse<Login> data);

        void getRegisterResult(BaseResponse<Login> data);

    }

    //方法命名以 get+方法  命名
    abstract class Presenter extends BasePresenter<View> {

        public abstract void getLogin(HashMap<String, String> map, boolean isDialog, boolean cancelable);

        public abstract void getRegister(HashMap<String, String> map, boolean isDialog, boolean cancelable);

    }
}


================================================
FILE: lib_common/src/main/java/com/senon/lib_common/common/contract/WebviewContract.java
================================================
package com.senon.lib_common.common.contract;


import com.senon.lib_common.base.BasePresenter;
import com.senon.lib_common.base.BaseResponse;
import com.senon.lib_common.base.BaseViewImp;
import com.senon.lib_common.bean.Login;

import java.util.HashMap;

/**
 * WebviewContract
 */
public interface WebviewContract {

    //方法命名以 请求方法+Result  命名
    interface View extends BaseViewImp {

        void getCollectResult(int id,boolean isCollect);

        void getCollFailResult(int id);

    }

    //方法命名以 get+方法  命名
    abstract class Presenter extends BasePresenter<View> {

        public abstract void getCollect(int id ,boolean isDialog, boolean cancelable);

        public abstract void getUnollect(int id, boolean isDialog, boolean cancelable);


    }
}


================================================
FILE: lib_common/src/main/java/com/senon/lib_common/common/presenter/LoginPresenter.java
================================================
package com.senon.lib_common.common.presenter;

import android.content.Context;

import com.senon.lib_common.bean.Login;
import com.senon.lib_common.common.contract.LoginContract;
import com.senon.lib_common.net.ServerUtils;
import com.senon.lib_common.base.BaseResponse;
import com.senon.lib_common.net.callback.RequestCallback;
import com.senon.lib_common.net.callback.RxErrorHandler;
import com.senon.lib_common.utils.RetryWithDelay;
import com.senon.lib_common.utils.RxUtils;
import com.senon.lib_common.utils.ToastUtil;
import java.util.HashMap;

/**
 * 登录 P
 */
public class LoginPresenter extends LoginContract.Presenter {

    private Context context;

    public LoginPresenter(Context context) {
        this.context = context;
    }

    @Override
    public void getLogin(HashMap<String, String> map, boolean isDialog, boolean cancelable) {
        ServerUtils.getCommonApi().login(map)
                .retryWhen(new RetryWithDelay(3,2))
                .compose(RxUtils.<BaseResponse<Login>>bindToLifecycle(getView()))
                .compose(RxUtils.<BaseResponse<Login>>getSchedulerTransformer())
                .subscribe(new RequestCallback<BaseResponse<Login>>(context, RxErrorHandler.getInstance(),isDialog,cancelable) {
                    @Override
                    public void onNext(BaseResponse<Login> baseResponse) {
                        super.onNext(baseResponse);
                        if(baseResponse.getCode() == 0){
                            getView().getLoginResult(baseResponse);
                        }else{
                            ToastUtil.initToast(baseResponse.getMsg());
                        }
                    }
                    @Override
                    public void onError(Throwable e) {
                        super.onError(e);
                    }
                });
    }

    @Override
    public void getRegister(HashMap<String, String> map, boolean isDialog, boolean cancelable) {
        ServerUtils.getCommonApi().register(map)
                .retryWhen(new RetryWithDelay(3,2))
                .compose(RxUtils.<BaseResponse<Login>>bindToLifecycle(getView()))
                .compose(RxUtils.<BaseResponse<Login>>getSchedulerTransformer())
                .subscribe(new RequestCallback<BaseResponse<Login>>(context, RxErrorHandler.getInstance(),isDialog,cancelable) {
                    @Override
                    public void onNext(BaseResponse<Login> baseResponse) {
                        super.onNext(baseResponse);
                        if(baseResponse.getCode() == 0){
                            getView().getRegisterResult(baseResponse);
                        }else{
                            ToastUtil.initToast(baseResponse.getMsg());
                        }
                    }
                    @Override
                    public void onError(Throwable e) {
                        super.onError(e);
                    }
                });
    }


}


================================================
FILE: lib_common/src/main/java/com/senon/lib_common/common/presenter/WebviewPresenter.java
================================================
package com.senon.lib_common.common.presenter;

import android.content.Context;
import com.senon.lib_common.base.BaseResponse;
import com.senon.lib_common.bean.Login;
import com.senon.lib_common.common.contract.WebviewContract;
import com.senon.lib_common.net.ServerUtils;
import com.senon.lib_common.net.callback.RequestCallback;
import com.senon.lib_common.net.callback.RxErrorHandler;
import com.senon.lib_common.utils.RetryWithDelay;
import com.senon.lib_common.utils.RxUtils;
import com.senon.lib_common.utils.ToastUtil;
import java.util.HashMap;

/**
 * Webview P
 */
public class WebviewPresenter extends WebviewContract.Presenter {

    private Context context;
    public WebviewPresenter(Context context) {
        this.context = context;
    }

    @Override
    public void getCollect(final int id, boolean isDialog, boolean cancelable) {
        ServerUtils.getCommonApi().getCollect(id)
                .retryWhen(new RetryWithDelay(3,2))
                .compose(RxUtils.<BaseResponse>bindToLifecycle(getView()))
                .compose(RxUtils.<BaseResponse>getSchedulerTransformer())
                .subscribe(new RequestCallback<BaseResponse>(context, RxErrorHandler.getInstance(),isDialog,cancelable) {
                    @Override
                    public void onNext(BaseResponse baseResponse) {
                        super.onNext(baseResponse);
                        if(baseResponse.getCode() == 0){
                            getView().getCollectResult(id,true);
                        }else{
                            getView().getCollFailResult(id);

                            ToastUtil.initToast(baseResponse.getMsg());
                        }
                    }
                    @Override
                    public void onError(Throwable e) {
                        super.onError(e);
                    }
                });
    }

    @Override
    public void getUnollect(final int id, boolean isDialog, boolean cancelable) {
        ServerUtils.getCommonApi().getUncollectOriginId(id)
                .retryWhen(new RetryWithDelay(3,2))
                .compose(RxUtils.<BaseResponse>bindToLifecycle(getView()))
                .compose(RxUtils.<BaseResponse>getSchedulerTransformer())
                .subscribe(new RequestCallback<BaseResponse>(context, RxErrorHandler.getInstance(),isDialog,cancelable) {
                    @Override
                    public void onNext(BaseResponse baseResponse) {
                        super.onNext(baseResponse);
                        if(baseResponse.getCode() == 0){
                            getView().getCollectResult(id,false);
                        }else{
                            getView().getCollFailResult(id);

                            ToastUtil.initToast(baseResponse.getMsg());
                        }
                    }
                    @Override
                    public void onError(Throwable e) {
                        super.onError(e);
                    }
                });
    }
}


================================================
FILE: lib_common/src/main/java/com/senon/lib_common/common/ui/Common_LoginActivity.java
================================================
package com.senon.lib_common.common.ui;

import android.graphics.Paint;
import android.view.View;
import android.widget.EditText;
import android.widget.TextView;
import com.alibaba.android.arouter.facade.annotation.Autowired;
import com.alibaba.android.arouter.facade.annotation.Route;
import com.alibaba.android.arouter.launcher.ARouter;
import com.senon.lib_common.ConstantArouter;
import com.senon.lib_common.ConstantLoginArouter;
import com.senon.lib_common.R;
import com.senon.lib_common.base.BaseActivity;
import com.senon.lib_common.base.BaseResponse;
import com.senon.lib_common.ComUtil;
import com.senon.lib_common.bean.Login;
import com.senon.lib_common.common.contract.LoginContract;
import com.senon.lib_common.common.presenter.LoginPresenter;
import com.senon.lib_common.net.cookies.PersistentCookieStore;
import com.senon.lib_common.utils.BaseEvent;
import com.senon.lib_common.utils.StatusBarUtils;
import com.senon.lib_common.utils.ToastUtil;
import org.greenrobot.eventbus.EventBus;
import org.greenrobot.eventbus.Subscribe;
import org.greenrobot.eventbus.ThreadMode;

/**
 * 所有模块统一登录页面
 */
@Route(path = ConstantLoginArouter.PATH_COMMON_LOGINACTIVITY)
public class Common_LoginActivity extends BaseActivity<LoginContract.View, LoginContract.Presenter> implements
        LoginContract.View {

    @Autowired
    String targetUrl;
    private EditText account_edt,password_edt;
    private TextView register_tv;


    @Override
    public int getLayoutId() {
        StatusBarUtils.with(this).init();
        return R.layout.activity_common__login;
    }

    @Override
    public LoginContract.Presenter createPresenter() {
        return new LoginPresenter(this);
    }

    @Override
    public LoginContract.View createView() {
        return this;
    }

    @Override
    public void init() {
        EventBus.getDefault().register(this);

        account_edt = findViewById(R.id.account_edt);
        password_edt = findViewById(R.id.password_edt);
        register_tv = findViewById(R.id.register_tv);

        register_tv.getPaint().setFlags(Paint.UNDERLINE_TEXT_FLAG);

    }

    @Override
    public void getLoginResult(BaseResponse<Login> data) {
        //登录成功时
        //保存参数
        PersistentCookieStore.getCookieStore().saveUserInfo(
                data.getData().getUsername(),
                password_edt.getText().toString().trim());

        if(targetUrl != null){
            //跳转到目标页
            ARouter.getInstance().build(targetUrl).navigation();
        }

        BaseEvent event = new BaseEvent();
        event.setCode(0);
        EventBus.getDefault().post(event);

        finish();
    }

    @Override
    public void getRegisterResult(BaseResponse<Login> data) {
    }

    public void onClick(View view) {
        int id = view.getId();
        if(id == R.id.login_btn){
            String account = account_edt.getText().toString();
            String password = password_edt.getText().toString();
            if (account.isEmpty()) {
                ToastUtil.initToast("请输入账号");
                return;
            }
            if (password.isEmpty()) {
                ToastUtil.initToast("请输入密码");
                return;
            }
            getPresenter().getLogin(ComUtil.getMd5Str(
                    new String[]{"username", "password"},
                    new String[]{account.trim(), password.trim()})
                    , true, true);
        }else if(id == R.id.visitor_tv){
            // 跳转到目标页
            if(targetUrl != null){
                //跳转到目标页
                ARouter.getInstance().build(targetUrl).navigation();
            }
            finish();
        }else if(id == R.id.register_tv){
            //跳转到注册页 同意用arouter跳转,便于以后移动模块的改动
            ARouter.getInstance().build(ConstantArouter.PATH_COMMON_REGISTERACTIVITY)
                    .withString("targetUrl",targetUrl)
                    .navigation();

        }
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        EventBus.getDefault().unregister(this);
    }

    @Subscribe(threadMode = ThreadMode.MAIN) //在ui线程执行
    public void onEventReceived(BaseEvent event) {
        if(event.getCode() == 0){
            finish();
        }
    }
}


================================================
FILE: lib_common/src/main/java/com/senon/lib_common/common/ui/Common_RegisterActivity.java
================================================
package com.senon.lib_common.common.ui;

import android.graphics.Paint;
import android.view.View;
import android.widget.EditText;
import android.widget.TextView;

import com.alibaba.android.arouter.facade.annotation.Autowired;
import com.alibaba.android.arouter.facade.annotation.Route;
import com.alibaba.android.arouter.launcher.ARouter;
import com.senon.lib_common.ComUtil;
import com.senon.lib_common.ConstantArouter;
import com.senon.lib_common.ConstantLoginArouter;
import com.senon.lib_common.R;
import com.senon.lib_common.base.BaseActivity;
import com.senon.lib_common.base.BaseResponse;
import com.senon.lib_common.bean.Login;
import com.senon.lib_common.common.contract.LoginContract;
import com.senon.lib_common.common.presenter.LoginPresenter;
import com.senon.lib_common.net.cookies.PersistentCookieStore;
import com.senon.lib_common.utils.BaseEvent;
import com.senon.lib_common.utils.StatusBarUtils;
import com.senon.lib_common.utils.ToastUtil;

import org.greenrobot.eventbus.EventBus;

/**
 * 所有模块统一注册页面
 */
@Route(path = ConstantArouter.PATH_COMMON_REGISTERACTIVITY)
public class Common_RegisterActivity extends BaseActivity<LoginContract.View, LoginContract.Presenter> implements
        LoginContract.View {

    @Autowired
    String targetUrl;
    private EditText account_edt,password_edt,password_re_edt;
    private TextView login_tv;

    @Override
    public int getLayoutId() {
        StatusBarUtils.with(this).init();
        return R.layout.activity_common__register;
    }

    @Override
    public LoginContract.Presenter createPresenter() {
        return new LoginPresenter(this);
    }

    @Override
    public LoginContract.View createView() {
        return this;
    }

    @Override
    public void init() {
        if (targetUrl == null) {
            //默认跳转到MainActivity
            targetUrl = ConstantLoginArouter.PATH_APP_MAINACTIVITY;
        }
        account_edt = findViewById(R.id.account_edt);
        password_edt = findViewById(R.id.password_edt);
        password_re_edt = findViewById(R.id.password_re_edt);
        login_tv = findViewById(R.id.login_tv);

        login_tv.getPaint().setFlags(Paint.UNDERLINE_TEXT_FLAG);
    }

    @Override
    public void getLoginResult(BaseResponse<Login> data) {
    }

    @Override
    public void getRegisterResult(BaseResponse<Login> data) {
        //登录成功时
        //保存参数
        PersistentCookieStore.getCookieStore().saveUserInfo(
                data.getData().getUsername(),
                password_edt.getText().toString().trim());

        //跳转到目标页
        if(targetUrl != null){
            ARouter.getInstance().build(targetUrl).navigation();
        }

        BaseEvent event = new BaseEvent();
        event.setCode(0);
        EventBus.getDefault().post(event);

        finish();
    }

    public void onClick(View view) {
        int id = view.getId();
        if(id == R.id.register_btn){
            String account = account_edt.getText().toString();
            String password = password_edt.getText().toString();
            String repassword = password_re_edt.getText().toString();
            if (account.isEmpty()) {
                ToastUtil.initToast("请输入账号");
                return;
            }
            if (password.isEmpty()) {
                ToastUtil.initToast("请输入密码");
                return;
            }
            if (repassword.isEmpty()) {
                ToastUtil.initToast("请输入确认密码");
                return;
            }
            if (!password.equals(repassword)) {
                ToastUtil.initToast("确认密码与密码不同");
                return;
            }
            getPresenter().getRegister(ComUtil.getMd5Str(
                    new String[]{"username", "password", "repassword"},
                    new String[]{account.trim(), password.trim(),repassword.trim()})
                    , true, true);
        }else if(id == R.id.login_tv){
            finish();
        }

    }

}


================================================
FILE: lib_common/src/main/java/com/senon/lib_common/common/ui/Common_WebviewActivity.java
================================================
package com.senon.lib_common.common.ui;

import android.view.View;
import android.webkit.WebChromeClient;
import android.webkit.WebResourceRequest;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.ImageView;
import android.widget.ProgressBar;
import android.widget.TextView;

import com.alibaba.android.arouter.facade.annotation.Autowired;
import com.alibaba.android.arouter.facade.annotation.Route;
import com.alibaba.android.arouter.launcher.ARouter;
import com.senon.lib_common.ComUtil;
import com.senon.lib_common.ConstantArouter;
import com.senon.lib_common.ConstantLoginArouter;
import com.senon.lib_common.R;
import com.senon.lib_common.base.BaseActivity;
import com.senon.lib_common.base.BaseResponse;
import com.senon.lib_common.common.contract.WebviewContract;
import com.senon.lib_common.common.presenter.WebviewPresenter;
import com.senon.lib_common.utils.BaseEvent;
import com.senon.lib_common.utils.StatusBarUtils;

import org.greenrobot.eventbus.EventBus;

/**
 * webview
 */
@Route(path = ConstantArouter.PATH_COMMON_WEBVIEWCTIVITY)
public class Common_WebviewActivity extends BaseActivity<WebviewContract.View, WebviewContract.Presenter> implements
        WebviewContract.View {

    @Autowired
    int id;
    @Autowired
    String url;
    @Autowired
    boolean isCollection;
    @Autowired
    String title;
    private TextView toolbar_title_tv;
    private ProgressBar progressBar;
    private WebView webView;
    private TextView collection_tv;


    @Override
    public int getLayoutId() {
        StatusBarUtils.with(this).init();
        return R.layout.activity_common__webview;
    }

    @Override
    public WebviewContract.Presenter createPresenter() {
        return new WebviewPresenter(this);
    }

    @Override
    public WebviewContract.View createView() {
        return this;
    }

    @Override
    public void init() {
        ComUtil.changeStatusBarTextColor(this,true);
        progressBar = findViewById(R.id.progressBar);
        webView = findViewById(R.id.webView);
        collection_tv = findViewById(R.id.collection_tv);
        toolbar_title_tv = findViewById(R.id.toolbar_title_tv);


        initClickListener();
        initWebView();
    }

    private void initClickListener() {
        toolbar_title_tv.setText(title);
        toolbar_title_tv.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                webView.scrollTo(0,0);
            }
        });
        findViewById(R.id.toolbar_back_igv).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                finish();
            }
        });

        if(id == 0){//id为空 则不设置收藏按钮
            collection_tv.setVisibility(View.GONE);
            return;
        }

        collection_tv.setText(isCollection ? "已收藏":"收藏");
        collection_tv.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                isCollection = !isCollection;//该为相反状态
                collection_tv.setText(isCollection ? "已收藏":"收藏");
                if(isCollection){
                    getPresenter().getCollect(id,false,true);
                }else{
                    getPresenter().getUnollect(id,false,true);
                }
            }
        });

    }

    private void initWebView() {
        WebSettings webSettings = webView.getSettings();
        webSettings.setJavaScriptEnabled(true); // 设置支持javascript脚本
        webSettings.setPluginState(WebSettings.PluginState.ON);
        webSettings.setUseWideViewPort(true);
        webSettings.setLoadWithOverviewMode(true);
        webSettings.setTextZoom(100);

        webSettings.setAppCacheEnabled(true);
        webSettings.setDomStorageEnabled(true);
        webSettings.setDatabaseEnabled(true);
        if (ComUtil.isNetworkConnected()) {
            webSettings.setCacheMode(WebSettings.LOAD_DEFAULT);
        } else {
            webSettings.setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK);
        }

        webView.loadUrl(url);
        webView.setWebViewClient(new WebViewClient() {
            //实现点击webView页面的链接
            @Override
            public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
                view.loadUrl(url);
                return true;
            }
        });
        //设置WebViewClient用来辅助WebView处理各种通知请求事件等,如更新历史记录、网页开始加载/完毕、报告错误信息等
        webView.setWebViewClient(new WebViewClient() {
            // 以下方法避免 自动打开系统自带的浏览器,而是让新打开的网页在当前的WebView中显示
            @Override
            public boolean shouldOverrideUrlLoading(WebView view, String url) {
                view.loadUrl(url);
                return true;
            }
        });
        // 用于辅助WebView处理JavaScript的对话框、网站图标、网站标题以及网页加载进度等
        webView.setWebChromeClient(new WebChromeClient() {
            @Override
            public void onProgressChanged(WebView view, int newProgress) {
                if (newProgress == 100) {
                    progressBar.setVisibility(View.INVISIBLE);
                } else {
                    if (progressBar.getVisibility() == View.INVISIBLE) {
                        progressBar.setVisibility(View.VISIBLE);
                    }
                    progressBar.setProgress(newProgress);
                }
                super.onProgressChanged(view, newProgress);
            }
            @Override
            public void onShowCustomView(View view, CustomViewCallback callback) {
                super.onShowCustomView(view, callback);
            }
            @Override
            public void onHideCustomView() {
                super.onHideCustomView();
            }
        });

    }

    @Override
    public void getCollectResult(int id,boolean isCollect) {
        BaseEvent event = new BaseEvent();
        event.setCode(101);
        event.setId(id);
        event.setCollect(isCollect);
        EventBus.getDefault().post(event);
    }

    @Override
    public void getCollFailResult(int id) {
        if(this.id == id){
            isCollection = !isCollection;
            collection_tv.setText(isCollection ? "已收藏":"收藏");
        }
        ARouter.getInstance().build(ConstantLoginArouter.PATH_COMMON_LOGINACTIVITY)
                .navigation();
    }
}


================================================
FILE: lib_common/src/main/java/com/senon/lib_common/net/RequestInterceptor.java
================================================
package com.senon.lib_common.net;

import org.json.JSONObject;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import okhttp3.Interceptor;
import okhttp3.Request;
import okhttp3.Response;


/**
 * 网络统一拦截
 */
public class RequestInterceptor implements Interceptor {

    private final int DEVICE_TYPE = 1; // 设备类型

    private RequestInterceptor() {
    }

    private static RequestInterceptor instance;

    public static RequestInterceptor getInstance() {
        if (instance == null) {
            synchronized (RequestInterceptor.class) {
                if (instance == null) {
                    instance = new RequestInterceptor();
                }
            }
        }
        return instance;
    }

    @Override
    public Response intercept(Chain chain) throws IOException {
        Request original = chain.request();
        Request.Builder requestBuilder = original.newBuilder()
                .header("data", fetchHeaderInfo())
                .method(original.method(), original.body());
        return chain.proceed(requestBuilder.build());
    }

    private String fetchHeaderInfo() {
//        String deviceCode = MD5Utils.GetMD5Code(MobileInfo.phoneOnlyCode(context));


        Map<String, String> map = new HashMap<>();
//        map.put("DeviceType", String.valueOf(DEVICE_TYPE));
//        map.put("DeviceToken", deviceCode);
//        map.put("APPVersion", APP_VERSION_NAME);
//        map.put("RegistrationID", jpushID);
//        map.put("Authorization", token);
        JSONObject json = new JSONObject(map);
        return json.toString();
    }
}


================================================
FILE: lib_common/src/main/java/com/senon/lib_common/net/ServerUtils.java
================================================
package com.senon.lib_common.net;

import com.senon.lib_common.AppConfig;
import com.senon.lib_common.ComUtil;
import com.senon.lib_common.api.BaseApi;
import com.senon.lib_common.net.cookies.CookiesManager;
import com.senon.lib_common.utils.ConstantUtils;
import java.io.File;
import java.io.IOException;
import java.security.cert.CertificateException;
import java.util.concurrent.TimeUnit;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSocketFactory;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;
import okhttp3.Cache;
import okhttp3.CacheControl;
import okhttp3.Interceptor;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
import okhttp3.logging.HttpLoggingInterceptor;
import retrofit2.Retrofit;
import retrofit2.adapter.rxjava2.RxJava2CallAdapterFactory;
import retrofit2.converter.gson.GsonConverterFactory;
import retrofit2.converter.scalars.ScalarsConverterFactory;

/**
 * 网络请求 工具
 */
public class ServerUtils {
    private static final int TIME_OUT = 5 * 1000;//链接超时时间
    private volatile static BaseApi mBaseApi;
    private static File cacheFile = new File(AppConfig.PATH_CACHE);
    private static Cache cache = new Cache(cacheFile, 1024 * 1024 * 50);

    public static BaseApi getCommonApi() {
        try {
            if (mBaseApi == null) {
                synchronized (ServerUtils.class) {
                    if (mBaseApi == null) {
                        mBaseApi = createService(BaseApi.class, AppConfig.BASE_URL);
                    }
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return mBaseApi;
    }

    private static <S> S createService(Class<S> serviceClass, String url) throws Exception {
        Retrofit.Builder builder =
                new Retrofit.Builder()
                        .baseUrl(url)
                        .client(httpClient.build())
                        .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
                        .addConverterFactory(ScalarsConverterFactory.create())
                        .addConverterFactory(GsonConverterFactory.create());
        Retrofit retrofit = builder.build();
        return retrofit.create(serviceClass);
    }

    private static Interceptor cacheInterceptor = new Interceptor() {
        @Override
        public Response intercept(Chain chain) throws IOException {
            Request request = chain.request();
            if (!ComUtil.isNetworkConnected()) {
                request = request.newBuilder()
                        .cacheControl(CacheControl.FORCE_CACHE)
                        .build();
            }
            Response response = chain.proceed(request);
            if (ComUtil.isNetworkConnected()) {
                int maxAge = 0;
                // 有网络时, 不缓存, 最大保存时长为0
                response.newBuilder()
                        .header("Cache-Control", "public, max-age=" + maxAge)
                        .removeHeader("Pragma")
                        .build();
            } else {
                // 无网络时,设置超时为1周
                int maxStale = 60 * 60 * 24 * 7;
                response.newBuilder()
                        .header("Cache-Control", "public, only-if-cached, max-stale=" + maxStale)
                        .removeHeader("Pragma")
                        .build();
            }
            return response;
        }
    };

    private static OkHttpClient.Builder httpClient =
            new OkHttpClient.Builder()
                    //设置超时
                    .readTimeout(TIME_OUT, TimeUnit.SECONDS)
                    .writeTimeout(TIME_OUT, TimeUnit.SECONDS)
                    .connectTimeout(TIME_OUT, TimeUnit.SECONDS)
//                    .addInterceptor(RequestInterceptor.getInstance())//网络请求 统一拦截
                    .addInterceptor(getLogInterceptor())
                    .sslSocketFactory(getSSLSocketFactory())
                    //设置缓存
                    .addNetworkInterceptor(cacheInterceptor)
                    .addInterceptor(cacheInterceptor)
                    .cache(cache)
                    //设置cookies
                    .cookieJar(new CookiesManager())
                    .hostnameVerifier(org.apache.http.conn.ssl.SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);


    private static HttpLoggingInterceptor getLogInterceptor() {
        HttpLoggingInterceptor loggingInterceptor = new HttpLoggingInterceptor();
        if (ConstantUtils.isAppDebug()) {
            loggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
        } else {
            loggingInterceptor.setLevel(HttpLoggingInterceptor.Level.NONE);
        }
        return loggingInterceptor;
    }

    /**
     * 不验证证书
     *
     * @return
     * @throws Exception
     */
    private static SSLSocketFactory getSSLSocketFactory() {
        //创建一个不验证证书链的证书信任管理器。
        final TrustManager[] trustAllCerts = new TrustManager[]{new X509TrustManager() {
            @Override
            public void checkClientTrusted(
                    java.security.cert.X509Certificate[] chain,
                    String authType) throws CertificateException {
            }

            @Override
            public void checkServerTrusted(
                    java.security.cert.X509Certificate[] chain,
                    String authType) throws CertificateException {
            }

            @Override
            public java.security.cert.X509Certificate[] getAcceptedIssuers() {
                return new java.security.cert.X509Certificate[0];
            }
        }};

        final SSLContext sslContext;
        try {
            sslContext = SSLContext.getInstance("TLS");
            sslContext.init(null, trustAllCerts,
                    new java.security.SecureRandom());
            return sslContext
                    .getSocketFactory();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
}


================================================
FILE: lib_common/src/main/java/com/senon/lib_common/net/callback/ErrorListener.java
================================================
package com.senon.lib_common.net.callback;



public interface ErrorListener {
    void handleError(Throwable e);
}

================================================
FILE: lib_common/src/main/java/com/senon/lib_common/net/callback/RequestCallback.java
================================================
package com.senon.lib_common.net.callback;

import android.content.Context;
import com.senon.lib_common.net.progress.ProgressCancelListener;
import com.senon.lib_common.net.progress.ProgressDialogHandler;
import io.reactivex.Observer;
import io.reactivex.annotations.NonNull;
import io.reactivex.disposables.Disposable;


/**
 * RxJava 自定义回调
 */
public abstract class RequestCallback<T> implements Observer<T>,ProgressCancelListener {

    private ErrorListener errorListener;
    private Disposable mDisposable;
    private Context mContext;
    private boolean cancelable = false;//该dialog如果开启 则可以设置是否能够返回键取消请求
    private ProgressDialogHandler mProgressDialogHandler;//默认为null  即不开启dialog

    public RequestCallback(Context context,ErrorListener errorListener) {
        this(context,errorListener,false);
    }

    /**
     * 传这个构造默认开启dialog
     * @param cancelable 该dialog如果开启 则可以设置是否能够返回键取消请求
     */
    public RequestCallback(Context context,ErrorListener errorListener,boolean cancelable) {
        this(context,errorListener,true,cancelable);
    }

    public RequestCallback(Context context,ErrorListener errorListener,boolean showDialog,boolean cancelable) {
        this.mContext = context;
        this.errorListener = errorListener;
        this.cancelable = cancelable;
        if(showDialog){
            this.mProgressDialogHandler = new ProgressDialogHandler(context, this, cancelable);
        }
    }

    private void showProgressDialog() {
        if (mProgressDialogHandler != null) {
            mProgressDialogHandler.obtainMessage(ProgressDialogHandler.SHOW_PROGRESS_DIALOG).sendToTarget();
        }
    }

    private void dismissProgressDialog() {
        if (mProgressDialogHandler != null) {
            mProgressDialogHandler.obtainMessage(ProgressDialogHandler.DISMISS_PROGRESS_DIALOG).sendToTarget();
            mProgressDialogHandler = null;
        }
    }

    @Override
    public void onSubscribe(@NonNull Disposable d) {
        this.mDisposable = d;
        showProgressDialog();

    }

    @Override
    public void onNext(@NonNull T t) {

    }

    @Override
    public void onError(@NonNull Throwable e) {
        e.printStackTrace();
        dismissProgressDialog();

        if (errorListener != null) {
            errorListener.handleError(e);
        }
    }

    @Override
    public void onComplete() {
        dismissProgressDialog();

    }

    @Override
    public void onCancelProgress() {
        //如果处于订阅状态,则取消订阅
        if (!mDisposable.isDisposed()) {
            mDisposable.dispose();
        }
    }
}


================================================
FILE: lib_common/src/main/java/com/senon/lib_common/net/callback/RxErrorHandler.java
================================================
package com.senon.lib_common.net.callback;


import com.senon.lib_common.utils.LogUtils;
import com.senon.lib_common.utils.ToastUtil;

public class RxErrorHandler implements ErrorListener {

    private volatile static RxErrorHandler rxErrorHandler;

    private RxErrorHandler() {
    }

    public static RxErrorHandler getInstance() {
        if (rxErrorHandler == null) {
            synchronized (RxErrorHandler.class) {
                if (rxErrorHandler == null) {
                    rxErrorHandler = new RxErrorHandler();
                }
            }
        }
        return rxErrorHandler;
    }

    @Override
    public void handleError(Throwable throwable) {
        String errorString = throwable.toString();
        LogUtils.e("网络错误信息为 ========>>>" + throwable.toString());
        //返回的错误为空
        if (errorString == null) {
            ToastUtil.initToast("网络数据异常,请重试");

        } else {
            //请求超时
            if (errorString.contains("TimeoutException") || errorString.contains("SocketTimeoutException")) {
                ToastUtil.initToast("网络请求超时,请重试");
            }
            //能识别的请求异常,忽略不提示
            if (errorString.contains("SSLException")) {

            }
            //403、404等服务错误
            if (errorString.contains("ServiceConfigurationError") || errorString.contains("AuthenticatorException")) {
                ToastUtil.initToast("网络数据异常,请重试");
            }
            //网络未连接
            if (errorString.contains("NetworkErrorException") || errorString.contains("NoConnectionPendingException") || errorString.contains("UnknownHostException")) {
                ToastUtil.initToast("您的网络不给力,请检查网络设置");
            }
            //连接不到服务器
            if (errorString.contains("ConnectException")) {
                ToastUtil.initToast("网络连接失败");
            }
        }
    }
}

================================================
FILE: lib_common/src/main/java/com/senon/lib_common/net/cookies/CookiesManager.java
================================================
package com.senon.lib_common.net.cookies;

import android.support.annotation.NonNull;

import java.util.List;

import okhttp3.Cookie;
import okhttp3.CookieJar;
import okhttp3.HttpUrl;

/**
 * @author lw
 * @date 2018/1/25
 */

public class CookiesManager implements CookieJar {

    private static final PersistentCookieStore COOKIE_STORE = PersistentCookieStore.getCookieStore();

    @Override
    public void saveFromResponse(@NonNull HttpUrl url, @NonNull List<Cookie> cookies) {
        if (cookies.size() > 0) {
            for (Cookie item : cookies) {
                COOKIE_STORE.add(url, item);
            }
        }
    }

    @Override
    public List<Cookie> loadForRequest(@NonNull HttpUrl url) {
        return COOKIE_STORE.get(url);
    }

    /**
     * 清除所有cookie
     */
    public static void clearAllCookies() {
        COOKIE_STORE.removeAll();
    }

    /**
     * 清除指定cookie
     *
     * @param url HttpUrl
     * @param cookie Cookie
     * @return if clear cookies
     */
    public static boolean clearCookies(HttpUrl url, Cookie cookie) {
        return COOKIE_STORE.remove(url, cookie);
    }

    /**
     * 获取cookies
     *
     * @return List<Cookie>
     */
    public static List<Cookie> getCookies() {
        return COOKIE_STORE.getCookies();
    }

}


================================================
FILE: lib_common/src/main/java/com/senon/lib_common/net/cookies/OkHttpCookies.java
================================================
package com.senon.lib_common.net.cookies;

import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;

import okhttp3.Cookie;

/**
 * Cookies对象
 */

class OkHttpCookies implements Serializable {

    private transient final Cookie cookies;
    private transient Cookie clientCookies;

    OkHttpCookies(Cookie cookies) {
        this.cookies = cookies;
    }

    Cookie getCookies() {
        Cookie bestCookies = cookies;
        if (clientCookies != null) {
            bestCookies = clientCookies;
        }
        return bestCookies;
    }

    private void writeObject(ObjectOutputStream out) throws IOException {
        out.writeObject(cookies.name());
        out.writeObject(cookies.value());
        out.writeLong(cookies.expiresAt());
        out.writeObject(cookies.domain());
        out.writeObject(cookies.path());
        out.writeBoolean(cookies.secure());
        out.writeBoolean(cookies.httpOnly());
        out.writeBoolean(cookies.hostOnly());
        out.writeBoolean(cookies.persistent());
    }

    private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException {
        String name = (String) in.readObject();
        String value = (String) in.readObject();
        long expiresAt = in.readLong();
        String domain = (String) in.readObject();
        String path = (String) in.readObject();
        boolean secure = in.readBoolean();
        boolean httpOnly = in.readBoolean();
        boolean hostOnly = in.readBoolean();
        Cookie.Builder builder = new Cookie.Builder();
        builder = builder.name(name);
        builder = builder.value(value);
        builder = builder.expiresAt(expiresAt);
        builder = hostOnly ? builder.hostOnlyDomain(domain) : builder.domain(domain);
        builder = builder.path(path);
        builder = secure ? builder.secure() : builder;
        builder = httpOnly ? builder.httpOnly() : builder;
        clientCookies = builder.build();
    }
}


================================================
FILE: lib_common/src/main/java/com/senon/lib_common/net/cookies/PersistentCookieStore.java
================================================
package com.senon.lib_common.net.cookies;

import android.content.Context;
import android.content.SharedPreferences;
import android.text.TextUtils;
import android.util.Log;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import okhttp3.Cookie;
import okhttp3.HttpUrl;

/**
 * 持久化Cookies
 */

public class PersistentCookieStore {

    private static final String LOG_TAG = "PersistentCookieStore";
    private static final String COOKIE_PREFS = "Cookies_Prefs";
    private static final String NAME = "user_name";
    private static final String PASSWORD = "user_password";
    private final Map<String, ConcurrentHashMap<String, Cookie>> cookies;
    private final SharedPreferences cookiePrefs;
    private static PersistentCookieStore cookieStore;

    public static void init(Context context){
        cookieStore = new PersistentCookieStore(context);
    }

    public static PersistentCookieStore getCookieStore(){
        return cookieStore;
    }

    private PersistentCookieStore(Context context) {
        cookies = new HashMap<>();
        cookiePrefs = context.getSharedPreferences(COOKIE_PREFS, Context.MODE_PRIVATE);

        //将持久化的cookies缓存到内存中 即map cookies
        Map<String, ?> prefsMap = cookiePrefs.getAll();
        for (Map.Entry<String, ?> entry : prefsMap.entrySet()) {
            String[] cookieNames = TextUtils.split((String) entry.getValue(), ",");
            for (String name : cookieNames) {
                String encodedCookie = cookiePrefs.getString(name, null);
                if (encodedCookie != null) {
                    Cookie decodedCookie = decodeCookie(encodedCookie);
                    if (decodedCookie != null) {
                        if (!cookies.containsKey(entry.getKey())) {
                            cookies.put(entry.getKey(), new ConcurrentHashMap<String,Cookie>());
                        }
                        cookies.get(entry.getKey()).put(name, decodedCookie);
                    }
                }
            }
        }
    }

    private String getCookieToken(Cookie cookie) {
        return cookie.name() + "@" + cookie.domain();
    }

    public void add(HttpUrl url, Cookie cookie) {
        String name = getCookieToken(cookie);

        //将cookies缓存到内存中 如果缓存过期 就重置此cookie
        if (!cookie.persistent()) {
            if (!cookies.containsKey(url.host())) {
                cookies.put(url.host(), new ConcurrentHashMap<String,Cookie>(10));
            }
            cookies.get(url.host()).put(name, cookie);
        } else {
            if (cookies.containsKey(url.host())) {
                cookies.get(url.host()).remove(name);
            }
        }

        //将cookies持久化到本地
        SharedPreferences.Editor prefsWriter = cookiePrefs.edit();
        prefsWriter.putString(url.host(), TextUtils.join(",", cookies.get(url.host()).keySet()));//将key值存储用以查询
        prefsWriter.putString(name, encodeCookie(new OkHttpCookies(cookie)));
        prefsWriter.apply();
    }

    public List<Cookie> get(HttpUrl url) {
        ArrayList<Cookie> ret = new ArrayList<>();
        if (cookies.containsKey(url.host())) {
            ret.addAll(cookies.get(url.host()).values());
        }
        return ret;
    }

    void removeAll() {
        SharedPreferences.Editor prefsWriter = cookiePrefs.edit();
        prefsWriter.clear();
        prefsWriter.apply();
        cookies.clear();
    }

    public void saveUserInfo(String username,String password){
        //将userinfo持久化到本地
        SharedPreferences.Editor prefsWriter = cookiePrefs.edit();
        prefsWriter.putString(NAME,username);
        prefsWriter.putString(PASSWORD,password);
        prefsWriter.apply();
    }

    public boolean isLogin(){
        if(cookiePrefs.getString(NAME,null) != null &&
                cookiePrefs.getString(PASSWORD,null) != null){
            return true;
        }
        return false;
    }
    public String getUsername(){
        String name = cookiePrefs.getString(NAME,null);
        if(cookiePrefs.getString(NAME,null) != null){
            return name;
        }
        return "未知用户";
    }

    boolean remove(HttpUrl url, Cookie cookie) {
        String name = getCookieToken(cookie);

        if (cookies.containsKey(url.host()) && cookies.get(url.host()).containsKey(name)) {
            cookies.get(url.host()).remove(name);

            SharedPreferences.Editor prefsWriter = cookiePrefs.edit();
            if (cookiePrefs.contains(name)) {
                prefsWriter.remove(name);
            }
            prefsWriter.putString(url.host(), TextUtils.join(",", cookies.get(url.host()).keySet()));
            prefsWriter.apply();

            return true;
        } else {
            return false;
        }
    }

    List<Cookie> getCookies() {
        ArrayList<Cookie> ret = new ArrayList<>();
        for (String key : cookies.keySet()) {
            ret.addAll(cookies.get(key).values());
        }
        return ret;
    }

    /**
     * cookies 序列化成 string
     *
     * @param cookie 要序列化的cookie
     * @return 序列化之后的string
     */
    private String encodeCookie(OkHttpCookies cookie) {
        if (cookie == null) {
            return null;
        }
        ByteArrayOutputStream os = new ByteArrayOutputStream();
        try {
            ObjectOutputStream outputStrea
Download .txt
gitextract_lw_97uwb/

├── .gitignore
├── .idea/
│   └── encodings.xml
├── README.md
├── app/
│   ├── .gitignore
│   ├── build.gradle
│   ├── proguard-rules.pro
│   └── src/
│       ├── androidTest/
│       │   └── java/
│       │       └── com/
│       │           └── senon/
│       │               └── xfhmoudel/
│       │                   └── ExampleInstrumentedTest.java
│       ├── main/
│       │   ├── AndroidManifest.xml
│       │   ├── java/
│       │   │   └── com/
│       │   │       └── senon/
│       │   │           └── xfhmoudel/
│       │   │               ├── App.java
│       │   │               ├── FragmentHomeActivity.java
│       │   │               ├── SplashActivity.java
│       │   │               └── TestActivity.java
│       │   └── res/
│       │       ├── drawable/
│       │       │   ├── ic_launcher_background.xml
│       │       │   └── shape_splash_timer.xml
│       │       ├── layout/
│       │       │   ├── activity_fragment_home.xml
│       │       │   ├── activity_splash.xml
│       │       │   └── activity_test.xml
│       │       └── values/
│       │           ├── colors.xml
│       │           ├── strings.xml
│       │           └── styles.xml
│       └── test/
│           └── java/
│               └── com/
│                   └── senon/
│                       └── xfhmoudel/
│                           └── ExampleUnitTest.java
├── build.gradle
├── dependencies.gradle
├── gradle/
│   └── wrapper/
│       ├── gradle-wrapper.jar
│       └── gradle-wrapper.properties
├── gradle.properties
├── gradlew
├── gradlew.bat
├── lib_common/
│   ├── .gitignore
│   ├── build.gradle
│   ├── proguard-rules.pro
│   └── src/
│       ├── androidTest/
│       │   └── java/
│       │       └── com/
│       │           └── senon/
│       │               └── lib_common/
│       │                   └── ExampleInstrumentedTest.java
│       ├── main/
│       │   ├── AndroidManifest.xml
│       │   ├── java/
│       │   │   └── com/
│       │   │       └── senon/
│       │   │           └── lib_common/
│       │   │               ├── AppConfig.java
│       │   │               ├── ComUtil.java
│       │   │               ├── ConstantArouter.java
│       │   │               ├── ConstantLoginArouter.java
│       │   │               ├── adapter/
│       │   │               │   ├── CommonAdapter.java
│       │   │               │   ├── CommonHolder.java
│       │   │               │   ├── RecycleHolder.java
│       │   │               │   └── RecyclerAdapter.java
│       │   │               ├── api/
│       │   │               │   └── BaseApi.java
│       │   │               ├── base/
│       │   │               │   ├── BaseActivity.java
│       │   │               │   ├── BaseAppDeletage.java
│       │   │               │   ├── BaseApplication.java
│       │   │               │   ├── BaseFragment.java
│       │   │               │   ├── BaseLazyFragment.java
│       │   │               │   ├── BaseNestingLazyFragment.java
│       │   │               │   ├── BasePresenter.java
│       │   │               │   ├── BaseResponse.java
│       │   │               │   └── BaseViewImp.java
│       │   │               ├── bean/
│       │   │               │   ├── Banner.java
│       │   │               │   ├── CollectionArticle.java
│       │   │               │   ├── HomeArticle.java
│       │   │               │   ├── KnowledgeSysArticle.java
│       │   │               │   ├── KnowledgeSystem.java
│       │   │               │   ├── Login.java
│       │   │               │   ├── ProjectArticle.java
│       │   │               │   ├── WXarticle.java
│       │   │               │   └── WXchapters.java
│       │   │               ├── common/
│       │   │               │   ├── contract/
│       │   │               │   │   ├── LoginContract.java
│       │   │               │   │   └── WebviewContract.java
│       │   │               │   ├── presenter/
│       │   │               │   │   ├── LoginPresenter.java
│       │   │               │   │   └── WebviewPresenter.java
│       │   │               │   └── ui/
│       │   │               │       ├── Common_LoginActivity.java
│       │   │               │       ├── Common_RegisterActivity.java
│       │   │               │       └── Common_WebviewActivity.java
│       │   │               ├── net/
│       │   │               │   ├── RequestInterceptor.java
│       │   │               │   ├── ServerUtils.java
│       │   │               │   ├── callback/
│       │   │               │   │   ├── ErrorListener.java
│       │   │               │   │   ├── RequestCallback.java
│       │   │               │   │   └── RxErrorHandler.java
│       │   │               │   ├── cookies/
│       │   │               │   │   ├── CookiesManager.java
│       │   │               │   │   ├── OkHttpCookies.java
│       │   │               │   │   └── PersistentCookieStore.java
│       │   │               │   └── progress/
│       │   │               │       ├── ProgressCancelListener.java
│       │   │               │       └── ProgressDialogHandler.java
│       │   │               ├── service/
│       │   │               │   └── InitializeService.java
│       │   │               └── utils/
│       │   │                   ├── ACache.java
│       │   │                   ├── BaseEvent.java
│       │   │                   ├── ConstantUtils.java
│       │   │                   ├── LogUtils.java
│       │   │                   ├── MD5Utils.java
│       │   │                   ├── PreferenceTool.java
│       │   │                   ├── RetryWithDelay.java
│       │   │                   ├── RxUtils.java
│       │   │                   ├── StatusBarUtils.java
│       │   │                   └── ToastUtil.java
│       │   └── res/
│       │       ├── drawable/
│       │       │   ├── register_border.xml
│       │       │   ├── register_border_2.xml
│       │       │   ├── register_border_9.xml
│       │       │   ├── shape_gradient.xml
│       │       │   ├── style_progress_bar.xml
│       │       │   └── toast_shape.xml
│       │       ├── layout/
│       │       │   ├── activity_common__login.xml
│       │       │   ├── activity_common__register.xml
│       │       │   ├── activity_common__webview.xml
│       │       │   ├── layout_fragmhome_tab.xml
│       │       │   ├── layout_toolbar.xml
│       │       │   └── toast_layout.xml
│       │       └── values/
│       │           ├── colors.xml
│       │           ├── dimens.xml
│       │           ├── strings.xml
│       │           └── styles.xml
│       └── test/
│           └── java/
│               └── com/
│                   └── senon/
│                       └── lib_common/
│                           └── ExampleUnitTest.java
├── lib_opensource/
│   ├── .gitignore
│   ├── build.gradle
│   ├── proguard-rules.pro
│   └── src/
│       ├── androidTest/
│       │   └── java/
│       │       └── com/
│       │           └── senon/
│       │               └── lib_opensource/
│       │                   └── ExampleInstrumentedTest.java
│       ├── main/
│       │   └── AndroidManifest.xml
│       └── test/
│           └── java/
│               └── com/
│                   └── senon/
│                       └── lib_opensource/
│                           └── ExampleUnitTest.java
├── module_art/
│   ├── .gitignore
│   ├── build.gradle
│   ├── proguard-rules.pro
│   └── src/
│       ├── androidTest/
│       │   └── java/
│       │       └── com/
│       │           └── senon/
│       │               └── module_art/
│       │                   └── ExampleInstrumentedTest.java
│       ├── main/
│       │   ├── debug/
│       │   │   └── AndroidManifest.xml
│       │   ├── java/
│       │   │   └── com/
│       │   │       └── senon/
│       │   │           └── module_art/
│       │   │               ├── App_Art.java
│       │   │               ├── MainActivity.java
│       │   │               ├── SplashActivity.java
│       │   │               ├── adapter/
│       │   │               │   └── ArtMainAdapter.java
│       │   │               ├── contract/
│       │   │               │   └── ArtMainFragmentCon.java
│       │   │               ├── fragment/
│       │   │               │   └── ArtMainFragment.java
│       │   │               └── presenter/
│       │   │                   └── ArtMainFragmentPre.java
│       │   ├── release/
│       │   │   └── AndroidManifest.xml
│       │   └── res/
│       │       ├── drawable/
│       │       │   ├── art_launcher_background.xml
│       │       │   ├── art_shape_transp_con20.xml
│       │       │   ├── art_shape_white_con30.xml
│       │       │   └── art_shape_yellow_con20.xml
│       │       ├── layout/
│       │       │   ├── art_activity_main.xml
│       │       │   ├── art_activity_splash.xml
│       │       │   ├── art_adapter_artmain_fragment_article.xml
│       │       │   ├── art_adapter_artmain_fragment_head.xml
│       │       │   ├── art_adapter_artmain_fragment_head_item.xml
│       │       │   └── art_fragment_main.xml
│       │       └── values/
│       │           ├── colors.xml
│       │           ├── strings.xml
│       │           └── styles.xml
│       └── test/
│           └── java/
│               └── com/
│                   └── senon/
│                       └── module_art/
│                           └── ExampleUnitTest.java
├── module_home/
│   ├── .gitignore
│   ├── build.gradle
│   ├── proguard-rules.pro
│   └── src/
│       ├── androidTest/
│       │   └── java/
│       │       └── com/
│       │           └── senon/
│       │               └── module_home/
│       │                   └── ExampleInstrumentedTest.java
│       ├── main/
│       │   ├── debug/
│       │   │   └── AndroidManifest.xml
│       │   ├── java/
│       │   │   └── com/
│       │   │       └── senon/
│       │   │           └── module_home/
│       │   │               ├── App_Home.java
│       │   │               ├── MainActivity.java
│       │   │               ├── SplashActivity.java
│       │   │               ├── activity/
│       │   │               │   ├── HomeArticleActivity.java
│       │   │               │   └── HomeProjectActivity.java
│       │   │               ├── adapter/
│       │   │               │   └── HomeMainAdapter.java
│       │   │               ├── contract/
│       │   │               │   ├── HomeArticleActivityCon.java
│       │   │               │   ├── HomeMainFragmentCon.java
│       │   │               │   └── HomeProjectActivityCon.java
│       │   │               ├── fragment/
│       │   │               │   └── HomeMainFragment.java
│       │   │               └── presenter/
│       │   │                   ├── HomeArticleActivityPre.java
│       │   │                   ├── HomeMainFragmentPre.java
│       │   │                   └── HomeProjectActivityPre.java
│       │   ├── release/
│       │   │   └── AndroidManifest.xml
│       │   └── res/
│       │       ├── drawable/
│       │       │   ├── home_ic_launcher_background.xml
│       │       │   ├── home_shape_stro_red_con30.xml
│       │       │   └── home_shape_white_con30.xml
│       │       ├── layout/
│       │       │   ├── home_activity_home_article.xml
│       │       │   ├── home_activity_home_project.xml
│       │       │   ├── home_activity_main.xml
│       │       │   ├── home_activity_splash.xml
│       │       │   ├── home_adapter_homemain_fragment_article.xml
│       │       │   ├── home_adapter_homemain_fragment_banneritem.xml
│       │       │   ├── home_adapter_homemain_fragment_head.xml
│       │       │   ├── home_adapter_homemain_fragment_project.xml
│       │       │   └── home_fragment_main.xml
│       │       └── values/
│       │           ├── colors.xml
│       │           ├── strings.xml
│       │           └── styles.xml
│       └── test/
│           └── java/
│               └── com/
│                   └── senon/
│                       └── module_home/
│                           └── ExampleUnitTest.java
├── module_life/
│   ├── .gitignore
│   ├── build.gradle
│   ├── proguard-rules.pro
│   └── src/
│       ├── androidTest/
│       │   └── java/
│       │       └── com/
│       │           └── senon/
│       │               └── module_life/
│       │                   └── ExampleInstrumentedTest.java
│       ├── main/
│       │   ├── debug/
│       │   │   └── AndroidManifest.xml
│       │   ├── java/
│       │   │   └── com/
│       │   │       └── senon/
│       │   │           └── module_life/
│       │   │               ├── App_Life.java
│       │   │               ├── MainActivity.java
│       │   │               ├── SplashActivity.java
│       │   │               ├── activity/
│       │   │               │   └── KnowledgeSystemActivity.java
│       │   │               ├── contract/
│       │   │               │   ├── KnowledgeSysActivityCon.java
│       │   │               │   └── LifeMainFragmentCon.java
│       │   │               ├── fragment/
│       │   │               │   └── LifeMainFragment.java
│       │   │               └── presenter/
│       │   │                   ├── KnowledgeSysActivityPre.java
│       │   │                   └── LifeMainFragmentPre.java
│       │   ├── release/
│       │   │   └── AndroidManifest.xml
│       │   └── res/
│       │       ├── drawable/
│       │       │   ├── life_ic_launcher_background.xml
│       │       │   ├── life_shape_gray_10.xml
│       │       │   └── life_shape_white_con30.xml
│       │       ├── layout/
│       │       │   ├── life_activity_home_article.xml
│       │       │   ├── life_activity_main.xml
│       │       │   ├── life_activity_splash.xml
│       │       │   ├── life_adapter_knowledgesys_item.xml
│       │       │   ├── life_adapter_lifemain_flowlayout_item.xml
│       │       │   ├── life_adapter_lifemain_fragment.xml
│       │       │   └── life_fragment_main.xml
│       │       └── values/
│       │           ├── colors.xml
│       │           ├── strings.xml
│       │           └── styles.xml
│       └── test/
│           └── java/
│               └── com/
│                   └── senon/
│                       └── module_life/
│                           └── ExampleUnitTest.java
├── module_talent/
│   ├── .gitignore
│   ├── build.gradle
│   ├── proguard-rules.pro
│   └── src/
│       ├── androidTest/
│       │   └── java/
│       │       └── com/
│       │           └── senon/
│       │               └── module_talent/
│       │                   └── ExampleInstrumentedTest.java
│       ├── main/
│       │   ├── debug/
│       │   │   └── AndroidManifest.xml
│       │   ├── java/
│       │   │   └── com/
│       │   │       └── senon/
│       │   │           └── module_talent/
│       │   │               ├── App_Talent.java
│       │   │               ├── MainActivity.java
│       │   │               ├── activity/
│       │   │               │   ├── AboutActivity.java
│       │   │               │   └── CollectionActivity.java
│       │   │               ├── contract/
│       │   │               │   ├── CollectionActivityCon.java
│       │   │               │   └── TalentMainFragmentCon.java
│       │   │               ├── fragment/
│       │   │               │   └── TalentMainFragment.java
│       │   │               └── presenter/
│       │   │                   ├── CollectionActivityPre.java
│       │   │                   └── TalentMainFragmentPre.java
│       │   ├── release/
│       │   │   └── AndroidManifest.xml
│       │   └── res/
│       │       ├── drawable/
│       │       │   ├── talent_ic_launcher_background.xml
│       │       │   └── talent_shape_white_con30.xml
│       │       ├── layout/
│       │       │   ├── talent_activity_about.xml
│       │       │   ├── talent_activity_collection.xml
│       │       │   ├── talent_activity_main.xml
│       │       │   ├── talent_adapter_collection.xml
│       │       │   └── talent_fragment_main.xml
│       │       └── values/
│       │           ├── colors.xml
│       │           ├── strings.xml
│       │           └── styles.xml
│       └── test/
│           └── java/
│               └── com/
│                   └── senon/
│                       └── module_talent/
│                           └── ExampleUnitTest.java
├── senon.jks
└── settings.gradle
Download .txt
SYMBOL INDEX (1194 symbols across 111 files)

FILE: app/src/androidTest/java/com/senon/xfhmoudel/ExampleInstrumentedTest.java
  class ExampleInstrumentedTest (line 17) | @RunWith(AndroidJUnit4.class)
    method useAppContext (line 19) | @Test

FILE: app/src/main/java/com/senon/xfhmoudel/App.java
  class App (line 10) | public class App extends BaseApplication {
    method onCreate (line 11) | @Override
    method initARouter (line 18) | private void initARouter() {

FILE: app/src/main/java/com/senon/xfhmoudel/FragmentHomeActivity.java
  class FragmentHomeActivity (line 34) | @Route(path = ConstantArouter.PATH_APP_FRAGMENTHOMEACTIVITY)
    method onCreate (line 42) | @Override
    method initVp$Tab (line 56) | private void initVp$Tab() {
    method getTabView (line 104) | private View getTabView(int curPos) {
    method setTextColor (line 115) | private void setTextColor(View view,int position,boolean select){
    method onKeyUp (line 129) | @Override
    class MyFragmentPagerAdapter (line 147) | class MyFragmentPagerAdapter extends FragmentPagerAdapter {
      method MyFragmentPagerAdapter (line 148) | public MyFragmentPagerAdapter(FragmentManager fm) {
      method getItem (line 151) | @Override
      method getCount (line 155) | @Override
      method getPageTitle (line 160) | @Nullable

FILE: app/src/main/java/com/senon/xfhmoudel/SplashActivity.java
  class SplashActivity (line 27) | @Route(path = ConstantArouter.PATH_APP_SPLASHACTIVITY)
    method onCreate (line 35) | @Override
    method initTimer (line 68) | private void initTimer() {
    method initHTextView (line 121) | private void initHTextView(Long aLong) {
    method gotoMainAct (line 129) | private void gotoMainAct(){
    method onDestroy (line 136) | @Override

FILE: app/src/main/java/com/senon/xfhmoudel/TestActivity.java
  class TestActivity (line 17) | @Route(path = ConstantLoginArouter.PATH_APP_MAINACTIVITY)
    method onCreate (line 20) | @Override
    method toA (line 29) | public void toA(View view){
    method toB (line 46) | public void toB(View view){

FILE: app/src/test/java/com/senon/xfhmoudel/ExampleUnitTest.java
  class ExampleUnitTest (line 12) | public class ExampleUnitTest {
    method addition_isCorrect (line 13) | @Test

FILE: lib_common/src/androidTest/java/com/senon/lib_common/ExampleInstrumentedTest.java
  class ExampleInstrumentedTest (line 17) | @RunWith(AndroidJUnit4.class)
    method useAppContext (line 19) | @Test

FILE: lib_common/src/main/java/com/senon/lib_common/AppConfig.java
  class AppConfig (line 8) | public class AppConfig {

FILE: lib_common/src/main/java/com/senon/lib_common/ComUtil.java
  class ComUtil (line 26) | public class ComUtil {
    method changeStatusBarTextColor (line 29) | public static void changeStatusBarTextColor(Context context,boolean is...
    method isNumeric (line 44) | public static boolean isNumeric(String str) {
    method isChinese (line 53) | public static boolean isChinese(String str) {
    method longToString (line 63) | public static String longToString(Object longTime, String timeFormat) {
    method isNetworkConnected (line 75) | public static boolean isNetworkConnected() {
    method getScreenWidth (line 83) | public static int getScreenWidth(Context context) {
    method getScreenHeight (line 89) | public static int getScreenHeight(Context context) {
    method getMd5Str (line 95) | public static String getMd5Str(HashMap<String, String> map) {
    method getMd5Str (line 105) | public static HashMap<String, String> getMd5Str(String[] keyArray, Str...

FILE: lib_common/src/main/java/com/senon/lib_common/ConstantArouter.java
  class ConstantArouter (line 8) | public class ConstantArouter {

FILE: lib_common/src/main/java/com/senon/lib_common/ConstantLoginArouter.java
  class ConstantLoginArouter (line 9) | public class ConstantLoginArouter {
    method getActivityName (line 39) | private static String getActivityName(String routerUrl) {
    method getCurRouter (line 44) | public static String getCurRouter(String activityName) {

FILE: lib_common/src/main/java/com/senon/lib_common/adapter/CommonAdapter.java
  class CommonAdapter (line 11) | public abstract class CommonAdapter<T> extends BaseAdapter {
    method CommonAdapter (line 17) | public CommonAdapter(Context context, List<T> mDatas, int itemLayoutId) {
    method getCount (line 24) | @Override
    method getItem (line 29) | @Override
    method getItemId (line 35) | @Override
    method getView (line 40) | @Override
    method convert (line 48) | public abstract void convert(CommonHolder helper, T item,int position);
    method getViewHolder (line 50) | private CommonHolder getViewHolder(int position, View convertView, Vie...

FILE: lib_common/src/main/java/com/senon/lib_common/adapter/CommonHolder.java
  class CommonHolder (line 26) | public class CommonHolder {
    method CommonHolder (line 33) | private CommonHolder(Context context, ViewGroup parent, int layoutId, ...
    method get (line 54) | public static CommonHolder get(Context context, View convertView, View...
    method getView (line 68) | public <T extends View> T getView(int viewId) {
    method getConvertView (line 77) | public View getConvertView() {
    method setText (line 88) | public CommonHolder setText(int viewId, String text) {
    method getText (line 94) | public String getText(int viewId) {
    method setEnabled (line 99) | public CommonHolder setEnabled(int viewId, boolean enabled) {
    method setSelected (line 105) | public CommonHolder setSelected(int viewId, boolean selected) {
    method setImageResource (line 118) | public CommonHolder setImageResource(int viewId, int drawableId) {
    method setImageBitmap (line 132) | public CommonHolder setImageBitmap(int viewId, Bitmap bm) {
    method setColorFilter (line 139) | public CommonHolder setColorFilter(int viewId, Integer colorFilter) {
    method setImageDrawable (line 146) | public CommonHolder setImageDrawable(int viewId, Drawable drawable) {
    method setBackgroundColor (line 152) | public CommonHolder setBackgroundColor(int viewId, int color) {
    method setBackgroundRes (line 158) | public CommonHolder setBackgroundRes(int viewId, int backgroundRes) {
    method setTextColor (line 164) | public CommonHolder setTextColor(int viewId, int textColor) {
    method setTextColorRes (line 170) | public CommonHolder setTextColorRes(int viewId, int textColorRes) {
    method setAlpha (line 177) | @SuppressLint("NewApi")
    method setVisible (line 191) | public CommonHolder setVisible(int viewId, int visible) {
    method linkify (line 197) | public CommonHolder linkify(int viewId) {
    method setTypeface (line 203) | public CommonHolder setTypeface(Typeface typeface, int... viewIds) {
    method setProgress (line 212) | public CommonHolder setProgress(int viewId, int progress) {
    method setProgress (line 218) | public CommonHolder setProgress(int viewId, int progress, int max) {
    method setMax (line 225) | public CommonHolder setMax(int viewId, int max) {
    method setRating (line 231) | public CommonHolder setRating(int viewId, float rating) {
    method setRating (line 237) | public CommonHolder setRating(int viewId, float rating, int max) {
    method setTag (line 244) | public CommonHolder setTag(int viewId, Object tag) {
    method setTag (line 250) | public CommonHolder setTag(int viewId, int key, Object tag) {
    method setChecked (line 256) | public CommonHolder setChecked(int viewId, boolean checked) {
    method setOnClickListener (line 265) | public CommonHolder setOnClickListener(int viewId, View.OnClickListene...
    method setOnTouchListener (line 271) | public CommonHolder setOnTouchListener(int viewId, View.OnTouchListene...
    method setOnLongClickListener (line 277) | public CommonHolder setOnLongClickListener(int viewId, View.OnLongClic...
    method setStrikeThruText (line 288) | public void setStrikeThruText(int viewID) {
    method getPosition (line 293) | public int getPosition() {
    method setData (line 297) | public GridView setData(int viewId) {

FILE: lib_common/src/main/java/com/senon/lib_common/adapter/RecycleHolder.java
  class RecycleHolder (line 22) | public class RecycleHolder extends RecyclerView.ViewHolder {
    method RecycleHolder (line 29) | public RecycleHolder(View itemView) {
    method findView (line 34) | public <T extends View> T findView(int ViewId) {
    method setOnClickListener (line 44) | public RecycleHolder setOnClickListener(int viewId, View.OnClickListen...
    method setOnClickListener (line 50) | public RecycleHolder setOnClickListener(int viewId,int viewId2 ,View.O...
    method setOnLongClickListener (line 59) | public RecycleHolder setOnLongClickListener(int viewId, View.OnLongCli...
    method setOnLongClickListener (line 65) | public RecycleHolder setOnLongClickListener(int viewId,int viewId2, Vi...
    method setText (line 74) | public RecycleHolder setText(int viewId, String text) {
    method setText (line 80) | public RecycleHolder setText(int viewId, SpannableStringBuilder text) {
    method setMaxLine (line 86) | public RecycleHolder setMaxLine(int viewId, int lineCount) {
    method setPadding (line 92) | public RecycleHolder setPadding(int viewId, int left, int top, int rig...
    method setAppendTextColor (line 98) | public RecycleHolder setAppendTextColor(int viewId, CharSequence str, ...
    method setSelected (line 107) | public RecycleHolder setSelected(int viewId, boolean selected) {
    method setEnabled (line 113) | public RecycleHolder setEnabled(int viewId, boolean enabled) {
    method setEnabled_imgView (line 118) | public RecycleHolder setEnabled_imgView(int viewId, boolean enabled) {
    method setText (line 123) | public RecycleHolder setText(int viewId, int text) {
    method setChecked (line 129) | public RecycleHolder setChecked(int viewId, boolean checked) {
    method setTextColor (line 135) | public RecycleHolder setTextColor(int viewId, int colorResId) {
    method setImageResource (line 141) | public RecycleHolder setImageResource(int viewId, int ImageId) {
    method setLayoutParams (line 147) | public RecycleHolder setLayoutParams(int viewId, ViewGroup.LayoutParam...
    method setImageBitmap (line 154) | public RecycleHolder setImageBitmap(int viewId, Bitmap bitmap) {
    method setGlideImage (line 160) | public RecycleHolder setGlideImage(int viewId, String url,int placehod...
    method setImageNet (line 170) | public RecycleHolder setImageNet(int viewId, String url) {
    method setBackgroundColor (line 176) | public RecycleHolder setBackgroundColor(int viewId, int color) {
    method setBackgroundRes (line 182) | public RecycleHolder setBackgroundRes(int viewId, int backgroundRes) {
    method setVisible (line 188) | public RecycleHolder setVisible(int viewId, boolean visible) {
    method setVisible_invisible (line 195) | public RecycleHolder setVisible_invisible(int viewId, boolean visible) {
    method setProgesss (line 202) | public RecycleHolder setProgesss(int viewId, int percent) {
    method getVisible (line 208) | public boolean getVisible(int viewId) {

FILE: lib_common/src/main/java/com/senon/lib_common/adapter/RecyclerAdapter.java
  class RecyclerAdapter (line 12) | public abstract class RecyclerAdapter<T> extends RecyclerView.Adapter<Re...
    method RecyclerAdapter (line 21) | public RecyclerAdapter(Context mContext, List<T> mDatas, int mLayoutId) {
    method onCreateViewHolder (line 28) | @Override
    method onBindViewHolder (line 33) | @Override
    method convert (line 49) | public abstract void convert(RecycleHolder holder, T data, int position);
    method getItemCount (line 51) | @Override
    method setOnItemClickListener (line 56) | public void setOnItemClickListener(OnItemClickListener onItemClickList...
    type OnItemClickListener (line 60) | public interface OnItemClickListener {
      method OnItemClickListener (line 61) | void OnItemClickListener(View view, int position);

FILE: lib_common/src/main/java/com/senon/lib_common/api/BaseApi.java
  type BaseApi (line 27) | public interface BaseApi {
    method login (line 31) | @POST("user/login")
    method logout (line 35) | @GET("user/logout/json")
    method register (line 38) | @POST("user/register")
    method banner (line 43) | @GET("banner/json")
    method getHomeArticle (line 46) | @GET("article/list/{page}/json")
    method getHomeProject (line 49) | @GET("article/listproject/{page}/json")
    method getProjectList (line 53) | @GET("project/list/{page}/json")
    method getKnowledgeList (line 57) | @GET("tree/json")
    method getKnowledgeArticle (line 60) | @GET("article/list/{page}/json")
    method getWXarticleChapters (line 64) | @GET("wxarticle/chapters/json")
    method getWXarticleList (line 67) | @GET("wxarticle/list/{id}/{page}/json")
    method getCollect (line 71) | @POST("lg/collect/{id}/json")
    method getUncollectOriginId (line 74) | @POST("lg/uncollect_originId/{id}/json")
    method getUncollect (line 77) | @POST("lg/uncollect/{id}/json")
    method getCollectList (line 81) | @GET("lg/collect/list/{page}/json")

FILE: lib_common/src/main/java/com/senon/lib_common/base/BaseActivity.java
  class BaseActivity (line 12) | public abstract class BaseActivity<V extends BaseViewImp,P extends BaseP...
    method getPresenter (line 18) | public P getPresenter(){
    method onCreate (line 22) | @Override
    method getLayoutId (line 42) | public abstract int getLayoutId();
    method createPresenter (line 43) | public abstract P createPresenter();
    method createView (line 44) | public abstract V createView();
    method init (line 45) | public abstract void init();
    method onDestroy (line 47) | @Override

FILE: lib_common/src/main/java/com/senon/lib_common/base/BaseAppDeletage.java
  class BaseAppDeletage (line 25) | public class BaseAppDeletage {
    method createRefreshHeader (line 33) | @Override
    method createRefreshFooter (line 41) | @Override
    method BaseAppDeletage (line 49) | public BaseAppDeletage(Application application) {
    method onCreate (line 53) | public void onCreate() {
    method initAutoSizeUnits (line 64) | private void initAutoSizeUnits() {

FILE: lib_common/src/main/java/com/senon/lib_common/base/BaseApplication.java
  class BaseApplication (line 11) | public class BaseApplication extends Application {
    method onCreate (line 13) | @Override

FILE: lib_common/src/main/java/com/senon/lib_common/base/BaseFragment.java
  class BaseFragment (line 13) | public abstract class BaseFragment<V extends BaseViewImp, P extends Base...
    method getPresenter (line 20) | public P getPresenter() {
    method onCreateView (line 24) | @Override
    method getLayoutId (line 42) | public abstract int getLayoutId();
    method createPresenter (line 43) | public abstract P createPresenter();
    method createView (line 44) | public abstract V createView();
    method init (line 45) | public abstract void init();
    method onDestroyView (line 47) | @Override

FILE: lib_common/src/main/java/com/senon/lib_common/base/BaseLazyFragment.java
  class BaseLazyFragment (line 44) | public abstract class BaseLazyFragment<V extends BaseViewImp, P extends ...
    method getPresenter (line 55) | public P getPresenter() {
    method onCreateView (line 59) | @Nullable
    method getLayoutId (line 82) | public abstract int getLayoutId();
    method createPresenter (line 83) | public abstract P createPresenter();
    method createView (line 84) | public abstract V createView();
    method init (line 85) | public abstract void init(View rootView);
    method setUserVisibleHint (line 87) | @Override
    method onStart (line 102) | @Override
    method onResume (line 114) | @Override
    method onPause (line 126) | @Override
    method onDestroyView (line 136) | @Override
    method disPatchFragment (line 153) | public void disPatchFragment(boolean visible){
    method onFragmentFirst (line 168) | public void onFragmentFirst(){
    method onFragmentVisble (line 172) | public void onFragmentVisble(){//子Fragment调用次方法,执行可见操作
    method onFragmentInVisible (line 176) | public void onFragmentInVisible(){

FILE: lib_common/src/main/java/com/senon/lib_common/base/BaseNestingLazyFragment.java
  class BaseNestingLazyFragment (line 21) | public abstract class BaseNestingLazyFragment<V extends BaseViewImp, P e...
    method getPresenter (line 32) | public P getPresenter() {
    method onCreateView (line 36) | @Nullable
    method getLayoutId (line 59) | public abstract int getLayoutId();
    method createPresenter (line 61) | public abstract P createPresenter();
    method createView (line 63) | public abstract V createView();
    method init (line 65) | public abstract void init(View rootView);
    method setUserVisibleHint (line 67) | @Override
    method onStart (line 82) | @Override
    method onResume (line 95) | @Override
    method onPause (line 107) | @Override
    method onDestroyView (line 117) | @Override
    method disPatchFragment (line 135) | public void disPatchFragment(boolean visible) {
    method dispatchChildFragmentVisibleState (line 165) | private void dispatchChildFragmentVisibleState(boolean visible) {
    method onFragmentFirst (line 181) | public void onFragmentFirst() {
    method onFragmentVisble (line 185) | public void onFragmentVisble() {//子Fragment调用次方法,执行可见操作
    method onFragmentInVisible (line 189) | public void onFragmentInVisible() {
    method isParentFragmentVsible (line 196) | private boolean isParentFragmentVsible() {
    method getCurrentVisibleState (line 201) | private boolean getCurrentVisibleState() {

FILE: lib_common/src/main/java/com/senon/lib_common/base/BasePresenter.java
  class BasePresenter (line 7) | public abstract class BasePresenter<V extends BaseViewImp>{
    method getView (line 11) | public V getView(){
    method attachView (line 15) | public void attachView(V v){
    method detachView (line 19) | public void detachView(){

FILE: lib_common/src/main/java/com/senon/lib_common/base/BaseResponse.java
  class BaseResponse (line 8) | public class BaseResponse<T> {
    method getMsg (line 18) | public String getMsg() {
    method getCode (line 22) | public int getCode() {
    method getData (line 26) | public T getData() {

FILE: lib_common/src/main/java/com/senon/lib_common/base/BaseViewImp.java
  type BaseViewImp (line 6) | public interface BaseViewImp {

FILE: lib_common/src/main/java/com/senon/lib_common/bean/Banner.java
  class Banner (line 6) | public class Banner {
    method getDesc (line 28) | public String getDesc() {
    method setDesc (line 32) | public void setDesc(String desc) {
    method getId (line 36) | public int getId() {
    method setId (line 40) | public void setId(int id) {
    method getImagePath (line 44) | public String getImagePath() {
    method setImagePath (line 48) | public void setImagePath(String imagePath) {
    method getIsVisible (line 52) | public int getIsVisible() {
    method setIsVisible (line 56) | public void setIsVisible(int isVisible) {
    method getOrder (line 60) | public int getOrder() {
    method setOrder (line 64) | public void setOrder(int order) {
    method getTitle (line 68) | public String getTitle() {
    method setTitle (line 72) | public void setTitle(String title) {
    method getType (line 76) | public int getType() {
    method setType (line 80) | public void setType(int type) {
    method getUrl (line 84) | public String getUrl() {
    method setUrl (line 88) | public void setUrl(String url) {

FILE: lib_common/src/main/java/com/senon/lib_common/bean/CollectionArticle.java
  class CollectionArticle (line 9) | public class CollectionArticle {
    method getCurPage (line 29) | public int getCurPage() {
    method setCurPage (line 33) | public void setCurPage(int curPage) {
    method getOffset (line 37) | public int getOffset() {
    method setOffset (line 41) | public void setOffset(int offset) {
    method isOver (line 45) | public boolean isOver() {
    method setOver (line 49) | public void setOver(boolean over) {
    method getPageCount (line 53) | public int getPageCount() {
    method setPageCount (line 57) | public void setPageCount(int pageCount) {
    method getSize (line 61) | public int getSize() {
    method setSize (line 65) | public void setSize(int size) {
    method getTotal (line 69) | public int getTotal() {
    method setTotal (line 73) | public void setTotal(int total) {
    method getDatas (line 77) | public List<DatasBean> getDatas() {
    method setDatas (line 81) | public void setDatas(List<DatasBean> datas) {
    class DatasBean (line 85) | public static class DatasBean {
      method getAuthor (line 122) | public String getAuthor() {
      method setAuthor (line 126) | public void setAuthor(String author) {
      method getChapterId (line 130) | public int getChapterId() {
      method setChapterId (line 134) | public void setChapterId(int chapterId) {
      method getChapterName (line 138) | public String getChapterName() {
      method setChapterName (line 142) | public void setChapterName(String chapterName) {
      method getCourseId (line 146) | public int getCourseId() {
      method setCourseId (line 150) | public void setCourseId(int courseId) {
      method getDesc (line 154) | public String getDesc() {
      method setDesc (line 158) | public void setDesc(String desc) {
      method getEnvelopePic (line 162) | public String getEnvelopePic() {
      method setEnvelopePic (line 166) | public void setEnvelopePic(String envelopePic) {
      method getId (line 170) | public int getId() {
      method setId (line 174) | public void setId(int id) {
      method getLink (line 178) | public String getLink() {
      method setLink (line 182) | public void setLink(String link) {
      method getNiceDate (line 186) | public String getNiceDate() {
      method setNiceDate (line 190) | public void setNiceDate(String niceDate) {
      method getOrigin (line 194) | public String getOrigin() {
      method setOrigin (line 198) | public void setOrigin(String origin) {
      method getOriginId (line 202) | public int getOriginId() {
      method setOriginId (line 206) | public void setOriginId(int originId) {
      method getPublishTime (line 210) | public long getPublishTime() {
      method setPublishTime (line 214) | public void setPublishTime(long publishTime) {
      method getTitle (line 218) | public String getTitle() {
      method setTitle (line 222) | public void setTitle(String title) {
      method getUserId (line 226) | public int getUserId() {
      method setUserId (line 230) | public void setUserId(int userId) {
      method getVisible (line 234) | public int getVisible() {
      method setVisible (line 238) | public void setVisible(int visible) {
      method getZan (line 242) | public int getZan() {
      method setZan (line 246) | public void setZan(int zan) {

FILE: lib_common/src/main/java/com/senon/lib_common/bean/HomeArticle.java
  class HomeArticle (line 9) | public class HomeArticle {
    method getCurPage (line 33) | public int getCurPage() {
    method setCurPage (line 37) | public void setCurPage(int curPage) {
    method getOffset (line 41) | public int getOffset() {
    method setOffset (line 45) | public void setOffset(int offset) {
    method isOver (line 49) | public boolean isOver() {
    method setOver (line 53) | public void setOver(boolean over) {
    method getPageCount (line 57) | public int getPageCount() {
    method setPageCount (line 61) | public void setPageCount(int pageCount) {
    method getSize (line 65) | public int getSize() {
    method setSize (line 69) | public void setSize(int size) {
    method getTotal (line 73) | public int getTotal() {
    method setTotal (line 77) | public void setTotal(int total) {
    method getDatas (line 81) | public List<DatasBean> getDatas() {
    method setDatas (line 85) | public void setDatas(List<DatasBean> datas) {
    class DatasBean (line 89) | public static class DatasBean {
      method getApkLink (line 140) | public String getApkLink() {
      method setApkLink (line 144) | public void setApkLink(String apkLink) {
      method getAuthor (line 148) | public String getAuthor() {
      method setAuthor (line 152) | public void setAuthor(String author) {
      method getChapterId (line 156) | public int getChapterId() {
      method setChapterId (line 160) | public void setChapterId(int chapterId) {
      method getChapterName (line 164) | public String getChapterName() {
      method setChapterName (line 168) | public void setChapterName(String chapterName) {
      method isCollect (line 172) | public boolean isCollect() {
      method setCollect (line 176) | public void setCollect(boolean collect) {
      method getCourseId (line 180) | public int getCourseId() {
      method setCourseId (line 184) | public void setCourseId(int courseId) {
      method getDesc (line 188) | public String getDesc() {
      method setDesc (line 192) | public void setDesc(String desc) {
      method getEnvelopePic (line 196) | public String getEnvelopePic() {
      method setEnvelopePic (line 200) | public void setEnvelopePic(String envelopePic) {
      method isFresh (line 204) | public boolean isFresh() {
      method setFresh (line 208) | public void setFresh(boolean fresh) {
      method getId (line 212) | public int getId() {
      method setId (line 216) | public void setId(int id) {
      method getLink (line 220) | public String getLink() {
      method setLink (line 224) | public void setLink(String link) {
      method getNiceDate (line 228) | public String getNiceDate() {
      method setNiceDate (line 232) | public void setNiceDate(String niceDate) {
      method getOrigin (line 236) | public String getOrigin() {
      method setOrigin (line 240) | public void setOrigin(String origin) {
      method getProjectLink (line 244) | public String getProjectLink() {
      method setProjectLink (line 248) | public void setProjectLink(String projectLink) {
      method getPublishTime (line 252) | public long getPublishTime() {
      method setPublishTime (line 256) | public void setPublishTime(long publishTime) {
      method getSuperChapterId (line 260) | public int getSuperChapterId() {
      method setSuperChapterId (line 264) | public void setSuperChapterId(int superChapterId) {
      method getSuperChapterName (line 268) | public String getSuperChapterName() {
      method setSuperChapterName (line 272) | public void setSuperChapterName(String superChapterName) {
      method getTitle (line 276) | public String getTitle() {
      method setTitle (line 280) | public void setTitle(String title) {
      method getType (line 284) | public int getType() {
      method setType (line 288) | public void setType(int type) {
      method getUserId (line 292) | public int getUserId() {
      method setUserId (line 296) | public void setUserId(int userId) {
      method getVisible (line 300) | public int getVisible() {
      method setVisible (line 304) | public void setVisible(int visible) {
      method getZan (line 308) | public int getZan() {
      method setZan (line 312) | public void setZan(int zan) {
      method getTags (line 316) | public List<?> getTags() {
      method setTags (line 320) | public void setTags(List<?> tags) {

FILE: lib_common/src/main/java/com/senon/lib_common/bean/KnowledgeSysArticle.java
  class KnowledgeSysArticle (line 8) | public class KnowledgeSysArticle {
    method getCurPage (line 28) | public int getCurPage() {
    method setCurPage (line 32) | public void setCurPage(int curPage) {
    method getOffset (line 36) | public int getOffset() {
    method setOffset (line 40) | public void setOffset(int offset) {
    method isOver (line 44) | public boolean isOver() {
    method setOver (line 48) | public void setOver(boolean over) {
    method getPageCount (line 52) | public int getPageCount() {
    method setPageCount (line 56) | public void setPageCount(int pageCount) {
    method getSize (line 60) | public int getSize() {
    method setSize (line 64) | public void setSize(int size) {
    method getTotal (line 68) | public int getTotal() {
    method setTotal (line 72) | public void setTotal(int total) {
    method getDatas (line 76) | public List<DatasBean> getDatas() {
    method setDatas (line 80) | public void setDatas(List<DatasBean> datas) {
    class DatasBean (line 84) | public static class DatasBean {
      method getApkLink (line 135) | public String getApkLink() {
      method setApkLink (line 139) | public void setApkLink(String apkLink) {
      method getAuthor (line 143) | public String getAuthor() {
      method setAuthor (line 147) | public void setAuthor(String author) {
      method getChapterId (line 151) | public int getChapterId() {
      method setChapterId (line 155) | public void setChapterId(int chapterId) {
      method getChapterName (line 159) | public String getChapterName() {
      method setChapterName (line 163) | public void setChapterName(String chapterName) {
      method isCollect (line 167) | public boolean isCollect() {
      method setCollect (line 171) | public void setCollect(boolean collect) {
      method getCourseId (line 175) | public int getCourseId() {
      method setCourseId (line 179) | public void setCourseId(int courseId) {
      method getDesc (line 183) | public String getDesc() {
      method setDesc (line 187) | public void setDesc(String desc) {
      method getEnvelopePic (line 191) | public String getEnvelopePic() {
      method setEnvelopePic (line 195) | public void setEnvelopePic(String envelopePic) {
      method isFresh (line 199) | public boolean isFresh() {
      method setFresh (line 203) | public void setFresh(boolean fresh) {
      method getId (line 207) | public int getId() {
      method setId (line 211) | public void setId(int id) {
      method getLink (line 215) | public String getLink() {
      method setLink (line 219) | public void setLink(String link) {
      method getNiceDate (line 223) | public String getNiceDate() {
      method setNiceDate (line 227) | public void setNiceDate(String niceDate) {
      method getOrigin (line 231) | public String getOrigin() {
      method setOrigin (line 235) | public void setOrigin(String origin) {
      method getProjectLink (line 239) | public String getProjectLink() {
      method setProjectLink (line 243) | public void setProjectLink(String projectLink) {
      method getPublishTime (line 247) | public long getPublishTime() {
      method setPublishTime (line 251) | public void setPublishTime(long publishTime) {
      method getSuperChapterId (line 255) | public int getSuperChapterId() {
      method setSuperChapterId (line 259) | public void setSuperChapterId(int superChapterId) {
      method getSuperChapterName (line 263) | public String getSuperChapterName() {
      method setSuperChapterName (line 267) | public void setSuperChapterName(String superChapterName) {
      method getTitle (line 271) | public String getTitle() {
      method setTitle (line 275) | public void setTitle(String title) {
      method getType (line 279) | public int getType() {
      method setType (line 283) | public void setType(int type) {
      method getUserId (line 287) | public int getUserId() {
      method setUserId (line 291) | public void setUserId(int userId) {
      method getVisible (line 295) | public int getVisible() {
      method setVisible (line 299) | public void setVisible(int visible) {
      method getZan (line 303) | public int getZan() {
      method setZan (line 307) | public void setZan(int zan) {
      method getTags (line 311) | public List<TagsBean> getTags() {
      method setTags (line 315) | public void setTags(List<TagsBean> tags) {
      class TagsBean (line 319) | public static class TagsBean {
        method getName (line 328) | public String getName() {
        method setName (line 332) | public void setName(String name) {
        method getUrl (line 336) | public String getUrl() {
        method setUrl (line 340) | public void setUrl(String url) {

FILE: lib_common/src/main/java/com/senon/lib_common/bean/KnowledgeSystem.java
  class KnowledgeSystem (line 8) | public class KnowledgeSystem {
    method getCourseId (line 30) | public int getCourseId() {
    method setCourseId (line 34) | public void setCourseId(int courseId) {
    method getId (line 38) | public int getId() {
    method setId (line 42) | public void setId(int id) {
    method getName (line 46) | public String getName() {
    method setName (line 50) | public void setName(String name) {
    method getOrder (line 54) | public int getOrder() {
    method setOrder (line 58) | public void setOrder(int order) {
    method getParentChapterId (line 62) | public int getParentChapterId() {
    method setParentChapterId (line 66) | public void setParentChapterId(int parentChapterId) {
    method isUserControlSetTop (line 70) | public boolean isUserControlSetTop() {
    method setUserControlSetTop (line 74) | public void setUserControlSetTop(boolean userControlSetTop) {
    method getVisible (line 78) | public int getVisible() {
    method setVisible (line 82) | public void setVisible(int visible) {
    method getChildren (line 86) | public List<ChildrenBean> getChildren() {
    method setChildren (line 90) | public void setChildren(List<ChildrenBean> children) {
    class ChildrenBean (line 94) | public static class ChildrenBean {
      method getCourseId (line 115) | public int getCourseId() {
      method setCourseId (line 119) | public void setCourseId(int courseId) {
      method getId (line 123) | public int getId() {
      method setId (line 127) | public void setId(int id) {
      method getName (line 131) | public String getName() {
      method setName (line 135) | public void setName(String name) {
      method getOrder (line 139) | public int getOrder() {
      method setOrder (line 143) | public void setOrder(int order) {
      method getParentChapterId (line 147) | public int getParentChapterId() {
      method setParentChapterId (line 151) | public void setParentChapterId(int parentChapterId) {
      method isUserControlSetTop (line 155) | public boolean isUserControlSetTop() {
      method setUserControlSetTop (line 159) | public void setUserControlSetTop(boolean userControlSetTop) {
      method getVisible (line 163) | public int getVisible() {
      method setVisible (line 167) | public void setVisible(int visible) {
      method getChildren (line 171) | public List<?> getChildren() {
      method setChildren (line 175) | public void setChildren(List<?> children) {

FILE: lib_common/src/main/java/com/senon/lib_common/bean/Login.java
  class Login (line 8) | public class Login {
    method getEmail (line 32) | public String getEmail() {
    method setEmail (line 36) | public void setEmail(String email) {
    method getIcon (line 40) | public String getIcon() {
    method setIcon (line 44) | public void setIcon(String icon) {
    method getId (line 48) | public int getId() {
    method setId (line 52) | public void setId(int id) {
    method getPassword (line 56) | public String getPassword() {
    method setPassword (line 60) | public void setPassword(String password) {
    method getToken (line 64) | public String getToken() {
    method setToken (line 68) | public void setToken(String token) {
    method getType (line 72) | public int getType() {
    method setType (line 76) | public void setType(int type) {
    method getUsername (line 80) | public String getUsername() {
    method setUsername (line 84) | public void setUsername(String username) {
    method getChapterTops (line 88) | public List<?> getChapterTops() {
    method setChapterTops (line 92) | public void setChapterTops(List<?> chapterTops) {
    method getCollectIds (line 96) | public List<Integer> getCollectIds() {
    method setCollectIds (line 100) | public void setCollectIds(List<Integer> collectIds) {

FILE: lib_common/src/main/java/com/senon/lib_common/bean/ProjectArticle.java
  class ProjectArticle (line 9) | public class ProjectArticle {
    method getCurPage (line 29) | public int getCurPage() {
    method setCurPage (line 33) | public void setCurPage(int curPage) {
    method getOffset (line 37) | public int getOffset() {
    method setOffset (line 41) | public void setOffset(int offset) {
    method isOver (line 45) | public boolean isOver() {
    method setOver (line 49) | public void setOver(boolean over) {
    method getPageCount (line 53) | public int getPageCount() {
    method setPageCount (line 57) | public void setPageCount(int pageCount) {
    method getSize (line 61) | public int getSize() {
    method setSize (line 65) | public void setSize(int size) {
    method getTotal (line 69) | public int getTotal() {
    method setTotal (line 73) | public void setTotal(int total) {
    method getDatas (line 77) | public List<DatasBean> getDatas() {
    method setDatas (line 81) | public void setDatas(List<DatasBean> datas) {
    class DatasBean (line 85) | public static class DatasBean {
      method getApkLink (line 136) | public String getApkLink() {
      method setApkLink (line 140) | public void setApkLink(String apkLink) {
      method getAuthor (line 144) | public String getAuthor() {
      method setAuthor (line 148) | public void setAuthor(String author) {
      method getChapterId (line 152) | public int getChapterId() {
      method setChapterId (line 156) | public void setChapterId(int chapterId) {
      method getChapterName (line 160) | public String getChapterName() {
      method setChapterName (line 164) | public void setChapterName(String chapterName) {
      method isCollect (line 168) | public boolean isCollect() {
      method setCollect (line 172) | public void setCollect(boolean collect) {
      method getCourseId (line 176) | public int getCourseId() {
      method setCourseId (line 180) | public void setCourseId(int courseId) {
      method getDesc (line 184) | public String getDesc() {
      method setDesc (line 188) | public void setDesc(String desc) {
      method getEnvelopePic (line 192) | public String getEnvelopePic() {
      method setEnvelopePic (line 196) | public void setEnvelopePic(String envelopePic) {
      method isFresh (line 200) | public boolean isFresh() {
      method setFresh (line 204) | public void setFresh(boolean fresh) {
      method getId (line 208) | public int getId() {
      method setId (line 212) | public void setId(int id) {
      method getLink (line 216) | public String getLink() {
      method setLink (line 220) | public void setLink(String link) {
      method getNiceDate (line 224) | public String getNiceDate() {
      method setNiceDate (line 228) | public void setNiceDate(String niceDate) {
      method getOrigin (line 232) | public String getOrigin() {
      method setOrigin (line 236) | public void setOrigin(String origin) {
      method getProjectLink (line 240) | public String getProjectLink() {
      method setProjectLink (line 244) | public void setProjectLink(String projectLink) {
      method getPublishTime (line 248) | public long getPublishTime() {
      method setPublishTime (line 252) | public void setPublishTime(long publishTime) {
      method getSuperChapterId (line 256) | public int getSuperChapterId() {
      method setSuperChapterId (line 260) | public void setSuperChapterId(int superChapterId) {
      method getSuperChapterName (line 264) | public String getSuperChapterName() {
      method setSuperChapterName (line 268) | public void setSuperChapterName(String superChapterName) {
      method getTitle (line 272) | public String getTitle() {
      method setTitle (line 276) | public void setTitle(String title) {
      method getType (line 280) | public int getType() {
      method setType (line 284) | public void setType(int type) {
      method getUserId (line 288) | public int getUserId() {
      method setUserId (line 292) | public void setUserId(int userId) {
      method getVisible (line 296) | public int getVisible() {
      method setVisible (line 300) | public void setVisible(int visible) {
      method getZan (line 304) | public int getZan() {
      method setZan (line 308) | public void setZan(int zan) {
      method getTags (line 312) | public List<TagsBean> getTags() {
      method setTags (line 316) | public void setTags(List<TagsBean> tags) {
      class TagsBean (line 320) | public static class TagsBean {
        method getName (line 329) | public String getName() {
        method setName (line 333) | public void setName(String name) {
        method getUrl (line 337) | public String getUrl() {
        method setUrl (line 341) | public void setUrl(String url) {

FILE: lib_common/src/main/java/com/senon/lib_common/bean/WXarticle.java
  class WXarticle (line 9) | public class WXarticle {
    method getCurPage (line 30) | public int getCurPage() {
    method setCurPage (line 34) | public void setCurPage(int curPage) {
    method getOffset (line 38) | public int getOffset() {
    method setOffset (line 42) | public void setOffset(int offset) {
    method isOver (line 46) | public boolean isOver() {
    method setOver (line 50) | public void setOver(boolean over) {
    method getPageCount (line 54) | public int getPageCount() {
    method setPageCount (line 58) | public void setPageCount(int pageCount) {
    method getSize (line 62) | public int getSize() {
    method setSize (line 66) | public void setSize(int size) {
    method getTotal (line 70) | public int getTotal() {
    method setTotal (line 74) | public void setTotal(int total) {
    method getDatas (line 78) | public List<DatasBean> getDatas() {
    method setDatas (line 82) | public void setDatas(List<DatasBean> datas) {
    class DatasBean (line 86) | public static class DatasBean {
      method getApkLink (line 137) | public String getApkLink() {
      method setApkLink (line 141) | public void setApkLink(String apkLink) {
      method getAuthor (line 145) | public String getAuthor() {
      method setAuthor (line 149) | public void setAuthor(String author) {
      method getChapterId (line 153) | public int getChapterId() {
      method setChapterId (line 157) | public void setChapterId(int chapterId) {
      method getChapterName (line 161) | public String getChapterName() {
      method setChapterName (line 165) | public void setChapterName(String chapterName) {
      method isCollect (line 169) | public boolean isCollect() {
      method setCollect (line 173) | public void setCollect(boolean collect) {
      method getCourseId (line 177) | public int getCourseId() {
      method setCourseId (line 181) | public void setCourseId(int courseId) {
      method getDesc (line 185) | public String getDesc() {
      method setDesc (line 189) | public void setDesc(String desc) {
      method getEnvelopePic (line 193) | public String getEnvelopePic() {
      method setEnvelopePic (line 197) | public void setEnvelopePic(String envelopePic) {
      method isFresh (line 201) | public boolean isFresh() {
      method setFresh (line 205) | public void setFresh(boolean fresh) {
      method getId (line 209) | public int getId() {
      method setId (line 213) | public void setId(int id) {
      method getLink (line 217) | public String getLink() {
      method setLink (line 221) | public void setLink(String link) {
      method getNiceDate (line 225) | public String getNiceDate() {
      method setNiceDate (line 229) | public void setNiceDate(String niceDate) {
      method getOrigin (line 233) | public String getOrigin() {
      method setOrigin (line 237) | public void setOrigin(String origin) {
      method getProjectLink (line 241) | public String getProjectLink() {
      method setProjectLink (line 245) | public void setProjectLink(String projectLink) {
      method getPublishTime (line 249) | public long getPublishTime() {
      method setPublishTime (line 253) | public void setPublishTime(long publishTime) {
      method getSuperChapterId (line 257) | public int getSuperChapterId() {
      method setSuperChapterId (line 261) | public void setSuperChapterId(int superChapterId) {
      method getSuperChapterName (line 265) | public String getSuperChapterName() {
      method setSuperChapterName (line 269) | public void setSuperChapterName(String superChapterName) {
      method getTitle (line 273) | public String getTitle() {
      method setTitle (line 277) | public void setTitle(String title) {
      method getType (line 281) | public int getType() {
      method setType (line 285) | public void setType(int type) {
      method getUserId (line 289) | public int getUserId() {
      method setUserId (line 293) | public void setUserId(int userId) {
      method getVisible (line 297) | public int getVisible() {
      method setVisible (line 301) | public void setVisible(int visible) {
      method getZan (line 305) | public int getZan() {
      method setZan (line 309) | public void setZan(int zan) {
      method getTags (line 313) | public List<TagsBean> getTags() {
      method setTags (line 317) | public void setTags(List<TagsBean> tags) {
      class TagsBean (line 321) | public static class TagsBean {
        method getName (line 330) | public String getName() {
        method setName (line 334) | public void setName(String name) {
        method getUrl (line 338) | public String getUrl() {
        method setUrl (line 342) | public void setUrl(String url) {

FILE: lib_common/src/main/java/com/senon/lib_common/bean/WXchapters.java
  class WXchapters (line 9) | public class WXchapters {
    method getCourseId (line 31) | public int getCourseId() {
    method setCourseId (line 35) | public void setCourseId(int courseId) {
    method getId (line 39) | public int getId() {
    method setId (line 43) | public void setId(int id) {
    method getName (line 47) | public String getName() {
    method setName (line 51) | public void setName(String name) {
    method getOrder (line 55) | public int getOrder() {
    method setOrder (line 59) | public void setOrder(int order) {
    method getParentChapterId (line 63) | public int getParentChapterId() {
    method setParentChapterId (line 67) | public void setParentChapterId(int parentChapterId) {
    method isUserControlSetTop (line 71) | public boolean isUserControlSetTop() {
    method setUserControlSetTop (line 75) | public void setUserControlSetTop(boolean userControlSetTop) {
    method getVisible (line 79) | public int getVisible() {
    method setVisible (line 83) | public void setVisible(int visible) {
    method getChildren (line 87) | public List<?> getChildren() {
    method setChildren (line 91) | public void setChildren(List<?> children) {

FILE: lib_common/src/main/java/com/senon/lib_common/common/contract/LoginContract.java
  type LoginContract (line 14) | public interface LoginContract {
    type View (line 17) | interface View extends BaseViewImp {
      method getLoginResult (line 19) | void getLoginResult(BaseResponse<Login> data);
      method getRegisterResult (line 21) | void getRegisterResult(BaseResponse<Login> data);
    class Presenter (line 26) | abstract class Presenter extends BasePresenter<View> {
      method getLogin (line 28) | public abstract void getLogin(HashMap<String, String> map, boolean i...
      method getRegister (line 30) | public abstract void getRegister(HashMap<String, String> map, boolea...

FILE: lib_common/src/main/java/com/senon/lib_common/common/contract/WebviewContract.java
  type WebviewContract (line 14) | public interface WebviewContract {
    type View (line 17) | interface View extends BaseViewImp {
      method getCollectResult (line 19) | void getCollectResult(int id,boolean isCollect);
      method getCollFailResult (line 21) | void getCollFailResult(int id);
    class Presenter (line 26) | abstract class Presenter extends BasePresenter<View> {
      method getCollect (line 28) | public abstract void getCollect(int id ,boolean isDialog, boolean ca...
      method getUnollect (line 30) | public abstract void getUnollect(int id, boolean isDialog, boolean c...

FILE: lib_common/src/main/java/com/senon/lib_common/common/presenter/LoginPresenter.java
  class LoginPresenter (line 19) | public class LoginPresenter extends LoginContract.Presenter {
    method LoginPresenter (line 23) | public LoginPresenter(Context context) {
    method getLogin (line 27) | @Override
    method getRegister (line 50) | @Override

FILE: lib_common/src/main/java/com/senon/lib_common/common/presenter/WebviewPresenter.java
  class WebviewPresenter (line 18) | public class WebviewPresenter extends WebviewContract.Presenter {
    method WebviewPresenter (line 21) | public WebviewPresenter(Context context) {
    method getCollect (line 25) | @Override
    method getUnollect (line 50) | @Override

FILE: lib_common/src/main/java/com/senon/lib_common/common/ui/Common_LoginActivity.java
  class Common_LoginActivity (line 30) | @Route(path = ConstantLoginArouter.PATH_COMMON_LOGINACTIVITY)
    method getLayoutId (line 40) | @Override
    method createPresenter (line 46) | @Override
    method createView (line 51) | @Override
    method init (line 56) | @Override
    method getLoginResult (line 68) | @Override
    method getRegisterResult (line 88) | @Override
    method onClick (line 92) | public void onClick(View view) {
    method onDestroy (line 125) | @Override
    method onEventReceived (line 131) | @Subscribe(threadMode = ThreadMode.MAIN) //在ui线程执行

FILE: lib_common/src/main/java/com/senon/lib_common/common/ui/Common_RegisterActivity.java
  class Common_RegisterActivity (line 30) | @Route(path = ConstantArouter.PATH_COMMON_REGISTERACTIVITY)
    method getLayoutId (line 39) | @Override
    method createPresenter (line 45) | @Override
    method createView (line 50) | @Override
    method init (line 55) | @Override
    method getLoginResult (line 69) | @Override
    method getRegisterResult (line 73) | @Override
    method onClick (line 93) | public void onClick(View view) {

FILE: lib_common/src/main/java/com/senon/lib_common/common/ui/Common_WebviewActivity.java
  class Common_WebviewActivity (line 32) | @Route(path = ConstantArouter.PATH_COMMON_WEBVIEWCTIVITY)
    method getLayoutId (line 50) | @Override
    method createPresenter (line 56) | @Override
    method createView (line 61) | @Override
    method init (line 66) | @Override
    method initClickListener (line 79) | private void initClickListener() {
    method initWebView (line 115) | private void initWebView() {
    method getCollectResult (line 176) | @Override
    method getCollFailResult (line 185) | @Override

FILE: lib_common/src/main/java/com/senon/lib_common/net/RequestInterceptor.java
  class RequestInterceptor (line 15) | public class RequestInterceptor implements Interceptor {
    method RequestInterceptor (line 19) | private RequestInterceptor() {
    method getInstance (line 24) | public static RequestInterceptor getInstance() {
    method intercept (line 35) | @Override
    method fetchHeaderInfo (line 44) | private String fetchHeaderInfo() {

FILE: lib_common/src/main/java/com/senon/lib_common/net/ServerUtils.java
  class ServerUtils (line 31) | public class ServerUtils {
    method getCommonApi (line 37) | public static BaseApi getCommonApi() {
    method createService (line 52) | private static <S> S createService(Class<S> serviceClass, String url) ...
    method intercept (line 65) | @Override
    method getLogInterceptor (line 111) | private static HttpLoggingInterceptor getLogInterceptor() {
    method getSSLSocketFactory (line 127) | private static SSLSocketFactory getSSLSocketFactory() {

FILE: lib_common/src/main/java/com/senon/lib_common/net/callback/ErrorListener.java
  type ErrorListener (line 5) | public interface ErrorListener {
    method handleError (line 6) | void handleError(Throwable e);

FILE: lib_common/src/main/java/com/senon/lib_common/net/callback/RequestCallback.java
  class RequestCallback (line 14) | public abstract class RequestCallback<T> implements Observer<T>,Progress...
    method RequestCallback (line 22) | public RequestCallback(Context context,ErrorListener errorListener) {
    method RequestCallback (line 30) | public RequestCallback(Context context,ErrorListener errorListener,boo...
    method RequestCallback (line 34) | public RequestCallback(Context context,ErrorListener errorListener,boo...
    method showProgressDialog (line 43) | private void showProgressDialog() {
    method dismissProgressDialog (line 49) | private void dismissProgressDialog() {
    method onSubscribe (line 56) | @Override
    method onNext (line 63) | @Override
    method onError (line 68) | @Override
    method onComplete (line 78) | @Override
    method onCancelProgress (line 84) | @Override

FILE: lib_common/src/main/java/com/senon/lib_common/net/callback/RxErrorHandler.java
  class RxErrorHandler (line 7) | public class RxErrorHandler implements ErrorListener {
    method RxErrorHandler (line 11) | private RxErrorHandler() {
    method getInstance (line 14) | public static RxErrorHandler getInstance() {
    method handleError (line 25) | @Override

FILE: lib_common/src/main/java/com/senon/lib_common/net/cookies/CookiesManager.java
  class CookiesManager (line 16) | public class CookiesManager implements CookieJar {
    method saveFromResponse (line 20) | @Override
    method loadForRequest (line 29) | @Override
    method clearAllCookies (line 37) | public static void clearAllCookies() {
    method clearCookies (line 48) | public static boolean clearCookies(HttpUrl url, Cookie cookie) {
    method getCookies (line 57) | public static List<Cookie> getCookies() {

FILE: lib_common/src/main/java/com/senon/lib_common/net/cookies/OkHttpCookies.java
  class OkHttpCookies (line 14) | class OkHttpCookies implements Serializable {
    method OkHttpCookies (line 19) | OkHttpCookies(Cookie cookies) {
    method getCookies (line 23) | Cookie getCookies() {
    method writeObject (line 31) | private void writeObject(ObjectOutputStream out) throws IOException {
    method readObject (line 43) | private void readObject(ObjectInputStream in) throws IOException, Clas...

FILE: lib_common/src/main/java/com/senon/lib_common/net/cookies/PersistentCookieStore.java
  class PersistentCookieStore (line 25) | public class PersistentCookieStore {
    method init (line 35) | public static void init(Context context){
    method getCookieStore (line 39) | public static PersistentCookieStore getCookieStore(){
    method PersistentCookieStore (line 43) | private PersistentCookieStore(Context context) {
    method getCookieToken (line 66) | private String getCookieToken(Cookie cookie) {
    method add (line 70) | public void add(HttpUrl url, Cookie cookie) {
    method get (line 92) | public List<Cookie> get(HttpUrl url) {
    method removeAll (line 100) | void removeAll() {
    method saveUserInfo (line 107) | public void saveUserInfo(String username,String password){
    method isLogin (line 115) | public boolean isLogin(){
    method getUsername (line 122) | public String getUsername(){
    method remove (line 130) | boolean remove(HttpUrl url, Cookie cookie) {
    method getCookies (line 149) | List<Cookie> getCookies() {
    method encodeCookie (line 163) | private String encodeCookie(OkHttpCookies cookie) {
    method decodeCookie (line 185) | private Cookie decodeCookie(String cookieString) {
    method byteArrayToHexString (line 207) | private String byteArrayToHexString(byte[] bytes) {
    method hexStringToByteArray (line 225) | private byte[] hexStringToByteArray(String hexString) {

FILE: lib_common/src/main/java/com/senon/lib_common/net/progress/ProgressCancelListener.java
  type ProgressCancelListener (line 6) | public interface ProgressCancelListener {
    method onCancelProgress (line 7) | void onCancelProgress();

FILE: lib_common/src/main/java/com/senon/lib_common/net/progress/ProgressDialogHandler.java
  class ProgressDialogHandler (line 12) | public class ProgressDialogHandler extends Handler {
    method ProgressDialogHandler (line 21) | public ProgressDialogHandler(Context context, ProgressCancelListener m...
    method initProgressDialog (line 28) | private void initProgressDialog() {
    method dismissProgressDialog (line 50) | private void dismissProgressDialog() {
    method handleMessage (line 57) | @Override

FILE: lib_common/src/main/java/com/senon/lib_common/service/InitializeService.java
  class InitializeService (line 17) | public class InitializeService extends IntentService {
    method InitializeService (line 21) | public InitializeService() {
    method start (line 25) | public static void start(Context context) {
    method onHandleIntent (line 31) | @Override
    method initApplication (line 43) | private void initApplication() {

FILE: lib_common/src/main/java/com/senon/lib_common/utils/ACache.java
  class ACache (line 38) | public class ACache {
    method get (line 48) | public static ACache get(Context ctx) {
    method get (line 53) | public static ACache get(Context ctx, String cacheName) {
    method get (line 59) | public static ACache get(File cacheDir) {
    method get (line 64) | public static ACache get(Context ctx, long max_zise, int max_count) {
    method get (line 70) | public static ACache get(File cacheDir, long max_zise, int max_count) {
    method deleteDir (line 79) | public static boolean deleteDir(File dir) {
    method getCacheSize (line 93) | public static String getCacheSize(File file) {
    method getFolderSize (line 97) | public static long getFolderSize(File file) {
    method getFormatSize (line 115) | public static String getFormatSize(double size) {
    method myPid (line 148) | private static String myPid() {
    method ACache (line 153) | private ACache(File cacheDir, long max_size, int max_count) {
    method put (line 171) | public void put(String key, String value) {
    method put (line 200) | public void put(String key, String value, int saveTime) {
    method getAsString (line 210) | public String getAsString(String key) {
    method put (line 254) | public void put(String key, JSONObject value) {
    method put (line 266) | public void put(String key, JSONObject value, int saveTime) {
    method getAsJSONObject (line 276) | public JSONObject getAsJSONObject(String key) {
    method put (line 298) | public void put(String key, JSONArray value) {
    method put (line 310) | public void put(String key, JSONArray value, int saveTime) {
    method getAsJSONArray (line 320) | public JSONArray getAsJSONArray(String key) {
    method put (line 342) | public void put(String key, byte[] value) {
    method put (line 371) | public void put(String key, byte[] value, int saveTime) {
    method getAsBinary (line 381) | public byte[] getAsBinary(String key) {
    method put (line 423) | public void put(String key, Serializable value) {
    method put (line 435) | public void put(String key, Serializable value, int saveTime) {
    method getAsObject (line 465) | public Object getAsObject(String key) {
    method put (line 505) | public void put(String key, Bitmap value) {
    method put (line 517) | public void put(String key, Bitmap value, int saveTime) {
    method getAsBitmap (line 527) | public Bitmap getAsBitmap(String key) {
    method put (line 545) | public void put(String key, Drawable value) {
    method put (line 557) | public void put(String key, Drawable value, int saveTime) {
    method getAsDrawable (line 567) | public Drawable getAsDrawable(String key) {
    method file (line 580) | public File file(String key) {
    method remove (line 592) | public boolean remove(String key) {
    method clear (line 600) | public void clear() {
    class ACacheManager (line 610) | public class ACacheManager {
      method ACacheManager (line 619) | private ACacheManager(File cacheDir, long sizeLimit, int countLimit) {
      method calculateCacheSizeAndCacheCount (line 632) | private void calculateCacheSizeAndCacheCount() {
      method put (line 652) | private void put(File file) {
      method get (line 676) | private File get(String key) {
      method newFile (line 686) | private File newFile(String key) {
      method remove (line 691) | private boolean remove(String key) {
      method clear (line 697) | private void clear() {
      method removeNext (line 712) | private long removeNext() {
      method calculateSize (line 744) | private long calculateSize(File file) {
    class Utils (line 754) | private static class Utils {
      method isDue (line 761) | private static boolean isDue(String str) {
      method isDue (line 771) | private static boolean isDue(byte[] data) {
      method newStringWithDateInfo (line 788) | private static String newStringWithDateInfo(int second, String strIn...
      method newByteArrayWithDateInfo (line 793) | private static byte[] newByteArrayWithDateInfo(int second, byte[] da...
      method clearDateInfo (line 802) | private static String clearDateInfo(String strInfo) {
      method clearDateInfo (line 810) | private static byte[] clearDateInfo(byte[] data) {
      method hasDateInfo (line 818) | private static boolean hasDateInfo(byte[] data) {
      method getDateInfoFromDate (line 823) | private static String[] getDateInfoFromDate(byte[] data) {
      method indexOf (line 833) | private static int indexOf(byte[] data, char c) {
      method copyOfRange (line 843) | private static byte[] copyOfRange(byte[] original, int from, int to) {
      method createDateInfo (line 855) | private static String createDateInfo(int second) {
      method Bitmap2Bytes (line 867) | private static byte[] Bitmap2Bytes(Bitmap bm) {
      method Bytes2Bimap (line 880) | private static Bitmap Bytes2Bimap(byte[] b) {
      method drawable2Bitmap (line 891) | private static Bitmap drawable2Bitmap(Drawable drawable) {
      method bitmap2Drawable (line 916) | @SuppressWarnings("deprecation") private static Drawable bitmap2Draw...

FILE: lib_common/src/main/java/com/senon/lib_common/utils/BaseEvent.java
  class BaseEvent (line 6) | public class BaseEvent<T> {
    method getCode (line 28) | public int getCode() {
    method setCode (line 32) | public void setCode(int code) {
    method getMsg (line 36) | public String getMsg() {
    method setMsg (line 40) | public void setMsg(String msg) {
    method getData (line 44) | public T getData() {
    method setData (line 48) | public void setData(T data) {
    method isCollect (line 52) | public boolean isCollect() {
    method setCollect (line 56) | public void setCollect(boolean collect) {
    method getId (line 60) | public int getId() {
    method setId (line 64) | public void setId(int id) {
    method isIngored (line 68) | public boolean isIngored() {
    method setIngored (line 72) | public void setIngored(boolean ingored) {

FILE: lib_common/src/main/java/com/senon/lib_common/utils/ConstantUtils.java
  class ConstantUtils (line 10) | public class ConstantUtils {
    method init (line 16) | public static void init(Context context) {
    method getAPPContext (line 24) | public static Context getAPPContext() {
    method isAppDebug (line 33) | public static boolean isAppDebug() {

FILE: lib_common/src/main/java/com/senon/lib_common/utils/LogUtils.java
  class LogUtils (line 10) | public class LogUtils {
    method setLogEnable (line 18) | public static void setLogEnable(boolean enable) {
    method v (line 22) | public static void v(String mess) {
    method d (line 28) | public static void d(String mess) {
    method i (line 34) | public static void i(String mess) {
    method w (line 40) | public static void w(String mess) {
    method e (line 46) | public static void e(String mess) {
    method log (line 52) | public static void log(String tag, String msg){
    method getTag (line 64) | private static String getTag() {
    method buildMessage (line 80) | private static String buildMessage(String msg) {

FILE: lib_common/src/main/java/com/senon/lib_common/utils/MD5Utils.java
  class MD5Utils (line 9) | public class MD5Utils {
    method getMd5 (line 11) | public static String getMd5(String plainText) {

FILE: lib_common/src/main/java/com/senon/lib_common/utils/PreferenceTool.java
  class PreferenceTool (line 13) | public class PreferenceTool {
    method init (line 20) | public static void init(Context context) {
    method clear (line 25) | public static void clear() {
    method commit (line 30) | public static void commit() {
    method apply (line 35) | public static void apply() {
    method contains (line 40) | public static boolean contains(String key) {
    method getFloat (line 44) | public static float getFloat(String key, float defValue) {
    method getInt (line 48) | public static int getInt(String key, int defValue) {
    method getLong (line 52) | public static long getLong(String key, long defValue) {
    method getString (line 56) | public static String getString(String key) {
    method getString (line 60) | public static String getString(String key, String defValue) {
    method getBoolean (line 64) | public static boolean getBoolean(String key, boolean defValue) {
    method getAll (line 68) | public static Map<String, ?> getAll() {
    method putFloat (line 74) | public static void putFloat(String key, float value) {
    method putInt (line 79) | public static void putInt(String key, int value) {
    method putLong (line 84) | public static void putLong(String key, long value) {
    method putString (line 89) | public static void putString(String key, String value) {
    method putBoolean (line 94) | public static void putBoolean(String key, boolean value) {
    method remove (line 99) | public static void remove(String key) {

FILE: lib_common/src/main/java/com/senon/lib_common/utils/RetryWithDelay.java
  class RetryWithDelay (line 11) | public class RetryWithDelay implements Function<Observable<Throwable>, O...
    method RetryWithDelay (line 17) | public RetryWithDelay(int maxRetries, int retryDelaySecond) {
    method apply (line 22) | @Override

FILE: lib_common/src/main/java/com/senon/lib_common/utils/RxUtils.java
  class RxUtils (line 19) | public class RxUtils {
    method bindToLifecycle (line 21) | public static <T> LifecycleTransformer<T> bindToLifecycle(BaseViewImp ...
    method bindActivityUntilEvent (line 31) | public static <T> LifecycleTransformer<T> bindActivityUntilEvent(BaseV...
    method bindFragmentUntilEvent (line 39) | public static <T> LifecycleTransformer<T> bindFragmentUntilEvent(BaseV...
    method getSchedulerTransformer (line 47) | public static <T> ObservableTransformer<T, T> getSchedulerTransformer(){

FILE: lib_common/src/main/java/com/senon/lib_common/utils/StatusBarUtils.java
  class StatusBarUtils (line 23) | public class StatusBarUtils {
    method StatusBarUtils (line 36) | public StatusBarUtils(Activity activity) {
    method with (line 40) | public static StatusBarUtils with(Activity activity) {
    method getColor (line 44) | public int getColor() {
    method setColor (line 48) | public StatusBarUtils setColor(int color) {
    method getDrawable (line 53) | public Drawable getDrawable() {
    method setDrawable (line 57) | public StatusBarUtils setDrawable(Drawable drawable) {
    method isDrawerLayout (line 62) | public boolean isDrawerLayout() {
    method isActionBar (line 66) | public boolean isActionBar() {
    method setIsActionBar (line 70) | public StatusBarUtils setIsActionBar(boolean actionBar) {
    method setDrawerLayoutContentId (line 82) | public StatusBarUtils setDrawerLayoutContentId(boolean drawerLayout, i...
    method init (line 88) | public void init() {
    method clearActionBarShadow (line 114) | public StatusBarUtils clearActionBarShadow() {
    method fitsSystemWindows (line 129) | private void fitsSystemWindows(Activity activity) {
    method getStatusBarHeight (line 148) | public static int getStatusBarHeight(Activity activity) {
    method getActionBarHeight (line 165) | public static int getActionBarHeight(Context context) {
    method addStatusViewWithColor (line 180) | private void addStatusViewWithColor(Activity activity, int color) {
    method addStatusViewWithDrawble (line 230) | private void addStatusViewWithDrawble(Activity activity, Drawable draw...
    method fullScreen (line 276) | private void fullScreen(Activity activity) {
    method setStatusTransparent (line 308) | public static void setStatusTransparent(Activity activity) {

FILE: lib_common/src/main/java/com/senon/lib_common/utils/ToastUtil.java
  class ToastUtil (line 20) | public class ToastUtil {
    method init (line 30) | public static void init(Context con){
    method initToast (line 34) | public static void initToast(String msg) {
    method initToast (line 38) | public static void initToast(int resId, Context context) {
    method initToast (line 44) | public static void initToast(String msg, Context context, boolean isSi...
    method setGravity (line 59) | public static void setGravity(int gravity, int xOffset, int yOffset) {
    method setView (line 63) | public void setView(View view) {
    method showInThread (line 71) | public static void showInThread(@NonNull final Context context, final ...
    method showByDuration (line 90) | public static void showByDuration(Context context, String msg, int dur...
    method run (line 100) | public void run() {
    method cancel (line 113) | private static void cancel() {
    method showToast (line 120) | private static Toast showToast(Context context, String msg, int durati...

FILE: lib_common/src/test/java/com/senon/lib_common/ExampleUnitTest.java
  class ExampleUnitTest (line 12) | public class ExampleUnitTest {
    method addition_isCorrect (line 13) | @Test

FILE: lib_opensource/src/androidTest/java/com/senon/lib_opensource/ExampleInstrumentedTest.java
  class ExampleInstrumentedTest (line 17) | @RunWith(AndroidJUnit4.class)
    method useAppContext (line 19) | @Test

FILE: lib_opensource/src/test/java/com/senon/lib_opensource/ExampleUnitTest.java
  class ExampleUnitTest (line 12) | public class ExampleUnitTest {
    method addition_isCorrect (line 13) | @Test

FILE: module_art/src/androidTest/java/com/senon/module_art/ExampleInstrumentedTest.java
  class ExampleInstrumentedTest (line 17) | @RunWith(AndroidJUnit4.class)
    method useAppContext (line 19) | @Test

FILE: module_art/src/main/java/com/senon/module_art/App_Art.java
  class App_Art (line 10) | public class App_Art extends BaseApplication {
    method onCreate (line 11) | @Override
    method initARouter (line 18) | private void initARouter() {

FILE: module_art/src/main/java/com/senon/module_art/MainActivity.java
  class MainActivity (line 21) | @Route(path = ConstantLoginArouter.PATH_ART_MAINACTIVITY)
    method onCreate (line 27) | @Override
    method findView (line 40) | private void findView() {
    class MyFragmentPagerAdapter (line 50) | class MyFragmentPagerAdapter extends FragmentPagerAdapter {
      method MyFragmentPagerAdapter (line 51) | public MyFragmentPagerAdapter(FragmentManager fm) {
      method getItem (line 54) | @Override
      method getCount (line 58) | @Override

FILE: module_art/src/main/java/com/senon/module_art/SplashActivity.java
  class SplashActivity (line 10) | public class SplashActivity extends AppCompatActivity {
    method onCreate (line 12) | @Override

FILE: module_art/src/main/java/com/senon/module_art/adapter/ArtMainAdapter.java
  class ArtMainAdapter (line 29) | public class ArtMainAdapter extends RecyclerView.Adapter<RecyclerView.Vi...
    method notifyDataChanged (line 41) | public void notifyDataChanged() {
    method setArticleDatas (line 47) | public void setArticleDatas(List<WXarticle.DatasBean> datas) {
    method setChaptersDatas (line 55) | public void setChaptersDatas(List<WXchapters> datas,int id) {
    method ArtMainAdapter (line 64) | public ArtMainAdapter(Context context) {
    method onCreateViewHolder (line 68) | @Override
    method onBindViewHolder (line 80) | @Override
    method getItemCount (line 145) | @Override
    method getItemViewType (line 150) | @Override
    method isHeadView (line 158) | public boolean isHeadView(int position) {
    method onClick (line 162) | @Override
    class HeaderViewHolder (line 170) | class HeaderViewHolder extends RecyclerView.ViewHolder {
      method HeaderViewHolder (line 173) | public HeaderViewHolder(View itemView) {
    class OneViewHolder (line 180) | class OneViewHolder extends RecyclerView.ViewHolder {
      method OneViewHolder (line 186) | public OneViewHolder(View itemView) {
    method setOnItemClickListener (line 199) | public void setOnItemClickListener(OnItemClickListener onItemClickList...
    type OnItemClickListener (line 202) | public interface OnItemClickListener {
      method onHeadItemClick (line 203) | void onHeadItemClick(View view, int position,int mId);
      method onItemClick (line 204) | void onItemClick(View view, int position);

FILE: module_art/src/main/java/com/senon/module_art/contract/ArtMainFragmentCon.java
  type ArtMainFragmentCon (line 17) | public interface ArtMainFragmentCon {
    type View (line 19) | interface View extends BaseViewImp {
      method getWXartChapResult (line 21) | void getWXartChapResult(BaseResponse<List<WXchapters>> data);
      method getWXartListResult (line 23) | void getWXartListResult(BaseResponse<WXarticle> data);
    class Presenter (line 28) | abstract class Presenter extends BasePresenter<View> {
      method getWXarticleChapters (line 30) | public abstract void getWXarticleChapters(boolean isDialog, boolean ...
      method getWXarticleList (line 32) | public abstract void getWXarticleList(int id,int page,boolean isDial...

FILE: module_art/src/main/java/com/senon/module_art/fragment/ArtMainFragment.java
  class ArtMainFragment (line 38) | public class ArtMainFragment extends BaseLazyFragment<ArtMainFragmentCon...
    method getLayoutId (line 54) | @Override
    method createPresenter (line 58) | @Override
    method createView (line 62) | @Override
    method init (line 66) | @Override
    method onFragmentFirst (line 81) | @Override
    method addLrvListener (line 97) | private void addLrvListener() {
    method initAdapter (line 129) | private void initAdapter() {
    method getWXarticleChapters (line 164) | private void getWXarticleChapters(){
    method getWXarticleList (line 169) | private void getWXarticleList(int id,int page){
    method refreshData (line 174) | private void refreshData(){
    method onFragmentVisble (line 180) | @Override
    method getWXartChapResult (line 189) | @Override
    method getWXartListResult (line 209) | @Override
    method onDestroyView (line 224) | @Override
    method onEventReceived (line 230) | @Subscribe(threadMode = ThreadMode.MAIN) //在ui线程执行

FILE: module_art/src/main/java/com/senon/module_art/presenter/ArtMainFragmentPre.java
  class ArtMainFragmentPre (line 22) | public class ArtMainFragmentPre extends ArtMainFragmentCon.Presenter{
    method ArtMainFragmentPre (line 25) | public ArtMainFragmentPre(Context context) {
    method getWXarticleChapters (line 29) | @Override
    method getWXarticleList (line 52) | @Override

FILE: module_art/src/test/java/com/senon/module_art/ExampleUnitTest.java
  class ExampleUnitTest (line 12) | public class ExampleUnitTest {
    method addition_isCorrect (line 13) | @Test

FILE: module_home/src/androidTest/java/com/senon/module_home/ExampleInstrumentedTest.java
  class ExampleInstrumentedTest (line 17) | @RunWith(AndroidJUnit4.class)
    method useAppContext (line 19) | @Test

FILE: module_home/src/main/java/com/senon/module_home/App_Home.java
  class App_Home (line 10) | public class App_Home extends BaseApplication {
    method onCreate (line 11) | @Override
    method initARouter (line 18) | private void initARouter() {

FILE: module_home/src/main/java/com/senon/module_home/MainActivity.java
  class MainActivity (line 21) | @Route(path = ConstantLoginArouter.PATH_HOME_MAINACTIVITY)
    method onCreate (line 28) | @Override
    method findView (line 41) | private void findView() {
    class MyFragmentPagerAdapter (line 51) | class MyFragmentPagerAdapter extends FragmentPagerAdapter {
      method MyFragmentPagerAdapter (line 52) | public MyFragmentPagerAdapter(FragmentManager fm) {
      method getItem (line 55) | @Override
      method getCount (line 59) | @Override

FILE: module_home/src/main/java/com/senon/module_home/SplashActivity.java
  class SplashActivity (line 10) | public class SplashActivity extends AppCompatActivity {
    method onCreate (line 12) | @Override

FILE: module_home/src/main/java/com/senon/module_home/activity/HomeArticleActivity.java
  class HomeArticleActivity (line 44) | @Route(path = ConstantArouter.PATH_HOME_HOMEARTICLEACTIVITY)
    method getLayoutId (line 59) | @Override
    method createPresenter (line 64) | @Override
    method createView (line 68) | @Override
    method init (line 73) | @Override
    method initLRecyclerVeiw (line 97) | private void initLRecyclerVeiw() {
    method getFirstPageData (line 165) | private void getFirstPageData() {
    method getOrderList (line 171) | private void getOrderList() {
    method refreshData (line 175) | private void refreshData() {
    method getDataResult (line 185) | @Override
    method getCollectResult (line 204) | @Override
    method getCollFailResult (line 213) | @Override
    method onEventReceived (line 228) | @Subscribe(threadMode = ThreadMode.MAIN) //在ui线程执行
    method onDestroy (line 244) | @Override

FILE: module_home/src/main/java/com/senon/module_home/activity/HomeProjectActivity.java
  class HomeProjectActivity (line 40) | @Route(path = ConstantArouter.PATH_HOME_HOMEPROJECTACTIVITY)
    method getLayoutId (line 55) | @Override
    method createPresenter (line 60) | @Override
    method createView (line 64) | @Override
    method init (line 69) | @Override
    method initLRecyclerVeiw (line 93) | private void initLRecyclerVeiw() {
    method getFirstPageData (line 148) | private void getFirstPageData() {
    method getOrderList (line 154) | private void getOrderList() {
    method refreshData (line 158) | private void refreshData() {
    method getDataResult (line 168) | @Override
    method onEventReceived (line 187) | @Subscribe(threadMode = ThreadMode.MAIN) //在ui线程执行
    method onDestroy (line 203) | @Override

FILE: module_home/src/main/java/com/senon/module_home/adapter/HomeMainAdapter.java
  class HomeMainAdapter (line 30) | public class HomeMainAdapter extends RecyclerView.Adapter<RecyclerView.V...
    method notifyDataChanged (line 43) | public void notifyDataChanged() {
    method setBannerDatas (line 48) | public void setBannerDatas(List<Banner> datas) {
    method setBannerStatus (line 56) | public void setBannerStatus(int bannerRefresh){
    method setArticleDatas (line 62) | public void setArticleDatas(List<HomeArticle.DatasBean> datas) {
    method setProjectDatas (line 71) | public void setProjectDatas(List<ProjectArticle.DatasBean> datas) {
    method HomeMainAdapter (line 79) | public HomeMainAdapter(Context context) {
    method onCreateViewHolder (line 83) | @Override
    method onBindViewHolder (line 98) | @Override
    method getItemCount (line 199) | @Override
    method getItemViewType (line 204) | @Override
    method isHeadView (line 216) | public boolean isHeadView(int position) {
    method isItemOne (line 220) | public boolean isItemOne(int position) {
    method isItemTwo (line 229) | public boolean isItemTwo(int position) {
    method onClick (line 238) | @Override
    class HeaderViewHolder (line 246) | class HeaderViewHolder extends RecyclerView.ViewHolder {
      method HeaderViewHolder (line 249) | public HeaderViewHolder(View itemView) {
    class OneViewHolder (line 257) | class OneViewHolder extends RecyclerView.ViewHolder {
      method OneViewHolder (line 262) | public OneViewHolder(View itemView) {
    class TwoViewHolder (line 277) | class TwoViewHolder extends RecyclerView.ViewHolder {
      method TwoViewHolder (line 283) | public TwoViewHolder(View itemView) {
    method setOnItemClickListener (line 297) | public void setOnItemClickListener(OnItemClickListener onItemClickList...
    type OnItemClickListener (line 301) | public interface OnItemClickListener {
      method onHeadItemClick (line 302) | void onHeadItemClick(View view, int position);
      method onItemClick (line 304) | void onItemClick(View view, int position);
    class BannerViewHolder (line 307) | public static class BannerViewHolder implements MZViewHolder<Banner> {
      method createView (line 309) | @Override
      method onBind (line 316) | @Override

FILE: module_home/src/main/java/com/senon/module_home/contract/HomeArticleActivityCon.java
  type HomeArticleActivityCon (line 9) | public interface HomeArticleActivityCon {
    type View (line 11) | interface View extends BaseViewImp {
      method getDataResult (line 13) | void getDataResult(BaseResponse<HomeArticle> data);
      method getCollectResult (line 15) | void getCollectResult(int id,boolean isCollect);
      method getCollFailResult (line 17) | void getCollFailResult(int id);
    class Presenter (line 21) | abstract class Presenter extends BasePresenter<View> {
      method getData (line 23) | public abstract void getData(int page,boolean isDialog, boolean canc...
      method getCollect (line 25) | public abstract void getCollect(int id ,boolean isDialog, boolean ca...
      method getUnollect (line 27) | public abstract void getUnollect(int id, boolean isDialog, boolean c...

FILE: module_home/src/main/java/com/senon/module_home/contract/HomeMainFragmentCon.java
  type HomeMainFragmentCon (line 15) | public interface HomeMainFragmentCon {
    type View (line 17) | interface View extends BaseViewImp {
      method getBannerResult (line 19) | void getBannerResult(BaseResponse<List<Banner>> data);
      method getHomeArticleResult (line 21) | void getHomeArticleResult(BaseResponse<HomeArticle> data);
      method getHomeProjectResult (line 23) | void getHomeProjectResult(BaseResponse<ProjectArticle> data);
    class Presenter (line 27) | abstract class Presenter extends BasePresenter<View> {
      method getBanner (line 29) | public abstract void getBanner(boolean isDialog, boolean cancelable);
      method getHomeArticle (line 31) | public abstract void getHomeArticle(int page,boolean isDialog, boole...
      method getHomeProject (line 33) | public abstract void getHomeProject(int page,boolean isDialog, boole...

FILE: module_home/src/main/java/com/senon/module_home/contract/HomeProjectActivityCon.java
  type HomeProjectActivityCon (line 9) | public interface HomeProjectActivityCon {
    type View (line 11) | interface View extends BaseViewImp {
      method getDataResult (line 13) | void getDataResult(BaseResponse<ProjectArticle> data);
    class Presenter (line 17) | abstract class Presenter extends BasePresenter<View> {
      method getData (line 19) | public abstract void getData(int page,boolean isDialog, boolean canc...

FILE: module_home/src/main/java/com/senon/module_home/fragment/HomeMainFragment.java
  class HomeMainFragment (line 38) | public class HomeMainFragment extends BaseLazyFragment<HomeMainFragmentC...
    method getLayoutId (line 53) | @Override
    method createPresenter (line 57) | @Override
    method createView (line 61) | @Override
    method init (line 65) | @Override
    method onFragmentFirst (line 80) | @Override
    method addLrvListener (line 96) | private void addLrvListener() {
    method initAdapter (line 128) | private void initAdapter() {
    method getFirstData (line 145) | private void getFirstData(){
    method onFragmentVisble (line 154) | @Override
    method getBannerResult (line 162) | @Override
    method getHomeArticleResult (line 170) | @Override
    method getHomeProjectResult (line 188) | @Override
    method onResume (line 205) | @Override
    method onPause (line 212) | @Override
    method onDestroyView (line 220) | @Override
    method refreshData (line 227) | private void refreshData(){
    method onEventReceived (line 232) | @Subscribe(threadMode = ThreadMode.MAIN) //在ui线程执行

FILE: module_home/src/main/java/com/senon/module_home/presenter/HomeArticleActivityPre.java
  class HomeArticleActivityPre (line 19) | public class HomeArticleActivityPre extends HomeArticleActivityCon.Prese...
    method HomeArticleActivityPre (line 23) | public HomeArticleActivityPre(Context context) {
    method getData (line 27) | @Override
    method getCollect (line 50) | @Override
    method getUnollect (line 74) | @Override

FILE: module_home/src/main/java/com/senon/module_home/presenter/HomeMainFragmentPre.java
  class HomeMainFragmentPre (line 23) | public class HomeMainFragmentPre extends HomeMainFragmentCon.Presenter{
    method HomeMainFragmentPre (line 27) | public HomeMainFragmentPre(Context context) {
    method getBanner (line 31) | @Override
    method getHomeArticle (line 54) | @Override
    method getHomeProject (line 77) | @Override

FILE: module_home/src/main/java/com/senon/module_home/presenter/HomeProjectActivityPre.java
  class HomeProjectActivityPre (line 17) | public class HomeProjectActivityPre extends HomeProjectActivityCon.Prese...
    method HomeProjectActivityPre (line 21) | public HomeProjectActivityPre(Context context) {
    method getData (line 25) | @Override

FILE: module_home/src/test/java/com/senon/module_home/ExampleUnitTest.java
  class ExampleUnitTest (line 12) | public class ExampleUnitTest {
    method addition_isCorrect (line 13) | @Test

FILE: module_life/src/androidTest/java/com/senon/module_life/ExampleInstrumentedTest.java
  class ExampleInstrumentedTest (line 17) | @RunWith(AndroidJUnit4.class)
    method useAppContext (line 19) | @Test

FILE: module_life/src/main/java/com/senon/module_life/App_Life.java
  class App_Life (line 10) | public class App_Life extends BaseApplication {
    method onCreate (line 11) | @Override
    method initARouter (line 18) | private void initARouter() {

FILE: module_life/src/main/java/com/senon/module_life/MainActivity.java
  class MainActivity (line 19) | @Route(path = ConstantLoginArouter.PATH_LIFE_MAINACTIVITY)
    method onCreate (line 25) | @Override
    method findView (line 35) | private void findView() {
    class MyFragmentPagerAdapter (line 45) | class MyFragmentPagerAdapter extends FragmentPagerAdapter {
      method MyFragmentPagerAdapter (line 46) | public MyFragmentPagerAdapter(FragmentManager fm) {
      method getItem (line 49) | @Override
      method getCount (line 53) | @Override

FILE: module_life/src/main/java/com/senon/module_life/SplashActivity.java
  class SplashActivity (line 10) | public class SplashActivity extends AppCompatActivity {
    method onCreate (line 12) | @Override

FILE: module_life/src/main/java/com/senon/module_life/activity/KnowledgeSystemActivity.java
  class KnowledgeSystemActivity (line 38) | @Route(path = ConstantArouter.PATH_LIFE_KNOWLEDGESYSTEMACTIVITY)
    method getLayoutId (line 57) | @Override
    method createPresenter (line 62) | @Override
    method createView (line 66) | @Override
    method init (line 71) | @Override
    method initLRecyclerVeiw (line 95) | private void initLRecyclerVeiw() {
    method getFirstPageData (line 161) | private void getFirstPageData() {
    method getOrderList (line 167) | private void getOrderList() {
    method refreshData (line 171) | private void refreshData() {
    method getDataResult (line 181) | @Override
    method onEventReceived (line 200) | @Subscribe(threadMode = ThreadMode.MAIN) //在ui线程执行
    method getCollectResult (line 216) | @Override
    method getCollFailResult (line 225) | @Override
    method onDestroy (line 240) | @Override

FILE: module_life/src/main/java/com/senon/module_life/contract/KnowledgeSysActivityCon.java
  type KnowledgeSysActivityCon (line 9) | public interface KnowledgeSysActivityCon {
    type View (line 11) | interface View extends BaseViewImp {
      method getDataResult (line 13) | void getDataResult(BaseResponse<KnowledgeSysArticle> data);
      method getCollectResult (line 15) | void getCollectResult(int id,boolean isCollect);
      method getCollFailResult (line 17) | void getCollFailResult(int id);
    class Presenter (line 21) | abstract class Presenter extends BasePresenter<View> {
      method getData (line 23) | public abstract void getData(int cid,int page,boolean isDialog, bool...
      method getCollect (line 25) | public abstract void getCollect(int id ,boolean isDialog, boolean ca...
      method getUnollect (line 27) | public abstract void getUnollect(int id, boolean isDialog, boolean c...

FILE: module_life/src/main/java/com/senon/module_life/contract/LifeMainFragmentCon.java
  type LifeMainFragmentCon (line 14) | public interface LifeMainFragmentCon {
    type View (line 16) | interface View extends BaseViewImp {
      method getKnowledgeListResult (line 18) | void getKnowledgeListResult(BaseResponse<List<KnowledgeSystem>> data);
    class Presenter (line 22) | abstract class Presenter extends BasePresenter<View> {
      method getKnowledgeList (line 24) | public abstract void getKnowledgeList(boolean isDialog, boolean canc...

FILE: module_life/src/main/java/com/senon/module_life/fragment/LifeMainFragment.java
  class LifeMainFragment (line 46) | public class LifeMainFragment extends BaseLazyFragment<LifeMainFragmentC...
    method getLayoutId (line 56) | @Override
    method createPresenter (line 60) | @Override
    method createView (line 64) | @Override
    method init (line 68) | @Override
    method onFragmentFirst (line 83) | @Override
    method addLrvListener (line 97) | private void addLrvListener() {
    method getFirstData (line 130) | private void getFirstData() {
    method initAdapter (line 134) | private void initAdapter() {
    method onFragmentVisble (line 179) | @Override
    method getKnowledgeListResult (line 187) | @Override
    method onDestroyView (line 196) | @Override
    method onEventReceived (line 202) | @Subscribe(threadMode = ThreadMode.MAIN)

FILE: module_life/src/main/java/com/senon/module_life/presenter/KnowledgeSysActivityPre.java
  class KnowledgeSysActivityPre (line 18) | public class KnowledgeSysActivityPre extends KnowledgeSysActivityCon.Pre...
    method KnowledgeSysActivityPre (line 22) | public KnowledgeSysActivityPre(Context context) {
    method getData (line 26) | @Override
    method getCollect (line 49) | @Override
    method getUnollect (line 74) | @Override

FILE: module_life/src/main/java/com/senon/module_life/presenter/LifeMainFragmentPre.java
  class LifeMainFragmentPre (line 22) | public class LifeMainFragmentPre extends LifeMainFragmentCon.Presenter{
    method LifeMainFragmentPre (line 26) | public LifeMainFragmentPre(Context context) {
    method getKnowledgeList (line 31) | @Override

FILE: module_life/src/test/java/com/senon/module_life/ExampleUnitTest.java
  class ExampleUnitTest (line 12) | public class ExampleUnitTest {
    method addition_isCorrect (line 13) | @Test

FILE: module_talent/src/androidTest/java/com/senon/module_talent/ExampleInstrumentedTest.java
  class ExampleInstrumentedTest (line 17) | @RunWith(AndroidJUnit4.class)
    method useAppContext (line 19) | @Test

FILE: module_talent/src/main/java/com/senon/module_talent/App_Talent.java
  class App_Talent (line 10) | public class App_Talent extends BaseApplication {
    method onCreate (line 11) | @Override
    method initARouter (line 18) | private void initARouter() {

FILE: module_talent/src/main/java/com/senon/module_talent/MainActivity.java
  class MainActivity (line 19) | @Route(path = ConstantLoginArouter.PATH_TALENT_MAINACTIVITY)
    method onCreate (line 26) | @Override
    method findView (line 37) | private void findView() {
    class MyFragmentPagerAdapter (line 47) | class MyFragmentPagerAdapter extends FragmentPagerAdapter {
      method MyFragmentPagerAdapter (line 48) | public MyFragmentPagerAdapter(FragmentManager fm) {
      method getItem (line 51) | @Override
      method getCount (line 55) | @Override

FILE: module_talent/src/main/java/com/senon/module_talent/activity/AboutActivity.java
  class AboutActivity (line 22) | @Route(path = ConstantArouter.PATH_TALENT_ABOUTACTIVITY)
    method getLayoutId (line 29) | @Override
    method createPresenter (line 34) | @Override
    method createView (line 38) | @Override
    method init (line 43) | @Override

FILE: module_talent/src/main/java/com/senon/module_talent/activity/CollectionActivity.java
  class CollectionActivity (line 37) | @Route(path = ConstantArouter.PATH_TALENT_COLLECTIONACTIVITY)
    method getLayoutId (line 53) | @Override
    method createPresenter (line 58) | @Override
    method createView (line 62) | @Override
    method init (line 67) | @Override
    method initLRecyclerVeiw (line 91) | private void initLRecyclerVeiw() {
    method getFirstPageData (line 150) | private void getFirstPageData() {
    method getOrderList (line 156) | private void getOrderList() {
    method refreshData (line 160) | private void refreshData() {
    method getDataResult (line 170) | @Override
    method onEventReceived (line 197) | @Subscribe(threadMode = ThreadMode.MAIN) //在ui线程执行
    method getCollectResult (line 207) | @Override
    method onDestroy (line 225) | @Override

FILE: module_talent/src/main/java/com/senon/module_talent/contract/CollectionActivityCon.java
  type CollectionActivityCon (line 9) | public interface CollectionActivityCon {
    type View (line 11) | interface View extends BaseViewImp {
      method getDataResult (line 13) | void getDataResult(BaseResponse<CollectionArticle> data);
      method getCollectResult (line 15) | void getCollectResult(int id, boolean isCollect);
    class Presenter (line 19) | abstract class Presenter extends BasePresenter<View> {
      method getData (line 21) | public abstract void getData(int page,boolean isDialog, boolean canc...
      method getUnollect (line 23) | public abstract void getUnollect(int id,int originId, boolean isDial...

FILE: module_talent/src/main/java/com/senon/module_talent/contract/TalentMainFragmentCon.java
  type TalentMainFragmentCon (line 12) | public interface TalentMainFragmentCon {
    type View (line 14) | interface View extends BaseViewImp {
      method getLogoutResult (line 16) | void getLogoutResult(BaseResponse data);
    class Presenter (line 20) | abstract class Presenter extends BasePresenter<View> {
      method getLogout (line 22) | public abstract void getLogout(boolean isDialog, boolean cancelable);

FILE: module_talent/src/main/java/com/senon/module_talent/fragment/TalentMainFragment.java
  class TalentMainFragment (line 30) | public class TalentMainFragment extends BaseLazyFragment<TalentMainFragm...
    method getLayoutId (line 38) | @Override
    method createPresenter (line 42) | @Override
    method createView (line 46) | @Override
    method init (line 50) | @Override
    method onFragmentFirst (line 62) | @Override
    method initViewListener (line 72) | private void initViewListener() {
    method onFragmentVisble (line 104) | @Override
    method getLoginInfo (line 114) | private void getLoginInfo(){
    method sendMsgForLog (line 142) | private void sendMsgForLog(int code){
    method getLogoutResult (line 148) | @Override

FILE: module_talent/src/main/java/com/senon/module_talent/presenter/CollectionActivityPre.java
  class CollectionActivityPre (line 20) | public class CollectionActivityPre extends CollectionActivityCon.Presenter{
    method CollectionActivityPre (line 24) | public CollectionActivityPre(Context context) {
    method getData (line 28) | @Override
    method getUnollect (line 48) | @Override

FILE: module_talent/src/main/java/com/senon/module_talent/presenter/TalentMainFragmentPre.java
  class TalentMainFragmentPre (line 18) | public class TalentMainFragmentPre extends TalentMainFragmentCon.Presenter{
    method TalentMainFragmentPre (line 22) | public TalentMainFragmentPre(Context context) {
    method getLogout (line 26) | @Override

FILE: module_talent/src/test/java/com/senon/module_talent/ExampleUnitTest.java
  class ExampleUnitTest (line 12) | public class ExampleUnitTest {
    method addition_isCorrect (line 13) | @Test
Condensed preview — 230 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (623K chars).
[
  {
    "path": ".gitignore",
    "chars": 118,
    "preview": "*.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",
    "chars": 135,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"Encoding\" addBOMForNewFiles=\"with NO BOM"
  },
  {
    "path": "README.md",
    "chars": 2233,
    "preview": "# WanAndroid\n玩安卓http://www.wanandroid.com/ 客户端模块化设计app,包含MVP+Retrofit+Rxjava+Rxlifecycle+Glide+Eventbus+ARouter.\n构建一个平面化"
  },
  {
    "path": "app/.gitignore",
    "chars": 7,
    "preview": "/build\n"
  },
  {
    "path": "app/build.gradle",
    "chars": 2378,
    "preview": "apply plugin: 'com.android.application'\n\nandroid {\n    signingConfigs {\n        config {\n            keyAlias 'senon'\n  "
  },
  {
    "path": "app/proguard-rules.pro",
    "chars": 751,
    "preview": "# Add project specific ProGuard rules here.\n# You can control the set of applied configuration files using the\n# proguar"
  },
  {
    "path": "app/src/androidTest/java/com/senon/xfhmoudel/ExampleInstrumentedTest.java",
    "chars": 739,
    "preview": "package com.senon.xfhmoudel;\n\nimport android.content.Context;\nimport android.support.test.InstrumentationRegistry;\nimpor"
  },
  {
    "path": "app/src/main/AndroidManifest.xml",
    "chars": 1021,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:to"
  },
  {
    "path": "app/src/main/java/com/senon/xfhmoudel/App.java",
    "chars": 595,
    "preview": "package com.senon.xfhmoudel;\n\nimport com.alibaba.android.arouter.launcher.ARouter;\nimport com.senon.lib_common.base.Base"
  },
  {
    "path": "app/src/main/java/com/senon/xfhmoudel/FragmentHomeActivity.java",
    "chars": 6044,
    "preview": "package com.senon.xfhmoudel;\n\nimport android.support.annotation.Nullable;\nimport android.support.design.widget.TabLayout"
  },
  {
    "path": "app/src/main/java/com/senon/xfhmoudel/SplashActivity.java",
    "chars": 4737,
    "preview": "package com.senon.xfhmoudel;\n\nimport android.content.pm.PackageManager;\nimport android.os.Bundle;\nimport android.support"
  },
  {
    "path": "app/src/main/java/com/senon/xfhmoudel/TestActivity.java",
    "chars": 1834,
    "preview": "package com.senon.xfhmoudel;\n\nimport android.support.v7.app.AppCompatActivity;\nimport android.os.Bundle;\nimport android."
  },
  {
    "path": "app/src/main/res/drawable/ic_launcher_background.xml",
    "chars": 5606,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:wi"
  },
  {
    "path": "app/src/main/res/drawable/shape_splash_timer.xml",
    "chars": 249,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<shape xmlns:android=\"http://schemas.android.com/apk/res/android\" >\n\n    <!-- vie"
  },
  {
    "path": "app/src/main/res/layout/activity_fragment_home.xml",
    "chars": 1165,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xm"
  },
  {
    "path": "app/src/main/res/layout/activity_splash.xml",
    "chars": 3282,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xm"
  },
  {
    "path": "app/src/main/res/layout/activity_test.xml",
    "chars": 1126,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmln"
  },
  {
    "path": "app/src/main/res/values/colors.xml",
    "chars": 208,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <color name=\"colorPrimary\">#3F51B5</color>\n    <color name=\"color"
  },
  {
    "path": "app/src/main/res/values/strings.xml",
    "chars": 66,
    "preview": "<resources>\n    <string name=\"app_name\">玩安卓</string>\n</resources>\n"
  },
  {
    "path": "app/src/main/res/values/styles.xml",
    "chars": 345,
    "preview": "<resources>\n\n    <style name=\"AppTheme\" parent=\"Theme.AppCompat.Light.NoActionBar\">\n        <!-- Customize your theme he"
  },
  {
    "path": "app/src/test/java/com/senon/xfhmoudel/ExampleUnitTest.java",
    "chars": 397,
    "preview": "package com.senon.xfhmoudel;\n\nimport org.junit.Test;\n\nimport static org.junit.Assert.*;\n\n/**\n * Example local unit test,"
  },
  {
    "path": "build.gradle",
    "chars": 614,
    "preview": "// Top-level build file where you can add configuration options common to all sub-projects/modules.\napply from: \"depende"
  },
  {
    "path": "dependencies.gradle",
    "chars": 4919,
    "preview": "def supportVersion = \"27.1.1\"\ndef rxBindingVersion = \"3.0.0-alpha1\"\ndef retrofitVersion = \"2.4.0\"\ndef okHttpVersion = \"3"
  },
  {
    "path": "gradle/wrapper/gradle-wrapper.properties",
    "chars": 230,
    "preview": "#Sat Nov 17 20:54:41 CST 2018\ndistributionBase=GRADLE_USER_HOME\ndistributionPath=wrapper/dists\nzipStoreBase=GRADLE_USER_"
  },
  {
    "path": "gradle.properties",
    "chars": 812,
    "preview": "# Project-wide Gradle settings.\n\n# IDE (e.g. Android Studio) users:\n# Gradle settings configured through the IDE *will o"
  },
  {
    "path": "gradlew",
    "chars": 4971,
    "preview": "#!/usr/bin/env bash\n\n##############################################################################\n##\n##  Gradle start "
  },
  {
    "path": "gradlew.bat",
    "chars": 2314,
    "preview": "@if \"%DEBUG%\" == \"\" @echo off\n@rem ##########################################################################\n@rem\n@rem "
  },
  {
    "path": "lib_common/.gitignore",
    "chars": 7,
    "preview": "/build\n"
  },
  {
    "path": "lib_common/build.gradle",
    "chars": 1302,
    "preview": "apply plugin: 'com.android.library'\n\nandroid {\n    compileSdkVersion rootProject.ext.android[\"compileSdkVersion\"]\n\n    d"
  },
  {
    "path": "lib_common/proguard-rules.pro",
    "chars": 751,
    "preview": "# Add project specific ProGuard rules here.\n# You can control the set of applied configuration files using the\n# proguar"
  },
  {
    "path": "lib_common/src/androidTest/java/com/senon/lib_common/ExampleInstrumentedTest.java",
    "chars": 741,
    "preview": "package com.senon.lib_common;\n\nimport android.content.Context;\nimport android.support.test.InstrumentationRegistry;\nimpo"
  },
  {
    "path": "lib_common/src/main/AndroidManifest.xml",
    "chars": 897,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    package="
  },
  {
    "path": "lib_common/src/main/java/com/senon/lib_common/AppConfig.java",
    "chars": 389,
    "preview": "package com.senon.lib_common;\n\nimport com.senon.lib_common.utils.ConstantUtils;\n\n/**\n * APP配置参数\n */\npublic class AppConf"
  },
  {
    "path": "lib_common/src/main/java/com/senon/lib_common/ComUtil.java",
    "chars": 4206,
    "preview": "package com.senon.lib_common;\n\nimport android.app.Activity;\nimport android.content.Context;\nimport android.net.Connectiv"
  },
  {
    "path": "lib_common/src/main/java/com/senon/lib_common/ConstantArouter.java",
    "chars": 1235,
    "preview": "package com.senon.lib_common;\n\n/**\n * 所有模块均依赖commonmoduel  所以路由跳转均写入本Constant方便调用\n * 常量类\n * 其中: 路由跳转命名统一用:path+模块名+Activ"
  },
  {
    "path": "lib_common/src/main/java/com/senon/lib_common/ConstantLoginArouter.java",
    "chars": 1681,
    "preview": "package com.senon.lib_common;\n\nimport java.util.HashMap;\nimport java.util.Map;\n\n/**\n * 判断是某个模块登录的\n */\npublic class Const"
  },
  {
    "path": "lib_common/src/main/java/com/senon/lib_common/adapter/CommonAdapter.java",
    "chars": 1481,
    "preview": "package com.senon.lib_common.adapter;\n\nimport android.content.Context;\nimport android.view.LayoutInflater;\nimport androi"
  },
  {
    "path": "lib_common/src/main/java/com/senon/lib_common/adapter/CommonHolder.java",
    "chars": 8265,
    "preview": "package com.senon.lib_common.adapter;\n\nimport android.annotation.SuppressLint;\nimport android.app.Activity;\nimport andro"
  },
  {
    "path": "lib_common/src/main/java/com/senon/lib_common/adapter/RecycleHolder.java",
    "chars": 6775,
    "preview": "package com.senon.lib_common.adapter;\n\nimport android.app.Activity;\nimport android.graphics.Bitmap;\nimport android.suppo"
  },
  {
    "path": "lib_common/src/main/java/com/senon/lib_common/adapter/RecyclerAdapter.java",
    "chars": 1912,
    "preview": "package com.senon.lib_common.adapter;\n\nimport android.content.Context;\nimport android.support.v7.widget.RecyclerView;\nim"
  },
  {
    "path": "lib_common/src/main/java/com/senon/lib_common/api/BaseApi.java",
    "chars": 2810,
    "preview": "package com.senon.lib_common.api;\n\nimport com.senon.lib_common.bean.Banner;\nimport com.senon.lib_common.bean.CollectionA"
  },
  {
    "path": "lib_common/src/main/java/com/senon/lib_common/base/BaseActivity.java",
    "chars": 1505,
    "preview": "package com.senon.lib_common.base;\n\nimport android.content.pm.ActivityInfo;\nimport android.os.Bundle;\nimport android.vie"
  },
  {
    "path": "lib_common/src/main/java/com/senon/lib_common/base/BaseAppDeletage.java",
    "chars": 2991,
    "preview": "package com.senon.lib_common.base;\n\nimport android.app.Application;\nimport android.content.Context;\n\nimport com.scwang.s"
  },
  {
    "path": "lib_common/src/main/java/com/senon/lib_common/base/BaseApplication.java",
    "chars": 551,
    "preview": "package com.senon.lib_common.base;\n\nimport android.app.Application;\n\n/**\n * 要想使用BaseApplication,必须在组件中实现自己的Application,并"
  },
  {
    "path": "lib_common/src/main/java/com/senon/lib_common/base/BaseFragment.java",
    "chars": 1442,
    "preview": "package com.senon.lib_common.base;\n\nimport android.content.Context;\nimport android.os.Bundle;\nimport android.view.Layout"
  },
  {
    "path": "lib_common/src/main/java/com/senon/lib_common/base/BaseLazyFragment.java",
    "chars": 5245,
    "preview": "package com.senon.lib_common.base;\n\nimport android.content.Context;\nimport android.os.Bundle;\nimport android.support.ann"
  },
  {
    "path": "lib_common/src/main/java/com/senon/lib_common/base/BaseNestingLazyFragment.java",
    "chars": 6314,
    "preview": "package com.senon.lib_common.base;\n\nimport android.annotation.SuppressLint;\nimport android.content.Context;\nimport andro"
  },
  {
    "path": "lib_common/src/main/java/com/senon/lib_common/base/BasePresenter.java",
    "chars": 319,
    "preview": "package com.senon.lib_common.base;\n\n\n/**\n * BasePresenter\n */\npublic abstract class BasePresenter<V extends BaseViewImp>"
  },
  {
    "path": "lib_common/src/main/java/com/senon/lib_common/base/BaseResponse.java",
    "chars": 448,
    "preview": "package com.senon.lib_common.base;\n\nimport com.google.gson.annotations.SerializedName;\n\n/**\n * BaseResponse<T>\n */\npubli"
  },
  {
    "path": "lib_common/src/main/java/com/senon/lib_common/base/BaseViewImp.java",
    "chars": 90,
    "preview": "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",
    "chars": 1629,
    "preview": "package com.senon.lib_common.bean;\n\n/**\n * 首页Banner\n */\npublic class Banner {\n\n    /**\n     * desc : 一起来做个App吧\n     * id"
  },
  {
    "path": "lib_common/src/main/java/com/senon/lib_common/bean/CollectionArticle.java",
    "chars": 5686,
    "preview": "package com.senon.lib_common.bean;\n\nimport java.util.List;\n\n/**\n * 收藏列表文章\n */\n\npublic class CollectionArticle {\n\n    /**"
  },
  {
    "path": "lib_common/src/main/java/com/senon/lib_common/bean/HomeArticle.java",
    "chars": 7226,
    "preview": "package com.senon.lib_common.bean;\n\nimport java.util.List;\n\n/**\n * 首页文章\n */\n\npublic class HomeArticle {\n\n    /**\n     * "
  },
  {
    "path": "lib_common/src/main/java/com/senon/lib_common/bean/KnowledgeSysArticle.java",
    "chars": 8202,
    "preview": "package com.senon.lib_common.bean;\n\nimport java.util.List;\n\n/**\n * 知识体系文章\n */\npublic class KnowledgeSysArticle {\n\n    /*"
  },
  {
    "path": "lib_common/src/main/java/com/senon/lib_common/bean/KnowledgeSystem.java",
    "chars": 4115,
    "preview": "package com.senon.lib_common.bean;\n\nimport java.util.List;\n\n/**\n * 知识体系\n */\npublic class KnowledgeSystem {\n\n    /**\n    "
  },
  {
    "path": "lib_common/src/main/java/com/senon/lib_common/bean/Login.java",
    "chars": 1869,
    "preview": "package com.senon.lib_common.bean;\n\nimport java.util.List;\n\n/**\n * 登录--实体\n */\npublic class Login {\n\n    /**\n     * chapt"
  },
  {
    "path": "lib_common/src/main/java/com/senon/lib_common/bean/ProjectArticle.java",
    "chars": 8196,
    "preview": "package com.senon.lib_common.bean;\n\nimport java.util.List;\n\n/**\n * 项目列表\n */\n\npublic class ProjectArticle {\n\n    /**\n    "
  },
  {
    "path": "lib_common/src/main/java/com/senon/lib_common/bean/WXarticle.java",
    "chars": 7863,
    "preview": "package com.senon.lib_common.bean;\n\nimport java.util.List;\n\n/**\n * 公众号文章\n */\n\npublic class WXarticle {\n\n\n    /**\n     * "
  },
  {
    "path": "lib_common/src/main/java/com/senon/lib_common/bean/WXchapters.java",
    "chars": 1742,
    "preview": "package com.senon.lib_common.bean;\n\nimport java.util.List;\n\n/**\n * 微信公众号列表\n */\n\npublic class WXchapters {\n\n    /**\n     "
  },
  {
    "path": "lib_common/src/main/java/com/senon/lib_common/common/contract/LoginContract.java",
    "chars": 816,
    "preview": "package com.senon.lib_common.common.contract;\n\n\nimport com.senon.lib_common.base.BasePresenter;\nimport com.senon.lib_com"
  },
  {
    "path": "lib_common/src/main/java/com/senon/lib_common/common/contract/WebviewContract.java",
    "chars": 765,
    "preview": "package com.senon.lib_common.common.contract;\n\n\nimport com.senon.lib_common.base.BasePresenter;\nimport com.senon.lib_com"
  },
  {
    "path": "lib_common/src/main/java/com/senon/lib_common/common/presenter/LoginPresenter.java",
    "chars": 2971,
    "preview": "package com.senon.lib_common.common.presenter;\n\nimport android.content.Context;\n\nimport com.senon.lib_common.bean.Login;"
  },
  {
    "path": "lib_common/src/main/java/com/senon/lib_common/common/presenter/WebviewPresenter.java",
    "chars": 3027,
    "preview": "package com.senon.lib_common.common.presenter;\n\nimport android.content.Context;\nimport com.senon.lib_common.base.BaseRes"
  },
  {
    "path": "lib_common/src/main/java/com/senon/lib_common/common/ui/Common_LoginActivity.java",
    "chars": 4231,
    "preview": "package com.senon.lib_common.common.ui;\n\nimport android.graphics.Paint;\nimport android.view.View;\nimport android.widget."
  },
  {
    "path": "lib_common/src/main/java/com/senon/lib_common/common/ui/Common_RegisterActivity.java",
    "chars": 3940,
    "preview": "package com.senon.lib_common.common.ui;\n\nimport android.graphics.Paint;\nimport android.view.View;\nimport android.widget."
  },
  {
    "path": "lib_common/src/main/java/com/senon/lib_common/common/ui/Common_WebviewActivity.java",
    "chars": 6399,
    "preview": "package com.senon.lib_common.common.ui;\n\nimport android.view.View;\nimport android.webkit.WebChromeClient;\nimport android"
  },
  {
    "path": "lib_common/src/main/java/com/senon/lib_common/net/RequestInterceptor.java",
    "chars": 1614,
    "preview": "package com.senon.lib_common.net;\n\nimport org.json.JSONObject;\nimport java.io.IOException;\nimport java.util.HashMap;\nimp"
  },
  {
    "path": "lib_common/src/main/java/com/senon/lib_common/net/ServerUtils.java",
    "chars": 5977,
    "preview": "package com.senon.lib_common.net;\n\nimport com.senon.lib_common.AppConfig;\nimport com.senon.lib_common.ComUtil;\nimport co"
  },
  {
    "path": "lib_common/src/main/java/com/senon/lib_common/net/callback/ErrorListener.java",
    "chars": 115,
    "preview": "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",
    "chars": 2573,
    "preview": "package com.senon.lib_common.net.callback;\n\nimport android.content.Context;\nimport com.senon.lib_common.net.progress.Pro"
  },
  {
    "path": "lib_common/src/main/java/com/senon/lib_common/net/callback/RxErrorHandler.java",
    "chars": 1835,
    "preview": "package com.senon.lib_common.net.callback;\n\n\nimport com.senon.lib_common.utils.LogUtils;\nimport com.senon.lib_common.uti"
  },
  {
    "path": "lib_common/src/main/java/com/senon/lib_common/net/cookies/CookiesManager.java",
    "chars": 1293,
    "preview": "package com.senon.lib_common.net.cookies;\n\nimport android.support.annotation.NonNull;\n\nimport java.util.List;\n\nimport ok"
  },
  {
    "path": "lib_common/src/main/java/com/senon/lib_common/net/cookies/OkHttpCookies.java",
    "chars": 2021,
    "preview": "package com.senon.lib_common.net.cookies;\n\nimport java.io.IOException;\nimport java.io.ObjectInputStream;\nimport java.io."
  },
  {
    "path": "lib_common/src/main/java/com/senon/lib_common/net/cookies/PersistentCookieStore.java",
    "chars": 7648,
    "preview": "package com.senon.lib_common.net.cookies;\n\nimport android.content.Context;\nimport android.content.SharedPreferences;\nimp"
  },
  {
    "path": "lib_common/src/main/java/com/senon/lib_common/net/progress/ProgressCancelListener.java",
    "chars": 135,
    "preview": "package com.senon.lib_common.net.progress;\n\n/**\n * 取消请求监听\n */\npublic interface ProgressCancelListener {\n    void onCance"
  },
  {
    "path": "lib_common/src/main/java/com/senon/lib_common/net/progress/ProgressDialogHandler.java",
    "chars": 1991,
    "preview": "package com.senon.lib_common.net.progress;\n\nimport android.content.Context;\nimport android.content.DialogInterface;\nimpo"
  },
  {
    "path": "lib_common/src/main/java/com/senon/lib_common/service/InitializeService.java",
    "chars": 1039,
    "preview": "package com.senon.lib_common.service;\n\nimport android.app.IntentService;\nimport android.content.Context;\nimport android."
  },
  {
    "path": "lib_common/src/main/java/com/senon/lib_common/utils/ACache.java",
    "chars": 25782,
    "preview": "package com.senon.lib_common.utils;\n\nimport android.content.Context;\nimport android.graphics.Bitmap;\nimport android.grap"
  },
  {
    "path": "lib_common/src/main/java/com/senon/lib_common/utils/BaseEvent.java",
    "chars": 1280,
    "preview": "package com.senon.lib_common.utils;\n\n/**\n * eventbus发送实体\n */\npublic class BaseEvent<T> {\n\n    /**\n//     * -1:退出登录时通知Mai"
  },
  {
    "path": "lib_common/src/main/java/com/senon/lib_common/utils/ConstantUtils.java",
    "chars": 1312,
    "preview": "package com.senon.lib_common.utils;\n\nimport android.content.Context;\nimport android.content.pm.ApplicationInfo;\nimport a"
  },
  {
    "path": "lib_common/src/main/java/com/senon/lib_common/utils/LogUtils.java",
    "chars": 2638,
    "preview": "package com.senon.lib_common.utils;\n\nimport android.util.Log;\n\nimport java.util.Locale;\n\n/**\n * 打印log日志工具类\n */\npublic cl"
  },
  {
    "path": "lib_common/src/main/java/com/senon/lib_common/utils/MD5Utils.java",
    "chars": 1304,
    "preview": "package com.senon.lib_common.utils;\n\nimport java.security.MessageDigest;\nimport java.security.NoSuchAlgorithmException;\n"
  },
  {
    "path": "lib_common/src/main/java/com/senon/lib_common/utils/PreferenceTool.java",
    "chars": 2725,
    "preview": "package com.senon.lib_common.utils;\n\nimport android.content.Context;\nimport android.content.SharedPreferences;\n\nimport c"
  },
  {
    "path": "lib_common/src/main/java/com/senon/lib_common/utils/RetryWithDelay.java",
    "chars": 1635,
    "preview": "package com.senon.lib_common.utils;\n\n\nimport java.util.concurrent.TimeUnit;\n\nimport io.reactivex.Observable;\nimport io.r"
  },
  {
    "path": "lib_common/src/main/java/com/senon/lib_common/utils/RxUtils.java",
    "chars": 2247,
    "preview": "package com.senon.lib_common.utils;\n\nimport com.senon.lib_common.base.BaseViewImp;\nimport com.trello.rxlifecycle2.Lifecy"
  },
  {
    "path": "lib_common/src/main/java/com/senon/lib_common/utils/StatusBarUtils.java",
    "chars": 13007,
    "preview": "package com.senon.lib_common.utils;\n\nimport android.app.Activity;\nimport android.content.Context;\nimport android.graphic"
  },
  {
    "path": "lib_common/src/main/java/com/senon/lib_common/utils/ToastUtil.java",
    "chars": 4227,
    "preview": "package com.senon.lib_common.utils;\n\nimport android.app.Activity;\nimport android.content.Context;\nimport android.os.Hand"
  },
  {
    "path": "lib_common/src/main/res/drawable/register_border.xml",
    "chars": 249,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<shape xmlns:android=\"http://schemas.android.com/apk/res/android\" >\n\n    <!-- vie"
  },
  {
    "path": "lib_common/src/main/res/drawable/register_border_2.xml",
    "chars": 247,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<shape xmlns:android=\"http://schemas.android.com/apk/res/android\" >\n\n    <!-- vie"
  },
  {
    "path": "lib_common/src/main/res/drawable/register_border_9.xml",
    "chars": 277,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<shape xmlns:android=\"http://schemas.android.com/apk/res/android\" >\n\n    <!-- vie"
  },
  {
    "path": "lib_common/src/main/res/drawable/shape_gradient.xml",
    "chars": 232,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<shape xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <gradient\n"
  },
  {
    "path": "lib_common/src/main/res/drawable/style_progress_bar.xml",
    "chars": 1102,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<layer-list xmlns:android=\"http://schemas.android.com/apk/res/android\" >\n\n    <!-"
  },
  {
    "path": "lib_common/src/main/res/drawable/toast_shape.xml",
    "chars": 196,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<shape xmlns:android=\"http://schemas.android.com/apk/res/android\">\n\n    <corners "
  },
  {
    "path": "lib_common/src/main/res/layout/activity_common__login.xml",
    "chars": 6011,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    andr"
  },
  {
    "path": "lib_common/src/main/res/layout/activity_common__register.xml",
    "chars": 7042,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    andr"
  },
  {
    "path": "lib_common/src/main/res/layout/activity_common__webview.xml",
    "chars": 1058,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xm"
  },
  {
    "path": "lib_common/src/main/res/layout/layout_fragmhome_tab.xml",
    "chars": 1084,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    an"
  },
  {
    "path": "lib_common/src/main/res/layout/layout_toolbar.xml",
    "chars": 1752,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    an"
  },
  {
    "path": "lib_common/src/main/res/layout/toast_layout.xml",
    "chars": 913,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        "
  },
  {
    "path": "lib_common/src/main/res/values/colors.xml",
    "chars": 2131,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <color name=\"colorPrimary\">#3F51B5</color>\n    <color name=\"color"
  },
  {
    "path": "lib_common/src/main/res/values/dimens.xml",
    "chars": 53951,
    "preview": "<resources>\n    <dimen name=\"mm_10\">-10mm</dimen>\n    <dimen name=\"mm_20\">-20mm</dimen>\n    <dimen name=\"mm0.5\">0.5mm</d"
  },
  {
    "path": "lib_common/src/main/res/values/strings.xml",
    "chars": 73,
    "preview": "<resources>\n    <string name=\"app_name\">lib_common</string>\n</resources>\n"
  },
  {
    "path": "lib_common/src/main/res/values/styles.xml",
    "chars": 681,
    "preview": "<resources>\n\n    <!-- Base application theme. -->\n    <style name=\"AppTheme\" parent=\"Theme.AppCompat.Light.NoActionBar\">"
  },
  {
    "path": "lib_common/src/test/java/com/senon/lib_common/ExampleUnitTest.java",
    "chars": 398,
    "preview": "package com.senon.lib_common;\n\nimport org.junit.Test;\n\nimport static org.junit.Assert.*;\n\n/**\n * Example local unit test"
  },
  {
    "path": "lib_opensource/.gitignore",
    "chars": 7,
    "preview": "/build\n"
  },
  {
    "path": "lib_opensource/build.gradle",
    "chars": 2143,
    "preview": "apply plugin: 'com.android.library'\n\nandroid {\n    compileSdkVersion rootProject.ext.android[\"compileSdkVersion\"]\n\n    d"
  },
  {
    "path": "lib_opensource/proguard-rules.pro",
    "chars": 751,
    "preview": "# Add project specific ProGuard rules here.\n# You can control the set of applied configuration files using the\n# proguar"
  },
  {
    "path": "lib_opensource/src/androidTest/java/com/senon/lib_opensource/ExampleInstrumentedTest.java",
    "chars": 749,
    "preview": "package com.senon.lib_opensource;\n\nimport android.content.Context;\nimport android.support.test.InstrumentationRegistry;\n"
  },
  {
    "path": "lib_opensource/src/main/AndroidManifest.xml",
    "chars": 199,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    package="
  },
  {
    "path": "lib_opensource/src/test/java/com/senon/lib_opensource/ExampleUnitTest.java",
    "chars": 402,
    "preview": "package com.senon.lib_opensource;\n\nimport org.junit.Test;\n\nimport static org.junit.Assert.*;\n\n/**\n * Example local unit "
  },
  {
    "path": "module_art/.gitignore",
    "chars": 7,
    "preview": "/build\n"
  },
  {
    "path": "module_art/build.gradle",
    "chars": 1836,
    "preview": "if(isBuildModule.toBoolean()){\n    apply plugin: 'com.android.application'\n}else{\n    apply plugin: 'com.android.library"
  },
  {
    "path": "module_art/proguard-rules.pro",
    "chars": 751,
    "preview": "# Add project specific ProGuard rules here.\n# You can control the set of applied configuration files using the\n# proguar"
  },
  {
    "path": "module_art/src/androidTest/java/com/senon/module_art/ExampleInstrumentedTest.java",
    "chars": 741,
    "preview": "package com.senon.module_art;\n\nimport android.content.Context;\nimport android.support.test.InstrumentationRegistry;\nimpo"
  },
  {
    "path": "module_art/src/main/debug/AndroidManifest.xml",
    "chars": 964,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:to"
  },
  {
    "path": "module_art/src/main/java/com/senon/module_art/App_Art.java",
    "chars": 609,
    "preview": "package com.senon.module_art;\n\nimport com.alibaba.android.arouter.launcher.ARouter;\nimport com.senon.lib_common.base.Bas"
  },
  {
    "path": "module_art/src/main/java/com/senon/module_art/MainActivity.java",
    "chars": 2011,
    "preview": "package com.senon.module_art;\n\nimport android.support.v4.app.Fragment;\nimport android.support.v4.app.FragmentManager;\nim"
  },
  {
    "path": "module_art/src/main/java/com/senon/module_art/SplashActivity.java",
    "chars": 921,
    "preview": "package com.senon.module_art;\n\nimport android.os.Bundle;\nimport android.support.v7.app.AppCompatActivity;\nimport android"
  },
  {
    "path": "module_art/src/main/java/com/senon/module_art/adapter/ArtMainAdapter.java",
    "chars": 8324,
    "preview": "package com.senon.module_art.adapter;\n\nimport android.content.Context;\nimport android.support.v7.widget.LinearLayoutMana"
  },
  {
    "path": "module_art/src/main/java/com/senon/module_art/contract/ArtMainFragmentCon.java",
    "chars": 955,
    "preview": "package com.senon.module_art.contract;\n\nimport com.senon.lib_common.base.BasePresenter;\nimport com.senon.lib_common.base"
  },
  {
    "path": "module_art/src/main/java/com/senon/module_art/fragment/ArtMainFragment.java",
    "chars": 8264,
    "preview": "package com.senon.module_art.fragment;\n\nimport android.support.v7.widget.LinearLayoutManager;\nimport android.support.v7."
  },
  {
    "path": "module_art/src/main/java/com/senon/module_art/presenter/ArtMainFragmentPre.java",
    "chars": 3236,
    "preview": "package com.senon.module_art.presenter;\n\nimport android.content.Context;\nimport com.senon.lib_common.base.BaseResponse;\n"
  },
  {
    "path": "module_art/src/main/release/AndroidManifest.xml",
    "chars": 779,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    package="
  },
  {
    "path": "module_art/src/main/res/drawable/art_launcher_background.xml",
    "chars": 5606,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:wi"
  },
  {
    "path": "module_art/src/main/res/drawable/art_shape_transp_con20.xml",
    "chars": 344,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<shape xmlns:android=\"http://schemas.android.com/apk/res/android\" >\n\n    <!-- vie"
  },
  {
    "path": "module_art/src/main/res/drawable/art_shape_white_con30.xml",
    "chars": 301,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<shape xmlns:android=\"http://schemas.android.com/apk/res/android\" >\n\n    <!-- vie"
  },
  {
    "path": "module_art/src/main/res/drawable/art_shape_yellow_con20.xml",
    "chars": 390,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<shape xmlns:android=\"http://schemas.android.com/apk/res/android\" >\n\n    <!-- vie"
  },
  {
    "path": "module_art/src/main/res/layout/art_activity_main.xml",
    "chars": 546,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xm"
  },
  {
    "path": "module_art/src/main/res/layout/art_activity_splash.xml",
    "chars": 723,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xm"
  },
  {
    "path": "module_art/src/main/res/layout/art_adapter_artmain_fragment_article.xml",
    "chars": 3255,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    an"
  },
  {
    "path": "module_art/src/main/res/layout/art_adapter_artmain_fragment_head.xml",
    "chars": 1030,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    an"
  },
  {
    "path": "module_art/src/main/res/layout/art_adapter_artmain_fragment_head_item.xml",
    "chars": 735,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    an"
  },
  {
    "path": "module_art/src/main/res/layout/art_fragment_main.xml",
    "chars": 1844,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xm"
  },
  {
    "path": "module_art/src/main/res/values/colors.xml",
    "chars": 65,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n\n</resources>\n"
  },
  {
    "path": "module_art/src/main/res/values/strings.xml",
    "chars": 74,
    "preview": "<resources>\n    <string name=\"art_app_name\">玩安卓_公众号</string>\n</resources>\n"
  },
  {
    "path": "module_art/src/main/res/values/styles.xml",
    "chars": 384,
    "preview": "<resources>\n\n    <!-- Base application theme. -->\n    <style name=\"ArtAppTheme\" parent=\"Theme.AppCompat.Light.NoActionBa"
  },
  {
    "path": "module_art/src/test/java/com/senon/module_art/ExampleUnitTest.java",
    "chars": 398,
    "preview": "package com.senon.module_art;\n\nimport org.junit.Test;\n\nimport static org.junit.Assert.*;\n\n/**\n * Example local unit test"
  },
  {
    "path": "module_home/.gitignore",
    "chars": 7,
    "preview": "/build\n"
  },
  {
    "path": "module_home/build.gradle",
    "chars": 1974,
    "preview": "if (isBuildModule.toBoolean()) {\n    apply plugin: 'com.android.application'\n} else {\n    apply plugin: 'com.android.lib"
  },
  {
    "path": "module_home/proguard-rules.pro",
    "chars": 751,
    "preview": "# Add project specific ProGuard rules here.\n# You can control the set of applied configuration files using the\n# proguar"
  },
  {
    "path": "module_home/src/androidTest/java/com/senon/module_home/ExampleInstrumentedTest.java",
    "chars": 743,
    "preview": "package com.senon.module_home;\n\nimport android.content.Context;\nimport android.support.test.InstrumentationRegistry;\nimp"
  },
  {
    "path": "module_home/src/main/debug/AndroidManifest.xml",
    "chars": 1127,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:to"
  },
  {
    "path": "module_home/src/main/java/com/senon/module_home/App_Home.java",
    "chars": 612,
    "preview": "package com.senon.module_home;\n\nimport com.alibaba.android.arouter.launcher.ARouter;\nimport com.senon.lib_common.base.Ba"
  },
  {
    "path": "module_home/src/main/java/com/senon/module_home/MainActivity.java",
    "chars": 2011,
    "preview": "package com.senon.module_home;\n\nimport android.os.Bundle;\nimport android.support.v4.app.Fragment;\nimport android.support"
  },
  {
    "path": "module_home/src/main/java/com/senon/module_home/SplashActivity.java",
    "chars": 925,
    "preview": "package com.senon.module_home;\n\nimport android.support.v7.app.AppCompatActivity;\nimport android.os.Bundle;\nimport androi"
  },
  {
    "path": "module_home/src/main/java/com/senon/module_home/activity/HomeArticleActivity.java",
    "chars": 9129,
    "preview": "package com.senon.module_home.activity;\n\nimport android.support.v7.widget.LinearLayoutManager;\nimport android.text.Html;"
  },
  {
    "path": "module_home/src/main/java/com/senon/module_home/activity/HomeProjectActivity.java",
    "chars": 7778,
    "preview": "package com.senon.module_home.activity;\n\nimport android.support.v7.widget.LinearLayoutManager;\nimport android.text.Html;"
  },
  {
    "path": "module_home/src/main/java/com/senon/module_home/adapter/HomeMainAdapter.java",
    "chars": 12850,
    "preview": "package com.senon.module_home.adapter;\n\nimport android.content.Context;\nimport android.support.v7.widget.RecyclerView;\ni"
  },
  {
    "path": "module_home/src/main/java/com/senon/module_home/contract/HomeArticleActivityCon.java",
    "chars": 812,
    "preview": "package com.senon.module_home.contract;\n\nimport com.senon.lib_common.base.BasePresenter;\nimport com.senon.lib_common.bas"
  },
  {
    "path": "module_home/src/main/java/com/senon/module_home/contract/HomeMainFragmentCon.java",
    "chars": 1008,
    "preview": "package com.senon.module_home.contract;\n\nimport com.senon.lib_common.base.BasePresenter;\nimport com.senon.lib_common.bas"
  },
  {
    "path": "module_home/src/main/java/com/senon/module_home/contract/HomeProjectActivityCon.java",
    "chars": 544,
    "preview": "package com.senon.module_home.contract;\n\nimport com.senon.lib_common.base.BasePresenter;\nimport com.senon.lib_common.bas"
  },
  {
    "path": "module_home/src/main/java/com/senon/module_home/fragment/HomeMainFragment.java",
    "chars": 8367,
    "preview": "package com.senon.module_home.fragment;\n\nimport android.support.v7.widget.LinearLayoutManager;\nimport android.support.v7"
  },
  {
    "path": "module_home/src/main/java/com/senon/module_home/presenter/HomeArticleActivityPre.java",
    "chars": 4220,
    "preview": "package com.senon.module_home.presenter;\n\nimport android.content.Context;\nimport com.senon.lib_common.base.BaseResponse;"
  },
  {
    "path": "module_home/src/main/java/com/senon/module_home/presenter/HomeMainFragmentPre.java",
    "chars": 4293,
    "preview": "package com.senon.module_home.presenter;\n\nimport android.content.Context;\n\nimport com.senon.lib_common.bean.Banner;\nimpo"
  },
  {
    "path": "module_home/src/main/java/com/senon/module_home/presenter/HomeProjectActivityPre.java",
    "chars": 1902,
    "preview": "package com.senon.module_home.presenter;\n\nimport android.content.Context;\nimport com.senon.lib_common.base.BaseResponse;"
  },
  {
    "path": "module_home/src/main/release/AndroidManifest.xml",
    "chars": 934,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    package="
  },
  {
    "path": "module_home/src/main/res/drawable/home_ic_launcher_background.xml",
    "chars": 5606,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:wi"
  },
  {
    "path": "module_home/src/main/res/drawable/home_shape_stro_red_con30.xml",
    "chars": 342,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<shape xmlns:android=\"http://schemas.android.com/apk/res/android\" >\n\n    <!-- vie"
  },
  {
    "path": "module_home/src/main/res/drawable/home_shape_white_con30.xml",
    "chars": 301,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<shape xmlns:android=\"http://schemas.android.com/apk/res/android\" >\n\n    <!-- vie"
  },
  {
    "path": "module_home/src/main/res/layout/home_activity_home_article.xml",
    "chars": 791,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xm"
  },
  {
    "path": "module_home/src/main/res/layout/home_activity_home_project.xml",
    "chars": 835,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xm"
  },
  {
    "path": "module_home/src/main/res/layout/home_activity_main.xml",
    "chars": 548,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xm"
  },
  {
    "path": "module_home/src/main/res/layout/home_activity_splash.xml",
    "chars": 725,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xm"
  },
  {
    "path": "module_home/src/main/res/layout/home_adapter_homemain_fragment_article.xml",
    "chars": 5205,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    an"
  },
  {
    "path": "module_home/src/main/res/layout/home_adapter_homemain_fragment_banneritem.xml",
    "chars": 419,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    andr"
  },
  {
    "path": "module_home/src/main/res/layout/home_adapter_homemain_fragment_head.xml",
    "chars": 1158,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    an"
  },
  {
    "path": "module_home/src/main/res/layout/home_adapter_homemain_fragment_project.xml",
    "chars": 5029,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    an"
  },
  {
    "path": "module_home/src/main/res/layout/home_fragment_main.xml",
    "chars": 1842,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    an"
  },
  {
    "path": "module_home/src/main/res/values/colors.xml",
    "chars": 223,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <color name=\"home_colorPrimary\">#3F51B5</color>\n    <color name=\""
  },
  {
    "path": "module_home/src/main/res/values/strings.xml",
    "chars": 74,
    "preview": "<resources>\n    <string name=\"home_app_name\">玩安卓_主页</string>\n</resources>\n"
  },
  {
    "path": "module_home/src/main/res/values/styles.xml",
    "chars": 386,
    "preview": "<resources>\n\n    <!-- Base application theme. -->\n    <style name=\"home_AppTheme\" parent=\"Theme.AppCompat.Light.NoAction"
  },
  {
    "path": "module_home/src/test/java/com/senon/module_home/ExampleUnitTest.java",
    "chars": 399,
    "preview": "package com.senon.module_home;\n\nimport org.junit.Test;\n\nimport static org.junit.Assert.*;\n\n/**\n * Example local unit tes"
  },
  {
    "path": "module_life/.gitignore",
    "chars": 7,
    "preview": "/build\n"
  },
  {
    "path": "module_life/build.gradle",
    "chars": 1891,
    "preview": "if(isBuildModule.toBoolean()){\n    apply plugin: 'com.android.application'\n}else{\n    apply plugin: 'com.android.library"
  },
  {
    "path": "module_life/proguard-rules.pro",
    "chars": 751,
    "preview": "# Add project specific ProGuard rules here.\n# You can control the set of applied configuration files using the\n# proguar"
  },
  {
    "path": "module_life/src/androidTest/java/com/senon/module_life/ExampleInstrumentedTest.java",
    "chars": 743,
    "preview": "package com.senon.module_life;\n\nimport android.content.Context;\nimport android.support.test.InstrumentationRegistry;\nimp"
  },
  {
    "path": "module_life/src/main/debug/AndroidManifest.xml",
    "chars": 1057,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:to"
  },
  {
    "path": "module_life/src/main/java/com/senon/module_life/App_Life.java",
    "chars": 612,
    "preview": "package com.senon.module_life;\n\nimport com.alibaba.android.arouter.launcher.ARouter;\nimport com.senon.lib_common.base.Ba"
  },
  {
    "path": "module_life/src/main/java/com/senon/module_life/MainActivity.java",
    "chars": 1837,
    "preview": "package com.senon.module_life;\n\nimport android.support.v4.app.Fragment;\nimport android.support.v4.app.FragmentManager;\ni"
  },
  {
    "path": "module_life/src/main/java/com/senon/module_life/SplashActivity.java",
    "chars": 925,
    "preview": "package com.senon.module_life;\n\nimport android.os.Bundle;\nimport android.support.v7.app.AppCompatActivity;\nimport androi"
  },
  {
    "path": "module_life/src/main/java/com/senon/module_life/activity/KnowledgeSystemActivity.java",
    "chars": 9091,
    "preview": "package com.senon.module_life.activity;\n\nimport android.support.v7.widget.LinearLayoutManager;\nimport android.text.Html;"
  },
  {
    "path": "module_life/src/main/java/com/senon/module_life/contract/KnowledgeSysActivityCon.java",
    "chars": 837,
    "preview": "package com.senon.module_life.contract;\n\nimport com.senon.lib_common.base.BasePresenter;\nimport com.senon.lib_common.bas"
  },
  {
    "path": "module_life/src/main/java/com/senon/module_life/contract/LifeMainFragmentCon.java",
    "chars": 646,
    "preview": "package com.senon.module_life.contract;\n\nimport com.senon.lib_common.base.BasePresenter;\nimport com.senon.lib_common.bas"
  },
  {
    "path": "module_life/src/main/java/com/senon/module_life/fragment/LifeMainFragment.java",
    "chars": 8085,
    "preview": "package com.senon.module_life.fragment;\n\nimport android.support.v7.widget.LinearLayoutManager;\nimport android.support.v7"
  },
  {
    "path": "module_life/src/main/java/com/senon/module_life/presenter/KnowledgeSysActivityPre.java",
    "chars": 4265,
    "preview": "package com.senon.module_life.presenter;\n\nimport android.content.Context;\nimport com.senon.lib_common.base.BaseResponse;"
  },
  {
    "path": "module_life/src/main/java/com/senon/module_life/presenter/LifeMainFragmentPre.java",
    "chars": 2014,
    "preview": "package com.senon.module_life.presenter;\n\nimport android.content.Context;\n\nimport com.senon.lib_common.bean.KnowledgeSys"
  },
  {
    "path": "module_life/src/main/release/AndroidManifest.xml",
    "chars": 842,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    package="
  },
  {
    "path": "module_life/src/main/res/drawable/life_ic_launcher_background.xml",
    "chars": 5606,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:wi"
  },
  {
    "path": "module_life/src/main/res/drawable/life_shape_gray_10.xml",
    "chars": 304,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<shape xmlns:android=\"http://schemas.android.com/apk/res/android\" >\n\n    <!-- vie"
  },
  {
    "path": "module_life/src/main/res/drawable/life_shape_white_con30.xml",
    "chars": 301,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<shape xmlns:android=\"http://schemas.android.com/apk/res/android\" >\n\n    <!-- vie"
  },
  {
    "path": "module_life/src/main/res/layout/life_activity_home_article.xml",
    "chars": 724,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xm"
  },
  {
    "path": "module_life/src/main/res/layout/life_activity_main.xml",
    "chars": 498,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xm"
  },
  {
    "path": "module_life/src/main/res/layout/life_activity_splash.xml",
    "chars": 675,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xm"
  },
  {
    "path": "module_life/src/main/res/layout/life_adapter_knowledgesys_item.xml",
    "chars": 4032,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    an"
  },
  {
    "path": "module_life/src/main/res/layout/life_adapter_lifemain_flowlayout_item.xml",
    "chars": 590,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<TextView\n    android:layout_marginRight=\"@dimen/mm15\"\n    android:layout_marginB"
  },
  {
    "path": "module_life/src/main/res/layout/life_adapter_lifemain_fragment.xml",
    "chars": 2325,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    an"
  },
  {
    "path": "module_life/src/main/res/layout/life_fragment_main.xml",
    "chars": 1842,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    an"
  },
  {
    "path": "module_life/src/main/res/values/colors.xml",
    "chars": 208,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <color name=\"colorPrimary\">#3F51B5</color>\n    <color name=\"color"
  },
  {
    "path": "module_life/src/main/res/values/strings.xml",
    "chars": 74,
    "preview": "<resources>\n    <string name=\"life_app_name\">玩安卓_体系</string>\n</resources>\n"
  },
  {
    "path": "module_life/src/main/res/values/styles.xml",
    "chars": 381,
    "preview": "<resources>\n\n    <!-- Base application theme. -->\n    <style name=\"AppTheme\" parent=\"Theme.AppCompat.Light.NoActionBar\">"
  }
]

// ... and 30 more files (download for full content)

About this extraction

This page contains the full source code of the senonwx/WanAndroid GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 230 files (550.5 KB), approximately 148.4k tokens, and a symbol index with 1194 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!