├── .gitignore ├── README.md ├── build.gradle ├── debug.keystore ├── demo ├── .gitignore ├── build.gradle ├── proguard-rules.pro └── src │ └── main │ ├── AndroidManifest.xml │ ├── java │ └── library │ │ └── demo │ │ ├── AppDroid.java │ │ ├── api │ │ ├── ModuleAApi.java │ │ └── res │ │ │ └── ListCategory.java │ │ ├── base │ │ ├── BaseActivity.java │ │ ├── BaseDialog.java │ │ ├── BaseFragment.java │ │ ├── CommonTitleBarDelegate.java │ │ ├── DemoBaseLogic.java │ │ ├── InfoResult.java │ │ ├── NetworkError.java │ │ └── NoTitleBarDelegate.java │ │ ├── logic │ │ └── ModuleALogic.java │ │ └── ui │ │ ├── MainActivity.java │ │ └── view │ │ ├── Child1Controller.java │ │ ├── Child2Controller.java │ │ └── MainDelegate.java │ └── res │ ├── drawable-xxhdpi │ └── ic_launcher_foreground.xml │ ├── drawable │ └── ic_launcher_background.xml │ ├── layout │ ├── demo_activity_main.xml │ ├── layout_common_title.xml │ ├── view_child1.xml │ └── view_child2.xml │ ├── mipmap-xxhdpi │ └── ic_launcher.png │ └── values │ ├── colors.xml │ ├── ids.xml │ └── strings.xml ├── gradle.properties ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat ├── keystore.gradle ├── library_android ├── build.gradle ├── gradle.properties ├── lint.xml ├── proguard-rules.pro └── src │ └── main │ ├── AndroidManifest.xml │ ├── assets │ └── WebViewJavascriptBridge.js │ ├── java │ └── library │ │ └── common │ │ ├── App.java │ │ ├── framework │ │ ├── Android7FileProvider.java │ │ ├── db │ │ │ ├── BaseDAO.java │ │ │ └── DBHelper.java │ │ ├── image │ │ │ ├── Displayable.java │ │ │ ├── ImageLoaderFactory.java │ │ │ └── glide │ │ │ │ ├── GlideDisplayable.java │ │ │ │ ├── GlideOptions.java │ │ │ │ └── HolderGlideTarget.java │ │ ├── jsbridge │ │ │ ├── BridgeHandler.java │ │ │ ├── BridgeUtil.java │ │ │ ├── BridgeWebView.java │ │ │ ├── BridgeWebViewClient.java │ │ │ ├── CallBackFunction.java │ │ │ └── Message.java │ │ ├── logic │ │ │ ├── BaseLogic.java │ │ │ ├── IRetryHandlerKt.kt │ │ │ ├── ViewModelProviders.java │ │ │ ├── net │ │ │ │ ├── BasicParamsInterceptor.java │ │ │ │ ├── FileProgressRequestBody.java │ │ │ │ ├── GsonConverterFactoryPlus.java │ │ │ │ ├── IProgress.java │ │ │ │ ├── RetrofitManager.java │ │ │ │ ├── SSLUtils.java │ │ │ │ ├── TLSSocketFactory.java │ │ │ │ └── UriProgressRequestBody.java │ │ │ └── permissions │ │ │ │ ├── MPermissions.java │ │ │ │ └── PermissionsFragment.java │ │ ├── notification │ │ │ ├── ChannelEntity.java │ │ │ ├── ImportanceType.java │ │ │ └── NotifyManager.java │ │ └── ui │ │ │ ├── activity │ │ │ ├── UIStateHelper.java │ │ │ ├── presenter │ │ │ │ ├── ActivityPresenter.java │ │ │ │ ├── DialogPresenter.java │ │ │ │ └── FragmentPresenter.java │ │ │ └── view │ │ │ │ ├── AppDelegate.kt │ │ │ │ ├── IDelegate.java │ │ │ │ └── ViewController.kt │ │ │ ├── adapter │ │ │ ├── page │ │ │ │ ├── IPage.java │ │ │ │ ├── Page1.java │ │ │ │ ├── Page2.java │ │ │ │ ├── PageAndRefreshListener.java │ │ │ │ ├── PageListener.java │ │ │ │ └── PageWrapper.java │ │ │ ├── recyclerview │ │ │ │ ├── CommonAdapter.java │ │ │ │ ├── IAdapter.java │ │ │ │ ├── MultiTypeAdapter.java │ │ │ │ ├── MultiTypeSupport.java │ │ │ │ ├── OnItemClickListener.java │ │ │ │ ├── RecyclerClickListener.java │ │ │ │ ├── SimpleRecyclerClickListener.java │ │ │ │ ├── SwipeItemLayout.java │ │ │ │ └── ViewHolder.java │ │ │ └── viewpager │ │ │ │ └── FragmentAdapter.java │ │ │ ├── statusbar │ │ │ ├── IStatusBar.java │ │ │ ├── StatusBarFontHelper.java │ │ │ └── impl │ │ │ │ ├── AndroidMStatusBar.java │ │ │ │ ├── FlymeStatusBar.java │ │ │ │ └── MIUIStatusBar.java │ │ │ ├── swipeback │ │ │ ├── SwipeBackLayout.java │ │ │ ├── Utils.java │ │ │ ├── ViewDragHelper.java │ │ │ └── app │ │ │ │ ├── SwipeBackActivity.java │ │ │ │ ├── SwipeBackActivityBase.java │ │ │ │ ├── SwipeBackActivityHelper.java │ │ │ │ └── SwipeBackListenerActivityAdapter.java │ │ │ └── widget │ │ │ ├── AbstractLoadHelper.java │ │ │ ├── CircleImageView.java │ │ │ ├── DashLine.java │ │ │ ├── ListenableScrollView.kt │ │ │ ├── NestedScrollWebView.java │ │ │ ├── RoundImageView.java │ │ │ ├── ToastHelper.java │ │ │ ├── ViewExtentions.kt │ │ │ └── ViewSwitcher.java │ │ └── util │ │ ├── APKUtils.java │ │ ├── AndroidBug5497Workaround.java │ │ ├── CacheDiskLogStrategy.java │ │ ├── Callback.java │ │ ├── IntentUtils.java │ │ ├── LogUtils.java │ │ ├── NoDoubleClickListener.java │ │ ├── RecyclerViewDivider.java │ │ └── StatusBarUtils.java │ └── res │ ├── drawable-xxhdpi │ ├── com_shadow_bottom.png │ ├── com_shadow_left.png │ └── com_shadow_right.png │ ├── layout │ ├── com_activity_common.xml │ └── com_swipeback_layout.xml │ ├── values │ ├── attrs.xml │ ├── colors.xml │ ├── ids.xml │ ├── strings.xml │ └── styles.xml │ └── xml │ ├── com_file_paths.xml │ └── com_network_security_config.xml ├── library_mqtt ├── .gitignore ├── build.gradle ├── consumer-rules.pro ├── proguard-rules.pro └── src │ ├── androidTest │ └── java │ │ └── library │ │ └── mqtt │ │ └── ExampleInstrumentedTest.kt │ ├── main │ ├── AndroidManifest.xml │ └── java │ │ └── library │ │ └── mqtt │ │ ├── MqttConfig.kt │ │ ├── MqttService.kt │ │ └── MqttStatusEnum.kt │ └── test │ └── java │ └── library │ └── mqtt │ └── ExampleUnitTest.kt ├── local.properties └── settings.gradle /.gitignore: -------------------------------------------------------------------------------- 1 | .gradle/ 2 | .idea/ 3 | .settings/ 4 | build/ 5 | gradle/ 6 | local.properties 7 | *.iml 8 | captures/ 9 | /app/.cxx/ 10 | 11 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hyvenzhu/AndroidLibrary/4f84aa2ad71e9ba36eca24d68b3eab19d5b866ab/README.md -------------------------------------------------------------------------------- /build.gradle: -------------------------------------------------------------------------------- 1 | // Top-level build file where you can add configuration options common to all sub-projects/modules. 2 | // 正式签名存储位置(需要与根目录同级别),需要联系管理员获得正式签名的使用权限 3 | if (file(getRootDir().parent + "/keystore-android/keystore.gradle").exists()) { 4 | apply from: '../keystore-android/keystore.gradle' 5 | } else { 6 | apply from: 'keystore.gradle' 7 | } 8 | buildscript { 9 | repositories { 10 | google() 11 | jcenter() 12 | } 13 | dependencies { 14 | classpath 'com.android.tools.build:gradle:7.4.2' 15 | classpath 'org.jetbrains.kotlin:kotlin-gradle-plugin:1.8.0' 16 | } 17 | } 18 | 19 | allprojects { 20 | repositories { 21 | google() 22 | jcenter() 23 | // uCrop 24 | maven { url "https://jitpack.io" } 25 | } 26 | } 27 | 28 | ext { 29 | minSdkVersion = 21 30 | targetSdkVersion = 33 31 | compileSdkVersion = 33 32 | } -------------------------------------------------------------------------------- /debug.keystore: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hyvenzhu/AndroidLibrary/4f84aa2ad71e9ba36eca24d68b3eab19d5b866ab/debug.keystore -------------------------------------------------------------------------------- /demo/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /demo/build.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: 'com.android.application' 2 | 3 | android { 4 | compileSdkVersion rootProject.ext.compileSdkVersion 5 | 6 | defaultConfig { 7 | minSdkVersion rootProject.ext.minSdkVersion 8 | targetSdkVersion rootProject.ext.targetSdkVersion 9 | applicationId "library.demo" 10 | versionCode VERSION_CODE as int 11 | versionName VERSION_NAME 12 | } 13 | 14 | signingConfigs { 15 | keyConfig { 16 | keyAlias rootProject.ext.KEY_MOBILE_ALIAS 17 | keyPassword rootProject.ext.KEY_PASSWORD 18 | storeFile file(rootProject.ext.KEY_FILE) 19 | storePassword rootProject.ext.KEY_PASSWORD 20 | } 21 | } 22 | 23 | buildTypes { 24 | release { 25 | // 发布用打包配置 26 | minifyEnabled IS_OPEN_MINIFY.toBoolean() 27 | zipAlignEnabled true 28 | debuggable IS_DEBUG_MODE_RELEASE.toBoolean() 29 | signingConfig signingConfigs.keyConfig 30 | buildConfigField 'boolean', 'IS_DEBUG_MODE', IS_DEBUG_MODE_RELEASE 31 | resValue 'string', 'app_name', "Demo" 32 | ndk { 33 | abiFilters "armeabi-v7a" 34 | } 35 | proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 36 | } 37 | debug { 38 | //调试用打包配置 39 | minifyEnabled IS_OPEN_MINIFY.toBoolean() 40 | zipAlignEnabled false 41 | debuggable IS_DEBUG_MODE_DEBUG.toBoolean() 42 | signingConfig signingConfigs.keyConfig 43 | buildConfigField 'boolean', 'IS_DEBUG_MODE', IS_DEBUG_MODE_DEBUG 44 | resValue 'string', 'app_name', "Demo开发" 45 | ndk { 46 | abiFilters "armeabi-v7a", "x86" 47 | } 48 | proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 49 | } 50 | } 51 | 52 | applicationVariants.all { variant -> 53 | variant.outputs.all { output -> 54 | def newName 55 | newName = 'demo-' + VERSION_NAME + '-' + variant.buildType.name + '.apk' 56 | outputFileName = new File(newName) 57 | } 58 | } 59 | 60 | compileOptions { 61 | sourceCompatibility JavaVersion.VERSION_1_8 62 | targetCompatibility JavaVersion.VERSION_1_8 63 | } 64 | } 65 | 66 | dependencies { 67 | implementation fileTree(dir: 'libs', include: ['*.jar']) 68 | implementation project(':library_android') 69 | // butterknife 70 | implementation 'com.jakewharton:butterknife:10.2.0' 71 | annotationProcessor 'com.jakewharton:butterknife-compiler:10.2.0' 72 | } 73 | -------------------------------------------------------------------------------- /demo/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 | -------------------------------------------------------------------------------- /demo/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 10 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /demo/src/main/java/library/demo/AppDroid.java: -------------------------------------------------------------------------------- 1 | package library.demo; 2 | 3 | import android.app.Application; 4 | 5 | import library.common.App; 6 | 7 | 8 | /** 9 | * @author zhuhf 10 | * @version [AndroidLibrary, 2018-03-06] 11 | */ 12 | public class AppDroid extends Application { 13 | @Override 14 | public void onCreate() { 15 | super.onCreate(); 16 | App.init(this); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /demo/src/main/java/library/demo/api/ModuleAApi.java: -------------------------------------------------------------------------------- 1 | package library.demo.api; 2 | 3 | import library.demo.api.res.ListCategory; 4 | import library.demo.base.InfoResult; 5 | 6 | import io.reactivex.Observable; 7 | import retrofit2.http.POST; 8 | 9 | /** 10 | * @author zhuhf 11 | * @version [AndroidLibrary, 2018-03-07] 12 | */ 13 | public interface ModuleAApi { 14 | @POST("api/shop/v4/group/category/list") 15 | Observable> categoryList(); 16 | } 17 | -------------------------------------------------------------------------------- /demo/src/main/java/library/demo/api/res/ListCategory.java: -------------------------------------------------------------------------------- 1 | package library.demo.api.res; 2 | 3 | import java.io.Serializable; 4 | import java.util.List; 5 | 6 | 7 | /** 8 | * @author zhuhf 9 | * @version [AndroidLibrary, 2018-03-07] 10 | */ 11 | public class ListCategory implements Serializable { 12 | List categoryList; 13 | 14 | public static class Category { 15 | String categoryId; 16 | String categoryName; 17 | 18 | @Override 19 | public String toString() { 20 | return "Category{" + 21 | "categoryId='" + categoryId + '\'' + 22 | ", categoryName='" + categoryName + '\'' + 23 | '}'; 24 | } 25 | } 26 | 27 | @Override 28 | public String toString() { 29 | return "ListCategory{" + 30 | "categoryList=" + categoryList + 31 | '}'; 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /demo/src/main/java/library/demo/base/BaseActivity.java: -------------------------------------------------------------------------------- 1 | package library.demo.base; 2 | 3 | import android.os.Message; 4 | 5 | import library.common.framework.ui.activity.presenter.ActivityPresenter; 6 | import library.common.framework.ui.activity.view.IDelegate; 7 | 8 | 9 | /** 10 | * @author zhuhf 11 | * @version [AndroidLibrary, 2018-03-07] 12 | */ 13 | public abstract class BaseActivity extends ActivityPresenter { 14 | @Override 15 | protected void onResponse(Message msg) { 16 | super.onResponse(msg); 17 | if (msg.obj instanceof InfoResult) { 18 | InfoResult infoResult = (InfoResult) msg.obj; 19 | if (infoResult.isSuccess()) { 20 | onSuccess(msg.what, infoResult.getData(), infoResult.getCode()); 21 | } else { 22 | onFailure(msg.what, infoResult.getData(), infoResult.getCode(), infoResult.getErrmsg()); 23 | } 24 | } else { 25 | onFailure(msg.what, msg.obj, null, NetworkError.errorMsg(getApplicationContext(), msg.obj)); 26 | } 27 | } 28 | 29 | /** 30 | * 成功响应 31 | * 32 | * @param requestId 请求Id 33 | * @param response 响应结果 34 | * @param responseCode 响应码 35 | */ 36 | protected void onSuccess(int requestId, Object response, String responseCode) { 37 | } 38 | 39 | /** 40 | * 失败响应 41 | * 42 | * @param requestId 请求Id 43 | * @param response 响应结果 44 | * @param responseCode 响应码 45 | * @param errmsg 错误信息 46 | */ 47 | protected void onFailure(int requestId, Object response, String responseCode, String errmsg) { 48 | } 49 | } 50 | -------------------------------------------------------------------------------- /demo/src/main/java/library/demo/base/BaseDialog.java: -------------------------------------------------------------------------------- 1 | package library.demo.base; 2 | 3 | import android.content.Context; 4 | import android.graphics.Color; 5 | import android.graphics.drawable.ColorDrawable; 6 | import android.graphics.drawable.Drawable; 7 | import android.os.Message; 8 | import android.util.DisplayMetrics; 9 | import android.view.Gravity; 10 | import android.view.Window; 11 | import android.view.WindowManager; 12 | 13 | import androidx.annotation.DrawableRes; 14 | 15 | import library.common.framework.ui.activity.presenter.DialogPresenter; 16 | import library.common.framework.ui.activity.view.IDelegate; 17 | 18 | 19 | /** 20 | * @author zhuhf 21 | * @version [AndroidLibrary, 2018-03-07] 22 | */ 23 | public abstract class BaseDialog extends DialogPresenter { 24 | int screenWidth; 25 | int screenHeight; 26 | float wPercent; 27 | float hPercent; 28 | int gravity = Gravity.CENTER_VERTICAL; 29 | int dimAmount = -1; 30 | 31 | @Override 32 | protected void onCreate() { 33 | super.onCreate(); 34 | getScreenSize(); 35 | } 36 | 37 | @Override 38 | public void onStart() { 39 | super.onStart(); 40 | if (wPercent > 0 && hPercent > 0) { 41 | Window win = getDialog().getWindow(); 42 | WindowManager.LayoutParams params = win.getAttributes(); 43 | params.gravity = gravity; 44 | params.width = (int) (screenWidth * wPercent); 45 | params.height = (int) (screenHeight * hPercent); 46 | win.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT)); 47 | win.setAttributes(params); 48 | } 49 | 50 | if (dimAmount >= 0) { 51 | Window win = getDialog().getWindow(); 52 | WindowManager.LayoutParams params = win.getAttributes(); 53 | params.dimAmount = dimAmount; 54 | win.setAttributes(params); 55 | } 56 | } 57 | 58 | /** 59 | * 设置 Dialog 外边框颜色,0 则外边框完全透明 60 | * 61 | * @param dimAmount 62 | */ 63 | public void setDimAmount(int dimAmount) { 64 | this.dimAmount = dimAmount; 65 | } 66 | 67 | public void setBackgroundDrawable(Drawable drawable) { 68 | Window win = getDialog().getWindow(); 69 | win.setBackgroundDrawable(drawable); 70 | } 71 | 72 | public void setBackgroundDrawableResource(@DrawableRes int resId) { 73 | Window win = getDialog().getWindow(); 74 | win.setBackgroundDrawableResource(resId); 75 | } 76 | 77 | /** 78 | * 设置宽高比 79 | * 80 | * @param wPercent 81 | * @param hPercent 82 | */ 83 | public void setPercent(float wPercent, float hPercent) { 84 | this.wPercent = wPercent; 85 | this.hPercent = hPercent; 86 | } 87 | 88 | /** 89 | * 设置宽高比 90 | * 91 | * @param wPercent 92 | * @param hPercent 93 | * @param gravity 94 | */ 95 | public void setPercent(float wPercent, float hPercent, int gravity) { 96 | this.wPercent = wPercent; 97 | this.hPercent = hPercent; 98 | this.gravity = gravity; 99 | } 100 | 101 | void getScreenSize() { 102 | DisplayMetrics metrics = new DisplayMetrics(); 103 | WindowManager manager = (WindowManager) getActivity().getSystemService(Context.WINDOW_SERVICE); 104 | manager.getDefaultDisplay().getMetrics(metrics); 105 | screenWidth = metrics.widthPixels; 106 | screenHeight = metrics.heightPixels; 107 | } 108 | 109 | @Override 110 | protected void onResponse(Message msg) { 111 | super.onResponse(msg); 112 | if (msg.obj instanceof InfoResult) { 113 | InfoResult infoResult = (InfoResult) msg.obj; 114 | if (infoResult.isSuccess()) { 115 | onSuccess(msg.what, infoResult.getData(), infoResult.getCode()); 116 | } else { 117 | onFailure(msg.what, infoResult.getData(), infoResult.getCode(), infoResult.getErrmsg()); 118 | } 119 | } else { 120 | onFailure(msg.what, msg.obj, null, NetworkError.errorMsg(getContext(), msg.obj)); 121 | } 122 | } 123 | 124 | /** 125 | * 成功响应 126 | * 127 | * @param requestId 请求Id 128 | * @param response 响应结果 129 | * @param responseCode 响应码 130 | */ 131 | protected void onSuccess(int requestId, Object response, String responseCode) { 132 | } 133 | 134 | /** 135 | * 失败响应 136 | * 137 | * @param requestId 请求Id 138 | * @param response 响应结果 139 | * @param responseCode 响应码 140 | * @param errmsg 错误信息 141 | */ 142 | protected void onFailure(int requestId, Object response, String responseCode, String errmsg) { 143 | } 144 | } 145 | -------------------------------------------------------------------------------- /demo/src/main/java/library/demo/base/BaseFragment.java: -------------------------------------------------------------------------------- 1 | package library.demo.base; 2 | 3 | import android.os.Message; 4 | 5 | import library.common.framework.ui.activity.presenter.FragmentPresenter; 6 | import library.common.framework.ui.activity.view.IDelegate; 7 | 8 | 9 | /** 10 | * @author zhuhf 11 | * @version [AndroidLibrary, 2018-03-07] 12 | */ 13 | public abstract class BaseFragment extends FragmentPresenter { 14 | @Override 15 | protected void onResponse(Message msg) { 16 | super.onResponse(msg); 17 | if (msg.obj instanceof InfoResult) { 18 | InfoResult infoResult = (InfoResult) msg.obj; 19 | if (infoResult.isSuccess()) { 20 | onSuccess(msg.what, infoResult.getData(), infoResult.getCode()); 21 | } else { 22 | onFailure(msg.what, infoResult.getData(), infoResult.getCode(), infoResult.getErrmsg()); 23 | } 24 | } else { 25 | onFailure(msg.what, msg.obj, null, NetworkError.errorMsg(getActivity(), msg.obj)); 26 | } 27 | } 28 | 29 | /** 30 | * 成功响应 31 | * 32 | * @param requestId 请求Id 33 | * @param response 响应结果 34 | * @param responseCode 响应码 35 | */ 36 | protected void onSuccess(int requestId, Object response, String responseCode) { 37 | } 38 | 39 | /** 40 | * 失败响应 41 | * 42 | * @param requestId 请求Id 43 | * @param response 响应结果 44 | * @param responseCode 响应码 45 | * @param errmsg 错误信息 46 | */ 47 | protected void onFailure(int requestId, Object response, String responseCode, String errmsg) { 48 | } 49 | } 50 | -------------------------------------------------------------------------------- /demo/src/main/java/library/demo/base/CommonTitleBarDelegate.java: -------------------------------------------------------------------------------- 1 | package library.demo.base; 2 | 3 | import android.graphics.Color; 4 | import android.view.LayoutInflater; 5 | import android.view.View; 6 | import android.view.ViewGroup; 7 | 8 | import library.common.framework.ui.activity.view.AppDelegate; 9 | import library.common.framework.ui.widget.AbstractLoadHelper; 10 | import library.demo.R; 11 | 12 | 13 | /** 14 | * 全局统一标题栏 15 | * 16 | * @author zhuhf 17 | * @version [AndroidLibrary, 2018-03-07] 18 | */ 19 | public abstract class CommonTitleBarDelegate extends AppDelegate { 20 | 21 | @Override 22 | public View getTitleView(ViewGroup root) { 23 | return LayoutInflater.from(getActivity()).inflate(R.layout.layout_common_title, root); 24 | } 25 | 26 | protected Class getViewBindClass() { 27 | return null; 28 | } 29 | 30 | @Override 31 | public void initWidget() { 32 | super.initWidget(); 33 | setCommonTitleColor(Color.parseColor("#ffffff")); 34 | setLightMode(getActivity()); 35 | } 36 | 37 | @Override 38 | protected AbstractLoadHelper getLoadViewHelper(View view) { 39 | return null; 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /demo/src/main/java/library/demo/base/DemoBaseLogic.java: -------------------------------------------------------------------------------- 1 | package library.demo.base; 2 | 3 | /** 4 | * @author zhuhf 5 | * @version [AndroidLibrary, 2018-03-07] 6 | */ 7 | public class DemoBaseLogic extends library.common.framework.logic.BaseLogic { 8 | /** 9 | * 构造函数 10 | * 11 | * @param subscriber 最终订阅者 12 | */ 13 | public DemoBaseLogic(Object subscriber) { 14 | super(subscriber); 15 | } 16 | 17 | @Override 18 | protected String getBaseUrl() { 19 | return "http://10.100.122.34:3000"; 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /demo/src/main/java/library/demo/base/InfoResult.java: -------------------------------------------------------------------------------- 1 | package library.demo.base; 2 | 3 | import java.io.Serializable; 4 | 5 | 6 | /** 7 | * @author zhuhf 8 | * @version [AndroidLibrary, 2018-03-07] 9 | */ 10 | public class InfoResult implements Serializable { 11 | static final String SUCCESS_CODE = "0"; 12 | private String code; 13 | private String errmsg; 14 | private T data; 15 | 16 | public boolean isSuccess() { 17 | return SUCCESS_CODE.equals(code); 18 | } 19 | 20 | public String getCode() { 21 | return code; 22 | } 23 | 24 | public T getData() { 25 | return data; 26 | } 27 | 28 | public void setData(T data) { 29 | this.data = data; 30 | } 31 | 32 | public String getErrmsg() { 33 | return errmsg; 34 | } 35 | 36 | @Override 37 | public String toString() { 38 | return "InfoResult{" + 39 | "code='" + code + '\'' + 40 | ", errmsg='" + errmsg + '\'' + 41 | ", data=" + data + 42 | '}'; 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /demo/src/main/java/library/demo/base/NetworkError.java: -------------------------------------------------------------------------------- 1 | package library.demo.base; 2 | 3 | import android.content.Context; 4 | import android.net.ConnectivityManager; 5 | import android.net.NetworkInfo; 6 | 7 | import com.google.gson.JsonParseException; 8 | 9 | import java.net.ConnectException; 10 | import java.net.SocketTimeoutException; 11 | import java.util.concurrent.TimeoutException; 12 | 13 | import library.demo.R; 14 | 15 | /** 16 | * @author zhuhf 17 | * @version [AndroidLibrary, 2018-03-16] 18 | */ 19 | public class NetworkError { 20 | 21 | public static String errorMsg(Context context, Object ex) { 22 | String errmsg = null; 23 | if (ex instanceof ConnectException) { 24 | if (!isNetworkAvailable(context)) { 25 | errmsg = context.getString(R.string.common_request_no_network); 26 | } else { 27 | errmsg = context.getString(R.string.common_request_failure); 28 | } 29 | } else if (ex instanceof TimeoutException || ex instanceof SocketTimeoutException) { 30 | errmsg = context.getString(R.string.common_request_failure); 31 | } else if (ex instanceof JsonParseException) { 32 | errmsg = context.getString(R.string.common_request_parse_error); 33 | } else { 34 | errmsg = context.getString(R.string.common_request_failure); 35 | } 36 | return errmsg; 37 | } 38 | 39 | public static boolean isNetworkAvailable(Context context) { 40 | ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); 41 | NetworkInfo netInfo = cm.getActiveNetworkInfo(); 42 | return netInfo != null && netInfo.isConnectedOrConnecting(); 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /demo/src/main/java/library/demo/base/NoTitleBarDelegate.java: -------------------------------------------------------------------------------- 1 | package library.demo.base; 2 | 3 | import android.view.View; 4 | import android.view.ViewGroup; 5 | 6 | import library.common.framework.ui.activity.view.AppDelegate; 7 | 8 | 9 | /** 10 | * 不带标题栏 11 | * 12 | * @author zhuhf 13 | * @version [AndroidLibrary, 2018-03-07] 14 | */ 15 | public abstract class NoTitleBarDelegate extends AppDelegate { 16 | @Override 17 | public View getTitleView(ViewGroup root) { 18 | return null; 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /demo/src/main/java/library/demo/logic/ModuleALogic.java: -------------------------------------------------------------------------------- 1 | package library.demo.logic; 2 | 3 | import library.demo.R; 4 | import library.demo.api.ModuleAApi; 5 | import library.demo.base.DemoBaseLogic; 6 | 7 | 8 | /** 9 | * @author zhuhf 10 | * @version [AndroidLibrary, 2018-03-07] 11 | */ 12 | public class ModuleALogic extends DemoBaseLogic { 13 | ModuleAApi api; 14 | /** 15 | * 构造函数 16 | * 17 | * @param subscriber 最终订阅者 18 | */ 19 | public ModuleALogic(Object subscriber) { 20 | super(subscriber); 21 | api = create(ModuleAApi.class); 22 | } 23 | 24 | public void categoryList() { 25 | sendRequest(api.categoryList(), R.id.demo_id); 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /demo/src/main/java/library/demo/ui/MainActivity.java: -------------------------------------------------------------------------------- 1 | package library.demo.ui; 2 | 3 | import library.demo.R; 4 | import library.demo.base.BaseActivity; 5 | import library.demo.logic.ModuleALogic; 6 | import library.demo.ui.view.MainDelegate; 7 | import android.view.View; 8 | 9 | 10 | /** 11 | * @author zhuhf 12 | * @version [AndroidLibrary, 2018-03-07] 13 | */ 14 | public class MainActivity extends BaseActivity { 15 | @Override 16 | protected Class getDelegateClass() { 17 | return MainDelegate.class; 18 | } 19 | 20 | @Override 21 | protected Object beforeOnChanged(Object res) { 22 | return null; 23 | } 24 | 25 | @Override 26 | protected void onCreate() { 27 | super.onCreate(); 28 | 29 | final ModuleALogic logic = findLogic(new ModuleALogic(this)); 30 | 31 | viewDelegate.setOnClickListener(new View.OnClickListener() { 32 | @Override 33 | public void onClick(View v) { 34 | logic.categoryList(); 35 | } 36 | }, R.id.btn); 37 | 38 | } 39 | 40 | @Override 41 | protected void onDestroy() { 42 | super.onDestroy(); 43 | } 44 | 45 | @Override 46 | protected void onSuccess(int requestId, Object response, String responseCode) { 47 | super.onSuccess(requestId, response, responseCode); 48 | if (requestId == R.id.demo_id) { 49 | } 50 | } 51 | 52 | @Override 53 | protected void onFailure(int requestId, Object response, String responseCode, String errmsg) { 54 | super.onFailure(requestId, response, responseCode, errmsg); 55 | if (requestId == R.id.demo_id) { 56 | } 57 | } 58 | } 59 | -------------------------------------------------------------------------------- /demo/src/main/java/library/demo/ui/view/Child1Controller.java: -------------------------------------------------------------------------------- 1 | package library.demo.ui.view; 2 | 3 | import android.widget.TextView; 4 | 5 | import library.common.framework.ui.activity.view.AppDelegate; 6 | import library.common.framework.ui.activity.view.ViewController; 7 | import library.demo.R; 8 | 9 | /** 10 | * @author zhuhf 11 | * @version 2019/1/23 12 | */ 13 | public class Child1Controller extends ViewController { 14 | 15 | public Child1Controller(AppDelegate appDelegate, int parentId) { 16 | super(appDelegate, parentId); 17 | } 18 | 19 | @Override 20 | public int getView() { 21 | return R.layout.view_child1; 22 | } 23 | 24 | public void initWidget() { 25 | super.initWidget(); 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /demo/src/main/java/library/demo/ui/view/Child2Controller.java: -------------------------------------------------------------------------------- 1 | package library.demo.ui.view; 2 | 3 | import library.common.framework.ui.activity.view.AppDelegate; 4 | import library.common.framework.ui.activity.view.ViewController; 5 | import library.demo.R; 6 | 7 | /** 8 | * @author zhuhf 9 | * @version 2019/1/23 10 | */ 11 | public class Child2Controller extends ViewController { 12 | 13 | public Child2Controller(AppDelegate appDelegate, int parentId) { 14 | super(appDelegate, parentId); 15 | } 16 | 17 | @Override 18 | public int getView() { 19 | return R.layout.view_child2; 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /demo/src/main/java/library/demo/ui/view/MainDelegate.java: -------------------------------------------------------------------------------- 1 | package library.demo.ui.view; 2 | 3 | import android.content.Intent; 4 | 5 | import library.demo.R; 6 | import library.demo.base.CommonTitleBarDelegate; 7 | 8 | 9 | /** 10 | * @author zhuhf 11 | * @version [AndroidLibrary, 2018-03-07] 12 | */ 13 | public class MainDelegate extends CommonTitleBarDelegate { 14 | Child1Controller child1; 15 | 16 | @Override 17 | public int getContentLayoutId() { 18 | return R.layout.demo_activity_main; 19 | } 20 | 21 | @Override 22 | public void initWidget(Intent intent) { 23 | super.initWidget(intent); 24 | // 拆分多个子View 25 | child1 = new Child1Controller(this, R.id.group1); 26 | Child2Controller child2 = new Child2Controller(this, R.id.group1); 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /demo/src/main/res/drawable-xxhdpi/ic_launcher_foreground.xml: -------------------------------------------------------------------------------- 1 | 7 | 12 | 13 | 19 | 22 | 25 | 26 | 27 | 28 | 34 | 35 | -------------------------------------------------------------------------------- /demo/src/main/res/layout/demo_activity_main.xml: -------------------------------------------------------------------------------- 1 | 6 | 7 |