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