├── .gitignore ├── .idea ├── 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 │ │ │ └── android │ │ │ └── szh │ │ │ └── agileframedemo │ │ │ ├── TestApplication.java │ │ │ ├── activity │ │ │ ├── EventBusPostMessageActivity.java │ │ │ ├── GreenDaoTestActivity.java │ │ │ ├── MVPTestActivity.java │ │ │ ├── MainActivity.java │ │ │ ├── MultipleBaseUrlSwitchActivity.java │ │ │ ├── PermissionAndCameraActivity.java │ │ │ ├── SplashActivity.java │ │ │ └── ViewHelperDemoActivity.java │ │ │ ├── api │ │ │ └── APPApiService.java │ │ │ ├── contract │ │ │ └── MVPTestContract.java │ │ │ ├── entry │ │ │ └── CityInfo.java │ │ │ ├── model │ │ │ └── MVPTestModel.java │ │ │ └── presenter │ │ │ └── MVPTestPresenter.java │ └── res │ │ ├── drawable-v24 │ │ └── ic_launcher_foreground.xml │ │ ├── drawable-xxhdpi │ │ └── bga_splash.png │ │ ├── drawable │ │ └── ic_launcher_background.xml │ │ ├── layout │ │ ├── activity_greendao_test.xml │ │ ├── activity_main.xml │ │ ├── activity_mutiple_base_url_switch.xml │ │ ├── activity_mvptest.xml │ │ ├── activity_permiss_and_camera.xml │ │ ├── activity_splash.xml │ │ ├── activity_use_event_bus.xml │ │ └── activity_viewhelper_demo.xml │ │ ├── mipmap-xxhdpi │ │ └── ic_launcher.png │ │ └── values │ │ ├── colors.xml │ │ ├── strings.xml │ │ └── styles.xml │ └── test │ └── java │ └── com │ └── android │ └── szh │ └── agileframedemo │ └── ExampleUnitTest.java ├── build.gradle ├── common ├── .gitignore ├── build.gradle ├── proguard-rules.pro └── src │ ├── main │ ├── AndroidManifest.xml │ ├── java │ │ └── com │ │ │ └── android │ │ │ └── szh │ │ │ └── common │ │ │ ├── BaseApplication.java │ │ │ ├── abslistview │ │ │ ├── adapter │ │ │ │ ├── CommonAdapter.java │ │ │ │ ├── CommonExpandableAdapter.java │ │ │ │ ├── MultiItemExpandableAdapter.java │ │ │ │ └── MultiItemTypeAdapter.java │ │ │ └── holder │ │ │ │ └── AbsListViewHolder.java │ │ │ ├── adapter │ │ │ ├── IAdapter.java │ │ │ ├── IRecycleViewAdapter.java │ │ │ └── ViewHolder.java │ │ │ ├── base │ │ │ ├── BaseActivity.java │ │ │ ├── BaseFragment.java │ │ │ └── BasePresenter.java │ │ │ ├── config │ │ │ ├── RoutePathConfig.java │ │ │ └── UrlConfig.java │ │ │ ├── constant │ │ │ ├── PageJumpsKeys.java │ │ │ └── UserAvatorConfig.java │ │ │ ├── delegate │ │ │ ├── IAdapterDelegate.java │ │ │ ├── ItemViewDelegate.java │ │ │ └── ItemViewDelegateManager.java │ │ │ ├── dialog │ │ │ ├── BaseDialogProvider.java │ │ │ ├── IDialogProvider.java │ │ │ ├── LoadingDialogProvider.java │ │ │ └── ProgressDialogProvider.java │ │ │ ├── entity │ │ │ ├── ARouteSerializableBean.java │ │ │ └── GreenDaoTestEntity.java │ │ │ ├── eventbus │ │ │ ├── BaseEvent.java │ │ │ ├── EventBusHelper.java │ │ │ ├── EventHandlerAsync.java │ │ │ ├── EventHandlerBackground.java │ │ │ ├── EventHandlerDefault.java │ │ │ └── EventHandlerMain.java │ │ │ ├── exception │ │ │ └── DateParseException.java │ │ │ ├── greendao │ │ │ ├── GreenDaoManager.java │ │ │ ├── GreenDaoSQLiteOpenHelper.java │ │ │ └── GreenDaoUpgradeHelper.java │ │ │ ├── http │ │ │ ├── BaseEntity.java │ │ │ ├── HttpClient.java │ │ │ ├── HttpCode.java │ │ │ ├── HttpConfig.java │ │ │ ├── HttpManager.java │ │ │ ├── TokenCode.java │ │ │ ├── api │ │ │ │ └── BaseApiService.java │ │ │ ├── cache │ │ │ │ ├── CookieCache.java │ │ │ │ ├── IdentifiableCookie.java │ │ │ │ └── OkHttpCookieCache.java │ │ │ ├── converter │ │ │ │ ├── StringConverterFactory.java │ │ │ │ ├── StringRequestBodyConverter.java │ │ │ │ └── StringResponseBodyConverter.java │ │ │ ├── cookie │ │ │ │ ├── ClearableCookieJar.java │ │ │ │ ├── CookiePersistor.java │ │ │ │ ├── OkHttpCookieManager.java │ │ │ │ ├── OkHttpCookiePersistor.java │ │ │ │ └── SerializableCookie.java │ │ │ ├── exception │ │ │ │ ├── ConverterIOException.java │ │ │ │ ├── ExceptionCode.java │ │ │ │ ├── ExceptionEngine.java │ │ │ │ ├── HttpException.java │ │ │ │ ├── NetErrorException.java │ │ │ │ └── TokenCheckException.java │ │ │ ├── function │ │ │ │ └── ErrorHandlerFunction.java │ │ │ ├── https │ │ │ │ └── HttpsUtils.java │ │ │ ├── interceptor │ │ │ │ ├── CacheInterceptor.java │ │ │ │ ├── CacheInterceptorOffline.java │ │ │ │ ├── HeadersInterceptor.java │ │ │ │ ├── HttpLoggingInterceptor.java │ │ │ │ ├── HttpUrlInterceptor.java │ │ │ │ ├── NetworkInterceptor.java │ │ │ │ └── ParamsInterceptor.java │ │ │ ├── model │ │ │ │ ├── HttpHeaders.java │ │ │ │ └── HttpParams.java │ │ │ └── wrapper │ │ │ │ ├── GsonConverterFactoryWrapper.java │ │ │ │ ├── RxJava2CallAdapterFactoryWrapper.java │ │ │ │ └── StringConverterFactoryWrapper.java │ │ │ ├── imageloader │ │ │ ├── BaseImageLoaderHelper.java │ │ │ ├── ImageLoader.java │ │ │ ├── ImageLoaderHelper.java │ │ │ ├── ImageLoaderOptions.java │ │ │ ├── ImageLoaderStrategy.java │ │ │ ├── ImageLoadingListener.java │ │ │ ├── SimpleImageLoadingListener.java │ │ │ ├── glide │ │ │ │ ├── GlideImageLoaderStrategy.java │ │ │ │ └── GlideModelConfig.java │ │ │ ├── image │ │ │ │ ├── BitmapHelper.java │ │ │ │ ├── Compressor.java │ │ │ │ ├── ImagePathHelper.java │ │ │ │ └── ImageUriHelper.java │ │ │ └── model │ │ │ │ ├── CropType.java │ │ │ │ └── ImageSize.java │ │ │ ├── logger │ │ │ ├── Logger.java │ │ │ ├── config │ │ │ │ └── LogConfig.java │ │ │ ├── parser │ │ │ │ ├── BitmapParse.java │ │ │ │ ├── BundleParse.java │ │ │ │ ├── CollectionParse.java │ │ │ │ ├── IParser.java │ │ │ │ ├── IntentParse.java │ │ │ │ ├── MapParse.java │ │ │ │ ├── MessageParse.java │ │ │ │ ├── ReferenceParse.java │ │ │ │ ├── SparseArrayParse.java │ │ │ │ ├── ThrowableParse.java │ │ │ │ └── UriParse.java │ │ │ ├── printer │ │ │ │ ├── ConsolePrinter.java │ │ │ │ ├── FilePrinter.java │ │ │ │ ├── IPrinter.java │ │ │ │ ├── LogcatPrinter.java │ │ │ │ ├── Printer.java │ │ │ │ └── PrinterManager.java │ │ │ └── utils │ │ │ │ ├── BitmapHelper.java │ │ │ │ ├── Formatter.java │ │ │ │ ├── LogConstants.java │ │ │ │ ├── LogConvert.java │ │ │ │ └── LogUtils.java │ │ │ ├── mvp │ │ │ ├── IModel.java │ │ │ ├── IPresenter.java │ │ │ ├── IRxjava.java │ │ │ ├── IView.java │ │ │ ├── IViewHepler.java │ │ │ └── ViewHelper.java │ │ │ ├── permission │ │ │ ├── OnPermissionCallback.java │ │ │ ├── OnPermissionsCallback.java │ │ │ ├── OnPrepareListener.java │ │ │ ├── OnRequestResultListener.java │ │ │ ├── Permission.java │ │ │ ├── PermissionCode.java │ │ │ ├── PermissionDenied.java │ │ │ ├── PermissionGranted.java │ │ │ ├── PermissionHelper.java │ │ │ ├── PermissionRequest.java │ │ │ ├── PermissionsFragment.java │ │ │ ├── PermissionsResult.java │ │ │ ├── Rationale.java │ │ │ ├── Request.java │ │ │ └── SimplePermissionsCallback.java │ │ │ ├── recycleview │ │ │ ├── BaseDelegateAdapter.java │ │ │ ├── DividerGridItemDecoration.java │ │ │ ├── DividerListItemDecoration.java │ │ │ ├── RecyclerViewScrollListener.java │ │ │ ├── adapter │ │ │ │ ├── CommonAdapter.java │ │ │ │ └── MultiItemTypeAdapter.java │ │ │ ├── callback │ │ │ │ ├── DiffCallBack.java │ │ │ │ ├── ItemTouchHelpCallback.java │ │ │ │ └── OnItemTouchCallback.java │ │ │ ├── holder │ │ │ │ └── RecyclerViewHolder.java │ │ │ ├── listener │ │ │ │ ├── OnItemClickListener.java │ │ │ │ ├── OnItemLongClickListener.java │ │ │ │ └── SimpleRecycleViewItemClickListener.java │ │ │ └── wrapper │ │ │ │ ├── EmptyViewWrapper.java │ │ │ │ ├── HeaderAndFooterWrapper.java │ │ │ │ └── WrapperHelper.java │ │ │ ├── rxjava │ │ │ ├── BaseObserver.java │ │ │ ├── BaseSubscriber.java │ │ │ ├── DisposableManager.java │ │ │ ├── HttpObserver.java │ │ │ ├── RxJavaHelper.java │ │ │ └── transformer │ │ │ │ ├── ObservableTransformerAsync.java │ │ │ │ ├── ObservableTransformerError.java │ │ │ │ └── ObservableTransformerSync.java │ │ │ ├── utils │ │ │ ├── Android7Helper.java │ │ │ ├── AppHelper.java │ │ │ ├── CharsetHelper.java │ │ │ ├── CheckHelper.java │ │ │ ├── CloseHelper.java │ │ │ ├── DateHelper.java │ │ │ ├── DensityHelper.java │ │ │ ├── DialogUtil.java │ │ │ ├── FileHelper.java │ │ │ ├── NetworkHelper.java │ │ │ ├── ReflexHelper.java │ │ │ ├── SDKVersionHelper.java │ │ │ ├── SafetyHandler.java │ │ │ ├── ScreenHelper.java │ │ │ ├── ThreadHelper.java │ │ │ ├── ToastUtil.java │ │ │ ├── UrlHelper.java │ │ │ └── WindowHelper.java │ │ │ └── widget │ │ │ ├── BasePopupWindow.java │ │ │ ├── BottomPopupWindow.java │ │ │ ├── CustomDialog.java │ │ │ └── StateDialog.java │ └── res │ │ ├── anim │ │ ├── slide_in_common_finish.xml │ │ ├── slide_in_common_start.xml │ │ ├── slide_in_from_bottom.xml │ │ ├── slide_out_common_finish.xml │ │ ├── slide_out_common_start.xml │ │ └── slide_out_to_bottom.xml │ │ ├── drawable-xhdpi │ │ ├── icon_state_bad_network.png │ │ ├── icon_state_no_network.png │ │ ├── icon_state_prompt.png │ │ └── icon_state_success.png │ │ ├── drawable │ │ ├── bg_custom_dialog_left_button.xml │ │ ├── bg_custom_dialog_right_button.xml │ │ ├── bg_custom_dialog_round_corner.xml │ │ ├── bg_custom_dialog_single_button.xml │ │ ├── divider_inner_item.xml │ │ └── selector_white_gray.xml │ │ ├── layout │ │ ├── layout_dialog_custom.xml │ │ ├── layout_dialog_state.xml │ │ ├── layout_item_bottom_pop.xml │ │ └── layout_pop_bottom_popupwindow.xml │ │ ├── values │ │ ├── colors.xml │ │ ├── dimens.xml │ │ ├── ids.xml │ │ ├── strings.xml │ │ └── styles.xml │ │ └── xml │ │ └── file_paths.xml │ └── test │ └── java │ └── com │ └── android │ └── szh │ └── common │ └── ExampleUnitTest.java ├── config.gradle ├── gradle.properties ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat ├── settings.gradle └── user ├── .gitignore ├── build.gradle ├── proguard-rules.pro └── src └── main ├── AndroidManifest.xml ├── java └── com │ └── android │ └── szh │ └── user │ └── ARouterDemoActivity.java └── res ├── layout └── activity_arouter_demo.xml └── values └── strings.xml /.gitignore: -------------------------------------------------------------------------------- 1 | #the beginning of .gitignore 2 | 3 | # Built application files 4 | *.apk 5 | *.ap_ 6 | 7 | # Files for the ART/Dalvik VM 8 | *.dex 9 | 10 | # Java class files 11 | *.class 12 | 13 | # Generated files 14 | bin/ 15 | gen/ 16 | out/ 17 | 18 | # Gradle files 19 | .gradle/ 20 | gradle.properties 21 | build/ 22 | */build/ 23 | 24 | # Local configuration file (sdk path, etc) 25 | local.properties 26 | 27 | # Proguard folder generated by Eclipse 28 | proguard/ 29 | 30 | # Log Files 31 | *.log 32 | 33 | # Android Studio 34 | *.iml 35 | .idea/ 36 | 37 | # GreenDao files 38 | *Dao.java 39 | DaoMaster.java 40 | DaoSession.java 41 | 42 | # Svn 43 | .svn/ 44 | 45 | # Android Studio Navigation editor temp files 46 | .navigation/ 47 | 48 | # Android Studio captures folder 49 | /captures 50 | captures/ 51 | map.txt 52 | 53 | # External native build folder generated in Android Studio 2.2 and later 54 | .externalNativeBuild 55 | 56 | # Google Services (e.g. APIs or Firebase) 57 | google-services.json 58 | 59 | # Freeline 60 | freeline.py 61 | freeline/ 62 | freeline_project_description.json 63 | 64 | # Files for release channel dir 65 | 66 | # Files for the Mac OS 67 | .DS_Store 68 | 69 | #the end of .gitignore -------------------------------------------------------------------------------- /.idea/encodings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /.idea/gradle.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 19 | 20 | -------------------------------------------------------------------------------- /.idea/misc.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 16 | 26 | 27 | 28 | 29 | 30 | 31 | 33 | 34 | 35 | 36 | 37 | 1.8 38 | 39 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 55 | 56 | 57 | 58 | 59 | 60 | -------------------------------------------------------------------------------- /.idea/modules.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /.idea/runConfigurations.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 11 | 12 | -------------------------------------------------------------------------------- /.idea/vcs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /app/build.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: 'com.android.application' 2 | 3 | def config = rootProject.ext.android // 配置 4 | 5 | android { 6 | compileSdkVersion config.compileSdkVersion 7 | buildToolsVersion config.buildToolsVersion 8 | defaultConfig { 9 | applicationId "com.android.szh.agileframedemo" 10 | minSdkVersion config.minSdkVersion 11 | targetSdkVersion config.targetSdkVersion 12 | versionCode config.versionCode 13 | versionName config.versionName 14 | multiDexEnabled true 15 | flavorDimensions "yourProjectName" 16 | testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" 17 | 18 | javaCompileOptions { 19 | annotationProcessorOptions { 20 | arguments = [moduleName: project.getName()] 21 | } 22 | } 23 | 24 | } 25 | buildTypes { 26 | release { 27 | minifyEnabled false 28 | proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 29 | } 30 | } 31 | } 32 | 33 | dependencies { 34 | implementation fileTree(include: ['*.jar'], dir: 'libs') 35 | implementation project(':common') 36 | implementation project(':user') 37 | // ARouter(https://github.com/alibaba/arouter) 38 | annotationProcessor "com.alibaba:arouter-compiler:$aRouterCompilerVersion" 39 | // butterknife(https://github.com/JakeWharton/butterknife) 40 | annotationProcessor "com.jakewharton:butterknife-compiler:$butterknifeVersion" 41 | } 42 | -------------------------------------------------------------------------------- /app/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # You can control the set of applied configuration files using the 3 | # proguardFiles setting in build.gradle. 4 | # 5 | # For more details, see 6 | # http://developer.android.com/guide/developing/tools/proguard.html 7 | 8 | # If your project uses WebView with JS, uncomment the following 9 | # and specify the fully qualified class name to the JavaScript interface 10 | # class: 11 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 12 | # public *; 13 | #} 14 | 15 | # Uncomment this to preserve the line number information for 16 | # debugging stack traces. 17 | #-keepattributes SourceFile,LineNumberTable 18 | 19 | # If you keep the line number information, uncomment this to 20 | # hide the original source file name. 21 | #-renamesourcefileattribute SourceFile 22 | -------------------------------------------------------------------------------- /app/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | -------------------------------------------------------------------------------- /app/src/main/java/com/android/szh/agileframedemo/TestApplication.java: -------------------------------------------------------------------------------- 1 | package com.android.szh.agileframedemo; 2 | 3 | import com.android.szh.common.BaseApplication; 4 | 5 | /** 6 | * Created by sunzhonghao on 2018/5/16. 7 | * desc:供测试的application 8 | */ 9 | 10 | public class TestApplication extends BaseApplication { 11 | 12 | @Override 13 | public void onCreate() { 14 | setDebugModel(BuildConfig.DEBUG); 15 | super.onCreate(); 16 | } 17 | 18 | } 19 | -------------------------------------------------------------------------------- /app/src/main/java/com/android/szh/agileframedemo/activity/EventBusPostMessageActivity.java: -------------------------------------------------------------------------------- 1 | package com.android.szh.agileframedemo.activity; 2 | 3 | import android.view.View; 4 | 5 | import com.android.szh.agileframedemo.R; 6 | import com.android.szh.common.base.BaseActivity; 7 | import com.android.szh.common.eventbus.EventBusHelper; 8 | 9 | import java.util.Random; 10 | 11 | /** 12 | * Created by sunzhonghao on 2018/7/4. 13 | * desc:用于测试eventBus 发送消息的界面 14 | */ 15 | 16 | public class EventBusPostMessageActivity extends BaseActivity { 17 | @Override 18 | protected void initViews() { 19 | findViewById(R.id.btn_post_event_bus_msg).setOnClickListener(new View.OnClickListener() { 20 | @Override 21 | public void onClick(View v) { 22 | EventBusHelper.post("已经接收到消息", String.valueOf((int) (new Random().nextFloat() * 100))); 23 | finish(); 24 | } 25 | }); 26 | } 27 | 28 | @Override 29 | protected int getContentLayoutId() { 30 | return R.layout.activity_use_event_bus; 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /app/src/main/java/com/android/szh/agileframedemo/activity/MVPTestActivity.java: -------------------------------------------------------------------------------- 1 | package com.android.szh.agileframedemo.activity; 2 | 3 | import android.widget.TextView; 4 | 5 | import com.android.szh.agileframedemo.R; 6 | import com.android.szh.agileframedemo.contract.MVPTestContract; 7 | import com.android.szh.agileframedemo.entry.CityInfo; 8 | import com.android.szh.agileframedemo.presenter.MVPTestPresenter; 9 | import com.android.szh.common.base.BaseActivity; 10 | 11 | import butterknife.BindView; 12 | import butterknife.OnClick; 13 | 14 | 15 | /** 16 | * Created by sunzhonghao on 2018/5/16. 17 | * desc: MVP 演示测试类 18 | */ 19 | public class MVPTestActivity extends BaseActivity implements MVPTestContract.View { 20 | 21 | @BindView(R.id.mvp_result) 22 | TextView mvpResult; 23 | 24 | @Override 25 | protected int getContentLayoutId() { 26 | return R.layout.activity_mvptest; 27 | } 28 | 29 | 30 | @Override 31 | protected void initViews() { 32 | 33 | } 34 | 35 | @Override 36 | public void handleCityInfoResult(CityInfo cityInfo) { 37 | mvpResult.setText(cityInfo.toString()); 38 | } 39 | 40 | 41 | @OnClick(R.id.mvp_test) 42 | public void onViewClicked() { 43 | getPresenter().loadCityInfo(); 44 | } 45 | 46 | } 47 | -------------------------------------------------------------------------------- /app/src/main/java/com/android/szh/agileframedemo/activity/SplashActivity.java: -------------------------------------------------------------------------------- 1 | package com.android.szh.agileframedemo.activity; 2 | 3 | import android.content.Intent; 4 | import android.view.Window; 5 | import android.view.WindowManager; 6 | 7 | import com.android.szh.agileframedemo.R; 8 | import com.android.szh.common.base.BaseActivity; 9 | 10 | import java.util.concurrent.TimeUnit; 11 | 12 | import io.reactivex.Observable; 13 | import io.reactivex.android.schedulers.AndroidSchedulers; 14 | import io.reactivex.functions.Consumer; 15 | import io.reactivex.functions.Function; 16 | 17 | /** 18 | * Created by sunzhonghao on 2018/7/4. 19 | * desc:闪屏页 20 | */ 21 | 22 | public class SplashActivity extends BaseActivity { 23 | 24 | @Override 25 | protected void initViews() { 26 | 27 | } 28 | 29 | 30 | @Override 31 | protected boolean usePageAnimation() { 32 | return false; 33 | } 34 | 35 | @Override 36 | protected void beforeSuper() { 37 | //设置成全屏 38 | this.requestWindowFeature(Window.FEATURE_NO_TITLE); 39 | this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, 40 | WindowManager.LayoutParams.FLAG_FULLSCREEN); 41 | } 42 | 43 | @Override 44 | protected int getContentLayoutId() { 45 | return R.layout.activity_splash; 46 | } 47 | 48 | 49 | @Override 50 | protected void loadData() { 51 | //使用公用的订阅器开始倒计时 52 | getCompositeDisposable() 53 | .add(Observable.interval(0, 1, TimeUnit.SECONDS) 54 | .take(3) 55 | .map(new Function() { 56 | @Override 57 | public Long apply(Long aLong) throws Exception { 58 | return 2 - aLong; 59 | } 60 | }) 61 | .observeOn(AndroidSchedulers.mainThread())//操作UI主要在UI线程 62 | .subscribe(new Consumer() { 63 | @Override 64 | public void accept(Long time) throws Exception { 65 | if (time == 0) { 66 | //执行完毕后植入到 MainActivity 67 | startActivity(new Intent(getContext(), MainActivity.class)); 68 | finish(); 69 | } 70 | } 71 | })); 72 | } 73 | } 74 | -------------------------------------------------------------------------------- /app/src/main/java/com/android/szh/agileframedemo/activity/ViewHelperDemoActivity.java: -------------------------------------------------------------------------------- 1 | package com.android.szh.agileframedemo.activity; 2 | 3 | import android.view.View; 4 | 5 | import com.android.szh.agileframedemo.R; 6 | import com.android.szh.common.base.BaseActivity; 7 | 8 | import butterknife.OnClick; 9 | 10 | /** 11 | * @author sunzhonghao 12 | * @date 2018/7/11 13 | * desc:BaseActivity中viewHelper 功能的演示 14 | */ 15 | public class ViewHelperDemoActivity extends BaseActivity { 16 | @Override 17 | protected void initViews() { 18 | 19 | } 20 | 21 | @Override 22 | protected int getContentLayoutId() { 23 | return R.layout.activity_viewhelper_demo; 24 | } 25 | 26 | 27 | @OnClick({R.id.btn_show_loading, R.id.btn_show_empty_page, R.id.btn_show_error_page, R.id.btn_show_net_error_page}) 28 | public void onViewClicked(View view) { 29 | switch (view.getId()) { 30 | case R.id.btn_show_loading: 31 | showLoadingDialog(); 32 | break; 33 | 34 | case R.id.btn_show_empty_page: 35 | 36 | break; 37 | case R.id.btn_show_error_page: 38 | 39 | break; 40 | case R.id.btn_show_net_error_page: 41 | 42 | break; 43 | 44 | } 45 | } 46 | } 47 | -------------------------------------------------------------------------------- /app/src/main/java/com/android/szh/agileframedemo/api/APPApiService.java: -------------------------------------------------------------------------------- 1 | package com.android.szh.agileframedemo.api; 2 | 3 | import com.android.szh.common.config.UrlConfig; 4 | import com.android.szh.common.http.BaseEntity; 5 | 6 | import java.util.Map; 7 | 8 | import io.reactivex.Observable; 9 | import okhttp3.ResponseBody; 10 | import retrofit2.http.GET; 11 | import retrofit2.http.Headers; 12 | import retrofit2.http.Path; 13 | import retrofit2.http.QueryMap; 14 | 15 | /** 16 | * Created by sunzhonghao on 2018/5/16. 17 | * desc: 接口service 18 | */ 19 | public interface APPApiService { 20 | /** 21 | * 获取城市信息 22 | */ 23 | @GET("/cityjson?ie=utf-8&qq-pf-to=pcqq.c2c") 24 | Observable getCityInfo(); 25 | 26 | /** 27 | * 切换域名的特使接口 28 | * Add the Domain-Name header 29 | */ 30 | @Headers({UrlConfig.FLAG_MULTIPLE_BASE_URL_KEY + UrlConfig.FLAG_MULTIPLE_BASE_URL_A}) 31 | @GET("/v2/book/{id}") 32 | Observable testSwitchBaseUrl(@Path("id") int id); 33 | 34 | 35 | /** 36 | * 自定解析对象实例 37 | * 38 | * Object为任意数据类型(要和json对象数据结构相对应) 39 | */ 40 | @GET("/xxxx/xxxx.do") 41 | Observable> getXXX(@QueryMap Map map); 42 | } -------------------------------------------------------------------------------- /app/src/main/java/com/android/szh/agileframedemo/contract/MVPTestContract.java: -------------------------------------------------------------------------------- 1 | package com.android.szh.agileframedemo.contract; 2 | 3 | 4 | 5 | import com.android.szh.agileframedemo.entry.CityInfo; 6 | import com.android.szh.common.base.BasePresenter; 7 | import com.android.szh.common.mvp.IModel; 8 | import com.android.szh.common.mvp.IView; 9 | 10 | import io.reactivex.Observable; 11 | import okhttp3.ResponseBody; 12 | 13 | /** 14 | * Created by sunzhonghao on 2018/5/16. 15 | * desc: 供测试使用的契约管理接口 16 | */ 17 | public interface MVPTestContract { 18 | 19 | interface Model extends IModel { 20 | Observable getCityInfo(); 21 | } 22 | 23 | interface View extends IView { 24 | void handleCityInfoResult(CityInfo cityInfo); 25 | } 26 | 27 | abstract class Presenter extends BasePresenter { 28 | public abstract void loadCityInfo(); 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /app/src/main/java/com/android/szh/agileframedemo/entry/CityInfo.java: -------------------------------------------------------------------------------- 1 | package com.android.szh.agileframedemo.entry; 2 | 3 | import android.text.TextUtils; 4 | 5 | 6 | import com.android.szh.common.exception.DateParseException; 7 | import com.android.szh.common.http.HttpManager; 8 | import com.android.szh.common.utils.DateHelper; 9 | 10 | import org.json.JSONException; 11 | import org.json.JSONObject; 12 | 13 | import java.io.IOException; 14 | import java.util.Date; 15 | 16 | import okhttp3.Request; 17 | import okhttp3.Response; 18 | import okhttp3.ResponseBody; 19 | 20 | /** 21 | * 城市和IP信息 22 | * 23 | */ 24 | public class CityInfo { 25 | 26 | private static final String URL = "http://pv.sohu.com/cityjson?ie=utf-8&qq-pf-to=pcqq.c2c"; 27 | private static final String UNKNOWN = "未知"; 28 | 29 | private String cityId; 30 | private String cityName; 31 | private String ipAddress; 32 | private String dateTime; 33 | 34 | public String getCityId() { 35 | if (TextUtils.isEmpty(cityId)) { 36 | return UNKNOWN; 37 | } 38 | return cityId; 39 | } 40 | 41 | public void setCityId(String cityId) { 42 | this.cityId = cityId; 43 | } 44 | 45 | public String getCityName() { 46 | if (TextUtils.isEmpty(cityName)) { 47 | return UNKNOWN; 48 | } 49 | return cityName; 50 | } 51 | 52 | public void setCityName(String cityName) { 53 | this.cityName = cityName; 54 | } 55 | 56 | public String getIpAddress() { 57 | if (TextUtils.isEmpty(ipAddress)) { 58 | return UNKNOWN; 59 | } 60 | return ipAddress; 61 | } 62 | 63 | public void setIpAddress(String ipAddress) { 64 | this.ipAddress = ipAddress; 65 | } 66 | 67 | public String getDateTime() { 68 | if (TextUtils.isEmpty(dateTime)) { 69 | return UNKNOWN; 70 | } 71 | return dateTime; 72 | } 73 | 74 | public void setDateTime(String dateTime) { 75 | this.dateTime = dateTime; 76 | } 77 | 78 | @Override 79 | public String toString() { 80 | return "CityInfo{" + 81 | "cityId='" + cityId + '\'' + 82 | ", cityName='" + cityName + '\'' + 83 | ", ipAddress='" + ipAddress + '\'' + 84 | ", dateTime='" + dateTime + '\'' + 85 | '}'; 86 | } 87 | } 88 | -------------------------------------------------------------------------------- /app/src/main/java/com/android/szh/agileframedemo/model/MVPTestModel.java: -------------------------------------------------------------------------------- 1 | package com.android.szh.agileframedemo.model; 2 | 3 | 4 | import com.android.szh.agileframedemo.api.APPApiService; 5 | import com.android.szh.agileframedemo.contract.MVPTestContract; 6 | import com.android.szh.common.http.HttpManager; 7 | 8 | import io.reactivex.Observable; 9 | import okhttp3.ResponseBody; 10 | 11 | /** 12 | * Created by sunzhonghao on 2018/5/16. 13 | * desc: Model实现类 14 | */ 15 | public class MVPTestModel implements MVPTestContract.Model { 16 | 17 | @Override 18 | public Observable getCityInfo() { 19 | return HttpManager.getInstance() 20 | .create(APPApiService.class) 21 | .getCityInfo(); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /app/src/main/java/com/android/szh/agileframedemo/presenter/MVPTestPresenter.java: -------------------------------------------------------------------------------- 1 | package com.android.szh.agileframedemo.presenter; 2 | 3 | import android.text.TextUtils; 4 | 5 | import com.android.szh.agileframedemo.contract.MVPTestContract; 6 | import com.android.szh.agileframedemo.entry.CityInfo; 7 | import com.android.szh.agileframedemo.model.MVPTestModel; 8 | import com.android.szh.common.http.exception.HttpException; 9 | import com.android.szh.common.logger.Logger; 10 | import com.android.szh.common.rxjava.HttpObserver; 11 | 12 | import org.json.JSONException; 13 | import org.json.JSONObject; 14 | 15 | import java.io.IOException; 16 | 17 | import okhttp3.ResponseBody; 18 | 19 | /** 20 | * Created by sunzhonghao on 2018/5/16. 21 | * desc: Presenter 实现类 22 | */ 23 | public class MVPTestPresenter extends MVPTestContract.Presenter { 24 | 25 | @Override 26 | public void loadCityInfo() { 27 | subscribe(getModel().getCityInfo(), new HttpObserver(getContext()) { 28 | @Override 29 | public void _onNext(ResponseBody responseBody) { 30 | Logger.i("getData success"); 31 | try { 32 | CityInfo cityInfo = new CityInfo(); 33 | String result = responseBody.string(); 34 | if (!TextUtils.isEmpty(result) && result.contains("{") && result.contains("}")) { 35 | int start = result.indexOf("{"); 36 | int end = result.indexOf("}"); 37 | String content = result.substring(start, end + 1); 38 | JSONObject jsonObject = new JSONObject(content); 39 | String ipAddress = jsonObject.getString("cip"); 40 | String cityId = jsonObject.getString("cid"); 41 | String cityName = jsonObject.getString("cname"); 42 | cityInfo.setCityId(cityId); 43 | cityInfo.setCityName(cityName); 44 | cityInfo.setIpAddress(ipAddress); 45 | } 46 | getView().handleCityInfoResult(cityInfo); 47 | } catch (IOException | JSONException e) { 48 | e.printStackTrace(); 49 | } 50 | } 51 | 52 | @Override 53 | public void _onError(HttpException exception) { 54 | Logger.i(exception.getMessage()); 55 | } 56 | }); 57 | } 58 | } 59 | -------------------------------------------------------------------------------- /app/src/main/res/drawable-v24/ic_launcher_foreground.xml: -------------------------------------------------------------------------------- 1 | 7 | 12 | 13 | 19 | 22 | 25 | 26 | 27 | 28 | 34 | 35 | -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/bga_splash.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZhongHaoHero666/AgileFrameModelForAndroid/54d30b0c7b9ab04d4c26c135c4d39e2a151d6ff8/app/src/main/res/drawable-xxhdpi/bga_splash.png -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_greendao_test.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 |