Full Code of wu928320442/EasyAndroid for AI

master 35d2b3091980 cached
106 files
136.5 KB
38.3k tokens
385 symbols
1 requests
Download .txt
Repository: wu928320442/EasyAndroid
Branch: master
Commit: 35d2b3091980
Files: 106
Total size: 136.5 KB

Directory structure:
gitextract_ng9b39p4/

├── .gitignore
├── .idea/
│   ├── compiler.xml
│   ├── copyright/
│   │   └── profiles_settings.xml
│   ├── encodings.xml
│   ├── gradle.xml
│   ├── misc.xml
│   ├── modules.xml
│   ├── runConfigurations.xml
│   └── vcs.xml
├── README.md
├── app/
│   ├── .gitignore
│   ├── build.gradle
│   ├── proguard-rules.pro
│   └── src/
│       └── main/
│           ├── AndroidManifest.xml
│           ├── java/
│           │   └── com/
│           │       └── wjj/
│           │           └── easy/
│           │               └── easyandroidHelper/
│           │                   ├── AppApplication.java
│           │                   ├── common/
│           │                   │   ├── base/
│           │                   │   │   ├── BaseActivity.java
│           │                   │   │   ├── BaseFragment.java
│           │                   │   │   ├── BasePresenter.java
│           │                   │   │   ├── BaseView.java
│           │                   │   │   ├── SimpleActivity.java
│           │                   │   │   └── SimpleFragment.java
│           │                   │   ├── di/
│           │                   │   │   ├── ActivityCommonComponent.java
│           │                   │   │   ├── AppCommonComponent.java
│           │                   │   │   ├── AppCommonModule.java
│           │                   │   │   └── FragmentCommonComponent.java
│           │                   │   └── net/
│           │                   │       ├── ApiService.java
│           │                   │       ├── AppHttp.java
│           │                   │       ├── CookieHead.java
│           │                   │       └── CookieInterceptor.java
│           │                   ├── model/
│           │                   │   ├── ListInfo.java
│           │                   │   ├── LoginInfo.java
│           │                   │   ├── LoginResponse.java
│           │                   │   └── base/
│           │                   │       ├── BaseChartInfo.java
│           │                   │       ├── BaseChartListInfo.java
│           │                   │       ├── BaseResponseInfo.java
│           │                   │       ├── BaseResponseListInfo.java
│           │                   │       └── BaseStatus.java
│           │                   ├── module/
│           │                   │   ├── login/
│           │                   │   │   ├── LoginActivity.java
│           │                   │   │   ├── LoginContract.java
│           │                   │   │   ├── LoginPresenter.java
│           │                   │   │   └── domain/
│           │                   │   │       ├── GetVerifyCodeTask.java
│           │                   │   │       └── LoginTask.java
│           │                   │   └── main/
│           │                   │       ├── HomeContract.java
│           │                   │       ├── HomeFragment.java
│           │                   │       ├── HomePresenter.java
│           │                   │       ├── MainActivity.java
│           │                   │       ├── MyContract.java
│           │                   │       ├── MyFragment.java
│           │                   │       ├── MyPresenter.java
│           │                   │       ├── adapter/
│           │                   │       │   └── HomeAdapter.java
│           │                   │       └── domain/
│           │                   │           └── GetListTask.java
│           │                   ├── utils/
│           │                   │   └── SecretUtils.java
│           │                   └── widget/
│           │                       └── dialog/
│           │                           ├── BaseDialog.java
│           │                           └── DialogLoading.java
│           └── res/
│               ├── anim/
│               │   ├── roll_down.xml
│               │   ├── roll_up.xml
│               │   ├── slide_in_bottom.xml
│               │   └── slide_out_bottom.xml
│               ├── drawable/
│               │   └── bg_color_white_corners_10.xml
│               ├── layout/
│               │   ├── activity_login.xml
│               │   ├── activity_main.xml
│               │   ├── dialog_loading.xml
│               │   ├── fragment_home.xml
│               │   ├── fragment_my.xml
│               │   ├── home_list_item.xml
│               │   └── view_main_tab.xml
│               ├── values/
│               │   ├── colors.xml
│               │   ├── dimens.xml
│               │   ├── strings.xml
│               │   └── styles.xml
│               ├── values-v21/
│               │   └── styles.xml
│               └── values-w820dp/
│                   └── dimens.xml
├── build.gradle
├── easyandroid/
│   ├── .gitignore
│   ├── build.gradle
│   ├── proguard-rules.pro
│   └── src/
│       └── main/
│           ├── AndroidManifest.xml
│           ├── java/
│           │   └── com/
│           │       └── wjj/
│           │           └── easy/
│           │               └── easyandroid/
│           │                   ├── http/
│           │                   │   └── Http.java
│           │                   ├── mvp/
│           │                   │   ├── EasyBasePresenter.java
│           │                   │   ├── EasyBasePresenterFrg.java
│           │                   │   ├── EasyBaseView.java
│           │                   │   ├── EasyBaseViewFrg.java
│           │                   │   ├── di/
│           │                   │   │   ├── components/
│           │                   │   │   │   ├── ActivityComponent.java
│           │                   │   │   │   ├── AppComponent.java
│           │                   │   │   │   └── FragmentComponent.java
│           │                   │   │   ├── modules/
│           │                   │   │   │   ├── ActivityModule.java
│           │                   │   │   │   ├── AppModule.java
│           │                   │   │   │   └── FragmentModule.java
│           │                   │   │   └── scopes/
│           │                   │   │       ├── ActivityScope.java
│           │                   │   │       ├── ApplicationScope.java
│           │                   │   │       └── FragmentScope.java
│           │                   │   └── domain/
│           │                   │       ├── executor/
│           │                   │       │   ├── Executor.java
│           │                   │       │   ├── MainThread.java
│           │                   │       │   └── impl/
│           │                   │       │       ├── MainThreadImpl.java
│           │                   │       │       └── ThreadExecutor.java
│           │                   │       └── usecases/
│           │                   │           ├── AbstractUseCase.java
│           │                   │           └── UseCase.java
│           │                   └── ui/
│           │                       ├── EasyActivity.java
│           │                       └── EasyFragment.java
│           └── res/
│               └── values/
│                   └── strings.xml
├── gradle/
│   └── wrapper/
│       ├── gradle-wrapper.jar
│       └── gradle-wrapper.properties
├── gradle.properties
├── gradlew
├── gradlew.bat
└── settings.gradle

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

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


================================================
FILE: .idea/compiler.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
  <component name="CompilerConfiguration">
    <resourceExtensions />
    <wildcardResourcePatterns>
      <entry name="!?*.java" />
      <entry name="!?*.form" />
      <entry name="!?*.class" />
      <entry name="!?*.groovy" />
      <entry name="!?*.scala" />
      <entry name="!?*.flex" />
      <entry name="!?*.kt" />
      <entry name="!?*.clj" />
      <entry name="!?*.aj" />
    </wildcardResourcePatterns>
    <annotationProcessing>
      <profile default="true" name="Default" enabled="false">
        <processorPath useClasspath="true" />
      </profile>
    </annotationProcessing>
  </component>
</project>

================================================
FILE: .idea/copyright/profiles_settings.xml
================================================
<component name="CopyrightManager">
  <settings default="" />
</component>

================================================
FILE: .idea/encodings.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
  <component name="Encoding">
    <file url="PROJECT" charset="UTF-8" />
  </component>
</project>

================================================
FILE: .idea/gradle.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
  <component name="GradleSettings">
    <option name="linkedExternalProjectsSettings">
      <GradleProjectSettings>
        <option name="distributionType" value="DEFAULT_WRAPPED" />
        <option name="externalProjectPath" value="$PROJECT_DIR$" />
        <option name="modules">
          <set>
            <option value="$PROJECT_DIR$" />
            <option value="$PROJECT_DIR$/app" />
            <option value="$PROJECT_DIR$/easyandroid" />
          </set>
        </option>
        <option name="resolveModulePerSourceSet" value="false" />
      </GradleProjectSettings>
    </option>
  </component>
</project>

================================================
FILE: .idea/misc.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
  <component name="EntryPointsManager">
    <entry_points version="2.0" />
  </component>
  <component name="NullableNotNullManager">
    <option name="myDefaultNullable" value="android.support.annotation.Nullable" />
    <option name="myDefaultNotNull" value="android.support.annotation.NonNull" />
    <option name="myNullables">
      <value>
        <list size="4">
          <item index="0" class="java.lang.String" itemvalue="org.jetbrains.annotations.Nullable" />
          <item index="1" class="java.lang.String" itemvalue="javax.annotation.Nullable" />
          <item index="2" class="java.lang.String" itemvalue="edu.umd.cs.findbugs.annotations.Nullable" />
          <item index="3" class="java.lang.String" itemvalue="android.support.annotation.Nullable" />
        </list>
      </value>
    </option>
    <option name="myNotNulls">
      <value>
        <list size="4">
          <item index="0" class="java.lang.String" itemvalue="org.jetbrains.annotations.NotNull" />
          <item index="1" class="java.lang.String" itemvalue="javax.annotation.Nonnull" />
          <item index="2" class="java.lang.String" itemvalue="edu.umd.cs.findbugs.annotations.NonNull" />
          <item index="3" class="java.lang.String" itemvalue="android.support.annotation.NonNull" />
        </list>
      </value>
    </option>
  </component>
  <component name="ProjectLevelVcsManager" settingsEditedManually="false">
    <OptionsSetting value="true" id="Add" />
    <OptionsSetting value="true" id="Remove" />
    <OptionsSetting value="true" id="Checkout" />
    <OptionsSetting value="true" id="Update" />
    <OptionsSetting value="true" id="Status" />
    <OptionsSetting value="true" id="Edit" />
    <ConfirmationsSetting value="0" id="Add" />
    <ConfirmationsSetting value="0" id="Remove" />
  </component>
  <component name="ProjectRootManager" version="2" languageLevel="JDK_1_7" default="true" assert-keyword="true" jdk-15="true" project-jdk-name="1.8" project-jdk-type="JavaSDK">
    <output url="file://$PROJECT_DIR$/build/classes" />
  </component>
  <component name="ProjectType">
    <option name="id" value="Android" />
  </component>
  <component name="masterDetails">
    <states>
      <state key="ProjectJDKs.UI">
        <settings>
          <last-edited>1.8</last-edited>
          <splitter-proportions>
            <option name="proportions">
              <list>
                <option value="0.2" />
              </list>
            </option>
          </splitter-proportions>
        </settings>
      </state>
    </states>
  </component>
</project>

================================================
FILE: .idea/modules.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
  <component name="ProjectModuleManager">
    <modules>
      <module fileurl="file://$PROJECT_DIR$/EasyAndroid.iml" filepath="$PROJECT_DIR$/EasyAndroid.iml" />
      <module fileurl="file://$PROJECT_DIR$/app/app.iml" filepath="$PROJECT_DIR$/app/app.iml" />
      <module fileurl="file://$PROJECT_DIR$/easyandroid/easyandroid.iml" filepath="$PROJECT_DIR$/easyandroid/easyandroid.iml" />
    </modules>
  </component>
</project>

================================================
FILE: .idea/runConfigurations.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
  <component name="RunConfigurationProducerService">
    <option name="ignoredProducers">
      <set>
        <option value="org.jetbrains.plugins.gradle.execution.test.runner.AllInPackageGradleConfigurationProducer" />
        <option value="org.jetbrains.plugins.gradle.execution.test.runner.TestClassGradleConfigurationProducer" />
        <option value="org.jetbrains.plugins.gradle.execution.test.runner.TestMethodGradleConfigurationProducer" />
      </set>
    </option>
  </component>
</project>

================================================
FILE: .idea/vcs.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
  <component name="VcsDirectoryMappings">
    <mapping directory="$PROJECT_DIR$" vcs="Git" />
  </component>
</project>

================================================
FILE: README.md
================================================
最新版RxEasyAndroid 支持RxJava2 可移步到 https://github.com/wu928320442/RxEasyAndroid

----------------本版本为非RxJava2版本---------------
# 需要的环境
* JDK1.8
* SDK
* AndroidStudio开发工具

# 特性
* 整合主流HTTP网络、图片加载、MVP(Clean+Dagger2)架构的一套快速高效的开发框架
* 包含app library 两个Module 组件化开发

# 用到的第三方框架
* SDK自带扩展依赖包
* Retrofit2网络层处理 使用OKHTTP3处理
* Fresco图片加载处理 使用OKHTTP3处理
* OKHTTP3  HTTP基础库,提供给网络层处理和图片加载
* PersistentCookieJar快速Cookie持久化与缓存库
* Dagger2 依赖注入库,整合Activity,Fragment,Presenter,Task之间的依赖关系
* Butterknife View的注入库
* BaseRecyclerViewAdapterHelper Recycler下拉加载库
* Utilcode实用工具库
* Logger 一个简洁漂亮的日志打印库

# 类库导入
```gradle
compile 'com.wjj.easy:easyandroid:1.0.0'
```
# 联系方式
* **QQ** 928320442
* **Android开发交流群** 323876830
* **Email** wujiajun311@gmail.com


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


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

android {
    compileSdkVersion rootProject.ext.compileSdkVersion
    buildToolsVersion rootProject.ext.buildToolsVersion

    defaultConfig {
        applicationId rootProject.ext.applicationId
        minSdkVersion rootProject.ext.minSdkVersion
        targetSdkVersion rootProject.ext.targetSdkVersion
        versionCode 1
        versionName "1.0"
    }

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

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile project(path: ':easyandroid')
    //butterknife viewInject
    compile "com.jakewharton:butterknife:$rootProject.butterknife"
    compile "com.jakewharton:butterknife-compiler:$rootProject.butterknife"
    compile 'com.wjj.easy:qrcodestyle:1.0.0'
}


================================================
FILE: app/proguard-rules.pro
================================================
# Add project specific ProGuard rules here.
# By default, the flags in this file are appended to flags specified
# in /Users/wujiajun/Library/Android/sdk/tools/proguard/proguard-android.txt
# You can edit the include path and order by changing the proguardFiles
# directive in build.gradle.
#
# For more details, see
#   http://developer.android.com/guide/developing/tools/proguard.html

# Add any project specific keep options here:

# 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 *;
#}
#-------------------------------------------基本不用动区域--------------------------------------------
#---------------------------------基本指令区----------------------------------
-optimizationpasses 5
-dontskipnonpubliclibraryclassmembers
-printmapping proguardMapping.txt
-optimizations !code/simplification/cast,!field/*,!class/merging/*
-keepattributes *Annotation*,InnerClasses
-keepattributes Signature
-keepattributes SourceFile,LineNumberTable
#----------------------------------------------------------------------------

#---------------------------------默认保留区---------------------------------
#继承activity,application,service,broadcastReceiver,contentprovider....不进行混淆
-keep public class * extends android.app.Activity
-keep public class * extends android.app.Application
-keep public class * extends android.support.multidex.MultiDexApplication
-keep public class * extends android.app.Service
-keep public class * extends android.content.BroadcastReceiver
-keep public class * extends android.content.ContentProvider
-keep public class * extends android.app.backup.BackupAgentHelper
-keep public class * extends android.preference.Preference
-keep public class * extends android.view.View
-keep public class com.android.vending.licensing.ILicensingService
-keep class android.support.** {*;}

-keep class **JNI* {*;}

-keep public class * extends android.view.View{
    *** get*();
    void set*(***);
    public <init>(android.content.Context);
    public <init>(android.content.Context, android.util.AttributeSet);
    public <init>(android.content.Context, android.util.AttributeSet, int);
}
-keepclasseswithmembers class * {
    public <init>(android.content.Context, android.util.AttributeSet);
    public <init>(android.content.Context, android.util.AttributeSet, int);
}
#这个主要是在layout 中写的onclick方法android:onclick="onClick",不进行混淆
-keepclassmembers class * extends android.app.Activity {
   public void *(android.view.View);
}

-keepclassmembers class * implements java.io.Serializable {
    static final long serialVersionUID;
    private static final java.io.ObjectStreamField[] serialPersistentFields;
    private void writeObject(java.io.ObjectOutputStream);
    private void readObject(java.io.ObjectInputStream);
    java.lang.Object writeReplace();
    java.lang.Object readResolve();
}
-keep class **.R$* {
 *;
}

-keepclassmembers class * {
    void *(*Event);
}

-keepclassmembers enum * {
    public static **[] values();
    public static ** valueOf(java.lang.String);
}
-keep class * implements android.os.Parcelable {
  public static final android.os.Parcelable$Creator *;
}
#// natvie 方法不混淆
-keepclasseswithmembernames class * {
    native <methods>;
}

#保持 Parcelable 不被混淆
-keep class * implements android.os.Parcelable {
  public static final android.os.Parcelable$Creator *;
}
#---------------------第三方---------------
#butterknife
-keep class **$$ViewBinder { *; }
#BaseRecyclerViewAdapterHelper
-keep class com.chad.library.adapter.** {
   *;
}

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

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

    <application
        android:name=".AppApplication"
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".module.login.LoginActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

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

</manifest>

================================================
FILE: app/src/main/java/com/wjj/easy/easyandroidHelper/AppApplication.java
================================================
package com.wjj.easy.easyandroidHelper;

import android.app.Application;

import com.wjj.easy.easyandroidHelper.common.di.AppCommonComponent;
import com.wjj.easy.easyandroidHelper.common.di.AppCommonModule;
import com.wjj.easy.easyandroidHelper.common.di.DaggerAppCommonComponent;

/**
 * Created by wujiajun on 17/4/6.
 */

public class AppApplication extends Application {

    AppCommonComponent aComponent;

    @Override
    public void onCreate() {
        super.onCreate();
        aComponent = DaggerAppCommonComponent.builder().appCommonModule(new AppCommonModule(this)).build();
    }

    public AppCommonComponent getAppComponent() {
        return aComponent;
    }
}


================================================
FILE: app/src/main/java/com/wjj/easy/easyandroidHelper/common/base/BaseActivity.java
================================================
package com.wjj.easy.easyandroidHelper.common.base;

import android.os.Bundle;
import android.support.annotation.Nullable;

import com.blankj.utilcode.util.ToastUtils;
import com.wjj.easy.easyandroid.mvp.EasyBasePresenter;
import com.wjj.easy.easyandroid.mvp.di.modules.ActivityModule;
import com.wjj.easy.easyandroid.ui.EasyActivity;
import com.wjj.easy.easyandroidHelper.AppApplication;
import com.wjj.easy.easyandroidHelper.common.di.ActivityCommonComponent;
import com.wjj.easy.easyandroidHelper.common.di.DaggerActivityCommonComponent;
import com.wjj.easy.easyandroidHelper.widget.dialog.DialogLoading;

import javax.inject.Inject;

import butterknife.ButterKnife;

/**
 * Activity业务基类
 * Created by wujiajun on 17/4/10.
 */

public abstract class BaseActivity<P extends EasyBasePresenter> extends EasyActivity {

    protected DialogLoading loading;

    @Inject
    protected P mPresenter;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        initView();
        initInject();
        if (mPresenter != null)
            mPresenter.attachView(this);
        initEventAndData();
    }

    protected void initView() {
        ButterKnife.bind(this);
        loading = new DialogLoading(this);
    }

    public void toast(String msg) {
        ToastUtils.showShortToast(msg);
    }

    public void showLoading() {
        loading.show();
    }

    public void hiddenLoading() {
        loading.hide();
    }

    protected ActivityCommonComponent getActivityComponent() {
        return DaggerActivityCommonComponent.builder()
                .appCommonComponent(((AppApplication) getApplication()).getAppComponent())
                .activityModule(getActivityModule())
                .build();
    }

    protected ActivityModule getActivityModule() {
        return new ActivityModule(this);
    }

    public P getPresenter() {
        return mPresenter;
    }

    protected abstract void initInject();

    protected abstract void initEventAndData();
}


================================================
FILE: app/src/main/java/com/wjj/easy/easyandroidHelper/common/base/BaseFragment.java
================================================
package com.wjj.easy.easyandroidHelper.common.base;

import android.view.View;

import com.blankj.utilcode.util.ToastUtils;
import com.wjj.easy.easyandroid.mvp.EasyBasePresenter;
import com.wjj.easy.easyandroid.mvp.di.modules.FragmentModule;
import com.wjj.easy.easyandroid.ui.EasyFragment;
import com.wjj.easy.easyandroidHelper.AppApplication;
import com.wjj.easy.easyandroidHelper.common.di.DaggerFragmentCommonComponent;
import com.wjj.easy.easyandroidHelper.common.di.FragmentCommonComponent;
import com.wjj.easy.easyandroidHelper.widget.dialog.DialogLoading;

import javax.inject.Inject;

import butterknife.ButterKnife;

/**
 * Fragment业务基类
 *
 * @author wujiajun
 */

public abstract class BaseFragment<P extends EasyBasePresenter> extends EasyFragment {

    @Inject
    protected P mPresenter;

    protected DialogLoading loading;

    @Override
    protected void initView(View view) {
        ButterKnife.bind(this, view);
        loading = new DialogLoading(getActivity());
    }

    @Override
    protected void init(View view) {
        initInject();
        if (mPresenter != null)
            mPresenter.attachView(this);
        initEventAndData();
    }

    @Override
    public void onStart() {
        super.onStart();
        mPresenter.start();
    }

    public void toast(String msg) {
        ToastUtils.showShortToast(msg);
    }

    public void showLoading() {
        loading.show();
    }

    public void hiddenLoading() {
        loading.hide();
    }

    protected FragmentCommonComponent getFragmentComponent() {
        return DaggerFragmentCommonComponent.builder()
                .appCommonComponent(((AppApplication) getActivity().getApplication()).getAppComponent())
                .fragmentModule(getFragmentModule())
                .build();
    }

    protected FragmentModule getFragmentModule() {
        return new FragmentModule(this);
    }

    protected abstract void initInject();

    protected abstract void initEventAndData();

    public void setPresenter(P presenter) {
        mPresenter = presenter;
    }

    public P getPresenter() {
        return mPresenter;
    }
}


================================================
FILE: app/src/main/java/com/wjj/easy/easyandroidHelper/common/base/BasePresenter.java
================================================
package com.wjj.easy.easyandroidHelper.common.base;

import com.wjj.easy.easyandroid.mvp.EasyBasePresenter;
import com.wjj.easy.easyandroid.mvp.EasyBaseView;
import com.wjj.easy.easyandroid.mvp.domain.executor.Executor;
import com.wjj.easy.easyandroid.mvp.domain.executor.MainThread;
import com.wjj.easy.easyandroid.mvp.domain.usecases.AbstractUseCase;

import javax.inject.Inject;

/**
 * Presenter基类
 *
 * @author wujiajun
 */

public class BasePresenter<V extends EasyBaseView> implements EasyBasePresenter<V> {

    protected V mView;

    @Inject
    Executor threadExecutor;
    @Inject
    MainThread mainThread;

    @Override
    public void start() {

    }

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

    public V getView() {
        return mView;
    }

    public Executor getThreadExecutor() {
        return threadExecutor;
    }

    protected void execute(AbstractUseCase task) {
        getThreadExecutor().execute(task);
    }
}


================================================
FILE: app/src/main/java/com/wjj/easy/easyandroidHelper/common/base/BaseView.java
================================================
package com.wjj.easy.easyandroidHelper.common.base;

import com.wjj.easy.easyandroid.mvp.EasyBasePresenter;
import com.wjj.easy.easyandroid.mvp.EasyBaseView;

/**
 * BaseView业务基类
 * Created by wujiajun on 17/4/14.
 */

public interface BaseView extends EasyBaseView {
    void toast(String msg);

    void showLoading();

    void hiddenLoading();
}


================================================
FILE: app/src/main/java/com/wjj/easy/easyandroidHelper/common/base/SimpleActivity.java
================================================
package com.wjj.easy.easyandroidHelper.common.base;

import android.os.Bundle;
import android.support.annotation.Nullable;

import com.blankj.utilcode.util.ToastUtils;
import com.wjj.easy.easyandroid.ui.EasyActivity;
import com.wjj.easy.easyandroidHelper.widget.dialog.DialogLoading;

import butterknife.ButterKnife;

/**
 * Activity业务基类简单实现(不包含Presenter)
 *
 * @author wujiajun
 */

public abstract class SimpleActivity extends EasyActivity {

    protected DialogLoading loading;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        initView();
        initEventAndData();
    }

    protected void initView() {
        ButterKnife.bind(this);
        loading = new DialogLoading(this);
    }

    public void toast(String msg) {
        ToastUtils.showShortToast(msg);
    }

    public void showLoading() {
        loading.show();
    }

    public void hiddenLoading() {
        loading.hide();
    }

    protected abstract void initEventAndData();
}


================================================
FILE: app/src/main/java/com/wjj/easy/easyandroidHelper/common/base/SimpleFragment.java
================================================
package com.wjj.easy.easyandroidHelper.common.base;

import android.view.View;

import com.blankj.utilcode.util.ToastUtils;
import com.wjj.easy.easyandroid.ui.EasyFragment;
import com.wjj.easy.easyandroidHelper.widget.dialog.DialogLoading;

import butterknife.ButterKnife;

/**
 * Fragment业务基类(不包含Presenter)
 *
 * @author wujiajun
 */

public abstract class SimpleFragment extends EasyFragment {

    protected DialogLoading loading;

    @Override
    protected void initView(View view) {
        ButterKnife.bind(this, view);
        loading = new DialogLoading(getActivity());
    }

    @Override
    protected void init(View view) {
        initEventAndData();
    }

    @Override
    public void onStart() {
        super.onStart();
    }

    public void toast(String msg) {
        ToastUtils.showShortToast(msg);
    }

    public void showLoading() {
        loading.show();
    }

    public void hiddenLoading() {
        loading.hide();
    }

    protected abstract void initEventAndData();

}


================================================
FILE: app/src/main/java/com/wjj/easy/easyandroidHelper/common/di/ActivityCommonComponent.java
================================================
package com.wjj.easy.easyandroidHelper.common.di;

import com.wjj.easy.easyandroid.mvp.di.components.ActivityComponent;
import com.wjj.easy.easyandroid.mvp.di.modules.ActivityModule;
import com.wjj.easy.easyandroid.mvp.di.scopes.ActivityScope;
import com.wjj.easy.easyandroidHelper.module.login.LoginActivity;
import com.wjj.easy.easyandroidHelper.module.main.MainActivity;

import dagger.Component;

/**
 * Activity注入器
 * @author wujiajun
 */
@ActivityScope
@Component(dependencies = AppCommonComponent.class, modules = {ActivityModule.class})
public interface ActivityCommonComponent extends ActivityComponent {

    void inject(LoginActivity activity);

    void inject(MainActivity activity);
}


================================================
FILE: app/src/main/java/com/wjj/easy/easyandroidHelper/common/di/AppCommonComponent.java
================================================
package com.wjj.easy.easyandroidHelper.common.di;

import com.wjj.easy.easyandroid.mvp.di.components.AppComponent;
import com.wjj.easy.easyandroid.mvp.di.scopes.ApplicationScope;
import com.wjj.easy.easyandroid.mvp.domain.executor.Executor;
import com.wjj.easy.easyandroid.mvp.domain.executor.MainThread;
import com.wjj.easy.easyandroidHelper.common.net.ApiService;

import dagger.Component;

/**
 * Application注入器
 *
 * @author wujiajun
 */
@ApplicationScope
@Component(modules = AppCommonModule.class)
public interface AppCommonComponent extends AppComponent {
    ApiService getApiService();

    Executor getExecutor();

    MainThread getMainThread();
}


================================================
FILE: app/src/main/java/com/wjj/easy/easyandroidHelper/common/di/AppCommonModule.java
================================================
package com.wjj.easy.easyandroidHelper.common.di;

import android.content.Context;

import com.blankj.utilcode.util.Utils;
import com.facebook.drawee.backends.pipeline.Fresco;
import com.facebook.imagepipeline.backends.okhttp3.OkHttpImagePipelineConfigFactory;
import com.facebook.imagepipeline.core.ImagePipelineConfig;
import com.franmontiel.persistentcookiejar.ClearableCookieJar;
import com.franmontiel.persistentcookiejar.PersistentCookieJar;
import com.franmontiel.persistentcookiejar.cache.SetCookieCache;
import com.franmontiel.persistentcookiejar.persistence.SharedPrefsCookiePersistor;
import com.wjj.easy.easyandroid.http.Http;
import com.wjj.easy.easyandroid.mvp.di.modules.AppModule;
import com.wjj.easy.easyandroid.mvp.domain.executor.Executor;
import com.wjj.easy.easyandroid.mvp.domain.executor.MainThread;
import com.wjj.easy.easyandroid.mvp.domain.executor.impl.MainThreadImpl;
import com.wjj.easy.easyandroid.mvp.domain.executor.impl.ThreadExecutor;
import com.wjj.easy.easyandroidHelper.common.net.ApiService;
import com.wjj.easy.easyandroidHelper.common.net.CookieInterceptor;

import dagger.Module;
import dagger.Provides;

/**
 * Application Module
 *
 * @author wujiajun
 */
@Module
public class AppCommonModule extends AppModule {

    private Http mHttp;

    public AppCommonModule(Context context) {
        super(context);
        initHttp();
        initImage();
        initUtils();
    }

    /**
     * Http初始化
     */
    private void initHttp() {
        //cookie cache & persistor
        ClearableCookieJar cookieJar =
                new PersistentCookieJar(new SetCookieCache(), new SharedPrefsCookiePersistor(provideContext()));
        mHttp = new Http.HttpBuilder()
                .setBaseUrl(ApiService.HOST)
                .setCookieJar(cookieJar)
                .setTimeout(15)
                .addInterceptor(new CookieInterceptor())
                .build();
    }

    /**
     * Fresco初始化
     */
    private void initImage() {
        ImagePipelineConfig config = OkHttpImagePipelineConfigFactory
                .newBuilder(provideContext(), mHttp.getClient())
                .build();
        Fresco.initialize(provideContext(), config);
    }

    /**
     * Utils库初始化
     */
    private void initUtils() {
        Utils.init(provideContext());
    }

    @Provides
    ApiService provideApiService() {
        return mHttp.getRetrofit().create(ApiService.class);
    }

    @Provides
    Executor provideExecutor() {
        return ThreadExecutor.getInstance();
    }

    @Provides
    MainThread provideMainThread() {
        return MainThreadImpl.getInstance();
    }

}


================================================
FILE: app/src/main/java/com/wjj/easy/easyandroidHelper/common/di/FragmentCommonComponent.java
================================================
package com.wjj.easy.easyandroidHelper.common.di;

import com.wjj.easy.easyandroid.mvp.di.components.FragmentComponent;
import com.wjj.easy.easyandroid.mvp.di.modules.FragmentModule;
import com.wjj.easy.easyandroid.mvp.di.scopes.FragmentScope;
import com.wjj.easy.easyandroidHelper.module.main.HomeFragment;
import com.wjj.easy.easyandroidHelper.module.main.MyFragment;

import dagger.Component;

/**
 * Fragment注入器
 *
 * @author wujiajun
 */
@FragmentScope
@Component(dependencies = AppCommonComponent.class, modules = {FragmentModule.class})
public interface FragmentCommonComponent extends FragmentComponent {

    void inject(HomeFragment fragment);

    void inject(MyFragment fragment);
}


================================================
FILE: app/src/main/java/com/wjj/easy/easyandroidHelper/common/net/ApiService.java
================================================
package com.wjj.easy.easyandroidHelper.common.net;

import com.wjj.easy.easyandroidHelper.model.ListInfo;
import com.wjj.easy.easyandroidHelper.model.LoginResponse;
import com.wjj.easy.easyandroidHelper.model.base.BaseStatus;

import retrofit2.Call;
import retrofit2.http.Field;
import retrofit2.http.FormUrlEncoded;
import retrofit2.http.GET;
import retrofit2.http.POST;
import retrofit2.http.Query;

/**
 * Created by wujiajun on 17/4/5.
 */

public interface ApiService {

    // 线上
    String HOST = "http://dw.qianbao666.com/";//dcw.qbao.com dw.qianbao666.com


    /**
     * 获取注册验证码
     */
    @FormUrlEncoded
    @POST(HOST + "app/sendSMS.do")
    Call<BaseStatus> getVerifyCode(@Field("username") String username, @Field("password") String pwd);

    /**
     * 用户登录
     */
    @FormUrlEncoded
    @POST(HOST + "app/login.do")
    Call<LoginResponse> login(@Field("username") String username, @Field("password") String pwd, @Field("code") String verifyCode);

    /**
     * 获取列表数据
     */
    @GET("http://baoyue.qbao.com/app/task/list.json")
    Call<ListInfo> getList(@Query("type") int type, @Query("page") int page, @Query("rows") int rows);


}


================================================
FILE: app/src/main/java/com/wjj/easy/easyandroidHelper/common/net/AppHttp.java
================================================
package com.wjj.easy.easyandroidHelper.common.net;

import com.wjj.easy.easyandroid.http.Http;
import com.wjj.easy.easyandroidHelper.model.ListInfo;
import com.wjj.easy.easyandroidHelper.model.LoginResponse;
import com.wjj.easy.easyandroidHelper.model.base.BaseStatus;

import javax.inject.Inject;

import retrofit2.Call;

/**
 * Created by wujiajun on 17/4/5.
 */

public class AppHttp {

    private ApiService apiService;

    @Inject
    public AppHttp(ApiService apiService) {
        this.apiService = apiService;
    }

    public void getVerifyCode(String username, String pwd, final Http.HttpCallback<BaseStatus> callback) {
        Call<BaseStatus> call = apiService.getVerifyCode(username, pwd);
        call.enqueue(new Http.CallbackDefault(callback));
        call.request();
    }

    public void login(String username, String pwd, String verifyCode, final Http.HttpCallback<LoginResponse> callback) {
        Call<LoginResponse> call = apiService.login(username, pwd, verifyCode);
        call.enqueue(new Http.CallbackDefault(callback));
        call.request();
    }

    public void getList(int index, final Http.HttpCallback<ListInfo> callback) {
        Call<ListInfo> call = apiService.getList(1,index,20);
        call.enqueue(new Http.CallbackDefault(callback));
        call.request();
    }
}


================================================
FILE: app/src/main/java/com/wjj/easy/easyandroidHelper/common/net/CookieHead.java
================================================
package com.wjj.easy.easyandroidHelper.common.net;

/**
 * Created by wujiajun on 17/4/11.
 */

public enum CookieHead {

    CLIENT_TYPE("client_type", "android"),
    USER_NAME("user_name", "");


    private String head;
    private String value;

    CookieHead(String head, String value) {
        this.head = head;
        this.value = value;
    }

    public String getHead() {
        return head;
    }

    public String getValue() {
        return value;
    }
}


================================================
FILE: app/src/main/java/com/wjj/easy/easyandroidHelper/common/net/CookieInterceptor.java
================================================
package com.wjj.easy.easyandroidHelper.common.net;

import java.io.IOException;

import okhttp3.Interceptor;
import okhttp3.Request;
import okhttp3.Response;

/**
 * Created by wujiajun on 17/4/11.
 */

public class CookieInterceptor implements Interceptor {

    @Override
    public Response intercept(Chain chain) throws IOException {
        Request original = chain.request();
        Request request = original.newBuilder()
                .header(CookieHead.USER_NAME.getHead(), CookieHead.CLIENT_TYPE.getValue())
                .header(CookieHead.CLIENT_TYPE.getHead(), "wjj")
                .method(original.method(), original.body())
                .build();
        return chain.proceed(request);
    }
}


================================================
FILE: app/src/main/java/com/wjj/easy/easyandroidHelper/model/ListInfo.java
================================================
package com.wjj.easy.easyandroidHelper.model;

import android.os.Parcel;
import android.os.Parcelable;

import java.util.ArrayList;
import java.util.List;

/**
 * Created by ljw on 2017/4/13.
 */

public class ListInfo implements Parcelable {

    /**
     * success : true
     * returnCode : 0
     * message : ok
     * data : [{"taskId":2539544,"title":"李茶的姑妈","content":"李茶的姑妈","imageUrl":"https://qn-message.qbcdn.com/5aeceeb6753d48638a596b842ed7c98e","amt":"290","doTime":"2017-04-18","city":"南京","address":"江苏省南京市","payKind":"元","taskTypeName":"宝约优选","onlyVip":0,"hasMemberAmt":0,"memberAmt":"0","isFree":false},{"taskId":2539751,"title":"浪漫白色女神节相约鹦鹉螺市集","content":"浪漫白色女神节相约鹦鹉螺市集","imageUrl":"https://qn-message.qbcdn.com/2c5216f7e2cd49dfb1a92ec7d59da636","amt":"1","doTime":"2017-06-18","city":"上海","address":"上海市上海市","payKind":"元","taskTypeName":"宝约优选","onlyVip":0,"hasMemberAmt":0,"memberAmt":"0","isFree":false},{"taskId":2539926,"title":"走进J Studio艺术沙龙 | 用画笔定格粉红樱花,画出心中最美花海","content":"走进J Studio艺术沙龙 | 用画笔定格粉红樱花,画出心中最美花海","imageUrl":"https://qn-message.qbcdn.com/16930371610448289a859eb802e9837a","amt":"140","doTime":"2017-05-05","city":"上海","address":"上海市上海市","payKind":"元","taskTypeName":"宝约优选","onlyVip":0,"hasMemberAmt":0,"memberAmt":"0","isFree":false},{"taskId":2539933,"title":"花艺课堂 | 摘几束鲜花 搭出别样精彩","content":"花艺课堂 | 摘几束鲜花 搭出别样精彩","imageUrl":"https://qn-message.qbcdn.com/c2354e61e34d415e8b46fa0091eafda6","amt":"188","doTime":"2017-04-28","city":"上海","address":"上海市上海市","payKind":"元","taskTypeName":"宝约优选","onlyVip":0,"hasMemberAmt":0,"memberAmt":"0","isFree":false},{"taskId":2539935,"title":"最会\u201c讲故事的人\u201d英国艺术家瑞安·甘德在华首展","content":"最会\u201c讲故事的人\u201d英国艺术家瑞安·甘德在华首展","imageUrl":"https://qn-message.qbcdn.com/d09c37f19d654cef9c8b82f8cee8e17b","amt":"1","doTime":"2017-05-14","city":"上海","address":"上海市上海市","payKind":"元","taskTypeName":"宝约优选","onlyVip":0,"hasMemberAmt":0,"memberAmt":"0","isFree":false},{"taskId":2539949,"title":"ING手持吸尘器 G3006 | 机身小巧轻盈,手持轻轻松松","content":"ING手持吸尘器 G3006 | 机身小巧轻盈,手持轻轻松松","imageUrl":"https://qn-message.qbcdn.com/e8ab5b49f67c465a98060b68d209a8dd","amt":"1,192","doTime":"2017-04-30","city":"上海","address":"上海市上海市","payKind":"元","taskTypeName":"宝约优选","onlyVip":0,"hasMemberAmt":0,"memberAmt":"0","isFree":false},{"taskId":2539950,"title":"ING手持吸尘器 G3010 | 拒绝束缚·做有态度的吸尘器","content":"ING手持吸尘器 G3010 | 拒绝束缚·做有态度的吸尘器","imageUrl":"https://qn-message.qbcdn.com/9e24b97a47e242169f787979559218d9","amt":"1,639","doTime":"2017-04-30","city":"上海","address":"上海市上海市","payKind":"元","taskTypeName":"宝约优选","onlyVip":0,"hasMemberAmt":0,"memberAmt":"0","isFree":false},{"taskId":2539952,"title":"ING手持吸尘器 G3009 | 单手除尘·更轻便","content":"ING手持吸尘器 G3009 | 单手除尘·更轻便","imageUrl":"https://qn-message.qbcdn.com/416d3fa70ec24f2daac9a2492c1b0307","amt":"3,180","doTime":"2017-04-30","city":"上海","address":"上海市上海市","payKind":"元","taskTypeName":"宝约优选","onlyVip":0,"hasMemberAmt":0,"memberAmt":"0","isFree":false},{"taskId":2539983,"title":"摘草莓亲子活动|春の果实 新鲜采摘才好吃","content":"摘草莓亲子活动|春の果实 新鲜采摘才好吃","imageUrl":"https://qn-message.qbcdn.com/747deaa8a96048588bfc640c879e3285","amt":"80","doTime":"2017-04-24","city":"上海","address":"上海市上海市","payKind":"元","taskTypeName":"宝约优选","onlyVip":0,"hasMemberAmt":0,"memberAmt":"0","isFree":false},{"taskId":2540049,"title":"\u201c凝固\u2014基弗在中国\u201d安塞姆·基弗作品展  南京站","content":"\u201c凝固\u2014基弗在中国\u201d安塞姆·基弗作品展  南京站","imageUrl":"https://qn-message.qbcdn.com/3b52d69597114e3b924f21a1cb59a8ef","amt":"62","doTime":"2017-05-04","city":"南京","address":"江苏省南京市","payKind":"元","taskTypeName":"宝约优选","onlyVip":0,"hasMemberAmt":0,"memberAmt":"0","isFree":false}]
     */

    private boolean success;
    private int returnCode;
    private String message;
    private List<DataBean> data;

    public boolean isSuccess() {
        return success;
    }

    public void setSuccess(boolean success) {
        this.success = success;
    }

    public int getReturnCode() {
        return returnCode;
    }

    public void setReturnCode(int returnCode) {
        this.returnCode = returnCode;
    }

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }

    public List<DataBean> getData() {
        return data;
    }

    public void setData(List<DataBean> data) {
        this.data = data;
    }

    public static class DataBean {

        @Override
        public String toString() {
            return "DataBean{" +
                    "taskId=" + taskId +
                    ", title='" + title + '\'' +
                    ", content='" + content + '\'' +
                    ", imageUrl='" + imageUrl + '\'' +
                    ", amt='" + amt + '\'' +
                    ", doTime='" + doTime + '\'' +
                    ", city='" + city + '\'' +
                    ", address='" + address + '\'' +
                    ", payKind='" + payKind + '\'' +
                    ", taskTypeName='" + taskTypeName + '\'' +
                    ", onlyVip=" + onlyVip +
                    ", hasMemberAmt=" + hasMemberAmt +
                    ", memberAmt='" + memberAmt + '\'' +
                    ", isFree=" + isFree +
                    '}';
        }

        /**
         * taskId : 2539544
         * title : 李茶的姑妈
         * content : 李茶的姑妈
         * imageUrl : https://qn-message.qbcdn.com/5aeceeb6753d48638a596b842ed7c98e
         * amt : 290
         * doTime : 2017-04-18
         * city : 南京
         * address : 江苏省南京市
         * payKind : 元
         * taskTypeName : 宝约优选
         * onlyVip : 0
         * hasMemberAmt : 0
         * memberAmt : 0
         * isFree : false
         */

        private int taskId;
        private String title;
        private String content;
        private String imageUrl;
        private String amt;
        private String doTime;
        private String city;
        private String address;
        private String payKind;
        private String taskTypeName;
        private int onlyVip;
        private int hasMemberAmt;
        private String memberAmt;
        private boolean isFree;

        public int getTaskId() {
            return taskId;
        }

        public void setTaskId(int taskId) {
            this.taskId = taskId;
        }

        public String getTitle() {
            return title;
        }

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

        public String getContent() {
            return content;
        }

        public void setContent(String content) {
            this.content = content;
        }

        public String getImageUrl() {
            return imageUrl;
        }

        public void setImageUrl(String imageUrl) {
            this.imageUrl = imageUrl;
        }

        public String getAmt() {
            return amt;
        }

        public void setAmt(String amt) {
            this.amt = amt;
        }

        public String getDoTime() {
            return doTime;
        }

        public void setDoTime(String doTime) {
            this.doTime = doTime;
        }

        public String getCity() {
            return city;
        }

        public void setCity(String city) {
            this.city = city;
        }

        public String getAddress() {
            return address;
        }

        public void setAddress(String address) {
            this.address = address;
        }

        public String getPayKind() {
            return payKind;
        }

        public void setPayKind(String payKind) {
            this.payKind = payKind;
        }

        public String getTaskTypeName() {
            return taskTypeName;
        }

        public void setTaskTypeName(String taskTypeName) {
            this.taskTypeName = taskTypeName;
        }

        public int getOnlyVip() {
            return onlyVip;
        }

        public void setOnlyVip(int onlyVip) {
            this.onlyVip = onlyVip;
        }

        public int getHasMemberAmt() {
            return hasMemberAmt;
        }

        public void setHasMemberAmt(int hasMemberAmt) {
            this.hasMemberAmt = hasMemberAmt;
        }

        public String getMemberAmt() {
            return memberAmt;
        }

        public void setMemberAmt(String memberAmt) {
            this.memberAmt = memberAmt;
        }

        public boolean isIsFree() {
            return isFree;
        }

        public void setIsFree(boolean isFree) {
            this.isFree = isFree;
        }
    }


    @Override
    public int describeContents() {
        return 0;
    }

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeByte(this.success ? (byte) 1 : (byte) 0);
        dest.writeInt(this.returnCode);
        dest.writeString(this.message);
        dest.writeList(this.data);
    }

    public ListInfo() {
    }

    protected ListInfo(Parcel in) {
        this.success = in.readByte() != 0;
        this.returnCode = in.readInt();
        this.message = in.readString();
        this.data = new ArrayList<DataBean>();
        in.readList(this.data, DataBean.class.getClassLoader());
    }

    public static final Parcelable.Creator<ListInfo> CREATOR = new Parcelable.Creator<ListInfo>() {
        @Override
        public ListInfo createFromParcel(Parcel source) {
            return new ListInfo(source);
        }

        @Override
        public ListInfo[] newArray(int size) {
            return new ListInfo[size];
        }
    };

    @Override
    public String toString() {
        return "ListInfo{" +
                "success=" + success +
                ", returnCode=" + returnCode +
                ", message='" + message + '\'' +
                ", data=" + data +
                '}';
    }
}


================================================
FILE: app/src/main/java/com/wjj/easy/easyandroidHelper/model/LoginInfo.java
================================================
package com.wjj.easy.easyandroidHelper.model;

import android.os.Parcel;
import android.os.Parcelable;

/**
 * Created by zhaotun on 2016/12/20.
 */

public class LoginInfo implements Parcelable {

    /**
     * mobile : 15670388343
     * sessionId : 8996AD494B77221C98EE7C6D359224A1.o214zsug
     */

    private String mobile;
    private String sessionId;

    public String getMobile() {
        return mobile;
    }

    public void setMobile(String mobile) {
        this.mobile = mobile;
    }

    public String getSessionId() {
        return sessionId;
    }

    public void setSessionId(String sessionId) {
        this.sessionId = sessionId;
    }

    @Override
    public String toString() {
        return "LoginInfo{" +
                "mobile='" + mobile + '\'' +
                ", sessionId='" + sessionId + '\'' +
                '}';
    }


    @Override
    public int describeContents() {
        return 0;
    }

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeString(this.mobile);
        dest.writeString(this.sessionId);
    }

    protected LoginInfo(Parcel in) {
        this.mobile = in.readString();
        this.sessionId = in.readString();
    }

    public static final Creator<LoginInfo> CREATOR = new Creator<LoginInfo>() {
        @Override
        public LoginInfo createFromParcel(Parcel source) {
            return new LoginInfo(source);
        }

        @Override
        public LoginInfo[] newArray(int size) {
            return new LoginInfo[size];
        }
    };
}


================================================
FILE: app/src/main/java/com/wjj/easy/easyandroidHelper/model/LoginResponse.java
================================================
package com.wjj.easy.easyandroidHelper.model;


import com.wjj.easy.easyandroidHelper.model.base.BaseResponseInfo;

/**
 * Created by zhaotun on 2016/12/20.
 */

public class LoginResponse extends BaseResponseInfo<LoginInfo> {
}


================================================
FILE: app/src/main/java/com/wjj/easy/easyandroidHelper/model/base/BaseChartInfo.java
================================================
package com.wjj.easy.easyandroidHelper.model.base;

import android.os.Parcel;
import android.os.Parcelable;

/**
 * Created by zhaotun on 2016/12/26.
 */

public class BaseChartInfo<T extends Parcelable> implements Parcelable {

    private boolean success;
    private int totalCount;
    private int recordsTotal;
    private int recordsFiltered;
    private T data;

    public boolean isSuccess() {
        return success;
    }

    public void setSuccess(boolean success) {
        this.success = success;
    }

    public int getTotalCount() {
        return totalCount;
    }

    public void setTotalCount(int totalCount) {
        this.totalCount = totalCount;
    }

    public int getRecordsTotal() {
        return recordsTotal;
    }

    public void setRecordsTotal(int recordsTotal) {
        this.recordsTotal = recordsTotal;
    }

    public int getRecordsFiltered() {
        return recordsFiltered;
    }

    public void setRecordsFiltered(int recordsFiltered) {
        this.recordsFiltered = recordsFiltered;
    }

    public T getData() {
        return data;
    }

    public void setData(T data) {
        this.data = data;
    }

    @Override
    public String toString() {
        return "BaseChartInfo{" +
                "success=" + success +
                ", totalCount=" + totalCount +
                ", recordsTotal=" + recordsTotal +
                ", recordsFiltered=" + recordsFiltered +
                ", data=" + data +
                '}';
    }


    @Override
    public int describeContents() {
        return 0;
    }

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeByte(this.success ? (byte) 1 : (byte) 0);
        dest.writeInt(this.totalCount);
        dest.writeInt(this.recordsTotal);
        dest.writeInt(this.recordsFiltered);

        dest.writeString(this.data.getClass().getName());
        dest.writeParcelable(this.data, flags);
    }

    public BaseChartInfo() {
    }

    protected BaseChartInfo(Parcel in) {
        this.success = in.readByte() != 0;
        this.totalCount = in.readInt();
        this.recordsTotal = in.readInt();
        this.recordsFiltered = in.readInt();

        try {
            String className = in.readString();
            this.data = in.readParcelable(Class.forName(className).getClassLoader());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static final Creator<BaseChartInfo> CREATOR = new Creator<BaseChartInfo>() {
        @Override
        public BaseChartInfo createFromParcel(Parcel source) {
            return new BaseChartInfo(source);
        }

        @Override
        public BaseChartInfo[] newArray(int size) {
            return new BaseChartInfo[size];
        }
    };

}


================================================
FILE: app/src/main/java/com/wjj/easy/easyandroidHelper/model/base/BaseChartListInfo.java
================================================
package com.wjj.easy.easyandroidHelper.model.base;

import android.os.Bundle;
import android.os.Parcel;
import android.os.Parcelable;

import java.util.ArrayList;

/**
 * Created by zhaotun on 2016/12/26.
 */

public class BaseChartListInfo<T extends Parcelable> implements Parcelable {

    public static final String PARCELABLE_ARRAY_LIST_DATA_KEY = "parcelable_array_list_data_key";

    private boolean success;
    private int totalCount;
    private int recordsTotal;
    private int recordsFiltered;
    private ArrayList<T> data;

    public boolean isSuccess() {
        return success;
    }

    public void setSuccess(boolean success) {
        this.success = success;
    }

    public int getTotalCount() {
        return totalCount;
    }

    public void setTotalCount(int totalCount) {
        this.totalCount = totalCount;
    }

    public int getRecordsTotal() {
        return recordsTotal;
    }

    public void setRecordsTotal(int recordsTotal) {
        this.recordsTotal = recordsTotal;
    }

    public int getRecordsFiltered() {
        return recordsFiltered;
    }

    public void setRecordsFiltered(int recordsFiltered) {
        this.recordsFiltered = recordsFiltered;
    }

    public ArrayList<T> getData() {
        return data;
    }

    public void setData(ArrayList<T> data) {
        this.data = data;
    }

    @Override
    public String toString() {
        return "BaseChartInfo{" +
                "success=" + success +
                ", totalCount=" + totalCount +
                ", recordsTotal=" + recordsTotal +
                ", recordsFiltered=" + recordsFiltered +
                ", data=" + data +
                '}';
    }


    @Override
    public int describeContents() {
        return 0;
    }

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeByte(this.success ? (byte) 1 : (byte) 0);
        dest.writeInt(this.totalCount);
        dest.writeInt(this.recordsTotal);
        dest.writeInt(this.recordsFiltered);

        Bundle bundle = new Bundle();
        bundle.putParcelableArrayList(PARCELABLE_ARRAY_LIST_DATA_KEY, data);
        dest.writeBundle(bundle);
    }

    public BaseChartListInfo() {
    }

    protected BaseChartListInfo(Parcel in) {
        this.success = in.readByte() != 0;
        this.totalCount = in.readInt();
        this.recordsTotal = in.readInt();
        this.recordsFiltered = in.readInt();

        try {
            this.data = in.readBundle().getParcelableArrayList(PARCELABLE_ARRAY_LIST_DATA_KEY);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static final Creator<BaseChartListInfo> CREATOR = new Creator<BaseChartListInfo>() {
        @Override
        public BaseChartListInfo createFromParcel(Parcel source) {
            return new BaseChartListInfo(source);
        }

        @Override
        public BaseChartListInfo[] newArray(int size) {
            return new BaseChartListInfo[size];
        }
    };

}


================================================
FILE: app/src/main/java/com/wjj/easy/easyandroidHelper/model/base/BaseResponseInfo.java
================================================
package com.wjj.easy.easyandroidHelper.model.base;

import android.os.Parcel;
import android.os.Parcelable;

/**
 * Created by zhaotun .
 */

public class BaseResponseInfo<T extends Parcelable> extends BaseStatus {

    private T data;

    public T getData() {
        return data;
    }

    public void setData(T data) {
        this.data = data;
    }

    @Override
    public String toString() {
        return super.toString() + " BaseResponseInfo{" +
                "data=" + data +
                '}';
    }

    @Override
    public int describeContents() {
        return 0;
    }

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        super.writeToParcel(dest, flags);

        dest.writeString(this.data.getClass().getName());
        dest.writeParcelable(this.data, flags);
    }

    public BaseResponseInfo() {
    }

    protected BaseResponseInfo(Parcel in) {
        super(in);

        try {
            String className = in.readString();
            this.data = in.readParcelable(Class.forName(className).getClassLoader());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static final Parcelable.Creator<BaseResponseInfo> CREATOR = new Parcelable.Creator<BaseResponseInfo>() {
        @Override
        public BaseResponseInfo createFromParcel(Parcel source) {
            return new BaseResponseInfo(source);
        }

        @Override
        public BaseResponseInfo[] newArray(int size) {
            return new BaseResponseInfo[size];
        }
    };
}


================================================
FILE: app/src/main/java/com/wjj/easy/easyandroidHelper/model/base/BaseResponseListInfo.java
================================================
package com.wjj.easy.easyandroidHelper.model.base;

import android.os.Bundle;
import android.os.Parcel;
import android.os.Parcelable;

import java.util.ArrayList;

/**
 * Created by zhaotun .
 */

public class BaseResponseListInfo<T extends Parcelable> extends BaseStatus {

    public static final String PARCELABLE_ARRAY_LIST_DATA_KEY = "parcelable_array_list_data_key";

    private ArrayList<T> data;

    public ArrayList<T> getData() {
        return data;
    }

    public void setData(ArrayList<T> data) {
        this.data = data;
    }

    @Override
    public String toString() {
        return super.toString() + " BaseResponseListInfo{" +
                "data=" + data +
                '}';
    }

    @Override
    public int describeContents() {
        return 0;
    }

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        super.writeToParcel(dest, flags);

        Bundle bundle = new Bundle();
        bundle.putParcelableArrayList(PARCELABLE_ARRAY_LIST_DATA_KEY, data);
        dest.writeBundle(bundle);
    }

    public BaseResponseListInfo() {
    }

    protected BaseResponseListInfo(Parcel in) {
        super(in);

        try {
            this.data = in.readBundle().getParcelableArrayList(PARCELABLE_ARRAY_LIST_DATA_KEY);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static final Creator<BaseResponseListInfo> CREATOR = new Creator<BaseResponseListInfo>() {
        @Override
        public BaseResponseListInfo createFromParcel(Parcel source) {
            return new BaseResponseListInfo(source);
        }

        @Override
        public BaseResponseListInfo[] newArray(int size) {
            return new BaseResponseListInfo[size];
        }
    };
}


================================================
FILE: app/src/main/java/com/wjj/easy/easyandroidHelper/model/base/BaseStatus.java
================================================
package com.wjj.easy.easyandroidHelper.model.base;

import android.os.Parcel;
import android.os.Parcelable;

/**
 * Created by zhaotun
 */

public class BaseStatus implements Parcelable {

    public static final int RESPONSE_CODE_SUCCESS = 0;

    private int code;// 0成功
    private String message;

    public int getCode() {
        return code;
    }

    public void setCode(int code) {
        this.code = code;
    }

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }

    public boolean isSuccess() {
        return code == RESPONSE_CODE_SUCCESS;
    }

    @Override
    public String toString() {
        return "BaseStatus{" +
                "code=" + code +
                ", message='" + message + '\'' +
                '}';
    }


    @Override
    public int describeContents() {
        return 0;
    }

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeInt(this.code);
        dest.writeString(this.message);
    }

    public BaseStatus() {
    }

    protected BaseStatus(Parcel in) {
        this.code = in.readInt();
        this.message = in.readString();
    }

}


================================================
FILE: app/src/main/java/com/wjj/easy/easyandroidHelper/module/login/LoginActivity.java
================================================
package com.wjj.easy.easyandroidHelper.module.login;

import android.content.Intent;
import android.support.v4.content.ContextCompat;
import android.support.v7.widget.Toolbar;
import android.view.View;
import android.widget.EditText;
import android.widget.TextView;

import com.wjj.easy.easyandroidHelper.R;
import com.wjj.easy.easyandroidHelper.common.base.BaseActivity;
import com.wjj.easy.easyandroidHelper.module.main.MainActivity;

import butterknife.BindView;
import butterknife.OnClick;

/**
 * 登录Activity
 *
 * @author wujiajun
 */

public class LoginActivity extends BaseActivity<LoginPresenter> implements LoginContract.View {

    @BindView(R.id.set_user_name)
    EditText setUserName;
    @BindView(R.id.set_pwd)
    EditText setPwd;
    @BindView(R.id.set_verify_code)
    EditText setVerifyCode;
    @BindView(R.id.get_verify_code)
    TextView getVerifyCode;
    @BindView(R.id.tv_login)
    TextView tvLogin;
    @BindView(R.id.tool_bar)
    Toolbar toolbar;

    @Override
    protected void initInject() {
        getActivityComponent().inject(this);
    }

    @Override
    protected void initEventAndData() {
        toolbar.setLogo(R.mipmap.icon_app);
        toolbar.setTitle(R.string.app_name);
        toolbar.setTitleTextColor(ContextCompat.getColor(this, R.color.white));
        toolbar.setTitleMarginStart(getResources().getDimensionPixelSize(R.dimen.padding_size_30));
        setSupportActionBar(toolbar);
    }

    @Override
    protected int getContentView() {
        return R.layout.activity_login;
    }


    @OnClick({R.id.get_verify_code, R.id.tv_login})
    public void onClick(View view) {
        switch (view.getId()) {
            case R.id.get_verify_code:
                getPresenter().getVerifyCode(setUserName.getText().toString(), setPwd.getText().toString());
                startActivity(new Intent(this, MainActivity.class));
                break;
            case R.id.tv_login:
                getPresenter().login(setUserName.getText().toString(), setPwd.getText().toString(), setVerifyCode.getText().toString());
                break;
        }
    }

}


================================================
FILE: app/src/main/java/com/wjj/easy/easyandroidHelper/module/login/LoginContract.java
================================================
package com.wjj.easy.easyandroidHelper.module.login;

import com.wjj.easy.easyandroid.mvp.EasyBasePresenter;
import com.wjj.easy.easyandroidHelper.common.base.BaseView;


/**
 * LoginContract
 * Created by wujiajun on 17/4/7.
 */
public interface LoginContract {

    interface View extends BaseView {
    }

    interface Presenter extends EasyBasePresenter<View> {
        void getVerifyCode(String userName, String pwd);

        void login(String userName, String pwd, String verifyCode);
    }
}


================================================
FILE: app/src/main/java/com/wjj/easy/easyandroidHelper/module/login/LoginPresenter.java
================================================
package com.wjj.easy.easyandroidHelper.module.login;

import com.wjj.easy.easyandroid.mvp.domain.usecases.UseCase;
import com.wjj.easy.easyandroidHelper.common.base.BasePresenter;
import com.wjj.easy.easyandroidHelper.model.LoginResponse;
import com.wjj.easy.easyandroidHelper.model.base.BaseStatus;
import com.wjj.easy.easyandroidHelper.module.login.domain.GetVerifyCodeTask;
import com.wjj.easy.easyandroidHelper.module.login.domain.LoginTask;

import javax.inject.Inject;

/**
 * Login Presenter
 * Created by wujiajun on 17/4/7.
 */
public class LoginPresenter extends BasePresenter<LoginContract.View> implements LoginContract.Presenter {

    @Inject
    GetVerifyCodeTask mGetVerifyCodeTask;
    @Inject
    LoginTask mLoginTask;

    @Inject
    public LoginPresenter() {
    }

    @Override
    public void getVerifyCode(String userName, String pwd) {
        mGetVerifyCodeTask.setUserName(userName);
        mGetVerifyCodeTask.setPwd(pwd);
        mGetVerifyCodeTask.setCallback(new UseCase.Callback<BaseStatus>() {
            @Override
            public void success(BaseStatus baseStatus) {
                getView().toast("getVerifyCode success!");
            }

            @Override
            public void fail() {
                getView().toast("getVerifyCode fail!");
            }
        });
        getThreadExecutor().execute(mGetVerifyCodeTask);
    }

    @Override
    public void login(String userName, String pwd, String verifyCode) {
        getView().showLoading();
        mLoginTask.setUserName(userName);
        mLoginTask.setPwd(pwd);
        mLoginTask.setVerifyCode(verifyCode);
        mLoginTask.setCallback(new UseCase.Callback<LoginResponse>() {
            @Override
            public void success(LoginResponse loginResponse) {
                getView().toast("login success!");
            }

            @Override
            public void fail() {
                getView().toast("login fail!");
            }
        });
        getThreadExecutor().execute(mLoginTask);
    }
}


================================================
FILE: app/src/main/java/com/wjj/easy/easyandroidHelper/module/login/domain/GetVerifyCodeTask.java
================================================
package com.wjj.easy.easyandroidHelper.module.login.domain;

import com.wjj.easy.easyandroid.http.Http;
import com.wjj.easy.easyandroid.mvp.domain.usecases.AbstractUseCase;
import com.wjj.easy.easyandroidHelper.common.net.AppHttp;
import com.wjj.easy.easyandroidHelper.model.base.BaseStatus;
import com.wjj.easy.easyandroidHelper.utils.SecretUtils;

import javax.inject.Inject;

/**
 * 获取验证码任务
 *
 * @author wujiajun
 */

public class GetVerifyCodeTask extends AbstractUseCase {

    String publicKey = "11";

    String userName;
    String pwd;

    @Inject
    AppHttp appHttp;

    @Inject
    public GetVerifyCodeTask() {
    }

    @Override
    public void run() {
        appHttp.getVerifyCode(userName, SecretUtils.encryptByPublicKey(pwd, publicKey), new Http.HttpCallback<BaseStatus>() {
            @Override
            public void onResponse(BaseStatus baseStatus) {
                getCallback().success(baseStatus);
            }

            @Override
            public void onFailure(Throwable t) {
                getCallback().fail();
            }
        });
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public void setPwd(String pwd) {
        this.pwd = pwd;
    }

}


================================================
FILE: app/src/main/java/com/wjj/easy/easyandroidHelper/module/login/domain/LoginTask.java
================================================
package com.wjj.easy.easyandroidHelper.module.login.domain;

import com.wjj.easy.easyandroid.http.Http;
import com.wjj.easy.easyandroid.mvp.domain.usecases.AbstractUseCase;
import com.wjj.easy.easyandroidHelper.common.net.AppHttp;
import com.wjj.easy.easyandroidHelper.model.LoginResponse;
import com.wjj.easy.easyandroidHelper.utils.SecretUtils;

import javax.inject.Inject;

/**
 * 登录任务
 *
 * @author wujiajun
 */

public class LoginTask extends AbstractUseCase {

    String publicKey = "11";

    String userName;
    String pwd;
    String verifyCode;

    @Inject
    AppHttp appHttp;

    @Inject
    public LoginTask() {
    }

    @Override
    public void run() {
        appHttp.login(userName, SecretUtils.encryptByPublicKey(pwd, publicKey), verifyCode, new Http.HttpCallback<LoginResponse>() {
            @Override
            public void onResponse(LoginResponse baseStatus) {
                getCallback().success(baseStatus);
            }

            @Override
            public void onFailure(Throwable t) {
                getCallback().fail();
            }
        });
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public void setPwd(String pwd) {
        this.pwd = pwd;
    }

    public void setVerifyCode(String verifyCode) {
        this.verifyCode = verifyCode;
    }

}


================================================
FILE: app/src/main/java/com/wjj/easy/easyandroidHelper/module/main/HomeContract.java
================================================
package com.wjj.easy.easyandroidHelper.module.main;

import com.wjj.easy.easyandroid.mvp.EasyBasePresenter;
import com.wjj.easy.easyandroidHelper.common.base.BaseView;
import com.wjj.easy.easyandroidHelper.model.ListInfo;

/**
 * Created by wujiajun on 17/4/6.
 */
public interface HomeContract {

    interface View extends BaseView {
        void showList(ListInfo list);
    }

    interface Presenter extends EasyBasePresenter<View> {
        void getList(int index);
    }

}


================================================
FILE: app/src/main/java/com/wjj/easy/easyandroidHelper/module/main/HomeFragment.java
================================================
package com.wjj.easy.easyandroidHelper.module.main;

import android.support.v7.widget.DefaultItemAnimator;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.util.Log;

import com.wjj.easy.easyandroidHelper.R;
import com.wjj.easy.easyandroidHelper.common.base.BaseFragment;
import com.wjj.easy.easyandroidHelper.model.ListInfo;
import com.wjj.easy.easyandroidHelper.module.main.adapter.HomeAdapter;

import butterknife.BindView;

/**
 * 首页
 * Created by wujiajun on 17/4/12.
 */

public class HomeFragment extends BaseFragment<HomePresenter> implements HomeContract.View {

    @BindView(R.id.rv_list)
    RecyclerView rvList;

    HomeAdapter homeAdapter;

    @Override
    protected int getContentView() {
        return R.layout.fragment_home;
    }

    @Override
    protected void initInject() {
        getFragmentComponent().inject(this);
    }

    @Override
    protected void initEventAndData() {
        showLoading();
        homeAdapter = new HomeAdapter(R.layout.home_list_item);
        rvList.setLayoutManager(new LinearLayoutManager(getContext(), LinearLayoutManager.VERTICAL, false));
        // 设置Item添加和移除的动画
        rvList.setItemAnimator(new DefaultItemAnimator());
        rvList.setAdapter(homeAdapter);
        rvList.postDelayed(new Runnable() {
            @Override
            public void run() {
                getPresenter().getList(1);
            }
        }, 1000);
    }

    @Override
    public void showList(ListInfo list) {
        Log.e("HomeFragment", "list : " + list.toString());
        homeAdapter.setNewData(list.getData());
        hiddenLoading();
    }
}


================================================
FILE: app/src/main/java/com/wjj/easy/easyandroidHelper/module/main/HomePresenter.java
================================================
package com.wjj.easy.easyandroidHelper.module.main;

import com.wjj.easy.easyandroid.mvp.domain.executor.Executor;
import com.wjj.easy.easyandroid.mvp.domain.usecases.UseCase;
import com.wjj.easy.easyandroidHelper.common.base.BasePresenter;
import com.wjj.easy.easyandroidHelper.model.ListInfo;
import com.wjj.easy.easyandroidHelper.module.main.domain.GetListTask;

import javax.inject.Inject;

/**
 * Created by wujiajun on 17/4/6.
 */

public class HomePresenter extends BasePresenter<HomeContract.View> implements HomeContract.Presenter {

    @Inject
    GetListTask getListTask;

    @Inject
    public HomePresenter() {

    }

    @Override
    public void getList(int page) {
        getListTask.setIndex(page);
        getListTask.setCallback(new UseCase.Callback<ListInfo>() {
            @Override
            public void success(ListInfo list) {
                getView().showList(list);
            }

            @Override
            public void fail() {
                getView().hiddenLoading();
            }
        });
        execute(getListTask);
    }
}


================================================
FILE: app/src/main/java/com/wjj/easy/easyandroidHelper/module/main/MainActivity.java
================================================
package com.wjj.easy.easyandroidHelper.module.main;

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.widget.Toolbar;
import android.widget.ImageView;
import android.widget.RelativeLayout;
import android.widget.TextView;

import com.wjj.easy.easyandroidHelper.R;
import com.wjj.easy.easyandroidHelper.common.base.SimpleActivity;

import butterknife.BindView;
import butterknife.ButterKnife;

/**
 * 主页
 *
 * @author wujiajun
 */
public class MainActivity extends SimpleActivity {


    private Fragment[] fragments = new Fragment[]{new HomeFragment(), new MyFragment()};

    @BindView(R.id.activity_main)
    RelativeLayout activityMain;
    @BindView(R.id.view_pager)
    ViewPager viewPager;
    @BindView(R.id.tab_layout)
    TabLayout tabLayout;
    @BindView(R.id.tool_bar)
    Toolbar toolbar;

    @Override
    protected void initEventAndData() {

        toolbar.setLogo(R.mipmap.icon_app);
        toolbar.setTitle(R.string.app_name);
        toolbar.setTitleTextColor(ContextCompat.getColor(this, R.color.white));
        toolbar.setTitleMarginStart(getResources().getDimensionPixelSize(R.dimen.padding_size_30));
        setSupportActionBar(toolbar);

        viewPager.setAdapter(new MainPageAdapter(getSupportFragmentManager()));
        tabLayout.setupWithViewPager(viewPager);

        tabLayout.getTabAt(0).setCustomView(R.layout.view_main_tab);
        tabLayout.getTabAt(1).setCustomView(R.layout.view_main_tab);

        selectTab(tabLayout.getTabAt(0));
        unSelectTab(tabLayout.getTabAt(1));

        tabLayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
            @Override
            public void onTabSelected(TabLayout.Tab tab) {
                selectTab(tab);
            }

            @Override
            public void onTabUnselected(TabLayout.Tab tab) {
                unSelectTab(tab);
            }

            @Override
            public void onTabReselected(TabLayout.Tab tab) {
                selectTab(tab);
            }
        });
        viewPager.setCurrentItem(0);
    }

    private void selectTab(TabLayout.Tab tab) {
        ImageView icon = ButterKnife.findById(tab.getCustomView(), R.id.tab_icon_iv);
        TextView title = ButterKnife.findById(tab.getCustomView(), R.id.tab_title_tv);
        if (tab.getPosition() == 0) {
            icon.setImageResource(R.mipmap.tab_home_selected);
            title.setText(R.string.home_tab);
        } else {
            icon.setImageResource(R.mipmap.tab_user_selected);
            title.setText(R.string.my_tab);
        }
        title.setTextColor(ContextCompat.getColor(this, R.color.black));
    }

    private void unSelectTab(TabLayout.Tab tab) {
        ImageView icon = ButterKnife.findById(tab.getCustomView(), R.id.tab_icon_iv);
        TextView title = ButterKnife.findById(tab.getCustomView(), R.id.tab_title_tv);
        if (tab.getPosition() == 0) {
            icon.setImageResource(R.mipmap.tab_home_unselected);
            title.setText(R.string.home_tab);
        } else {
            icon.setImageResource(R.mipmap.tab_user_unselected);
            title.setText(R.string.my_tab);
        }
        title.setTextColor(ContextCompat.getColor(this, R.color.grey));
    }

    @Override
    protected int getContentView() {
        return R.layout.activity_main;
    }

    private class MainPageAdapter extends FragmentPagerAdapter {

        public MainPageAdapter(FragmentManager fm) {
            super(fm);
        }

        @Override
        public Fragment getItem(int position) {
            return fragments[position];
        }

        @Override
        public int getCount() {
            return fragments.length;
        }
    }

}


================================================
FILE: app/src/main/java/com/wjj/easy/easyandroidHelper/module/main/MyContract.java
================================================
package com.wjj.easy.easyandroidHelper.module.main;

import com.wjj.easy.easyandroid.mvp.EasyBasePresenter;
import com.wjj.easy.easyandroidHelper.common.base.BaseView;

/**
 * Created by wujiajun on 17/4/6.
 */
public interface MyContract {

    interface View extends BaseView {
    }

    interface Presenter extends EasyBasePresenter<View> {
    }

}


================================================
FILE: app/src/main/java/com/wjj/easy/easyandroidHelper/module/main/MyFragment.java
================================================
package com.wjj.easy.easyandroidHelper.module.main;

import android.net.Uri;

import com.facebook.drawee.view.SimpleDraweeView;
import com.wjj.easy.easyandroidHelper.R;
import com.wjj.easy.easyandroidHelper.common.base.BaseFragment;

import butterknife.BindView;

/**
 * 我的
 * Created by wujiajun on 17/4/12.
 */

public class MyFragment extends BaseFragment<MyPresenter> implements MyContract.View {

    @BindView(R.id.my_image_view)
    SimpleDraweeView myImageView;

    @Override
    protected int getContentView() {
        return R.layout.fragment_my;
    }

    @Override
    protected void initInject() {
        getFragmentComponent().inject(this);
    }

    @Override
    protected void initEventAndData() {
        Uri uri = Uri.parse("https://raw.githubusercontent.com/facebook/fresco/gh-pages/static/logo.png");
        myImageView.setImageURI(uri);
    }

}

================================================
FILE: app/src/main/java/com/wjj/easy/easyandroidHelper/module/main/MyPresenter.java
================================================
package com.wjj.easy.easyandroidHelper.module.main;

import com.wjj.easy.easyandroidHelper.common.base.BasePresenter;

import javax.inject.Inject;

/**
 * Created by wujiajun on 17/4/6.
 */

public class MyPresenter extends BasePresenter<MyContract.View> implements MyContract.Presenter {

    @Inject
    public MyPresenter() {
    }

}


================================================
FILE: app/src/main/java/com/wjj/easy/easyandroidHelper/module/main/adapter/HomeAdapter.java
================================================
package com.wjj.easy.easyandroidHelper.module.main.adapter;

import android.graphics.drawable.Drawable;
import android.view.View;
import android.widget.TextView;

import com.chad.library.adapter.base.BaseQuickAdapter;
import com.chad.library.adapter.base.BaseViewHolder;
import com.facebook.drawee.view.SimpleDraweeView;
import com.wjj.easy.easyandroidHelper.R;
import com.wjj.easy.easyandroidHelper.model.ListInfo;

import java.text.NumberFormat;
import java.util.List;

import javax.inject.Inject;

/**
 * Created by ljw on 2017/4/14.
 */

public class HomeAdapter extends BaseQuickAdapter<ListInfo.DataBean,BaseViewHolder> {

    Drawable right_vip;
    Drawable right_free;

    public HomeAdapter(int layoutResId, List<ListInfo.DataBean> data) {
        super(layoutResId, data);
    }

    @Inject
    public HomeAdapter(int layoutResId) {
        super(layoutResId);
    }

    @Override
    protected void convert(BaseViewHolder holder, ListInfo.DataBean info) {
        if(info==null)
            return;

        SimpleDraweeView ivIcon = holder.getView(R.id.dv_img);
        ivIcon.setImageURI(info.getImageUrl());
        holder.setText(R.id.tv_date, info.getDoTime());
        holder.setText(R.id.tv_city, info.getCity());

        holder.setText(R.id.tv_label, info.getTaskTypeName());

        TextView tv_name = holder.getView(R.id.tv_name);
        TextView tv_member_price = holder.getView(R.id.tv_member_price);


        if(right_vip==null) {
            right_vip = mContext.getResources().getDrawable(R.mipmap.icon_vip_all);
            right_vip.setBounds(0, 0, right_vip.getMinimumWidth(), right_vip.getMinimumHeight());
        }

        if(right_free == null){
            right_free = mContext.getResources().getDrawable(R.mipmap.ic_free);
            right_free.setBounds(0, 0, right_free.getMinimumWidth(), right_free.getMinimumHeight());
        }

        tv_name.setText(info.getTitle());

        if (info.getOnlyVip() == 1){ // 会员专享活动
            tv_name.setCompoundDrawables(null, null, right_vip, null);
            tv_member_price.setVisibility(View.GONE);
            if(info.isIsFree()){ // 免费活动
                holder.setText(R.id.tv_price,"免费报名");
                holder.getView(R.id.tv_price_y).setVisibility(View.GONE);

            }else { // 非免费

                holder.getView(R.id.tv_price_y).setVisibility(View.VISIBLE);
                holder.setText(R.id.tv_price, Integer.toString(info.getHasMemberAmt()));
            }
        }else if(info.isIsFree()){ // 免费活动

            tv_name.setCompoundDrawables(null,null,right_free,null);
            tv_member_price.setVisibility(View.GONE);
            holder.setText(R.id.tv_price,"免费报名");
            tv_member_price.setVisibility(View.GONE);
            holder.getView(R.id.tv_price_y).setVisibility(View.GONE);

        }else { // 普通活动(不是免费活动,也不是会员专享活动)
            holder.setText(R.id.tv_price,info.getAmt());
            holder.getView(R.id.tv_price_y).setVisibility(View.VISIBLE);
            tv_name.setCompoundDrawables(null,null,null,null);
            if(info.getHasMemberAmt() == 1) {
                tv_member_price.setVisibility(View.VISIBLE);
                tv_member_price.setText(String.format("会员价:%s", NumberFormat.getInstance().format(info.getMemberAmt())));
            }
        }
    }
}


================================================
FILE: app/src/main/java/com/wjj/easy/easyandroidHelper/module/main/domain/GetListTask.java
================================================
package com.wjj.easy.easyandroidHelper.module.main.domain;

import com.wjj.easy.easyandroid.http.Http;
import com.wjj.easy.easyandroid.mvp.domain.usecases.AbstractUseCase;
import com.wjj.easy.easyandroidHelper.common.net.AppHttp;
import com.wjj.easy.easyandroidHelper.model.ListInfo;

import javax.inject.Inject;

/**
 * Created by ljw on 2017/4/13.
 */

public class GetListTask extends AbstractUseCase{

    int index;

    @Inject
    AppHttp appHttp;


    @Inject
    public GetListTask() {

    }


    @Override
    public void run() {
        appHttp.getList(index, new Http.HttpCallback<ListInfo>() {
            @Override
            public void onResponse(ListInfo listInfos) {

                getCallback().success(listInfos);

            }

            @Override
            public void onFailure(Throwable t) {

                getCallback().fail();
            }
        });

    }

    public void setIndex(int index) {
        this.index = index;
    }
}


================================================
FILE: app/src/main/java/com/wjj/easy/easyandroidHelper/utils/SecretUtils.java
================================================
package com.wjj.easy.easyandroidHelper.utils;

import android.util.Base64;

import java.security.KeyFactory;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;
import java.util.ArrayList;
import java.util.List;

import javax.crypto.Cipher;

/**
 * 加解密
 *
 * @author zhaotun
 */
public class SecretUtils {

    public enum SecroType {
        TYPE_RSA;
    }

    public static final String CRYPTO_TYPE_RSA = "RSA";// 非对称加密密钥算法
    public static final String ECB_PKCS1_PADDING = "RSA/ECB/PKCS1Padding";//加密填充方式  RSA/ECB/PKCS1Padding RSA/ECB/NoPadding

    public static final String CRYPTO_TYPE_DES = "DES";
    public static final String CRYPTO_TYPE_DES_ALGORITHM = "DES/CBC/PKCS5Padding";

    private static final byte[] DESIV = "12345678".getBytes();
    private static final String CHARSET_UTF8 = "UTF-8";

    public static final int DEFAULT_KEY_SIZE = 2048;//秘钥默认长度
    public static final byte[] DEFAULT_SPLIT = "#PART#".getBytes();    // 当要加密的内容超过bufferSize,则采用partSplit进行分块加密
    public static final int DEFAULT_BUFFERSIZE = (DEFAULT_KEY_SIZE / 8) - 11;// 当前秘钥支持加密的最大字节数

    private PublicKey keyPublic;
    private Cipher cipher;

    private SecretUtils() {
    }

    public static String encryptByPublicKey(String data, String pubKey) {
        try {
//            SecureRandom random = SecureRandom.getInstance("SHA1PRNG");

            byte[] buffer = Base64.decode(pubKey, Base64.DEFAULT);
            X509EncodedKeySpec keySpec = new X509EncodedKeySpec(buffer);

            KeyFactory keyFactory = KeyFactory.getInstance(CRYPTO_TYPE_RSA);
            PublicKey publicKey = keyFactory.generatePublic(keySpec);

            // 加密数据
            Cipher cp = Cipher.getInstance(ECB_PKCS1_PADDING);
            cp.init(Cipher.ENCRYPT_MODE, publicKey);

            byte[] output = cp.doFinal(data.getBytes(CHARSET_UTF8));
            // 必须先encode成 byte[],再转成encodeToString,否则服务器解密会失败
            byte[] encode = Base64.encode(output, Base64.DEFAULT);
            String aa=new String(encode);
            return aa;//Base64.encodeToString(encode, Base64.DEFAULT);
        } catch (Exception e) {
            e.printStackTrace();

            return data;
        }
    }

    /**
     * TODO:有待验证
     *
     * @param data
     * @param pubKey
     * @return
     */
    public static String decryptByPublicKey(String data, String pubKey) {
        try {
            byte[] buffer = Base64.decode(pubKey, Base64.DEFAULT);
            X509EncodedKeySpec keySpec = new X509EncodedKeySpec(buffer);

            KeyFactory kf = KeyFactory.getInstance(CRYPTO_TYPE_RSA);
            PublicKey publicKey = kf.generatePublic(keySpec);

            // 数据解密
            Cipher cipher = Cipher.getInstance(ECB_PKCS1_PADDING);
            cipher.init(Cipher.DECRYPT_MODE, publicKey);

            byte[] output = cipher.doFinal(data.getBytes(CHARSET_UTF8));
            // 必须先encode成 byte[],再转成encodeToString,否则服务器解密会失败
            byte[] encode = Base64.encode(output, Base64.DEFAULT);

            return new String(encode);
        } catch (Exception e) {
            e.printStackTrace();

            return data;
        }
    }


    /**
     * 用公钥对字符串进行加密
     *
     * @param data 原文
     */
    public static byte[] encryptByPublicKey(byte[] data, byte[] publicKey) {
        try {
            // 得到公钥
            X509EncodedKeySpec keySpec = new X509EncodedKeySpec(publicKey);

            KeyFactory kf = KeyFactory.getInstance(CRYPTO_TYPE_RSA);
            PublicKey keyPublic = kf.generatePublic(keySpec);

            // 加密数据
            Cipher cp = Cipher.getInstance(ECB_PKCS1_PADDING);
            cp.init(Cipher.ENCRYPT_MODE, keyPublic);

            return cp.doFinal(data);
        } catch (Exception e) {
            e.printStackTrace();

            return null;
        }
    }

    /**
     * 私钥加密
     *
     * @param data       待加密数据
     * @param privateKey 密钥
     * @return byte[] 加密数据
     */
    public static byte[] encryptByPrivateKey(byte[] data, byte[] privateKey) throws Exception {
        try {
            // 得到私钥
            PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(privateKey);
            KeyFactory kf = KeyFactory.getInstance(CRYPTO_TYPE_RSA);
            PrivateKey keyPrivate = kf.generatePrivate(keySpec);
            // 数据加密
            Cipher cipher = Cipher.getInstance(ECB_PKCS1_PADDING);
            cipher.init(Cipher.ENCRYPT_MODE, keyPrivate);
            return cipher.doFinal(data);
        } catch (Exception e) {
            e.printStackTrace();

            return null;
        }
    }


    /**
     * 公钥解密
     *
     * @param data      待解密数据
     * @param publicKey 密钥
     * @return byte[] 解密数据
     */
    public static byte[] decryptByPublicKey(byte[] data, byte[] publicKey) throws Exception {
        // 得到公钥
        X509EncodedKeySpec keySpec = new X509EncodedKeySpec(publicKey);
        KeyFactory kf = KeyFactory.getInstance(CRYPTO_TYPE_RSA);
        PublicKey keyPublic = kf.generatePublic(keySpec);
        // 数据解密
        Cipher cipher = Cipher.getInstance(ECB_PKCS1_PADDING);
        cipher.init(Cipher.DECRYPT_MODE, keyPublic);
        return cipher.doFinal(data);
    }

    /**
     * 使用私钥进行解密
     */
    public static byte[] decryptByPrivateKey(byte[] encrypted, byte[] privateKey) throws Exception {
        // 得到私钥
        PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(privateKey);
        KeyFactory kf = KeyFactory.getInstance(CRYPTO_TYPE_RSA);
        PrivateKey keyPrivate = kf.generatePrivate(keySpec);

        // 解密数据
        Cipher cp = Cipher.getInstance(ECB_PKCS1_PADDING);
        cp.init(Cipher.DECRYPT_MODE, keyPrivate);
        byte[] arr = cp.doFinal(encrypted);
        return arr;
    }


    /**
     * 用公钥对字符串进行分段加密
     */
    public static byte[] encryptByPublicKeyForSpilt(byte[] data, byte[] publicKey) throws Exception {
        int dataLen = data.length;
        if (dataLen <= DEFAULT_BUFFERSIZE) {
            return encryptByPublicKey(data, publicKey);
        }
        List<Byte> allBytes = new ArrayList<Byte>(2048);
        int bufIndex = 0;
        int subDataLoop = 0;
        byte[] buf = new byte[DEFAULT_BUFFERSIZE];
        for (int i = 0; i < dataLen; i++) {
            buf[bufIndex] = data[i];
            if (++bufIndex == DEFAULT_BUFFERSIZE || i == dataLen - 1) {
                subDataLoop++;
                if (subDataLoop != 1) {
                    for (byte b : DEFAULT_SPLIT) {
                        allBytes.add(b);
                    }
                }
                byte[] encryptBytes = encryptByPublicKey(buf, publicKey);
                for (byte b : encryptBytes) {
                    allBytes.add(b);
                }
                bufIndex = 0;
                if (i == dataLen - 1) {
                    buf = null;
                } else {
                    buf = new byte[Math.min(DEFAULT_BUFFERSIZE, dataLen - i - 1)];
                }
            }
        }
        byte[] bytes = new byte[allBytes.size()];
        {
            int i = 0;
            for (Byte b : allBytes) {
                bytes[i++] = b.byteValue();
            }
        }
        return bytes;
    }

    /**
     * 分段加密
     *
     * @param data       要加密的原始数据
     * @param privateKey 秘钥
     */
    public static byte[] encryptByPrivateKeyForSpilt(byte[] data, byte[] privateKey) throws Exception {
        int dataLen = data.length;
        if (dataLen <= DEFAULT_BUFFERSIZE) {
            return encryptByPrivateKey(data, privateKey);
        }
        List<Byte> allBytes = new ArrayList<Byte>(2048);
        int bufIndex = 0;
        int subDataLoop = 0;
        byte[] buf = new byte[DEFAULT_BUFFERSIZE];
        for (int i = 0; i < dataLen; i++) {
            buf[bufIndex] = data[i];
            if (++bufIndex == DEFAULT_BUFFERSIZE || i == dataLen - 1) {
                subDataLoop++;
                if (subDataLoop != 1) {
                    for (byte b : DEFAULT_SPLIT) {
                        allBytes.add(b);
                    }
                }
                byte[] encryptBytes = encryptByPrivateKey(buf, privateKey);
                for (byte b : encryptBytes) {
                    allBytes.add(b);
                }
                bufIndex = 0;
                if (i == dataLen - 1) {
                    buf = null;
                } else {
                    buf = new byte[Math.min(DEFAULT_BUFFERSIZE, dataLen - i - 1)];
                }
            }
        }
        byte[] bytes = new byte[allBytes.size()];
        {
            int i = 0;
            for (Byte b : allBytes) {
                bytes[i++] = b.byteValue();
            }
        }
        return bytes;
    }

    /**
     * 公钥分段解密
     *
     * @param encrypted 待解密数据
     * @param publicKey 密钥
     */
    public static byte[] decryptByPublicKeyForSpilt(byte[] encrypted, byte[] publicKey) throws Exception {
        int splitLen = DEFAULT_SPLIT.length;
        if (splitLen <= 0) {
            return decryptByPublicKey(encrypted, publicKey);
        }
        int dataLen = encrypted.length;
        List<Byte> allBytes = new ArrayList<Byte>(1024);
        int latestStartIndex = 0;
        for (int i = 0; i < dataLen; i++) {
            byte bt = encrypted[i];
            boolean isMatchSplit = false;
            if (i == dataLen - 1) {
                // 到data的最后了
                byte[] part = new byte[dataLen - latestStartIndex];
                System.arraycopy(encrypted, latestStartIndex, part, 0, part.length);
                byte[] decryptPart = decryptByPublicKey(part, publicKey);
                for (byte b : decryptPart) {
                    allBytes.add(b);
                }
                latestStartIndex = i + splitLen;
                i = latestStartIndex - 1;
            } else if (bt == DEFAULT_SPLIT[0]) {
                // 这个是以split[0]开头
                if (splitLen > 1) {
                    if (i + splitLen < dataLen) {
                        // 没有超出data的范围
                        for (int j = 1; j < splitLen; j++) {
                            if (DEFAULT_SPLIT[j] != encrypted[i + j]) {
                                break;
                            }
                            if (j == splitLen - 1) {
                                // 验证到split的最后一位,都没有break,则表明已经确认是split段
                                isMatchSplit = true;
                            }
                        }
                    }
                } else {
                    // split只有一位,则已经匹配了
                    isMatchSplit = true;
                }
            }
            if (isMatchSplit) {
                byte[] part = new byte[i - latestStartIndex];
                System.arraycopy(encrypted, latestStartIndex, part, 0, part.length);
                byte[] decryptPart = decryptByPublicKey(part, publicKey);
                for (byte b : decryptPart) {
                    allBytes.add(b);
                }
                latestStartIndex = i + splitLen;
                i = latestStartIndex - 1;
            }
        }
        byte[] bytes = new byte[allBytes.size()];
        {
            int i = 0;
            for (Byte b : allBytes) {
                bytes[i++] = b.byteValue();
            }
        }
        return bytes;
    }

    /**
     * 使用私钥分段解密
     */
    public static byte[] decryptByPrivateKeyForSpilt(byte[] encrypted, byte[] privateKey) throws Exception {
        int splitLen = DEFAULT_SPLIT.length;
        if (splitLen <= 0) {
            return decryptByPrivateKey(encrypted, privateKey);
        }
        int dataLen = encrypted.length;
        List<Byte> allBytes = new ArrayList<Byte>(1024);
        int latestStartIndex = 0;
        for (int i = 0; i < dataLen; i++) {
            byte bt = encrypted[i];
            boolean isMatchSplit = false;
            if (i == dataLen - 1) {
                // 到data的最后了
                byte[] part = new byte[dataLen - latestStartIndex];
                System.arraycopy(encrypted, latestStartIndex, part, 0, part.length);
                byte[] decryptPart = decryptByPrivateKey(part, privateKey);
                for (byte b : decryptPart) {
                    allBytes.add(b);
                }
                latestStartIndex = i + splitLen;
                i = latestStartIndex - 1;
            } else if (bt == DEFAULT_SPLIT[0]) {
                // 这个是以split[0]开头
                if (splitLen > 1) {
                    if (i + splitLen < dataLen) {
                        // 没有超出data的范围
                        for (int j = 1; j < splitLen; j++) {
                            if (DEFAULT_SPLIT[j] != encrypted[i + j]) {
                                break;
                            }
                            if (j == splitLen - 1) {
                                // 验证到split的最后一位,都没有break,则表明已经确认是split段
                                isMatchSplit = true;
                            }
                        }
                    }
                } else {
                    // split只有一位,则已经匹配了
                    isMatchSplit = true;
                }
            }
            if (isMatchSplit) {
                byte[] part = new byte[i - latestStartIndex];
                System.arraycopy(encrypted, latestStartIndex, part, 0, part.length);
                byte[] decryptPart = decryptByPrivateKey(part, privateKey);
                for (byte b : decryptPart) {
                    allBytes.add(b);
                }
                latestStartIndex = i + splitLen;
                i = latestStartIndex - 1;
            }
        }
        byte[] bytes = new byte[allBytes.size()];
        {
            int i = 0;
            for (Byte b : allBytes) {
                bytes[i++] = b.byteValue();
            }
        }
        return bytes;
    }


}


================================================
FILE: app/src/main/java/com/wjj/easy/easyandroidHelper/widget/dialog/BaseDialog.java
================================================
package com.wjj.easy.easyandroidHelper.widget.dialog;

import android.app.Dialog;
import android.content.Context;
import android.os.Bundle;
import android.util.DisplayMetrics;
import android.view.Gravity;
import android.view.Window;
import android.view.WindowManager.LayoutParams;

import com.wjj.easy.easyandroidHelper.R;

import butterknife.ButterKnife;


/**
 * Created by zhaotun
 */
public abstract class BaseDialog extends Dialog {

    protected float mDimAmount = 0.6f;

    protected float mWidthScale = 0.9f;

    protected int gravity = Gravity.CENTER_VERTICAL;

    protected int animId = -1;

    protected int x = 0;

    protected int y = 0;

    protected int h = LayoutParams.WRAP_CONTENT;

    protected boolean mShouldSetWindow = true;


    public BaseDialog(Context context) {
        super(context, R.style.dialog_custom_roll_up_down);
    }

    public BaseDialog(Context context, int theme) {
        super(context, theme);
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(getContentView());
        ButterKnife.bind(this);
        init();

        if (mShouldSetWindow) {
            setWindow(x, y);
        }
    }

    protected void setWindow(int x, int y) {
        Window dialogWindow = getWindow();
        LayoutParams lp = dialogWindow.getAttributes();
        DisplayMetrics d = getContext().getResources().getDisplayMetrics(); // 获取屏幕宽、高用
        lp.width = (int) (d.widthPixels * mWidthScale);
        lp.height = h;
        lp.x = x;
        lp.y = y;
        lp.gravity = gravity;
        lp.dimAmount = mDimAmount;
        dialogWindow.addFlags(LayoutParams.FLAG_DIM_BEHIND);

        if (animId != -1) {
            dialogWindow.setWindowAnimations(animId);
        }
    }

    public void shouldSetWindow(boolean shouldSetWindow) {
        this.mShouldSetWindow = shouldSetWindow;
    }

    protected abstract int getContentView();

    protected abstract void init();

}


================================================
FILE: app/src/main/java/com/wjj/easy/easyandroidHelper/widget/dialog/DialogLoading.java
================================================
package com.wjj.easy.easyandroidHelper.widget.dialog;

import android.content.Context;
import android.widget.TextView;

import com.wjj.easy.easyandroidHelper.R;

import butterknife.BindView;


/**
 * Created by zhaotun on 2017/2/21.
 */

public class DialogLoading extends BaseDialog {

    @BindView(R.id.tv_loading_text)
    TextView tvText;

    public DialogLoading(Context context) {
        this(context, false);
    }

    public DialogLoading(Context context, boolean shouldSetWindow) {
        super(context, R.style.customDialog_loading);
        shouldSetWindow(shouldSetWindow);

        setCanceledOnTouchOutside(false);
        setCancelable(true);
    }

    @Override
    protected int getContentView() {
        return R.layout.dialog_loading;
    }

    @Override
    protected void init() {

    }

    public void setText(String text) {
        if (tvText != null) {
            tvText.setText(text);
        }
    }
}


================================================
FILE: app/src/main/res/anim/roll_down.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">

    <translate
        android:duration="300"
        android:fromYDelta="0.0"
        android:interpolator="@android:anim/decelerate_interpolator"
        android:toYDelta="100.0%p" />

</set>

================================================
FILE: app/src/main/res/anim/roll_up.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">

    <translate
        android:duration="300"
        android:fromYDelta="100.0%p"
        android:interpolator="@android:anim/decelerate_interpolator"
        android:toYDelta="0.0" />

</set>

================================================
FILE: app/src/main/res/anim/slide_in_bottom.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:interpolator="@android:interpolator/accelerate_decelerate"
   >

    <translate
        android:duration="@android:integer/config_mediumAnimTime"
        android:fromYDelta="100%p"
        android:toYDelta="0" />

    <alpha
        android:duration="@android:integer/config_mediumAnimTime"
        android:fromAlpha="0.95"
        android:toAlpha="1" />

</set>

================================================
FILE: app/src/main/res/anim/slide_out_bottom.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android" >

    <translate
        android:duration="@android:integer/config_mediumAnimTime"
        android:fromYDelta="0"
        android:toYDelta="100%p" />

    <alpha
        android:duration="@android:integer/config_mediumAnimTime"
        android:fromAlpha="1"
        android:toAlpha="0.95" />

</set>

================================================
FILE: app/src/main/res/drawable/bg_color_white_corners_10.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:dither="true"
    android:shape="rectangle">

    <solid android:color="@color/white" />
    <corners android:radius="@dimen/padding_size_10" />

</shape>


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

    <android.support.v7.widget.Toolbar
        android:id="@+id/tool_bar"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="?attr/colorPrimary"
        android:minHeight="?attr/actionBarSize" />

    <EditText
        android:id="@+id/set_user_name"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginLeft="18dp"
        android:layout_marginRight="18dp"
        android:layout_marginTop="40dp" />

    <EditText
        android:id="@+id/set_pwd"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginLeft="18dp"
        android:layout_marginRight="18dp"
        android:layout_marginTop="20dp" />

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginLeft="18dp"
        android:layout_marginRight="18dp"
        android:layout_marginTop="20dp"
        android:orientation="horizontal">

        <EditText
            android:id="@+id/set_verify_code"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1" />

        <TextView
            android:id="@+id/get_verify_code"
            android:layout_width="50dp"
            android:layout_height="wrap_content"
            android:layout_gravity="center_vertical"
            android:text="获取验证码" />
    </LinearLayout>

    <TextView
        android:id="@+id/tv_login"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginLeft="18dp"
        android:layout_marginRight="18dp"
        android:layout_marginTop="35dp"
        android:gravity="center"
        android:paddingBottom="8dp"
        android:paddingTop="8dp"
        android:text="登录"
        android:textSize="17sp" />

</LinearLayout>


================================================
FILE: app/src/main/res/layout/activity_main.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:id="@+id/activity_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.wjj.easy.easyandroidHelper.module.main.MainActivity">

    <android.support.v7.widget.Toolbar
        android:id="@+id/tool_bar"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="?attr/colorPrimary"
        android:minHeight="?attr/actionBarSize" />

    <android.support.design.widget.TabLayout
        android:id="@+id/tab_layout"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        app:tabGravity="fill"
        app:tabIndicatorHeight="0dp"
        app:tabMode="fixed"
        app:tabPaddingBottom="-5dp" />

    <android.support.v4.view.ViewPager
        android:id="@+id/view_pager"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_above="@id/tab_layout"
        android:layout_below="@id/tool_bar" />

</RelativeLayout>


================================================
FILE: app/src/main/res/layout/dialog_loading.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:background="@drawable/bg_color_white_corners_10"
    android:orientation="horizontal"
    android:paddingBottom="@dimen/padding_size_15"
    android:paddingLeft="@dimen/padding_size_25"
    android:paddingRight="@dimen/padding_size_25"
    android:paddingTop="@dimen/padding_size_15">

    <TextView
        android:id="@+id/tv_loading_text"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_vertical"
        android:text="@string/app_loading"
        android:textColor="@color/tab_text_normal"
        android:textSize="@dimen/text_16sp" />

</LinearLayout>

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

    <android.support.v7.widget.RecyclerView
        android:id="@+id/rv_list"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>
</LinearLayout>

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

    <com.facebook.drawee.view.SimpleDraweeView
        android:id="@+id/my_image_view"
        android:layout_width="130dp"
        android:layout_height="130dp"
        fresco:placeholderImage="@mipmap/ic_launcher" />

</LinearLayout>

================================================
FILE: app/src/main/res/layout/home_list_item.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/ll_item_collection_list_root"
    android:fitsSystemWindows="true"
    android:background="@color/white"
    android:orientation="horizontal"
    android:padding="10dp"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

    <RelativeLayout
        android:layout_width="85dp"
        android:layout_height="85dp"
        android:layout_marginLeft="5dp"
        android:layout_marginRight="15dp">

    <com.facebook.drawee.view.SimpleDraweeView
        xmlns:fresco="http://schemas.android.com/apk/res-auto"
        android:id="@+id/dv_img"
        android:layout_width="85dp"
        android:layout_height="85dp"
        fresco:placeholderImage="@mipmap/default_ad_square"
      />

        <TextView
            android:id="@+id/tv_label"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:gravity="center_horizontal"
            android:paddingBottom="2dp"
            android:paddingTop="2dp"
            android:background="#90000000"
            android:text="宝约优选"
            android:textSize="14sp"
            android:layout_alignParentBottom="true"
            android:textColor="@color/white"/>
    </RelativeLayout>

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="8dp">


        <TextView
            android:id="@+id/tv_name"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:ellipsize="end"
            android:maxLines="1"
            android:text="一场前所未有的浸没"
            android:textColor="#2d2f39"
            android:textSize="14sp"
            android:drawableRight="@mipmap/icon_vip_all"
            android:drawablePadding="5dp"
            />


        <TextView
            android:id="@+id/tv_date"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_below="@id/tv_name"
            android:layout_marginTop="8dp"
            android:maxLines="1"
            android:text="2017.01.16"
            android:textColor="#aaaaaa"
            android:textSize="12sp" />

        <TextView
            android:id="@+id/tv_city"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignTop="@id/tv_date"
            android:layout_marginLeft="20dp"
            android:layout_toRightOf="@id/tv_date"
            android:text="上海市"
            android:textColor="#aaaaaa"
            android:textSize="12sp" />

        <TextView
            android:id="@+id/tv_price"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_below="@+id/tv_city"
            android:layout_marginTop="8dp"
            android:text="8,999"
            android:textColor="#ff5a00"
            android:textSize="14sp" />

        <TextView
            android:id="@+id/tv_price_y"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignBottom="@id/tv_price"
            android:layout_marginLeft="2dp"
            android:layout_toRightOf="@id/tv_price"
            android:text="元"
            android:textColor="#aaaaaa"
            android:textSize="12sp" />

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/tv_member_price"
            android:layout_marginLeft="25dp"
            android:text="会员价格:8,000 元"
            android:textColor="#ff8a26"
            android:textSize="12sp"
            android:layout_alignBottom="@+id/tv_price"
            android:layout_toRightOf="@+id/tv_price"/>

    </RelativeLayout>

</LinearLayout>

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

    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"
        android:orientation="vertical">

        <ImageView
            android:id="@+id/tab_icon_iv"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center_horizontal" />

        <TextView
            android:id="@+id/tab_title_tv"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center_horizontal" />
    </LinearLayout>
</RelativeLayout>

================================================
FILE: app/src/main/res/values/colors.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <color name="colorPrimary">#00bcd4</color>
    <color name="colorPrimaryDark">#00bcd4</color>
    <color name="colorAccent">#ff4081</color>
    <color name="white">#ffffff</color>
    <color name="grey">#9e9e9e</color>
    <color name="black">#000000</color>

    <color name="color_f0f3f8">#f0f3f8</color>
    <color name="tab_text_normal">#90909b</color>
</resources>


================================================
FILE: app/src/main/res/values/dimens.xml
================================================
<resources>
    <!-- Default screen margins, per the Android Design guidelines. -->
    <dimen name="activity_horizontal_margin">16dp</dimen>
    <dimen name="activity_vertical_margin">16dp</dimen>

    <!-- 四类字体大小 -->
    <dimen name="text_08sp">8sp</dimen>
    <dimen name="text_09sp">9sp</dimen>
    <dimen name="text_10sp">10sp</dimen>
    <dimen name="text_11sp">11sp</dimen>
    <dimen name="text_12sp">12sp</dimen>
    <dimen name="text_13sp">13sp</dimen>
    <dimen name="text_14sp">14sp</dimen>
    <dimen name="text_15sp">15sp</dimen>
    <dimen name="text_16sp">16sp</dimen>
    <dimen name="text_17sp">17sp</dimen>
    <dimen name="text_18sp">18sp</dimen>
    <dimen name="text_20sp">20sp</dimen>
    <dimen name="text_22sp">22sp</dimen>
    <dimen name="text_23sp">23sp</dimen>
    <dimen name="text_24sp">24sp</dimen>
    <dimen name="text_25sp">25sp</dimen>
    <dimen name="text_30sp">30sp</dimen>
    <dimen name="text_34sp">34sp</dimen>
    <dimen name="text_35sp">35sp</dimen>
    <dimen name="text_39sp">39sp</dimen>
    <dimen name="text_40sp">40sp</dimen>
    <dimen name="text_45sp">45sp</dimen>
    <dimen name="text_50sp">50sp</dimen>
    <dimen name="text_72sp">72sp</dimen>
    <dimen name="text_100sp">100sp</dimen>
    <dimen name="text_145sp">145sp</dimen>
    <dimen name="text_150sp">150sp</dimen>


    <!-- 基本内边距 -->
    <dimen name="padding_size_01">1dp</dimen>
    <dimen name="padding_size_01px">1px</dimen>
    <dimen name="padding_size_02">2dp</dimen>
    <dimen name="padding_size_03">3dp</dimen>
    <dimen name="padding_size_04">4dp</dimen>
    <dimen name="padding_size_05">5dp</dimen>
    <dimen name="padding_size_06">6dp</dimen>
    <dimen name="padding_size_07">7dp</dimen>
    <dimen name="padding_size_08">8dp</dimen>
    <dimen name="padding_size_09">9dp</dimen>
    <dimen name="padding_size_10">10dp</dimen>
    <dimen name="padding_size_11">11dp</dimen>
    <dimen name="padding_size_12">12dp</dimen>
    <dimen name="padding_size_13">13dp</dimen>
    <dimen name="padding_size_14">14dp</dimen>
    <dimen name="padding_size_15">15dp</dimen>
    <dimen name="padding_size_16">16dp</dimen>
    <dimen name="padding_size_17">17dp</dimen>
    <dimen name="padding_size_18">18dp</dimen>
    <dimen name="padding_size_19">19dp</dimen>
    <dimen name="padding_size_20">20dp</dimen>
    <dimen name="padding_size_21">21dp</dimen>
    <dimen name="padding_size_22">22dp</dimen>
    <dimen name="padding_size_23">23dp</dimen>
    <dimen name="padding_size_24">24dp</dimen>
    <dimen name="padding_size_25">25dp</dimen>
    <dimen name="padding_size_26">26dp</dimen>
    <dimen name="padding_size_27">27dp</dimen>
    <dimen name="padding_size_28">28dp</dimen>
    <dimen name="padding_size_29">29dp</dimen>
    <dimen name="padding_size_30">30dp</dimen>
    <dimen name="padding_size_32">32dp</dimen>
    <dimen name="padding_size_33">33dp</dimen>
    <dimen name="padding_size_35">35dp</dimen>
    <dimen name="padding_size_36">36dp</dimen>
    <dimen name="padding_size_39">39dp</dimen>
    <dimen name="padding_size_40">40dp</dimen>
    <dimen name="padding_size_42">42dp</dimen>
    <dimen name="padding_size_44">44dp</dimen>
    <dimen name="padding_size_45">45dp</dimen>
    <dimen name="padding_size_46">46dp</dimen>
    <dimen name="padding_size_47">47dp</dimen>
    <dimen name="padding_size_48">48dp</dimen>
    <dimen name="padding_size_50">50dp</dimen>
    <dimen name="padding_size_51">51dp</dimen>
    <dimen name="padding_size_55">55dp</dimen>
    <dimen name="padding_size_56">56dp</dimen>
    <dimen name="padding_size_58">58dp</dimen>
    <dimen name="padding_size_60">60dp</dimen>
    <dimen name="padding_size_63">63dp</dimen>
    <dimen name="padding_size_65">65dp</dimen>
    <dimen name="padding_size_68">68dp</dimen>
    <dimen name="padding_size_70">70dp</dimen>
    <dimen name="padding_size_72">72dp</dimen>
    <dimen name="padding_size_73">73dp</dimen>
    <dimen name="padding_size_75">75dp</dimen>
    <dimen name="padding_size_78">78dp</dimen>
    <dimen name="padding_size_80">80dp</dimen>
    <dimen name="padding_size_85">85dp</dimen>
    <dimen name="padding_size_88">88dp</dimen>
    <dimen name="padding_size_90">90dp</dimen>
    <dimen name="padding_size_95">95dp</dimen>
    <dimen name="padding_size_98">98dp</dimen>
    <dimen name="padding_size_100">100dp</dimen>
    <dimen name="padding_size_107">107dp</dimen>
    <dimen name="padding_size_110">110dp</dimen>
    <dimen name="padding_size_112">112dp</dimen>
    <dimen name="padding_size_135">135dp</dimen>
    <dimen name="padding_size_140">140dp</dimen>
    <dimen name="padding_size_148">148dp</dimen>
    <dimen name="padding_size_150">150dp</dimen>
    <dimen name="padding_size_151">151dp</dimen>
    <dimen name="padding_size_160">160dp</dimen>
    <dimen name="padding_size_165">165dp</dimen>
    <dimen name="padding_size_170">170dp</dimen>
    <dimen name="padding_size_190">190dp</dimen>
    <dimen name="padding_size_200">200dp</dimen>
    <dimen name="padding_size_210">210dp</dimen>
    <dimen name="padding_size_215">215dp</dimen>
    <dimen name="padding_size_220">220dp</dimen>
    <dimen name="padding_size_225">225dp</dimen>
    <dimen name="padding_size_228">228dp</dimen>
    <dimen name="padding_size_250">250dp</dimen>
    <dimen name="padding_size_260">260dp</dimen>
    <dimen name="padding_size_275">275dp</dimen>
    <dimen name="padding_size_300">300dp</dimen>
    <dimen name="padding_size_332">332dp</dimen>
    <dimen name="padding_size_350">350dp</dimen>
    <dimen name="padding_size_400">400dp</dimen>
    <dimen name="padding_size_500">500dp</dimen>
    <dimen name="padding_size_540">540dp</dimen>

</resources>


================================================
FILE: app/src/main/res/values/strings.xml
================================================
<resources>
    <string name="app_name">EasyAndroid</string>
    <string name="home_tab">首页</string>
    <string name="my_tab">我的</string>
    <string name="app_loading">加载中...</string>
</resources>


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

    <!-- Base application theme. -->
    <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>

    <!-- Style for custom dialog theme -->
    <style name="dialog_custom_roll_up_down" parent="@android:style/Theme.Dialog">
        <item name="android:windowFrame">@null</item>
        <item name="android:windowIsFloating">true</item>
        <item name="android:windowIsTranslucent">true</item>
        <item name="android:windowNoTitle">true</item>
        <item name="android:background">@android:color/transparent</item>
        <item name="android:windowBackground">@android:color/transparent</item>
        <item name="android:backgroundDimEnabled">true</item>
        <item name="android:backgroundDimAmount">0.4</item>
        <item name="android:windowAnimationStyle">@style/roll_up_down_anim_style</item>
    </style>

    <!-- Style for dialog loading theme -->
    <style name="customDialog_loading" parent="@android:style/Theme.Dialog">
        <item name="android:windowIsTranslucent">true</item>
        <item name="android:windowNoTitle">true</item>
        <item name="android:background">@android:color/transparent</item>
        <item name="android:windowBackground">@android:color/transparent</item>
        <item name="android:backgroundDimEnabled">true</item>
        <item name="android:backgroundDimAmount">0.4</item>
    </style>

    <style name="roll_up_down_anim_style" parent="android:Animation.Translucent">
        <!-- 进入时的动画 -->
        <item name="@android:windowEnterAnimation">@anim/roll_up</item>
        <!-- 退出时的动画 -->
        <item name="@android:windowExitAnimation">@anim/roll_down</item>
    </style>
</resources>


================================================
FILE: app/src/main/res/values-v21/styles.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<resources>

    <style name="AppTheme_1" parent="Theme.AppCompat.Light.NoActionBar">
        <item name="colorAccent">@color/colorAccent</item>
        <item name="android:statusBarColor">@color/colorAccent</item>
    </style>
</resources>

================================================
FILE: app/src/main/res/values-w820dp/dimens.xml
================================================
<resources>
    <!-- Example customization of dimensions originally defined in res/values/dimens.xml
         (such as screen margins) for screens with more than 820dp of available width. This
         would include 7" and 10" devices in landscape (~960dp and ~1280dp respectively). -->
    <dimen name="activity_horizontal_margin">64dp</dimen>
</resources>


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

buildscript {
    repositories {
        jcenter()
        mavenCentral()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:2.2.3'
        classpath 'com.neenbedankt.gradle.plugins:android-apt:1.4'
        classpath 'com.jakewharton:butterknife-gradle-plugin:8.5.1'
        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
        classpath 'com.jfrog.bintray.gradle:gradle-bintray-plugin:1.7'
        classpath 'com.github.dcendents:android-maven-gradle-plugin:1.5'
    }
}

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

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

// Define versions in a single place
ext {
    // Sdk and tools
    minSdkVersion = 19
    targetSdkVersion = 25
    compileSdkVersion = 25
    buildToolsVersion = '25.0.2'
    applicationId = "com.wjj.easy.easyandroidHelper"

    // App dependencies
    supportLibraryVersion = '25.2.0'
    retrofit2 = '2.2.0'
    okhttp3 = '3.4.1'
    persistentCookieJar = 'v1.0.1'
    fresco = '1.2.0'
    dagger2 = '2.0.2'
    annotation = '10.0-b28'
    butterknife = '8.5.1'
    utilcode = '1.3.7'
    orhanobutLogger = '1.15'
    baseRecyclerViewAdapterHelper = '2.9.9'
}

================================================
FILE: easyandroid/.gitignore
================================================
/build


================================================
FILE: easyandroid/build.gradle
================================================
apply plugin: 'com.android.library'
apply plugin: 'com.neenbedankt.android-apt'

android {
    compileSdkVersion rootProject.ext.compileSdkVersion
    buildToolsVersion rootProject.ext.buildToolsVersion

    defaultConfig {
        minSdkVersion rootProject.ext.minSdkVersion
        targetSdkVersion rootProject.ext.targetSdkVersion
        versionCode 1
        versionName "1.0"

    }

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

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    //support lib
    compile "com.android.support:appcompat-v7:$rootProject.supportLibraryVersion"
    compile "com.android.support:design:$rootProject.supportLibraryVersion"
    //retrofit2
    compile "com.squareup.retrofit2:retrofit:$rootProject.retrofit2"
    compile "com.squareup.retrofit2:converter-gson:$rootProject.retrofit2"
    //okhttp3
    compile "com.squareup.okhttp3:okhttp:$rootProject.okhttp3"
    compile "com.squareup.okhttp3:logging-interceptor:$rootProject.okhttp3"
    //persistentCookieJar
    compile "com.github.franmontiel:PersistentCookieJar:$rootProject.persistentCookieJar"
    //fresco
    compile "com.facebook.fresco:fresco:$rootProject.fresco"
    compile "com.facebook.fresco:imagepipeline-okhttp3:$rootProject.fresco"
    //dagger2
    apt "com.google.dagger:dagger-compiler:$rootProject.dagger2"
    compile "com.google.dagger:dagger:$rootProject.dagger2"
    compile "com.google.dagger:dagger-compiler:$rootProject.dagger2"
    compile "org.glassfish:javax.annotation:$rootProject.annotation"
    //recyclerViewAdapter
    compile "com.github.CymChad:BaseRecyclerViewAdapterHelper:$rootProject.baseRecyclerViewAdapterHelper"
    //utilcode
    compile "com.blankj:utilcode:$rootProject.utilcode"
    //logger
    compile "com.orhanobut:logger:$rootProject.orhanobutLogger"
}

ext {
    bintrayRepo = 'maven'////bintray上的仓库名,一般为maven
    bintrayName = 'EasyAndroid'//bintray上的项目名

    publishedGroupId = 'com.wjj.easy'//JCenter的GroupId
    artifact = 'easyandroid'//JCenter的ArtifactId

    siteUrl = 'https://github.com/wu928320442/EasyAndroid.git'
    gitUrl = 'https://github.com/wu928320442/EasyAndroid.git'

    libraryVersion = '1.0.0'//版本号
    libraryName = 'easyandroid'//项目名字,没什么用
    libraryDescription = 'A lib for Android'//项目描述,没什么用

    //开发者信息
    developerId = 'juju'
    developerName = 'juju'
    developerEmail = 'wujiajun311@gmail.com'

    //以上所有信息自行修改,以下不变

    licenseName = 'The Apache Software License, Version 2.0'
    licenseUrl = 'http://www.apache.org/licenses/LICENSE-2.0.txt'
    allLicenses = ["Apache-2.0"]
}
apply from:'https://cdn.rawgit.com/Jude95/JCenter/master/install.gradle'
apply from:'https://cdn.rawgit.com/Jude95/JCenter/master/bintray.gradle'

================================================
FILE: easyandroid/proguard-rules.pro
================================================
# Add project specific ProGuard rules here.
# By default, the flags in this file are appended to flags specified
# in /Users/wujiajun/Library/Android/sdk/tools/proguard/proguard-android.txt
# You can edit the include path and order by changing the proguardFiles
# directive in build.gradle.
#
# For more details, see
#   http://developer.android.com/guide/developing/tools/proguard.html

# Add any project specific keep options here:

# 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 *;
#}

#retrofit2
-dontwarn retrofit2.**
-keep class retrofit2.** { *; }
-keepattributes Signature
-keepattributes Exceptions
#utilcode
-keep class com.blankj.utilcode.** { *; }
-keepclassmembers class com.blankj.utilcode.** { *; }
-dontwarn com.blankj.utilcode.**

================================================
FILE: easyandroid/src/main/AndroidManifest.xml
================================================
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.wjj.easy.easyandroid">

    <application android:allowBackup="true" android:label="@string/app_name"
        android:supportsRtl="true">

    </application>

</manifest>


================================================
FILE: easyandroid/src/main/java/com/wjj/easy/easyandroid/http/Http.java
================================================
package com.wjj.easy.easyandroid.http;

import com.franmontiel.persistentcookiejar.ClearableCookieJar;
import com.wjj.easy.easyandroid.BuildConfig;

import java.util.ArrayList;
import java.util.concurrent.TimeUnit;

import okhttp3.Interceptor;
import okhttp3.OkHttpClient;
import okhttp3.logging.HttpLoggingInterceptor;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
import retrofit2.Retrofit;
import retrofit2.converter.gson.GsonConverterFactory;


/**
 * HTTP网络配置
 * 1.OkHttpClient配置
 * 2.Retrofit配置
 * 3.Builder构建初始化数据
 * Created by wujiajun on 17/4/5.
 */
public class Http {

    private static final boolean DEBUG = /*BuildConfig.DEBUG*/true;

    private HttpBuilder mBuilder;
    private OkHttpClient mClient;
    private Retrofit mRetrofit;

    public Http(HttpBuilder builder) {
        mBuilder = builder;
        configOKHttp();
        configRetrofit();
    }

    private void configOKHttp() {
        HttpLoggingInterceptor loggingInterceptor = new HttpLoggingInterceptor();
        loggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY);

        OkHttpClient.Builder builder = new OkHttpClient.Builder();
        if (DEBUG) {
            builder.addInterceptor(loggingInterceptor);
        }
        for (Interceptor interceptor : mBuilder.interceptors) {
            builder.addInterceptor(interceptor);
        }
        mClient = builder.retryOnConnectionFailure(true)
                .connectTimeout(mBuilder.timeout, TimeUnit.SECONDS)
                .cookieJar(mBuilder.cookieJar).build();
    }

    private void configRetrofit() {
        mRetrofit = new Retrofit.Builder()
                .baseUrl(mBuilder.baseUrl)
                .client(mClient)
                .addConverterFactory(GsonConverterFactory.create())
                .build();
    }

    /**
     * HTTP响应回调
     *
     * @param <T> 响应Bean
     */
    public interface HttpCallback<T> {
        /**
         * 成功响应
         *
         * @param t 响应Bean
         */
        void onResponse(T t);

        /**
         * 失败响应
         *
         * @param t 异常
         */
        void onFailure(Throwable t);
    }

    /**
     * Retrofit2 Callback缺省实现
     * 转换业务接口返回数据
     *
     * @param <T>
     */
    public static class CallbackDefault<T> implements Callback<T> {

        HttpCallback<T> httpCallback;

        public CallbackDefault(HttpCallback<T> httpCallback) {
            this.httpCallback = httpCallback;
        }

        @Override
        public void onResponse(Call<T> call, Response<T> response) {
            httpCallback.onResponse(response.body());
        }

        @Override
        public void onFailure(Call<T> call, Throwable t) {
            httpCallback.onFailure(t);
        }
    }

    /**
     * HTTP 构建类
     */
    public static final class HttpBuilder {
        private String baseUrl;
        private ClearableCookieJar cookieJar;
        private long timeout;
        private ArrayList<Interceptor> interceptors = new ArrayList<Interceptor>();

        public HttpBuilder setBaseUrl(String baseUrl) {
            this.baseUrl = baseUrl;
            return this;
        }

        public HttpBuilder setCookieJar(ClearableCookieJar cookieJar) {
            this.cookieJar = cookieJar;
            return this;
        }

        public HttpBuilder setTimeout(long timeout) {
            this.timeout = timeout;
            return this;
        }

        public HttpBuilder addInterceptor(Interceptor interceptor) {
            interceptors.add(interceptor);
            return this;
        }

        public Http build() {
            return new Http(this);
        }
    }

    public Retrofit getRetrofit() {
        return mRetrofit;
    }

    public OkHttpClient getClient() {
        return mClient;
    }
}


================================================
FILE: easyandroid/src/main/java/com/wjj/easy/easyandroid/mvp/EasyBasePresenter.java
================================================
package com.wjj.easy.easyandroid.mvp;

/**
 * MVP Presenter层基类
 * 适用范围:在Activity使用
 * Created by wujiajun on 17/4/6.
 */
public interface EasyBasePresenter<V extends EasyBaseView> {
    void start();
    void attachView(V view);
}


================================================
FILE: easyandroid/src/main/java/com/wjj/easy/easyandroid/mvp/EasyBasePresenterFrg.java
================================================
package com.wjj.easy.easyandroid.mvp;

/**
 * MVP Presenter层基类
 * 适用范围:Fragment中使用
 * Created by wujiajun on 17/4/13.
 */
public interface EasyBasePresenterFrg extends EasyBasePresenter {
    void setupListeners();
}


================================================
FILE: easyandroid/src/main/java/com/wjj/easy/easyandroid/mvp/EasyBaseView.java
================================================
package com.wjj.easy.easyandroid.mvp;

/**
 * MVP View层基类
 * 适用范围:在Activity使用
 * Created by wujiajun on 17/4/6.
 */
public interface EasyBaseView {

}


================================================
FILE: easyandroid/src/main/java/com/wjj/easy/easyandroid/mvp/EasyBaseViewFrg.java
================================================
package com.wjj.easy.easyandroid.mvp;

/**
 * MVP View层基类
 * 适用范围:在Fragment使用
 * Created by wujiajun on 17/4/13.
 */
public interface EasyBaseViewFrg extends EasyBaseView {
//    void setPresenter(T presenter);
}


================================================
FILE: easyandroid/src/main/java/com/wjj/easy/easyandroid/mvp/di/components/ActivityComponent.java
================================================
package com.wjj.easy.easyandroid.mvp.di.components;

import android.app.Activity;

import com.wjj.easy.easyandroid.mvp.di.modules.ActivityModule;
import com.wjj.easy.easyandroid.mvp.di.scopes.ActivityScope;

import dagger.Component;

/**
 * Activity注射组件
 *
 * @author wujiajun
 */
@ActivityScope
@Component(dependencies = AppComponent.class, modules = {ActivityModule.class})
public interface ActivityComponent {

    /**
     * 获取注入的Activity
     *
     * @return Activity
     */
    Activity getActivity();
}


================================================
FILE: easyandroid/src/main/java/com/wjj/easy/easyandroid/mvp/di/components/AppComponent.java
================================================
package com.wjj.easy.easyandroid.mvp.di.components;

import android.content.Context;

import com.wjj.easy.easyandroid.mvp.di.modules.AppModule;
import com.wjj.easy.easyandroid.mvp.di.scopes.ApplicationScope;

import javax.inject.Singleton;

import dagger.Component;

/**
 * Application注射组件
 *
 * @author wujiajun
 */
@ApplicationScope
@Component(modules = {AppModule.class})
public interface AppComponent {

    Context getContext();

}


================================================
FILE: easyandroid/src/main/java/com/wjj/easy/easyandroid/mvp/di/components/FragmentComponent.java
================================================
package com.wjj.easy.easyandroid.mvp.di.components;

import android.app.Activity;
import android.support.v4.app.Fragment;

import com.wjj.easy.easyandroid.mvp.di.modules.FragmentModule;
import com.wjj.easy.easyandroid.mvp.di.scopes.FragmentScope;

import dagger.Component;

/**
 * Fragment注射组件
 *
 * @author wujiajun
 */
@FragmentScope
@Component(modules = FragmentModule.class)
public interface FragmentComponent {
//    /**
//     * 获取注入的Fragment
//     *
//     * @return
//     */
//    Fragment getFragment();

    Activity getActivity();
}


================================================
FILE: easyandroid/src/main/java/com/wjj/easy/easyandroid/mvp/di/modules/ActivityModule.java
================================================
package com.wjj.easy.easyandroid.mvp.di.modules;

import android.app.Activity;

import com.wjj.easy.easyandroid.mvp.di.scopes.ActivityScope;

import dagger.Module;
import dagger.Provides;

/**
 * Activity注入提供者Module
 *
 * @author wujiajun
 */
@Module
public class ActivityModule {

    private final Activity activity;

    public ActivityModule(Activity activity) {
        this.activity = activity;
    }

    /**
     * 提供注入Activity
     * 注意ActivityScope的作用 所有依赖于ActivityScope的组件都依赖于Activity的生命周期
     *
     * @return Activity
     */
    @Provides
    @ActivityScope
    public Activity provideActivity() {
        return activity;
    }


}


================================================
FILE: easyandroid/src/main/java/com/wjj/easy/easyandroid/mvp/di/modules/AppModule.java
================================================
package com.wjj.easy.easyandroid.mvp.di.modules;

import android.content.Context;

import com.wjj.easy.easyandroid.mvp.di.scopes.ApplicationScope;

import javax.inject.Singleton;

import dagger.Module;
import dagger.Provides;

/**
 * Application注入提供者Module
 *
 * @author wujiajun
 */
@Module
public class AppModule {

    Context context;

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

    @ApplicationScope
    @Provides
    public Context provideContext() {
        return context;
    }

}


================================================
FILE: easyandroid/src/main/java/com/wjj/easy/easyandroid/mvp/di/modules/FragmentModule.java
================================================
package com.wjj.easy.easyandroid.mvp.di.modules;

import android.app.Activity;
import android.support.v4.app.Fragment;

import com.wjj.easy.easyandroid.mvp.di.scopes.FragmentScope;

import dagger.Module;
import dagger.Provides;

/**
 * Activity注入提供者Module
 *
 * @author wujiajun
 */
@Module
public class FragmentModule {
    private Fragment fragment;

    public FragmentModule(Fragment fragment) {
        this.fragment = fragment;
    }

//    /**
//     * 提供注入Fragment
//     * 注意FragmentScope的作用 所有依赖于FragmentScope的组件都依赖于Fragment的生命周期
//     *
//     * @return Activity
//     */
//    @FragmentScope
//    @Provides
//    Fragment provideFragment() {
//        return fragment;
//    }

    @Provides
    @FragmentScope
    public Activity provideActivity() {
        return fragment.getActivity();
    }
}


================================================
FILE: easyandroid/src/main/java/com/wjj/easy/easyandroid/mvp/di/scopes/ActivityScope.java
================================================
package com.wjj.easy.easyandroid.mvp.di.scopes;

import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;

import javax.inject.Scope;

/**
 * Activity域注解
 * 目的是管理域内对象的生命周期
 *
 * @author wujiajun
 */
@Scope
@Retention(RetentionPolicy.RUNTIME)
public @interface ActivityScope {
}


================================================
FILE: easyandroid/src/main/java/com/wjj/easy/easyandroid/mvp/di/scopes/ApplicationScope.java
================================================
package com.wjj.easy.easyandroid.mvp.di.scopes;

import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;

import javax.inject.Scope;

/**
 * Application域注解
 * 目的是管理域内对象的生命周期
 *
 * @author wujiajun
 */
@Scope
@Retention(RetentionPolicy.RUNTIME)
public @interface ApplicationScope {
}


================================================
FILE: easyandroid/src/main/java/com/wjj/easy/easyandroid/mvp/di/scopes/FragmentScope.java
================================================
package com.wjj.easy.easyandroid.mvp.di.scopes;

import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;

import javax.inject.Scope;

/**
 * Fragment域注解
 * 目的是管理域内对象的生命周期
 *
 * @author wujiajun
 */
@Scope
@Retention(RetentionPolicy.RUNTIME)
public @interface FragmentScope {
}


================================================
FILE: easyandroid/src/main/java/com/wjj/easy/easyandroid/mvp/domain/executor/Executor.java
================================================
package com.wjj.easy.easyandroid.mvp.domain.executor;


import com.wjj.easy.easyandroid.mvp.domain.usecases.AbstractUseCase;

/**
 * Executor抽象接口
 * 目的是专门在后台执行任务
 *
 * @author wujiajun
 */
public interface Executor {

    /**
     * 执行用例的方法
     * 方法会调用用例的run方法,然后调用用例的Start方法,这个方法应该在后台操作,用例可能比较耗时
     *
     * @param interactor
     */
    void execute(final AbstractUseCase interactor);
}


================================================
FILE: easyandroid/src/main/java/com/wjj/easy/easyandroid/mvp/domain/executor/MainThread.java
================================================
package com.wjj.easy.easyandroid.mvp.domain.executor;

/**
 * MainThread定义了一个能够在主线程使用用例执行的接口
 * 举个例子:如果一个用例需要显示一个对象到UI上,能够使用这个确保run执行的内容是在主线程中
 * @author wujiajun
 */
public interface MainThread {

    /**
     * 执行一个Runnable
     * 确保Runnable中的内容在主线程中运行
     *
     * @param runnable
     */
    void post(final Runnable runnable);
}


================================================
FILE: easyandroid/src/main/java/com/wjj/easy/easyandroid/mvp/domain/executor/impl/MainThreadImpl.java
================================================
package com.wjj.easy.easyandroid.mvp.domain.executor.impl;

import android.os.Handler;
import android.os.Looper;

import com.wjj.easy.easyandroid.mvp.domain.executor.MainThread;


/**
 * MainThread具体实现类
 * 确保Runnable中的内容在主线程中执行
 *
 * @author wujiajun
 */
public class MainThreadImpl implements MainThread {

    private static MainThread sMainThread;

    private Handler mHandler;

    private MainThreadImpl() {
        mHandler = new Handler(Looper.getMainLooper());
    }

    @Override
    public void post(Runnable runnable) {
        mHandler.post(runnable);
    }

    public static MainThread getInstance() {
        if (sMainThread == null) {
            sMainThread = new MainThreadImpl();
        }

        return sMainThread;
    }
}


================================================
FILE: easyandroid/src/main/java/com/wjj/easy/easyandroid/mvp/domain/executor/impl/ThreadExecutor.java
================================================
package com.wjj.easy.easyandroid.mvp.domain.executor.impl;


import com.wjj.easy.easyandroid.mvp.domain.executor.Executor;
import com.wjj.easy.easyandroid.mvp.domain.usecases.AbstractUseCase;

import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

/**
 * Executor具体实现类
 * 实现用例的执行,用例生命周期的更新
 * 注意它是个单例模式
 *
 * @author wujiajun
 */
public class ThreadExecutor implements Executor {

    // This is a singleton
    private static volatile ThreadExecutor sThreadExecutor;

    private static final int CORE_POOL_SIZE = 3;
    private static final int MAX_POOL_SIZE = 5;
    private static final int KEEP_ALIVE_TIME = 120;
    private static final TimeUnit TIME_UNIT = TimeUnit.SECONDS;
    private static final BlockingQueue<Runnable> WORK_QUEUE = new LinkedBlockingQueue<Runnable>();

    private ThreadPoolExecutor mThreadPoolExecutor;

    private ThreadExecutor() {
        long keepAlive = KEEP_ALIVE_TIME;
        mThreadPoolExecutor = new ThreadPoolExecutor(
                CORE_POOL_SIZE,
                MAX_POOL_SIZE,
                keepAlive,
                TIME_UNIT,
                WORK_QUEUE);
    }

    @Override
    public void execute(final AbstractUseCase interactor) {
        mThreadPoolExecutor.submit(new Runnable() {
            @Override
            public void run() {
                //执行用例逻辑
                interactor.run();
                //更新用例状态
                interactor.onFinished();
            }
        });
    }

    /**
     * Executor实例
     *
     * @return
     */
    public static Executor getInstance() {
        if (sThreadExecutor == null) {
            sThreadExecutor = new ThreadExecutor();
        }

        return sThreadExecutor;
    }
}


================================================
FILE: easyandroid/src/main/java/com/wjj/easy/easyandroid/mvp/domain/usecases/AbstractUseCase.java
================================================
package com.wjj.easy.easyandroid.mvp.domain.usecases;


import com.wjj.easy.easyandroid.mvp.domain.executor.Executor;
import com.wjj.easy.easyandroid.mvp.domain.executor.MainThread;

import javax.inject.Inject;

/**
 * Domain层中抽象UseCase
 * 实现UseCase的基本操作,生命周期控制
 * 举个例子:当Activity被销毁的时候,我们应该取消掉这个任务 volatile的目的是为了多线程都可以调用
 *
 * @author wujiajun
 */
public abstract class AbstractUseCase implements UseCase {

    @Inject
    protected Executor mThreadExecutor;
    @Inject
    protected MainThread mMainThread;

    protected volatile boolean mIsCanceled;
    protected volatile boolean mIsRunning;

    protected Callback mCallback;

    /**
     * 业务逻辑实现方法
     * 别主动调用他,Executor中自动执行调用
     *
     * @see Executor
     */
    public abstract void run();

    /**
     * 取消当前任务
     */
    public void cancel() {
        mIsCanceled = true;
        mIsRunning = false;
    }

    /**
     * 检测任务是否正在进行中
     *
     * @return true进行中 false处理完成/还没有处理/被取消掉
     */
    public boolean isRunning() {
        return mIsRunning;
    }

    /**
     * 完成操作
     */
    public void onFinished() {
        mIsRunning = false;
        mIsCanceled = false;
    }

    /**
     * 执行任务
     */
    public void execute() {
        this.mIsRunning = true;
        mThreadExecutor.execute(this);
    }

    /**
     * 设置任务回调接口
     *
     * @param callback
     */
    public void setCallback(Callback callback) {
        this.mCallback = callback;
    }

    /**
     * 获取任务回调接口
     *
     * @return
     */
    public Callback getCallback() {
        return mCallback;
    }


}


================================================
FILE: easyandroid/src/main/java/com/wjj/easy/easyandroid/mvp/domain/usecases/UseCase.java
================================================
package com.wjj.easy.easyandroid.mvp.domain.usecases;


/**
 * Domain层中UseCase抽象接口
 *
 * @author wujiajun
 */
public interface UseCase {

    /**
     * UserCase执行方法
     * 可在任何线程执行
     */
    void execute();

    /**
     * 任务回调通用接口
     */
    interface Callback<T> {
        void success(T t);

        void fail();
    }
}


================================================
FILE: easyandroid/src/main/java/com/wjj/easy/easyandroid/ui/EasyActivity.java
================================================
package com.wjj.easy.easyandroid.ui;

import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;

import com.orhanobut.logger.Logger;
import com.wjj.easy.easyandroid.BuildConfig;
import com.wjj.easy.easyandroid.mvp.EasyBaseView;

/**
 * Activity基类
 * Created by wujiajun on 17/4/14.
 */

public abstract class EasyActivity extends AppCompatActivity implements EasyBaseView {

    private final static String TAG = EasyActivity.class.getSimpleName();
    private final static boolean DEBUG = BuildConfig.DEBUG;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(getContentView());
    }

    @Override
    protected void onStart() {
        super.onStart();
        if (DEBUG) {
            Logger.t(TAG).d("onStart");
        }
    }

    @Override
    protected void onRestart() {
        super.onRestart();
        if (DEBUG) {
            Logger.t(TAG).d("onRestart");
        }
    }

    @Override
    protected void onResume() {
        super.onResume();
        if (DEBUG) {
            Logger.t(TAG).d("onResume");
        }
    }

    @Override
    protected void onStop() {
        super.onStop();
        if (DEBUG) {
            Logger.t(TAG).d("onStop");
        }
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        if (DEBUG) {
            Logger.t(TAG).d("onDestroy");
        }
    }

    protected abstract int getContentView();


}


================================================
FILE: easyandroid/src/main/java/com/wjj/easy/easyandroid/ui/EasyFragment.java
================================================
package com.wjj.easy.easyandroid.ui;

import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

import com.orhanobut.logger.Logger;
import com.wjj.easy.easyandroid.BuildConfig;
import com.wjj.easy.easyandroid.mvp.EasyBasePresenter;
import com.wjj.easy.easyandroid.mvp.EasyBaseView;

import javax.inject.Inject;

/**
 * Created by wujiajun on 17/4/14.
 */

public abstract class EasyFragment extends Fragment implements EasyBaseView {

    private final static String TAG = EasyFragment.class.getSimpleName();
    private final static boolean DEBUG = BuildConfig.DEBUG;

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view = inflater.inflate(getContentView(), container, false);
        initView(view);
        init(view);
        return view;
    }

    protected abstract void init(View view);

    protected abstract void initView(View view);

    @Override
    public void onStart() {
        super.onStart();
        if (DEBUG) {
            Logger.t(TAG).d("onStart");
        }
    }

    @Override
    public void onResume() {
        super.onResume();
        if (DEBUG) {
            Logger.t(TAG).d("onResume");
        }
    }

    @Override
    public void onPause() {
        super.onPause();
        if (DEBUG) {
            Logger.t(TAG).d("onPause");
        }
    }

    @Override
    public void onStop() {
        super.onStop();
        if (DEBUG) {
            Logger.t(TAG).d("onStop");
        }
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        if (DEBUG) {
            Logger.t(TAG).d("onDestroy");
        }
    }

    protected abstract int getContentView();
}


================================================
FILE: easyandroid/src/main/res/values/strings.xml
================================================
<resources>
    <string name="app_name">androidlib</string>
</resources>


================================================
FILE: gradle/wrapper/gradle-wrapper.properties
================================================
#Mon Dec 28 10:00:20 PST 2015
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-2.14.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


================================================
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: settings.gradle
================================================
include ':app', ':easyandroid'
Download .txt
gitextract_ng9b39p4/

├── .gitignore
├── .idea/
│   ├── compiler.xml
│   ├── copyright/
│   │   └── profiles_settings.xml
│   ├── encodings.xml
│   ├── gradle.xml
│   ├── misc.xml
│   ├── modules.xml
│   ├── runConfigurations.xml
│   └── vcs.xml
├── README.md
├── app/
│   ├── .gitignore
│   ├── build.gradle
│   ├── proguard-rules.pro
│   └── src/
│       └── main/
│           ├── AndroidManifest.xml
│           ├── java/
│           │   └── com/
│           │       └── wjj/
│           │           └── easy/
│           │               └── easyandroidHelper/
│           │                   ├── AppApplication.java
│           │                   ├── common/
│           │                   │   ├── base/
│           │                   │   │   ├── BaseActivity.java
│           │                   │   │   ├── BaseFragment.java
│           │                   │   │   ├── BasePresenter.java
│           │                   │   │   ├── BaseView.java
│           │                   │   │   ├── SimpleActivity.java
│           │                   │   │   └── SimpleFragment.java
│           │                   │   ├── di/
│           │                   │   │   ├── ActivityCommonComponent.java
│           │                   │   │   ├── AppCommonComponent.java
│           │                   │   │   ├── AppCommonModule.java
│           │                   │   │   └── FragmentCommonComponent.java
│           │                   │   └── net/
│           │                   │       ├── ApiService.java
│           │                   │       ├── AppHttp.java
│           │                   │       ├── CookieHead.java
│           │                   │       └── CookieInterceptor.java
│           │                   ├── model/
│           │                   │   ├── ListInfo.java
│           │                   │   ├── LoginInfo.java
│           │                   │   ├── LoginResponse.java
│           │                   │   └── base/
│           │                   │       ├── BaseChartInfo.java
│           │                   │       ├── BaseChartListInfo.java
│           │                   │       ├── BaseResponseInfo.java
│           │                   │       ├── BaseResponseListInfo.java
│           │                   │       └── BaseStatus.java
│           │                   ├── module/
│           │                   │   ├── login/
│           │                   │   │   ├── LoginActivity.java
│           │                   │   │   ├── LoginContract.java
│           │                   │   │   ├── LoginPresenter.java
│           │                   │   │   └── domain/
│           │                   │   │       ├── GetVerifyCodeTask.java
│           │                   │   │       └── LoginTask.java
│           │                   │   └── main/
│           │                   │       ├── HomeContract.java
│           │                   │       ├── HomeFragment.java
│           │                   │       ├── HomePresenter.java
│           │                   │       ├── MainActivity.java
│           │                   │       ├── MyContract.java
│           │                   │       ├── MyFragment.java
│           │                   │       ├── MyPresenter.java
│           │                   │       ├── adapter/
│           │                   │       │   └── HomeAdapter.java
│           │                   │       └── domain/
│           │                   │           └── GetListTask.java
│           │                   ├── utils/
│           │                   │   └── SecretUtils.java
│           │                   └── widget/
│           │                       └── dialog/
│           │                           ├── BaseDialog.java
│           │                           └── DialogLoading.java
│           └── res/
│               ├── anim/
│               │   ├── roll_down.xml
│               │   ├── roll_up.xml
│               │   ├── slide_in_bottom.xml
│               │   └── slide_out_bottom.xml
│               ├── drawable/
│               │   └── bg_color_white_corners_10.xml
│               ├── layout/
│               │   ├── activity_login.xml
│               │   ├── activity_main.xml
│               │   ├── dialog_loading.xml
│               │   ├── fragment_home.xml
│               │   ├── fragment_my.xml
│               │   ├── home_list_item.xml
│               │   └── view_main_tab.xml
│               ├── values/
│               │   ├── colors.xml
│               │   ├── dimens.xml
│               │   ├── strings.xml
│               │   └── styles.xml
│               ├── values-v21/
│               │   └── styles.xml
│               └── values-w820dp/
│                   └── dimens.xml
├── build.gradle
├── easyandroid/
│   ├── .gitignore
│   ├── build.gradle
│   ├── proguard-rules.pro
│   └── src/
│       └── main/
│           ├── AndroidManifest.xml
│           ├── java/
│           │   └── com/
│           │       └── wjj/
│           │           └── easy/
│           │               └── easyandroid/
│           │                   ├── http/
│           │                   │   └── Http.java
│           │                   ├── mvp/
│           │                   │   ├── EasyBasePresenter.java
│           │                   │   ├── EasyBasePresenterFrg.java
│           │                   │   ├── EasyBaseView.java
│           │                   │   ├── EasyBaseViewFrg.java
│           │                   │   ├── di/
│           │                   │   │   ├── components/
│           │                   │   │   │   ├── ActivityComponent.java
│           │                   │   │   │   ├── AppComponent.java
│           │                   │   │   │   └── FragmentComponent.java
│           │                   │   │   ├── modules/
│           │                   │   │   │   ├── ActivityModule.java
│           │                   │   │   │   ├── AppModule.java
│           │                   │   │   │   └── FragmentModule.java
│           │                   │   │   └── scopes/
│           │                   │   │       ├── ActivityScope.java
│           │                   │   │       ├── ApplicationScope.java
│           │                   │   │       └── FragmentScope.java
│           │                   │   └── domain/
│           │                   │       ├── executor/
│           │                   │       │   ├── Executor.java
│           │                   │       │   ├── MainThread.java
│           │                   │       │   └── impl/
│           │                   │       │       ├── MainThreadImpl.java
│           │                   │       │       └── ThreadExecutor.java
│           │                   │       └── usecases/
│           │                   │           ├── AbstractUseCase.java
│           │                   │           └── UseCase.java
│           │                   └── ui/
│           │                       ├── EasyActivity.java
│           │                       └── EasyFragment.java
│           └── res/
│               └── values/
│                   └── strings.xml
├── gradle/
│   └── wrapper/
│       ├── gradle-wrapper.jar
│       └── gradle-wrapper.properties
├── gradle.properties
├── gradlew
├── gradlew.bat
└── settings.gradle
Download .txt
SYMBOL INDEX (385 symbols across 59 files)

FILE: app/src/main/java/com/wjj/easy/easyandroidHelper/AppApplication.java
  class AppApplication (line 13) | public class AppApplication extends Application {
    method onCreate (line 17) | @Override
    method getAppComponent (line 23) | public AppCommonComponent getAppComponent() {

FILE: app/src/main/java/com/wjj/easy/easyandroidHelper/common/base/BaseActivity.java
  class BaseActivity (line 24) | public abstract class BaseActivity<P extends EasyBasePresenter> extends ...
    method onCreate (line 31) | @Override
    method initView (line 41) | protected void initView() {
    method toast (line 46) | public void toast(String msg) {
    method showLoading (line 50) | public void showLoading() {
    method hiddenLoading (line 54) | public void hiddenLoading() {
    method getActivityComponent (line 58) | protected ActivityCommonComponent getActivityComponent() {
    method getActivityModule (line 65) | protected ActivityModule getActivityModule() {
    method getPresenter (line 69) | public P getPresenter() {
    method initInject (line 73) | protected abstract void initInject();
    method initEventAndData (line 75) | protected abstract void initEventAndData();

FILE: app/src/main/java/com/wjj/easy/easyandroidHelper/common/base/BaseFragment.java
  class BaseFragment (line 24) | public abstract class BaseFragment<P extends EasyBasePresenter> extends ...
    method initView (line 31) | @Override
    method init (line 37) | @Override
    method onStart (line 45) | @Override
    method toast (line 51) | public void toast(String msg) {
    method showLoading (line 55) | public void showLoading() {
    method hiddenLoading (line 59) | public void hiddenLoading() {
    method getFragmentComponent (line 63) | protected FragmentCommonComponent getFragmentComponent() {
    method getFragmentModule (line 70) | protected FragmentModule getFragmentModule() {
    method initInject (line 74) | protected abstract void initInject();
    method initEventAndData (line 76) | protected abstract void initEventAndData();
    method setPresenter (line 78) | public void setPresenter(P presenter) {
    method getPresenter (line 82) | public P getPresenter() {

FILE: app/src/main/java/com/wjj/easy/easyandroidHelper/common/base/BasePresenter.java
  class BasePresenter (line 17) | public class BasePresenter<V extends EasyBaseView> implements EasyBasePr...
    method start (line 26) | @Override
    method attachView (line 31) | public void attachView(V view) {
    method getView (line 35) | public V getView() {
    method getThreadExecutor (line 39) | public Executor getThreadExecutor() {
    method execute (line 43) | protected void execute(AbstractUseCase task) {

FILE: app/src/main/java/com/wjj/easy/easyandroidHelper/common/base/BaseView.java
  type BaseView (line 11) | public interface BaseView extends EasyBaseView {
    method toast (line 12) | void toast(String msg);
    method showLoading (line 14) | void showLoading();
    method hiddenLoading (line 16) | void hiddenLoading();

FILE: app/src/main/java/com/wjj/easy/easyandroidHelper/common/base/SimpleActivity.java
  class SimpleActivity (line 18) | public abstract class SimpleActivity extends EasyActivity {
    method onCreate (line 22) | @Override
    method initView (line 29) | protected void initView() {
    method toast (line 34) | public void toast(String msg) {
    method showLoading (line 38) | public void showLoading() {
    method hiddenLoading (line 42) | public void hiddenLoading() {
    method initEventAndData (line 46) | protected abstract void initEventAndData();

FILE: app/src/main/java/com/wjj/easy/easyandroidHelper/common/base/SimpleFragment.java
  class SimpleFragment (line 17) | public abstract class SimpleFragment extends EasyFragment {
    method initView (line 21) | @Override
    method init (line 27) | @Override
    method onStart (line 32) | @Override
    method toast (line 37) | public void toast(String msg) {
    method showLoading (line 41) | public void showLoading() {
    method hiddenLoading (line 45) | public void hiddenLoading() {
    method initEventAndData (line 49) | protected abstract void initEventAndData();

FILE: app/src/main/java/com/wjj/easy/easyandroidHelper/common/di/ActivityCommonComponent.java
  type ActivityCommonComponent (line 15) | @ActivityScope
    method inject (line 19) | void inject(LoginActivity activity);
    method inject (line 21) | void inject(MainActivity activity);

FILE: app/src/main/java/com/wjj/easy/easyandroidHelper/common/di/AppCommonComponent.java
  type AppCommonComponent (line 16) | @ApplicationScope
    method getApiService (line 19) | ApiService getApiService();
    method getExecutor (line 21) | Executor getExecutor();
    method getMainThread (line 23) | MainThread getMainThread();

FILE: app/src/main/java/com/wjj/easy/easyandroidHelper/common/di/AppCommonModule.java
  class AppCommonModule (line 30) | @Module
    method AppCommonModule (line 35) | public AppCommonModule(Context context) {
    method initHttp (line 45) | private void initHttp() {
    method initImage (line 60) | private void initImage() {
    method initUtils (line 70) | private void initUtils() {
    method provideApiService (line 74) | @Provides
    method provideExecutor (line 79) | @Provides
    method provideMainThread (line 84) | @Provides

FILE: app/src/main/java/com/wjj/easy/easyandroidHelper/common/di/FragmentCommonComponent.java
  type FragmentCommonComponent (line 16) | @FragmentScope
    method inject (line 20) | void inject(HomeFragment fragment);
    method inject (line 22) | void inject(MyFragment fragment);

FILE: app/src/main/java/com/wjj/easy/easyandroidHelper/common/net/ApiService.java
  type ApiService (line 18) | public interface ApiService {
    method getVerifyCode (line 27) | @FormUrlEncoded
    method login (line 34) | @FormUrlEncoded
    method getList (line 41) | @GET("http://baoyue.qbao.com/app/task/list.json")

FILE: app/src/main/java/com/wjj/easy/easyandroidHelper/common/net/AppHttp.java
  class AppHttp (line 16) | public class AppHttp {
    method AppHttp (line 20) | @Inject
    method getVerifyCode (line 25) | public void getVerifyCode(String username, String pwd, final Http.Http...
    method login (line 31) | public void login(String username, String pwd, String verifyCode, fina...
    method getList (line 37) | public void getList(int index, final Http.HttpCallback<ListInfo> callb...

FILE: app/src/main/java/com/wjj/easy/easyandroidHelper/common/net/CookieHead.java
  type CookieHead (line 7) | public enum CookieHead {
    method CookieHead (line 16) | CookieHead(String head, String value) {
    method getHead (line 21) | public String getHead() {
    method getValue (line 25) | public String getValue() {

FILE: app/src/main/java/com/wjj/easy/easyandroidHelper/common/net/CookieInterceptor.java
  class CookieInterceptor (line 13) | public class CookieInterceptor implements Interceptor {
    method intercept (line 15) | @Override

FILE: app/src/main/java/com/wjj/easy/easyandroidHelper/model/ListInfo.java
  class ListInfo (line 13) | public class ListInfo implements Parcelable {
    method isSuccess (line 27) | public boolean isSuccess() {
    method setSuccess (line 31) | public void setSuccess(boolean success) {
    method getReturnCode (line 35) | public int getReturnCode() {
    method setReturnCode (line 39) | public void setReturnCode(int returnCode) {
    method getMessage (line 43) | public String getMessage() {
    method setMessage (line 47) | public void setMessage(String message) {
    method getData (line 51) | public List<DataBean> getData() {
    method setData (line 55) | public void setData(List<DataBean> data) {
    class DataBean (line 59) | public static class DataBean {
      method toString (line 61) | @Override
      method getTaskId (line 113) | public int getTaskId() {
      method setTaskId (line 117) | public void setTaskId(int taskId) {
      method getTitle (line 121) | public String getTitle() {
      method setTitle (line 125) | public void setTitle(String title) {
      method getContent (line 129) | public String getContent() {
      method setContent (line 133) | public void setContent(String content) {
      method getImageUrl (line 137) | public String getImageUrl() {
      method setImageUrl (line 141) | public void setImageUrl(String imageUrl) {
      method getAmt (line 145) | public String getAmt() {
      method setAmt (line 149) | public void setAmt(String amt) {
      method getDoTime (line 153) | public String getDoTime() {
      method setDoTime (line 157) | public void setDoTime(String doTime) {
      method getCity (line 161) | public String getCity() {
      method setCity (line 165) | public void setCity(String city) {
      method getAddress (line 169) | public String getAddress() {
      method setAddress (line 173) | public void setAddress(String address) {
      method getPayKind (line 177) | public String getPayKind() {
      method setPayKind (line 181) | public void setPayKind(String payKind) {
      method getTaskTypeName (line 185) | public String getTaskTypeName() {
      method setTaskTypeName (line 189) | public void setTaskTypeName(String taskTypeName) {
      method getOnlyVip (line 193) | public int getOnlyVip() {
      method setOnlyVip (line 197) | public void setOnlyVip(int onlyVip) {
      method getHasMemberAmt (line 201) | public int getHasMemberAmt() {
      method setHasMemberAmt (line 205) | public void setHasMemberAmt(int hasMemberAmt) {
      method getMemberAmt (line 209) | public String getMemberAmt() {
      method setMemberAmt (line 213) | public void setMemberAmt(String memberAmt) {
      method isIsFree (line 217) | public boolean isIsFree() {
      method setIsFree (line 221) | public void setIsFree(boolean isFree) {
    method describeContents (line 227) | @Override
    method writeToParcel (line 232) | @Override
    method ListInfo (line 240) | public ListInfo() {
    method ListInfo (line 243) | protected ListInfo(Parcel in) {
    method createFromParcel (line 252) | @Override
    method newArray (line 257) | @Override
    method toString (line 263) | @Override

FILE: app/src/main/java/com/wjj/easy/easyandroidHelper/model/LoginInfo.java
  class LoginInfo (line 10) | public class LoginInfo implements Parcelable {
    method getMobile (line 20) | public String getMobile() {
    method setMobile (line 24) | public void setMobile(String mobile) {
    method getSessionId (line 28) | public String getSessionId() {
    method setSessionId (line 32) | public void setSessionId(String sessionId) {
    method toString (line 36) | @Override
    method describeContents (line 45) | @Override
    method writeToParcel (line 50) | @Override
    method LoginInfo (line 56) | protected LoginInfo(Parcel in) {
    method createFromParcel (line 62) | @Override
    method newArray (line 67) | @Override

FILE: app/src/main/java/com/wjj/easy/easyandroidHelper/model/LoginResponse.java
  class LoginResponse (line 10) | public class LoginResponse extends BaseResponseInfo<LoginInfo> {

FILE: app/src/main/java/com/wjj/easy/easyandroidHelper/model/base/BaseChartInfo.java
  class BaseChartInfo (line 10) | public class BaseChartInfo<T extends Parcelable> implements Parcelable {
    method isSuccess (line 18) | public boolean isSuccess() {
    method setSuccess (line 22) | public void setSuccess(boolean success) {
    method getTotalCount (line 26) | public int getTotalCount() {
    method setTotalCount (line 30) | public void setTotalCount(int totalCount) {
    method getRecordsTotal (line 34) | public int getRecordsTotal() {
    method setRecordsTotal (line 38) | public void setRecordsTotal(int recordsTotal) {
    method getRecordsFiltered (line 42) | public int getRecordsFiltered() {
    method setRecordsFiltered (line 46) | public void setRecordsFiltered(int recordsFiltered) {
    method getData (line 50) | public T getData() {
    method setData (line 54) | public void setData(T data) {
    method toString (line 58) | @Override
    method describeContents (line 70) | @Override
    method writeToParcel (line 75) | @Override
    method BaseChartInfo (line 86) | public BaseChartInfo() {
    method BaseChartInfo (line 89) | protected BaseChartInfo(Parcel in) {
    method createFromParcel (line 104) | @Override
    method newArray (line 109) | @Override

FILE: app/src/main/java/com/wjj/easy/easyandroidHelper/model/base/BaseChartListInfo.java
  class BaseChartListInfo (line 13) | public class BaseChartListInfo<T extends Parcelable> implements Parcelab...
    method isSuccess (line 23) | public boolean isSuccess() {
    method setSuccess (line 27) | public void setSuccess(boolean success) {
    method getTotalCount (line 31) | public int getTotalCount() {
    method setTotalCount (line 35) | public void setTotalCount(int totalCount) {
    method getRecordsTotal (line 39) | public int getRecordsTotal() {
    method setRecordsTotal (line 43) | public void setRecordsTotal(int recordsTotal) {
    method getRecordsFiltered (line 47) | public int getRecordsFiltered() {
    method setRecordsFiltered (line 51) | public void setRecordsFiltered(int recordsFiltered) {
    method getData (line 55) | public ArrayList<T> getData() {
    method setData (line 59) | public void setData(ArrayList<T> data) {
    method toString (line 63) | @Override
    method describeContents (line 75) | @Override
    method writeToParcel (line 80) | @Override
    method BaseChartListInfo (line 92) | public BaseChartListInfo() {
    method BaseChartListInfo (line 95) | protected BaseChartListInfo(Parcel in) {
    method createFromParcel (line 109) | @Override
    method newArray (line 114) | @Override

FILE: app/src/main/java/com/wjj/easy/easyandroidHelper/model/base/BaseResponseInfo.java
  class BaseResponseInfo (line 10) | public class BaseResponseInfo<T extends Parcelable> extends BaseStatus {
    method getData (line 14) | public T getData() {
    method setData (line 18) | public void setData(T data) {
    method toString (line 22) | @Override
    method describeContents (line 29) | @Override
    method writeToParcel (line 34) | @Override
    method BaseResponseInfo (line 42) | public BaseResponseInfo() {
    method BaseResponseInfo (line 45) | protected BaseResponseInfo(Parcel in) {
    method createFromParcel (line 57) | @Override
    method newArray (line 62) | @Override

FILE: app/src/main/java/com/wjj/easy/easyandroidHelper/model/base/BaseResponseListInfo.java
  class BaseResponseListInfo (line 13) | public class BaseResponseListInfo<T extends Parcelable> extends BaseStat...
    method getData (line 19) | public ArrayList<T> getData() {
    method setData (line 23) | public void setData(ArrayList<T> data) {
    method toString (line 27) | @Override
    method describeContents (line 34) | @Override
    method writeToParcel (line 39) | @Override
    method BaseResponseListInfo (line 48) | public BaseResponseListInfo() {
    method BaseResponseListInfo (line 51) | protected BaseResponseListInfo(Parcel in) {
    method createFromParcel (line 62) | @Override
    method newArray (line 67) | @Override

FILE: app/src/main/java/com/wjj/easy/easyandroidHelper/model/base/BaseStatus.java
  class BaseStatus (line 10) | public class BaseStatus implements Parcelable {
    method getCode (line 17) | public int getCode() {
    method setCode (line 21) | public void setCode(int code) {
    method getMessage (line 25) | public String getMessage() {
    method setMessage (line 29) | public void setMessage(String message) {
    method isSuccess (line 33) | public boolean isSuccess() {
    method toString (line 37) | @Override
    method describeContents (line 46) | @Override
    method writeToParcel (line 51) | @Override
    method BaseStatus (line 57) | public BaseStatus() {
    method BaseStatus (line 60) | protected BaseStatus(Parcel in) {

FILE: app/src/main/java/com/wjj/easy/easyandroidHelper/module/login/LoginActivity.java
  class LoginActivity (line 23) | public class LoginActivity extends BaseActivity<LoginPresenter> implemen...
    method initInject (line 38) | @Override
    method initEventAndData (line 43) | @Override
    method getContentView (line 52) | @Override
    method onClick (line 58) | @OnClick({R.id.get_verify_code, R.id.tv_login})

FILE: app/src/main/java/com/wjj/easy/easyandroidHelper/module/login/LoginContract.java
  type LoginContract (line 11) | public interface LoginContract {
    type View (line 13) | interface View extends BaseView {
    type Presenter (line 16) | interface Presenter extends EasyBasePresenter<View> {
      method getVerifyCode (line 17) | void getVerifyCode(String userName, String pwd);
      method login (line 19) | void login(String userName, String pwd, String verifyCode);

FILE: app/src/main/java/com/wjj/easy/easyandroidHelper/module/login/LoginPresenter.java
  class LoginPresenter (line 16) | public class LoginPresenter extends BasePresenter<LoginContract.View> im...
    method LoginPresenter (line 23) | @Inject
    method getVerifyCode (line 27) | @Override
    method login (line 45) | @Override

FILE: app/src/main/java/com/wjj/easy/easyandroidHelper/module/login/domain/GetVerifyCodeTask.java
  class GetVerifyCodeTask (line 17) | public class GetVerifyCodeTask extends AbstractUseCase {
    method GetVerifyCodeTask (line 27) | @Inject
    method run (line 31) | @Override
    method setUserName (line 46) | public void setUserName(String userName) {
    method setPwd (line 50) | public void setPwd(String pwd) {

FILE: app/src/main/java/com/wjj/easy/easyandroidHelper/module/login/domain/LoginTask.java
  class LoginTask (line 17) | public class LoginTask extends AbstractUseCase {
    method LoginTask (line 28) | @Inject
    method run (line 32) | @Override
    method setUserName (line 47) | public void setUserName(String userName) {
    method setPwd (line 51) | public void setPwd(String pwd) {
    method setVerifyCode (line 55) | public void setVerifyCode(String verifyCode) {

FILE: app/src/main/java/com/wjj/easy/easyandroidHelper/module/main/HomeContract.java
  type HomeContract (line 10) | public interface HomeContract {
    type View (line 12) | interface View extends BaseView {
      method showList (line 13) | void showList(ListInfo list);
    type Presenter (line 16) | interface Presenter extends EasyBasePresenter<View> {
      method getList (line 17) | void getList(int index);

FILE: app/src/main/java/com/wjj/easy/easyandroidHelper/module/main/HomeFragment.java
  class HomeFragment (line 20) | public class HomeFragment extends BaseFragment<HomePresenter> implements...
    method getContentView (line 27) | @Override
    method initInject (line 32) | @Override
    method initEventAndData (line 37) | @Override
    method showList (line 53) | @Override

FILE: app/src/main/java/com/wjj/easy/easyandroidHelper/module/main/HomePresenter.java
  class HomePresenter (line 15) | public class HomePresenter extends BasePresenter<HomeContract.View> impl...
    method HomePresenter (line 20) | @Inject
    method getList (line 25) | @Override

FILE: app/src/main/java/com/wjj/easy/easyandroidHelper/module/main/MainActivity.java
  class MainActivity (line 25) | public class MainActivity extends SimpleActivity {
    method initEventAndData (line 39) | @Override
    method selectTab (line 76) | private void selectTab(TabLayout.Tab tab) {
    method unSelectTab (line 89) | private void unSelectTab(TabLayout.Tab tab) {
    method getContentView (line 102) | @Override
    class MainPageAdapter (line 107) | private class MainPageAdapter extends FragmentPagerAdapter {
      method MainPageAdapter (line 109) | public MainPageAdapter(FragmentManager fm) {
      method getItem (line 113) | @Override
      method getCount (line 118) | @Override

FILE: app/src/main/java/com/wjj/easy/easyandroidHelper/module/main/MyContract.java
  type MyContract (line 9) | public interface MyContract {
    type View (line 11) | interface View extends BaseView {
    type Presenter (line 14) | interface Presenter extends EasyBasePresenter<View> {

FILE: app/src/main/java/com/wjj/easy/easyandroidHelper/module/main/MyFragment.java
  class MyFragment (line 16) | public class MyFragment extends BaseFragment<MyPresenter> implements MyC...
    method getContentView (line 21) | @Override
    method initInject (line 26) | @Override
    method initEventAndData (line 31) | @Override

FILE: app/src/main/java/com/wjj/easy/easyandroidHelper/module/main/MyPresenter.java
  class MyPresenter (line 11) | public class MyPresenter extends BasePresenter<MyContract.View> implemen...
    method MyPresenter (line 13) | @Inject

FILE: app/src/main/java/com/wjj/easy/easyandroidHelper/module/main/adapter/HomeAdapter.java
  class HomeAdapter (line 22) | public class HomeAdapter extends BaseQuickAdapter<ListInfo.DataBean,Base...
    method HomeAdapter (line 27) | public HomeAdapter(int layoutResId, List<ListInfo.DataBean> data) {
    method HomeAdapter (line 31) | @Inject
    method convert (line 36) | @Override

FILE: app/src/main/java/com/wjj/easy/easyandroidHelper/module/main/domain/GetListTask.java
  class GetListTask (line 14) | public class GetListTask extends AbstractUseCase{
    method GetListTask (line 22) | @Inject
    method run (line 28) | @Override
    method setIndex (line 47) | public void setIndex(int index) {

FILE: app/src/main/java/com/wjj/easy/easyandroidHelper/utils/SecretUtils.java
  class SecretUtils (line 20) | public class SecretUtils {
    type SecroType (line 22) | public enum SecroType {
    method SecretUtils (line 42) | private SecretUtils() {
    method encryptByPublicKey (line 45) | public static String encryptByPublicKey(String data, String pubKey) {
    method decryptByPublicKey (line 78) | public static String decryptByPublicKey(String data, String pubKey) {
    method encryptByPublicKey (line 108) | public static byte[] encryptByPublicKey(byte[] data, byte[] publicKey) {
    method encryptByPrivateKey (line 135) | public static byte[] encryptByPrivateKey(byte[] data, byte[] privateKe...
    method decryptByPublicKey (line 160) | public static byte[] decryptByPublicKey(byte[] data, byte[] publicKey)...
    method decryptByPrivateKey (line 174) | public static byte[] decryptByPrivateKey(byte[] encrypted, byte[] priv...
    method encryptByPublicKeyForSpilt (line 191) | public static byte[] encryptByPublicKeyForSpilt(byte[] data, byte[] pu...
    method encryptByPrivateKeyForSpilt (line 237) | public static byte[] encryptByPrivateKeyForSpilt(byte[] data, byte[] p...
    method decryptByPublicKeyForSpilt (line 283) | public static byte[] decryptByPublicKeyForSpilt(byte[] encrypted, byte...
    method decryptByPrivateKeyForSpilt (line 348) | public static byte[] decryptByPrivateKeyForSpilt(byte[] encrypted, byt...

FILE: app/src/main/java/com/wjj/easy/easyandroidHelper/widget/dialog/BaseDialog.java
  class BaseDialog (line 19) | public abstract class BaseDialog extends Dialog {
    method BaseDialog (line 38) | public BaseDialog(Context context) {
    method BaseDialog (line 42) | public BaseDialog(Context context, int theme) {
    method onCreate (line 46) | @Override
    method setWindow (line 58) | protected void setWindow(int x, int y) {
    method shouldSetWindow (line 75) | public void shouldSetWindow(boolean shouldSetWindow) {
    method getContentView (line 79) | protected abstract int getContentView();
    method init (line 81) | protected abstract void init();

FILE: app/src/main/java/com/wjj/easy/easyandroidHelper/widget/dialog/DialogLoading.java
  class DialogLoading (line 15) | public class DialogLoading extends BaseDialog {
    method DialogLoading (line 20) | public DialogLoading(Context context) {
    method DialogLoading (line 24) | public DialogLoading(Context context, boolean shouldSetWindow) {
    method getContentView (line 32) | @Override
    method init (line 37) | @Override
    method setText (line 42) | public void setText(String text) {

FILE: easyandroid/src/main/java/com/wjj/easy/easyandroid/http/Http.java
  class Http (line 26) | public class Http {
    method Http (line 34) | public Http(HttpBuilder builder) {
    method configOKHttp (line 40) | private void configOKHttp() {
    method configRetrofit (line 56) | private void configRetrofit() {
    type HttpCallback (line 69) | public interface HttpCallback<T> {
      method onResponse (line 75) | void onResponse(T t);
      method onFailure (line 82) | void onFailure(Throwable t);
    class CallbackDefault (line 91) | public static class CallbackDefault<T> implements Callback<T> {
      method CallbackDefault (line 95) | public CallbackDefault(HttpCallback<T> httpCallback) {
      method onResponse (line 99) | @Override
      method onFailure (line 104) | @Override
    class HttpBuilder (line 113) | public static final class HttpBuilder {
      method setBaseUrl (line 119) | public HttpBuilder setBaseUrl(String baseUrl) {
      method setCookieJar (line 124) | public HttpBuilder setCookieJar(ClearableCookieJar cookieJar) {
      method setTimeout (line 129) | public HttpBuilder setTimeout(long timeout) {
      method addInterceptor (line 134) | public HttpBuilder addInterceptor(Interceptor interceptor) {
      method build (line 139) | public Http build() {
    method getRetrofit (line 144) | public Retrofit getRetrofit() {
    method getClient (line 148) | public OkHttpClient getClient() {

FILE: easyandroid/src/main/java/com/wjj/easy/easyandroid/mvp/EasyBasePresenter.java
  type EasyBasePresenter (line 8) | public interface EasyBasePresenter<V extends EasyBaseView> {
    method start (line 9) | void start();
    method attachView (line 10) | void attachView(V view);

FILE: easyandroid/src/main/java/com/wjj/easy/easyandroid/mvp/EasyBasePresenterFrg.java
  type EasyBasePresenterFrg (line 8) | public interface EasyBasePresenterFrg extends EasyBasePresenter {
    method setupListeners (line 9) | void setupListeners();

FILE: easyandroid/src/main/java/com/wjj/easy/easyandroid/mvp/EasyBaseView.java
  type EasyBaseView (line 8) | public interface EasyBaseView {

FILE: easyandroid/src/main/java/com/wjj/easy/easyandroid/mvp/EasyBaseViewFrg.java
  type EasyBaseViewFrg (line 8) | public interface EasyBaseViewFrg extends EasyBaseView {

FILE: easyandroid/src/main/java/com/wjj/easy/easyandroid/mvp/di/components/ActivityComponent.java
  type ActivityComponent (line 15) | @ActivityScope
    method getActivity (line 24) | Activity getActivity();

FILE: easyandroid/src/main/java/com/wjj/easy/easyandroid/mvp/di/components/AppComponent.java
  type AppComponent (line 17) | @ApplicationScope
    method getContext (line 21) | Context getContext();

FILE: easyandroid/src/main/java/com/wjj/easy/easyandroid/mvp/di/components/FragmentComponent.java
  type FragmentComponent (line 16) | @FragmentScope
    method getActivity (line 26) | Activity getActivity();

FILE: easyandroid/src/main/java/com/wjj/easy/easyandroid/mvp/di/modules/ActivityModule.java
  class ActivityModule (line 15) | @Module
    method ActivityModule (line 20) | public ActivityModule(Activity activity) {
    method provideActivity (line 30) | @Provides

FILE: easyandroid/src/main/java/com/wjj/easy/easyandroid/mvp/di/modules/AppModule.java
  class AppModule (line 17) | @Module
    method AppModule (line 22) | public AppModule(Context context) {
    method provideContext (line 26) | @ApplicationScope

FILE: easyandroid/src/main/java/com/wjj/easy/easyandroid/mvp/di/modules/FragmentModule.java
  class FragmentModule (line 16) | @Module
    method FragmentModule (line 20) | public FragmentModule(Fragment fragment) {
    method provideActivity (line 36) | @Provides

FILE: easyandroid/src/main/java/com/wjj/easy/easyandroid/mvp/domain/executor/Executor.java
  type Executor (line 12) | public interface Executor {
    method execute (line 20) | void execute(final AbstractUseCase interactor);

FILE: easyandroid/src/main/java/com/wjj/easy/easyandroid/mvp/domain/executor/MainThread.java
  type MainThread (line 8) | public interface MainThread {
    method post (line 16) | void post(final Runnable runnable);

FILE: easyandroid/src/main/java/com/wjj/easy/easyandroid/mvp/domain/executor/impl/MainThreadImpl.java
  class MainThreadImpl (line 15) | public class MainThreadImpl implements MainThread {
    method MainThreadImpl (line 21) | private MainThreadImpl() {
    method post (line 25) | @Override
    method getInstance (line 30) | public static MainThread getInstance() {

FILE: easyandroid/src/main/java/com/wjj/easy/easyandroid/mvp/domain/executor/impl/ThreadExecutor.java
  class ThreadExecutor (line 19) | public class ThreadExecutor implements Executor {
    method ThreadExecutor (line 32) | private ThreadExecutor() {
    method execute (line 42) | @Override
    method getInstance (line 60) | public static Executor getInstance() {

FILE: easyandroid/src/main/java/com/wjj/easy/easyandroid/mvp/domain/usecases/AbstractUseCase.java
  class AbstractUseCase (line 16) | public abstract class AbstractUseCase implements UseCase {
    method run (line 34) | public abstract void run();
    method cancel (line 39) | public void cancel() {
    method isRunning (line 49) | public boolean isRunning() {
    method onFinished (line 56) | public void onFinished() {
    method execute (line 64) | public void execute() {
    method setCallback (line 74) | public void setCallback(Callback callback) {
    method getCallback (line 83) | public Callback getCallback() {

FILE: easyandroid/src/main/java/com/wjj/easy/easyandroid/mvp/domain/usecases/UseCase.java
  type UseCase (line 9) | public interface UseCase {
    method execute (line 15) | void execute();
    type Callback (line 20) | interface Callback<T> {
      method success (line 21) | void success(T t);
      method fail (line 23) | void fail();

FILE: easyandroid/src/main/java/com/wjj/easy/easyandroid/ui/EasyActivity.java
  class EasyActivity (line 16) | public abstract class EasyActivity extends AppCompatActivity implements ...
    method onCreate (line 21) | @Override
    method onStart (line 27) | @Override
    method onRestart (line 35) | @Override
    method onResume (line 43) | @Override
    method onStop (line 51) | @Override
    method onDestroy (line 59) | @Override
    method getContentView (line 67) | protected abstract int getContentView();

FILE: easyandroid/src/main/java/com/wjj/easy/easyandroid/ui/EasyFragment.java
  class EasyFragment (line 21) | public abstract class EasyFragment extends Fragment implements EasyBaseV...
    method onCreateView (line 26) | @Nullable
    method init (line 35) | protected abstract void init(View view);
    method initView (line 37) | protected abstract void initView(View view);
    method onStart (line 39) | @Override
    method onResume (line 47) | @Override
    method onPause (line 55) | @Override
    method onStop (line 63) | @Override
    method onDestroy (line 71) | @Override
    method getContentView (line 79) | protected abstract int getContentView();
Condensed preview — 106 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (160K 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/compiler.xml",
    "chars": 686,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"CompilerConfiguration\">\n    <resourceExt"
  },
  {
    "path": ".idea/copyright/profiles_settings.xml",
    "chars": 74,
    "preview": "<component name=\"CopyrightManager\">\n  <settings default=\"\" />\n</component>"
  },
  {
    "path": ".idea/encodings.xml",
    "chars": 159,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"Encoding\">\n    <file url=\"PROJECT\" chars"
  },
  {
    "path": ".idea/gradle.xml",
    "chars": 683,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"GradleSettings\">\n    <option name=\"linke"
  },
  {
    "path": ".idea/misc.xml",
    "chars": 2644,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"EntryPointsManager\">\n    <entry_points v"
  },
  {
    "path": ".idea/modules.xml",
    "chars": 488,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"ProjectModuleManager\">\n    <modules>\n   "
  },
  {
    "path": ".idea/runConfigurations.xml",
    "chars": 564,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"RunConfigurationProducerService\">\n    <o"
  },
  {
    "path": ".idea/vcs.xml",
    "chars": 180,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"VcsDirectoryMappings\">\n    <mapping dire"
  },
  {
    "path": "README.md",
    "chars": 723,
    "preview": "最新版RxEasyAndroid 支持RxJava2 可移步到 https://github.com/wu928320442/RxEasyAndroid\n\n----------------本版本为非RxJava2版本------------"
  },
  {
    "path": "app/.gitignore",
    "chars": 7,
    "preview": "/build\n"
  },
  {
    "path": "app/build.gradle",
    "chars": 956,
    "preview": "apply plugin: 'com.android.application'\napply plugin: 'com.jakewharton.butterknife'\n\nandroid {\n    compileSdkVersion roo"
  },
  {
    "path": "app/proguard-rules.pro",
    "chars": 3636,
    "preview": "# Add project specific ProGuard rules here.\n# By default, the flags in this file are appended to flags specified\n# in /U"
  },
  {
    "path": "app/src/main/AndroidManifest.xml",
    "chars": 852,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    package="
  },
  {
    "path": "app/src/main/java/com/wjj/easy/easyandroidHelper/AppApplication.java",
    "chars": 681,
    "preview": "package com.wjj.easy.easyandroidHelper;\n\nimport android.app.Application;\n\nimport com.wjj.easy.easyandroidHelper.common.d"
  },
  {
    "path": "app/src/main/java/com/wjj/easy/easyandroidHelper/common/base/BaseActivity.java",
    "chars": 2049,
    "preview": "package com.wjj.easy.easyandroidHelper.common.base;\n\nimport android.os.Bundle;\nimport android.support.annotation.Nullabl"
  },
  {
    "path": "app/src/main/java/com/wjj/easy/easyandroidHelper/common/base/BaseFragment.java",
    "chars": 2136,
    "preview": "package com.wjj.easy.easyandroidHelper.common.base;\n\nimport android.view.View;\n\nimport com.blankj.utilcode.util.ToastUti"
  },
  {
    "path": "app/src/main/java/com/wjj/easy/easyandroidHelper/common/base/BasePresenter.java",
    "chars": 971,
    "preview": "package com.wjj.easy.easyandroidHelper.common.base;\n\nimport com.wjj.easy.easyandroid.mvp.EasyBasePresenter;\nimport com.w"
  },
  {
    "path": "app/src/main/java/com/wjj/easy/easyandroidHelper/common/base/BaseView.java",
    "chars": 350,
    "preview": "package com.wjj.easy.easyandroidHelper.common.base;\n\nimport com.wjj.easy.easyandroid.mvp.EasyBasePresenter;\nimport com.w"
  },
  {
    "path": "app/src/main/java/com/wjj/easy/easyandroidHelper/common/base/SimpleActivity.java",
    "chars": 1038,
    "preview": "package com.wjj.easy.easyandroidHelper.common.base;\n\nimport android.os.Bundle;\nimport android.support.annotation.Nullabl"
  },
  {
    "path": "app/src/main/java/com/wjj/easy/easyandroidHelper/common/base/SimpleFragment.java",
    "chars": 1009,
    "preview": "package com.wjj.easy.easyandroidHelper.common.base;\n\nimport android.view.View;\n\nimport com.blankj.utilcode.util.ToastUti"
  },
  {
    "path": "app/src/main/java/com/wjj/easy/easyandroidHelper/common/di/ActivityCommonComponent.java",
    "chars": 699,
    "preview": "package com.wjj.easy.easyandroidHelper.common.di;\n\nimport com.wjj.easy.easyandroid.mvp.di.components.ActivityComponent;\n"
  },
  {
    "path": "app/src/main/java/com/wjj/easy/easyandroidHelper/common/di/AppCommonComponent.java",
    "chars": 659,
    "preview": "package com.wjj.easy.easyandroidHelper.common.di;\n\nimport com.wjj.easy.easyandroid.mvp.di.components.AppComponent;\nimpor"
  },
  {
    "path": "app/src/main/java/com/wjj/easy/easyandroidHelper/common/di/AppCommonModule.java",
    "chars": 2633,
    "preview": "package com.wjj.easy.easyandroidHelper.common.di;\n\nimport android.content.Context;\n\nimport com.blankj.utilcode.util.Util"
  },
  {
    "path": "app/src/main/java/com/wjj/easy/easyandroidHelper/common/di/FragmentCommonComponent.java",
    "chars": 695,
    "preview": "package com.wjj.easy.easyandroidHelper.common.di;\n\nimport com.wjj.easy.easyandroid.mvp.di.components.FragmentComponent;\n"
  },
  {
    "path": "app/src/main/java/com/wjj/easy/easyandroidHelper/common/net/ApiService.java",
    "chars": 1162,
    "preview": "package com.wjj.easy.easyandroidHelper.common.net;\n\nimport com.wjj.easy.easyandroidHelper.model.ListInfo;\nimport com.wjj"
  },
  {
    "path": "app/src/main/java/com/wjj/easy/easyandroidHelper/common/net/AppHttp.java",
    "chars": 1319,
    "preview": "package com.wjj.easy.easyandroidHelper.common.net;\n\nimport com.wjj.easy.easyandroid.http.Http;\nimport com.wjj.easy.easya"
  },
  {
    "path": "app/src/main/java/com/wjj/easy/easyandroidHelper/common/net/CookieHead.java",
    "chars": 475,
    "preview": "package com.wjj.easy.easyandroidHelper.common.net;\n\n/**\n * Created by wujiajun on 17/4/11.\n */\n\npublic enum CookieHead {"
  },
  {
    "path": "app/src/main/java/com/wjj/easy/easyandroidHelper/common/net/CookieInterceptor.java",
    "chars": 719,
    "preview": "package com.wjj.easy.easyandroidHelper.common.net;\n\nimport java.io.IOException;\n\nimport okhttp3.Interceptor;\nimport okht"
  },
  {
    "path": "app/src/main/java/com/wjj/easy/easyandroidHelper/model/ListInfo.java",
    "chars": 9772,
    "preview": "package com.wjj.easy.easyandroidHelper.model;\n\nimport android.os.Parcel;\nimport android.os.Parcelable;\n\nimport java.util"
  },
  {
    "path": "app/src/main/java/com/wjj/easy/easyandroidHelper/model/LoginInfo.java",
    "chars": 1559,
    "preview": "package com.wjj.easy.easyandroidHelper.model;\n\nimport android.os.Parcel;\nimport android.os.Parcelable;\n\n/**\n * Created b"
  },
  {
    "path": "app/src/main/java/com/wjj/easy/easyandroidHelper/model/LoginResponse.java",
    "chars": 229,
    "preview": "package com.wjj.easy.easyandroidHelper.model;\n\n\nimport com.wjj.easy.easyandroidHelper.model.base.BaseResponseInfo;\n\n/**\n"
  },
  {
    "path": "app/src/main/java/com/wjj/easy/easyandroidHelper/model/base/BaseChartInfo.java",
    "chars": 2782,
    "preview": "package com.wjj.easy.easyandroidHelper.model.base;\n\nimport android.os.Parcel;\nimport android.os.Parcelable;\n\n/**\n * Crea"
  },
  {
    "path": "app/src/main/java/com/wjj/easy/easyandroidHelper/model/base/BaseChartListInfo.java",
    "chars": 3010,
    "preview": "package com.wjj.easy.easyandroidHelper.model.base;\n\nimport android.os.Bundle;\nimport android.os.Parcel;\nimport android.o"
  },
  {
    "path": "app/src/main/java/com/wjj/easy/easyandroidHelper/model/base/BaseResponseInfo.java",
    "chars": 1553,
    "preview": "package com.wjj.easy.easyandroidHelper.model.base;\n\nimport android.os.Parcel;\nimport android.os.Parcelable;\n\n/**\n * Crea"
  },
  {
    "path": "app/src/main/java/com/wjj/easy/easyandroidHelper/model/base/BaseResponseListInfo.java",
    "chars": 1763,
    "preview": "package com.wjj.easy.easyandroidHelper.model.base;\n\nimport android.os.Bundle;\nimport android.os.Parcel;\nimport android.o"
  },
  {
    "path": "app/src/main/java/com/wjj/easy/easyandroidHelper/model/base/BaseStatus.java",
    "chars": 1227,
    "preview": "package com.wjj.easy.easyandroidHelper.model.base;\n\nimport android.os.Parcel;\nimport android.os.Parcelable;\n\n/**\n * Crea"
  },
  {
    "path": "app/src/main/java/com/wjj/easy/easyandroidHelper/module/login/LoginActivity.java",
    "chars": 2116,
    "preview": "package com.wjj.easy.easyandroidHelper.module.login;\n\nimport android.content.Intent;\nimport android.support.v4.content.C"
  },
  {
    "path": "app/src/main/java/com/wjj/easy/easyandroidHelper/module/login/LoginContract.java",
    "chars": 501,
    "preview": "package com.wjj.easy.easyandroidHelper.module.login;\n\nimport com.wjj.easy.easyandroid.mvp.EasyBasePresenter;\nimport com."
  },
  {
    "path": "app/src/main/java/com/wjj/easy/easyandroidHelper/module/login/LoginPresenter.java",
    "chars": 2029,
    "preview": "package com.wjj.easy.easyandroidHelper.module.login;\n\nimport com.wjj.easy.easyandroid.mvp.domain.usecases.UseCase;\nimpor"
  },
  {
    "path": "app/src/main/java/com/wjj/easy/easyandroidHelper/module/login/domain/GetVerifyCodeTask.java",
    "chars": 1246,
    "preview": "package com.wjj.easy.easyandroidHelper.module.login.domain;\n\nimport com.wjj.easy.easyandroid.http.Http;\nimport com.wjj.e"
  },
  {
    "path": "app/src/main/java/com/wjj/easy/easyandroidHelper/module/login/domain/LoginTask.java",
    "chars": 1354,
    "preview": "package com.wjj.easy.easyandroidHelper.module.login.domain;\n\nimport com.wjj.easy.easyandroid.http.Http;\nimport com.wjj.e"
  },
  {
    "path": "app/src/main/java/com/wjj/easy/easyandroidHelper/module/main/HomeContract.java",
    "chars": 481,
    "preview": "package com.wjj.easy.easyandroidHelper.module.main;\n\nimport com.wjj.easy.easyandroid.mvp.EasyBasePresenter;\nimport com.w"
  },
  {
    "path": "app/src/main/java/com/wjj/easy/easyandroidHelper/module/main/HomeFragment.java",
    "chars": 1672,
    "preview": "package com.wjj.easy.easyandroidHelper.module.main;\n\nimport android.support.v7.widget.DefaultItemAnimator;\nimport androi"
  },
  {
    "path": "app/src/main/java/com/wjj/easy/easyandroidHelper/module/main/HomePresenter.java",
    "chars": 1077,
    "preview": "package com.wjj.easy.easyandroidHelper.module.main;\n\nimport com.wjj.easy.easyandroid.mvp.domain.executor.Executor;\nimpor"
  },
  {
    "path": "app/src/main/java/com/wjj/easy/easyandroidHelper/module/main/MainActivity.java",
    "chars": 3946,
    "preview": "package com.wjj.easy.easyandroidHelper.module.main;\n\nimport android.support.design.widget.TabLayout;\nimport android.supp"
  },
  {
    "path": "app/src/main/java/com/wjj/easy/easyandroidHelper/module/main/MyContract.java",
    "chars": 354,
    "preview": "package com.wjj.easy.easyandroidHelper.module.main;\n\nimport com.wjj.easy.easyandroid.mvp.EasyBasePresenter;\nimport com.w"
  },
  {
    "path": "app/src/main/java/com/wjj/easy/easyandroidHelper/module/main/MyFragment.java",
    "chars": 873,
    "preview": "package com.wjj.easy.easyandroidHelper.module.main;\n\nimport android.net.Uri;\n\nimport com.facebook.drawee.view.SimpleDraw"
  },
  {
    "path": "app/src/main/java/com/wjj/easy/easyandroidHelper/module/main/MyPresenter.java",
    "chars": 338,
    "preview": "package com.wjj.easy.easyandroidHelper.module.main;\n\nimport com.wjj.easy.easyandroidHelper.common.base.BasePresenter;\n\ni"
  },
  {
    "path": "app/src/main/java/com/wjj/easy/easyandroidHelper/module/main/adapter/HomeAdapter.java",
    "chars": 3311,
    "preview": "package com.wjj.easy.easyandroidHelper.module.main.adapter;\n\nimport android.graphics.drawable.Drawable;\nimport android.v"
  },
  {
    "path": "app/src/main/java/com/wjj/easy/easyandroidHelper/module/main/domain/GetListTask.java",
    "chars": 974,
    "preview": "package com.wjj.easy.easyandroidHelper.module.main.domain;\n\nimport com.wjj.easy.easyandroid.http.Http;\nimport com.wjj.ea"
  },
  {
    "path": "app/src/main/java/com/wjj/easy/easyandroidHelper/utils/SecretUtils.java",
    "chars": 13876,
    "preview": "package com.wjj.easy.easyandroidHelper.utils;\n\nimport android.util.Base64;\n\nimport java.security.KeyFactory;\nimport java"
  },
  {
    "path": "app/src/main/java/com/wjj/easy/easyandroidHelper/widget/dialog/BaseDialog.java",
    "chars": 2012,
    "preview": "package com.wjj.easy.easyandroidHelper.widget.dialog;\n\nimport android.app.Dialog;\nimport android.content.Context;\nimport"
  },
  {
    "path": "app/src/main/java/com/wjj/easy/easyandroidHelper/widget/dialog/DialogLoading.java",
    "chars": 939,
    "preview": "package com.wjj.easy.easyandroidHelper.widget.dialog;\n\nimport android.content.Context;\nimport android.widget.TextView;\n\n"
  },
  {
    "path": "app/src/main/res/anim/roll_down.xml",
    "chars": 298,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<set xmlns:android=\"http://schemas.android.com/apk/res/android\">\n\n    <translate\n"
  },
  {
    "path": "app/src/main/res/anim/roll_up.xml",
    "chars": 298,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<set xmlns:android=\"http://schemas.android.com/apk/res/android\">\n\n    <translate\n"
  },
  {
    "path": "app/src/main/res/anim/slide_in_bottom.xml",
    "chars": 477,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<set xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:inter"
  },
  {
    "path": "app/src/main/res/anim/slide_out_bottom.xml",
    "chars": 403,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<set xmlns:android=\"http://schemas.android.com/apk/res/android\" >\n\n    <translate"
  },
  {
    "path": "app/src/main/res/drawable/bg_color_white_corners_10.xml",
    "chars": 272,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<shape xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:dit"
  },
  {
    "path": "app/src/main/res/layout/activity_login.xml",
    "chars": 2235,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    andr"
  },
  {
    "path": "app/src/main/res/layout/activity_main.xml",
    "chars": 1310,
    "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/dialog_loading.xml",
    "chars": 842,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    andr"
  },
  {
    "path": "app/src/main/res/layout/fragment_home.xml",
    "chars": 459,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    andr"
  },
  {
    "path": "app/src/main/res/layout/fragment_my.xml",
    "chars": 561,
    "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/layout/home_list_item.xml",
    "chars": 4010,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    andr"
  },
  {
    "path": "app/src/main/res/layout/view_main_tab.xml",
    "chars": 860,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    an"
  },
  {
    "path": "app/src/main/res/values/colors.xml",
    "chars": 425,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <color name=\"colorPrimary\">#00bcd4</color>\n    <color name=\"color"
  },
  {
    "path": "app/src/main/res/values/dimens.xml",
    "chars": 5690,
    "preview": "<resources>\n    <!-- Default screen margins, per the Android Design guidelines. -->\n    <dimen name=\"activity_horizontal"
  },
  {
    "path": "app/src/main/res/values/strings.xml",
    "chars": 199,
    "preview": "<resources>\n    <string name=\"app_name\">EasyAndroid</string>\n    <string name=\"home_tab\">首页</string>\n    <string name=\"m"
  },
  {
    "path": "app/src/main/res/values/styles.xml",
    "chars": 1928,
    "preview": "<resources>\n\n    <!-- Base application theme. -->\n    <style name=\"AppTheme\" parent=\"Theme.AppCompat.Light.NoActionBar\">"
  },
  {
    "path": "app/src/main/res/values-v21/styles.xml",
    "chars": 279,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n\n    <style name=\"AppTheme_1\" parent=\"Theme.AppCompat.Light.NoActionB"
  },
  {
    "path": "app/src/main/res/values-w820dp/dimens.xml",
    "chars": 358,
    "preview": "<resources>\n    <!-- Example customization of dimensions originally defined in res/values/dimens.xml\n         (such as s"
  },
  {
    "path": "build.gradle",
    "chars": 1429,
    "preview": "// Top-level build file where you can add configuration options common to all sub-projects/modules.\n\nbuildscript {\n    r"
  },
  {
    "path": "easyandroid/.gitignore",
    "chars": 7,
    "preview": "/build\n"
  },
  {
    "path": "easyandroid/build.gradle",
    "chars": 2864,
    "preview": "apply plugin: 'com.android.library'\napply plugin: 'com.neenbedankt.android-apt'\n\nandroid {\n    compileSdkVersion rootPro"
  },
  {
    "path": "easyandroid/proguard-rules.pro",
    "chars": 924,
    "preview": "# Add project specific ProGuard rules here.\n# By default, the flags in this file are appended to flags specified\n# in /U"
  },
  {
    "path": "easyandroid/src/main/AndroidManifest.xml",
    "chars": 256,
    "preview": "<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    package=\"com.wjj.easy.easyandroid\">\n\n    <appli"
  },
  {
    "path": "easyandroid/src/main/java/com/wjj/easy/easyandroid/http/Http.java",
    "chars": 3787,
    "preview": "package com.wjj.easy.easyandroid.http;\n\nimport com.franmontiel.persistentcookiejar.ClearableCookieJar;\nimport com.wjj.ea"
  },
  {
    "path": "easyandroid/src/main/java/com/wjj/easy/easyandroid/mvp/EasyBasePresenter.java",
    "chars": 231,
    "preview": "package com.wjj.easy.easyandroid.mvp;\n\n/**\n * MVP Presenter层基类\n * 适用范围:在Activity使用\n * Created by wujiajun on 17/4/6.\n */"
  },
  {
    "path": "easyandroid/src/main/java/com/wjj/easy/easyandroid/mvp/EasyBasePresenterFrg.java",
    "chars": 217,
    "preview": "package com.wjj.easy.easyandroid.mvp;\n\n/**\n * MVP Presenter层基类\n * 适用范围:Fragment中使用\n * Created by wujiajun on 17/4/13.\n *"
  },
  {
    "path": "easyandroid/src/main/java/com/wjj/easy/easyandroid/mvp/EasyBaseView.java",
    "chars": 151,
    "preview": "package com.wjj.easy.easyandroid.mvp;\n\n/**\n * MVP View层基类\n * 适用范围:在Activity使用\n * Created by wujiajun on 17/4/6.\n */\npubl"
  },
  {
    "path": "easyandroid/src/main/java/com/wjj/easy/easyandroid/mvp/EasyBaseViewFrg.java",
    "chars": 213,
    "preview": "package com.wjj.easy.easyandroid.mvp;\n\n/**\n * MVP View层基类\n * 适用范围:在Fragment使用\n * Created by wujiajun on 17/4/13.\n */\npub"
  },
  {
    "path": "easyandroid/src/main/java/com/wjj/easy/easyandroid/mvp/di/components/ActivityComponent.java",
    "chars": 512,
    "preview": "package com.wjj.easy.easyandroid.mvp.di.components;\n\nimport android.app.Activity;\n\nimport com.wjj.easy.easyandroid.mvp.d"
  },
  {
    "path": "easyandroid/src/main/java/com/wjj/easy/easyandroid/mvp/di/components/AppComponent.java",
    "chars": 437,
    "preview": "package com.wjj.easy.easyandroid.mvp.di.components;\n\nimport android.content.Context;\n\nimport com.wjj.easy.easyandroid.mv"
  },
  {
    "path": "easyandroid/src/main/java/com/wjj/easy/easyandroid/mvp/di/components/FragmentComponent.java",
    "chars": 546,
    "preview": "package com.wjj.easy.easyandroid.mvp.di.components;\n\nimport android.app.Activity;\nimport android.support.v4.app.Fragment"
  },
  {
    "path": "easyandroid/src/main/java/com/wjj/easy/easyandroid/mvp/di/modules/ActivityModule.java",
    "chars": 648,
    "preview": "package com.wjj.easy.easyandroid.mvp.di.modules;\n\nimport android.app.Activity;\n\nimport com.wjj.easy.easyandroid.mvp.di.s"
  },
  {
    "path": "easyandroid/src/main/java/com/wjj/easy/easyandroid/mvp/di/modules/AppModule.java",
    "chars": 526,
    "preview": "package com.wjj.easy.easyandroid.mvp.di.modules;\n\nimport android.content.Context;\n\nimport com.wjj.easy.easyandroid.mvp.d"
  },
  {
    "path": "easyandroid/src/main/java/com/wjj/easy/easyandroid/mvp/di/modules/FragmentModule.java",
    "chars": 813,
    "preview": "package com.wjj.easy.easyandroid.mvp.di.modules;\n\nimport android.app.Activity;\nimport android.support.v4.app.Fragment;\n\n"
  },
  {
    "path": "easyandroid/src/main/java/com/wjj/easy/easyandroid/mvp/di/scopes/ActivityScope.java",
    "chars": 305,
    "preview": "package com.wjj.easy.easyandroid.mvp.di.scopes;\n\nimport java.lang.annotation.Retention;\nimport java.lang.annotation.Rete"
  },
  {
    "path": "easyandroid/src/main/java/com/wjj/easy/easyandroid/mvp/di/scopes/ApplicationScope.java",
    "chars": 311,
    "preview": "package com.wjj.easy.easyandroid.mvp.di.scopes;\n\nimport java.lang.annotation.Retention;\nimport java.lang.annotation.Rete"
  },
  {
    "path": "easyandroid/src/main/java/com/wjj/easy/easyandroid/mvp/di/scopes/FragmentScope.java",
    "chars": 305,
    "preview": "package com.wjj.easy.easyandroid.mvp.di.scopes;\n\nimport java.lang.annotation.Retention;\nimport java.lang.annotation.Rete"
  },
  {
    "path": "easyandroid/src/main/java/com/wjj/easy/easyandroid/mvp/domain/executor/Executor.java",
    "chars": 392,
    "preview": "package com.wjj.easy.easyandroid.mvp.domain.executor;\n\n\nimport com.wjj.easy.easyandroid.mvp.domain.usecases.AbstractUseC"
  },
  {
    "path": "easyandroid/src/main/java/com/wjj/easy/easyandroid/mvp/domain/executor/MainThread.java",
    "chars": 335,
    "preview": "package com.wjj.easy.easyandroid.mvp.domain.executor;\n\n/**\n * MainThread定义了一个能够在主线程使用用例执行的接口\n * 举个例子:如果一个用例需要显示一个对象到UI上,"
  },
  {
    "path": "easyandroid/src/main/java/com/wjj/easy/easyandroid/mvp/domain/executor/impl/MainThreadImpl.java",
    "chars": 748,
    "preview": "package com.wjj.easy.easyandroid.mvp.domain.executor.impl;\n\nimport android.os.Handler;\nimport android.os.Looper;\n\nimport"
  },
  {
    "path": "easyandroid/src/main/java/com/wjj/easy/easyandroid/mvp/domain/executor/impl/ThreadExecutor.java",
    "chars": 1818,
    "preview": "package com.wjj.easy.easyandroid.mvp.domain.executor.impl;\n\n\nimport com.wjj.easy.easyandroid.mvp.domain.executor.Executo"
  },
  {
    "path": "easyandroid/src/main/java/com/wjj/easy/easyandroid/mvp/domain/usecases/AbstractUseCase.java",
    "chars": 1566,
    "preview": "package com.wjj.easy.easyandroid.mvp.domain.usecases;\n\n\nimport com.wjj.easy.easyandroid.mvp.domain.executor.Executor;\nim"
  },
  {
    "path": "easyandroid/src/main/java/com/wjj/easy/easyandroid/mvp/domain/usecases/UseCase.java",
    "chars": 328,
    "preview": "package com.wjj.easy.easyandroid.mvp.domain.usecases;\n\n\n/**\n * Domain层中UseCase抽象接口\n *\n * @author wujiajun\n */\npublic int"
  },
  {
    "path": "easyandroid/src/main/java/com/wjj/easy/easyandroid/ui/EasyActivity.java",
    "chars": 1546,
    "preview": "package com.wjj.easy.easyandroid.ui;\n\nimport android.os.Bundle;\nimport android.support.annotation.Nullable;\nimport andro"
  },
  {
    "path": "easyandroid/src/main/java/com/wjj/easy/easyandroid/ui/EasyFragment.java",
    "chars": 1868,
    "preview": "package com.wjj.easy.easyandroid.ui;\n\nimport android.os.Bundle;\nimport android.support.annotation.Nullable;\nimport andro"
  },
  {
    "path": "easyandroid/src/main/res/values/strings.xml",
    "chars": 73,
    "preview": "<resources>\n    <string name=\"app_name\">androidlib</string>\n</resources>\n"
  },
  {
    "path": "gradle/wrapper/gradle-wrapper.properties",
    "chars": 233,
    "preview": "#Mon Dec 28 10:00:20 PST 2015\ndistributionBase=GRADLE_USER_HOME\ndistributionPath=wrapper/dists\nzipStoreBase=GRADLE_USER_"
  },
  {
    "path": "gradle.properties",
    "chars": 730,
    "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": 2404,
    "preview": "@if \"%DEBUG%\" == \"\" @echo off\r\n@rem ##########################################################################\r\n@rem\r\n@r"
  },
  {
    "path": "settings.gradle",
    "chars": 31,
    "preview": "include ':app', ':easyandroid'\n"
  }
]

// ... and 1 more files (download for full content)

About this extraction

This page contains the full source code of the wu928320442/EasyAndroid GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 106 files (136.5 KB), approximately 38.3k tokens, and a symbol index with 385 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!