[
  {
    "path": ".gitignore",
    "content": "*.iml\n.gradle\n/local.properties\n/.idea/workspace.xml\n/.idea/libraries\n.DS_Store\n/build\n/captures\n.externalNativeBuild\n"
  },
  {
    "path": ".idea/compiler.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"CompilerConfiguration\">\n    <resourceExtensions />\n    <wildcardResourcePatterns>\n      <entry name=\"!?*.java\" />\n      <entry name=\"!?*.form\" />\n      <entry name=\"!?*.class\" />\n      <entry name=\"!?*.groovy\" />\n      <entry name=\"!?*.scala\" />\n      <entry name=\"!?*.flex\" />\n      <entry name=\"!?*.kt\" />\n      <entry name=\"!?*.clj\" />\n      <entry name=\"!?*.aj\" />\n    </wildcardResourcePatterns>\n    <annotationProcessing>\n      <profile default=\"true\" name=\"Default\" enabled=\"false\">\n        <processorPath useClasspath=\"true\" />\n      </profile>\n    </annotationProcessing>\n  </component>\n</project>"
  },
  {
    "path": ".idea/copyright/profiles_settings.xml",
    "content": "<component name=\"CopyrightManager\">\n  <settings default=\"\" />\n</component>"
  },
  {
    "path": ".idea/encodings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"Encoding\">\n    <file url=\"PROJECT\" charset=\"UTF-8\" />\n  </component>\n</project>"
  },
  {
    "path": ".idea/gradle.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"GradleSettings\">\n    <option name=\"linkedExternalProjectsSettings\">\n      <GradleProjectSettings>\n        <option name=\"distributionType\" value=\"DEFAULT_WRAPPED\" />\n        <option name=\"externalProjectPath\" value=\"$PROJECT_DIR$\" />\n        <option name=\"modules\">\n          <set>\n            <option value=\"$PROJECT_DIR$\" />\n            <option value=\"$PROJECT_DIR$/app\" />\n            <option value=\"$PROJECT_DIR$/easyandroid\" />\n          </set>\n        </option>\n        <option name=\"resolveModulePerSourceSet\" value=\"false\" />\n      </GradleProjectSettings>\n    </option>\n  </component>\n</project>"
  },
  {
    "path": ".idea/misc.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"EntryPointsManager\">\n    <entry_points version=\"2.0\" />\n  </component>\n  <component name=\"NullableNotNullManager\">\n    <option name=\"myDefaultNullable\" value=\"android.support.annotation.Nullable\" />\n    <option name=\"myDefaultNotNull\" value=\"android.support.annotation.NonNull\" />\n    <option name=\"myNullables\">\n      <value>\n        <list size=\"4\">\n          <item index=\"0\" class=\"java.lang.String\" itemvalue=\"org.jetbrains.annotations.Nullable\" />\n          <item index=\"1\" class=\"java.lang.String\" itemvalue=\"javax.annotation.Nullable\" />\n          <item index=\"2\" class=\"java.lang.String\" itemvalue=\"edu.umd.cs.findbugs.annotations.Nullable\" />\n          <item index=\"3\" class=\"java.lang.String\" itemvalue=\"android.support.annotation.Nullable\" />\n        </list>\n      </value>\n    </option>\n    <option name=\"myNotNulls\">\n      <value>\n        <list size=\"4\">\n          <item index=\"0\" class=\"java.lang.String\" itemvalue=\"org.jetbrains.annotations.NotNull\" />\n          <item index=\"1\" class=\"java.lang.String\" itemvalue=\"javax.annotation.Nonnull\" />\n          <item index=\"2\" class=\"java.lang.String\" itemvalue=\"edu.umd.cs.findbugs.annotations.NonNull\" />\n          <item index=\"3\" class=\"java.lang.String\" itemvalue=\"android.support.annotation.NonNull\" />\n        </list>\n      </value>\n    </option>\n  </component>\n  <component name=\"ProjectLevelVcsManager\" settingsEditedManually=\"false\">\n    <OptionsSetting value=\"true\" id=\"Add\" />\n    <OptionsSetting value=\"true\" id=\"Remove\" />\n    <OptionsSetting value=\"true\" id=\"Checkout\" />\n    <OptionsSetting value=\"true\" id=\"Update\" />\n    <OptionsSetting value=\"true\" id=\"Status\" />\n    <OptionsSetting value=\"true\" id=\"Edit\" />\n    <ConfirmationsSetting value=\"0\" id=\"Add\" />\n    <ConfirmationsSetting value=\"0\" id=\"Remove\" />\n  </component>\n  <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\">\n    <output url=\"file://$PROJECT_DIR$/build/classes\" />\n  </component>\n  <component name=\"ProjectType\">\n    <option name=\"id\" value=\"Android\" />\n  </component>\n  <component name=\"masterDetails\">\n    <states>\n      <state key=\"ProjectJDKs.UI\">\n        <settings>\n          <last-edited>1.8</last-edited>\n          <splitter-proportions>\n            <option name=\"proportions\">\n              <list>\n                <option value=\"0.2\" />\n              </list>\n            </option>\n          </splitter-proportions>\n        </settings>\n      </state>\n    </states>\n  </component>\n</project>"
  },
  {
    "path": ".idea/modules.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"ProjectModuleManager\">\n    <modules>\n      <module fileurl=\"file://$PROJECT_DIR$/EasyAndroid.iml\" filepath=\"$PROJECT_DIR$/EasyAndroid.iml\" />\n      <module fileurl=\"file://$PROJECT_DIR$/app/app.iml\" filepath=\"$PROJECT_DIR$/app/app.iml\" />\n      <module fileurl=\"file://$PROJECT_DIR$/easyandroid/easyandroid.iml\" filepath=\"$PROJECT_DIR$/easyandroid/easyandroid.iml\" />\n    </modules>\n  </component>\n</project>"
  },
  {
    "path": ".idea/runConfigurations.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"RunConfigurationProducerService\">\n    <option name=\"ignoredProducers\">\n      <set>\n        <option value=\"org.jetbrains.plugins.gradle.execution.test.runner.AllInPackageGradleConfigurationProducer\" />\n        <option value=\"org.jetbrains.plugins.gradle.execution.test.runner.TestClassGradleConfigurationProducer\" />\n        <option value=\"org.jetbrains.plugins.gradle.execution.test.runner.TestMethodGradleConfigurationProducer\" />\n      </set>\n    </option>\n  </component>\n</project>"
  },
  {
    "path": ".idea/vcs.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"VcsDirectoryMappings\">\n    <mapping directory=\"$PROJECT_DIR$\" vcs=\"Git\" />\n  </component>\n</project>"
  },
  {
    "path": "README.md",
    "content": "最新版RxEasyAndroid 支持RxJava2 可移步到 https://github.com/wu928320442/RxEasyAndroid\n\n----------------本版本为非RxJava2版本---------------\n# 需要的环境\n* JDK1.8\n* SDK\n* AndroidStudio开发工具\n\n# 特性\n* 整合主流HTTP网络、图片加载、MVP（Clean＋Dagger2）架构的一套快速高效的开发框架\n* 包含app library 两个Module 组件化开发\n\n# 用到的第三方框架\n* SDK自带扩展依赖包\n* Retrofit2网络层处理 使用OKHTTP3处理\n* Fresco图片加载处理 使用OKHTTP3处理\n* OKHTTP3  HTTP基础库，提供给网络层处理和图片加载\n* PersistentCookieJar快速Cookie持久化与缓存库\n* Dagger2 依赖注入库，整合Activity，Fragment，Presenter，Task之间的依赖关系\n* Butterknife View的注入库\n* BaseRecyclerViewAdapterHelper Recycler下拉加载库\n* Utilcode实用工具库\n* Logger 一个简洁漂亮的日志打印库\n\n# 类库导入\n```gradle\ncompile 'com.wjj.easy:easyandroid:1.0.0'\n```\n# 联系方式\n* **QQ** 928320442\n* **Android开发交流群** 323876830\n* **Email** wujiajun311@gmail.com\n"
  },
  {
    "path": "app/.gitignore",
    "content": "/build\n"
  },
  {
    "path": "app/build.gradle",
    "content": "apply plugin: 'com.android.application'\napply plugin: 'com.jakewharton.butterknife'\n\nandroid {\n    compileSdkVersion rootProject.ext.compileSdkVersion\n    buildToolsVersion rootProject.ext.buildToolsVersion\n\n    defaultConfig {\n        applicationId rootProject.ext.applicationId\n        minSdkVersion rootProject.ext.minSdkVersion\n        targetSdkVersion rootProject.ext.targetSdkVersion\n        versionCode 1\n        versionName \"1.0\"\n    }\n\n    buildTypes {\n        release {\n            minifyEnabled false\n            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'\n        }\n    }\n}\n\ndependencies {\n    compile fileTree(dir: 'libs', include: ['*.jar'])\n    compile project(path: ':easyandroid')\n    //butterknife viewInject\n    compile \"com.jakewharton:butterknife:$rootProject.butterknife\"\n    compile \"com.jakewharton:butterknife-compiler:$rootProject.butterknife\"\n    compile 'com.wjj.easy:qrcodestyle:1.0.0'\n}\n"
  },
  {
    "path": "app/proguard-rules.pro",
    "content": "# Add project specific ProGuard rules here.\n# By default, the flags in this file are appended to flags specified\n# in /Users/wujiajun/Library/Android/sdk/tools/proguard/proguard-android.txt\n# You can edit the include path and order by changing the proguardFiles\n# directive in build.gradle.\n#\n# For more details, see\n#   http://developer.android.com/guide/developing/tools/proguard.html\n\n# Add any project specific keep options here:\n\n# If your project uses WebView with JS, uncomment the following\n# and specify the fully qualified class name to the JavaScript interface\n# class:\n#-keepclassmembers class fqcn.of.javascript.interface.for.webview {\n#   public *;\n#}\n#-------------------------------------------基本不用动区域--------------------------------------------\n#---------------------------------基本指令区----------------------------------\n-optimizationpasses 5\n-dontskipnonpubliclibraryclassmembers\n-printmapping proguardMapping.txt\n-optimizations !code/simplification/cast,!field/*,!class/merging/*\n-keepattributes *Annotation*,InnerClasses\n-keepattributes Signature\n-keepattributes SourceFile,LineNumberTable\n#----------------------------------------------------------------------------\n\n#---------------------------------默认保留区---------------------------------\n#继承activity,application,service,broadcastReceiver,contentprovider....不进行混淆\n-keep public class * extends android.app.Activity\n-keep public class * extends android.app.Application\n-keep public class * extends android.support.multidex.MultiDexApplication\n-keep public class * extends android.app.Service\n-keep public class * extends android.content.BroadcastReceiver\n-keep public class * extends android.content.ContentProvider\n-keep public class * extends android.app.backup.BackupAgentHelper\n-keep public class * extends android.preference.Preference\n-keep public class * extends android.view.View\n-keep public class com.android.vending.licensing.ILicensingService\n-keep class android.support.** {*;}\n\n-keep class **JNI* {*;}\n\n-keep public class * extends android.view.View{\n    *** get*();\n    void set*(***);\n    public <init>(android.content.Context);\n    public <init>(android.content.Context, android.util.AttributeSet);\n    public <init>(android.content.Context, android.util.AttributeSet, int);\n}\n-keepclasseswithmembers class * {\n    public <init>(android.content.Context, android.util.AttributeSet);\n    public <init>(android.content.Context, android.util.AttributeSet, int);\n}\n#这个主要是在layout 中写的onclick方法android:onclick=\"onClick\"，不进行混淆\n-keepclassmembers class * extends android.app.Activity {\n   public void *(android.view.View);\n}\n\n-keepclassmembers class * implements java.io.Serializable {\n    static final long serialVersionUID;\n    private static final java.io.ObjectStreamField[] serialPersistentFields;\n    private void writeObject(java.io.ObjectOutputStream);\n    private void readObject(java.io.ObjectInputStream);\n    java.lang.Object writeReplace();\n    java.lang.Object readResolve();\n}\n-keep class **.R$* {\n *;\n}\n\n-keepclassmembers class * {\n    void *(*Event);\n}\n\n-keepclassmembers enum * {\n    public static **[] values();\n    public static ** valueOf(java.lang.String);\n}\n-keep class * implements android.os.Parcelable {\n  public static final android.os.Parcelable$Creator *;\n}\n#// natvie 方法不混淆\n-keepclasseswithmembernames class * {\n    native <methods>;\n}\n\n#保持 Parcelable 不被混淆\n-keep class * implements android.os.Parcelable {\n  public static final android.os.Parcelable$Creator *;\n}\n#---------------------第三方---------------\n#butterknife\n-keep class **$$ViewBinder { *; }\n#BaseRecyclerViewAdapterHelper\n-keep class com.chad.library.adapter.** {\n   *;\n}"
  },
  {
    "path": "app/src/main/AndroidManifest.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    package=\"com.wjj.easy.easyandroidHelper\">\n\n    <uses-permission android:name=\"android.permission.INTERNET\" />\n\n    <application\n        android:name=\".AppApplication\"\n        android:allowBackup=\"true\"\n        android:icon=\"@mipmap/ic_launcher\"\n        android:label=\"@string/app_name\"\n        android:supportsRtl=\"true\"\n        android:theme=\"@style/AppTheme\">\n        <activity android:name=\".module.login.LoginActivity\">\n            <intent-filter>\n                <action android:name=\"android.intent.action.MAIN\" />\n\n                <category android:name=\"android.intent.category.LAUNCHER\" />\n            </intent-filter>\n        </activity>\n        <activity android:name=\".module.main.MainActivity\"/>\n    </application>\n\n</manifest>"
  },
  {
    "path": "app/src/main/java/com/wjj/easy/easyandroidHelper/AppApplication.java",
    "content": "package com.wjj.easy.easyandroidHelper;\n\nimport android.app.Application;\n\nimport com.wjj.easy.easyandroidHelper.common.di.AppCommonComponent;\nimport com.wjj.easy.easyandroidHelper.common.di.AppCommonModule;\nimport com.wjj.easy.easyandroidHelper.common.di.DaggerAppCommonComponent;\n\n/**\n * Created by wujiajun on 17/4/6.\n */\n\npublic class AppApplication extends Application {\n\n    AppCommonComponent aComponent;\n\n    @Override\n    public void onCreate() {\n        super.onCreate();\n        aComponent = DaggerAppCommonComponent.builder().appCommonModule(new AppCommonModule(this)).build();\n    }\n\n    public AppCommonComponent getAppComponent() {\n        return aComponent;\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/wjj/easy/easyandroidHelper/common/base/BaseActivity.java",
    "content": "package com.wjj.easy.easyandroidHelper.common.base;\n\nimport android.os.Bundle;\nimport android.support.annotation.Nullable;\n\nimport com.blankj.utilcode.util.ToastUtils;\nimport com.wjj.easy.easyandroid.mvp.EasyBasePresenter;\nimport com.wjj.easy.easyandroid.mvp.di.modules.ActivityModule;\nimport com.wjj.easy.easyandroid.ui.EasyActivity;\nimport com.wjj.easy.easyandroidHelper.AppApplication;\nimport com.wjj.easy.easyandroidHelper.common.di.ActivityCommonComponent;\nimport com.wjj.easy.easyandroidHelper.common.di.DaggerActivityCommonComponent;\nimport com.wjj.easy.easyandroidHelper.widget.dialog.DialogLoading;\n\nimport javax.inject.Inject;\n\nimport butterknife.ButterKnife;\n\n/**\n * Activity业务基类\n * Created by wujiajun on 17/4/10.\n */\n\npublic abstract class BaseActivity<P extends EasyBasePresenter> extends EasyActivity {\n\n    protected DialogLoading loading;\n\n    @Inject\n    protected P mPresenter;\n\n    @Override\n    protected void onCreate(@Nullable Bundle savedInstanceState) {\n        super.onCreate(savedInstanceState);\n        initView();\n        initInject();\n        if (mPresenter != null)\n            mPresenter.attachView(this);\n        initEventAndData();\n    }\n\n    protected void initView() {\n        ButterKnife.bind(this);\n        loading = new DialogLoading(this);\n    }\n\n    public void toast(String msg) {\n        ToastUtils.showShortToast(msg);\n    }\n\n    public void showLoading() {\n        loading.show();\n    }\n\n    public void hiddenLoading() {\n        loading.hide();\n    }\n\n    protected ActivityCommonComponent getActivityComponent() {\n        return DaggerActivityCommonComponent.builder()\n                .appCommonComponent(((AppApplication) getApplication()).getAppComponent())\n                .activityModule(getActivityModule())\n                .build();\n    }\n\n    protected ActivityModule getActivityModule() {\n        return new ActivityModule(this);\n    }\n\n    public P getPresenter() {\n        return mPresenter;\n    }\n\n    protected abstract void initInject();\n\n    protected abstract void initEventAndData();\n}\n"
  },
  {
    "path": "app/src/main/java/com/wjj/easy/easyandroidHelper/common/base/BaseFragment.java",
    "content": "package com.wjj.easy.easyandroidHelper.common.base;\n\nimport android.view.View;\n\nimport com.blankj.utilcode.util.ToastUtils;\nimport com.wjj.easy.easyandroid.mvp.EasyBasePresenter;\nimport com.wjj.easy.easyandroid.mvp.di.modules.FragmentModule;\nimport com.wjj.easy.easyandroid.ui.EasyFragment;\nimport com.wjj.easy.easyandroidHelper.AppApplication;\nimport com.wjj.easy.easyandroidHelper.common.di.DaggerFragmentCommonComponent;\nimport com.wjj.easy.easyandroidHelper.common.di.FragmentCommonComponent;\nimport com.wjj.easy.easyandroidHelper.widget.dialog.DialogLoading;\n\nimport javax.inject.Inject;\n\nimport butterknife.ButterKnife;\n\n/**\n * Fragment业务基类\n *\n * @author wujiajun\n */\n\npublic abstract class BaseFragment<P extends EasyBasePresenter> extends EasyFragment {\n\n    @Inject\n    protected P mPresenter;\n\n    protected DialogLoading loading;\n\n    @Override\n    protected void initView(View view) {\n        ButterKnife.bind(this, view);\n        loading = new DialogLoading(getActivity());\n    }\n\n    @Override\n    protected void init(View view) {\n        initInject();\n        if (mPresenter != null)\n            mPresenter.attachView(this);\n        initEventAndData();\n    }\n\n    @Override\n    public void onStart() {\n        super.onStart();\n        mPresenter.start();\n    }\n\n    public void toast(String msg) {\n        ToastUtils.showShortToast(msg);\n    }\n\n    public void showLoading() {\n        loading.show();\n    }\n\n    public void hiddenLoading() {\n        loading.hide();\n    }\n\n    protected FragmentCommonComponent getFragmentComponent() {\n        return DaggerFragmentCommonComponent.builder()\n                .appCommonComponent(((AppApplication) getActivity().getApplication()).getAppComponent())\n                .fragmentModule(getFragmentModule())\n                .build();\n    }\n\n    protected FragmentModule getFragmentModule() {\n        return new FragmentModule(this);\n    }\n\n    protected abstract void initInject();\n\n    protected abstract void initEventAndData();\n\n    public void setPresenter(P presenter) {\n        mPresenter = presenter;\n    }\n\n    public P getPresenter() {\n        return mPresenter;\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/wjj/easy/easyandroidHelper/common/base/BasePresenter.java",
    "content": "package com.wjj.easy.easyandroidHelper.common.base;\n\nimport com.wjj.easy.easyandroid.mvp.EasyBasePresenter;\nimport com.wjj.easy.easyandroid.mvp.EasyBaseView;\nimport com.wjj.easy.easyandroid.mvp.domain.executor.Executor;\nimport com.wjj.easy.easyandroid.mvp.domain.executor.MainThread;\nimport com.wjj.easy.easyandroid.mvp.domain.usecases.AbstractUseCase;\n\nimport javax.inject.Inject;\n\n/**\n * Presenter基类\n *\n * @author wujiajun\n */\n\npublic class BasePresenter<V extends EasyBaseView> implements EasyBasePresenter<V> {\n\n    protected V mView;\n\n    @Inject\n    Executor threadExecutor;\n    @Inject\n    MainThread mainThread;\n\n    @Override\n    public void start() {\n\n    }\n\n    public void attachView(V view) {\n        mView = view;\n    }\n\n    public V getView() {\n        return mView;\n    }\n\n    public Executor getThreadExecutor() {\n        return threadExecutor;\n    }\n\n    protected void execute(AbstractUseCase task) {\n        getThreadExecutor().execute(task);\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/wjj/easy/easyandroidHelper/common/base/BaseView.java",
    "content": "package com.wjj.easy.easyandroidHelper.common.base;\n\nimport com.wjj.easy.easyandroid.mvp.EasyBasePresenter;\nimport com.wjj.easy.easyandroid.mvp.EasyBaseView;\n\n/**\n * BaseView业务基类\n * Created by wujiajun on 17/4/14.\n */\n\npublic interface BaseView extends EasyBaseView {\n    void toast(String msg);\n\n    void showLoading();\n\n    void hiddenLoading();\n}\n"
  },
  {
    "path": "app/src/main/java/com/wjj/easy/easyandroidHelper/common/base/SimpleActivity.java",
    "content": "package com.wjj.easy.easyandroidHelper.common.base;\n\nimport android.os.Bundle;\nimport android.support.annotation.Nullable;\n\nimport com.blankj.utilcode.util.ToastUtils;\nimport com.wjj.easy.easyandroid.ui.EasyActivity;\nimport com.wjj.easy.easyandroidHelper.widget.dialog.DialogLoading;\n\nimport butterknife.ButterKnife;\n\n/**\n * Activity业务基类简单实现（不包含Presenter）\n *\n * @author wujiajun\n */\n\npublic abstract class SimpleActivity extends EasyActivity {\n\n    protected DialogLoading loading;\n\n    @Override\n    protected void onCreate(@Nullable Bundle savedInstanceState) {\n        super.onCreate(savedInstanceState);\n        initView();\n        initEventAndData();\n    }\n\n    protected void initView() {\n        ButterKnife.bind(this);\n        loading = new DialogLoading(this);\n    }\n\n    public void toast(String msg) {\n        ToastUtils.showShortToast(msg);\n    }\n\n    public void showLoading() {\n        loading.show();\n    }\n\n    public void hiddenLoading() {\n        loading.hide();\n    }\n\n    protected abstract void initEventAndData();\n}\n"
  },
  {
    "path": "app/src/main/java/com/wjj/easy/easyandroidHelper/common/base/SimpleFragment.java",
    "content": "package com.wjj.easy.easyandroidHelper.common.base;\n\nimport android.view.View;\n\nimport com.blankj.utilcode.util.ToastUtils;\nimport com.wjj.easy.easyandroid.ui.EasyFragment;\nimport com.wjj.easy.easyandroidHelper.widget.dialog.DialogLoading;\n\nimport butterknife.ButterKnife;\n\n/**\n * Fragment业务基类(不包含Presenter)\n *\n * @author wujiajun\n */\n\npublic abstract class SimpleFragment extends EasyFragment {\n\n    protected DialogLoading loading;\n\n    @Override\n    protected void initView(View view) {\n        ButterKnife.bind(this, view);\n        loading = new DialogLoading(getActivity());\n    }\n\n    @Override\n    protected void init(View view) {\n        initEventAndData();\n    }\n\n    @Override\n    public void onStart() {\n        super.onStart();\n    }\n\n    public void toast(String msg) {\n        ToastUtils.showShortToast(msg);\n    }\n\n    public void showLoading() {\n        loading.show();\n    }\n\n    public void hiddenLoading() {\n        loading.hide();\n    }\n\n    protected abstract void initEventAndData();\n\n}\n"
  },
  {
    "path": "app/src/main/java/com/wjj/easy/easyandroidHelper/common/di/ActivityCommonComponent.java",
    "content": "package com.wjj.easy.easyandroidHelper.common.di;\n\nimport com.wjj.easy.easyandroid.mvp.di.components.ActivityComponent;\nimport com.wjj.easy.easyandroid.mvp.di.modules.ActivityModule;\nimport com.wjj.easy.easyandroid.mvp.di.scopes.ActivityScope;\nimport com.wjj.easy.easyandroidHelper.module.login.LoginActivity;\nimport com.wjj.easy.easyandroidHelper.module.main.MainActivity;\n\nimport dagger.Component;\n\n/**\n * Activity注入器\n * @author wujiajun\n */\n@ActivityScope\n@Component(dependencies = AppCommonComponent.class, modules = {ActivityModule.class})\npublic interface ActivityCommonComponent extends ActivityComponent {\n\n    void inject(LoginActivity activity);\n\n    void inject(MainActivity activity);\n}\n"
  },
  {
    "path": "app/src/main/java/com/wjj/easy/easyandroidHelper/common/di/AppCommonComponent.java",
    "content": "package com.wjj.easy.easyandroidHelper.common.di;\n\nimport com.wjj.easy.easyandroid.mvp.di.components.AppComponent;\nimport com.wjj.easy.easyandroid.mvp.di.scopes.ApplicationScope;\nimport com.wjj.easy.easyandroid.mvp.domain.executor.Executor;\nimport com.wjj.easy.easyandroid.mvp.domain.executor.MainThread;\nimport com.wjj.easy.easyandroidHelper.common.net.ApiService;\n\nimport dagger.Component;\n\n/**\n * Application注入器\n *\n * @author wujiajun\n */\n@ApplicationScope\n@Component(modules = AppCommonModule.class)\npublic interface AppCommonComponent extends AppComponent {\n    ApiService getApiService();\n\n    Executor getExecutor();\n\n    MainThread getMainThread();\n}\n"
  },
  {
    "path": "app/src/main/java/com/wjj/easy/easyandroidHelper/common/di/AppCommonModule.java",
    "content": "package com.wjj.easy.easyandroidHelper.common.di;\n\nimport android.content.Context;\n\nimport com.blankj.utilcode.util.Utils;\nimport com.facebook.drawee.backends.pipeline.Fresco;\nimport com.facebook.imagepipeline.backends.okhttp3.OkHttpImagePipelineConfigFactory;\nimport com.facebook.imagepipeline.core.ImagePipelineConfig;\nimport com.franmontiel.persistentcookiejar.ClearableCookieJar;\nimport com.franmontiel.persistentcookiejar.PersistentCookieJar;\nimport com.franmontiel.persistentcookiejar.cache.SetCookieCache;\nimport com.franmontiel.persistentcookiejar.persistence.SharedPrefsCookiePersistor;\nimport com.wjj.easy.easyandroid.http.Http;\nimport com.wjj.easy.easyandroid.mvp.di.modules.AppModule;\nimport com.wjj.easy.easyandroid.mvp.domain.executor.Executor;\nimport com.wjj.easy.easyandroid.mvp.domain.executor.MainThread;\nimport com.wjj.easy.easyandroid.mvp.domain.executor.impl.MainThreadImpl;\nimport com.wjj.easy.easyandroid.mvp.domain.executor.impl.ThreadExecutor;\nimport com.wjj.easy.easyandroidHelper.common.net.ApiService;\nimport com.wjj.easy.easyandroidHelper.common.net.CookieInterceptor;\n\nimport dagger.Module;\nimport dagger.Provides;\n\n/**\n * Application Module\n *\n * @author wujiajun\n */\n@Module\npublic class AppCommonModule extends AppModule {\n\n    private Http mHttp;\n\n    public AppCommonModule(Context context) {\n        super(context);\n        initHttp();\n        initImage();\n        initUtils();\n    }\n\n    /**\n     * Http初始化\n     */\n    private void initHttp() {\n        //cookie cache & persistor\n        ClearableCookieJar cookieJar =\n                new PersistentCookieJar(new SetCookieCache(), new SharedPrefsCookiePersistor(provideContext()));\n        mHttp = new Http.HttpBuilder()\n                .setBaseUrl(ApiService.HOST)\n                .setCookieJar(cookieJar)\n                .setTimeout(15)\n                .addInterceptor(new CookieInterceptor())\n                .build();\n    }\n\n    /**\n     * Fresco初始化\n     */\n    private void initImage() {\n        ImagePipelineConfig config = OkHttpImagePipelineConfigFactory\n                .newBuilder(provideContext(), mHttp.getClient())\n                .build();\n        Fresco.initialize(provideContext(), config);\n    }\n\n    /**\n     * Utils库初始化\n     */\n    private void initUtils() {\n        Utils.init(provideContext());\n    }\n\n    @Provides\n    ApiService provideApiService() {\n        return mHttp.getRetrofit().create(ApiService.class);\n    }\n\n    @Provides\n    Executor provideExecutor() {\n        return ThreadExecutor.getInstance();\n    }\n\n    @Provides\n    MainThread provideMainThread() {\n        return MainThreadImpl.getInstance();\n    }\n\n}\n"
  },
  {
    "path": "app/src/main/java/com/wjj/easy/easyandroidHelper/common/di/FragmentCommonComponent.java",
    "content": "package com.wjj.easy.easyandroidHelper.common.di;\n\nimport com.wjj.easy.easyandroid.mvp.di.components.FragmentComponent;\nimport com.wjj.easy.easyandroid.mvp.di.modules.FragmentModule;\nimport com.wjj.easy.easyandroid.mvp.di.scopes.FragmentScope;\nimport com.wjj.easy.easyandroidHelper.module.main.HomeFragment;\nimport com.wjj.easy.easyandroidHelper.module.main.MyFragment;\n\nimport dagger.Component;\n\n/**\n * Fragment注入器\n *\n * @author wujiajun\n */\n@FragmentScope\n@Component(dependencies = AppCommonComponent.class, modules = {FragmentModule.class})\npublic interface FragmentCommonComponent extends FragmentComponent {\n\n    void inject(HomeFragment fragment);\n\n    void inject(MyFragment fragment);\n}\n"
  },
  {
    "path": "app/src/main/java/com/wjj/easy/easyandroidHelper/common/net/ApiService.java",
    "content": "package com.wjj.easy.easyandroidHelper.common.net;\n\nimport com.wjj.easy.easyandroidHelper.model.ListInfo;\nimport com.wjj.easy.easyandroidHelper.model.LoginResponse;\nimport com.wjj.easy.easyandroidHelper.model.base.BaseStatus;\n\nimport retrofit2.Call;\nimport retrofit2.http.Field;\nimport retrofit2.http.FormUrlEncoded;\nimport retrofit2.http.GET;\nimport retrofit2.http.POST;\nimport retrofit2.http.Query;\n\n/**\n * Created by wujiajun on 17/4/5.\n */\n\npublic interface ApiService {\n\n    // 线上\n    String HOST = \"http://dw.qianbao666.com/\";//dcw.qbao.com dw.qianbao666.com\n\n\n    /**\n     * 获取注册验证码\n     */\n    @FormUrlEncoded\n    @POST(HOST + \"app/sendSMS.do\")\n    Call<BaseStatus> getVerifyCode(@Field(\"username\") String username, @Field(\"password\") String pwd);\n\n    /**\n     * 用户登录\n     */\n    @FormUrlEncoded\n    @POST(HOST + \"app/login.do\")\n    Call<LoginResponse> login(@Field(\"username\") String username, @Field(\"password\") String pwd, @Field(\"code\") String verifyCode);\n\n    /**\n     * 获取列表数据\n     */\n    @GET(\"http://baoyue.qbao.com/app/task/list.json\")\n    Call<ListInfo> getList(@Query(\"type\") int type, @Query(\"page\") int page, @Query(\"rows\") int rows);\n\n\n}\n"
  },
  {
    "path": "app/src/main/java/com/wjj/easy/easyandroidHelper/common/net/AppHttp.java",
    "content": "package com.wjj.easy.easyandroidHelper.common.net;\n\nimport com.wjj.easy.easyandroid.http.Http;\nimport com.wjj.easy.easyandroidHelper.model.ListInfo;\nimport com.wjj.easy.easyandroidHelper.model.LoginResponse;\nimport com.wjj.easy.easyandroidHelper.model.base.BaseStatus;\n\nimport javax.inject.Inject;\n\nimport retrofit2.Call;\n\n/**\n * Created by wujiajun on 17/4/5.\n */\n\npublic class AppHttp {\n\n    private ApiService apiService;\n\n    @Inject\n    public AppHttp(ApiService apiService) {\n        this.apiService = apiService;\n    }\n\n    public void getVerifyCode(String username, String pwd, final Http.HttpCallback<BaseStatus> callback) {\n        Call<BaseStatus> call = apiService.getVerifyCode(username, pwd);\n        call.enqueue(new Http.CallbackDefault(callback));\n        call.request();\n    }\n\n    public void login(String username, String pwd, String verifyCode, final Http.HttpCallback<LoginResponse> callback) {\n        Call<LoginResponse> call = apiService.login(username, pwd, verifyCode);\n        call.enqueue(new Http.CallbackDefault(callback));\n        call.request();\n    }\n\n    public void getList(int index, final Http.HttpCallback<ListInfo> callback) {\n        Call<ListInfo> call = apiService.getList(1,index,20);\n        call.enqueue(new Http.CallbackDefault(callback));\n        call.request();\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/wjj/easy/easyandroidHelper/common/net/CookieHead.java",
    "content": "package com.wjj.easy.easyandroidHelper.common.net;\n\n/**\n * Created by wujiajun on 17/4/11.\n */\n\npublic enum CookieHead {\n\n    CLIENT_TYPE(\"client_type\", \"android\"),\n    USER_NAME(\"user_name\", \"\");\n\n\n    private String head;\n    private String value;\n\n    CookieHead(String head, String value) {\n        this.head = head;\n        this.value = value;\n    }\n\n    public String getHead() {\n        return head;\n    }\n\n    public String getValue() {\n        return value;\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/wjj/easy/easyandroidHelper/common/net/CookieInterceptor.java",
    "content": "package com.wjj.easy.easyandroidHelper.common.net;\n\nimport java.io.IOException;\n\nimport okhttp3.Interceptor;\nimport okhttp3.Request;\nimport okhttp3.Response;\n\n/**\n * Created by wujiajun on 17/4/11.\n */\n\npublic class CookieInterceptor implements Interceptor {\n\n    @Override\n    public Response intercept(Chain chain) throws IOException {\n        Request original = chain.request();\n        Request request = original.newBuilder()\n                .header(CookieHead.USER_NAME.getHead(), CookieHead.CLIENT_TYPE.getValue())\n                .header(CookieHead.CLIENT_TYPE.getHead(), \"wjj\")\n                .method(original.method(), original.body())\n                .build();\n        return chain.proceed(request);\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/wjj/easy/easyandroidHelper/model/ListInfo.java",
    "content": "package com.wjj.easy.easyandroidHelper.model;\n\nimport android.os.Parcel;\nimport android.os.Parcelable;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\n/**\n * Created by ljw on 2017/4/13.\n */\n\npublic class ListInfo implements Parcelable {\n\n    /**\n     * success : true\n     * returnCode : 0\n     * message : ok\n     * 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}]\n     */\n\n    private boolean success;\n    private int returnCode;\n    private String message;\n    private List<DataBean> data;\n\n    public boolean isSuccess() {\n        return success;\n    }\n\n    public void setSuccess(boolean success) {\n        this.success = success;\n    }\n\n    public int getReturnCode() {\n        return returnCode;\n    }\n\n    public void setReturnCode(int returnCode) {\n        this.returnCode = returnCode;\n    }\n\n    public String getMessage() {\n        return message;\n    }\n\n    public void setMessage(String message) {\n        this.message = message;\n    }\n\n    public List<DataBean> getData() {\n        return data;\n    }\n\n    public void setData(List<DataBean> data) {\n        this.data = data;\n    }\n\n    public static class DataBean {\n\n        @Override\n        public String toString() {\n            return \"DataBean{\" +\n                    \"taskId=\" + taskId +\n                    \", title='\" + title + '\\'' +\n                    \", content='\" + content + '\\'' +\n                    \", imageUrl='\" + imageUrl + '\\'' +\n                    \", amt='\" + amt + '\\'' +\n                    \", doTime='\" + doTime + '\\'' +\n                    \", city='\" + city + '\\'' +\n                    \", address='\" + address + '\\'' +\n                    \", payKind='\" + payKind + '\\'' +\n                    \", taskTypeName='\" + taskTypeName + '\\'' +\n                    \", onlyVip=\" + onlyVip +\n                    \", hasMemberAmt=\" + hasMemberAmt +\n                    \", memberAmt='\" + memberAmt + '\\'' +\n                    \", isFree=\" + isFree +\n                    '}';\n        }\n\n        /**\n         * taskId : 2539544\n         * title : 李茶的姑妈\n         * content : 李茶的姑妈\n         * imageUrl : https://qn-message.qbcdn.com/5aeceeb6753d48638a596b842ed7c98e\n         * amt : 290\n         * doTime : 2017-04-18\n         * city : 南京\n         * address : 江苏省南京市\n         * payKind : 元\n         * taskTypeName : 宝约优选\n         * onlyVip : 0\n         * hasMemberAmt : 0\n         * memberAmt : 0\n         * isFree : false\n         */\n\n        private int taskId;\n        private String title;\n        private String content;\n        private String imageUrl;\n        private String amt;\n        private String doTime;\n        private String city;\n        private String address;\n        private String payKind;\n        private String taskTypeName;\n        private int onlyVip;\n        private int hasMemberAmt;\n        private String memberAmt;\n        private boolean isFree;\n\n        public int getTaskId() {\n            return taskId;\n        }\n\n        public void setTaskId(int taskId) {\n            this.taskId = taskId;\n        }\n\n        public String getTitle() {\n            return title;\n        }\n\n        public void setTitle(String title) {\n            this.title = title;\n        }\n\n        public String getContent() {\n            return content;\n        }\n\n        public void setContent(String content) {\n            this.content = content;\n        }\n\n        public String getImageUrl() {\n            return imageUrl;\n        }\n\n        public void setImageUrl(String imageUrl) {\n            this.imageUrl = imageUrl;\n        }\n\n        public String getAmt() {\n            return amt;\n        }\n\n        public void setAmt(String amt) {\n            this.amt = amt;\n        }\n\n        public String getDoTime() {\n            return doTime;\n        }\n\n        public void setDoTime(String doTime) {\n            this.doTime = doTime;\n        }\n\n        public String getCity() {\n            return city;\n        }\n\n        public void setCity(String city) {\n            this.city = city;\n        }\n\n        public String getAddress() {\n            return address;\n        }\n\n        public void setAddress(String address) {\n            this.address = address;\n        }\n\n        public String getPayKind() {\n            return payKind;\n        }\n\n        public void setPayKind(String payKind) {\n            this.payKind = payKind;\n        }\n\n        public String getTaskTypeName() {\n            return taskTypeName;\n        }\n\n        public void setTaskTypeName(String taskTypeName) {\n            this.taskTypeName = taskTypeName;\n        }\n\n        public int getOnlyVip() {\n            return onlyVip;\n        }\n\n        public void setOnlyVip(int onlyVip) {\n            this.onlyVip = onlyVip;\n        }\n\n        public int getHasMemberAmt() {\n            return hasMemberAmt;\n        }\n\n        public void setHasMemberAmt(int hasMemberAmt) {\n            this.hasMemberAmt = hasMemberAmt;\n        }\n\n        public String getMemberAmt() {\n            return memberAmt;\n        }\n\n        public void setMemberAmt(String memberAmt) {\n            this.memberAmt = memberAmt;\n        }\n\n        public boolean isIsFree() {\n            return isFree;\n        }\n\n        public void setIsFree(boolean isFree) {\n            this.isFree = isFree;\n        }\n    }\n\n\n    @Override\n    public int describeContents() {\n        return 0;\n    }\n\n    @Override\n    public void writeToParcel(Parcel dest, int flags) {\n        dest.writeByte(this.success ? (byte) 1 : (byte) 0);\n        dest.writeInt(this.returnCode);\n        dest.writeString(this.message);\n        dest.writeList(this.data);\n    }\n\n    public ListInfo() {\n    }\n\n    protected ListInfo(Parcel in) {\n        this.success = in.readByte() != 0;\n        this.returnCode = in.readInt();\n        this.message = in.readString();\n        this.data = new ArrayList<DataBean>();\n        in.readList(this.data, DataBean.class.getClassLoader());\n    }\n\n    public static final Parcelable.Creator<ListInfo> CREATOR = new Parcelable.Creator<ListInfo>() {\n        @Override\n        public ListInfo createFromParcel(Parcel source) {\n            return new ListInfo(source);\n        }\n\n        @Override\n        public ListInfo[] newArray(int size) {\n            return new ListInfo[size];\n        }\n    };\n\n    @Override\n    public String toString() {\n        return \"ListInfo{\" +\n                \"success=\" + success +\n                \", returnCode=\" + returnCode +\n                \", message='\" + message + '\\'' +\n                \", data=\" + data +\n                '}';\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/wjj/easy/easyandroidHelper/model/LoginInfo.java",
    "content": "package com.wjj.easy.easyandroidHelper.model;\n\nimport android.os.Parcel;\nimport android.os.Parcelable;\n\n/**\n * Created by zhaotun on 2016/12/20.\n */\n\npublic class LoginInfo implements Parcelable {\n\n    /**\n     * mobile : 15670388343\n     * sessionId : 8996AD494B77221C98EE7C6D359224A1.o214zsug\n     */\n\n    private String mobile;\n    private String sessionId;\n\n    public String getMobile() {\n        return mobile;\n    }\n\n    public void setMobile(String mobile) {\n        this.mobile = mobile;\n    }\n\n    public String getSessionId() {\n        return sessionId;\n    }\n\n    public void setSessionId(String sessionId) {\n        this.sessionId = sessionId;\n    }\n\n    @Override\n    public String toString() {\n        return \"LoginInfo{\" +\n                \"mobile='\" + mobile + '\\'' +\n                \", sessionId='\" + sessionId + '\\'' +\n                '}';\n    }\n\n\n    @Override\n    public int describeContents() {\n        return 0;\n    }\n\n    @Override\n    public void writeToParcel(Parcel dest, int flags) {\n        dest.writeString(this.mobile);\n        dest.writeString(this.sessionId);\n    }\n\n    protected LoginInfo(Parcel in) {\n        this.mobile = in.readString();\n        this.sessionId = in.readString();\n    }\n\n    public static final Creator<LoginInfo> CREATOR = new Creator<LoginInfo>() {\n        @Override\n        public LoginInfo createFromParcel(Parcel source) {\n            return new LoginInfo(source);\n        }\n\n        @Override\n        public LoginInfo[] newArray(int size) {\n            return new LoginInfo[size];\n        }\n    };\n}\n"
  },
  {
    "path": "app/src/main/java/com/wjj/easy/easyandroidHelper/model/LoginResponse.java",
    "content": "package com.wjj.easy.easyandroidHelper.model;\n\n\nimport com.wjj.easy.easyandroidHelper.model.base.BaseResponseInfo;\n\n/**\n * Created by zhaotun on 2016/12/20.\n */\n\npublic class LoginResponse extends BaseResponseInfo<LoginInfo> {\n}\n"
  },
  {
    "path": "app/src/main/java/com/wjj/easy/easyandroidHelper/model/base/BaseChartInfo.java",
    "content": "package com.wjj.easy.easyandroidHelper.model.base;\n\nimport android.os.Parcel;\nimport android.os.Parcelable;\n\n/**\n * Created by zhaotun on 2016/12/26.\n */\n\npublic class BaseChartInfo<T extends Parcelable> implements Parcelable {\n\n    private boolean success;\n    private int totalCount;\n    private int recordsTotal;\n    private int recordsFiltered;\n    private T data;\n\n    public boolean isSuccess() {\n        return success;\n    }\n\n    public void setSuccess(boolean success) {\n        this.success = success;\n    }\n\n    public int getTotalCount() {\n        return totalCount;\n    }\n\n    public void setTotalCount(int totalCount) {\n        this.totalCount = totalCount;\n    }\n\n    public int getRecordsTotal() {\n        return recordsTotal;\n    }\n\n    public void setRecordsTotal(int recordsTotal) {\n        this.recordsTotal = recordsTotal;\n    }\n\n    public int getRecordsFiltered() {\n        return recordsFiltered;\n    }\n\n    public void setRecordsFiltered(int recordsFiltered) {\n        this.recordsFiltered = recordsFiltered;\n    }\n\n    public T getData() {\n        return data;\n    }\n\n    public void setData(T data) {\n        this.data = data;\n    }\n\n    @Override\n    public String toString() {\n        return \"BaseChartInfo{\" +\n                \"success=\" + success +\n                \", totalCount=\" + totalCount +\n                \", recordsTotal=\" + recordsTotal +\n                \", recordsFiltered=\" + recordsFiltered +\n                \", data=\" + data +\n                '}';\n    }\n\n\n    @Override\n    public int describeContents() {\n        return 0;\n    }\n\n    @Override\n    public void writeToParcel(Parcel dest, int flags) {\n        dest.writeByte(this.success ? (byte) 1 : (byte) 0);\n        dest.writeInt(this.totalCount);\n        dest.writeInt(this.recordsTotal);\n        dest.writeInt(this.recordsFiltered);\n\n        dest.writeString(this.data.getClass().getName());\n        dest.writeParcelable(this.data, flags);\n    }\n\n    public BaseChartInfo() {\n    }\n\n    protected BaseChartInfo(Parcel in) {\n        this.success = in.readByte() != 0;\n        this.totalCount = in.readInt();\n        this.recordsTotal = in.readInt();\n        this.recordsFiltered = in.readInt();\n\n        try {\n            String className = in.readString();\n            this.data = in.readParcelable(Class.forName(className).getClassLoader());\n        } catch (Exception e) {\n            e.printStackTrace();\n        }\n    }\n\n    public static final Creator<BaseChartInfo> CREATOR = new Creator<BaseChartInfo>() {\n        @Override\n        public BaseChartInfo createFromParcel(Parcel source) {\n            return new BaseChartInfo(source);\n        }\n\n        @Override\n        public BaseChartInfo[] newArray(int size) {\n            return new BaseChartInfo[size];\n        }\n    };\n\n}\n"
  },
  {
    "path": "app/src/main/java/com/wjj/easy/easyandroidHelper/model/base/BaseChartListInfo.java",
    "content": "package com.wjj.easy.easyandroidHelper.model.base;\n\nimport android.os.Bundle;\nimport android.os.Parcel;\nimport android.os.Parcelable;\n\nimport java.util.ArrayList;\n\n/**\n * Created by zhaotun on 2016/12/26.\n */\n\npublic class BaseChartListInfo<T extends Parcelable> implements Parcelable {\n\n    public static final String PARCELABLE_ARRAY_LIST_DATA_KEY = \"parcelable_array_list_data_key\";\n\n    private boolean success;\n    private int totalCount;\n    private int recordsTotal;\n    private int recordsFiltered;\n    private ArrayList<T> data;\n\n    public boolean isSuccess() {\n        return success;\n    }\n\n    public void setSuccess(boolean success) {\n        this.success = success;\n    }\n\n    public int getTotalCount() {\n        return totalCount;\n    }\n\n    public void setTotalCount(int totalCount) {\n        this.totalCount = totalCount;\n    }\n\n    public int getRecordsTotal() {\n        return recordsTotal;\n    }\n\n    public void setRecordsTotal(int recordsTotal) {\n        this.recordsTotal = recordsTotal;\n    }\n\n    public int getRecordsFiltered() {\n        return recordsFiltered;\n    }\n\n    public void setRecordsFiltered(int recordsFiltered) {\n        this.recordsFiltered = recordsFiltered;\n    }\n\n    public ArrayList<T> getData() {\n        return data;\n    }\n\n    public void setData(ArrayList<T> data) {\n        this.data = data;\n    }\n\n    @Override\n    public String toString() {\n        return \"BaseChartInfo{\" +\n                \"success=\" + success +\n                \", totalCount=\" + totalCount +\n                \", recordsTotal=\" + recordsTotal +\n                \", recordsFiltered=\" + recordsFiltered +\n                \", data=\" + data +\n                '}';\n    }\n\n\n    @Override\n    public int describeContents() {\n        return 0;\n    }\n\n    @Override\n    public void writeToParcel(Parcel dest, int flags) {\n        dest.writeByte(this.success ? (byte) 1 : (byte) 0);\n        dest.writeInt(this.totalCount);\n        dest.writeInt(this.recordsTotal);\n        dest.writeInt(this.recordsFiltered);\n\n        Bundle bundle = new Bundle();\n        bundle.putParcelableArrayList(PARCELABLE_ARRAY_LIST_DATA_KEY, data);\n        dest.writeBundle(bundle);\n    }\n\n    public BaseChartListInfo() {\n    }\n\n    protected BaseChartListInfo(Parcel in) {\n        this.success = in.readByte() != 0;\n        this.totalCount = in.readInt();\n        this.recordsTotal = in.readInt();\n        this.recordsFiltered = in.readInt();\n\n        try {\n            this.data = in.readBundle().getParcelableArrayList(PARCELABLE_ARRAY_LIST_DATA_KEY);\n        } catch (Exception e) {\n            e.printStackTrace();\n        }\n    }\n\n    public static final Creator<BaseChartListInfo> CREATOR = new Creator<BaseChartListInfo>() {\n        @Override\n        public BaseChartListInfo createFromParcel(Parcel source) {\n            return new BaseChartListInfo(source);\n        }\n\n        @Override\n        public BaseChartListInfo[] newArray(int size) {\n            return new BaseChartListInfo[size];\n        }\n    };\n\n}\n"
  },
  {
    "path": "app/src/main/java/com/wjj/easy/easyandroidHelper/model/base/BaseResponseInfo.java",
    "content": "package com.wjj.easy.easyandroidHelper.model.base;\n\nimport android.os.Parcel;\nimport android.os.Parcelable;\n\n/**\n * Created by zhaotun .\n */\n\npublic class BaseResponseInfo<T extends Parcelable> extends BaseStatus {\n\n    private T data;\n\n    public T getData() {\n        return data;\n    }\n\n    public void setData(T data) {\n        this.data = data;\n    }\n\n    @Override\n    public String toString() {\n        return super.toString() + \" BaseResponseInfo{\" +\n                \"data=\" + data +\n                '}';\n    }\n\n    @Override\n    public int describeContents() {\n        return 0;\n    }\n\n    @Override\n    public void writeToParcel(Parcel dest, int flags) {\n        super.writeToParcel(dest, flags);\n\n        dest.writeString(this.data.getClass().getName());\n        dest.writeParcelable(this.data, flags);\n    }\n\n    public BaseResponseInfo() {\n    }\n\n    protected BaseResponseInfo(Parcel in) {\n        super(in);\n\n        try {\n            String className = in.readString();\n            this.data = in.readParcelable(Class.forName(className).getClassLoader());\n        } catch (Exception e) {\n            e.printStackTrace();\n        }\n    }\n\n    public static final Parcelable.Creator<BaseResponseInfo> CREATOR = new Parcelable.Creator<BaseResponseInfo>() {\n        @Override\n        public BaseResponseInfo createFromParcel(Parcel source) {\n            return new BaseResponseInfo(source);\n        }\n\n        @Override\n        public BaseResponseInfo[] newArray(int size) {\n            return new BaseResponseInfo[size];\n        }\n    };\n}\n"
  },
  {
    "path": "app/src/main/java/com/wjj/easy/easyandroidHelper/model/base/BaseResponseListInfo.java",
    "content": "package com.wjj.easy.easyandroidHelper.model.base;\n\nimport android.os.Bundle;\nimport android.os.Parcel;\nimport android.os.Parcelable;\n\nimport java.util.ArrayList;\n\n/**\n * Created by zhaotun .\n */\n\npublic class BaseResponseListInfo<T extends Parcelable> extends BaseStatus {\n\n    public static final String PARCELABLE_ARRAY_LIST_DATA_KEY = \"parcelable_array_list_data_key\";\n\n    private ArrayList<T> data;\n\n    public ArrayList<T> getData() {\n        return data;\n    }\n\n    public void setData(ArrayList<T> data) {\n        this.data = data;\n    }\n\n    @Override\n    public String toString() {\n        return super.toString() + \" BaseResponseListInfo{\" +\n                \"data=\" + data +\n                '}';\n    }\n\n    @Override\n    public int describeContents() {\n        return 0;\n    }\n\n    @Override\n    public void writeToParcel(Parcel dest, int flags) {\n        super.writeToParcel(dest, flags);\n\n        Bundle bundle = new Bundle();\n        bundle.putParcelableArrayList(PARCELABLE_ARRAY_LIST_DATA_KEY, data);\n        dest.writeBundle(bundle);\n    }\n\n    public BaseResponseListInfo() {\n    }\n\n    protected BaseResponseListInfo(Parcel in) {\n        super(in);\n\n        try {\n            this.data = in.readBundle().getParcelableArrayList(PARCELABLE_ARRAY_LIST_DATA_KEY);\n        } catch (Exception e) {\n            e.printStackTrace();\n        }\n    }\n\n    public static final Creator<BaseResponseListInfo> CREATOR = new Creator<BaseResponseListInfo>() {\n        @Override\n        public BaseResponseListInfo createFromParcel(Parcel source) {\n            return new BaseResponseListInfo(source);\n        }\n\n        @Override\n        public BaseResponseListInfo[] newArray(int size) {\n            return new BaseResponseListInfo[size];\n        }\n    };\n}\n"
  },
  {
    "path": "app/src/main/java/com/wjj/easy/easyandroidHelper/model/base/BaseStatus.java",
    "content": "package com.wjj.easy.easyandroidHelper.model.base;\n\nimport android.os.Parcel;\nimport android.os.Parcelable;\n\n/**\n * Created by zhaotun\n */\n\npublic class BaseStatus implements Parcelable {\n\n    public static final int RESPONSE_CODE_SUCCESS = 0;\n\n    private int code;// 0成功\n    private String message;\n\n    public int getCode() {\n        return code;\n    }\n\n    public void setCode(int code) {\n        this.code = code;\n    }\n\n    public String getMessage() {\n        return message;\n    }\n\n    public void setMessage(String message) {\n        this.message = message;\n    }\n\n    public boolean isSuccess() {\n        return code == RESPONSE_CODE_SUCCESS;\n    }\n\n    @Override\n    public String toString() {\n        return \"BaseStatus{\" +\n                \"code=\" + code +\n                \", message='\" + message + '\\'' +\n                '}';\n    }\n\n\n    @Override\n    public int describeContents() {\n        return 0;\n    }\n\n    @Override\n    public void writeToParcel(Parcel dest, int flags) {\n        dest.writeInt(this.code);\n        dest.writeString(this.message);\n    }\n\n    public BaseStatus() {\n    }\n\n    protected BaseStatus(Parcel in) {\n        this.code = in.readInt();\n        this.message = in.readString();\n    }\n\n}\n"
  },
  {
    "path": "app/src/main/java/com/wjj/easy/easyandroidHelper/module/login/LoginActivity.java",
    "content": "package com.wjj.easy.easyandroidHelper.module.login;\n\nimport android.content.Intent;\nimport android.support.v4.content.ContextCompat;\nimport android.support.v7.widget.Toolbar;\nimport android.view.View;\nimport android.widget.EditText;\nimport android.widget.TextView;\n\nimport com.wjj.easy.easyandroidHelper.R;\nimport com.wjj.easy.easyandroidHelper.common.base.BaseActivity;\nimport com.wjj.easy.easyandroidHelper.module.main.MainActivity;\n\nimport butterknife.BindView;\nimport butterknife.OnClick;\n\n/**\n * 登录Activity\n *\n * @author wujiajun\n */\n\npublic class LoginActivity extends BaseActivity<LoginPresenter> implements LoginContract.View {\n\n    @BindView(R.id.set_user_name)\n    EditText setUserName;\n    @BindView(R.id.set_pwd)\n    EditText setPwd;\n    @BindView(R.id.set_verify_code)\n    EditText setVerifyCode;\n    @BindView(R.id.get_verify_code)\n    TextView getVerifyCode;\n    @BindView(R.id.tv_login)\n    TextView tvLogin;\n    @BindView(R.id.tool_bar)\n    Toolbar toolbar;\n\n    @Override\n    protected void initInject() {\n        getActivityComponent().inject(this);\n    }\n\n    @Override\n    protected void initEventAndData() {\n        toolbar.setLogo(R.mipmap.icon_app);\n        toolbar.setTitle(R.string.app_name);\n        toolbar.setTitleTextColor(ContextCompat.getColor(this, R.color.white));\n        toolbar.setTitleMarginStart(getResources().getDimensionPixelSize(R.dimen.padding_size_30));\n        setSupportActionBar(toolbar);\n    }\n\n    @Override\n    protected int getContentView() {\n        return R.layout.activity_login;\n    }\n\n\n    @OnClick({R.id.get_verify_code, R.id.tv_login})\n    public void onClick(View view) {\n        switch (view.getId()) {\n            case R.id.get_verify_code:\n                getPresenter().getVerifyCode(setUserName.getText().toString(), setPwd.getText().toString());\n                startActivity(new Intent(this, MainActivity.class));\n                break;\n            case R.id.tv_login:\n                getPresenter().login(setUserName.getText().toString(), setPwd.getText().toString(), setVerifyCode.getText().toString());\n                break;\n        }\n    }\n\n}\n"
  },
  {
    "path": "app/src/main/java/com/wjj/easy/easyandroidHelper/module/login/LoginContract.java",
    "content": "package com.wjj.easy.easyandroidHelper.module.login;\n\nimport com.wjj.easy.easyandroid.mvp.EasyBasePresenter;\nimport com.wjj.easy.easyandroidHelper.common.base.BaseView;\n\n\n/**\n * LoginContract\n * Created by wujiajun on 17/4/7.\n */\npublic interface LoginContract {\n\n    interface View extends BaseView {\n    }\n\n    interface Presenter extends EasyBasePresenter<View> {\n        void getVerifyCode(String userName, String pwd);\n\n        void login(String userName, String pwd, String verifyCode);\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/wjj/easy/easyandroidHelper/module/login/LoginPresenter.java",
    "content": "package com.wjj.easy.easyandroidHelper.module.login;\n\nimport com.wjj.easy.easyandroid.mvp.domain.usecases.UseCase;\nimport com.wjj.easy.easyandroidHelper.common.base.BasePresenter;\nimport com.wjj.easy.easyandroidHelper.model.LoginResponse;\nimport com.wjj.easy.easyandroidHelper.model.base.BaseStatus;\nimport com.wjj.easy.easyandroidHelper.module.login.domain.GetVerifyCodeTask;\nimport com.wjj.easy.easyandroidHelper.module.login.domain.LoginTask;\n\nimport javax.inject.Inject;\n\n/**\n * Login Presenter\n * Created by wujiajun on 17/4/7.\n */\npublic class LoginPresenter extends BasePresenter<LoginContract.View> implements LoginContract.Presenter {\n\n    @Inject\n    GetVerifyCodeTask mGetVerifyCodeTask;\n    @Inject\n    LoginTask mLoginTask;\n\n    @Inject\n    public LoginPresenter() {\n    }\n\n    @Override\n    public void getVerifyCode(String userName, String pwd) {\n        mGetVerifyCodeTask.setUserName(userName);\n        mGetVerifyCodeTask.setPwd(pwd);\n        mGetVerifyCodeTask.setCallback(new UseCase.Callback<BaseStatus>() {\n            @Override\n            public void success(BaseStatus baseStatus) {\n                getView().toast(\"getVerifyCode success!\");\n            }\n\n            @Override\n            public void fail() {\n                getView().toast(\"getVerifyCode fail!\");\n            }\n        });\n        getThreadExecutor().execute(mGetVerifyCodeTask);\n    }\n\n    @Override\n    public void login(String userName, String pwd, String verifyCode) {\n        getView().showLoading();\n        mLoginTask.setUserName(userName);\n        mLoginTask.setPwd(pwd);\n        mLoginTask.setVerifyCode(verifyCode);\n        mLoginTask.setCallback(new UseCase.Callback<LoginResponse>() {\n            @Override\n            public void success(LoginResponse loginResponse) {\n                getView().toast(\"login success!\");\n            }\n\n            @Override\n            public void fail() {\n                getView().toast(\"login fail!\");\n            }\n        });\n        getThreadExecutor().execute(mLoginTask);\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/wjj/easy/easyandroidHelper/module/login/domain/GetVerifyCodeTask.java",
    "content": "package com.wjj.easy.easyandroidHelper.module.login.domain;\n\nimport com.wjj.easy.easyandroid.http.Http;\nimport com.wjj.easy.easyandroid.mvp.domain.usecases.AbstractUseCase;\nimport com.wjj.easy.easyandroidHelper.common.net.AppHttp;\nimport com.wjj.easy.easyandroidHelper.model.base.BaseStatus;\nimport com.wjj.easy.easyandroidHelper.utils.SecretUtils;\n\nimport javax.inject.Inject;\n\n/**\n * 获取验证码任务\n *\n * @author wujiajun\n */\n\npublic class GetVerifyCodeTask extends AbstractUseCase {\n\n    String publicKey = \"11\";\n\n    String userName;\n    String pwd;\n\n    @Inject\n    AppHttp appHttp;\n\n    @Inject\n    public GetVerifyCodeTask() {\n    }\n\n    @Override\n    public void run() {\n        appHttp.getVerifyCode(userName, SecretUtils.encryptByPublicKey(pwd, publicKey), new Http.HttpCallback<BaseStatus>() {\n            @Override\n            public void onResponse(BaseStatus baseStatus) {\n                getCallback().success(baseStatus);\n            }\n\n            @Override\n            public void onFailure(Throwable t) {\n                getCallback().fail();\n            }\n        });\n    }\n\n    public void setUserName(String userName) {\n        this.userName = userName;\n    }\n\n    public void setPwd(String pwd) {\n        this.pwd = pwd;\n    }\n\n}\n"
  },
  {
    "path": "app/src/main/java/com/wjj/easy/easyandroidHelper/module/login/domain/LoginTask.java",
    "content": "package com.wjj.easy.easyandroidHelper.module.login.domain;\n\nimport com.wjj.easy.easyandroid.http.Http;\nimport com.wjj.easy.easyandroid.mvp.domain.usecases.AbstractUseCase;\nimport com.wjj.easy.easyandroidHelper.common.net.AppHttp;\nimport com.wjj.easy.easyandroidHelper.model.LoginResponse;\nimport com.wjj.easy.easyandroidHelper.utils.SecretUtils;\n\nimport javax.inject.Inject;\n\n/**\n * 登录任务\n *\n * @author wujiajun\n */\n\npublic class LoginTask extends AbstractUseCase {\n\n    String publicKey = \"11\";\n\n    String userName;\n    String pwd;\n    String verifyCode;\n\n    @Inject\n    AppHttp appHttp;\n\n    @Inject\n    public LoginTask() {\n    }\n\n    @Override\n    public void run() {\n        appHttp.login(userName, SecretUtils.encryptByPublicKey(pwd, publicKey), verifyCode, new Http.HttpCallback<LoginResponse>() {\n            @Override\n            public void onResponse(LoginResponse baseStatus) {\n                getCallback().success(baseStatus);\n            }\n\n            @Override\n            public void onFailure(Throwable t) {\n                getCallback().fail();\n            }\n        });\n    }\n\n    public void setUserName(String userName) {\n        this.userName = userName;\n    }\n\n    public void setPwd(String pwd) {\n        this.pwd = pwd;\n    }\n\n    public void setVerifyCode(String verifyCode) {\n        this.verifyCode = verifyCode;\n    }\n\n}\n"
  },
  {
    "path": "app/src/main/java/com/wjj/easy/easyandroidHelper/module/main/HomeContract.java",
    "content": "package com.wjj.easy.easyandroidHelper.module.main;\n\nimport com.wjj.easy.easyandroid.mvp.EasyBasePresenter;\nimport com.wjj.easy.easyandroidHelper.common.base.BaseView;\nimport com.wjj.easy.easyandroidHelper.model.ListInfo;\n\n/**\n * Created by wujiajun on 17/4/6.\n */\npublic interface HomeContract {\n\n    interface View extends BaseView {\n        void showList(ListInfo list);\n    }\n\n    interface Presenter extends EasyBasePresenter<View> {\n        void getList(int index);\n    }\n\n}\n"
  },
  {
    "path": "app/src/main/java/com/wjj/easy/easyandroidHelper/module/main/HomeFragment.java",
    "content": "package com.wjj.easy.easyandroidHelper.module.main;\n\nimport android.support.v7.widget.DefaultItemAnimator;\nimport android.support.v7.widget.LinearLayoutManager;\nimport android.support.v7.widget.RecyclerView;\nimport android.util.Log;\n\nimport com.wjj.easy.easyandroidHelper.R;\nimport com.wjj.easy.easyandroidHelper.common.base.BaseFragment;\nimport com.wjj.easy.easyandroidHelper.model.ListInfo;\nimport com.wjj.easy.easyandroidHelper.module.main.adapter.HomeAdapter;\n\nimport butterknife.BindView;\n\n/**\n * 首页\n * Created by wujiajun on 17/4/12.\n */\n\npublic class HomeFragment extends BaseFragment<HomePresenter> implements HomeContract.View {\n\n    @BindView(R.id.rv_list)\n    RecyclerView rvList;\n\n    HomeAdapter homeAdapter;\n\n    @Override\n    protected int getContentView() {\n        return R.layout.fragment_home;\n    }\n\n    @Override\n    protected void initInject() {\n        getFragmentComponent().inject(this);\n    }\n\n    @Override\n    protected void initEventAndData() {\n        showLoading();\n        homeAdapter = new HomeAdapter(R.layout.home_list_item);\n        rvList.setLayoutManager(new LinearLayoutManager(getContext(), LinearLayoutManager.VERTICAL, false));\n        // 设置Item添加和移除的动画\n        rvList.setItemAnimator(new DefaultItemAnimator());\n        rvList.setAdapter(homeAdapter);\n        rvList.postDelayed(new Runnable() {\n            @Override\n            public void run() {\n                getPresenter().getList(1);\n            }\n        }, 1000);\n    }\n\n    @Override\n    public void showList(ListInfo list) {\n        Log.e(\"HomeFragment\", \"list : \" + list.toString());\n        homeAdapter.setNewData(list.getData());\n        hiddenLoading();\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/wjj/easy/easyandroidHelper/module/main/HomePresenter.java",
    "content": "package com.wjj.easy.easyandroidHelper.module.main;\n\nimport com.wjj.easy.easyandroid.mvp.domain.executor.Executor;\nimport com.wjj.easy.easyandroid.mvp.domain.usecases.UseCase;\nimport com.wjj.easy.easyandroidHelper.common.base.BasePresenter;\nimport com.wjj.easy.easyandroidHelper.model.ListInfo;\nimport com.wjj.easy.easyandroidHelper.module.main.domain.GetListTask;\n\nimport javax.inject.Inject;\n\n/**\n * Created by wujiajun on 17/4/6.\n */\n\npublic class HomePresenter extends BasePresenter<HomeContract.View> implements HomeContract.Presenter {\n\n    @Inject\n    GetListTask getListTask;\n\n    @Inject\n    public HomePresenter() {\n\n    }\n\n    @Override\n    public void getList(int page) {\n        getListTask.setIndex(page);\n        getListTask.setCallback(new UseCase.Callback<ListInfo>() {\n            @Override\n            public void success(ListInfo list) {\n                getView().showList(list);\n            }\n\n            @Override\n            public void fail() {\n                getView().hiddenLoading();\n            }\n        });\n        execute(getListTask);\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/wjj/easy/easyandroidHelper/module/main/MainActivity.java",
    "content": "package com.wjj.easy.easyandroidHelper.module.main;\n\nimport android.support.design.widget.TabLayout;\nimport android.support.v4.app.Fragment;\nimport android.support.v4.app.FragmentManager;\nimport android.support.v4.app.FragmentPagerAdapter;\nimport android.support.v4.content.ContextCompat;\nimport android.support.v4.view.ViewPager;\nimport android.support.v7.widget.Toolbar;\nimport android.widget.ImageView;\nimport android.widget.RelativeLayout;\nimport android.widget.TextView;\n\nimport com.wjj.easy.easyandroidHelper.R;\nimport com.wjj.easy.easyandroidHelper.common.base.SimpleActivity;\n\nimport butterknife.BindView;\nimport butterknife.ButterKnife;\n\n/**\n * 主页\n *\n * @author wujiajun\n */\npublic class MainActivity extends SimpleActivity {\n\n\n    private Fragment[] fragments = new Fragment[]{new HomeFragment(), new MyFragment()};\n\n    @BindView(R.id.activity_main)\n    RelativeLayout activityMain;\n    @BindView(R.id.view_pager)\n    ViewPager viewPager;\n    @BindView(R.id.tab_layout)\n    TabLayout tabLayout;\n    @BindView(R.id.tool_bar)\n    Toolbar toolbar;\n\n    @Override\n    protected void initEventAndData() {\n\n        toolbar.setLogo(R.mipmap.icon_app);\n        toolbar.setTitle(R.string.app_name);\n        toolbar.setTitleTextColor(ContextCompat.getColor(this, R.color.white));\n        toolbar.setTitleMarginStart(getResources().getDimensionPixelSize(R.dimen.padding_size_30));\n        setSupportActionBar(toolbar);\n\n        viewPager.setAdapter(new MainPageAdapter(getSupportFragmentManager()));\n        tabLayout.setupWithViewPager(viewPager);\n\n        tabLayout.getTabAt(0).setCustomView(R.layout.view_main_tab);\n        tabLayout.getTabAt(1).setCustomView(R.layout.view_main_tab);\n\n        selectTab(tabLayout.getTabAt(0));\n        unSelectTab(tabLayout.getTabAt(1));\n\n        tabLayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {\n            @Override\n            public void onTabSelected(TabLayout.Tab tab) {\n                selectTab(tab);\n            }\n\n            @Override\n            public void onTabUnselected(TabLayout.Tab tab) {\n                unSelectTab(tab);\n            }\n\n            @Override\n            public void onTabReselected(TabLayout.Tab tab) {\n                selectTab(tab);\n            }\n        });\n        viewPager.setCurrentItem(0);\n    }\n\n    private void selectTab(TabLayout.Tab tab) {\n        ImageView icon = ButterKnife.findById(tab.getCustomView(), R.id.tab_icon_iv);\n        TextView title = ButterKnife.findById(tab.getCustomView(), R.id.tab_title_tv);\n        if (tab.getPosition() == 0) {\n            icon.setImageResource(R.mipmap.tab_home_selected);\n            title.setText(R.string.home_tab);\n        } else {\n            icon.setImageResource(R.mipmap.tab_user_selected);\n            title.setText(R.string.my_tab);\n        }\n        title.setTextColor(ContextCompat.getColor(this, R.color.black));\n    }\n\n    private void unSelectTab(TabLayout.Tab tab) {\n        ImageView icon = ButterKnife.findById(tab.getCustomView(), R.id.tab_icon_iv);\n        TextView title = ButterKnife.findById(tab.getCustomView(), R.id.tab_title_tv);\n        if (tab.getPosition() == 0) {\n            icon.setImageResource(R.mipmap.tab_home_unselected);\n            title.setText(R.string.home_tab);\n        } else {\n            icon.setImageResource(R.mipmap.tab_user_unselected);\n            title.setText(R.string.my_tab);\n        }\n        title.setTextColor(ContextCompat.getColor(this, R.color.grey));\n    }\n\n    @Override\n    protected int getContentView() {\n        return R.layout.activity_main;\n    }\n\n    private class MainPageAdapter extends FragmentPagerAdapter {\n\n        public MainPageAdapter(FragmentManager fm) {\n            super(fm);\n        }\n\n        @Override\n        public Fragment getItem(int position) {\n            return fragments[position];\n        }\n\n        @Override\n        public int getCount() {\n            return fragments.length;\n        }\n    }\n\n}\n"
  },
  {
    "path": "app/src/main/java/com/wjj/easy/easyandroidHelper/module/main/MyContract.java",
    "content": "package com.wjj.easy.easyandroidHelper.module.main;\n\nimport com.wjj.easy.easyandroid.mvp.EasyBasePresenter;\nimport com.wjj.easy.easyandroidHelper.common.base.BaseView;\n\n/**\n * Created by wujiajun on 17/4/6.\n */\npublic interface MyContract {\n\n    interface View extends BaseView {\n    }\n\n    interface Presenter extends EasyBasePresenter<View> {\n    }\n\n}\n"
  },
  {
    "path": "app/src/main/java/com/wjj/easy/easyandroidHelper/module/main/MyFragment.java",
    "content": "package com.wjj.easy.easyandroidHelper.module.main;\n\nimport android.net.Uri;\n\nimport com.facebook.drawee.view.SimpleDraweeView;\nimport com.wjj.easy.easyandroidHelper.R;\nimport com.wjj.easy.easyandroidHelper.common.base.BaseFragment;\n\nimport butterknife.BindView;\n\n/**\n * 我的\n * Created by wujiajun on 17/4/12.\n */\n\npublic class MyFragment extends BaseFragment<MyPresenter> implements MyContract.View {\n\n    @BindView(R.id.my_image_view)\n    SimpleDraweeView myImageView;\n\n    @Override\n    protected int getContentView() {\n        return R.layout.fragment_my;\n    }\n\n    @Override\n    protected void initInject() {\n        getFragmentComponent().inject(this);\n    }\n\n    @Override\n    protected void initEventAndData() {\n        Uri uri = Uri.parse(\"https://raw.githubusercontent.com/facebook/fresco/gh-pages/static/logo.png\");\n        myImageView.setImageURI(uri);\n    }\n\n}"
  },
  {
    "path": "app/src/main/java/com/wjj/easy/easyandroidHelper/module/main/MyPresenter.java",
    "content": "package com.wjj.easy.easyandroidHelper.module.main;\n\nimport com.wjj.easy.easyandroidHelper.common.base.BasePresenter;\n\nimport javax.inject.Inject;\n\n/**\n * Created by wujiajun on 17/4/6.\n */\n\npublic class MyPresenter extends BasePresenter<MyContract.View> implements MyContract.Presenter {\n\n    @Inject\n    public MyPresenter() {\n    }\n\n}\n"
  },
  {
    "path": "app/src/main/java/com/wjj/easy/easyandroidHelper/module/main/adapter/HomeAdapter.java",
    "content": "package com.wjj.easy.easyandroidHelper.module.main.adapter;\n\nimport android.graphics.drawable.Drawable;\nimport android.view.View;\nimport android.widget.TextView;\n\nimport com.chad.library.adapter.base.BaseQuickAdapter;\nimport com.chad.library.adapter.base.BaseViewHolder;\nimport com.facebook.drawee.view.SimpleDraweeView;\nimport com.wjj.easy.easyandroidHelper.R;\nimport com.wjj.easy.easyandroidHelper.model.ListInfo;\n\nimport java.text.NumberFormat;\nimport java.util.List;\n\nimport javax.inject.Inject;\n\n/**\n * Created by ljw on 2017/4/14.\n */\n\npublic class HomeAdapter extends BaseQuickAdapter<ListInfo.DataBean,BaseViewHolder> {\n\n    Drawable right_vip;\n    Drawable right_free;\n\n    public HomeAdapter(int layoutResId, List<ListInfo.DataBean> data) {\n        super(layoutResId, data);\n    }\n\n    @Inject\n    public HomeAdapter(int layoutResId) {\n        super(layoutResId);\n    }\n\n    @Override\n    protected void convert(BaseViewHolder holder, ListInfo.DataBean info) {\n        if(info==null)\n            return;\n\n        SimpleDraweeView ivIcon = holder.getView(R.id.dv_img);\n        ivIcon.setImageURI(info.getImageUrl());\n        holder.setText(R.id.tv_date, info.getDoTime());\n        holder.setText(R.id.tv_city, info.getCity());\n\n        holder.setText(R.id.tv_label, info.getTaskTypeName());\n\n        TextView tv_name = holder.getView(R.id.tv_name);\n        TextView tv_member_price = holder.getView(R.id.tv_member_price);\n\n\n        if(right_vip==null) {\n            right_vip = mContext.getResources().getDrawable(R.mipmap.icon_vip_all);\n            right_vip.setBounds(0, 0, right_vip.getMinimumWidth(), right_vip.getMinimumHeight());\n        }\n\n        if(right_free == null){\n            right_free = mContext.getResources().getDrawable(R.mipmap.ic_free);\n            right_free.setBounds(0, 0, right_free.getMinimumWidth(), right_free.getMinimumHeight());\n        }\n\n        tv_name.setText(info.getTitle());\n\n        if (info.getOnlyVip() == 1){ // 会员专享活动\n            tv_name.setCompoundDrawables(null, null, right_vip, null);\n            tv_member_price.setVisibility(View.GONE);\n            if(info.isIsFree()){ // 免费活动\n                holder.setText(R.id.tv_price,\"免费报名\");\n                holder.getView(R.id.tv_price_y).setVisibility(View.GONE);\n\n            }else { // 非免费\n\n                holder.getView(R.id.tv_price_y).setVisibility(View.VISIBLE);\n                holder.setText(R.id.tv_price, Integer.toString(info.getHasMemberAmt()));\n            }\n        }else if(info.isIsFree()){ // 免费活动\n\n            tv_name.setCompoundDrawables(null,null,right_free,null);\n            tv_member_price.setVisibility(View.GONE);\n            holder.setText(R.id.tv_price,\"免费报名\");\n            tv_member_price.setVisibility(View.GONE);\n            holder.getView(R.id.tv_price_y).setVisibility(View.GONE);\n\n        }else { // 普通活动（不是免费活动，也不是会员专享活动）\n            holder.setText(R.id.tv_price,info.getAmt());\n            holder.getView(R.id.tv_price_y).setVisibility(View.VISIBLE);\n            tv_name.setCompoundDrawables(null,null,null,null);\n            if(info.getHasMemberAmt() == 1) {\n                tv_member_price.setVisibility(View.VISIBLE);\n                tv_member_price.setText(String.format(\"会员价：%s\", NumberFormat.getInstance().format(info.getMemberAmt())));\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/wjj/easy/easyandroidHelper/module/main/domain/GetListTask.java",
    "content": "package com.wjj.easy.easyandroidHelper.module.main.domain;\n\nimport com.wjj.easy.easyandroid.http.Http;\nimport com.wjj.easy.easyandroid.mvp.domain.usecases.AbstractUseCase;\nimport com.wjj.easy.easyandroidHelper.common.net.AppHttp;\nimport com.wjj.easy.easyandroidHelper.model.ListInfo;\n\nimport javax.inject.Inject;\n\n/**\n * Created by ljw on 2017/4/13.\n */\n\npublic class GetListTask extends AbstractUseCase{\n\n    int index;\n\n    @Inject\n    AppHttp appHttp;\n\n\n    @Inject\n    public GetListTask() {\n\n    }\n\n\n    @Override\n    public void run() {\n        appHttp.getList(index, new Http.HttpCallback<ListInfo>() {\n            @Override\n            public void onResponse(ListInfo listInfos) {\n\n                getCallback().success(listInfos);\n\n            }\n\n            @Override\n            public void onFailure(Throwable t) {\n\n                getCallback().fail();\n            }\n        });\n\n    }\n\n    public void setIndex(int index) {\n        this.index = index;\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/wjj/easy/easyandroidHelper/utils/SecretUtils.java",
    "content": "package com.wjj.easy.easyandroidHelper.utils;\n\nimport android.util.Base64;\n\nimport java.security.KeyFactory;\nimport java.security.PrivateKey;\nimport java.security.PublicKey;\nimport java.security.spec.PKCS8EncodedKeySpec;\nimport java.security.spec.X509EncodedKeySpec;\nimport java.util.ArrayList;\nimport java.util.List;\n\nimport javax.crypto.Cipher;\n\n/**\n * 加解密\n *\n * @author zhaotun\n */\npublic class SecretUtils {\n\n    public enum SecroType {\n        TYPE_RSA;\n    }\n\n    public static final String CRYPTO_TYPE_RSA = \"RSA\";// 非对称加密密钥算法\n    public static final String ECB_PKCS1_PADDING = \"RSA/ECB/PKCS1Padding\";//加密填充方式  RSA/ECB/PKCS1Padding RSA/ECB/NoPadding\n\n    public static final String CRYPTO_TYPE_DES = \"DES\";\n    public static final String CRYPTO_TYPE_DES_ALGORITHM = \"DES/CBC/PKCS5Padding\";\n\n    private static final byte[] DESIV = \"12345678\".getBytes();\n    private static final String CHARSET_UTF8 = \"UTF-8\";\n\n    public static final int DEFAULT_KEY_SIZE = 2048;//秘钥默认长度\n    public static final byte[] DEFAULT_SPLIT = \"#PART#\".getBytes();    // 当要加密的内容超过bufferSize，则采用partSplit进行分块加密\n    public static final int DEFAULT_BUFFERSIZE = (DEFAULT_KEY_SIZE / 8) - 11;// 当前秘钥支持加密的最大字节数\n\n    private PublicKey keyPublic;\n    private Cipher cipher;\n\n    private SecretUtils() {\n    }\n\n    public static String encryptByPublicKey(String data, String pubKey) {\n        try {\n//            SecureRandom random = SecureRandom.getInstance(\"SHA1PRNG\");\n\n            byte[] buffer = Base64.decode(pubKey, Base64.DEFAULT);\n            X509EncodedKeySpec keySpec = new X509EncodedKeySpec(buffer);\n\n            KeyFactory keyFactory = KeyFactory.getInstance(CRYPTO_TYPE_RSA);\n            PublicKey publicKey = keyFactory.generatePublic(keySpec);\n\n            // 加密数据\n            Cipher cp = Cipher.getInstance(ECB_PKCS1_PADDING);\n            cp.init(Cipher.ENCRYPT_MODE, publicKey);\n\n            byte[] output = cp.doFinal(data.getBytes(CHARSET_UTF8));\n            // 必须先encode成 byte[]，再转成encodeToString，否则服务器解密会失败\n            byte[] encode = Base64.encode(output, Base64.DEFAULT);\n            String aa=new String(encode);\n            return aa;//Base64.encodeToString(encode, Base64.DEFAULT);\n        } catch (Exception e) {\n            e.printStackTrace();\n\n            return data;\n        }\n    }\n\n    /**\n     * TODO:有待验证\n     *\n     * @param data\n     * @param pubKey\n     * @return\n     */\n    public static String decryptByPublicKey(String data, String pubKey) {\n        try {\n            byte[] buffer = Base64.decode(pubKey, Base64.DEFAULT);\n            X509EncodedKeySpec keySpec = new X509EncodedKeySpec(buffer);\n\n            KeyFactory kf = KeyFactory.getInstance(CRYPTO_TYPE_RSA);\n            PublicKey publicKey = kf.generatePublic(keySpec);\n\n            // 数据解密\n            Cipher cipher = Cipher.getInstance(ECB_PKCS1_PADDING);\n            cipher.init(Cipher.DECRYPT_MODE, publicKey);\n\n            byte[] output = cipher.doFinal(data.getBytes(CHARSET_UTF8));\n            // 必须先encode成 byte[]，再转成encodeToString，否则服务器解密会失败\n            byte[] encode = Base64.encode(output, Base64.DEFAULT);\n\n            return new String(encode);\n        } catch (Exception e) {\n            e.printStackTrace();\n\n            return data;\n        }\n    }\n\n\n    /**\n     * 用公钥对字符串进行加密\n     *\n     * @param data 原文\n     */\n    public static byte[] encryptByPublicKey(byte[] data, byte[] publicKey) {\n        try {\n            // 得到公钥\n            X509EncodedKeySpec keySpec = new X509EncodedKeySpec(publicKey);\n\n            KeyFactory kf = KeyFactory.getInstance(CRYPTO_TYPE_RSA);\n            PublicKey keyPublic = kf.generatePublic(keySpec);\n\n            // 加密数据\n            Cipher cp = Cipher.getInstance(ECB_PKCS1_PADDING);\n            cp.init(Cipher.ENCRYPT_MODE, keyPublic);\n\n            return cp.doFinal(data);\n        } catch (Exception e) {\n            e.printStackTrace();\n\n            return null;\n        }\n    }\n\n    /**\n     * 私钥加密\n     *\n     * @param data       待加密数据\n     * @param privateKey 密钥\n     * @return byte[] 加密数据\n     */\n    public static byte[] encryptByPrivateKey(byte[] data, byte[] privateKey) throws Exception {\n        try {\n            // 得到私钥\n            PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(privateKey);\n            KeyFactory kf = KeyFactory.getInstance(CRYPTO_TYPE_RSA);\n            PrivateKey keyPrivate = kf.generatePrivate(keySpec);\n            // 数据加密\n            Cipher cipher = Cipher.getInstance(ECB_PKCS1_PADDING);\n            cipher.init(Cipher.ENCRYPT_MODE, keyPrivate);\n            return cipher.doFinal(data);\n        } catch (Exception e) {\n            e.printStackTrace();\n\n            return null;\n        }\n    }\n\n\n    /**\n     * 公钥解密\n     *\n     * @param data      待解密数据\n     * @param publicKey 密钥\n     * @return byte[] 解密数据\n     */\n    public static byte[] decryptByPublicKey(byte[] data, byte[] publicKey) throws Exception {\n        // 得到公钥\n        X509EncodedKeySpec keySpec = new X509EncodedKeySpec(publicKey);\n        KeyFactory kf = KeyFactory.getInstance(CRYPTO_TYPE_RSA);\n        PublicKey keyPublic = kf.generatePublic(keySpec);\n        // 数据解密\n        Cipher cipher = Cipher.getInstance(ECB_PKCS1_PADDING);\n        cipher.init(Cipher.DECRYPT_MODE, keyPublic);\n        return cipher.doFinal(data);\n    }\n\n    /**\n     * 使用私钥进行解密\n     */\n    public static byte[] decryptByPrivateKey(byte[] encrypted, byte[] privateKey) throws Exception {\n        // 得到私钥\n        PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(privateKey);\n        KeyFactory kf = KeyFactory.getInstance(CRYPTO_TYPE_RSA);\n        PrivateKey keyPrivate = kf.generatePrivate(keySpec);\n\n        // 解密数据\n        Cipher cp = Cipher.getInstance(ECB_PKCS1_PADDING);\n        cp.init(Cipher.DECRYPT_MODE, keyPrivate);\n        byte[] arr = cp.doFinal(encrypted);\n        return arr;\n    }\n\n\n    /**\n     * 用公钥对字符串进行分段加密\n     */\n    public static byte[] encryptByPublicKeyForSpilt(byte[] data, byte[] publicKey) throws Exception {\n        int dataLen = data.length;\n        if (dataLen <= DEFAULT_BUFFERSIZE) {\n            return encryptByPublicKey(data, publicKey);\n        }\n        List<Byte> allBytes = new ArrayList<Byte>(2048);\n        int bufIndex = 0;\n        int subDataLoop = 0;\n        byte[] buf = new byte[DEFAULT_BUFFERSIZE];\n        for (int i = 0; i < dataLen; i++) {\n            buf[bufIndex] = data[i];\n            if (++bufIndex == DEFAULT_BUFFERSIZE || i == dataLen - 1) {\n                subDataLoop++;\n                if (subDataLoop != 1) {\n                    for (byte b : DEFAULT_SPLIT) {\n                        allBytes.add(b);\n                    }\n                }\n                byte[] encryptBytes = encryptByPublicKey(buf, publicKey);\n                for (byte b : encryptBytes) {\n                    allBytes.add(b);\n                }\n                bufIndex = 0;\n                if (i == dataLen - 1) {\n                    buf = null;\n                } else {\n                    buf = new byte[Math.min(DEFAULT_BUFFERSIZE, dataLen - i - 1)];\n                }\n            }\n        }\n        byte[] bytes = new byte[allBytes.size()];\n        {\n            int i = 0;\n            for (Byte b : allBytes) {\n                bytes[i++] = b.byteValue();\n            }\n        }\n        return bytes;\n    }\n\n    /**\n     * 分段加密\n     *\n     * @param data       要加密的原始数据\n     * @param privateKey 秘钥\n     */\n    public static byte[] encryptByPrivateKeyForSpilt(byte[] data, byte[] privateKey) throws Exception {\n        int dataLen = data.length;\n        if (dataLen <= DEFAULT_BUFFERSIZE) {\n            return encryptByPrivateKey(data, privateKey);\n        }\n        List<Byte> allBytes = new ArrayList<Byte>(2048);\n        int bufIndex = 0;\n        int subDataLoop = 0;\n        byte[] buf = new byte[DEFAULT_BUFFERSIZE];\n        for (int i = 0; i < dataLen; i++) {\n            buf[bufIndex] = data[i];\n            if (++bufIndex == DEFAULT_BUFFERSIZE || i == dataLen - 1) {\n                subDataLoop++;\n                if (subDataLoop != 1) {\n                    for (byte b : DEFAULT_SPLIT) {\n                        allBytes.add(b);\n                    }\n                }\n                byte[] encryptBytes = encryptByPrivateKey(buf, privateKey);\n                for (byte b : encryptBytes) {\n                    allBytes.add(b);\n                }\n                bufIndex = 0;\n                if (i == dataLen - 1) {\n                    buf = null;\n                } else {\n                    buf = new byte[Math.min(DEFAULT_BUFFERSIZE, dataLen - i - 1)];\n                }\n            }\n        }\n        byte[] bytes = new byte[allBytes.size()];\n        {\n            int i = 0;\n            for (Byte b : allBytes) {\n                bytes[i++] = b.byteValue();\n            }\n        }\n        return bytes;\n    }\n\n    /**\n     * 公钥分段解密\n     *\n     * @param encrypted 待解密数据\n     * @param publicKey 密钥\n     */\n    public static byte[] decryptByPublicKeyForSpilt(byte[] encrypted, byte[] publicKey) throws Exception {\n        int splitLen = DEFAULT_SPLIT.length;\n        if (splitLen <= 0) {\n            return decryptByPublicKey(encrypted, publicKey);\n        }\n        int dataLen = encrypted.length;\n        List<Byte> allBytes = new ArrayList<Byte>(1024);\n        int latestStartIndex = 0;\n        for (int i = 0; i < dataLen; i++) {\n            byte bt = encrypted[i];\n            boolean isMatchSplit = false;\n            if (i == dataLen - 1) {\n                // 到data的最后了\n                byte[] part = new byte[dataLen - latestStartIndex];\n                System.arraycopy(encrypted, latestStartIndex, part, 0, part.length);\n                byte[] decryptPart = decryptByPublicKey(part, publicKey);\n                for (byte b : decryptPart) {\n                    allBytes.add(b);\n                }\n                latestStartIndex = i + splitLen;\n                i = latestStartIndex - 1;\n            } else if (bt == DEFAULT_SPLIT[0]) {\n                // 这个是以split[0]开头\n                if (splitLen > 1) {\n                    if (i + splitLen < dataLen) {\n                        // 没有超出data的范围\n                        for (int j = 1; j < splitLen; j++) {\n                            if (DEFAULT_SPLIT[j] != encrypted[i + j]) {\n                                break;\n                            }\n                            if (j == splitLen - 1) {\n                                // 验证到split的最后一位，都没有break，则表明已经确认是split段\n                                isMatchSplit = true;\n                            }\n                        }\n                    }\n                } else {\n                    // split只有一位，则已经匹配了\n                    isMatchSplit = true;\n                }\n            }\n            if (isMatchSplit) {\n                byte[] part = new byte[i - latestStartIndex];\n                System.arraycopy(encrypted, latestStartIndex, part, 0, part.length);\n                byte[] decryptPart = decryptByPublicKey(part, publicKey);\n                for (byte b : decryptPart) {\n                    allBytes.add(b);\n                }\n                latestStartIndex = i + splitLen;\n                i = latestStartIndex - 1;\n            }\n        }\n        byte[] bytes = new byte[allBytes.size()];\n        {\n            int i = 0;\n            for (Byte b : allBytes) {\n                bytes[i++] = b.byteValue();\n            }\n        }\n        return bytes;\n    }\n\n    /**\n     * 使用私钥分段解密\n     */\n    public static byte[] decryptByPrivateKeyForSpilt(byte[] encrypted, byte[] privateKey) throws Exception {\n        int splitLen = DEFAULT_SPLIT.length;\n        if (splitLen <= 0) {\n            return decryptByPrivateKey(encrypted, privateKey);\n        }\n        int dataLen = encrypted.length;\n        List<Byte> allBytes = new ArrayList<Byte>(1024);\n        int latestStartIndex = 0;\n        for (int i = 0; i < dataLen; i++) {\n            byte bt = encrypted[i];\n            boolean isMatchSplit = false;\n            if (i == dataLen - 1) {\n                // 到data的最后了\n                byte[] part = new byte[dataLen - latestStartIndex];\n                System.arraycopy(encrypted, latestStartIndex, part, 0, part.length);\n                byte[] decryptPart = decryptByPrivateKey(part, privateKey);\n                for (byte b : decryptPart) {\n                    allBytes.add(b);\n                }\n                latestStartIndex = i + splitLen;\n                i = latestStartIndex - 1;\n            } else if (bt == DEFAULT_SPLIT[0]) {\n                // 这个是以split[0]开头\n                if (splitLen > 1) {\n                    if (i + splitLen < dataLen) {\n                        // 没有超出data的范围\n                        for (int j = 1; j < splitLen; j++) {\n                            if (DEFAULT_SPLIT[j] != encrypted[i + j]) {\n                                break;\n                            }\n                            if (j == splitLen - 1) {\n                                // 验证到split的最后一位，都没有break，则表明已经确认是split段\n                                isMatchSplit = true;\n                            }\n                        }\n                    }\n                } else {\n                    // split只有一位，则已经匹配了\n                    isMatchSplit = true;\n                }\n            }\n            if (isMatchSplit) {\n                byte[] part = new byte[i - latestStartIndex];\n                System.arraycopy(encrypted, latestStartIndex, part, 0, part.length);\n                byte[] decryptPart = decryptByPrivateKey(part, privateKey);\n                for (byte b : decryptPart) {\n                    allBytes.add(b);\n                }\n                latestStartIndex = i + splitLen;\n                i = latestStartIndex - 1;\n            }\n        }\n        byte[] bytes = new byte[allBytes.size()];\n        {\n            int i = 0;\n            for (Byte b : allBytes) {\n                bytes[i++] = b.byteValue();\n            }\n        }\n        return bytes;\n    }\n\n\n}\n"
  },
  {
    "path": "app/src/main/java/com/wjj/easy/easyandroidHelper/widget/dialog/BaseDialog.java",
    "content": "package com.wjj.easy.easyandroidHelper.widget.dialog;\n\nimport android.app.Dialog;\nimport android.content.Context;\nimport android.os.Bundle;\nimport android.util.DisplayMetrics;\nimport android.view.Gravity;\nimport android.view.Window;\nimport android.view.WindowManager.LayoutParams;\n\nimport com.wjj.easy.easyandroidHelper.R;\n\nimport butterknife.ButterKnife;\n\n\n/**\n * Created by zhaotun\n */\npublic abstract class BaseDialog extends Dialog {\n\n    protected float mDimAmount = 0.6f;\n\n    protected float mWidthScale = 0.9f;\n\n    protected int gravity = Gravity.CENTER_VERTICAL;\n\n    protected int animId = -1;\n\n    protected int x = 0;\n\n    protected int y = 0;\n\n    protected int h = LayoutParams.WRAP_CONTENT;\n\n    protected boolean mShouldSetWindow = true;\n\n\n    public BaseDialog(Context context) {\n        super(context, R.style.dialog_custom_roll_up_down);\n    }\n\n    public BaseDialog(Context context, int theme) {\n        super(context, theme);\n    }\n\n    @Override\n    protected void onCreate(Bundle savedInstanceState) {\n        super.onCreate(savedInstanceState);\n        setContentView(getContentView());\n        ButterKnife.bind(this);\n        init();\n\n        if (mShouldSetWindow) {\n            setWindow(x, y);\n        }\n    }\n\n    protected void setWindow(int x, int y) {\n        Window dialogWindow = getWindow();\n        LayoutParams lp = dialogWindow.getAttributes();\n        DisplayMetrics d = getContext().getResources().getDisplayMetrics(); // 获取屏幕宽、高用\n        lp.width = (int) (d.widthPixels * mWidthScale);\n        lp.height = h;\n        lp.x = x;\n        lp.y = y;\n        lp.gravity = gravity;\n        lp.dimAmount = mDimAmount;\n        dialogWindow.addFlags(LayoutParams.FLAG_DIM_BEHIND);\n\n        if (animId != -1) {\n            dialogWindow.setWindowAnimations(animId);\n        }\n    }\n\n    public void shouldSetWindow(boolean shouldSetWindow) {\n        this.mShouldSetWindow = shouldSetWindow;\n    }\n\n    protected abstract int getContentView();\n\n    protected abstract void init();\n\n}\n"
  },
  {
    "path": "app/src/main/java/com/wjj/easy/easyandroidHelper/widget/dialog/DialogLoading.java",
    "content": "package com.wjj.easy.easyandroidHelper.widget.dialog;\n\nimport android.content.Context;\nimport android.widget.TextView;\n\nimport com.wjj.easy.easyandroidHelper.R;\n\nimport butterknife.BindView;\n\n\n/**\n * Created by zhaotun on 2017/2/21.\n */\n\npublic class DialogLoading extends BaseDialog {\n\n    @BindView(R.id.tv_loading_text)\n    TextView tvText;\n\n    public DialogLoading(Context context) {\n        this(context, false);\n    }\n\n    public DialogLoading(Context context, boolean shouldSetWindow) {\n        super(context, R.style.customDialog_loading);\n        shouldSetWindow(shouldSetWindow);\n\n        setCanceledOnTouchOutside(false);\n        setCancelable(true);\n    }\n\n    @Override\n    protected int getContentView() {\n        return R.layout.dialog_loading;\n    }\n\n    @Override\n    protected void init() {\n\n    }\n\n    public void setText(String text) {\n        if (tvText != null) {\n            tvText.setText(text);\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/res/anim/roll_down.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<set xmlns:android=\"http://schemas.android.com/apk/res/android\">\n\n    <translate\n        android:duration=\"300\"\n        android:fromYDelta=\"0.0\"\n        android:interpolator=\"@android:anim/decelerate_interpolator\"\n        android:toYDelta=\"100.0%p\" />\n\n</set>"
  },
  {
    "path": "app/src/main/res/anim/roll_up.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<set xmlns:android=\"http://schemas.android.com/apk/res/android\">\n\n    <translate\n        android:duration=\"300\"\n        android:fromYDelta=\"100.0%p\"\n        android:interpolator=\"@android:anim/decelerate_interpolator\"\n        android:toYDelta=\"0.0\" />\n\n</set>"
  },
  {
    "path": "app/src/main/res/anim/slide_in_bottom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<set xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:interpolator=\"@android:interpolator/accelerate_decelerate\"\n   >\n\n    <translate\n        android:duration=\"@android:integer/config_mediumAnimTime\"\n        android:fromYDelta=\"100%p\"\n        android:toYDelta=\"0\" />\n\n    <alpha\n        android:duration=\"@android:integer/config_mediumAnimTime\"\n        android:fromAlpha=\"0.95\"\n        android:toAlpha=\"1\" />\n\n</set>"
  },
  {
    "path": "app/src/main/res/anim/slide_out_bottom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<set xmlns:android=\"http://schemas.android.com/apk/res/android\" >\n\n    <translate\n        android:duration=\"@android:integer/config_mediumAnimTime\"\n        android:fromYDelta=\"0\"\n        android:toYDelta=\"100%p\" />\n\n    <alpha\n        android:duration=\"@android:integer/config_mediumAnimTime\"\n        android:fromAlpha=\"1\"\n        android:toAlpha=\"0.95\" />\n\n</set>"
  },
  {
    "path": "app/src/main/res/drawable/bg_color_white_corners_10.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<shape xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:dither=\"true\"\n    android:shape=\"rectangle\">\n\n    <solid android:color=\"@color/white\" />\n    <corners android:radius=\"@dimen/padding_size_10\" />\n\n</shape>\n"
  },
  {
    "path": "app/src/main/res/layout/activity_login.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    android:fitsSystemWindows=\"true\"\n    android:orientation=\"vertical\">\n\n    <android.support.v7.widget.Toolbar\n        android:id=\"@+id/tool_bar\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:background=\"?attr/colorPrimary\"\n        android:minHeight=\"?attr/actionBarSize\" />\n\n    <EditText\n        android:id=\"@+id/set_user_name\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginLeft=\"18dp\"\n        android:layout_marginRight=\"18dp\"\n        android:layout_marginTop=\"40dp\" />\n\n    <EditText\n        android:id=\"@+id/set_pwd\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginLeft=\"18dp\"\n        android:layout_marginRight=\"18dp\"\n        android:layout_marginTop=\"20dp\" />\n\n    <LinearLayout\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginLeft=\"18dp\"\n        android:layout_marginRight=\"18dp\"\n        android:layout_marginTop=\"20dp\"\n        android:orientation=\"horizontal\">\n\n        <EditText\n            android:id=\"@+id/set_verify_code\"\n            android:layout_width=\"0dp\"\n            android:layout_height=\"wrap_content\"\n            android:layout_weight=\"1\" />\n\n        <TextView\n            android:id=\"@+id/get_verify_code\"\n            android:layout_width=\"50dp\"\n            android:layout_height=\"wrap_content\"\n            android:layout_gravity=\"center_vertical\"\n            android:text=\"获取验证码\" />\n    </LinearLayout>\n\n    <TextView\n        android:id=\"@+id/tv_login\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginLeft=\"18dp\"\n        android:layout_marginRight=\"18dp\"\n        android:layout_marginTop=\"35dp\"\n        android:gravity=\"center\"\n        android:paddingBottom=\"8dp\"\n        android:paddingTop=\"8dp\"\n        android:text=\"登录\"\n        android:textSize=\"17sp\" />\n\n</LinearLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/activity_main.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:id=\"@+id/activity_main\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    tools:context=\"com.wjj.easy.easyandroidHelper.module.main.MainActivity\">\n\n    <android.support.v7.widget.Toolbar\n        android:id=\"@+id/tool_bar\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:background=\"?attr/colorPrimary\"\n        android:minHeight=\"?attr/actionBarSize\" />\n\n    <android.support.design.widget.TabLayout\n        android:id=\"@+id/tab_layout\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:layout_alignParentBottom=\"true\"\n        app:tabGravity=\"fill\"\n        app:tabIndicatorHeight=\"0dp\"\n        app:tabMode=\"fixed\"\n        app:tabPaddingBottom=\"-5dp\" />\n\n    <android.support.v4.view.ViewPager\n        android:id=\"@+id/view_pager\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        android:layout_above=\"@id/tab_layout\"\n        android:layout_below=\"@id/tool_bar\" />\n\n</RelativeLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/dialog_loading.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:layout_width=\"wrap_content\"\n    android:layout_height=\"wrap_content\"\n    android:background=\"@drawable/bg_color_white_corners_10\"\n    android:orientation=\"horizontal\"\n    android:paddingBottom=\"@dimen/padding_size_15\"\n    android:paddingLeft=\"@dimen/padding_size_25\"\n    android:paddingRight=\"@dimen/padding_size_25\"\n    android:paddingTop=\"@dimen/padding_size_15\">\n\n    <TextView\n        android:id=\"@+id/tv_loading_text\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_gravity=\"center_vertical\"\n        android:text=\"@string/app_loading\"\n        android:textColor=\"@color/tab_text_normal\"\n        android:textSize=\"@dimen/text_16sp\" />\n\n</LinearLayout>"
  },
  {
    "path": "app/src/main/res/layout/fragment_home.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:layout_width=\"match_parent\"\n    android:background=\"@color/color_f0f3f8\"\n    android:layout_height=\"match_parent\"\n    android:orientation=\"vertical\">\n\n    <android.support.v7.widget.RecyclerView\n        android:id=\"@+id/rv_list\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"/>\n</LinearLayout>"
  },
  {
    "path": "app/src/main/res/layout/fragment_my.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:fresco=\"http://schemas.android.com/apk/res-auto\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    android:background=\"@color/grey\"\n    android:orientation=\"vertical\">\n\n    <com.facebook.drawee.view.SimpleDraweeView\n        android:id=\"@+id/my_image_view\"\n        android:layout_width=\"130dp\"\n        android:layout_height=\"130dp\"\n        fresco:placeholderImage=\"@mipmap/ic_launcher\" />\n\n</LinearLayout>"
  },
  {
    "path": "app/src/main/res/layout/home_list_item.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:id=\"@+id/ll_item_collection_list_root\"\n    android:fitsSystemWindows=\"true\"\n    android:background=\"@color/white\"\n    android:orientation=\"horizontal\"\n    android:padding=\"10dp\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\">\n\n    <RelativeLayout\n        android:layout_width=\"85dp\"\n        android:layout_height=\"85dp\"\n        android:layout_marginLeft=\"5dp\"\n        android:layout_marginRight=\"15dp\">\n\n    <com.facebook.drawee.view.SimpleDraweeView\n        xmlns:fresco=\"http://schemas.android.com/apk/res-auto\"\n        android:id=\"@+id/dv_img\"\n        android:layout_width=\"85dp\"\n        android:layout_height=\"85dp\"\n        fresco:placeholderImage=\"@mipmap/default_ad_square\"\n      />\n\n        <TextView\n            android:id=\"@+id/tv_label\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:gravity=\"center_horizontal\"\n            android:paddingBottom=\"2dp\"\n            android:paddingTop=\"2dp\"\n            android:background=\"#90000000\"\n            android:text=\"宝约优选\"\n            android:textSize=\"14sp\"\n            android:layout_alignParentBottom=\"true\"\n            android:textColor=\"@color/white\"/>\n    </RelativeLayout>\n\n    <RelativeLayout\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginTop=\"8dp\">\n\n\n        <TextView\n            android:id=\"@+id/tv_name\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:ellipsize=\"end\"\n            android:maxLines=\"1\"\n            android:text=\"一场前所未有的浸没\"\n            android:textColor=\"#2d2f39\"\n            android:textSize=\"14sp\"\n            android:drawableRight=\"@mipmap/icon_vip_all\"\n            android:drawablePadding=\"5dp\"\n            />\n\n\n        <TextView\n            android:id=\"@+id/tv_date\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_below=\"@id/tv_name\"\n            android:layout_marginTop=\"8dp\"\n            android:maxLines=\"1\"\n            android:text=\"2017.01.16\"\n            android:textColor=\"#aaaaaa\"\n            android:textSize=\"12sp\" />\n\n        <TextView\n            android:id=\"@+id/tv_city\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_alignTop=\"@id/tv_date\"\n            android:layout_marginLeft=\"20dp\"\n            android:layout_toRightOf=\"@id/tv_date\"\n            android:text=\"上海市\"\n            android:textColor=\"#aaaaaa\"\n            android:textSize=\"12sp\" />\n\n        <TextView\n            android:id=\"@+id/tv_price\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_below=\"@+id/tv_city\"\n            android:layout_marginTop=\"8dp\"\n            android:text=\"8,999\"\n            android:textColor=\"#ff5a00\"\n            android:textSize=\"14sp\" />\n\n        <TextView\n            android:id=\"@+id/tv_price_y\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_alignBottom=\"@id/tv_price\"\n            android:layout_marginLeft=\"2dp\"\n            android:layout_toRightOf=\"@id/tv_price\"\n            android:text=\"元\"\n            android:textColor=\"#aaaaaa\"\n            android:textSize=\"12sp\" />\n\n        <TextView\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:id=\"@+id/tv_member_price\"\n            android:layout_marginLeft=\"25dp\"\n            android:text=\"会员价格：8,000 元\"\n            android:textColor=\"#ff8a26\"\n            android:textSize=\"12sp\"\n            android:layout_alignBottom=\"@+id/tv_price\"\n            android:layout_toRightOf=\"@+id/tv_price\"/>\n\n    </RelativeLayout>\n\n</LinearLayout>"
  },
  {
    "path": "app/src/main/res/layout/view_main_tab.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\">\n\n    <LinearLayout\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_centerInParent=\"true\"\n        android:orientation=\"vertical\">\n\n        <ImageView\n            android:id=\"@+id/tab_icon_iv\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_gravity=\"center_horizontal\" />\n\n        <TextView\n            android:id=\"@+id/tab_title_tv\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_gravity=\"center_horizontal\" />\n    </LinearLayout>\n</RelativeLayout>"
  },
  {
    "path": "app/src/main/res/values/colors.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <color name=\"colorPrimary\">#00bcd4</color>\n    <color name=\"colorPrimaryDark\">#00bcd4</color>\n    <color name=\"colorAccent\">#ff4081</color>\n    <color name=\"white\">#ffffff</color>\n    <color name=\"grey\">#9e9e9e</color>\n    <color name=\"black\">#000000</color>\n\n    <color name=\"color_f0f3f8\">#f0f3f8</color>\n    <color name=\"tab_text_normal\">#90909b</color>\n</resources>\n"
  },
  {
    "path": "app/src/main/res/values/dimens.xml",
    "content": "<resources>\n    <!-- Default screen margins, per the Android Design guidelines. -->\n    <dimen name=\"activity_horizontal_margin\">16dp</dimen>\n    <dimen name=\"activity_vertical_margin\">16dp</dimen>\n\n    <!-- 四类字体大小 -->\n    <dimen name=\"text_08sp\">8sp</dimen>\n    <dimen name=\"text_09sp\">9sp</dimen>\n    <dimen name=\"text_10sp\">10sp</dimen>\n    <dimen name=\"text_11sp\">11sp</dimen>\n    <dimen name=\"text_12sp\">12sp</dimen>\n    <dimen name=\"text_13sp\">13sp</dimen>\n    <dimen name=\"text_14sp\">14sp</dimen>\n    <dimen name=\"text_15sp\">15sp</dimen>\n    <dimen name=\"text_16sp\">16sp</dimen>\n    <dimen name=\"text_17sp\">17sp</dimen>\n    <dimen name=\"text_18sp\">18sp</dimen>\n    <dimen name=\"text_20sp\">20sp</dimen>\n    <dimen name=\"text_22sp\">22sp</dimen>\n    <dimen name=\"text_23sp\">23sp</dimen>\n    <dimen name=\"text_24sp\">24sp</dimen>\n    <dimen name=\"text_25sp\">25sp</dimen>\n    <dimen name=\"text_30sp\">30sp</dimen>\n    <dimen name=\"text_34sp\">34sp</dimen>\n    <dimen name=\"text_35sp\">35sp</dimen>\n    <dimen name=\"text_39sp\">39sp</dimen>\n    <dimen name=\"text_40sp\">40sp</dimen>\n    <dimen name=\"text_45sp\">45sp</dimen>\n    <dimen name=\"text_50sp\">50sp</dimen>\n    <dimen name=\"text_72sp\">72sp</dimen>\n    <dimen name=\"text_100sp\">100sp</dimen>\n    <dimen name=\"text_145sp\">145sp</dimen>\n    <dimen name=\"text_150sp\">150sp</dimen>\n\n\n    <!-- 基本内边距 -->\n    <dimen name=\"padding_size_01\">1dp</dimen>\n    <dimen name=\"padding_size_01px\">1px</dimen>\n    <dimen name=\"padding_size_02\">2dp</dimen>\n    <dimen name=\"padding_size_03\">3dp</dimen>\n    <dimen name=\"padding_size_04\">4dp</dimen>\n    <dimen name=\"padding_size_05\">5dp</dimen>\n    <dimen name=\"padding_size_06\">6dp</dimen>\n    <dimen name=\"padding_size_07\">7dp</dimen>\n    <dimen name=\"padding_size_08\">8dp</dimen>\n    <dimen name=\"padding_size_09\">9dp</dimen>\n    <dimen name=\"padding_size_10\">10dp</dimen>\n    <dimen name=\"padding_size_11\">11dp</dimen>\n    <dimen name=\"padding_size_12\">12dp</dimen>\n    <dimen name=\"padding_size_13\">13dp</dimen>\n    <dimen name=\"padding_size_14\">14dp</dimen>\n    <dimen name=\"padding_size_15\">15dp</dimen>\n    <dimen name=\"padding_size_16\">16dp</dimen>\n    <dimen name=\"padding_size_17\">17dp</dimen>\n    <dimen name=\"padding_size_18\">18dp</dimen>\n    <dimen name=\"padding_size_19\">19dp</dimen>\n    <dimen name=\"padding_size_20\">20dp</dimen>\n    <dimen name=\"padding_size_21\">21dp</dimen>\n    <dimen name=\"padding_size_22\">22dp</dimen>\n    <dimen name=\"padding_size_23\">23dp</dimen>\n    <dimen name=\"padding_size_24\">24dp</dimen>\n    <dimen name=\"padding_size_25\">25dp</dimen>\n    <dimen name=\"padding_size_26\">26dp</dimen>\n    <dimen name=\"padding_size_27\">27dp</dimen>\n    <dimen name=\"padding_size_28\">28dp</dimen>\n    <dimen name=\"padding_size_29\">29dp</dimen>\n    <dimen name=\"padding_size_30\">30dp</dimen>\n    <dimen name=\"padding_size_32\">32dp</dimen>\n    <dimen name=\"padding_size_33\">33dp</dimen>\n    <dimen name=\"padding_size_35\">35dp</dimen>\n    <dimen name=\"padding_size_36\">36dp</dimen>\n    <dimen name=\"padding_size_39\">39dp</dimen>\n    <dimen name=\"padding_size_40\">40dp</dimen>\n    <dimen name=\"padding_size_42\">42dp</dimen>\n    <dimen name=\"padding_size_44\">44dp</dimen>\n    <dimen name=\"padding_size_45\">45dp</dimen>\n    <dimen name=\"padding_size_46\">46dp</dimen>\n    <dimen name=\"padding_size_47\">47dp</dimen>\n    <dimen name=\"padding_size_48\">48dp</dimen>\n    <dimen name=\"padding_size_50\">50dp</dimen>\n    <dimen name=\"padding_size_51\">51dp</dimen>\n    <dimen name=\"padding_size_55\">55dp</dimen>\n    <dimen name=\"padding_size_56\">56dp</dimen>\n    <dimen name=\"padding_size_58\">58dp</dimen>\n    <dimen name=\"padding_size_60\">60dp</dimen>\n    <dimen name=\"padding_size_63\">63dp</dimen>\n    <dimen name=\"padding_size_65\">65dp</dimen>\n    <dimen name=\"padding_size_68\">68dp</dimen>\n    <dimen name=\"padding_size_70\">70dp</dimen>\n    <dimen name=\"padding_size_72\">72dp</dimen>\n    <dimen name=\"padding_size_73\">73dp</dimen>\n    <dimen name=\"padding_size_75\">75dp</dimen>\n    <dimen name=\"padding_size_78\">78dp</dimen>\n    <dimen name=\"padding_size_80\">80dp</dimen>\n    <dimen name=\"padding_size_85\">85dp</dimen>\n    <dimen name=\"padding_size_88\">88dp</dimen>\n    <dimen name=\"padding_size_90\">90dp</dimen>\n    <dimen name=\"padding_size_95\">95dp</dimen>\n    <dimen name=\"padding_size_98\">98dp</dimen>\n    <dimen name=\"padding_size_100\">100dp</dimen>\n    <dimen name=\"padding_size_107\">107dp</dimen>\n    <dimen name=\"padding_size_110\">110dp</dimen>\n    <dimen name=\"padding_size_112\">112dp</dimen>\n    <dimen name=\"padding_size_135\">135dp</dimen>\n    <dimen name=\"padding_size_140\">140dp</dimen>\n    <dimen name=\"padding_size_148\">148dp</dimen>\n    <dimen name=\"padding_size_150\">150dp</dimen>\n    <dimen name=\"padding_size_151\">151dp</dimen>\n    <dimen name=\"padding_size_160\">160dp</dimen>\n    <dimen name=\"padding_size_165\">165dp</dimen>\n    <dimen name=\"padding_size_170\">170dp</dimen>\n    <dimen name=\"padding_size_190\">190dp</dimen>\n    <dimen name=\"padding_size_200\">200dp</dimen>\n    <dimen name=\"padding_size_210\">210dp</dimen>\n    <dimen name=\"padding_size_215\">215dp</dimen>\n    <dimen name=\"padding_size_220\">220dp</dimen>\n    <dimen name=\"padding_size_225\">225dp</dimen>\n    <dimen name=\"padding_size_228\">228dp</dimen>\n    <dimen name=\"padding_size_250\">250dp</dimen>\n    <dimen name=\"padding_size_260\">260dp</dimen>\n    <dimen name=\"padding_size_275\">275dp</dimen>\n    <dimen name=\"padding_size_300\">300dp</dimen>\n    <dimen name=\"padding_size_332\">332dp</dimen>\n    <dimen name=\"padding_size_350\">350dp</dimen>\n    <dimen name=\"padding_size_400\">400dp</dimen>\n    <dimen name=\"padding_size_500\">500dp</dimen>\n    <dimen name=\"padding_size_540\">540dp</dimen>\n\n</resources>\n"
  },
  {
    "path": "app/src/main/res/values/strings.xml",
    "content": "<resources>\n    <string name=\"app_name\">EasyAndroid</string>\n    <string name=\"home_tab\">首页</string>\n    <string name=\"my_tab\">我的</string>\n    <string name=\"app_loading\">加载中...</string>\n</resources>\n"
  },
  {
    "path": "app/src/main/res/values/styles.xml",
    "content": "<resources>\n\n    <!-- Base application theme. -->\n    <style name=\"AppTheme\" parent=\"Theme.AppCompat.Light.NoActionBar\">\n        <!-- Customize your theme here. -->\n        <item name=\"colorPrimary\">@color/colorPrimary</item>\n        <item name=\"colorPrimaryDark\">@color/colorPrimaryDark</item>\n        <item name=\"colorAccent\">@color/colorAccent</item>\n    </style>\n\n    <!-- Style for custom dialog theme -->\n    <style name=\"dialog_custom_roll_up_down\" parent=\"@android:style/Theme.Dialog\">\n        <item name=\"android:windowFrame\">@null</item>\n        <item name=\"android:windowIsFloating\">true</item>\n        <item name=\"android:windowIsTranslucent\">true</item>\n        <item name=\"android:windowNoTitle\">true</item>\n        <item name=\"android:background\">@android:color/transparent</item>\n        <item name=\"android:windowBackground\">@android:color/transparent</item>\n        <item name=\"android:backgroundDimEnabled\">true</item>\n        <item name=\"android:backgroundDimAmount\">0.4</item>\n        <item name=\"android:windowAnimationStyle\">@style/roll_up_down_anim_style</item>\n    </style>\n\n    <!-- Style for dialog loading theme -->\n    <style name=\"customDialog_loading\" parent=\"@android:style/Theme.Dialog\">\n        <item name=\"android:windowIsTranslucent\">true</item>\n        <item name=\"android:windowNoTitle\">true</item>\n        <item name=\"android:background\">@android:color/transparent</item>\n        <item name=\"android:windowBackground\">@android:color/transparent</item>\n        <item name=\"android:backgroundDimEnabled\">true</item>\n        <item name=\"android:backgroundDimAmount\">0.4</item>\n    </style>\n\n    <style name=\"roll_up_down_anim_style\" parent=\"android:Animation.Translucent\">\n        <!-- 进入时的动画 -->\n        <item name=\"@android:windowEnterAnimation\">@anim/roll_up</item>\n        <!-- 退出时的动画 -->\n        <item name=\"@android:windowExitAnimation\">@anim/roll_down</item>\n    </style>\n</resources>\n"
  },
  {
    "path": "app/src/main/res/values-v21/styles.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n\n    <style name=\"AppTheme_1\" parent=\"Theme.AppCompat.Light.NoActionBar\">\n        <item name=\"colorAccent\">@color/colorAccent</item>\n        <item name=\"android:statusBarColor\">@color/colorAccent</item>\n    </style>\n</resources>"
  },
  {
    "path": "app/src/main/res/values-w820dp/dimens.xml",
    "content": "<resources>\n    <!-- Example customization of dimensions originally defined in res/values/dimens.xml\n         (such as screen margins) for screens with more than 820dp of available width. This\n         would include 7\" and 10\" devices in landscape (~960dp and ~1280dp respectively). -->\n    <dimen name=\"activity_horizontal_margin\">64dp</dimen>\n</resources>\n"
  },
  {
    "path": "build.gradle",
    "content": "// Top-level build file where you can add configuration options common to all sub-projects/modules.\n\nbuildscript {\n    repositories {\n        jcenter()\n        mavenCentral()\n    }\n    dependencies {\n        classpath 'com.android.tools.build:gradle:2.2.3'\n        classpath 'com.neenbedankt.gradle.plugins:android-apt:1.4'\n        classpath 'com.jakewharton:butterknife-gradle-plugin:8.5.1'\n        // NOTE: Do not place your application dependencies here; they belong\n        // in the individual module build.gradle files\n        classpath 'com.jfrog.bintray.gradle:gradle-bintray-plugin:1.7'\n        classpath 'com.github.dcendents:android-maven-gradle-plugin:1.5'\n    }\n}\n\nallprojects {\n    repositories {\n        jcenter()\n        maven { url \"https://jitpack.io\" }\n        mavenCentral()\n    }\n}\n\ntask clean(type: Delete) {\n    delete rootProject.buildDir\n}\n\n// Define versions in a single place\next {\n    // Sdk and tools\n    minSdkVersion = 19\n    targetSdkVersion = 25\n    compileSdkVersion = 25\n    buildToolsVersion = '25.0.2'\n    applicationId = \"com.wjj.easy.easyandroidHelper\"\n\n    // App dependencies\n    supportLibraryVersion = '25.2.0'\n    retrofit2 = '2.2.0'\n    okhttp3 = '3.4.1'\n    persistentCookieJar = 'v1.0.1'\n    fresco = '1.2.0'\n    dagger2 = '2.0.2'\n    annotation = '10.0-b28'\n    butterknife = '8.5.1'\n    utilcode = '1.3.7'\n    orhanobutLogger = '1.15'\n    baseRecyclerViewAdapterHelper = '2.9.9'\n}"
  },
  {
    "path": "easyandroid/.gitignore",
    "content": "/build\n"
  },
  {
    "path": "easyandroid/build.gradle",
    "content": "apply plugin: 'com.android.library'\napply plugin: 'com.neenbedankt.android-apt'\n\nandroid {\n    compileSdkVersion rootProject.ext.compileSdkVersion\n    buildToolsVersion rootProject.ext.buildToolsVersion\n\n    defaultConfig {\n        minSdkVersion rootProject.ext.minSdkVersion\n        targetSdkVersion rootProject.ext.targetSdkVersion\n        versionCode 1\n        versionName \"1.0\"\n\n    }\n\n    buildTypes {\n        release {\n            minifyEnabled false\n            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'\n        }\n    }\n}\n\ndependencies {\n    compile fileTree(dir: 'libs', include: ['*.jar'])\n    //support lib\n    compile \"com.android.support:appcompat-v7:$rootProject.supportLibraryVersion\"\n    compile \"com.android.support:design:$rootProject.supportLibraryVersion\"\n    //retrofit2\n    compile \"com.squareup.retrofit2:retrofit:$rootProject.retrofit2\"\n    compile \"com.squareup.retrofit2:converter-gson:$rootProject.retrofit2\"\n    //okhttp3\n    compile \"com.squareup.okhttp3:okhttp:$rootProject.okhttp3\"\n    compile \"com.squareup.okhttp3:logging-interceptor:$rootProject.okhttp3\"\n    //persistentCookieJar\n    compile \"com.github.franmontiel:PersistentCookieJar:$rootProject.persistentCookieJar\"\n    //fresco\n    compile \"com.facebook.fresco:fresco:$rootProject.fresco\"\n    compile \"com.facebook.fresco:imagepipeline-okhttp3:$rootProject.fresco\"\n    //dagger2\n    apt \"com.google.dagger:dagger-compiler:$rootProject.dagger2\"\n    compile \"com.google.dagger:dagger:$rootProject.dagger2\"\n    compile \"com.google.dagger:dagger-compiler:$rootProject.dagger2\"\n    compile \"org.glassfish:javax.annotation:$rootProject.annotation\"\n    //recyclerViewAdapter\n    compile \"com.github.CymChad:BaseRecyclerViewAdapterHelper:$rootProject.baseRecyclerViewAdapterHelper\"\n    //utilcode\n    compile \"com.blankj:utilcode:$rootProject.utilcode\"\n    //logger\n    compile \"com.orhanobut:logger:$rootProject.orhanobutLogger\"\n}\n\next {\n    bintrayRepo = 'maven'////bintray上的仓库名，一般为maven\n    bintrayName = 'EasyAndroid'//bintray上的项目名\n\n    publishedGroupId = 'com.wjj.easy'//JCenter的GroupId\n    artifact = 'easyandroid'//JCenter的ArtifactId\n\n    siteUrl = 'https://github.com/wu928320442/EasyAndroid.git'\n    gitUrl = 'https://github.com/wu928320442/EasyAndroid.git'\n\n    libraryVersion = '1.0.0'//版本号\n    libraryName = 'easyandroid'//项目名字，没什么用\n    libraryDescription = 'A lib for Android'//项目描述，没什么用\n\n    //开发者信息\n    developerId = 'juju'\n    developerName = 'juju'\n    developerEmail = 'wujiajun311@gmail.com'\n\n    //以上所有信息自行修改，以下不变\n\n    licenseName = 'The Apache Software License, Version 2.0'\n    licenseUrl = 'http://www.apache.org/licenses/LICENSE-2.0.txt'\n    allLicenses = [\"Apache-2.0\"]\n}\napply from:'https://cdn.rawgit.com/Jude95/JCenter/master/install.gradle'\napply from:'https://cdn.rawgit.com/Jude95/JCenter/master/bintray.gradle'"
  },
  {
    "path": "easyandroid/proguard-rules.pro",
    "content": "# Add project specific ProGuard rules here.\n# By default, the flags in this file are appended to flags specified\n# in /Users/wujiajun/Library/Android/sdk/tools/proguard/proguard-android.txt\n# You can edit the include path and order by changing the proguardFiles\n# directive in build.gradle.\n#\n# For more details, see\n#   http://developer.android.com/guide/developing/tools/proguard.html\n\n# Add any project specific keep options here:\n\n# If your project uses WebView with JS, uncomment the following\n# and specify the fully qualified class name to the JavaScript interface\n# class:\n#-keepclassmembers class fqcn.of.javascript.interface.for.webview {\n#   public *;\n#}\n\n#retrofit2\n-dontwarn retrofit2.**\n-keep class retrofit2.** { *; }\n-keepattributes Signature\n-keepattributes Exceptions\n#utilcode\n-keep class com.blankj.utilcode.** { *; }\n-keepclassmembers class com.blankj.utilcode.** { *; }\n-dontwarn com.blankj.utilcode.**"
  },
  {
    "path": "easyandroid/src/main/AndroidManifest.xml",
    "content": "<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    package=\"com.wjj.easy.easyandroid\">\n\n    <application android:allowBackup=\"true\" android:label=\"@string/app_name\"\n        android:supportsRtl=\"true\">\n\n    </application>\n\n</manifest>\n"
  },
  {
    "path": "easyandroid/src/main/java/com/wjj/easy/easyandroid/http/Http.java",
    "content": "package com.wjj.easy.easyandroid.http;\n\nimport com.franmontiel.persistentcookiejar.ClearableCookieJar;\nimport com.wjj.easy.easyandroid.BuildConfig;\n\nimport java.util.ArrayList;\nimport java.util.concurrent.TimeUnit;\n\nimport okhttp3.Interceptor;\nimport okhttp3.OkHttpClient;\nimport okhttp3.logging.HttpLoggingInterceptor;\nimport retrofit2.Call;\nimport retrofit2.Callback;\nimport retrofit2.Response;\nimport retrofit2.Retrofit;\nimport retrofit2.converter.gson.GsonConverterFactory;\n\n\n/**\n * HTTP网络配置\n * 1.OkHttpClient配置\n * 2.Retrofit配置\n * 3.Builder构建初始化数据\n * Created by wujiajun on 17/4/5.\n */\npublic class Http {\n\n    private static final boolean DEBUG = /*BuildConfig.DEBUG*/true;\n\n    private HttpBuilder mBuilder;\n    private OkHttpClient mClient;\n    private Retrofit mRetrofit;\n\n    public Http(HttpBuilder builder) {\n        mBuilder = builder;\n        configOKHttp();\n        configRetrofit();\n    }\n\n    private void configOKHttp() {\n        HttpLoggingInterceptor loggingInterceptor = new HttpLoggingInterceptor();\n        loggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY);\n\n        OkHttpClient.Builder builder = new OkHttpClient.Builder();\n        if (DEBUG) {\n            builder.addInterceptor(loggingInterceptor);\n        }\n        for (Interceptor interceptor : mBuilder.interceptors) {\n            builder.addInterceptor(interceptor);\n        }\n        mClient = builder.retryOnConnectionFailure(true)\n                .connectTimeout(mBuilder.timeout, TimeUnit.SECONDS)\n                .cookieJar(mBuilder.cookieJar).build();\n    }\n\n    private void configRetrofit() {\n        mRetrofit = new Retrofit.Builder()\n                .baseUrl(mBuilder.baseUrl)\n                .client(mClient)\n                .addConverterFactory(GsonConverterFactory.create())\n                .build();\n    }\n\n    /**\n     * HTTP响应回调\n     *\n     * @param <T> 响应Bean\n     */\n    public interface HttpCallback<T> {\n        /**\n         * 成功响应\n         *\n         * @param t 响应Bean\n         */\n        void onResponse(T t);\n\n        /**\n         * 失败响应\n         *\n         * @param t 异常\n         */\n        void onFailure(Throwable t);\n    }\n\n    /**\n     * Retrofit2 Callback缺省实现\n     * 转换业务接口返回数据\n     *\n     * @param <T>\n     */\n    public static class CallbackDefault<T> implements Callback<T> {\n\n        HttpCallback<T> httpCallback;\n\n        public CallbackDefault(HttpCallback<T> httpCallback) {\n            this.httpCallback = httpCallback;\n        }\n\n        @Override\n        public void onResponse(Call<T> call, Response<T> response) {\n            httpCallback.onResponse(response.body());\n        }\n\n        @Override\n        public void onFailure(Call<T> call, Throwable t) {\n            httpCallback.onFailure(t);\n        }\n    }\n\n    /**\n     * HTTP 构建类\n     */\n    public static final class HttpBuilder {\n        private String baseUrl;\n        private ClearableCookieJar cookieJar;\n        private long timeout;\n        private ArrayList<Interceptor> interceptors = new ArrayList<Interceptor>();\n\n        public HttpBuilder setBaseUrl(String baseUrl) {\n            this.baseUrl = baseUrl;\n            return this;\n        }\n\n        public HttpBuilder setCookieJar(ClearableCookieJar cookieJar) {\n            this.cookieJar = cookieJar;\n            return this;\n        }\n\n        public HttpBuilder setTimeout(long timeout) {\n            this.timeout = timeout;\n            return this;\n        }\n\n        public HttpBuilder addInterceptor(Interceptor interceptor) {\n            interceptors.add(interceptor);\n            return this;\n        }\n\n        public Http build() {\n            return new Http(this);\n        }\n    }\n\n    public Retrofit getRetrofit() {\n        return mRetrofit;\n    }\n\n    public OkHttpClient getClient() {\n        return mClient;\n    }\n}\n"
  },
  {
    "path": "easyandroid/src/main/java/com/wjj/easy/easyandroid/mvp/EasyBasePresenter.java",
    "content": "package com.wjj.easy.easyandroid.mvp;\n\n/**\n * MVP Presenter层基类\n * 适用范围：在Activity使用\n * Created by wujiajun on 17/4/6.\n */\npublic interface EasyBasePresenter<V extends EasyBaseView> {\n    void start();\n    void attachView(V view);\n}\n"
  },
  {
    "path": "easyandroid/src/main/java/com/wjj/easy/easyandroid/mvp/EasyBasePresenterFrg.java",
    "content": "package com.wjj.easy.easyandroid.mvp;\n\n/**\n * MVP Presenter层基类\n * 适用范围：Fragment中使用\n * Created by wujiajun on 17/4/13.\n */\npublic interface EasyBasePresenterFrg extends EasyBasePresenter {\n    void setupListeners();\n}\n"
  },
  {
    "path": "easyandroid/src/main/java/com/wjj/easy/easyandroid/mvp/EasyBaseView.java",
    "content": "package com.wjj.easy.easyandroid.mvp;\n\n/**\n * MVP View层基类\n * 适用范围：在Activity使用\n * Created by wujiajun on 17/4/6.\n */\npublic interface EasyBaseView {\n\n}\n"
  },
  {
    "path": "easyandroid/src/main/java/com/wjj/easy/easyandroid/mvp/EasyBaseViewFrg.java",
    "content": "package com.wjj.easy.easyandroid.mvp;\n\n/**\n * MVP View层基类\n * 适用范围：在Fragment使用\n * Created by wujiajun on 17/4/13.\n */\npublic interface EasyBaseViewFrg extends EasyBaseView {\n//    void setPresenter(T presenter);\n}\n"
  },
  {
    "path": "easyandroid/src/main/java/com/wjj/easy/easyandroid/mvp/di/components/ActivityComponent.java",
    "content": "package com.wjj.easy.easyandroid.mvp.di.components;\n\nimport android.app.Activity;\n\nimport com.wjj.easy.easyandroid.mvp.di.modules.ActivityModule;\nimport com.wjj.easy.easyandroid.mvp.di.scopes.ActivityScope;\n\nimport dagger.Component;\n\n/**\n * Activity注射组件\n *\n * @author wujiajun\n */\n@ActivityScope\n@Component(dependencies = AppComponent.class, modules = {ActivityModule.class})\npublic interface ActivityComponent {\n\n    /**\n     * 获取注入的Activity\n     *\n     * @return Activity\n     */\n    Activity getActivity();\n}\n"
  },
  {
    "path": "easyandroid/src/main/java/com/wjj/easy/easyandroid/mvp/di/components/AppComponent.java",
    "content": "package com.wjj.easy.easyandroid.mvp.di.components;\n\nimport android.content.Context;\n\nimport com.wjj.easy.easyandroid.mvp.di.modules.AppModule;\nimport com.wjj.easy.easyandroid.mvp.di.scopes.ApplicationScope;\n\nimport javax.inject.Singleton;\n\nimport dagger.Component;\n\n/**\n * Application注射组件\n *\n * @author wujiajun\n */\n@ApplicationScope\n@Component(modules = {AppModule.class})\npublic interface AppComponent {\n\n    Context getContext();\n\n}\n"
  },
  {
    "path": "easyandroid/src/main/java/com/wjj/easy/easyandroid/mvp/di/components/FragmentComponent.java",
    "content": "package com.wjj.easy.easyandroid.mvp.di.components;\n\nimport android.app.Activity;\nimport android.support.v4.app.Fragment;\n\nimport com.wjj.easy.easyandroid.mvp.di.modules.FragmentModule;\nimport com.wjj.easy.easyandroid.mvp.di.scopes.FragmentScope;\n\nimport dagger.Component;\n\n/**\n * Fragment注射组件\n *\n * @author wujiajun\n */\n@FragmentScope\n@Component(modules = FragmentModule.class)\npublic interface FragmentComponent {\n//    /**\n//     * 获取注入的Fragment\n//     *\n//     * @return\n//     */\n//    Fragment getFragment();\n\n    Activity getActivity();\n}\n"
  },
  {
    "path": "easyandroid/src/main/java/com/wjj/easy/easyandroid/mvp/di/modules/ActivityModule.java",
    "content": "package com.wjj.easy.easyandroid.mvp.di.modules;\n\nimport android.app.Activity;\n\nimport com.wjj.easy.easyandroid.mvp.di.scopes.ActivityScope;\n\nimport dagger.Module;\nimport dagger.Provides;\n\n/**\n * Activity注入提供者Module\n *\n * @author wujiajun\n */\n@Module\npublic class ActivityModule {\n\n    private final Activity activity;\n\n    public ActivityModule(Activity activity) {\n        this.activity = activity;\n    }\n\n    /**\n     * 提供注入Activity\n     * 注意ActivityScope的作用 所有依赖于ActivityScope的组件都依赖于Activity的生命周期\n     *\n     * @return Activity\n     */\n    @Provides\n    @ActivityScope\n    public Activity provideActivity() {\n        return activity;\n    }\n\n\n}\n"
  },
  {
    "path": "easyandroid/src/main/java/com/wjj/easy/easyandroid/mvp/di/modules/AppModule.java",
    "content": "package com.wjj.easy.easyandroid.mvp.di.modules;\n\nimport android.content.Context;\n\nimport com.wjj.easy.easyandroid.mvp.di.scopes.ApplicationScope;\n\nimport javax.inject.Singleton;\n\nimport dagger.Module;\nimport dagger.Provides;\n\n/**\n * Application注入提供者Module\n *\n * @author wujiajun\n */\n@Module\npublic class AppModule {\n\n    Context context;\n\n    public AppModule(Context context) {\n        this.context = context;\n    }\n\n    @ApplicationScope\n    @Provides\n    public Context provideContext() {\n        return context;\n    }\n\n}\n"
  },
  {
    "path": "easyandroid/src/main/java/com/wjj/easy/easyandroid/mvp/di/modules/FragmentModule.java",
    "content": "package com.wjj.easy.easyandroid.mvp.di.modules;\n\nimport android.app.Activity;\nimport android.support.v4.app.Fragment;\n\nimport com.wjj.easy.easyandroid.mvp.di.scopes.FragmentScope;\n\nimport dagger.Module;\nimport dagger.Provides;\n\n/**\n * Activity注入提供者Module\n *\n * @author wujiajun\n */\n@Module\npublic class FragmentModule {\n    private Fragment fragment;\n\n    public FragmentModule(Fragment fragment) {\n        this.fragment = fragment;\n    }\n\n//    /**\n//     * 提供注入Fragment\n//     * 注意FragmentScope的作用 所有依赖于FragmentScope的组件都依赖于Fragment的生命周期\n//     *\n//     * @return Activity\n//     */\n//    @FragmentScope\n//    @Provides\n//    Fragment provideFragment() {\n//        return fragment;\n//    }\n\n    @Provides\n    @FragmentScope\n    public Activity provideActivity() {\n        return fragment.getActivity();\n    }\n}\n"
  },
  {
    "path": "easyandroid/src/main/java/com/wjj/easy/easyandroid/mvp/di/scopes/ActivityScope.java",
    "content": "package com.wjj.easy.easyandroid.mvp.di.scopes;\n\nimport java.lang.annotation.Retention;\nimport java.lang.annotation.RetentionPolicy;\n\nimport javax.inject.Scope;\n\n/**\n * Activity域注解\n * 目的是管理域内对象的生命周期\n *\n * @author wujiajun\n */\n@Scope\n@Retention(RetentionPolicy.RUNTIME)\npublic @interface ActivityScope {\n}\n"
  },
  {
    "path": "easyandroid/src/main/java/com/wjj/easy/easyandroid/mvp/di/scopes/ApplicationScope.java",
    "content": "package com.wjj.easy.easyandroid.mvp.di.scopes;\n\nimport java.lang.annotation.Retention;\nimport java.lang.annotation.RetentionPolicy;\n\nimport javax.inject.Scope;\n\n/**\n * Application域注解\n * 目的是管理域内对象的生命周期\n *\n * @author wujiajun\n */\n@Scope\n@Retention(RetentionPolicy.RUNTIME)\npublic @interface ApplicationScope {\n}\n"
  },
  {
    "path": "easyandroid/src/main/java/com/wjj/easy/easyandroid/mvp/di/scopes/FragmentScope.java",
    "content": "package com.wjj.easy.easyandroid.mvp.di.scopes;\n\nimport java.lang.annotation.Retention;\nimport java.lang.annotation.RetentionPolicy;\n\nimport javax.inject.Scope;\n\n/**\n * Fragment域注解\n * 目的是管理域内对象的生命周期\n *\n * @author wujiajun\n */\n@Scope\n@Retention(RetentionPolicy.RUNTIME)\npublic @interface FragmentScope {\n}\n"
  },
  {
    "path": "easyandroid/src/main/java/com/wjj/easy/easyandroid/mvp/domain/executor/Executor.java",
    "content": "package com.wjj.easy.easyandroid.mvp.domain.executor;\n\n\nimport com.wjj.easy.easyandroid.mvp.domain.usecases.AbstractUseCase;\n\n/**\n * Executor抽象接口\n * 目的是专门在后台执行任务\n *\n * @author wujiajun\n */\npublic interface Executor {\n\n    /**\n     * 执行用例的方法\n     * 方法会调用用例的run方法，然后调用用例的Start方法，这个方法应该在后台操作，用例可能比较耗时\n     *\n     * @param interactor\n     */\n    void execute(final AbstractUseCase interactor);\n}\n"
  },
  {
    "path": "easyandroid/src/main/java/com/wjj/easy/easyandroid/mvp/domain/executor/MainThread.java",
    "content": "package com.wjj.easy.easyandroid.mvp.domain.executor;\n\n/**\n * MainThread定义了一个能够在主线程使用用例执行的接口\n * 举个例子：如果一个用例需要显示一个对象到UI上，能够使用这个确保run执行的内容是在主线程中\n * @author wujiajun\n */\npublic interface MainThread {\n\n    /**\n     * 执行一个Runnable\n     * 确保Runnable中的内容在主线程中运行\n     *\n     * @param runnable\n     */\n    void post(final Runnable runnable);\n}\n"
  },
  {
    "path": "easyandroid/src/main/java/com/wjj/easy/easyandroid/mvp/domain/executor/impl/MainThreadImpl.java",
    "content": "package com.wjj.easy.easyandroid.mvp.domain.executor.impl;\n\nimport android.os.Handler;\nimport android.os.Looper;\n\nimport com.wjj.easy.easyandroid.mvp.domain.executor.MainThread;\n\n\n/**\n * MainThread具体实现类\n * 确保Runnable中的内容在主线程中执行\n *\n * @author wujiajun\n */\npublic class MainThreadImpl implements MainThread {\n\n    private static MainThread sMainThread;\n\n    private Handler mHandler;\n\n    private MainThreadImpl() {\n        mHandler = new Handler(Looper.getMainLooper());\n    }\n\n    @Override\n    public void post(Runnable runnable) {\n        mHandler.post(runnable);\n    }\n\n    public static MainThread getInstance() {\n        if (sMainThread == null) {\n            sMainThread = new MainThreadImpl();\n        }\n\n        return sMainThread;\n    }\n}\n"
  },
  {
    "path": "easyandroid/src/main/java/com/wjj/easy/easyandroid/mvp/domain/executor/impl/ThreadExecutor.java",
    "content": "package com.wjj.easy.easyandroid.mvp.domain.executor.impl;\n\n\nimport com.wjj.easy.easyandroid.mvp.domain.executor.Executor;\nimport com.wjj.easy.easyandroid.mvp.domain.usecases.AbstractUseCase;\n\nimport java.util.concurrent.BlockingQueue;\nimport java.util.concurrent.LinkedBlockingQueue;\nimport java.util.concurrent.ThreadPoolExecutor;\nimport java.util.concurrent.TimeUnit;\n\n/**\n * Executor具体实现类\n * 实现用例的执行，用例生命周期的更新\n * 注意它是个单例模式\n *\n * @author wujiajun\n */\npublic class ThreadExecutor implements Executor {\n\n    // This is a singleton\n    private static volatile ThreadExecutor sThreadExecutor;\n\n    private static final int CORE_POOL_SIZE = 3;\n    private static final int MAX_POOL_SIZE = 5;\n    private static final int KEEP_ALIVE_TIME = 120;\n    private static final TimeUnit TIME_UNIT = TimeUnit.SECONDS;\n    private static final BlockingQueue<Runnable> WORK_QUEUE = new LinkedBlockingQueue<Runnable>();\n\n    private ThreadPoolExecutor mThreadPoolExecutor;\n\n    private ThreadExecutor() {\n        long keepAlive = KEEP_ALIVE_TIME;\n        mThreadPoolExecutor = new ThreadPoolExecutor(\n                CORE_POOL_SIZE,\n                MAX_POOL_SIZE,\n                keepAlive,\n                TIME_UNIT,\n                WORK_QUEUE);\n    }\n\n    @Override\n    public void execute(final AbstractUseCase interactor) {\n        mThreadPoolExecutor.submit(new Runnable() {\n            @Override\n            public void run() {\n                //执行用例逻辑\n                interactor.run();\n                //更新用例状态\n                interactor.onFinished();\n            }\n        });\n    }\n\n    /**\n     * Executor实例\n     *\n     * @return\n     */\n    public static Executor getInstance() {\n        if (sThreadExecutor == null) {\n            sThreadExecutor = new ThreadExecutor();\n        }\n\n        return sThreadExecutor;\n    }\n}\n"
  },
  {
    "path": "easyandroid/src/main/java/com/wjj/easy/easyandroid/mvp/domain/usecases/AbstractUseCase.java",
    "content": "package com.wjj.easy.easyandroid.mvp.domain.usecases;\n\n\nimport com.wjj.easy.easyandroid.mvp.domain.executor.Executor;\nimport com.wjj.easy.easyandroid.mvp.domain.executor.MainThread;\n\nimport javax.inject.Inject;\n\n/**\n * Domain层中抽象UseCase\n * 实现UseCase的基本操作，生命周期控制\n * 举个例子：当Activity被销毁的时候，我们应该取消掉这个任务 volatile的目的是为了多线程都可以调用\n *\n * @author wujiajun\n */\npublic abstract class AbstractUseCase implements UseCase {\n\n    @Inject\n    protected Executor mThreadExecutor;\n    @Inject\n    protected MainThread mMainThread;\n\n    protected volatile boolean mIsCanceled;\n    protected volatile boolean mIsRunning;\n\n    protected Callback mCallback;\n\n    /**\n     * 业务逻辑实现方法\n     * 别主动调用他，Executor中自动执行调用\n     *\n     * @see Executor\n     */\n    public abstract void run();\n\n    /**\n     * 取消当前任务\n     */\n    public void cancel() {\n        mIsCanceled = true;\n        mIsRunning = false;\n    }\n\n    /**\n     * 检测任务是否正在进行中\n     *\n     * @return true进行中 false处理完成/还没有处理/被取消掉\n     */\n    public boolean isRunning() {\n        return mIsRunning;\n    }\n\n    /**\n     * 完成操作\n     */\n    public void onFinished() {\n        mIsRunning = false;\n        mIsCanceled = false;\n    }\n\n    /**\n     * 执行任务\n     */\n    public void execute() {\n        this.mIsRunning = true;\n        mThreadExecutor.execute(this);\n    }\n\n    /**\n     * 设置任务回调接口\n     *\n     * @param callback\n     */\n    public void setCallback(Callback callback) {\n        this.mCallback = callback;\n    }\n\n    /**\n     * 获取任务回调接口\n     *\n     * @return\n     */\n    public Callback getCallback() {\n        return mCallback;\n    }\n\n\n}\n"
  },
  {
    "path": "easyandroid/src/main/java/com/wjj/easy/easyandroid/mvp/domain/usecases/UseCase.java",
    "content": "package com.wjj.easy.easyandroid.mvp.domain.usecases;\n\n\n/**\n * Domain层中UseCase抽象接口\n *\n * @author wujiajun\n */\npublic interface UseCase {\n\n    /**\n     * UserCase执行方法\n     * 可在任何线程执行\n     */\n    void execute();\n\n    /**\n     * 任务回调通用接口\n     */\n    interface Callback<T> {\n        void success(T t);\n\n        void fail();\n    }\n}\n"
  },
  {
    "path": "easyandroid/src/main/java/com/wjj/easy/easyandroid/ui/EasyActivity.java",
    "content": "package com.wjj.easy.easyandroid.ui;\n\nimport android.os.Bundle;\nimport android.support.annotation.Nullable;\nimport android.support.v7.app.AppCompatActivity;\n\nimport com.orhanobut.logger.Logger;\nimport com.wjj.easy.easyandroid.BuildConfig;\nimport com.wjj.easy.easyandroid.mvp.EasyBaseView;\n\n/**\n * Activity基类\n * Created by wujiajun on 17/4/14.\n */\n\npublic abstract class EasyActivity extends AppCompatActivity implements EasyBaseView {\n\n    private final static String TAG = EasyActivity.class.getSimpleName();\n    private final static boolean DEBUG = BuildConfig.DEBUG;\n\n    @Override\n    protected void onCreate(@Nullable Bundle savedInstanceState) {\n        super.onCreate(savedInstanceState);\n        setContentView(getContentView());\n    }\n\n    @Override\n    protected void onStart() {\n        super.onStart();\n        if (DEBUG) {\n            Logger.t(TAG).d(\"onStart\");\n        }\n    }\n\n    @Override\n    protected void onRestart() {\n        super.onRestart();\n        if (DEBUG) {\n            Logger.t(TAG).d(\"onRestart\");\n        }\n    }\n\n    @Override\n    protected void onResume() {\n        super.onResume();\n        if (DEBUG) {\n            Logger.t(TAG).d(\"onResume\");\n        }\n    }\n\n    @Override\n    protected void onStop() {\n        super.onStop();\n        if (DEBUG) {\n            Logger.t(TAG).d(\"onStop\");\n        }\n    }\n\n    @Override\n    protected void onDestroy() {\n        super.onDestroy();\n        if (DEBUG) {\n            Logger.t(TAG).d(\"onDestroy\");\n        }\n    }\n\n    protected abstract int getContentView();\n\n\n}\n"
  },
  {
    "path": "easyandroid/src/main/java/com/wjj/easy/easyandroid/ui/EasyFragment.java",
    "content": "package com.wjj.easy.easyandroid.ui;\n\nimport android.os.Bundle;\nimport android.support.annotation.Nullable;\nimport android.support.v4.app.Fragment;\nimport android.view.LayoutInflater;\nimport android.view.View;\nimport android.view.ViewGroup;\n\nimport com.orhanobut.logger.Logger;\nimport com.wjj.easy.easyandroid.BuildConfig;\nimport com.wjj.easy.easyandroid.mvp.EasyBasePresenter;\nimport com.wjj.easy.easyandroid.mvp.EasyBaseView;\n\nimport javax.inject.Inject;\n\n/**\n * Created by wujiajun on 17/4/14.\n */\n\npublic abstract class EasyFragment extends Fragment implements EasyBaseView {\n\n    private final static String TAG = EasyFragment.class.getSimpleName();\n    private final static boolean DEBUG = BuildConfig.DEBUG;\n\n    @Nullable\n    @Override\n    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {\n        View view = inflater.inflate(getContentView(), container, false);\n        initView(view);\n        init(view);\n        return view;\n    }\n\n    protected abstract void init(View view);\n\n    protected abstract void initView(View view);\n\n    @Override\n    public void onStart() {\n        super.onStart();\n        if (DEBUG) {\n            Logger.t(TAG).d(\"onStart\");\n        }\n    }\n\n    @Override\n    public void onResume() {\n        super.onResume();\n        if (DEBUG) {\n            Logger.t(TAG).d(\"onResume\");\n        }\n    }\n\n    @Override\n    public void onPause() {\n        super.onPause();\n        if (DEBUG) {\n            Logger.t(TAG).d(\"onPause\");\n        }\n    }\n\n    @Override\n    public void onStop() {\n        super.onStop();\n        if (DEBUG) {\n            Logger.t(TAG).d(\"onStop\");\n        }\n    }\n\n    @Override\n    public void onDestroy() {\n        super.onDestroy();\n        if (DEBUG) {\n            Logger.t(TAG).d(\"onDestroy\");\n        }\n    }\n\n    protected abstract int getContentView();\n}\n"
  },
  {
    "path": "easyandroid/src/main/res/values/strings.xml",
    "content": "<resources>\n    <string name=\"app_name\">androidlib</string>\n</resources>\n"
  },
  {
    "path": "gradle/wrapper/gradle-wrapper.properties",
    "content": "#Mon Dec 28 10:00:20 PST 2015\ndistributionBase=GRADLE_USER_HOME\ndistributionPath=wrapper/dists\nzipStoreBase=GRADLE_USER_HOME\nzipStorePath=wrapper/dists\ndistributionUrl=https\\://services.gradle.org/distributions/gradle-2.14.1-all.zip\n"
  },
  {
    "path": "gradle.properties",
    "content": "# Project-wide Gradle settings.\n\n# IDE (e.g. Android Studio) users:\n# Gradle settings configured through the IDE *will override*\n# any settings specified in this file.\n\n# For more details on how to configure your build environment visit\n# http://www.gradle.org/docs/current/userguide/build_environment.html\n\n# Specifies the JVM arguments used for the daemon process.\n# The setting is particularly useful for tweaking memory settings.\norg.gradle.jvmargs=-Xmx1536m\n\n# When configured, Gradle will run in incubating parallel mode.\n# This option should only be used with decoupled projects. More details, visit\n# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects\n# org.gradle.parallel=true\n"
  },
  {
    "path": "gradlew",
    "content": "#!/usr/bin/env bash\n\n##############################################################################\n##\n##  Gradle start up script for UN*X\n##\n##############################################################################\n\n# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.\nDEFAULT_JVM_OPTS=\"\"\n\nAPP_NAME=\"Gradle\"\nAPP_BASE_NAME=`basename \"$0\"`\n\n# Use the maximum available, or set MAX_FD != -1 to use that value.\nMAX_FD=\"maximum\"\n\nwarn ( ) {\n    echo \"$*\"\n}\n\ndie ( ) {\n    echo\n    echo \"$*\"\n    echo\n    exit 1\n}\n\n# OS specific support (must be 'true' or 'false').\ncygwin=false\nmsys=false\ndarwin=false\ncase \"`uname`\" in\n  CYGWIN* )\n    cygwin=true\n    ;;\n  Darwin* )\n    darwin=true\n    ;;\n  MINGW* )\n    msys=true\n    ;;\nesac\n\n# Attempt to set APP_HOME\n# Resolve links: $0 may be a link\nPRG=\"$0\"\n# Need this for relative symlinks.\nwhile [ -h \"$PRG\" ] ; do\n    ls=`ls -ld \"$PRG\"`\n    link=`expr \"$ls\" : '.*-> \\(.*\\)$'`\n    if expr \"$link\" : '/.*' > /dev/null; then\n        PRG=\"$link\"\n    else\n        PRG=`dirname \"$PRG\"`\"/$link\"\n    fi\ndone\nSAVED=\"`pwd`\"\ncd \"`dirname \\\"$PRG\\\"`/\" >/dev/null\nAPP_HOME=\"`pwd -P`\"\ncd \"$SAVED\" >/dev/null\n\nCLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar\n\n# Determine the Java command to use to start the JVM.\nif [ -n \"$JAVA_HOME\" ] ; then\n    if [ -x \"$JAVA_HOME/jre/sh/java\" ] ; then\n        # IBM's JDK on AIX uses strange locations for the executables\n        JAVACMD=\"$JAVA_HOME/jre/sh/java\"\n    else\n        JAVACMD=\"$JAVA_HOME/bin/java\"\n    fi\n    if [ ! -x \"$JAVACMD\" ] ; then\n        die \"ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME\n\nPlease set the JAVA_HOME variable in your environment to match the\nlocation of your Java installation.\"\n    fi\nelse\n    JAVACMD=\"java\"\n    which java >/dev/null 2>&1 || die \"ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.\n\nPlease set the JAVA_HOME variable in your environment to match the\nlocation of your Java installation.\"\nfi\n\n# Increase the maximum file descriptors if we can.\nif [ \"$cygwin\" = \"false\" -a \"$darwin\" = \"false\" ] ; then\n    MAX_FD_LIMIT=`ulimit -H -n`\n    if [ $? -eq 0 ] ; then\n        if [ \"$MAX_FD\" = \"maximum\" -o \"$MAX_FD\" = \"max\" ] ; then\n            MAX_FD=\"$MAX_FD_LIMIT\"\n        fi\n        ulimit -n $MAX_FD\n        if [ $? -ne 0 ] ; then\n            warn \"Could not set maximum file descriptor limit: $MAX_FD\"\n        fi\n    else\n        warn \"Could not query maximum file descriptor limit: $MAX_FD_LIMIT\"\n    fi\nfi\n\n# For Darwin, add options to specify how the application appears in the dock\nif $darwin; then\n    GRADLE_OPTS=\"$GRADLE_OPTS \\\"-Xdock:name=$APP_NAME\\\" \\\"-Xdock:icon=$APP_HOME/media/gradle.icns\\\"\"\nfi\n\n# For Cygwin, switch paths to Windows format before running java\nif $cygwin ; then\n    APP_HOME=`cygpath --path --mixed \"$APP_HOME\"`\n    CLASSPATH=`cygpath --path --mixed \"$CLASSPATH\"`\n    JAVACMD=`cygpath --unix \"$JAVACMD\"`\n\n    # We build the pattern for arguments to be converted via cygpath\n    ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`\n    SEP=\"\"\n    for dir in $ROOTDIRSRAW ; do\n        ROOTDIRS=\"$ROOTDIRS$SEP$dir\"\n        SEP=\"|\"\n    done\n    OURCYGPATTERN=\"(^($ROOTDIRS))\"\n    # Add a user-defined pattern to the cygpath arguments\n    if [ \"$GRADLE_CYGPATTERN\" != \"\" ] ; then\n        OURCYGPATTERN=\"$OURCYGPATTERN|($GRADLE_CYGPATTERN)\"\n    fi\n    # Now convert the arguments - kludge to limit ourselves to /bin/sh\n    i=0\n    for arg in \"$@\" ; do\n        CHECK=`echo \"$arg\"|egrep -c \"$OURCYGPATTERN\" -`\n        CHECK2=`echo \"$arg\"|egrep -c \"^-\"`                                 ### Determine if an option\n\n        if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then                    ### Added a condition\n            eval `echo args$i`=`cygpath --path --ignore --mixed \"$arg\"`\n        else\n            eval `echo args$i`=\"\\\"$arg\\\"\"\n        fi\n        i=$((i+1))\n    done\n    case $i in\n        (0) set -- ;;\n        (1) set -- \"$args0\" ;;\n        (2) set -- \"$args0\" \"$args1\" ;;\n        (3) set -- \"$args0\" \"$args1\" \"$args2\" ;;\n        (4) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" ;;\n        (5) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" ;;\n        (6) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" \"$args5\" ;;\n        (7) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" \"$args5\" \"$args6\" ;;\n        (8) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" \"$args5\" \"$args6\" \"$args7\" ;;\n        (9) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" \"$args5\" \"$args6\" \"$args7\" \"$args8\" ;;\n    esac\nfi\n\n# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules\nfunction splitJvmOpts() {\n    JVM_OPTS=(\"$@\")\n}\neval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS\nJVM_OPTS[${#JVM_OPTS[*]}]=\"-Dorg.gradle.appname=$APP_BASE_NAME\"\n\nexec \"$JAVACMD\" \"${JVM_OPTS[@]}\" -classpath \"$CLASSPATH\" org.gradle.wrapper.GradleWrapperMain \"$@\"\n"
  },
  {
    "path": "gradlew.bat",
    "content": "@if \"%DEBUG%\" == \"\" @echo off\r\n@rem ##########################################################################\r\n@rem\r\n@rem  Gradle startup script for Windows\r\n@rem\r\n@rem ##########################################################################\r\n\r\n@rem Set local scope for the variables with windows NT shell\r\nif \"%OS%\"==\"Windows_NT\" setlocal\r\n\r\n@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.\r\nset DEFAULT_JVM_OPTS=\r\n\r\nset DIRNAME=%~dp0\r\nif \"%DIRNAME%\" == \"\" set DIRNAME=.\r\nset APP_BASE_NAME=%~n0\r\nset APP_HOME=%DIRNAME%\r\n\r\n@rem Find java.exe\r\nif defined JAVA_HOME goto findJavaFromJavaHome\r\n\r\nset JAVA_EXE=java.exe\r\n%JAVA_EXE% -version >NUL 2>&1\r\nif \"%ERRORLEVEL%\" == \"0\" goto init\r\n\r\necho.\r\necho ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.\r\necho.\r\necho Please set the JAVA_HOME variable in your environment to match the\r\necho location of your Java installation.\r\n\r\ngoto fail\r\n\r\n:findJavaFromJavaHome\r\nset JAVA_HOME=%JAVA_HOME:\"=%\r\nset JAVA_EXE=%JAVA_HOME%/bin/java.exe\r\n\r\nif exist \"%JAVA_EXE%\" goto init\r\n\r\necho.\r\necho ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%\r\necho.\r\necho Please set the JAVA_HOME variable in your environment to match the\r\necho location of your Java installation.\r\n\r\ngoto fail\r\n\r\n:init\r\n@rem Get command-line arguments, handling Windowz variants\r\n\r\nif not \"%OS%\" == \"Windows_NT\" goto win9xME_args\r\nif \"%@eval[2+2]\" == \"4\" goto 4NT_args\r\n\r\n:win9xME_args\r\n@rem Slurp the command line arguments.\r\nset CMD_LINE_ARGS=\r\nset _SKIP=2\r\n\r\n:win9xME_args_slurp\r\nif \"x%~1\" == \"x\" goto execute\r\n\r\nset CMD_LINE_ARGS=%*\r\ngoto execute\r\n\r\n:4NT_args\r\n@rem Get arguments from the 4NT Shell from JP Software\r\nset CMD_LINE_ARGS=%$\r\n\r\n:execute\r\n@rem Setup the command line\r\n\r\nset CLASSPATH=%APP_HOME%\\gradle\\wrapper\\gradle-wrapper.jar\r\n\r\n@rem Execute Gradle\r\n\"%JAVA_EXE%\" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% \"-Dorg.gradle.appname=%APP_BASE_NAME%\" -classpath \"%CLASSPATH%\" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%\r\n\r\n:end\r\n@rem End local scope for the variables with windows NT shell\r\nif \"%ERRORLEVEL%\"==\"0\" goto mainEnd\r\n\r\n:fail\r\nrem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of\r\nrem the _cmd.exe /c_ return code!\r\nif  not \"\" == \"%GRADLE_EXIT_CONSOLE%\" exit 1\r\nexit /b 1\r\n\r\n:mainEnd\r\nif \"%OS%\"==\"Windows_NT\" endlocal\r\n\r\n:omega\r\n"
  },
  {
    "path": "settings.gradle",
    "content": "include ':app', ':easyandroid'\n"
  }
]