From d780cb96608c633b2fd59fce2228f42940da6ee8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BE=90=E5=8B=A4=E6=B0=91?= Date: Sun, 25 Aug 2024 22:13:45 +0800 Subject: [PATCH] =?UTF-8?q?=E9=83=A8=E5=88=86=E9=97=AE=E9=A2=98=E4=BF=AE?= =?UTF-8?q?=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- base/.gitattributes | 2 + base/.gitignore | 83 +++ base/README.md | 184 +++++ base/build.gradle | 94 +++ base/consumer-rules.pro | 0 base/proguard-rules.pro | 21 + base/src/main/AndroidManifest.xml | 26 + .../PermissionsManager.kt | 155 +++++ .../util/PermissionCheckerFragment.kt | 237 +++++++ .../util/PermissionsUtil.kt | 54 ++ .../util/QuickPermissionsOptions.kt | 11 + .../util/QuickPermissionsRequest.kt | 30 + base/src/main/java/com/xuqm/base/App.java | 111 +++ .../main/java/com/xuqm/base/CrashHandler.java | 222 ++++++ .../java/com/xuqm/base/adapter/BaseItem.java | 17 + .../xuqm/base/adapter/BaseNormalAdapter.java | 186 +++++ .../xuqm/base/adapter/BasePagedAdapter.java | 157 +++++ .../com/xuqm/base/adapter/CommonAdapter.java | 59 ++ .../xuqm/base/adapter/CommonPagedAdapter.java | 36 + .../main/java/com/xuqm/base/adapter/Diff.java | 16 + .../adapter/ElasticHorizontalScrollView.java | 72 ++ .../xuqm/base/adapter/FragmentAdapter.java | 30 + .../xuqm/base/adapter/ItemViewDelegate.java | 15 + .../base/adapter/ItemViewDelegateManager.java | 95 +++ .../com/xuqm/base/adapter/SlipReAdapter.java | 178 +++++ .../com/xuqm/base/adapter/ViewHolder.java | 171 +++++ .../callback/AdapterClickListener.java | 10 + .../callback/AdapterItemClickListener.java | 11 + .../AdapterItemLongClickListener.java | 11 + .../java/com/xuqm/base/common/AESCBCUtil.java | 143 ++++ .../java/com/xuqm/base/common/AppManager.java | 106 +++ .../xuqm/base/common/DeviceUuidFactory.java | 87 +++ .../com/xuqm/base/common/DimensHelper.java | 10 + .../java/com/xuqm/base/common/FileHelper.java | 218 ++++++ .../com/xuqm/base/common/GlideEngine.java | 112 +++ .../com/xuqm/base/common/GsonImplHelp.java | 61 ++ .../java/com/xuqm/base/common/ImageHelp.java | 53 ++ .../com/xuqm/base/common/ImageHelper.java | 34 + .../main/java/com/xuqm/base/common/Json.java | 31 + .../java/com/xuqm/base/common/LogHelper.java | 75 ++ .../com/xuqm/base/common/RefreshResult.java | 8 + .../com/xuqm/base/common/ScreenUtils.java | 18 + .../base/common/SharedPreferencesConfigs.kt | 13 + .../java/com/xuqm/base/common/TimeHelper.java | 94 +++ .../com/xuqm/base/common/ToolsHelper.java | 274 ++++++++ .../base/datasource/DataSourceFactory.java | 23 + .../xuqm/base/datasource/PagedDataLoader.java | 13 + .../xuqm/base/datasource/PagedDataSource.java | 26 + .../xuqm/base/di/component/AppComponent.java | 28 + .../xuqm/base/di/interceptor/HttpLogger.java | 28 + .../di/interceptor/LoggingInterceptor.java | 57 ++ .../com/xuqm/base/di/manager/HttpManager.java | 82 +++ .../xuqm/base/di/module/NetworkModule.java | 97 +++ .../xuqm/base/dialog/AlertDialogFragment.kt | 83 +++ .../loading/ColorfulRingProgressView.java | 164 +++++ .../base/dialog/loading/LoadingDialog.java | 238 +++++++ .../com/xuqm/base/extensions/CommonExt.kt | 232 +++++++ .../java/com/xuqm/base/extensions/FontExt.kt | 10 + .../java/com/xuqm/base/extensions/Fonts.kt | 25 + .../xuqm/base/file/DownloadInterceptor.java | 22 + .../com/xuqm/base/file/DownloadListener.java | 11 + .../xuqm/base/file/DownloadResponseBody.java | 70 ++ .../xuqm/base/file/FileDownLoadObserver.java | 80 +++ .../file/FileDownloadAndUploadManager.java | 178 +++++ .../java/com/xuqm/base/model/HttpResult.java | 48 ++ .../com/xuqm/base/model/KeyValueData.java | 38 + .../xuqm/base/repository/CommonService.java | 21 + .../java/com/xuqm/base/ui/BaseActivity.java | 382 ++++++++++ .../java/com/xuqm/base/ui/BaseFragment.java | 61 ++ .../com/xuqm/base/ui/BaseListActivity.java | 161 +++++ .../xuqm/base/ui/BaseListAppBarFragment.java | 174 +++++ .../base/ui/BaseListFormLayoutActivity.java | 174 +++++ .../com/xuqm/base/ui/BaseListFragment.java | 163 +++++ .../base/ui/BaseListFromLayoutFragment.java | 185 +++++ .../base/ui/adapter/ImageViewAdapter.java | 44 ++ .../base/ui/callback/ToolBarListener.java | 5 + .../com/xuqm/base/ui/callback/UiCallback.java | 23 + .../java/com/xuqm/base/view/EmptyMsgView.java | 100 +++ .../java/com/xuqm/base/view/EmptyView.java | 112 +++ .../com/xuqm/base/view/FlowRadioGroup.java | 120 ++++ .../com/xuqm/base/view/GalleryTransformer.kt | 35 + .../xuqm/base/view/MaxLimitRecyclerView.java | 69 ++ .../base/view/SelectableRoundedImageView.java | 657 ++++++++++++++++++ .../com/xuqm/base/view/StrokeTextView.java | 83 +++ .../java/com/xuqm/base/view/SuperViewPager.kt | 98 +++ .../com/xuqm/base/view/ToolbarLayout.java | 150 ++++ .../java/com/xuqm/base/view/enu/Status.java | 5 + .../base/viewmodel/BaseListViewModel.java | 132 ++++ .../xuqm/base/viewmodel/BaseViewModel.java | 67 ++ .../callback/AdapterObserverCallback.java | 7 + .../callback/DataObserverCallback.java | 13 + .../base/viewmodel/callback/Response.java | 7 + .../com/xuqm/base/web/XAndroidInterface.kt | 41 ++ .../java/com/xuqm/base/web/XWebCallBack.kt | 25 + .../com/xuqm/base/web/XWebChromeClient.kt | 115 +++ .../java/com/xuqm/base/web/XWebJsCallModel.kt | 8 + .../com/xuqm/base/web/XWebViewActivity.kt | 237 +++++++ .../java/com/xuqm/base/web/XWebViewClient.kt | 19 + .../java/com/xuqm/base/web/XWebViewHelper.kt | 22 + .../java/com/xuqm/base/web/XWebViewModel.kt | 128 ++++ .../xuqm/base/webSocket/ConnectStatus.java | 9 + .../base/webSocket/WebSocketCallBack.java | 11 + .../xuqm/base/webSocket/WebSocketHandler.java | 171 +++++ base/src/main/res/drawable-hdpi/ic_arrow.png | Bin 0 -> 630 bytes base/src/main/res/drawable-mdpi/ic_arrow.png | Bin 0 -> 377 bytes base/src/main/res/drawable-xhdpi/ic_arrow.png | Bin 0 -> 691 bytes .../main/res/drawable-xhdpi/new_pro_bg.9.png | Bin 0 -> 1132 bytes .../src/main/res/drawable-xxhdpi/ic_arrow.png | Bin 0 -> 1330 bytes .../res/drawable-xxhdpi/ic_back_arrow.png | Bin 0 -> 249 bytes .../drawable-xxhdpi/ic_orange_arrow_down.png | Bin 0 -> 1224 bytes .../drawable-xxhdpi/ic_orange_arrow_up.png | Bin 0 -> 1175 bytes .../main/res/drawable-xxxhdpi/ic_arrow.png | Bin 0 -> 1483 bytes .../res/drawable/dialog_style_xml_icon.xml | 27 + .../res/drawable/ic_baseline_close_24.xml | 5 + base/src/main/res/drawable/ic_load_failed.xml | 9 + base/src/main/res/drawable/ic_loading.xml | 44 ++ .../res/drawable/ic_network_unavailable.xml | 9 + base/src/main/res/drawable/ic_no_data.xml | 9 + base/src/main/res/drawable/ic_top_menu.xml | 5 + base/src/main/res/drawable/icon_loading.png | Bin 0 -> 4476 bytes base/src/main/res/drawable/load_progress.xml | 9 + .../drawable/picture_new_item_select_bg.xml | 7 + base/src/main/res/layout/activity_base.xml | 16 + .../main/res/layout/activity_base_list.xml | 23 + .../res/layout/activity_base_list_app_bar.xml | 43 ++ .../main/res/layout/activity_x_webview.xml | 27 + base/src/main/res/layout/empty_msg_view.xml | 102 +++ base/src/main/res/layout/empty_view.xml | 104 +++ base/src/main/res/layout/item_slip.xml | 40 ++ .../loading_circle_process_dialog_icon.xml | 39 ++ ...circle_process_dialog_icon_by_textview.xml | 45 ++ .../layout/loading_process_dialog_icon.xml | 26 + .../res/layout/super_viewpager_layout.xml | 8 + base/src/main/res/layout/toolbar.xml | 88 +++ base/src/main/res/mipmap-hdpi/btn_back.png | Bin 0 -> 1668 bytes base/src/main/res/mipmap-hdpi/empty.png | Bin 0 -> 13986 bytes base/src/main/res/mipmap-hdpi/home_follow.png | Bin 0 -> 2511 bytes base/src/main/res/mipmap-hdpi/honem_chat.png | Bin 0 -> 2689 bytes base/src/main/res/mipmap-hdpi/network.png | Bin 0 -> 11283 bytes base/src/main/res/mipmap-hdpi/nomessage.png | Bin 0 -> 12000 bytes base/src/main/res/mipmap-hdpi/video_lock.png | Bin 0 -> 3010 bytes base/src/main/res/mipmap-hdpi/video_play.png | Bin 0 -> 3760 bytes base/src/main/res/mipmap-mdpi/btn_back.png | Bin 0 -> 877 bytes base/src/main/res/mipmap-mdpi/empty.png | Bin 0 -> 6966 bytes base/src/main/res/mipmap-mdpi/home_follow.png | Bin 0 -> 1308 bytes base/src/main/res/mipmap-mdpi/honem_chat.png | Bin 0 -> 1344 bytes base/src/main/res/mipmap-mdpi/network.png | Bin 0 -> 5930 bytes base/src/main/res/mipmap-mdpi/nomessage.png | Bin 0 -> 6183 bytes base/src/main/res/mipmap-mdpi/video_lock.png | Bin 0 -> 1748 bytes base/src/main/res/mipmap-mdpi/video_play.png | Bin 0 -> 1984 bytes base/src/main/res/mipmap-xhdpi/btn_back.png | Bin 0 -> 1864 bytes base/src/main/res/mipmap-xhdpi/empty.png | Bin 0 -> 18803 bytes .../src/main/res/mipmap-xhdpi/home_follow.png | Bin 0 -> 2837 bytes base/src/main/res/mipmap-xhdpi/honem_chat.png | Bin 0 -> 2922 bytes base/src/main/res/mipmap-xhdpi/network.png | Bin 0 -> 13938 bytes base/src/main/res/mipmap-xhdpi/nomessage.png | Bin 0 -> 14413 bytes base/src/main/res/mipmap-xhdpi/video_lock.png | Bin 0 -> 5025 bytes base/src/main/res/mipmap-xhdpi/video_play.png | Bin 0 -> 4516 bytes base/src/main/res/mipmap-xxhdpi/btn_back.png | Bin 0 -> 3477 bytes base/src/main/res/mipmap-xxhdpi/empty.png | Bin 0 -> 37476 bytes .../main/res/mipmap-xxhdpi/home_follow.png | Bin 0 -> 5322 bytes .../src/main/res/mipmap-xxhdpi/honem_chat.png | Bin 0 -> 5665 bytes base/src/main/res/mipmap-xxhdpi/network.png | Bin 0 -> 27872 bytes base/src/main/res/mipmap-xxhdpi/nomessage.png | Bin 0 -> 29059 bytes .../src/main/res/mipmap-xxhdpi/video_lock.png | Bin 0 -> 9315 bytes .../src/main/res/mipmap-xxhdpi/video_play.png | Bin 0 -> 8625 bytes base/src/main/res/mipmap-xxxhdpi/btn_back.png | Bin 0 -> 3715 bytes base/src/main/res/mipmap-xxxhdpi/empty.png | Bin 0 -> 52294 bytes .../main/res/mipmap-xxxhdpi/home_follow.png | Bin 0 -> 5741 bytes .../main/res/mipmap-xxxhdpi/honem_chat.png | Bin 0 -> 5953 bytes base/src/main/res/mipmap-xxxhdpi/network.png | Bin 0 -> 34799 bytes .../src/main/res/mipmap-xxxhdpi/nomessage.png | Bin 0 -> 36104 bytes .../main/res/mipmap-xxxhdpi/video_lock.png | Bin 0 -> 9543 bytes .../main/res/mipmap-xxxhdpi/video_play.png | Bin 0 -> 9526 bytes base/src/main/res/values/attr.xml | 14 + base/src/main/res/values/attrs.xml | 11 + base/src/main/res/values/colors.xml | 41 ++ base/src/main/res/values/dimens.xml | 4 + base/src/main/res/values/strings.xml | 5 + base/src/main/res/values/styles.xml | 42 ++ base/src/main/res/xml/file_paths.xml | 11 + config.gradle | 6 +- core/build.gradle | 4 +- settings.gradle | 2 +- 184 files changed, 9837 insertions(+), 6 deletions(-) create mode 100644 base/.gitattributes create mode 100644 base/.gitignore create mode 100644 base/README.md create mode 100644 base/build.gradle create mode 100644 base/consumer-rules.pro create mode 100644 base/proguard-rules.pro create mode 100644 base/src/main/AndroidManifest.xml create mode 100644 base/src/main/java/com/livinglifetechway/quickpermissions_kotlin/PermissionsManager.kt create mode 100644 base/src/main/java/com/livinglifetechway/quickpermissions_kotlin/util/PermissionCheckerFragment.kt create mode 100644 base/src/main/java/com/livinglifetechway/quickpermissions_kotlin/util/PermissionsUtil.kt create mode 100644 base/src/main/java/com/livinglifetechway/quickpermissions_kotlin/util/QuickPermissionsOptions.kt create mode 100644 base/src/main/java/com/livinglifetechway/quickpermissions_kotlin/util/QuickPermissionsRequest.kt create mode 100644 base/src/main/java/com/xuqm/base/App.java create mode 100644 base/src/main/java/com/xuqm/base/CrashHandler.java create mode 100644 base/src/main/java/com/xuqm/base/adapter/BaseItem.java create mode 100644 base/src/main/java/com/xuqm/base/adapter/BaseNormalAdapter.java create mode 100644 base/src/main/java/com/xuqm/base/adapter/BasePagedAdapter.java create mode 100644 base/src/main/java/com/xuqm/base/adapter/CommonAdapter.java create mode 100644 base/src/main/java/com/xuqm/base/adapter/CommonPagedAdapter.java create mode 100644 base/src/main/java/com/xuqm/base/adapter/Diff.java create mode 100644 base/src/main/java/com/xuqm/base/adapter/ElasticHorizontalScrollView.java create mode 100644 base/src/main/java/com/xuqm/base/adapter/FragmentAdapter.java create mode 100644 base/src/main/java/com/xuqm/base/adapter/ItemViewDelegate.java create mode 100644 base/src/main/java/com/xuqm/base/adapter/ItemViewDelegateManager.java create mode 100644 base/src/main/java/com/xuqm/base/adapter/SlipReAdapter.java create mode 100644 base/src/main/java/com/xuqm/base/adapter/ViewHolder.java create mode 100644 base/src/main/java/com/xuqm/base/adapter/callback/AdapterClickListener.java create mode 100644 base/src/main/java/com/xuqm/base/adapter/callback/AdapterItemClickListener.java create mode 100644 base/src/main/java/com/xuqm/base/adapter/callback/AdapterItemLongClickListener.java create mode 100644 base/src/main/java/com/xuqm/base/common/AESCBCUtil.java create mode 100644 base/src/main/java/com/xuqm/base/common/AppManager.java create mode 100644 base/src/main/java/com/xuqm/base/common/DeviceUuidFactory.java create mode 100644 base/src/main/java/com/xuqm/base/common/DimensHelper.java create mode 100644 base/src/main/java/com/xuqm/base/common/FileHelper.java create mode 100644 base/src/main/java/com/xuqm/base/common/GlideEngine.java create mode 100644 base/src/main/java/com/xuqm/base/common/GsonImplHelp.java create mode 100644 base/src/main/java/com/xuqm/base/common/ImageHelp.java create mode 100644 base/src/main/java/com/xuqm/base/common/ImageHelper.java create mode 100644 base/src/main/java/com/xuqm/base/common/Json.java create mode 100644 base/src/main/java/com/xuqm/base/common/LogHelper.java create mode 100644 base/src/main/java/com/xuqm/base/common/RefreshResult.java create mode 100644 base/src/main/java/com/xuqm/base/common/ScreenUtils.java create mode 100644 base/src/main/java/com/xuqm/base/common/SharedPreferencesConfigs.kt create mode 100644 base/src/main/java/com/xuqm/base/common/TimeHelper.java create mode 100644 base/src/main/java/com/xuqm/base/common/ToolsHelper.java create mode 100644 base/src/main/java/com/xuqm/base/datasource/DataSourceFactory.java create mode 100644 base/src/main/java/com/xuqm/base/datasource/PagedDataLoader.java create mode 100644 base/src/main/java/com/xuqm/base/datasource/PagedDataSource.java create mode 100644 base/src/main/java/com/xuqm/base/di/component/AppComponent.java create mode 100644 base/src/main/java/com/xuqm/base/di/interceptor/HttpLogger.java create mode 100644 base/src/main/java/com/xuqm/base/di/interceptor/LoggingInterceptor.java create mode 100644 base/src/main/java/com/xuqm/base/di/manager/HttpManager.java create mode 100644 base/src/main/java/com/xuqm/base/di/module/NetworkModule.java create mode 100644 base/src/main/java/com/xuqm/base/dialog/AlertDialogFragment.kt create mode 100644 base/src/main/java/com/xuqm/base/dialog/loading/ColorfulRingProgressView.java create mode 100644 base/src/main/java/com/xuqm/base/dialog/loading/LoadingDialog.java create mode 100644 base/src/main/java/com/xuqm/base/extensions/CommonExt.kt create mode 100644 base/src/main/java/com/xuqm/base/extensions/FontExt.kt create mode 100644 base/src/main/java/com/xuqm/base/extensions/Fonts.kt create mode 100644 base/src/main/java/com/xuqm/base/file/DownloadInterceptor.java create mode 100644 base/src/main/java/com/xuqm/base/file/DownloadListener.java create mode 100644 base/src/main/java/com/xuqm/base/file/DownloadResponseBody.java create mode 100644 base/src/main/java/com/xuqm/base/file/FileDownLoadObserver.java create mode 100644 base/src/main/java/com/xuqm/base/file/FileDownloadAndUploadManager.java create mode 100644 base/src/main/java/com/xuqm/base/model/HttpResult.java create mode 100644 base/src/main/java/com/xuqm/base/model/KeyValueData.java create mode 100644 base/src/main/java/com/xuqm/base/repository/CommonService.java create mode 100644 base/src/main/java/com/xuqm/base/ui/BaseActivity.java create mode 100644 base/src/main/java/com/xuqm/base/ui/BaseFragment.java create mode 100644 base/src/main/java/com/xuqm/base/ui/BaseListActivity.java create mode 100644 base/src/main/java/com/xuqm/base/ui/BaseListAppBarFragment.java create mode 100644 base/src/main/java/com/xuqm/base/ui/BaseListFormLayoutActivity.java create mode 100644 base/src/main/java/com/xuqm/base/ui/BaseListFragment.java create mode 100644 base/src/main/java/com/xuqm/base/ui/BaseListFromLayoutFragment.java create mode 100644 base/src/main/java/com/xuqm/base/ui/adapter/ImageViewAdapter.java create mode 100644 base/src/main/java/com/xuqm/base/ui/callback/ToolBarListener.java create mode 100644 base/src/main/java/com/xuqm/base/ui/callback/UiCallback.java create mode 100644 base/src/main/java/com/xuqm/base/view/EmptyMsgView.java create mode 100644 base/src/main/java/com/xuqm/base/view/EmptyView.java create mode 100644 base/src/main/java/com/xuqm/base/view/FlowRadioGroup.java create mode 100644 base/src/main/java/com/xuqm/base/view/GalleryTransformer.kt create mode 100644 base/src/main/java/com/xuqm/base/view/MaxLimitRecyclerView.java create mode 100644 base/src/main/java/com/xuqm/base/view/SelectableRoundedImageView.java create mode 100644 base/src/main/java/com/xuqm/base/view/StrokeTextView.java create mode 100644 base/src/main/java/com/xuqm/base/view/SuperViewPager.kt create mode 100644 base/src/main/java/com/xuqm/base/view/ToolbarLayout.java create mode 100644 base/src/main/java/com/xuqm/base/view/enu/Status.java create mode 100644 base/src/main/java/com/xuqm/base/viewmodel/BaseListViewModel.java create mode 100644 base/src/main/java/com/xuqm/base/viewmodel/BaseViewModel.java create mode 100644 base/src/main/java/com/xuqm/base/viewmodel/callback/AdapterObserverCallback.java create mode 100644 base/src/main/java/com/xuqm/base/viewmodel/callback/DataObserverCallback.java create mode 100644 base/src/main/java/com/xuqm/base/viewmodel/callback/Response.java create mode 100644 base/src/main/java/com/xuqm/base/web/XAndroidInterface.kt create mode 100644 base/src/main/java/com/xuqm/base/web/XWebCallBack.kt create mode 100644 base/src/main/java/com/xuqm/base/web/XWebChromeClient.kt create mode 100644 base/src/main/java/com/xuqm/base/web/XWebJsCallModel.kt create mode 100644 base/src/main/java/com/xuqm/base/web/XWebViewActivity.kt create mode 100644 base/src/main/java/com/xuqm/base/web/XWebViewClient.kt create mode 100644 base/src/main/java/com/xuqm/base/web/XWebViewHelper.kt create mode 100644 base/src/main/java/com/xuqm/base/web/XWebViewModel.kt create mode 100644 base/src/main/java/com/xuqm/base/webSocket/ConnectStatus.java create mode 100644 base/src/main/java/com/xuqm/base/webSocket/WebSocketCallBack.java create mode 100644 base/src/main/java/com/xuqm/base/webSocket/WebSocketHandler.java create mode 100644 base/src/main/res/drawable-hdpi/ic_arrow.png create mode 100644 base/src/main/res/drawable-mdpi/ic_arrow.png create mode 100644 base/src/main/res/drawable-xhdpi/ic_arrow.png create mode 100644 base/src/main/res/drawable-xhdpi/new_pro_bg.9.png create mode 100644 base/src/main/res/drawable-xxhdpi/ic_arrow.png create mode 100644 base/src/main/res/drawable-xxhdpi/ic_back_arrow.png create mode 100644 base/src/main/res/drawable-xxhdpi/ic_orange_arrow_down.png create mode 100644 base/src/main/res/drawable-xxhdpi/ic_orange_arrow_up.png create mode 100644 base/src/main/res/drawable-xxxhdpi/ic_arrow.png create mode 100644 base/src/main/res/drawable/dialog_style_xml_icon.xml create mode 100644 base/src/main/res/drawable/ic_baseline_close_24.xml create mode 100644 base/src/main/res/drawable/ic_load_failed.xml create mode 100644 base/src/main/res/drawable/ic_loading.xml create mode 100644 base/src/main/res/drawable/ic_network_unavailable.xml create mode 100644 base/src/main/res/drawable/ic_no_data.xml create mode 100644 base/src/main/res/drawable/ic_top_menu.xml create mode 100644 base/src/main/res/drawable/icon_loading.png create mode 100644 base/src/main/res/drawable/load_progress.xml create mode 100644 base/src/main/res/drawable/picture_new_item_select_bg.xml create mode 100644 base/src/main/res/layout/activity_base.xml create mode 100644 base/src/main/res/layout/activity_base_list.xml create mode 100644 base/src/main/res/layout/activity_base_list_app_bar.xml create mode 100644 base/src/main/res/layout/activity_x_webview.xml create mode 100644 base/src/main/res/layout/empty_msg_view.xml create mode 100644 base/src/main/res/layout/empty_view.xml create mode 100644 base/src/main/res/layout/item_slip.xml create mode 100644 base/src/main/res/layout/loading_circle_process_dialog_icon.xml create mode 100644 base/src/main/res/layout/loading_circle_process_dialog_icon_by_textview.xml create mode 100644 base/src/main/res/layout/loading_process_dialog_icon.xml create mode 100644 base/src/main/res/layout/super_viewpager_layout.xml create mode 100644 base/src/main/res/layout/toolbar.xml create mode 100644 base/src/main/res/mipmap-hdpi/btn_back.png create mode 100644 base/src/main/res/mipmap-hdpi/empty.png create mode 100644 base/src/main/res/mipmap-hdpi/home_follow.png create mode 100644 base/src/main/res/mipmap-hdpi/honem_chat.png create mode 100644 base/src/main/res/mipmap-hdpi/network.png create mode 100644 base/src/main/res/mipmap-hdpi/nomessage.png create mode 100644 base/src/main/res/mipmap-hdpi/video_lock.png create mode 100644 base/src/main/res/mipmap-hdpi/video_play.png create mode 100644 base/src/main/res/mipmap-mdpi/btn_back.png create mode 100644 base/src/main/res/mipmap-mdpi/empty.png create mode 100644 base/src/main/res/mipmap-mdpi/home_follow.png create mode 100644 base/src/main/res/mipmap-mdpi/honem_chat.png create mode 100644 base/src/main/res/mipmap-mdpi/network.png create mode 100644 base/src/main/res/mipmap-mdpi/nomessage.png create mode 100644 base/src/main/res/mipmap-mdpi/video_lock.png create mode 100644 base/src/main/res/mipmap-mdpi/video_play.png create mode 100644 base/src/main/res/mipmap-xhdpi/btn_back.png create mode 100644 base/src/main/res/mipmap-xhdpi/empty.png create mode 100644 base/src/main/res/mipmap-xhdpi/home_follow.png create mode 100644 base/src/main/res/mipmap-xhdpi/honem_chat.png create mode 100644 base/src/main/res/mipmap-xhdpi/network.png create mode 100644 base/src/main/res/mipmap-xhdpi/nomessage.png create mode 100644 base/src/main/res/mipmap-xhdpi/video_lock.png create mode 100644 base/src/main/res/mipmap-xhdpi/video_play.png create mode 100644 base/src/main/res/mipmap-xxhdpi/btn_back.png create mode 100644 base/src/main/res/mipmap-xxhdpi/empty.png create mode 100644 base/src/main/res/mipmap-xxhdpi/home_follow.png create mode 100644 base/src/main/res/mipmap-xxhdpi/honem_chat.png create mode 100644 base/src/main/res/mipmap-xxhdpi/network.png create mode 100644 base/src/main/res/mipmap-xxhdpi/nomessage.png create mode 100644 base/src/main/res/mipmap-xxhdpi/video_lock.png create mode 100644 base/src/main/res/mipmap-xxhdpi/video_play.png create mode 100644 base/src/main/res/mipmap-xxxhdpi/btn_back.png create mode 100644 base/src/main/res/mipmap-xxxhdpi/empty.png create mode 100644 base/src/main/res/mipmap-xxxhdpi/home_follow.png create mode 100644 base/src/main/res/mipmap-xxxhdpi/honem_chat.png create mode 100644 base/src/main/res/mipmap-xxxhdpi/network.png create mode 100644 base/src/main/res/mipmap-xxxhdpi/nomessage.png create mode 100644 base/src/main/res/mipmap-xxxhdpi/video_lock.png create mode 100644 base/src/main/res/mipmap-xxxhdpi/video_play.png create mode 100644 base/src/main/res/values/attr.xml create mode 100644 base/src/main/res/values/attrs.xml create mode 100644 base/src/main/res/values/colors.xml create mode 100644 base/src/main/res/values/dimens.xml create mode 100644 base/src/main/res/values/strings.xml create mode 100644 base/src/main/res/values/styles.xml create mode 100644 base/src/main/res/xml/file_paths.xml diff --git a/base/.gitattributes b/base/.gitattributes new file mode 100644 index 0000000..dfe0770 --- /dev/null +++ b/base/.gitattributes @@ -0,0 +1,2 @@ +# Auto detect text files and perform LF normalization +* text=auto diff --git a/base/.gitignore b/base/.gitignore new file mode 100644 index 0000000..dcdc776 --- /dev/null +++ b/base/.gitignore @@ -0,0 +1,83 @@ +# Built application files +*.apk +*.ap_ +*.aab + +# Files for the ART/Dalvik VM +*.dex + +# Java class files +*.class + +# Generated files +bin/ +gen/ +out/ +# Uncomment the following line in case you need and you don't have the release build type files in your app +# release/ + +# Gradle files +.gradle/ +build/ + +# Local configuration file (sdk path, etc) +local.properties + +# Proguard folder generated by Eclipse +proguard/ + +# Log Files +*.log + +# Android Studio Navigation editor temp files +.navigation/ + +# Android Studio captures folder +captures/ + +# IntelliJ +*.iml +.idea/workspace.xml +.idea/tasks.xml +.idea/gradle.xml +.idea/assetWizardSettings.xml +.idea/dictionaries +.idea/libraries +# Android Studio 3 in .gitignore file. +.idea/caches +.idea/modules.xml +# Comment next line if keeping position of elements in Navigation Editor is relevant for you +.idea/navEditor.xml + +# Keystore files +# Uncomment the following lines if you do not want to check your keystore files in. +#*.jks +#*.keystore + +# External native build folder generated in Android Studio 2.2 and later +.externalNativeBuild + +# Google Services (e.g. APIs or Firebase) +# google-services.json + +# Freeline +freeline.py +freeline/ +freeline_project_description.json + +# fastlane +fastlane/report.xml +fastlane/Preview.html +fastlane/screenshots +fastlane/test_output +fastlane/readme.md + +# Version control +vcs.xml + +# lint +lint/intermediates/ +lint/generated/ +lint/outputs/ +lint/tmp/ +# lint/reports/ diff --git a/base/README.md b/base/README.md new file mode 100644 index 0000000..2e83279 --- /dev/null +++ b/base/README.md @@ -0,0 +1,184 @@ +[TOC] + + +# WebSocket + +``````kotlin +WebSocketHandler.getInstance("ws://192.168.3.20:8765") +`````` + +# 线程 + +## UI线程执行 + +````kotlin +runOnUiThread { "提示信息".showMessage() } +```` + +````kotlin +App.getInstance().runOnUiThread() {} +```` + +## 延时执行 + +```kotlin +App.getInstance().runOnUiThreadDelay({},1100) +``` + +# 常用工具 + +## Toast + +````kotlin +"连接完成".showMessage() +```` + +````kotlin +ToolsHelper.showMessage("") +```` + +## Log + +````kotlin +"".loge() +```` + +````kotlin +"".log() +```` + +````kotlin +LogHelper.d("") +```` + + + +# 常用方法 + +## 双击退出 + +```kotlin + + private var oldTime = 0L + override fun onBackPressed() { + val newTime = System.currentTimeMillis() + if (newTime - oldTime < 1500 && oldTime != 0L) + AppManager.getInstance().exit() + else { + oldTime = newTime + ToolsHelper.showMessage("双击退出") + } + } +``` + + + + + + +# 界面 + +> 所有界面继承`BaseFragment`,`BaseActivity`,`BaseListActivity`等 +> +> 页面`layout`跟节点必须为`layout` + +```xml + + +``` + +## 列表页面 + +### 纯列表 + +> `BaseListActivity` + +### 自定义布局列表 + +> `BaseListFormLayoutActivity` +> +> 布局列表部分必须使用下面的方法和id + +```xml + + + + + + + + + +``` + +## 界面控件使用 + +```kotlin +binding.btn1.setOnClickListener { + +} +``` + +## 导航栏 + +> 使用base自带导航栏的情况下,可以操控对应控件 + +```kotlin +baseBinding.baseToolbar.backBtn.setOnClickListener {} +``` + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/base/build.gradle b/base/build.gradle new file mode 100644 index 0000000..e3a4d55 --- /dev/null +++ b/base/build.gradle @@ -0,0 +1,94 @@ +apply plugin: 'com.android.library' +apply plugin: 'kotlin-android' +apply plugin: 'maven-publish' + +// 声明aar包的版本号 +def aarVersion = "0.0.1.101" + + +android { + compileSdkVersion versions.compileSdk + buildToolsVersion versions.buildTools + + defaultConfig { + minSdkVersion versions.minSdk + targetSdkVersion versions.targetSdk + flavorDimensions "versioncode" + buildConfigField("String", "APP_ID", "\"" + apps.applicationId + "\"") + } + + + buildTypes { + release { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' + } + } + productFlavors productF + namespace 'com.xuqm.base' +} + +dependencies { + implementation fileTree(dir: 'libs', include: ['*.jar']) + + api androidxDependencies + implementation 'androidx.appcompat:appcompat:1.3.0' + implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version" + implementation 'androidx.constraintlayout:constraintlayout:2.0.4' + + + implementation 'org.jetbrains.anko:anko-commons:0.10.5' + + annotationProcessor compilerDependencies + commonDependencies.each { k, v -> + api(v) { + //去除第三方的重复support库 + exclude group: 'com.android.support' + } + } + //扫码二维码 + api 'com.huawei.hms:scanplus:1.1.1.301' +} +// 这个是把源码打入aar包中的任务 +task sourceJar(type: Jar) { + archiveClassifier.set('sources') + from android.sourceSets.main.java.srcDirs +} +afterEvaluate { + publishing { + publications { + // 这里的debug名字是自己起的 + release(MavenPublication) { + groupId = 'cn.org.bjca.trust.android' + artifactId = 'base' + version = aarVersion + // 这里除了有debug 还有release + from components.release + // 运行任务,把源码打进去 + artifact sourceJar + } + } + // 添加仓库地址 + repositories { + // 本地仓库 +// mavenLocal() + // 当上传到远端仓库 +// maven { +// allowInsecureProtocol true +// url("http://nexus.51trust.net/repository/android-hosted/") +// credentials { +// username = "deployment" +// password = "deployment123" +// } +// } + maven { + allowInsecureProtocol true + url("http://xuqinmin.com.cn:8081/repository/android-releases/") + credentials { + username = "admin" + password = "xuqinmin1022" + } + } + } + } +} \ No newline at end of file diff --git a/base/consumer-rules.pro b/base/consumer-rules.pro new file mode 100644 index 0000000..e69de29 diff --git a/base/proguard-rules.pro b/base/proguard-rules.pro new file mode 100644 index 0000000..f1b4245 --- /dev/null +++ b/base/proguard-rules.pro @@ -0,0 +1,21 @@ +# Add project specific ProGuard rules here. +# You can control the set of applied configuration files using the +# proguardFiles setting in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# 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 *; +#} + +# Uncomment this to preserve the line number information for +# debugging stack traces. +#-keepattributes SourceFile,LineNumberTable + +# If you keep the line number information, uncomment this to +# hide the original source file name. +#-renamesourcefileattribute SourceFile diff --git a/base/src/main/AndroidManifest.xml b/base/src/main/AndroidManifest.xml new file mode 100644 index 0000000..f3743a2 --- /dev/null +++ b/base/src/main/AndroidManifest.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/base/src/main/java/com/livinglifetechway/quickpermissions_kotlin/PermissionsManager.kt b/base/src/main/java/com/livinglifetechway/quickpermissions_kotlin/PermissionsManager.kt new file mode 100644 index 0000000..8b802f9 --- /dev/null +++ b/base/src/main/java/com/livinglifetechway/quickpermissions_kotlin/PermissionsManager.kt @@ -0,0 +1,155 @@ +package com.livinglifetechway.quickpermissions_kotlin + +import android.content.Context +import android.util.Log +import androidx.appcompat.app.AppCompatActivity +import androidx.fragment.app.Fragment +import com.livinglifetechway.quickpermissions_kotlin.util.PermissionCheckerFragment +import com.livinglifetechway.quickpermissions_kotlin.util.PermissionsUtil +import com.livinglifetechway.quickpermissions_kotlin.util.QuickPermissionsRequest +import com.livinglifetechway.quickpermissions_kotlin.util.QuickPermissionsOptions + +private const val TAG = "runWithPermissions" + +/** + * Injects code to ask for permissions before executing any code that requires permissions + * defined in the annotation + */ +fun Context?.runWithPermissions( + vararg permissions: String, + options: QuickPermissionsOptions = QuickPermissionsOptions(), + callback: () -> Unit +): Any? { + return runWithPermissionsHandler(this, permissions, callback, options) +} + +/** + * Injects code to ask for permissions before executing any code that requires permissions + * defined in the annotation + */ +fun Fragment?.runWithPermissions( + vararg permissions: String, + options: QuickPermissionsOptions = QuickPermissionsOptions(), + callback: () -> Unit +): Any? { + return runWithPermissionsHandler(this, permissions, callback, options) +} + +private fun runWithPermissionsHandler(target: Any?, permissions: Array, callback: () -> Unit, options: QuickPermissionsOptions): Nothing? { + Log.d(TAG, "runWithPermissions: start") + + // get the permissions defined in annotation + Log.d(TAG, "runWithPermissions: permissions to check: $permissions") + + // get target + if (target is AppCompatActivity || target is Fragment) { + Log.d(TAG, "runWithPermissions: context found") + + val context = when (target) { + is Context -> target + is Fragment -> target.context + else -> null + } + + // check if we have the permissions + if (PermissionsUtil.hasSelfPermission(context, arrayOf(*permissions))) { + Log.d(TAG, "runWithPermissions: already has required permissions. Proceed with the execution.") + callback() + } else { + // we don't have required permissions + // begin the permission request flow + + Log.d(TAG, "runWithPermissions: doesn't have required permissions") + + // check if we have permission checker fragment already attached + + // support for AppCompatActivity and Activity + var permissionCheckerFragment = when (context) { + // for app compat activity + is AppCompatActivity -> context.supportFragmentManager?.findFragmentByTag(PermissionCheckerFragment::class.java.canonicalName) as PermissionCheckerFragment? + // for support fragment + is Fragment -> context.childFragmentManager.findFragmentByTag(PermissionCheckerFragment::class.java.canonicalName) as PermissionCheckerFragment? + // else return null + else -> null + } + + // check if permission check fragment is added or not + // if not, add that fragment + if (permissionCheckerFragment == null) { + Log.d(TAG, "runWithPermissions: adding headless fragment for asking permissions") + permissionCheckerFragment = PermissionCheckerFragment.newInstance() + when (context) { + is AppCompatActivity -> { + context.supportFragmentManager.beginTransaction().apply { + add(permissionCheckerFragment, PermissionCheckerFragment::class.java.canonicalName) + commit() + } + // make sure fragment is added before we do any context based operations + context.supportFragmentManager?.executePendingTransactions() + } + is Fragment -> { + // this does not work at the moment + context.childFragmentManager.beginTransaction().apply { + add(permissionCheckerFragment, PermissionCheckerFragment::class.java.canonicalName) + commit() + } + // make sure fragment is added before we do any context based operations + context.childFragmentManager.executePendingTransactions() + } + } + } + + // set callback to permission checker fragment + permissionCheckerFragment.setListener(object : PermissionCheckerFragment.QuickPermissionsCallback { + override fun onPermissionsGranted(quickPermissionsRequest: QuickPermissionsRequest?) { + Log.d(TAG, "runWithPermissions: got permissions") + try { + callback() + } catch (throwable: Throwable) { + throwable.printStackTrace() + } + } + + override fun onPermissionsDenied(quickPermissionsRequest: QuickPermissionsRequest?) { + quickPermissionsRequest?.permissionsDeniedMethod?.invoke(quickPermissionsRequest) + } + + override fun shouldShowRequestPermissionsRationale(quickPermissionsRequest: QuickPermissionsRequest?) { + quickPermissionsRequest?.rationaleMethod?.invoke(quickPermissionsRequest) + } + + override fun onPermissionsPermanentlyDenied(quickPermissionsRequest: QuickPermissionsRequest?) { + quickPermissionsRequest?.permanentDeniedMethod?.invoke(quickPermissionsRequest) + } + }) + + // create permission request instance + val permissionRequest = QuickPermissionsRequest(permissionCheckerFragment, arrayOf(*permissions)) + permissionRequest.handleRationale = options.handleRationale + permissionRequest.handlePermanentlyDenied = options.handlePermanentlyDenied + permissionRequest.rationaleMessage = if (options.rationaleMessage.isBlank()) + "These permissions are required to perform this feature. Please allow us to use this feature. " + else + options.rationaleMessage + permissionRequest.permanentlyDeniedMessage = if (options.permanentlyDeniedMessage.isBlank()) + "Some permissions are permanently denied which are required to perform this operation. Please open app settings to grant these permissions." + else + options.permanentlyDeniedMessage + permissionRequest.rationaleMethod = options.rationaleMethod + permissionRequest.permanentDeniedMethod = options.permanentDeniedMethod + permissionRequest.permissionsDeniedMethod = options.permissionsDeniedMethod + + // begin the flow by requesting permissions + permissionCheckerFragment.setRequestPermissionsRequest(permissionRequest) + + // start requesting permissions for the first time + permissionCheckerFragment.requestPermissionsFromUser() + } + } else { + // context is null + // cannot handle the permission checking from the any class other than AppCompatActivity/Fragment + // crash the app RIGHT NOW! + throw IllegalStateException("Found " + target!!::class.java.canonicalName + " : No support from any classes other than AppCompatActivity/Fragment") + } + return null +} \ No newline at end of file diff --git a/base/src/main/java/com/livinglifetechway/quickpermissions_kotlin/util/PermissionCheckerFragment.kt b/base/src/main/java/com/livinglifetechway/quickpermissions_kotlin/util/PermissionCheckerFragment.kt new file mode 100644 index 0000000..388a772 --- /dev/null +++ b/base/src/main/java/com/livinglifetechway/quickpermissions_kotlin/util/PermissionCheckerFragment.kt @@ -0,0 +1,237 @@ +package com.livinglifetechway.quickpermissions_kotlin.util + + +import android.content.Intent +import android.content.pm.PackageManager +import android.net.Uri.fromParts +import android.os.Bundle +import android.provider.Settings.ACTION_APPLICATION_DETAILS_SETTINGS +import android.util.Log +import androidx.core.app.ActivityCompat +import androidx.fragment.app.Fragment +import org.jetbrains.anko.alert + +/** + * This fragment holds the single permission request and holds it until the flow is completed + */ +class PermissionCheckerFragment : Fragment() { + + private var quickPermissionsRequest: QuickPermissionsRequest? = null + + interface QuickPermissionsCallback { + fun shouldShowRequestPermissionsRationale(quickPermissionsRequest: QuickPermissionsRequest?) + fun onPermissionsGranted(quickPermissionsRequest: QuickPermissionsRequest?) + fun onPermissionsPermanentlyDenied(quickPermissionsRequest: QuickPermissionsRequest?) + fun onPermissionsDenied(quickPermissionsRequest: QuickPermissionsRequest?) + } + + companion object { + private const val TAG = "QuickPermissionsKotlin" + private const val PERMISSIONS_REQUEST_CODE = 199 + fun newInstance(): PermissionCheckerFragment = PermissionCheckerFragment() + } + + private var mListener: QuickPermissionsCallback? = null + + fun setListener(listener: QuickPermissionsCallback) { + mListener = listener + Log.d(TAG, "onCreate: listeners set") + } + + private fun removeListener() { + mListener = null + } + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + + Log.d(TAG, "onCreate: permission fragment created") + } + + fun setRequestPermissionsRequest(quickPermissionsRequest: QuickPermissionsRequest?) { + this.quickPermissionsRequest = quickPermissionsRequest + } + + private fun removeRequestPermissionsRequest() { + quickPermissionsRequest = null + } + + fun clean() { + if (quickPermissionsRequest != null) { + // permission request flow is finishing + // let the caller receive callback about it + if (quickPermissionsRequest?.deniedPermissions?.size ?: 0 > 0) + mListener?.onPermissionsDenied(quickPermissionsRequest) + + removeRequestPermissionsRequest() + removeListener() + } else { + Log.w( + TAG, "clean: QuickPermissionsRequest has already completed its flow. " + + "No further callbacks will be called for the current flow." + ) + } + } + + fun requestPermissionsFromUser() { + if (quickPermissionsRequest != null) { + Log.d(TAG, "requestPermissionsFromUser: requesting permissions") + requestPermissions( + quickPermissionsRequest?.permissions.orEmpty(), + PERMISSIONS_REQUEST_CODE + ) + } else { + Log.w( + TAG, + "requestPermissionsFromUser: QuickPermissionsRequest has already completed its flow. " + + "Cannot request permissions again from the request received from the callback. " + + "You can start the new flow by calling runWithPermissions() { } again." + ) + } + } + + override fun onRequestPermissionsResult( + requestCode: Int, + permissions: Array, + grantResults: IntArray + ) { + super.onRequestPermissionsResult(requestCode, permissions, grantResults) + Log.d(TAG, "passing callback") + + // check if permissions granted + handlePermissionResult(permissions, grantResults) + } + + /** + * Checks and takes the action based on permission results retrieved from onRequestPermissionsResult + * and from the settings activity + * + * @param permissions List of Permissions + * @param grantResults A list of permission result Granted or Denied + */ + private fun handlePermissionResult(permissions: Array, grantResults: IntArray) { + // add a check with the permissions list + // if the permissions list is empty, that means system has told that permissions request + // is invalid somehow or discarded the previous request + // this can happen in case when the multiple permissions requests are sent + // simultaneously to the system + if (permissions.isEmpty()) { + Log.w( + TAG, + "handlePermissionResult: Permissions result discarded. You might have called multiple permissions request simultaneously" + ) + return + } + + if (PermissionsUtil.hasSelfPermission(context, permissions)) { + + // set the denied permissions to empty as all the permissions are granted + // this is required as clean will be called which can invoke on permissions denied + // if it finds some permissions in the denied list + quickPermissionsRequest?.deniedPermissions = emptyArray() + + // we are good to go! + mListener?.onPermissionsGranted(quickPermissionsRequest) + + // flow complete + clean() + } else { + // we are still missing permissions + val deniedPermissions = PermissionsUtil.getDeniedPermissions(permissions, grantResults) + quickPermissionsRequest?.deniedPermissions = deniedPermissions + + // check if rationale dialog should be shown or not + var shouldShowRationale = true + var isPermanentlyDenied = false + for (i in 0 until deniedPermissions.size) { + val deniedPermission = deniedPermissions[i] + val rationale = shouldShowRequestPermissionRationale(deniedPermission) + if (!rationale) { + shouldShowRationale = false + isPermanentlyDenied = true + break + } + } + + if (quickPermissionsRequest?.handlePermanentlyDenied == true && isPermanentlyDenied) { + + quickPermissionsRequest?.permanentDeniedMethod?.let { + // get list of permanently denied methods + quickPermissionsRequest?.permanentlyDeniedPermissions = + PermissionsUtil.getPermanentlyDeniedPermissions( + this, + permissions, + grantResults + ) + mListener?.onPermissionsPermanentlyDenied(quickPermissionsRequest) + return + } + + activity?.alert { + message = quickPermissionsRequest?.permanentlyDeniedMessage.orEmpty() + positiveButton("SETTINGS") { + openAppSettings() + } + negativeButton("CANCEL") { + clean() + } + }?.apply { isCancelable = false }?.show() + return + } + + // if should show rationale dialog + if (quickPermissionsRequest?.handleRationale == true && shouldShowRationale) { + + quickPermissionsRequest?.rationaleMethod?.let { + mListener?.shouldShowRequestPermissionsRationale(quickPermissionsRequest) + return + } + + activity?.alert { + message = quickPermissionsRequest?.rationaleMessage.orEmpty() + positiveButton("TRY AGAIN") { + requestPermissionsFromUser() + } + negativeButton("CANCEL") { + clean() + } + }?.apply { isCancelable = false }?.show() + return + } + + // if handlePermanentlyDenied = false and handleRationale = false + // This will call permissionsDenied method + clean() + } + } + + fun openAppSettings() { + if (quickPermissionsRequest != null) { + val intent = Intent( + ACTION_APPLICATION_DETAILS_SETTINGS, + fromParts("package", activity?.packageName, null) + ) + // intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + startActivityForResult(intent, PERMISSIONS_REQUEST_CODE) + } else { + Log.w( + TAG, + "openAppSettings: QuickPermissionsRequest has already completed its flow. Cannot open app settings" + ) + } + } + + override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { + super.onActivityResult(requestCode, resultCode, data) + if (requestCode == PERMISSIONS_REQUEST_CODE) { + val permissions = quickPermissionsRequest?.permissions ?: emptyArray() + val grantResults = IntArray(permissions.size) + permissions.forEachIndexed { index, s -> + grantResults[index] = context?.let { ActivityCompat.checkSelfPermission(it, s) } + ?: PackageManager.PERMISSION_DENIED + } + + handlePermissionResult(permissions, grantResults) + } + } +} diff --git a/base/src/main/java/com/livinglifetechway/quickpermissions_kotlin/util/PermissionsUtil.kt b/base/src/main/java/com/livinglifetechway/quickpermissions_kotlin/util/PermissionsUtil.kt new file mode 100644 index 0000000..1f6cda4 --- /dev/null +++ b/base/src/main/java/com/livinglifetechway/quickpermissions_kotlin/util/PermissionsUtil.kt @@ -0,0 +1,54 @@ +package com.livinglifetechway.quickpermissions_kotlin.util + +import android.app.Activity +import android.content.Context +import android.content.pm.PackageManager +import androidx.core.app.ActivityCompat +import androidx.fragment.app.Fragment + +/** + * Utility class that wraps access to the runtime permissions API in M and provides basic helper + * methods. + */ +object PermissionsUtil { + + fun getDeniedPermissions(permissions: Array, grantResults: IntArray): Array = + permissions.filterIndexed { index, s -> + grantResults[index] == PackageManager.PERMISSION_DENIED + }.toTypedArray() + + fun getPermanentlyDeniedPermissions( + fragment: Fragment, + permissions: Array, + grantResults: IntArray + ): Array = + permissions.filterIndexed { index, s -> + grantResults[index] == PackageManager.PERMISSION_DENIED && !fragment.shouldShowRequestPermissionRationale( + s + ) + }.toTypedArray() + + /** + * Returns true if the Activity has access to all given permissions. + * Always returns true on platforms below M. + * + * @see Activity.checkSelfPermission + */ + fun hasSelfPermission(activity: Context?, permissions: Array): Boolean { + // Verify that all required permissions have been granted + activity?.let { + for (permission in permissions) { + if (ActivityCompat.checkSelfPermission( + activity, + permission + ) != PackageManager.PERMISSION_GRANTED + ) { + return false + } + } + } + + return true + } + +} \ No newline at end of file diff --git a/base/src/main/java/com/livinglifetechway/quickpermissions_kotlin/util/QuickPermissionsOptions.kt b/base/src/main/java/com/livinglifetechway/quickpermissions_kotlin/util/QuickPermissionsOptions.kt new file mode 100644 index 0000000..36ed66c --- /dev/null +++ b/base/src/main/java/com/livinglifetechway/quickpermissions_kotlin/util/QuickPermissionsOptions.kt @@ -0,0 +1,11 @@ +package com.livinglifetechway.quickpermissions_kotlin.util + +data class QuickPermissionsOptions( + var handleRationale: Boolean = true, + var rationaleMessage: String = "", + var handlePermanentlyDenied: Boolean = true, + var permanentlyDeniedMessage: String = "", + var rationaleMethod: ((QuickPermissionsRequest) -> Unit)? = null, + var permanentDeniedMethod: ((QuickPermissionsRequest) -> Unit)? = null, + var permissionsDeniedMethod: ((QuickPermissionsRequest) -> Unit)? = null +) \ No newline at end of file diff --git a/base/src/main/java/com/livinglifetechway/quickpermissions_kotlin/util/QuickPermissionsRequest.kt b/base/src/main/java/com/livinglifetechway/quickpermissions_kotlin/util/QuickPermissionsRequest.kt new file mode 100644 index 0000000..84f9ea0 --- /dev/null +++ b/base/src/main/java/com/livinglifetechway/quickpermissions_kotlin/util/QuickPermissionsRequest.kt @@ -0,0 +1,30 @@ +package com.livinglifetechway.quickpermissions_kotlin.util + +data class QuickPermissionsRequest( + private var target: PermissionCheckerFragment, + var permissions: Array = emptyArray(), + var handleRationale: Boolean = true, + var rationaleMessage: String = "", + var handlePermanentlyDenied: Boolean = true, + var permanentlyDeniedMessage: String = "", + internal var rationaleMethod: ((QuickPermissionsRequest) -> Unit)? = null, + internal var permanentDeniedMethod: ((QuickPermissionsRequest) -> Unit)? = null, + internal var permissionsDeniedMethod: ((QuickPermissionsRequest) -> Unit)? = null, + var deniedPermissions: Array = emptyArray(), + var permanentlyDeniedPermissions: Array = emptyArray() +) { + /** + * Proceed with requesting permissions again with user request + */ + fun proceed() = target.requestPermissionsFromUser() + + /** + * Cancels the current permissions request flow + */ + fun cancel() = target.clean() + + /** + * In case of permissions permanently denied, request user to enable from app settings + */ + fun openAppSettings() = target.openAppSettings() +} \ No newline at end of file diff --git a/base/src/main/java/com/xuqm/base/App.java b/base/src/main/java/com/xuqm/base/App.java new file mode 100644 index 0000000..094aabb --- /dev/null +++ b/base/src/main/java/com/xuqm/base/App.java @@ -0,0 +1,111 @@ +package com.xuqm.base; + +import android.app.Application; +import android.content.Context; +import android.os.Handler; +import android.util.DisplayMetrics; +import android.view.WindowManager; + +import androidx.annotation.Nullable; + +import com.orhanobut.logger.AndroidLogAdapter; +import com.orhanobut.logger.FormatStrategy; +import com.orhanobut.logger.Logger; +import com.orhanobut.logger.PrettyFormatStrategy; +import com.xuqm.base.di.component.AppComponent; +import com.xuqm.base.di.manager.HttpManager; + +public class App extends Application { + + public AppComponent appComponent; + // 宽高 + private int width = 0, height = 0; + + + private static App instance; + + public static App getInstance() { + if (null == instance) { + synchronized (App.class) { + if (null == instance) + instance = new App(); + } + } + return instance; + } + + public App() { + instance = this; + handler = new Handler(); + appComponent = HttpManager.getAppComponent(""); + } + + //https://www.wanandroid.com/wxarticle/list/408/1/json + @Override + public void onCreate() { + super.onCreate(); + DisplayMetrics dm = new DisplayMetrics(); + WindowManager wm = (WindowManager) this.getSystemService(Context.WINDOW_SERVICE); + if (null != wm) { + wm.getDefaultDisplay().getMetrics(dm); + width = dm.widthPixels;// 屏幕宽度 + height = dm.heightPixels;// 屏幕高度 + } + + FormatStrategy formatStrategy = PrettyFormatStrategy.newBuilder() + .showThreadInfo(false) // (Optional) Whether to show thread info or not. Default true + .methodCount(0) // (Optional) How many method line to show. Default 2 + .methodOffset(2) // (Optional) Hides internal method calls up to offset. Default 5 + //.logStrategy(customLog) // (Optional) Changes the log strategy to print out. Default LogCat + .tag("LogHttpInfo") // (Optional) Global tag for every log. Default PRETTY_LOGGER + .build(); + + Logger.addLogAdapter(new AndroidLogAdapter(formatStrategy) { + @Override + public boolean isLoggable(int priority, @Nullable String tag) { + return showLog(); + } + }); + + + } + + /** + * 是否打印日志 + * + * @return true-开启日志 + */ + public boolean showLog() { + return true; + } + + public int getHeight() { + return height; + } + + public int getWidth() { + return width; + } + + private final Handler handler; + + /** + * 提交主线程处理 + * + * @param runnable runnable + */ + public void runOnUiThread(final Runnable runnable) { + handler.post(runnable); + } + + /** + * 提交主线程,延时后处理 + * + * @param runnable runnable + * @param delayMillis 延时时间 + */ + public void runOnUiThreadDelay(final Runnable runnable, long delayMillis) { + handler.postDelayed(runnable, delayMillis); + } + +} diff --git a/base/src/main/java/com/xuqm/base/CrashHandler.java b/base/src/main/java/com/xuqm/base/CrashHandler.java new file mode 100644 index 0000000..2d261e1 --- /dev/null +++ b/base/src/main/java/com/xuqm/base/CrashHandler.java @@ -0,0 +1,222 @@ +package com.xuqm.base; + +import android.content.Context; +import android.content.pm.PackageInfo; +import android.content.pm.PackageManager; +import android.content.pm.PackageManager.NameNotFoundException; +import android.os.Build; +import android.os.Environment; +import android.os.Looper; +import android.util.Log; +import android.widget.Toast; + +import com.xuqm.base.common.FileHelper; + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.PrintWriter; +import java.io.StringWriter; +import java.io.Writer; +import java.lang.Thread.UncaughtExceptionHandler; +import java.lang.reflect.Field; +import java.text.DateFormat; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.HashMap; +import java.util.Locale; +import java.util.Map; + + +/** + * UncaughtException处理类,当程序发生Uncaught异常的时候,有该类来接管程序,并记录发送错误报告. + * + * @author user + */ +public class CrashHandler implements UncaughtExceptionHandler { + + public static final String TAG = "CrashHandler"; + + // CrashHandler 实例 + private static CrashHandler INSTANCE = new CrashHandler(); + + // 程序的 Context 对象 + private Context mContext; + + // 系统默认的 UncaughtException 处理类 + private UncaughtExceptionHandler mDefaultHandler; + + // 用来存储设备信息和异常信息 + private Map infos = new HashMap(); + + // 用于格式化日期,作为日志文件名的一部分 + private DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd-HH-mm-ss", Locale.getDefault()); + + /** + * 保证只有一个 CrashHandler 实例 + */ + private CrashHandler() { + } + + /** + * 获取 CrashHandler 实例 ,单例模式 + */ + public static CrashHandler getInstance() { + return INSTANCE; + } + + /** + * 初始化 + * + * @param context + */ + public void init(Context context) { + mContext = context; + // 获取系统默认的 UncaughtException 处理器 + mDefaultHandler = Thread.getDefaultUncaughtExceptionHandler(); + // 设置该 CrashHandler 为程序的默认处理器 + Thread.setDefaultUncaughtExceptionHandler(this); + } + + /** + * 当 UncaughtException 发生时会转入该函数来处理 + */ + @Override + public void uncaughtException(Thread thread, Throwable ex) { + if (!handleException(ex) && mDefaultHandler != null) { + // 如果用户没有处理则让系统默认的异常处理器来处理 + mDefaultHandler.uncaughtException(thread, ex); + } else { + try { + Thread.sleep(2000); + } catch (InterruptedException e) { + Log.e(TAG, "error : ", e); + Thread.currentThread().interrupt(); + } + +// Intent mIntent = new Intent(mContext, WelcomeActivity.class); +// mIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); +// mContext.startActivity(mIntent); + android.os.Process.killProcess(android.os.Process.myPid()); + } + } + + /** + * 自定义错误处理,收集错误信息,发送错误报告等操作均在此完成 + * + * @param ex + * @return true:如果处理了该异常信息;否则返回 false + */ + private boolean handleException(Throwable ex) { + if (ex == null) { + return false; + } + + // 使用 Toast 来显示异常信息 + new Thread() { + @Override + public void run() { + Looper.prepare(); + Toast.makeText(mContext, "好像出了点问题~~~", Toast.LENGTH_LONG).show(); + Looper.loop(); + } + }.start(); + + // 收集设备参数信息 + collectDeviceInfo(mContext); + // 保存日志文件 + saveCrashInfo2File(ex); + return true; + } + + /** + * 收集设备参数信息 + * + * @param ctx + */ + public void collectDeviceInfo(Context ctx) { + try { + PackageManager pm = ctx.getPackageManager(); + PackageInfo pi = pm.getPackageInfo(ctx.getPackageName(), PackageManager.GET_ACTIVITIES); + + if (pi != null) { + String versionName = pi.versionName == null ? "null" : pi.versionName; + String versionCode = pi.versionCode + ""; + infos.put("versionName", versionName); + infos.put("versionCode", versionCode); + } + } catch (NameNotFoundException e) { + Log.e(TAG, "an error occured when collect package info", e); + } + + Field[] fields = Build.class.getDeclaredFields(); + for (Field field : fields) { + try { + field.setAccessible(true); + infos.put(field.getName(), field.get(null).toString()); + Log.d(TAG, field.getName() + " : " + field.get(null)); + } catch (Exception e) { + Log.e(TAG, "an error occured when collect crash info", e); + } + } + } + + /** + * 保存错误信息到文件中 * + * + * @param ex + * @return 返回文件名称, 便于将文件传送到服务器 + */ + private String saveCrashInfo2File(Throwable ex) { + StringBuffer sb = new StringBuffer(); + for (Map.Entry entry : infos.entrySet()) { + String key = entry.getKey(); + String value = entry.getValue(); + sb.append(String.format("%s=%s\n", key, value)); + } + + Writer writer = new StringWriter(); + PrintWriter printWriter = new PrintWriter(writer); + ex.printStackTrace(printWriter); + Throwable cause = ex.getCause(); + while (cause != null) { + cause.printStackTrace(printWriter); + cause = cause.getCause(); + } + printWriter.close(); + + String result = writer.toString(); + sb.append(result); + + long timestamp = System.currentTimeMillis(); + String time = formatter.format(new Date()); + String fileName = "crash-" + time + "-" + timestamp + ".log"; + + if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) { + String path = String.format("%scrash/", FileHelper.getRootFilePath()); + File dir = new File(path); + if (!dir.exists()) { + dir.mkdirs(); + } + FileOutputStream fos = null; + try { + fos = new FileOutputStream(path + fileName); + fos.write(sb.toString().getBytes()); + } catch (Exception e) { + Log.e(TAG, "an error occured while writing file...", e); + } finally { + try { + if (fos != null) { + fos.close(); + } + } catch (IOException e) { + e.printStackTrace(); + } + } + } + + return fileName; + + + } +} diff --git a/base/src/main/java/com/xuqm/base/adapter/BaseItem.java b/base/src/main/java/com/xuqm/base/adapter/BaseItem.java new file mode 100644 index 0000000..c21f8f8 --- /dev/null +++ b/base/src/main/java/com/xuqm/base/adapter/BaseItem.java @@ -0,0 +1,17 @@ +package com.xuqm.base.adapter; + +/** + * 所有用到{@link com.xuqm.base.ui.BaseListActivity}来做的列表页 + * 数据model都要继承BaseItem + */ +public class BaseItem { + private int s_id; + + public int getS_id() { + return s_id; + } + + public void setS_id(int s_id) { + this.s_id = s_id; + } +} diff --git a/base/src/main/java/com/xuqm/base/adapter/BaseNormalAdapter.java b/base/src/main/java/com/xuqm/base/adapter/BaseNormalAdapter.java new file mode 100644 index 0000000..09b1110 --- /dev/null +++ b/base/src/main/java/com/xuqm/base/adapter/BaseNormalAdapter.java @@ -0,0 +1,186 @@ +package com.xuqm.base.adapter; + +import android.content.Context; +import android.view.ViewGroup; + +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.RecyclerView; + +import com.xuqm.base.adapter.callback.AdapterItemClickListener; +import com.xuqm.base.adapter.callback.AdapterItemLongClickListener; + +import java.util.ArrayList; +import java.util.List; + +/** + * 不用{@link BasePagedAdapter}的时候,可以用这个 + *

+ * + * @param 数据各式 + */ +public abstract class BaseNormalAdapter extends RecyclerView.Adapter { + private Context context; + private AdapterItemClickListener itemClickListener;//item的点击事件 + private AdapterItemLongClickListener itemLongClickListener;//item的长按事件 + private ItemViewDelegateManager mItemViewDelegateManager;//ItemViewDelegate的管理类 + + private List list; + + private AdapterItemClickListener listener; + + public BaseNormalAdapter() { + this.list = new ArrayList<>(); + mItemViewDelegateManager = new ItemViewDelegateManager<>(); + } + + public BaseNormalAdapter(List list) { + this.list = null == list ? new ArrayList<>() : list; + mItemViewDelegateManager = new ItemViewDelegateManager<>(); + } + + public void setmDatas(List mDatas) { + this.list.clear(); + this.addmDatas(null == mDatas ? new ArrayList<>() : mDatas); + } + + public List getDatas() { + return this.list; + } + + public void addmDatas(List mDatas) { + this.list.addAll(mDatas); + notifyDataSetChanged(); + } + + public void addItem(T item) { + this.list.add(item); + notifyDataSetChanged(); + } + + public void removeItem(T item) { + this.list.remove(item); + notifyDataSetChanged(); + } + + + @Override + public int getItemViewType(int position) { + if (!useItemViewDelegateManager()) return super.getItemViewType(position); + return mItemViewDelegateManager.getItemViewType(list.get(position), position); + } + + + /** + * 判断是否有多种ItemViewType + * 根据mItemViewDelegateManager 里面存储的数量决定 + * + * @return true 有多种ItemViewType + */ + private boolean useItemViewDelegateManager() { + return mItemViewDelegateManager.getItemViewDelegateCount() > 0; + } + + /** + * 添加不同的item样式 + * + * @param itemViewDelegate 自定义的item + * @return this + */ + public BaseNormalAdapter addItemViewDelegate(ItemViewDelegate itemViewDelegate) { + mItemViewDelegateManager.addDelegate(itemViewDelegate); + return this; + } + + /** + * 添加不同的item样式 + * + * @param viewType 自定义的item type 不能重复 + * @param itemViewDelegate 自定义的item + * @return this + */ + public BaseNormalAdapter addItemViewDelegate(int viewType, ItemViewDelegate itemViewDelegate) { + mItemViewDelegateManager.addDelegate(viewType, itemViewDelegate); + return this; + } + + @NonNull + @Override + public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + ItemViewDelegate itemViewDelegate = mItemViewDelegateManager.getItemViewDelegate(viewType); + int layoutId = itemViewDelegate.getItemViewLayoutId();//这里拿到自定义的layoutId + context = parent.getContext();//context没用传递过来,这里自己获取到 + return new ViewHolder(context, parent, layoutId); + } + + @Override + public void onBindViewHolder(@NonNull ViewHolder holder, int position) { + if (null != itemClickListener) { + holder.itemView.setOnClickListener(v -> itemClickListener.onClick(holder.itemView, list.get(position), position)); + } + if (null != itemLongClickListener) { + holder.itemView.setOnLongClickListener(v -> itemLongClickListener.onClick(holder.itemView, list.get(position), position)); + } + convert(holder, list.get(position)); + } + + @Override + public int getItemCount() { + return list.size(); + } + + /** + * 设置item点击监听 + * + * @param itemClickListener item的点击事件 + */ + public void setItemClickListener(AdapterItemClickListener itemClickListener) { + this.itemClickListener = itemClickListener; + } + + /** + * 设置item长按监听 + * + * @param itemLongClickListener item的长按事件 + */ + public void setItemLongClickListener(AdapterItemLongClickListener itemLongClickListener) { + this.itemLongClickListener = itemLongClickListener; + } + + /** + * 部分情况可以需要用到这个,比如item里面元素想要和item使用同一个回调处理 + * + * @return + */ + protected AdapterItemClickListener getItemClickListener() { + return itemClickListener; + } + + /** + * ui绘制的事件,分发给ItemViewDelegate自己处理 + * 比如settext() setOnClickListener()这些 + * + * @param holder holder + * @param item item + */ + public void convert(ViewHolder holder, T item) { + mItemViewDelegateManager.convert(holder, item, holder.getAdapterPosition()); + } + + /** + * 刷新知道item + * + * @param position position + */ + public void changeItem(int position) { + if (0 <= position && position < getItemCount()) { + notifyItemChanged(position); + } + } + + public void changeItem(int position, Object payload) { + if (0 <= position && position < getItemCount()) { + notifyItemChanged(position, payload); + } + } + +} diff --git a/base/src/main/java/com/xuqm/base/adapter/BasePagedAdapter.java b/base/src/main/java/com/xuqm/base/adapter/BasePagedAdapter.java new file mode 100644 index 0000000..c9743a1 --- /dev/null +++ b/base/src/main/java/com/xuqm/base/adapter/BasePagedAdapter.java @@ -0,0 +1,157 @@ +package com.xuqm.base.adapter; + +import android.content.Context; +import android.view.ViewGroup; + +import androidx.annotation.NonNull; +import androidx.paging.PagedListAdapter; + +import com.xuqm.base.adapter.callback.AdapterItemClickListener; +import com.xuqm.base.adapter.callback.AdapterItemLongClickListener; + +import java.util.List; + +/** + * 如果用到了{@link com.xuqm.base.ui.BaseListActivity}来展示列表页面的话,需要adapter继承这个 + *

+ * 如果item只有一种类型,可以使用{@link CommonPagedAdapter}来展示 + *

+ * 如果不用{@link CommonPagedAdapter}的话,继承后需要使用{@link #addItemViewDelegate(ItemViewDelegate)} + * 来设置展示的页面 + * + * @param + */ +public class BasePagedAdapter extends PagedListAdapter { + private Context context; + private AdapterItemClickListener itemClickListener;//item的点击事件 + private AdapterItemLongClickListener itemLongClickListener;//item的长按事件 + private ItemViewDelegateManager mItemViewDelegateManager;//ItemViewDelegate的管理类 + + public BasePagedAdapter() { + super(new Diff<>()); + mItemViewDelegateManager = new ItemViewDelegateManager<>(); + } + + + @Override + public int getItemViewType(int position) { + if (!useItemViewDelegateManager()) return super.getItemViewType(position); + return mItemViewDelegateManager.getItemViewType(getItem(position), position); + } + + + /** + * 判断是否有多种ItemViewType + * 根据mItemViewDelegateManager 里面存储的数量决定 + * + * @return true 有多种ItemViewType + */ + private boolean useItemViewDelegateManager() { + return mItemViewDelegateManager.getItemViewDelegateCount() > 0; + } + + /** + * 添加不同的item样式 + * + * @param itemViewDelegate 自定义的item + * @return this + */ + public BasePagedAdapter addItemViewDelegate(ItemViewDelegate itemViewDelegate) { + mItemViewDelegateManager.addDelegate(itemViewDelegate); + return this; + } + + /** + * 添加不同的item样式 + * + * @param viewType 自定义的item type 不能重复 + * @param itemViewDelegate 自定义的item + * @return this + */ + public BasePagedAdapter addItemViewDelegate(int viewType, ItemViewDelegate itemViewDelegate) { + mItemViewDelegateManager.addDelegate(viewType, itemViewDelegate); + return this; + } + + @NonNull + @Override + public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + ItemViewDelegate itemViewDelegate = mItemViewDelegateManager.getItemViewDelegate(viewType); + int layoutId = itemViewDelegate.getItemViewLayoutId();//这里拿到自定义的layoutId + context = parent.getContext();//context没用传递过来,这里自己获取到 + return new ViewHolder(context, parent, layoutId); + } + + @Override + public void onBindViewHolder(@NonNull ViewHolder holder, int position) { + convert(holder, getItem(position)); + } + + @Override + public void onBindViewHolder(@NonNull ViewHolder holder, int position, @NonNull List payloads) { + if (null != itemClickListener) { + holder.itemView.setOnClickListener(v -> itemClickListener.onClick(holder.itemView, getItem(position), position)); + } + if (null != itemLongClickListener) { + holder.itemView.setOnLongClickListener(v -> itemLongClickListener.onClick(holder.itemView, getItem(position), position)); + } + bindViewHolder(holder, getItem(position), position, payloads); + } + + private void bindViewHolder(ViewHolder holder, T item, int position, List payloads) { + convert(holder, item); + } + + /** + * 设置item点击监听 + * + * @param itemClickListener item的点击事件 + */ + public void setItemClickListener(AdapterItemClickListener itemClickListener) { + this.itemClickListener = itemClickListener; + } + + /** + * 设置item长按监听 + * + * @param itemLongClickListener item的长按事件 + */ + public void setItemLongClickListener(AdapterItemLongClickListener itemLongClickListener) { + this.itemLongClickListener = itemLongClickListener; + } + + /** + * 部分情况可以需要用到这个,比如item里面元素想要和item使用同一个回调处理 + * @return + */ + protected AdapterItemClickListener getItemClickListener() { + return itemClickListener; + } + + /** + * ui绘制的事件,分发给ItemViewDelegate自己处理 + * 比如settext() setOnClickListener()这些 + * @param holder holder + * @param item item + */ + public void convert(ViewHolder holder, T item) { + mItemViewDelegateManager.convert(holder, item, holder.getAdapterPosition()); + } + + /** + * 刷新知道item + * @param position position + */ + public void changeItem(int position) { + if (0 <= position && position < getItemCount()) { + notifyItemChanged(position); + } + } + + public void changeItem(int position, Object payload) { + if (0 <= position && position < getItemCount()) { + notifyItemChanged(position, payload); + } + } + +} diff --git a/base/src/main/java/com/xuqm/base/adapter/CommonAdapter.java b/base/src/main/java/com/xuqm/base/adapter/CommonAdapter.java new file mode 100644 index 0000000..bd06b69 --- /dev/null +++ b/base/src/main/java/com/xuqm/base/adapter/CommonAdapter.java @@ -0,0 +1,59 @@ +package com.xuqm.base.adapter; + +import java.util.List; + +/** + * 这个adapter主要是用来简化通用adapter + * 如果item只有一种样式,或者说不需要用到itemViewType,可以直接使用这个 + *

+ * 构造函数直接传入对应的layoutId,然后重写convert方法就可以了 + * list不传的话,后面使用{@link #setmDatas(List)} 添加就可以了 + * + * @param item用到的数据类型 + */ +public abstract class CommonAdapter extends BaseNormalAdapter { + + + protected CommonAdapter(final int layoutId) { + super(); + addItemViewDelegate(new ItemViewDelegate() { + @Override + public int getItemViewLayoutId() { + return layoutId; + } + + @Override + public boolean isForViewType(T item, int position) { + return true; + } + + @Override + public void convert(ViewHolder holder, T t, int position) { + CommonAdapter.this.convert(holder, t, position); + } + }); + } + + protected CommonAdapter(final int layoutId, List list) { + super(list); + addItemViewDelegate(new ItemViewDelegate() { + @Override + public int getItemViewLayoutId() { + return layoutId; + } + + @Override + public boolean isForViewType(T item, int position) { + return true; + } + + @Override + public void convert(ViewHolder holder, T t, int position) { + CommonAdapter.this.convert(holder, t, position); + } + }); + } + + protected abstract void convert(ViewHolder holder, T item, int position); + +} diff --git a/base/src/main/java/com/xuqm/base/adapter/CommonPagedAdapter.java b/base/src/main/java/com/xuqm/base/adapter/CommonPagedAdapter.java new file mode 100644 index 0000000..a3acafe --- /dev/null +++ b/base/src/main/java/com/xuqm/base/adapter/CommonPagedAdapter.java @@ -0,0 +1,36 @@ +package com.xuqm.base.adapter; + +/** + * 这个adapter主要是用来简化通用列表页的绘制 + * 如果item只有一种样式,或者说不需要用到itemViewType,可以直接使用这个 + *

+ * 构造函数直接传入对应的layoutId,然后重写convert方法就可以了 + * + * @param item用到的数据类型 + */ +public abstract class CommonPagedAdapter extends BasePagedAdapter { + + + protected CommonPagedAdapter(final int layoutId) { + super(); + addItemViewDelegate(new ItemViewDelegate() { + @Override + public int getItemViewLayoutId() { + return layoutId; + } + + @Override + public boolean isForViewType(T item, int position) { + return true; + } + + @Override + public void convert(ViewHolder holder, T t, int position) { + CommonPagedAdapter.this.convert(holder, t, position); + } + }); + } + + protected abstract void convert(ViewHolder holder, T item, int position); + +} diff --git a/base/src/main/java/com/xuqm/base/adapter/Diff.java b/base/src/main/java/com/xuqm/base/adapter/Diff.java new file mode 100644 index 0000000..0b442d2 --- /dev/null +++ b/base/src/main/java/com/xuqm/base/adapter/Diff.java @@ -0,0 +1,16 @@ +package com.xuqm.base.adapter; + +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.DiffUtil; + +public class Diff extends DiffUtil.ItemCallback { + @Override + public boolean areItemsTheSame(@NonNull T oldItem, @NonNull T newItem) { + return oldItem.getS_id() == newItem.getS_id(); + } + + @Override + public boolean areContentsTheSame(@NonNull T oldItem, @NonNull T newItem) { + return oldItem.getS_id() == newItem.getS_id(); + } +} diff --git a/base/src/main/java/com/xuqm/base/adapter/ElasticHorizontalScrollView.java b/base/src/main/java/com/xuqm/base/adapter/ElasticHorizontalScrollView.java new file mode 100644 index 0000000..b616639 --- /dev/null +++ b/base/src/main/java/com/xuqm/base/adapter/ElasticHorizontalScrollView.java @@ -0,0 +1,72 @@ +package com.xuqm.base.adapter; + +import android.content.Context; +import android.util.AttributeSet; +import android.util.DisplayMetrics; +import android.view.MotionEvent; +import android.widget.HorizontalScrollView; + +public class ElasticHorizontalScrollView extends HorizontalScrollView { + private float x; + private DisplayMetrics metrics; + private int threshold = 0; + + public ElasticHorizontalScrollView(Context context, AttributeSet attrs) { + super(context, attrs); + + metrics = getResources().getDisplayMetrics(); + } + + public ElasticHorizontalScrollView(Context context) { + this(context, null); + } + + public void setThreshold(int threshold) { + this.threshold = threshold; + } + + @Override + public boolean onTouchEvent(MotionEvent ev) { + if (ev == null) { + return super.onTouchEvent(ev); + } else { + return commOnTouchEvent(ev); + } + } + + public void reset() { + scrollTo(0, 0); + } + + private boolean commOnTouchEvent(MotionEvent ev) { + int action = ev.getAction(); + int length = threshold; + switch (action) { + case MotionEvent.ACTION_DOWN: + x = ev.getX(); + break; + case MotionEvent.ACTION_UP: + //复原位置 + if ((ev.getX() - x) > 0) { + if (getScrollX() > length / 2) { + smoothScrollTo(length, 0); + } else { + smoothScrollTo(0, 0); + } + } else { + if (getScrollX() > length / 2) { + smoothScrollTo(length, 0); + } else { + smoothScrollTo(0, 0); + } + } + return true; + case MotionEvent.ACTION_MOVE: + return super.onTouchEvent(ev); + default: + return true; + + } + return true; + } +} \ No newline at end of file diff --git a/base/src/main/java/com/xuqm/base/adapter/FragmentAdapter.java b/base/src/main/java/com/xuqm/base/adapter/FragmentAdapter.java new file mode 100644 index 0000000..9137150 --- /dev/null +++ b/base/src/main/java/com/xuqm/base/adapter/FragmentAdapter.java @@ -0,0 +1,30 @@ +package com.xuqm.base.adapter; + +import androidx.annotation.NonNull; +import androidx.fragment.app.Fragment; +import androidx.fragment.app.FragmentManager; +import androidx.lifecycle.Lifecycle; +import androidx.viewpager2.adapter.FragmentStateAdapter; + +import java.util.List; + +public class FragmentAdapter extends FragmentStateAdapter { + + private List fragments; + + public FragmentAdapter(@NonNull FragmentManager fragmentManager, @NonNull Lifecycle lifecycle, List fragments) { + super(fragmentManager, lifecycle); + this.fragments = fragments; + } + + @NonNull + @Override + public Fragment createFragment(int position) { + return fragments.get(position); + } + + @Override + public int getItemCount() { + return fragments.size(); + } +} diff --git a/base/src/main/java/com/xuqm/base/adapter/ItemViewDelegate.java b/base/src/main/java/com/xuqm/base/adapter/ItemViewDelegate.java new file mode 100644 index 0000000..90c9f19 --- /dev/null +++ b/base/src/main/java/com/xuqm/base/adapter/ItemViewDelegate.java @@ -0,0 +1,15 @@ +package com.xuqm.base.adapter; + + +/** + * Created by zhy on 16/6/22. + */ +public interface ItemViewDelegate { + + int getItemViewLayoutId();//这个 ItemViewDelegate 将要展示的页面 + + boolean isForViewType(T item, int position); //条件判断,用来判断什么时候展示这个ItemViewDelegate + + void convert(ViewHolder holder, T item, int position);//UI绘制与事件添加 + +} diff --git a/base/src/main/java/com/xuqm/base/adapter/ItemViewDelegateManager.java b/base/src/main/java/com/xuqm/base/adapter/ItemViewDelegateManager.java new file mode 100644 index 0000000..9408856 --- /dev/null +++ b/base/src/main/java/com/xuqm/base/adapter/ItemViewDelegateManager.java @@ -0,0 +1,95 @@ +package com.xuqm.base.adapter; + + +import androidx.collection.SparseArrayCompat; + +/** + * Created by zhy on 16/6/22. + */ +public class ItemViewDelegateManager { + private SparseArrayCompat> delegates = new SparseArrayCompat<>(); + + public int getItemViewDelegateCount() { + return delegates.size(); + } + + public ItemViewDelegateManager addDelegate(ItemViewDelegate delegate) { + int viewType = delegates.size(); + if (delegate != null) { + delegates.put(viewType, delegate); + } + return this; + } + + public ItemViewDelegateManager addDelegate(int viewType, ItemViewDelegate delegate) { + if (delegates.get(viewType) != null) { + throw new IllegalArgumentException( + "An ItemViewDelegate is already registered for the viewType = " + + viewType + + ". Already registered ItemViewDelegate is " + + delegates.get(viewType)); + } + delegates.put(viewType, delegate); + return this; + } + + public ItemViewDelegateManager removeDelegate(ItemViewDelegate delegate) { + if (delegate == null) { + throw new NullPointerException("ItemViewDelegate is null"); + } + int indexToRemove = delegates.indexOfValue(delegate); + + if (indexToRemove >= 0) { + delegates.removeAt(indexToRemove); + } + return this; + } + + public ItemViewDelegateManager removeDelegate(int itemType) { + int indexToRemove = delegates.indexOfKey(itemType); + + if (indexToRemove >= 0) { + delegates.removeAt(indexToRemove); + } + return this; + } + + int getItemViewType(T item, int position) { + int delegatesCount = delegates.size(); + for (int i = 0; i < delegatesCount; i++) { + ItemViewDelegate delegate = delegates.valueAt(i); + if (delegate.isForViewType(item, position)) { + return delegates.keyAt(i); + } + } + throw new IllegalArgumentException( + "No ItemViewDelegate added that matches position=" + position + " in data source"); + } + + void convert(ViewHolder holder, T item, int position) { + int delegatesCount = delegates.size(); + for (int i = 0; i < delegatesCount; i++) { + ItemViewDelegate delegate = delegates.valueAt(i); + + if (delegate.isForViewType(item, position)) { + delegate.convert(holder, item, position); + return; + } + } + throw new IllegalArgumentException( + "No ItemViewDelegateManager added that matches position=" + position + " in data source"); + } + + + public ItemViewDelegate getItemViewDelegate(int viewType) { + return delegates.get(viewType); + } + + public int getItemViewLayoutId(int viewType) { + return getItemViewDelegate(viewType).getItemViewLayoutId(); + } + + public int getItemViewType(ItemViewDelegate itemViewDelegate) { + return delegates.indexOfValue(itemViewDelegate); + } +} diff --git a/base/src/main/java/com/xuqm/base/adapter/SlipReAdapter.java b/base/src/main/java/com/xuqm/base/adapter/SlipReAdapter.java new file mode 100644 index 0000000..c43244a --- /dev/null +++ b/base/src/main/java/com/xuqm/base/adapter/SlipReAdapter.java @@ -0,0 +1,178 @@ +package com.xuqm.base.adapter; + +import android.util.Log; +import android.view.LayoutInflater; +import android.view.View; +import android.view.View.OnClickListener; +import android.view.ViewGroup; +import android.widget.LinearLayout; +import android.widget.LinearLayout.LayoutParams; + +import androidx.recyclerview.widget.RecyclerView; + +import com.xuqm.base.R; + + +/** + * @author jose.han + * @date 2019/7/19 0019 + * @description 包装器,再原有的adpter 基础上,分装测滑功能,基于 + */ + +public class SlipReAdapter extends RecyclerView.Adapter { + + private RecyclerView.Adapter mAdapter; + private ISlipClickAction mISlipClickAction; + private int mSlipViewId; + public final static int MODE_DELETE = 0; + public final static int MODE_CLICK = 0; + private int mMode = MODE_DELETE; + private int mSlipWidth = 0; + + public static class Builder { + + private RecyclerView.Adapter mAdapter; + private ISlipClickAction mISlipClickAction; + private int mSlipViewId; + private int mMode; + private int mSlipWidth; + + public Builder setAdapter(RecyclerView.Adapter adapter) { + mAdapter = adapter; + return this; + } + + public Builder setISlipClickAction( + ISlipClickAction ISlipClickAction) { + mISlipClickAction = ISlipClickAction; + return this; + } + + public Builder setSlipViewId(int slipViewId) { + mSlipViewId = slipViewId; + return this; + } + + public Builder setMode(int mode) { + mMode = mode; + return this; + } + + public Builder setSlipWidth(float slipWidth) { + mSlipWidth = (int) slipWidth; + return this; + } + + public SlipReAdapter build() { + SlipReAdapter slipReAdapter = new SlipReAdapter(); + slipReAdapter.setAdapter(mAdapter); + slipReAdapter.setISlipClickAction(mISlipClickAction); + slipReAdapter.setMode(mMode); + slipReAdapter.setSlipViewId(mSlipViewId); + slipReAdapter.setSlipWidth(mSlipWidth); + return slipReAdapter; + } + } + + public SlipReAdapter() { + + } + + public void setAdapter(RecyclerView.Adapter adapter) { + mAdapter = adapter; + } + + public void setISlipClickAction( + ISlipClickAction ISlipClickAction) { + mISlipClickAction = ISlipClickAction; + } + + public void setSlipViewId(int slipViewId) { + mSlipViewId = slipViewId; + } + + public void setMode(int mode) { + mMode = mode; + } + + public void setSlipWidth(int slipWidth) { + mSlipWidth = slipWidth; + } + + @Override + public RViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { + + View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_slip, parent, false); + LinearLayout contentLL = view.findViewById(R.id.content_ll); + LinearLayout deleteLl = view.findViewById(R.id.delete_ll); + View delete = LayoutInflater.from(parent.getContext()).inflate(mSlipViewId, null, false); + deleteLl.addView(delete); + + LayoutParams layoutParams = new LayoutParams( + parent.getResources().getDisplayMetrics().widthPixels, + ViewGroup.LayoutParams.WRAP_CONTENT); + RecyclerView.ViewHolder viewHolder = mAdapter.onCreateViewHolder(parent, viewType); + viewHolder.itemView.setLayoutParams(layoutParams); + contentLL.addView(viewHolder.itemView); + + return new RViewHolder(view, viewHolder, mSlipWidth); + } + + @Override + public void onBindViewHolder(final RViewHolder holder, final int position) { + mAdapter.onBindViewHolder(holder.mViewHolder, position); + holder.deleteLl.setOnClickListener(new OnClickListener() { + @Override + public void onClick(View v) { + mISlipClickAction.onAction(holder.getAdapterPosition()); + holder.mElasticHorizontalScrollView.reset(); + Log.i("SlipReAdapter", "slip action and the pos is:" + holder.getAdapterPosition()); + if (mMode == MODE_DELETE) { + notifyItemRemoved(holder.getAdapterPosition()); + } else if (mMode == MODE_CLICK) { + notifyItemChanged(holder.getAdapterPosition()); + } + } + }); + } + + @Override + public int getItemCount() { + return mAdapter != null ? mAdapter.getItemCount() : 0; + } + + public static class RViewHolder extends RecyclerView.ViewHolder { + + private View deleteLl; + private ElasticHorizontalScrollView mElasticHorizontalScrollView; + private RecyclerView.ViewHolder mViewHolder; + + public RViewHolder(View itemView, RecyclerView.ViewHolder viewHolder, int threshold) { + super(itemView); + mViewHolder = viewHolder; + deleteLl = itemView.findViewById(R.id.delete_ll); + mElasticHorizontalScrollView = itemView.findViewById(R.id.ElasticHorizontalScrollView); + if (threshold != 0) { + LayoutParams layoutParams = new LayoutParams(threshold, + ViewGroup.LayoutParams.WRAP_CONTENT); + deleteLl.setLayoutParams(layoutParams); + mElasticHorizontalScrollView.setThreshold(threshold); + } else { + deleteLl.post(new Runnable() { + @Override + public void run() { + int width = deleteLl.getWidth(); + mElasticHorizontalScrollView.setThreshold(width); + } + }); + } + } + } + + public interface ISlipClickAction { + + public void onAction(int position); + } + + +} diff --git a/base/src/main/java/com/xuqm/base/adapter/ViewHolder.java b/base/src/main/java/com/xuqm/base/adapter/ViewHolder.java new file mode 100644 index 0000000..7848848 --- /dev/null +++ b/base/src/main/java/com/xuqm/base/adapter/ViewHolder.java @@ -0,0 +1,171 @@ +package com.xuqm.base.adapter; + +import android.content.Context; +import android.graphics.Bitmap; +import android.graphics.Typeface; +import android.util.SparseArray; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ImageView; +import android.widget.TextView; + +import androidx.annotation.ColorInt; +import androidx.annotation.DrawableRes; +import androidx.annotation.IdRes; +import androidx.annotation.LayoutRes; +import androidx.annotation.StringRes; +import androidx.recyclerview.widget.RecyclerView; + +import com.xuqm.base.adapter.callback.AdapterClickListener; +import com.xuqm.base.common.ImageHelper; + +import java.util.List; + +public class ViewHolder extends RecyclerView.ViewHolder { + + private Context context; + private ViewGroup parent; + private int layoutId; + + private SparseArray views = new SparseArray<>(); + + public ViewHolder(Context context, ViewGroup parent, @LayoutRes int layoutId) { + super(LayoutInflater.from(context).inflate(layoutId, parent, false)); + this.context = context; + this.parent = parent; + this.layoutId = layoutId; + } + + public T getView(int viewId) { + View view = views.get(viewId); + if (null == view) { + view = itemView.findViewById(viewId); + if (null == view) throw new IllegalArgumentException("not found id"); + views.put(viewId, view); + } + return (T) view; + } + + public ViewHolder setText(@IdRes int viewId, CharSequence text) { + TextView textView = getView(viewId); + textView.setText(text); + return this; + } + + public ViewHolder setTypeface(@IdRes int viewId, Typeface typeface) { + TextView textView = getView(viewId); + textView.setTypeface(typeface); + return this; + } + + public ViewHolder setEnabled(@IdRes int viewId, boolean enabled) { + View view = getView(viewId); + view.setEnabled(enabled); + return this; + } + + public ViewHolder setBackgroundResource(@IdRes int viewId, @DrawableRes int resId) { + View textView = getView(viewId); + textView.setBackgroundResource(resId); + return this; + } + + public ViewHolder setBackgroundColor(@IdRes int viewId, @ColorInt int color) { + View textView = getView(viewId); + textView.setBackgroundColor(color); + return this; + } + + public ViewHolder setTextColor(@IdRes int viewId, @ColorInt int color) { + TextView textView = getView(viewId); + textView.setTextColor(color); + return this; + } + + public ViewHolder setText(@IdRes int viewId, @StringRes int resId) { + TextView textView = getView(viewId); + textView.setText(context.getString(resId)); + return this; + } + + public ViewHolder setImageResource(@IdRes int viewId, @DrawableRes int resId) { + ImageView imageView = getView(viewId); + imageView.setImageResource(resId); + return this; + } + + public ViewHolder setImage(@IdRes int viewId, String url) { + ImageView imageView = getView(viewId); + ImageHelper.load(imageView, url); + return this; + } + + public ViewHolder setImage(@IdRes int viewId, @DrawableRes int resourceId, String url) { + ImageView imageView = getView(viewId); + ImageHelper.load(imageView, resourceId, url); + return this; + } + + public ViewHolder setImage(@IdRes int viewId, @DrawableRes int placeholder, @DrawableRes int error, String url) { + ImageView imageView = getView(viewId); + ImageHelper.load(imageView, placeholder, error, url); + return this; + } + + public ViewHolder setImage(@IdRes int viewId, Bitmap bitmap) { + ImageView imageView = getView(viewId); + ImageHelper.load(imageView, bitmap); + return this; + } + + public ViewHolder gone(@IdRes int viewId) { + View view = getView(viewId); + view.setVisibility(View.GONE); + return this; + } + + public ViewHolder invisible(@IdRes int viewId) { + View view = getView(viewId); + view.setVisibility(View.INVISIBLE); + return this; + } + + public ViewHolder gone(View view) { + view.setVisibility(View.GONE); + return this; + } + + public ViewHolder visible(@IdRes int viewId) { + View view = getView(viewId); + view.setVisibility(View.VISIBLE); + return this; + } + + public ViewHolder setVisibility(@IdRes int viewId, boolean isVisible) { + View view = getView(viewId); + if (isVisible) view.setVisibility(View.VISIBLE); + else view.setVisibility(View.GONE); + return this; + } + + public ViewHolder visible(View view) { + view.setVisibility(View.VISIBLE); + return this; + } + + public ViewHolder setClickListener(@IdRes int viewId, AdapterClickListener adapterClickListener) { + View view = getView(viewId); + if (null != view) view.setOnClickListener(adapterClickListener::onClick); + return this; + } + + public ViewHolder setClickListener(List viewIds, AdapterClickListener adapterClickListener) { + for (Integer viewId : viewIds) { + View view = getView(viewId); + if (null != view) view.setOnClickListener(adapterClickListener::onClick); + } + return this; + } + +} diff --git a/base/src/main/java/com/xuqm/base/adapter/callback/AdapterClickListener.java b/base/src/main/java/com/xuqm/base/adapter/callback/AdapterClickListener.java new file mode 100644 index 0000000..e98938d --- /dev/null +++ b/base/src/main/java/com/xuqm/base/adapter/callback/AdapterClickListener.java @@ -0,0 +1,10 @@ +package com.xuqm.base.adapter.callback; + +import android.view.View; + +/** + * adapter中,为item元素设置点击时间时候用到的监听 + */ +public interface AdapterClickListener { + void onClick(View view); +} diff --git a/base/src/main/java/com/xuqm/base/adapter/callback/AdapterItemClickListener.java b/base/src/main/java/com/xuqm/base/adapter/callback/AdapterItemClickListener.java new file mode 100644 index 0000000..84b42bc --- /dev/null +++ b/base/src/main/java/com/xuqm/base/adapter/callback/AdapterItemClickListener.java @@ -0,0 +1,11 @@ +package com.xuqm.base.adapter.callback; + +import android.view.View; + +/** + * item设置点击事件的监听 + * @param + */ +public interface AdapterItemClickListener { + void onClick(View view, T item, int position); +} diff --git a/base/src/main/java/com/xuqm/base/adapter/callback/AdapterItemLongClickListener.java b/base/src/main/java/com/xuqm/base/adapter/callback/AdapterItemLongClickListener.java new file mode 100644 index 0000000..c7a07bb --- /dev/null +++ b/base/src/main/java/com/xuqm/base/adapter/callback/AdapterItemLongClickListener.java @@ -0,0 +1,11 @@ +package com.xuqm.base.adapter.callback; + +import android.view.View; + +/** + * item设置长按事件的监听 + * @param + */ +public interface AdapterItemLongClickListener { + boolean onClick(View view, T item, int position); +} diff --git a/base/src/main/java/com/xuqm/base/common/AESCBCUtil.java b/base/src/main/java/com/xuqm/base/common/AESCBCUtil.java new file mode 100644 index 0000000..39e1ad4 --- /dev/null +++ b/base/src/main/java/com/xuqm/base/common/AESCBCUtil.java @@ -0,0 +1,143 @@ +package com.xuqm.base.common; + +import android.text.TextUtils; +import android.util.Base64; + +import java.nio.charset.StandardCharsets; +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; +import java.util.Locale; + +import javax.crypto.Cipher; +import javax.crypto.spec.IvParameterSpec; +import javax.crypto.spec.SecretKeySpec; + +public class AESCBCUtil { //密码 + private static final String key = "12345678901234567890123456789012"; + //iv偏移量 + private static final String iv = "1234567890123456"; + + /** + * 加密:对字符串进行加密,并返回十六进制字符串(hex) + * + * @param encryptStr 需要加密的字符串 + * @return 加密后的十六进制字符串(hex) + */ + public static String encrypt(String encryptStr, String key, String iv) { + try { + IvParameterSpec ivParameterSpec = new IvParameterSpec(iv.getBytes(StandardCharsets.UTF_8)); + SecretKeySpec skeySpec = new SecretKeySpec(key.getBytes(StandardCharsets.UTF_8), "AES"); + + Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7PADDING"); + cipher.init(Cipher.ENCRYPT_MODE, skeySpec, ivParameterSpec); + + byte[] encrypted = cipher.doFinal(encryptStr.getBytes()); + + + byte[] encode = Base64.encode(encrypted, Base64.DEFAULT); + + return new String(encode).replace("\n",""); + // return byte2HexStr(encrypted); + } catch (Exception ex) { + ex.printStackTrace(); + } + + return null; + } + + /** + * 解密:对加密后的十六进制字符串(hex)进行解密,并返回字符串 + * + * @param encryptedStr 需要解密的,加密后的十六进制字符串 + * @return 解密后的字符串 + */ + public static String decrypt(String encryptedStr, String key, String iv) { + try { + IvParameterSpec ivParameterSpec = new IvParameterSpec(iv.getBytes(StandardCharsets.UTF_8)); + SecretKeySpec skeySpec = new SecretKeySpec(key.getBytes(StandardCharsets.UTF_8), "AES"); + + + Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7PADDING"); + cipher.init(Cipher.DECRYPT_MODE, skeySpec, ivParameterSpec); + + + byte[] decode = Base64.decode(encryptedStr, Base64.DEFAULT); + + // byte[] bytes = hexStr2Bytes(encryptedStr); + byte[] original = cipher.doFinal(decode); + + return new String(original); + } catch (Exception ex) { + ex.printStackTrace(); + } + + return null; + } + + /** + * 十六进制字符串转换为byte[] + * + * @param hexStr 需要转换为byte[]的字符串 + * @return 转换后的byte[] + */ + public static byte[] hexStr2Bytes(String hexStr) { + + + /*对输入值进行规范化整理*/ + hexStr = hexStr.trim().replace(" ", "").toUpperCase(Locale.US); + //处理值初始化 + int m = 0, n = 0; + int iLen = hexStr.length() / 2; //计算长度 + byte[] ret = new byte[iLen]; //分配存储空间 + + for (int i = 0; i < iLen; i++) { + m = i * 2 + 1; + n = m + 1; + ret[i] = (byte) (Integer.decode("0x" + hexStr.substring(i * 2, m) + hexStr.substring(m, n)) & 0xFF); + } + return ret; + } + + + /** + * byte[]转换为十六进制字符串 + * + * @param bytes 需要转换为字符串的byte[] + * @return 转换后的十六进制字符串 + */ + public static String byte2HexStr(byte[] bytes) { + String hs = ""; + String stmp = ""; + for (int n = 0; n < bytes.length; n++) { + stmp = (Integer.toHexString(bytes[n] & 0XFF)); + if (stmp.length() == 1) + hs = hs + "0" + stmp; + else + hs = hs + stmp; + } + return hs; + } + + public static String md5(String string) { + if (TextUtils.isEmpty(string)) { + return ""; + } + MessageDigest md5 = null; + try { + md5 = MessageDigest.getInstance("MD5"); + byte[] bytes = md5.digest(string.getBytes()); + String result = ""; + for (byte b : bytes) { + String temp = Integer.toHexString(b & 0xff); + if (temp.length() == 1) { + temp = "0" + temp; + } + result += temp; + } + return result.toUpperCase(); + } catch (NoSuchAlgorithmException e) { + e.printStackTrace(); + } + return ""; + } +} diff --git a/base/src/main/java/com/xuqm/base/common/AppManager.java b/base/src/main/java/com/xuqm/base/common/AppManager.java new file mode 100644 index 0000000..5ee6bf1 --- /dev/null +++ b/base/src/main/java/com/xuqm/base/common/AppManager.java @@ -0,0 +1,106 @@ +package com.xuqm.base.common; + +import android.app.Activity; + +import java.util.Stack; + +/** + * activity的管理栈 + */ +public class AppManager { + + + public static AppManager getInstance() { + return APPHolder.INSTANCE; + } + + private static class APPHolder { + private static final AppManager INSTANCE = new AppManager(); + } + + private AppManager() { + activityStack = new Stack<>(); + } + + private final Stack activityStack; + + //添加一个新的act + public void pushActivity(Activity activity) { + activityStack.add(activity); + } + + /** + * 推出一个activity 其实toolbar的返回按钮,可以直接使用这个方法 + * + * @param activity 需要退出的activity + */ + public void popActivity(Activity activity) { + if (activityStack != null && activityStack.size() > 0) { + if (activity != null) { + activity.finish(); + activityStack.remove(activity); + } + + } + } + + /** + * 获取当前最上面的那个activity + * + * @return + */ + public Activity getActivity() { + return activityStack.lastElement(); + } + + /** + * finish最后一个 + * + * @return + */ + public void finish() { + this.popActivity(this.getActivity()); + } + + + /** + * finish最后一个之外的所有页面 + * + * @return + */ + public void logout() { + if (activityStack.size() < 1) + return; + for (int i = 0; i < activityStack.size() - 1; i++) { + Activity activity = activityStack.firstElement(); + if (activity == null) break; + popActivity(activity); + } + } + + /** + * 退出app + */ + public void exit() { + if (activityStack != null) { + while (activityStack.size() > 0) { + Activity activity = getActivity(); + if (activity == null) break; + popActivity(activity); + } + } + android.os.Process.killProcess(android.os.Process.myPid()); + } + + /** + * 退出app + */ + public void exitWithOutLast() { + if (activityStack != null) { + int size = activityStack.size(); + for (int i = 0; i < size - 1; i++) { + popActivity(activityStack.get(0)); + } + } + } +} diff --git a/base/src/main/java/com/xuqm/base/common/DeviceUuidFactory.java b/base/src/main/java/com/xuqm/base/common/DeviceUuidFactory.java new file mode 100644 index 0000000..cfa47cf --- /dev/null +++ b/base/src/main/java/com/xuqm/base/common/DeviceUuidFactory.java @@ -0,0 +1,87 @@ +package com.xuqm.base.common; + +import android.content.Context; +import android.content.SharedPreferences; +import android.provider.Settings.Secure; +import android.telephony.TelephonyManager; + +import java.io.UnsupportedEncodingException; +import java.util.UUID; + +public class DeviceUuidFactory { + protected static final String PREFS_FILE = "device_id.xml"; + protected static final String PREFS_DEVICE_ID = "device_id"; + + protected static volatile UUID uuid; + + + + public DeviceUuidFactory(Context context) { + + if( uuid ==null ) { + synchronized (DeviceUuidFactory.class) { + if( uuid == null) { + final SharedPreferences prefs = context.getSharedPreferences( PREFS_FILE, 0); + final String id = prefs.getString(PREFS_DEVICE_ID, null ); + + if (id != null) { + // Use the ids previously computed and stored in the prefs file + uuid = UUID.fromString(id); + + } else { + + final String androidId = Secure.getString(context.getContentResolver(), Secure.ANDROID_ID); + + // Use the Android ID unless it's broken, in which case fallback on deviceId, + // unless it's not available, then fallback on a random number which we store + // to a prefs file + try { + if (!"9774d56d682e549c".equals(androidId)) { + uuid = UUID.nameUUIDFromBytes(androidId.getBytes("utf8")); + } else { + final String deviceId = ((TelephonyManager) context.getSystemService( Context.TELEPHONY_SERVICE )).getDeviceId(); + uuid = deviceId!=null ? UUID.nameUUIDFromBytes(deviceId.getBytes("utf8")) : UUID.randomUUID(); + } + } catch (UnsupportedEncodingException e) { + throw new RuntimeException(e); + } + + // Write the value out to the prefs file + prefs.edit().putString(PREFS_DEVICE_ID, uuid.toString() ).commit(); + + } + + } + } + } + + } + + + /** + * Returns a unique UUID for the current android device. As with all UUIDs, this unique ID is "very highly likely" + * to be unique across all Android devices. Much more so than ANDROID_ID is. + * + * The UUID is generated by using ANDROID_ID as the base key if appropriate, falling back on + * TelephonyManager.getDeviceID() if ANDROID_ID is known to be incorrect, and finally falling back + * on a random UUID that's persisted to SharedPreferences if getDeviceID() does not return a + * usable value. + * + * In some rare circumstances, this ID may change. In particular, if the device is factory reset a new device ID + * may be generated. In addition, if a user upgrades their phone from certain buggy implementations of Android 2.2 + * to a newer, non-buggy version of Android, the device ID may change. Or, if a user uninstalls your app on + * a device that has neither a proper Android ID nor a Device ID, this ID may change on reinstallation. + * + * Note that if the code falls back on using TelephonyManager.getDeviceId(), the resulting ID will NOT + * change after a factory reset. Something to be aware of. + * + * Works around a bug in Android 2.2 for many devices when using ANDROID_ID directly. + * + * @see http://code.google.com/p/android/issues/detail?id=10603 + * + * @return a UUID that may be used to uniquely identify your device for most purposes. + */ + public UUID getDeviceUuid() { + return uuid; + } +} \ No newline at end of file diff --git a/base/src/main/java/com/xuqm/base/common/DimensHelper.java b/base/src/main/java/com/xuqm/base/common/DimensHelper.java new file mode 100644 index 0000000..e90216a --- /dev/null +++ b/base/src/main/java/com/xuqm/base/common/DimensHelper.java @@ -0,0 +1,10 @@ +package com.xuqm.base.common; + +import android.content.Context; +import android.util.TypedValue; + +public class DimensHelper { + public static int pxToDp(Context context, int px) { + return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, px, context.getResources().getDisplayMetrics()); + } +} diff --git a/base/src/main/java/com/xuqm/base/common/FileHelper.java b/base/src/main/java/com/xuqm/base/common/FileHelper.java new file mode 100644 index 0000000..4fd64c4 --- /dev/null +++ b/base/src/main/java/com/xuqm/base/common/FileHelper.java @@ -0,0 +1,218 @@ +package com.xuqm.base.common; + +import android.content.Context; +import android.content.Intent; +import android.graphics.Bitmap; +import android.net.Uri; +import android.os.Build; +import android.os.Environment; + +import androidx.annotation.NonNull; +import androidx.core.content.FileProvider; + +import com.xuqm.base.App; +import com.xuqm.base.BuildConfig; + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.nio.charset.StandardCharsets; +import java.util.UUID; + +public class FileHelper { + + + public static String getRootFilePath() { + return App.getInstance().getExternalFilesDir(null).getPath() + + File.separator + + BuildConfig.APP_ID + + File.separator; + } + + /** + * 根据路径创建文件夹 + * + * @param filePath + * @return + */ + public static boolean createDirectory(String filePath) { + if (ToolsHelper.isNull(filePath)) { + return false; + } + + File file = new File(filePath); + + if (file.exists() && file.isDirectory()) { + return true; + } + + return file.mkdirs(); + + } + + public static void delete(String path) { + LogHelper.e(String.format("开始删除文件::%s", path)); + File file = new File(path); + if (!file.exists() + || !file.isFile()) + return; + file.delete(); + + } + public static void delete(File file) { + LogHelper.e(String.format("开始删除文件::%s", file.getAbsoluteFile())); + if (!file.exists() + || !file.isFile()) + return; + file.delete(); + + } + + public static String getVoicePath() { + String path = getRootFilePath() + + "voice" + + File.separator; + + return createDirectory(path) ? path : ""; + } + public static String getImagePath() { + String path = getRootFilePath() + + "image" + + File.separator; + + return createDirectory(path) ? path : ""; + } + + public static String getAppPath() { + String path = getRootFilePath() + + "apps" + + File.separator; + LogHelper.e(path); + + return createDirectory(path) ? path : ""; + } + public static String getDownloadPath() { + String path = getRootFilePath() + + "download" + + File.separator; + LogHelper.e(path); + + return createDirectory(path) ? path : ""; + } + + /** + * 读取assets文件夹的文件 + * + * @param strFileName 文件名,包含assets后面的路径 + * @return 文件内容 + */ + public static String readJSON(String strFileName) { + String strResult = ""; + try (InputStream is = App.getInstance().getAssets().open(strFileName)) { + int size = is.available(); + byte[] buffer = new byte[size]; + is.read(buffer); + strResult = new String(buffer, StandardCharsets.UTF_8); + } catch (Exception ex) { + LogHelper.e("readJson", ex); + } + return strResult; + } + + public static String getBitmapFilePath(String path, String suffix) { + + String pathStr = getRootFilePath() + "images" + File.separator + path + File.separator; + createDirectory(pathStr); + + return pathStr + UUID.randomUUID() + "." + suffix; + } + + /** + * 保存图片到本地 + * + * @param bitmap 图片 + * @param filePath 保存到的文件 png + * @return 状态 + */ + public static String saveBitmap(Bitmap bitmap, String filePath) { + if (bitmap == null) + return ""; + FileOutputStream fos = null; + try { + fos = new FileOutputStream(new File(filePath)); + bitmap.compress(Bitmap.CompressFormat.PNG, 100, fos); + fos.flush(); + return filePath; + } catch (Exception e) { + e.printStackTrace(); + } finally { + if (fos != null) { + try { + fos.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + return ""; + } + + public void installAPK(String filePath) { + Intent intent = new Intent(); + intent.setAction("android.intent.action.VIEW"); + intent.addCategory("android.intent.category.DEFAULT"); + intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);// 广播里面操作需要加上这句,存在于一个独立的栈里 + intent.setDataAndType(Uri.fromFile(new File(filePath)), "application/vnd.android.package-archive"); + App.getInstance().startActivity(intent); + } + + public static void openFile(Context activity, File file) { + Intent intent = new Intent(); + intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + // 设置intent的Action属性 + intent.setAction(Intent.ACTION_VIEW); + // 获取文件file的MIME类型 + String type = getMIMEType(file); + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { + intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); + } + // 设置intent的data和Type属性。 + intent.setDataAndType(/* uri */FileHelper.getFileUri(file), type); + activity.startActivity(intent); + } + + public static Uri getFileUri(@NonNull File file) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { + return FileProvider.getUriForFile(AppManager.getInstance().getActivity(), BuildConfig.APP_ID + ".fileprovider", file); + } else { + return Uri.fromFile(file); + } + } + + private static String[][] MIME_MapTable = new String[][]{{".3gp", "video/3gpp"}, {".apk", "application/vnd.android.package-archive"}, {".asf", "video/x-ms-asf"}, {".avi", "video/x-msvideo"}, {".bin", "application/octet-stream"}, {".bmp", "image/bmp"}, {".c", "text/plain"}, {".class", "application/octet-stream"}, {".conf", "text/plain"}, {".cpp", "text/plain"}, {".doc", "application/msword"}, {".docx", "application/vnd.openxmlformats-officedocument.wordprocessingml.document"}, {".xls", "application/vnd.ms-excel"}, {".xlsx", "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"}, {".exe", "application/octet-stream"}, {".gif", "image/gif"}, {".gtar", "application/x-gtar"}, {".gz", "application/x-gzip"}, {".h", "text/plain"}, {".htm", "text/html"}, {".html", "text/html"}, {".jar", "application/java-archive"}, {".java", "text/plain"}, {".jpeg", "image/jpeg"}, {".jpg", "image/jpeg"}, {".eucppic", "image/jpeg"}, {".js", "application/x-javascript"}, {".log", "text/plain"}, {".m3u", "audio/x-mpegurl"}, {".m4a", "audio/mp4a-latm"}, {".m4b", "audio/mp4a-latm"}, {".m4p", "audio/mp4a-latm"}, {".m4u", "video/vnd.mpegurl"}, {".m4v", "video/x-m4v"}, {".mov", "video/quicktime"}, {".mp2", "audio/x-mpeg"}, {".mp3", "audio/x-mpeg"}, {".mp4", "video/mp4"}, {".mpc", "application/vnd.mpohun.certificate"}, {".mpe", "video/mpeg"}, {".mpeg", "video/mpeg"}, {".mpg", "video/mpeg"}, {".mpg4", "video/mp4"}, {".mpga", "audio/mpeg"}, {".msg", "application/vnd.ms-outlook"}, {".ogg", "audio/ogg"}, {".pdf", "application/pdf"}, {".png", "image/png"}, {".pps", "application/vnd.ms-powerpoint"}, {".ppt", "application/vnd.ms-powerpoint"}, {".pptx", "application/vnd.openxmlformats-officedocument.presentationml.presentation"}, {".prop", "text/plain"}, {".rc", "text/plain"}, {".rmvb", "audio/x-pn-realaudio"}, {".rtf", "application/rtf"}, {".sh", "text/plain"}, {".tar", "application/x-tar"}, {".tgz", "application/x-compressed"}, {".txt", "text/plain"}, {".wav", "audio/x-wav"}, {".wma", "audio/x-ms-wma"}, {".wmv", "audio/x-ms-wmv"}, {".wps", "application/vnd.ms-works"}, {".xml", "text/plain"}, {".z", "application/x-compress"}, {".zip", "application/x-zip-compressed"}, {"", "*/*"}}; + + public static String getMIMEType(File file) { + String type = "*/*"; + String fName = file.getName(); + int dotIndex = fName.lastIndexOf("."); + if (dotIndex < 0) { + return type; + } else { + String end = fName.substring(dotIndex, fName.length()).toLowerCase(); + if (end == "") { + return type; + } else { + for (int i = 0; i < MIME_MapTable.length; ++i) { + if (end.equals(MIME_MapTable[i][0])) { + type = MIME_MapTable[i][1]; + } + } + + return type; + } + } + } + +} diff --git a/base/src/main/java/com/xuqm/base/common/GlideEngine.java b/base/src/main/java/com/xuqm/base/common/GlideEngine.java new file mode 100644 index 0000000..627aab8 --- /dev/null +++ b/base/src/main/java/com/xuqm/base/common/GlideEngine.java @@ -0,0 +1,112 @@ +package com.xuqm.base.common; + +import android.content.Context; +import android.widget.ImageView; + +import com.bumptech.glide.Glide; +import com.bumptech.glide.load.resource.bitmap.CenterCrop; +import com.bumptech.glide.load.resource.bitmap.RoundedCorners; +import com.luck.picture.lib.engine.ImageEngine; +import com.luck.picture.lib.utils.ActivityCompatHelper; +import com.xuqm.base.R; + +public class GlideEngine implements ImageEngine { + + /** + * 加载图片 + * + * @param context 上下文 + * @param url 资源url + * @param imageView 图片承载控件 + */ + @Override + public void loadImage(Context context, String url, ImageView imageView) { + if (!ActivityCompatHelper.assertValidRequest(context)) { + return; + } + Glide.with(context) + .load(url) + .into(imageView); + } + + @Override + public void loadImage(Context context, ImageView imageView, String url, int maxWidth, int maxHeight) { + if (!ActivityCompatHelper.assertValidRequest(context)) { + return; + } + Glide.with(context) + .load(url) + .override(maxWidth, maxHeight) + .into(imageView); + } + + /** + * 加载相册目录封面 + * + * @param context 上下文 + * @param url 图片路径 + * @param imageView 承载图片ImageView + */ + @Override + public void loadAlbumCover(Context context, String url, ImageView imageView) { + if (!ActivityCompatHelper.assertValidRequest(context)) { + return; + } + Glide.with(context) + .asBitmap() + .load(url) + .override(180, 180) + .sizeMultiplier(0.5f) + .transform(new CenterCrop(), new RoundedCorners(8)) + .placeholder(R.drawable.ps_image_placeholder) + .into(imageView); + } + + + /** + * 加载图片列表图片 + * + * @param context 上下文 + * @param url 图片路径 + * @param imageView 承载图片ImageView + */ + @Override + public void loadGridImage(Context context, String url, ImageView imageView) { + if (!ActivityCompatHelper.assertValidRequest(context)) { + return; + } + Glide.with(context) + .load(url) + .override(200, 200) + .centerCrop() + .placeholder(R.drawable.ps_image_placeholder) + .into(imageView); + } + + @Override + public void pauseRequests(Context context) { + if (!ActivityCompatHelper.assertValidRequest(context)) { + return; + } + Glide.with(context).pauseRequests(); + } + + @Override + public void resumeRequests(Context context) { + if (!ActivityCompatHelper.assertValidRequest(context)) { + return; + } + Glide.with(context).resumeRequests(); + } + + private GlideEngine() { + } + + private static final class InstanceHolder { + static final GlideEngine instance = new GlideEngine(); + } + + public static GlideEngine createGlideEngine() { + return InstanceHolder.instance; + } +} \ No newline at end of file diff --git a/base/src/main/java/com/xuqm/base/common/GsonImplHelp.java b/base/src/main/java/com/xuqm/base/common/GsonImplHelp.java new file mode 100644 index 0000000..fb1ad62 --- /dev/null +++ b/base/src/main/java/com/xuqm/base/common/GsonImplHelp.java @@ -0,0 +1,61 @@ +package com.xuqm.base.common; + +import com.google.gson.Gson; +import com.google.gson.JsonArray; +import com.google.gson.JsonElement; +import com.google.gson.JsonParser; + +import java.lang.reflect.Type; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +/** + * Created by xuqm on 2016/6/3. + */ +public class GsonImplHelp extends Json { + private Gson gson = new Gson(); + + @Override + public String toJson(Object src) { + return gson.toJson(src); + + } + + @Override + public T toObject(String json, Class claxx) { + return gson.fromJson(json, claxx); + + } + + @Override + public T toObject(String json, Type typeOfT) { + return gson.fromJson(json, typeOfT); + + } + + @Override + public T toObject(byte[] bytes, Class claxx) { + return gson.fromJson(new String(bytes), claxx); + + } + + public List toList(String json, Class clazz) { + JsonArray jsonArray = new JsonParser().parse(json).getAsJsonArray(); + + List list = new ArrayList<>(); + for (JsonElement jsonElement : jsonArray) { + list.add(gson.fromJson(jsonElement, clazz)); //cls + } + + return list; + + + } + + public static List stringToArray(String s, Class cls) { + T[] array = new Gson().fromJson(s, cls); + return Arrays.asList(array); + } + +} diff --git a/base/src/main/java/com/xuqm/base/common/ImageHelp.java b/base/src/main/java/com/xuqm/base/common/ImageHelp.java new file mode 100644 index 0000000..135b306 --- /dev/null +++ b/base/src/main/java/com/xuqm/base/common/ImageHelp.java @@ -0,0 +1,53 @@ +package com.xuqm.base.common; + +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; +import android.util.Base64; + +import java.io.ByteArrayOutputStream; +import java.io.IOException; + +public class ImageHelp { + /* + * bitmap转base64 + * */ + public static String bitmapToBase64(Bitmap bitmap) { + String result = null; + ByteArrayOutputStream baos = null; + try { + if (bitmap != null) { + baos = new ByteArrayOutputStream(); + bitmap.compress(Bitmap.CompressFormat.JPEG, 100, baos); + + baos.flush(); + baos.close(); + + byte[] bitmapBytes = baos.toByteArray(); + result = Base64.encodeToString(bitmapBytes, Base64.DEFAULT); + } + } catch (IOException e) { + e.printStackTrace(); + } finally { + try { + if (baos != null) { + baos.flush(); + baos.close(); + } + } catch (IOException e) { + e.printStackTrace(); + } + } + return result; + } + + /** + * base64转为bitmap + * + * @param base64Data + * @return + */ + public static Bitmap base64ToBitmap(String base64Data) { + byte[] bytes = Base64.decode(base64Data, Base64.DEFAULT); + return BitmapFactory.decodeByteArray(bytes, 0, bytes.length); + } +} diff --git a/base/src/main/java/com/xuqm/base/common/ImageHelper.java b/base/src/main/java/com/xuqm/base/common/ImageHelper.java new file mode 100644 index 0000000..374d795 --- /dev/null +++ b/base/src/main/java/com/xuqm/base/common/ImageHelper.java @@ -0,0 +1,34 @@ +package com.xuqm.base.common; + +import android.widget.ImageView; + +import androidx.annotation.DrawableRes; + +import com.bumptech.glide.Glide; +import com.bumptech.glide.load.engine.DiskCacheStrategy; +import com.bumptech.glide.request.RequestOptions; + +/** + * 一个image相关的工具类 + * + * @author xuqm + */ +public class ImageHelper { + /** + * 给imageView添加图片的方法 + * + * @param imageView 需要添加图片的控件 + * @param url url地址,可以是path draw等 + */ + public static void load(ImageView imageView, Object url) { + Glide.with(imageView).load(url).into(imageView); + } + + public static void load(ImageView imageView, @DrawableRes int resourceId, Object url) { + Glide.with(imageView).applyDefaultRequestOptions(RequestOptions.diskCacheStrategyOf(DiskCacheStrategy.AUTOMATIC)).load(url).placeholder(resourceId).error(resourceId).into(imageView); + } + + public static void load(ImageView imageView, @DrawableRes int placeholder, @DrawableRes int error, Object url) { + Glide.with(imageView).applyDefaultRequestOptions(RequestOptions.diskCacheStrategyOf(DiskCacheStrategy.AUTOMATIC)).load(url).placeholder(placeholder).error(error).into(imageView); + } +} diff --git a/base/src/main/java/com/xuqm/base/common/Json.java b/base/src/main/java/com/xuqm/base/common/Json.java new file mode 100644 index 0000000..4c57223 --- /dev/null +++ b/base/src/main/java/com/xuqm/base/common/Json.java @@ -0,0 +1,31 @@ +package com.xuqm.base.common; + +import java.lang.reflect.Type; +import java.util.List; + +/** + * Created by xuqm on 2016/6/3. + */ +public abstract class Json { + private static Json json; + + Json() { + } + + public static Json get() { + if (json == null) { + json = new GsonImplHelp(); + } + return json; + } + + public abstract String toJson(Object src); + + public abstract T toObject(String json, Class claxx); + public abstract T toObject(String json, Type typeOfT); + + public abstract T toObject(byte[] bytes, Class claxx); + + public abstract List toList(String json, Class claxx); + +} diff --git a/base/src/main/java/com/xuqm/base/common/LogHelper.java b/base/src/main/java/com/xuqm/base/common/LogHelper.java new file mode 100644 index 0000000..8521ecd --- /dev/null +++ b/base/src/main/java/com/xuqm/base/common/LogHelper.java @@ -0,0 +1,75 @@ +package com.xuqm.base.common; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; + +import com.orhanobut.logger.Logger; + +import java.util.Locale; + +/** + * 日志库用的是 KLog + * 平常自己调试时候不想用那么多,就随便写了个类 + */ +public class LogHelper { + + + public static void d(String tag, Object object) { + Logger.t(tag).d(object); + } + + public static void d(Object object) { + StackTraceElement caller = getCallerStackTraceElement(); + String tag = generateTag(caller); + Logger.t(tag).d(object); + } + + public static void d(@NonNull String message, @Nullable Object... args) { + Logger.t(message).d(args); + } + + public static void e(String tag, Object object) { + Logger.t(tag).e(object.toString()); + } + + public static void e(Object object) { + if (null == object){ + return; + } + StackTraceElement caller = getCallerStackTraceElement(); + String tag = generateTag(caller); + Logger.t(tag).e("=====>" + object.toString()); + } + + public static void e(String msg, Throwable tr) { + StackTraceElement caller = getCallerStackTraceElement(); + String tag = generateTag(caller); + Logger.t(tag).e(tr, msg); + } + + public static void e(String tag, String msg, Throwable tr) { + Logger.t(tag).e(tr, msg); + } + + public static void json(String msg) { + StackTraceElement caller = getCallerStackTraceElement(); + String tag = generateTag(caller); + Logger.t(tag).json(msg); + } + + public static void json(String tag, String msg) { + Logger.t(tag).json(msg); + } + + + private static String generateTag(StackTraceElement caller) { + String tag = "%s.%s(L:%d)"; + String callerClazzName = caller.getClassName(); + callerClazzName = callerClazzName.substring(callerClazzName.lastIndexOf(".") + 1); + return String.format(Locale.getDefault(), tag, callerClazzName, caller.getMethodName(), caller.getLineNumber()); + } + + private static StackTraceElement getCallerStackTraceElement() { + return Thread.currentThread().getStackTrace()[4]; + } +} diff --git a/base/src/main/java/com/xuqm/base/common/RefreshResult.java b/base/src/main/java/com/xuqm/base/common/RefreshResult.java new file mode 100644 index 0000000..932b1aa --- /dev/null +++ b/base/src/main/java/com/xuqm/base/common/RefreshResult.java @@ -0,0 +1,8 @@ +package com.xuqm.base.common; + +/** + * 下拉刷新的状态码表 + */ +public enum RefreshResult { + SUCCEED, FAILED, NO_DATA, NO_MORE +} diff --git a/base/src/main/java/com/xuqm/base/common/ScreenUtils.java b/base/src/main/java/com/xuqm/base/common/ScreenUtils.java new file mode 100644 index 0000000..46772c6 --- /dev/null +++ b/base/src/main/java/com/xuqm/base/common/ScreenUtils.java @@ -0,0 +1,18 @@ +package com.xuqm.base.common; + +import android.content.Context; + +public class ScreenUtils { + /** + * 获取屏幕高度(px) + */ + public static int getScreenHeight(Context context) { + return context.getResources().getDisplayMetrics().heightPixels; + } + /** + * 获取屏幕宽度(px) + */ + public static int getScreenWidth(Context context) { + return context.getResources().getDisplayMetrics().widthPixels; + } +} diff --git a/base/src/main/java/com/xuqm/base/common/SharedPreferencesConfigs.kt b/base/src/main/java/com/xuqm/base/common/SharedPreferencesConfigs.kt new file mode 100644 index 0000000..965e51b --- /dev/null +++ b/base/src/main/java/com/xuqm/base/common/SharedPreferencesConfigs.kt @@ -0,0 +1,13 @@ +package com.xuqm.base.common + + +const val SHARE_UESR_NAME = "share_user_name" +const val SHARE_UESR_PASSWORD = "share_user_password" +const val SHARE_LOGIN_OBJ = "SHARE_LOGIN_OBJ" +const val SHARE_UESR_TOKEN = "share_user_token" +const val SHARE_UESR_ID = "share_user_id" +const val SHARE_UESR_TOKEN_TIME = "share_user_token_time" + +const val MSG_COUNT = "msg_count" + +const val SHARE_COUNTRY = "share_user_country" diff --git a/base/src/main/java/com/xuqm/base/common/TimeHelper.java b/base/src/main/java/com/xuqm/base/common/TimeHelper.java new file mode 100644 index 0000000..06e241f --- /dev/null +++ b/base/src/main/java/com/xuqm/base/common/TimeHelper.java @@ -0,0 +1,94 @@ +package com.xuqm.base.common; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.Locale; +import java.util.TimeZone; + +public class TimeHelper { + + /** + * 获取当前时间戳 + * + * @return 时间戳 + */ + public static long getTimeMillis() { + return System.currentTimeMillis(); + } + + /** + * 获取当前时间,指定返回样式 + * + * @param formats 指定样式 + * @return 时间字符串 + */ + public static String getTimeString(String formats) { + return getStringFormMillis(System.currentTimeMillis(), formats); + } + + /** + * 根据给定时间戳和样式,返回字符串 + * + * @param millis 时间戳 + * @param formats 指定字符串格式 + * @return 时间字符串 + */ + public static String getStringFormMillis(long millis, String formats) { + Date date = new Date(millis); + return new SimpleDateFormat(formats, Locale.CHINESE).format(date); + } + + public static String getStringFormMillisForGMT(long millis, String formats) { + Date date = new Date(millis); + + SimpleDateFormat simpleDateFormat = new SimpleDateFormat(formats);//格式 + + simpleDateFormat.setTimeZone(TimeZone.getTimeZone("GMT")); // 设置时区为GMT + + + return simpleDateFormat.format(date); + } + + + /** + * 根据Date 返回指定格式的时字符串 + * + * @param date 数据 + * @param formats 格式 + * @return 指定格式的字符串 + */ + public static String getStringFromDate(Date date, String formats) { + SimpleDateFormat formatter = new SimpleDateFormat(formats, Locale.getDefault()); + return formatter.format(date); + } + + /** + * 根据给定字符串和格式,获取时间戳 + * + * @param dateString 时间字符串 + * @param formats 时间格式 + * @return 时间戳 + */ + public static long getTimeMillisForType(String dateString, String formats) { + SimpleDateFormat format = new SimpleDateFormat(formats, Locale.getDefault()); + Date date = null; + try { + date = format.parse(dateString); + } catch (ParseException e) { + e.printStackTrace(); + } + + return date != null ? date.getTime() : 0; + + } + + /** + * 获取以秒为单位的时间戳 + * + * @return 秒 + */ + public static long getTimeFromSecond() { + return getTimeMillis() / 1000; + } +} diff --git a/base/src/main/java/com/xuqm/base/common/ToolsHelper.java b/base/src/main/java/com/xuqm/base/common/ToolsHelper.java new file mode 100644 index 0000000..48c5fe9 --- /dev/null +++ b/base/src/main/java/com/xuqm/base/common/ToolsHelper.java @@ -0,0 +1,274 @@ +package com.xuqm.base.common; + +import android.text.Editable; +import android.text.TextUtils; +import android.text.TextWatcher; +import android.view.View; +import android.widget.EditText; +import android.widget.Toast; + +import com.google.android.material.snackbar.Snackbar; +import com.google.android.material.textfield.TextInputLayout; +import com.google.gson.internal.$Gson$Types; + +import java.lang.reflect.Field; +import java.lang.reflect.ParameterizedType; +import java.lang.reflect.Type; +import java.util.HashMap; +import java.util.Map; + +public class ToolsHelper { + + public static boolean isNull(Object obj) { + if (null == obj) return true; + String str = obj.toString(); + if (str.isEmpty()) return true; + return str.equalsIgnoreCase("null"); + } + + public static Long toLong(Object obj) { + if (isNull(obj)) return 0L; + try { + return Long.parseLong(obj.toString()); + } catch (Exception e) { + return 0L; + } + } + + public static int toInt(Object obj) { + if (isNull(obj)) return 0; + try { + return (int)(ToolsHelper.toDouble(obj.toString())); + } catch (Exception e) { + return 0; + } + } + + public static double toDouble(Object obj) { + if (isNull(obj)) return 0.0; + try { + return Double.parseDouble(obj.toString()); + } catch (Exception e) { + return 0D; + } + } + + public static String toString(Object obj) { + if (isNull(obj)) return ""; + return obj.toString(); + } + + + /** + * 格式化json字符串 + * + * @param jsonStr 需要格式化的json串 + * @return 格式化后的json串 + */ + public static String formatJson(String jsonStr) { + if (null == jsonStr || "".equals(jsonStr)) return ""; + StringBuilder sb = new StringBuilder(); + char last = '\0'; + char current = '\0'; + int indent = 0; + for (int i = 0; i < jsonStr.length(); i++) { + last = current; + current = jsonStr.charAt(i); + //遇到{ [换行,且下一行缩进 + switch (current) { + case '{': + case '[': + sb.append(current); + sb.append('\n'); + indent++; + addIndentBlank(sb, indent); + break; + //遇到} ]换行,当前行缩进 + case '}': + case ']': + sb.append('\n'); + indent--; + addIndentBlank(sb, indent); + sb.append(current); + break; + //遇到,换行 + case ',': + sb.append(current); + if (last != '\\') { + sb.append('\n'); + addIndentBlank(sb, indent); + } + break; + default: + sb.append(current); + } + } + return sb.toString(); + } + + /** + * 添加space + */ + private static void addIndentBlank(StringBuilder sb, int indent) { + for (int i = 0; i < indent; i++) { + sb.append('\t'); + } + } + + /** + * http 请求数据返回 json 中中文字符为 unicode 编码转汉字转码 + * + * @param theString + * @return 转化后的结果. + */ + public static String decodeUnicode(String theString) { + char aChar; + int len = theString.length(); + StringBuilder outBuffer = new StringBuilder(len); + for (int x = 0; x < len; ) { + aChar = theString.charAt(x++); + if (aChar == '\\') { + aChar = theString.charAt(x++); + if (aChar == 'u') { + int value = 0; + for (int i = 0; i < 4; i++) { + aChar = theString.charAt(x++); + switch (aChar) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + value = (value << 4) + aChar - '0'; + break; + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': + value = (value << 4) + 10 + aChar - 'a'; + break; + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + value = (value << 4) + 10 + aChar - 'A'; + break; + default: + throw new IllegalArgumentException("Malformed \\uxxxx encoding."); + } + + } + outBuffer.append((char) value); + } else { + if (aChar == 't') { + aChar = '\t'; + } else if (aChar != 'r') { + if (aChar == 'n') { + aChar = '\n'; + } else if (aChar == 'f') { + aChar = '\f'; + } + } else { + aChar = '\r'; + } + outBuffer.append(aChar); + } + } else { + outBuffer.append(aChar); + } + } + return outBuffer.toString(); + } + + /** + * 弹出提示信息 感觉比Toast好看点 不过Toast不需要依赖view + * + * @param view 绑定一个view才能展示 + * @param content 需要展示的内容 + */ + public static void snack(View view, CharSequence content) { + Snackbar.make(view, content, Snackbar.LENGTH_SHORT).show(); + } + + public static void showMessage(CharSequence content) { + Toast.makeText(AppManager.getInstance().getActivity(), content, Toast.LENGTH_SHORT).show(); + } + + /** + * EditText绑定TextInputLayout,处理一下 + * + * @param editText editText + * @param textInputLayout textInputLayout + */ + public static void addTextChangedListener(EditText editText, TextInputLayout textInputLayout) { + editText.addTextChangedListener(new TextWatcher() { + @Override + public void beforeTextChanged(CharSequence s, int start, int count, int after) { + + } + + @Override + public void onTextChanged(CharSequence s, int start, int before, int count) { + + } + + @Override + public void afterTextChanged(Editable s) { + if (!TextUtils.isEmpty(textInputLayout.getError())) {//输入的时候不提示错误信息 + textInputLayout.setErrorEnabled(true); + textInputLayout.setError(""); + textInputLayout.setErrorEnabled(false); + } + } + }); + } + + /** + * 使用 TextInputLayout 提示错误信息 + * + * @param textInputLayout TextInputLayout + * @param msg 错判的内容 + */ + public static void showError(TextInputLayout textInputLayout, String msg) { + textInputLayout.setErrorEnabled(true); + textInputLayout.setError(msg); + } + + /** + * 将Object对象里面的属性和值转化成Map对象 + * + * @param obj + * @return + * @throws IllegalAccessException + */ + public static Map objectToMap(Object obj) throws IllegalAccessException { + Map map = new HashMap<>(); + Class clazz = obj.getClass(); + for (Field field : clazz.getDeclaredFields()) { + field.setAccessible(true); + String fieldName = field.getName(); + T value = (T) field.get(obj); + if (null != value) map.put(fieldName, value); + } + return map; + } + + public static Type getSuperclassTypeParameter(Class subclass) { + Type superClass = subclass.getGenericSuperclass(); +// if (superClass instanceof Class) { +// System.out.println("superClass=" + superClass); +// throw new RuntimeException("Missing type parameter."); +// } + ParameterizedType parameterized = (ParameterizedType) superClass; + return $Gson$Types.canonicalize(parameterized.getActualTypeArguments()[0]); + } +} diff --git a/base/src/main/java/com/xuqm/base/datasource/DataSourceFactory.java b/base/src/main/java/com/xuqm/base/datasource/DataSourceFactory.java new file mode 100644 index 0000000..815ba7b --- /dev/null +++ b/base/src/main/java/com/xuqm/base/datasource/DataSourceFactory.java @@ -0,0 +1,23 @@ +package com.xuqm.base.datasource; + +import androidx.annotation.NonNull; +import androidx.lifecycle.MutableLiveData; +import androidx.paging.DataSource; + +public class DataSourceFactory extends DataSource.Factory { + private PagedDataLoader dataLoader; + + public DataSourceFactory(PagedDataLoader dataLoader) { + this.dataLoader = dataLoader; + } + + public MutableLiveData> sourceLiveData = new MutableLiveData<>(); + + @NonNull + @Override + public DataSource create() { + PagedDataSource dataSource = new PagedDataSource<>(dataLoader); + sourceLiveData.postValue(dataSource); + return dataSource; + } +} diff --git a/base/src/main/java/com/xuqm/base/datasource/PagedDataLoader.java b/base/src/main/java/com/xuqm/base/datasource/PagedDataLoader.java new file mode 100644 index 0000000..fdabc1a --- /dev/null +++ b/base/src/main/java/com/xuqm/base/datasource/PagedDataLoader.java @@ -0,0 +1,13 @@ +package com.xuqm.base.datasource; + +import androidx.paging.PageKeyedDataSource; + +public interface PagedDataLoader { + void loadInitial(PageKeyedDataSource.LoadInitialParams params, PageKeyedDataSource.LoadInitialCallback callback); + + void loadAfter(PageKeyedDataSource.LoadParams params, PageKeyedDataSource.LoadCallback callback); + + void refresh(); + + void loadMore(); +} diff --git a/base/src/main/java/com/xuqm/base/datasource/PagedDataSource.java b/base/src/main/java/com/xuqm/base/datasource/PagedDataSource.java new file mode 100644 index 0000000..d0143a5 --- /dev/null +++ b/base/src/main/java/com/xuqm/base/datasource/PagedDataSource.java @@ -0,0 +1,26 @@ +package com.xuqm.base.datasource; + +import androidx.annotation.NonNull; +import androidx.paging.PageKeyedDataSource; + +public class PagedDataSource extends PageKeyedDataSource { + private PagedDataLoader dataLoader; + + public PagedDataSource(PagedDataLoader dataLoader) { + this.dataLoader = dataLoader; + } + + @Override + public void loadInitial(@NonNull LoadInitialParams params, @NonNull LoadInitialCallback callback) { + this.dataLoader.loadInitial(params, callback); + } + + @Override + public void loadBefore(@NonNull LoadParams params, @NonNull LoadCallback callback) { + } + + @Override + public void loadAfter(@NonNull LoadParams params, @NonNull LoadCallback callback) { + this.dataLoader.loadAfter(params, callback); + } +} diff --git a/base/src/main/java/com/xuqm/base/di/component/AppComponent.java b/base/src/main/java/com/xuqm/base/di/component/AppComponent.java new file mode 100644 index 0000000..9446392 --- /dev/null +++ b/base/src/main/java/com/xuqm/base/di/component/AppComponent.java @@ -0,0 +1,28 @@ +package com.xuqm.base.di.component; + +import com.franmontiel.persistentcookiejar.PersistentCookieJar; +import com.xuqm.base.di.module.NetworkModule; + +import java.util.List; + +import javax.inject.Singleton; + +import dagger.Component; +import okhttp3.Cookie; +import okhttp3.OkHttpClient; +import retrofit2.Retrofit; + +/** + * 可以获取到Retrofit、OkHttpClient、PersistentCookieJar、cookies + */ +@Singleton +@Component(modules = NetworkModule.class) +public interface AppComponent { + Retrofit retrofit(); + + OkHttpClient okHttpClient(); + + PersistentCookieJar persistentCookieJar(); + + List cookies(); +} diff --git a/base/src/main/java/com/xuqm/base/di/interceptor/HttpLogger.java b/base/src/main/java/com/xuqm/base/di/interceptor/HttpLogger.java new file mode 100644 index 0000000..8a7a109 --- /dev/null +++ b/base/src/main/java/com/xuqm/base/di/interceptor/HttpLogger.java @@ -0,0 +1,28 @@ +package com.xuqm.base.di.interceptor; + +import com.xuqm.base.common.LogHelper; +import com.xuqm.base.common.ToolsHelper; + +import okhttp3.logging.HttpLoggingInterceptor; + +public class HttpLogger implements HttpLoggingInterceptor.Logger { + private StringBuilder mMessage = new StringBuilder(); + + @Override + public void log(String message) { + // 请求或者响应开始 + if (message.startsWith("--> POST")) { + mMessage.setLength(0); + } + // 以{}或者[]形式的说明是响应结果的json数据,需要进行格式化 + if ((message.startsWith("{") && message.endsWith("}")) + || (message.startsWith("[") && message.endsWith("]"))) { + message = ToolsHelper.formatJson(ToolsHelper.decodeUnicode(message)); + } + mMessage.append(message.concat("\n")); + // 响应结束,打印整条日志 + if (message.startsWith("<-- END HTTP")) { + LogHelper.d("___http",mMessage.toString()); + } + } +} \ No newline at end of file diff --git a/base/src/main/java/com/xuqm/base/di/interceptor/LoggingInterceptor.java b/base/src/main/java/com/xuqm/base/di/interceptor/LoggingInterceptor.java new file mode 100644 index 0000000..f515d9b --- /dev/null +++ b/base/src/main/java/com/xuqm/base/di/interceptor/LoggingInterceptor.java @@ -0,0 +1,57 @@ +package com.xuqm.base.di.interceptor; + + +import com.xuqm.base.common.LogHelper; + +import java.io.IOException; +import java.nio.charset.Charset; + +import okhttp3.Interceptor; +import okhttp3.MediaType; +import okhttp3.Request; +import okhttp3.Response; +import okhttp3.ResponseBody; +import okio.Buffer; + +import static okhttp3.internal.Util.UTF_8; + +public class LoggingInterceptor implements Interceptor { + String TAG = "_____Http"; + + @Override + public Response intercept(Chain chain) throws IOException { + Request request = chain.request(); + long startTime = System.currentTimeMillis(); + Response response = chain.proceed(chain.request()); + long endTime = System.currentTimeMillis(); + long duration = endTime - startTime; + ResponseBody responseBody = response.body(); + if (responseBody == null) { + return response; + } + okhttp3.MediaType mediaType = responseBody.contentType(); + String content = response.body().string(); + LogHelper.e(TAG, request.toString()); + LogHelper.e(TAG, response.code() + " : " + response.message()); + String method = request.method(); + if ("POST".equals(method)) { + Buffer buffer = new Buffer(); + try { + request.body().writeTo(buffer); + Charset charset = Charset.forName("UTF-8"); + MediaType contentType = request.body().contentType(); + if (contentType != null) { + charset = contentType.charset(UTF_8); + } + String params = buffer.readString(charset); + LogHelper.e(TAG, params); + } catch (IOException e) { + e.printStackTrace(); + } + } + LogHelper.json(TAG, content); + LogHelper.e(TAG, "耗时: " + duration + "毫秒"); + return response.newBuilder().body(okhttp3.ResponseBody.create(mediaType, content)).build(); + + } +} \ No newline at end of file diff --git a/base/src/main/java/com/xuqm/base/di/manager/HttpManager.java b/base/src/main/java/com/xuqm/base/di/manager/HttpManager.java new file mode 100644 index 0000000..9f18a29 --- /dev/null +++ b/base/src/main/java/com/xuqm/base/di/manager/HttpManager.java @@ -0,0 +1,82 @@ +package com.xuqm.base.di.manager; + +import com.xuqm.base.App; +import com.xuqm.base.di.component.AppComponent; +import com.xuqm.base.di.component.DaggerAppComponent; +import com.xuqm.base.di.module.NetworkModule; + +import java.util.HashMap; +import java.util.Map; + +import okhttp3.Interceptor; + +/** + * 网络访问的管理类, + */ +public class HttpManager { + + private static Map apis = new HashMap<>(); + private static Map appComponentMap = new HashMap<>(); + + /** + * 使用默认的appComponent和给定的service获取一个service实例 + * appComponent 在{@link App #appComponent}定义 + * service 可以参照retrofit的使用方法 + *

+ * appComponent {@link #getAppComponent(String)} + * + * @param service service + * @param service实例class类型 + * @return service实例 + */ + public static T getApi(final Class service) { + return getApi(App.getInstance().appComponent, service); + } + + /** + * 根据给定的appComponent和service获取一个service实例 + * appComponent可以使用{@link #getAppComponent(String)} 方法获得 + * service 可以参照retrofit的使用方法 + * + * @param appComponent {@link #getAppComponent(String)} + * @param service service + * @param service实例class类型 + * @return service实例 + */ + public static T getApi(AppComponent appComponent, final Class service) { + String key = appComponent.hashCode() + service.getCanonicalName(); + if (!apis.containsKey(key)) + synchronized (HttpManager.class) { + if (!apis.containsKey(key)) + apis.put(key, appComponent.retrofit().create(service)); + } + + return (T) apis.get(key); + } + + /** + * 根据指定的baseUrl 获取一个{@link AppComponent} 用来做后续事件 + * + * @param baseUrl 换地地址 例如 + * @return AppComponent + */ +// public static AppComponent getAppComponent(String baseUrl) { +// return getAppComponent(baseUrl, null); +// } + + /** + * 根据指定的baseUrl 获取一个{@link AppComponent} 用来做后续事件 + * + * @param baseUrl 换地地址 + * @param interceptor 自定义拦截器 + * @return AppComponent + */ + public static AppComponent getAppComponent(String baseUrl, Interceptor... interceptor) { + if (!appComponentMap.containsKey(baseUrl)) + synchronized (HttpManager.class) { + if (!appComponentMap.containsKey(baseUrl)) + appComponentMap.put(baseUrl, DaggerAppComponent.builder().networkModule(new NetworkModule(baseUrl, interceptor)).build()); + } + return appComponentMap.get(baseUrl); + } +} diff --git a/base/src/main/java/com/xuqm/base/di/module/NetworkModule.java b/base/src/main/java/com/xuqm/base/di/module/NetworkModule.java new file mode 100644 index 0000000..543bdb5 --- /dev/null +++ b/base/src/main/java/com/xuqm/base/di/module/NetworkModule.java @@ -0,0 +1,97 @@ +package com.xuqm.base.di.module; + +import com.franmontiel.persistentcookiejar.PersistentCookieJar; +import com.franmontiel.persistentcookiejar.cache.SetCookieCache; +import com.franmontiel.persistentcookiejar.persistence.SharedPrefsCookiePersistor; +import com.xuqm.base.App; +import com.xuqm.base.di.interceptor.HttpLogger; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.concurrent.TimeUnit; + +import javax.inject.Singleton; + +import dagger.Module; +import dagger.Provides; +import okhttp3.Cookie; +import okhttp3.Interceptor; +import okhttp3.OkHttpClient; +import okhttp3.logging.HttpLoggingInterceptor; +import retrofit2.Retrofit; +import retrofit2.adapter.rxjava2.RxJava2CallAdapterFactory; +import retrofit2.converter.gson.GsonConverterFactory; + +@Module +public class NetworkModule { + private String BaseUrl = "https://xuqinmin.com/"; + private final List interceptor = new ArrayList<>(); + + public NetworkModule() { + } + + public NetworkModule(String baseUrl, Interceptor... interceptor) { + BaseUrl = baseUrl; + this.interceptor.clear(); + this.interceptor.addAll(Arrays.asList(interceptor)); + } + + @Provides + @Singleton + Retrofit provideRetrofit(OkHttpClient okHttpClient) { + + return new Retrofit.Builder() + .baseUrl(BaseUrl) + .client(okHttpClient) + .addConverterFactory(GsonConverterFactory.create()) + .addCallAdapterFactory(RxJava2CallAdapterFactory.create()) + .build(); + } + + @Provides + @Singleton + OkHttpClient provideOkHttpClient(HttpLoggingInterceptor httpLoggingInterceptor, PersistentCookieJar persistentCookieJar) { + + OkHttpClient.Builder builder = new OkHttpClient.Builder() + .connectTimeout(30, TimeUnit.SECONDS) + .pingInterval(5, TimeUnit.SECONDS) + .readTimeout(60, TimeUnit.SECONDS) + .writeTimeout(60, TimeUnit.SECONDS); +// builder.addNetworkInterceptor(httpLoggingInterceptor); + if (0 != interceptor.size()) { + for (Interceptor interceptor1 : this.interceptor) { + builder.addInterceptor(interceptor1); + } + } + + return builder.cookieJar(persistentCookieJar) + .build(); + } + + @Provides + @Singleton + HttpLoggingInterceptor provideHttpLoggingInterceptor() { + return new HttpLoggingInterceptor(new HttpLogger()).setLevel(HttpLoggingInterceptor.Level.BASIC); + + } + + @Provides + @Singleton + PersistentCookieJar providePersistentCookieJar(SharedPrefsCookiePersistor sharedPrefsCookiePersistor) { + return new PersistentCookieJar(new SetCookieCache(), sharedPrefsCookiePersistor); + } + + @Provides + @Singleton + SharedPrefsCookiePersistor provideSharedPrefsCookiePersistor() { + return new SharedPrefsCookiePersistor(App.getInstance()); + } + + @Provides + @Singleton + List provideCookies(SharedPrefsCookiePersistor sharedPrefsCookiePersistor) { + return sharedPrefsCookiePersistor.loadAll(); + } + +} diff --git a/base/src/main/java/com/xuqm/base/dialog/AlertDialogFragment.kt b/base/src/main/java/com/xuqm/base/dialog/AlertDialogFragment.kt new file mode 100644 index 0000000..5aaba1b --- /dev/null +++ b/base/src/main/java/com/xuqm/base/dialog/AlertDialogFragment.kt @@ -0,0 +1,83 @@ +package com.xuqm.base.dialog + +import android.app.Dialog +import android.content.Context +import android.os.Bundle +import androidx.appcompat.app.AlertDialog +import androidx.fragment.app.DialogFragment + +class AlertDialogFragment : DialogFragment() { + companion object { + fun newInstance( + title: String, + message: String, + confirm: String, + cancel: String + ): AlertDialogFragment { + val args = Bundle() + args.putString("title", title) + args.putString("message", message) + args.putString("confirm", confirm) + args.putString("cancel", cancel) + val fragment = AlertDialogFragment() + fragment.arguments = args + return fragment + } + } + + private var title: String? = null + private var message: String? = null + private var confirm: String? = null + private var cancel: String? = null + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + title = arguments?.getString("title") + message = arguments?.getString("message") + confirm = arguments?.getString("confirm") + cancel = arguments?.getString("cancel") + } + + + private lateinit var listener: NoticeDialogListener + + interface NoticeDialogListener { + fun onDialogPositiveClick(dialog: DialogFragment) + fun onDialogNegativeClick(dialog: DialogFragment) + } + + override fun onAttach(context: Context) { + super.onAttach(context) + try { + listener = context as NoticeDialogListener + } catch (e: ClassCastException) { + throw ClassCastException( + (context.toString() + + " must implement NoticeDialogListener") + ) + } + } + + override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { + return activity?.let { + val builder = AlertDialog.Builder(it) + title?.let { it1 -> builder.setTitle(it1) } + message?.let { it1 -> builder.setMessage(it1) } + confirm?.let { it1 -> + builder.setPositiveButton( + it1 + ) { _, _ -> + listener.onDialogPositiveClick(this) + } + } + cancel?.let { it1 -> + builder.setNegativeButton( + it1 + ) { _, _ -> + listener.onDialogNegativeClick(this) + } + } + builder.create() + } ?: throw IllegalStateException("Activity cannot be null") + } + +} \ No newline at end of file diff --git a/base/src/main/java/com/xuqm/base/dialog/loading/ColorfulRingProgressView.java b/base/src/main/java/com/xuqm/base/dialog/loading/ColorfulRingProgressView.java new file mode 100644 index 0000000..e03189b --- /dev/null +++ b/base/src/main/java/com/xuqm/base/dialog/loading/ColorfulRingProgressView.java @@ -0,0 +1,164 @@ +package com.xuqm.base.dialog.loading; + +import android.content.Context; +import android.content.res.TypedArray; +import android.graphics.Canvas; +import android.graphics.LinearGradient; +import android.graphics.Paint; +import android.graphics.RectF; +import android.graphics.Shader; +import android.util.AttributeSet; +import android.view.View; + +import com.xuqm.base.R; + + +/** + * Created by qiqi on 15/11/3. + */ +public class ColorfulRingProgressView extends View { + + + private float mPercent = 75; + private float mStrokeWidth; + private int mBgColor = 0xffe1e1e1; + private float mStartAngle = 0; + private int mFgColorStart = 0xffffe400; + private int mFgColorEnd = 0xffff4800; + + private LinearGradient mShader; + private Context mContext; + private RectF mOval; + private Paint mPaint; + + + public ColorfulRingProgressView(Context context, AttributeSet attrs) { + super(context, attrs); + this.mContext = context; + + TypedArray a = context.getTheme().obtainStyledAttributes(attrs, + R.styleable.ColorfulRingProgressView, + 0, 0); + + try { + mBgColor = a.getColor(R.styleable.ColorfulRingProgressView_bgColor, 0xffe1e1e1); + mFgColorEnd = a.getColor(R.styleable.ColorfulRingProgressView_fgColorEnd, 0xffff4800); + + mFgColorStart = a.getColor(R.styleable.ColorfulRingProgressView_fgColorStart, 0xffffe400); + mPercent = a.getFloat(R.styleable.ColorfulRingProgressView_percent, 75); + mStartAngle = a.getFloat(R.styleable.ColorfulRingProgressView_startAngle, 0) + 270; + mStrokeWidth = a.getDimensionPixelSize(R.styleable.ColorfulRingProgressView_strokeWidths, dp2px(21)); + System.out.println("**** m" + mStrokeWidth); + } finally { + a.recycle(); + } + + init(); + } + + private void init() { + mPaint = new Paint(); + mPaint.setAntiAlias(true); + mPaint.setStyle(Paint.Style.STROKE); + mPaint.setStrokeWidth(mStrokeWidth); + mPaint.setStrokeCap(Paint.Cap.ROUND); + } + + private int dp2px(float dp) { + return (int) (mContext.getResources().getDisplayMetrics().density * dp + 0.5f); + } + + @Override + protected void onDraw(Canvas canvas) { + super.onDraw(canvas); + + mPaint.setShader(null); + mPaint.setColor(0xffFFE93C); + canvas.drawArc(mOval, 0, 360, false, mPaint); + + mPaint.setShader(mShader); + canvas.drawArc(mOval, mStartAngle, mPercent * 3.6f, false, mPaint); + } + + @Override + protected void onSizeChanged(int w, int h, int oldw, int oldh) { + super.onSizeChanged(w, h, oldw, oldh); + + updateOval(); + + mShader = new LinearGradient(mOval.left, mOval.top, + mOval.left, mOval.bottom, mFgColorStart, mFgColorEnd, Shader.TileMode.MIRROR); + } + + public float getPercent() { + return mPercent; + } + + public void setPercent(float mPercent) { + this.mPercent = mPercent; + refreshTheLayout(); + } + + public float getStrokeWidth() { + return mStrokeWidth; + } + + public void setStrokeWidth(float mStrokeWidth) { + this.mStrokeWidth = mStrokeWidth; + mPaint.setStrokeWidth(mStrokeWidth); + updateOval(); + refreshTheLayout(); + } + + private void updateOval() { + int xp = getPaddingLeft() + getPaddingRight(); + int yp = getPaddingBottom() + getPaddingTop(); + mOval = new RectF(getPaddingLeft() + mStrokeWidth, getPaddingTop() + mStrokeWidth, + getPaddingLeft() + (getWidth() - xp) - mStrokeWidth, + getPaddingTop() + (getHeight() - yp) - mStrokeWidth); + } + + public void setStrokeWidthDp(float dp) { + this.mStrokeWidth = dp2px(dp); + mPaint.setStrokeWidth(mStrokeWidth); + updateOval(); + refreshTheLayout(); + } + + public void refreshTheLayout() { + invalidate(); + requestLayout(); + } + + public int getFgColorStart() { + return mFgColorStart; + } + + public void setFgColorStart(int mFgColorStart) { + this.mFgColorStart = mFgColorStart; + mShader = new LinearGradient(mOval.left, mOval.top, + mOval.left, mOval.bottom, mFgColorStart, mFgColorEnd, Shader.TileMode.MIRROR); + refreshTheLayout(); + } + + public int getFgColorEnd() { + return mFgColorEnd; + } + + public void setFgColorEnd(int mFgColorEnd) { + this.mFgColorEnd = mFgColorEnd; + mShader = new LinearGradient(mOval.left, mOval.top, + mOval.left, mOval.bottom, mFgColorStart, mFgColorEnd, Shader.TileMode.MIRROR); + refreshTheLayout(); + } + + + public float getStartAngle() { + return mStartAngle; + } + + public void setStartAngle(float mStartAngle) { + this.mStartAngle = mStartAngle + 270; + refreshTheLayout(); + } +} diff --git a/base/src/main/java/com/xuqm/base/dialog/loading/LoadingDialog.java b/base/src/main/java/com/xuqm/base/dialog/loading/LoadingDialog.java new file mode 100644 index 0000000..8ee7c1f --- /dev/null +++ b/base/src/main/java/com/xuqm/base/dialog/loading/LoadingDialog.java @@ -0,0 +1,238 @@ +/** + * com.leadingsoft.leaderaide.activity + * + * @ClassName: LoadingDialog + * @Description: LoadingDialog等待页面 + * @author: macq macq@leadingsoft.cn + * @date: 2014-06-16 + */ +package com.xuqm.base.dialog.loading; + +import android.app.Dialog; +import android.content.Context; +import android.content.DialogInterface; +import android.content.DialogInterface.OnKeyListener; +import android.os.Handler; +import android.view.Gravity; +import android.view.KeyEvent; +import android.view.LayoutInflater; +import android.view.View; +import android.view.Window; +import android.view.WindowManager; +import android.widget.LinearLayout; +import android.widget.TextView; + +import com.xuqm.base.R; +import com.xuqm.base.common.AppManager; +import com.xuqm.base.common.LogHelper; +import com.xuqm.base.common.ToolsHelper; + + +public class LoadingDialog { + private static Dialog mDialog; + + public static void showDialog(String msg) { + showDialog(AppManager.getInstance().getActivity(), msg); + } + + public static void showDialog(Context context, String msg) { + if (isShowing()) { + return; + } + try { + + OnKeyListener keyListener = (dialog, keyCode, event) -> { + if (keyCode == KeyEvent.KEYCODE_BACK + && event.getAction() == KeyEvent.ACTION_DOWN) { + mDialog.dismiss(); + } + return false; + + }; + mDialog = new Dialog(context, R.style.dialog); + mDialog.setOnKeyListener(keyListener); + mDialog.setCancelable(false); + mDialog.show(); + mDialog.setContentView(R.layout.loading_process_dialog_icon); + TextView TvLoading = (TextView) mDialog + .findViewById(R.id.loading_process_dialog_text); + TvLoading.setText(msg); + if (ToolsHelper.isNull(msg)) { + TvLoading.setVisibility(View.GONE); + } + Window window = mDialog.getWindow(); + WindowManager.LayoutParams lp = window.getAttributes(); + lp.gravity = Gravity.CENTER; + lp.width = WindowManager.LayoutParams.WRAP_CONTENT;//宽高可设置具体大小 + lp.height = WindowManager.LayoutParams.WRAP_CONTENT; + mDialog.getWindow().setAttributes(lp); + } catch (Exception e) { + LogHelper.e(LoadingDialog.class.getSimpleName(), e); + } + } + + public static void showDialog(Context context, String msg, boolean isShowBackGround) { + OnKeyListener keyListener = new OnKeyListener() { + @Override + public boolean onKey(DialogInterface dialog, int keyCode, + KeyEvent event) { + if (keyCode == KeyEvent.KEYCODE_BACK + && event.getAction() == KeyEvent.ACTION_DOWN) { + mDialog.dismiss(); + } + return false; + + } + }; + mDialog = new Dialog(context, R.style.dialog); + mDialog.setOnKeyListener(keyListener); + mDialog.setCancelable(false); + mDialog.show(); + mDialog.setContentView(R.layout.loading_process_dialog_icon); + LinearLayout ll_loading_process_dialog = (LinearLayout) mDialog.findViewById(R.id.ll_loading_process_dialog); + // 清空背景 + if (!isShowBackGround) { + ll_loading_process_dialog.setBackgroundResource(0); + } + TextView TvLoading = (TextView) mDialog.findViewById(R.id.loading_process_dialog_text); + TvLoading.setText(msg); + if (ToolsHelper.isNull(msg)) { + TvLoading.setVisibility(View.GONE); + } + Window window = mDialog.getWindow(); + WindowManager.LayoutParams lp = window.getAttributes(); + lp.gravity = Gravity.CENTER; + lp.width = WindowManager.LayoutParams.WRAP_CONTENT;//宽高可设置具体大小 + lp.height = WindowManager.LayoutParams.WRAP_CONTENT; + mDialog.getWindow().setAttributes(lp); + } + + public static void updataTV(String text) { + if (null == mDialog) + return; + TextView TvLoading = (TextView) mDialog.findViewById(R.id.loading_process_dialog_text); + TvLoading.setText(text); + } + + public static void dismissDialog() { + if (mDialog != null) { + if (mDialog.isShowing()) { + try { + mDialog.dismiss(); + } catch (Exception e) { + // TODO: handle exception + } + } + } + } + + public static boolean isShowing() { + if (mDialog != null) { + return mDialog.isShowing(); + } + return false; + } + + + /** + * 获取进度条的Dialog + */ + public static Dialog getCircleProgressDialog(Context context) { + return new Dialog(context, R.style.dialog); + } + + /** + * 获取进度条的VIEW + */ + public static View getCircleProgressView(Context context) { + LayoutInflater inflater = LayoutInflater.from(context); + return inflater.inflate(R.layout.loading_circle_process_dialog_icon, null); + } + + /** + * 显示带进度条的dialog + */ + public static void showCircleProgressDialog(Context context, Dialog dialog, View view) { + OnKeyListener keyListener = new OnKeyListener() { + @Override + public boolean onKey(DialogInterface dialog, int keyCode, + KeyEvent event) { + if (keyCode == KeyEvent.KEYCODE_BACK + && event.getAction() == KeyEvent.ACTION_DOWN) { + dialog.dismiss(); + } + return false; + + } + }; + try { + //dialog = new AlertDialog.Builder(context).create(); + dialog.setOnKeyListener(keyListener); + dialog.setCancelable(false); + dialog.show(); + dialog.setContentView(view); + } catch (Exception ex) { + LogHelper.e("创建圆形进度条", ex); + } + } + + /** + * 显示带进度条的dialog + */ + public static void updateCircleProgressDialog(int percent) { + if (null== mView)return; + TextView tvPercent = (TextView) mView.findViewById(R.id.tvPercent); + ColorfulRingProgressView isDownload = (ColorfulRingProgressView) mView.findViewById(R.id.crpv); + isDownload.setPercent(percent); + tvPercent.setText("" + percent); + } + + /********************************* APK下载圆形进度条 ***********************************************/ + + /** + * 获取进度条的VIEW + */ + public static View getProgressViewByTextView(Context context) { + LayoutInflater inflater = LayoutInflater.from(context); + View view = inflater.inflate(R.layout.loading_circle_process_dialog_icon_by_textview, null); + return view; + } + + private static View mView; + /** + * 显示带进度条的dialog + */ + public static void showCircleProgressDialog(final Context context, final Handler handler, String msg) { + + mDialog=getCircleProgressDialog(context); + mView=getProgressViewByTextView(context); + + OnKeyListener keyListener = (dialog, keyCode, event) -> { + if (keyCode == KeyEvent.KEYCODE_BACK + && event.getAction() == KeyEvent.ACTION_DOWN) { + handler.obtainMessage(9999).sendToTarget(); + } + return false; + }; + try { + //dialog = new AlertDialog.Builder(context).create(); + mDialog.setOnKeyListener(keyListener); + mDialog.setCancelable(false); + mDialog.show(); + + TextView textView = (TextView) mView.findViewById(R.id.tip_msg); + textView.setText(msg); + TextView tvPercent = (TextView) mView.findViewById(R.id.tvPercent); + tvPercent.setText("0"); + mDialog.setContentView(mView); + Window window = mDialog.getWindow(); + WindowManager.LayoutParams lp = window.getAttributes(); + lp.gravity = Gravity.CENTER; + lp.width = WindowManager.LayoutParams.WRAP_CONTENT;//宽高可设置具体大小 + lp.height = WindowManager.LayoutParams.WRAP_CONTENT; + mDialog.getWindow().setAttributes(lp); + } catch (Exception ex) { + LogHelper.e("创建圆形进度条", ex); + } + } +} diff --git a/base/src/main/java/com/xuqm/base/extensions/CommonExt.kt b/base/src/main/java/com/xuqm/base/extensions/CommonExt.kt new file mode 100644 index 0000000..f265b0a --- /dev/null +++ b/base/src/main/java/com/xuqm/base/extensions/CommonExt.kt @@ -0,0 +1,232 @@ +package com.xuqm.base.extensions + +import android.app.Activity +import android.content.Context +import android.view.inputmethod.InputMethodManager +import androidx.annotation.NonNull +import androidx.appcompat.app.AlertDialog +import androidx.fragment.app.Fragment +import com.livinglifetechway.quickpermissions_kotlin.runWithPermissions +import com.livinglifetechway.quickpermissions_kotlin.util.QuickPermissionsOptions +import com.xuqm.base.BuildConfig +import com.xuqm.base.common.LogHelper +import com.xuqm.base.common.ToolsHelper +import kotlin.experimental.and +import kotlin.properties.ReadWriteProperty +import kotlin.reflect.KProperty + + +private class NotNullSingleValue : ReadWriteProperty { + + private var value: T? = null + + override fun getValue(thisRef: Any?, property: KProperty<*>): T { + return value ?: throw IllegalStateException("not initialized") + } + + override fun setValue(thisRef: Any?, property: KProperty<*>, value: T) { + if (this.value == null) { + this.value = value + } else { + throw IllegalStateException("already initialized") + } + } + +} + +/** + * 不为空且唯一 + */ +fun notNullSingleValue(): ReadWriteProperty = NotNullSingleValue() + + +/** + * 打印log + */ +//fun Any.log(message: CharSequence) { +// KLog.d(this.javaClass.simpleName, message) +//} + +fun Any.log(message: Any) { + LogHelper.d(this.javaClass.simpleName, message) +} + +fun Any.loge(message: Any) { + LogHelper.e("=====>" + this.javaClass.simpleName, message) +} + +fun Any.log() { + LogHelper.d("=====>" + this.javaClass.simpleName, this) +} + +fun Any.loge() { + LogHelper.e("=====>" + this.javaClass.simpleName, this) +} + +fun Any.showMessage(content: CharSequence) { + ToolsHelper.showMessage(content) +} + +fun Any.showMessage() { + ToolsHelper.showMessage(this.toString()) +} + +fun ByteArray.toHexString(): String { + val sb = StringBuffer() + for (i in this.indices) { + val hex = Integer.toHexString((this[i] and 0xFF.toByte()).toInt()) + if (hex.length < 2) { + sb.append(0) + } + sb.append(hex) + } + return sb.toString() +} + + +/** + * 弹出窗口 + * @param title 标题 + * @param message 提示信息 + * @param confirm 点击确认按钮 + * @param cancel 点击取消按钮的事件 + */ +fun Activity.showDialog(title: String, message: String, confirm: () -> Unit, cancel: () -> Unit) { + AlertDialog.Builder(this).setTitle(title) + .setMessage(message) + .setPositiveButton( + "Confirm" + ) { _, _ -> + confirm() + } + .setNegativeButton( + "Cancel" + ) { _, _ -> + cancel() + }.create().show() +} + +/** + * 弹出窗口---只有一个确认按钮 + * @param title 标题 + * @param message 提示信息 + * @param confirm 点击确认按钮 + */ +fun Activity.showDialog(title: String, message: String, confirm: () -> Unit) { + AlertDialog.Builder(this).setTitle(title) + .setMessage(message) + .setPositiveButton( + "Confirm" + ) { _, _ -> + confirm() + }.create().show() +} + +/** + * 权限检测--申请 + * @param rationaleMethod 权限被拒绝时候的回调,提供重新申请,打开设置界面等方法 + * @param permanentDeniedMethod 拒绝权限并且选中了不在提示选项的回调,可以指导用户打开设置页面授予权限 + */ +fun Context?.runWithPermission( + vararg permissions: String, + callback: () -> Unit +): Any? = this.runWithPermissions( + *permissions +) { callback() } + + +fun Context?.runWithPermission( + vararg permissions: String, + rationaleMethod: ((com.livinglifetechway.quickpermissions_kotlin.util.QuickPermissionsRequest) -> Unit), + permanentDeniedMethod: ((com.livinglifetechway.quickpermissions_kotlin.util.QuickPermissionsRequest) -> Unit), + callback: () -> Unit +): Any? { + + val quickPermissionsOption = QuickPermissionsOptions( + rationaleMethod = rationaleMethod, + permanentDeniedMethod = permanentDeniedMethod + ) + + return this.runWithPermissions( + *permissions, options = quickPermissionsOption + ) { callback() } +} + +/* +隐藏软键盘 + */ +fun Activity.hideSoftInput() { + val imm = getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager + imm.hideSoftInputFromWindow(window.decorView.windowToken, 0) +} + +fun Fragment.hideSoftInput() { + activity?.hideSoftInput() +} + +fun Context.putInt(key: String, value: Int) { + val sharedPref = + getSharedPreferences(BuildConfig.APP_ID, Context.MODE_PRIVATE) ?: return + with(sharedPref.edit()) { + putInt(key, value) + apply() + } +} + +fun Context.getIntForPreferences(key: String): Int { + val sharedPref = + getSharedPreferences(BuildConfig.APP_ID, Context.MODE_PRIVATE) + return sharedPref?.getInt(key, -1) ?: -1 +} + +fun Context.getIntForPreferences(key: String, @NonNull defValue: Int): Int { + val sharedPref = + getSharedPreferences(BuildConfig.APP_ID, Context.MODE_PRIVATE) + return sharedPref?.getInt(key, defValue) ?: defValue +} + +fun Context.putLong(key: String, value: Long) { + val sharedPref = + getSharedPreferences(BuildConfig.APP_ID, Context.MODE_PRIVATE) ?: return + with(sharedPref.edit()) { + putLong(key, value) + apply() + } +} + +fun Context.getLongForPreferences(key: String): Long { + val sharedPref = + getSharedPreferences(BuildConfig.APP_ID, Context.MODE_PRIVATE) + return sharedPref?.getLong(key, -1) ?: -1 +} + +fun Context.getLongForPreferences(key: String, @NonNull defValue: Long): Long { + val sharedPref = + getSharedPreferences(BuildConfig.APP_ID, Context.MODE_PRIVATE) + return sharedPref?.getLong(key, defValue) ?: defValue +} + +fun Context.putString(key: String, value: String) { + val sharedPref = + getSharedPreferences(BuildConfig.APP_ID, Context.MODE_PRIVATE) ?: return + with(sharedPref.edit()) { + putString(key, value) + apply() + } +} + +fun Context.getStringForPreferences(key: String): String { + val sharedPref = + getSharedPreferences(BuildConfig.APP_ID, Context.MODE_PRIVATE) + return sharedPref?.getString(key, "") ?: "" +} + +fun Context.getStringForPreferences(key: String, @NonNull defValue: String): String { + val sharedPref = + getSharedPreferences(BuildConfig.APP_ID, Context.MODE_PRIVATE) + return sharedPref?.getString(key, defValue) ?: defValue +} + +fun Context.clearForPreferences() { + getSharedPreferences(BuildConfig.APP_ID, Context.MODE_PRIVATE).edit().clear().apply() +} \ No newline at end of file diff --git a/base/src/main/java/com/xuqm/base/extensions/FontExt.kt b/base/src/main/java/com/xuqm/base/extensions/FontExt.kt new file mode 100644 index 0000000..a1df6de --- /dev/null +++ b/base/src/main/java/com/xuqm/base/extensions/FontExt.kt @@ -0,0 +1,10 @@ +package com.xuqm.base.extensions + +import android.content.Context +import android.graphics.Typeface +import android.widget.TextView + + +fun TextView.setFont(context: Context, font: String) { + this.typeface = Typeface.createFromAsset(context.assets, "fonts/${font}.ttf") +} \ No newline at end of file diff --git a/base/src/main/java/com/xuqm/base/extensions/Fonts.kt b/base/src/main/java/com/xuqm/base/extensions/Fonts.kt new file mode 100644 index 0000000..ef0b2ad --- /dev/null +++ b/base/src/main/java/com/xuqm/base/extensions/Fonts.kt @@ -0,0 +1,25 @@ +package com.xuqm.base.extensions + +class Fonts { + companion object { + const val Black = "Montserrat-Black" + const val BlackItalic = "Montserrat-BlackItalic" + const val Bold = "Montserrat-Bold" + const val BoldItalic = "Montserrat-BoldItalic" + const val ExtraBold = "Montserrat-ExtraBold" + const val ExtraBoldItalic = "Montserrat-ExtraBoldItalic" + const val ExtraLight = "Montserrat-ExtraLight" + const val ExtraLightItalic = "Montserrat-ExtraLightItalic" + const val Italic = "Montserrat-Italic" + const val Light = "Montserrat-Light" + const val LightItalic = "Montserrat-LightItalic" + const val Medium = "Montserrat-Medium" + const val MediumItalic = "Montserrat-MediumItalic" + const val Regular = "Montserrat-Regular" + const val SemiBold = "Montserrat-SemiBold" + const val SemiBoldItalic = "Montserrat-SemiBoldItalic" + const val Thin = "Montserrat-Thin" + const val ThinItalic = "Montserrat-ThinItalic" + } + +} \ No newline at end of file diff --git a/base/src/main/java/com/xuqm/base/file/DownloadInterceptor.java b/base/src/main/java/com/xuqm/base/file/DownloadInterceptor.java new file mode 100644 index 0000000..f093519 --- /dev/null +++ b/base/src/main/java/com/xuqm/base/file/DownloadInterceptor.java @@ -0,0 +1,22 @@ +package com.xuqm.base.file; + +import java.io.IOException; + +import okhttp3.Interceptor; +import okhttp3.Response; + +public class DownloadInterceptor implements Interceptor { + + private final DownloadListener downloadListener; + + public DownloadInterceptor(DownloadListener downloadListener) { + this.downloadListener = downloadListener; + } + + @Override + public Response intercept(Chain chain) throws IOException { + Response response = chain.proceed(chain.request()); + return response.newBuilder().body( + new DownloadResponseBody(response.body(), downloadListener)).build(); + } +} diff --git a/base/src/main/java/com/xuqm/base/file/DownloadListener.java b/base/src/main/java/com/xuqm/base/file/DownloadListener.java new file mode 100644 index 0000000..abce364 --- /dev/null +++ b/base/src/main/java/com/xuqm/base/file/DownloadListener.java @@ -0,0 +1,11 @@ +package com.xuqm.base.file; + +public interface DownloadListener { + void onStartDownload(); + + void onProgress(int progress); + + void onFinishDownload(); + + void onFail(String errorInfo); +} diff --git a/base/src/main/java/com/xuqm/base/file/DownloadResponseBody.java b/base/src/main/java/com/xuqm/base/file/DownloadResponseBody.java new file mode 100644 index 0000000..39e7bfb --- /dev/null +++ b/base/src/main/java/com/xuqm/base/file/DownloadResponseBody.java @@ -0,0 +1,70 @@ +package com.xuqm.base.file; + +import android.util.Log; + +import com.xuqm.base.common.LogHelper; + +import java.io.IOException; + +import okhttp3.MediaType; +import okhttp3.ResponseBody; +import okio.Buffer; +import okio.BufferedSource; +import okio.ForwardingSource; +import okio.Okio; +import okio.Source; + +public class DownloadResponseBody extends ResponseBody { + + private final ResponseBody responseBody; + + private final DownloadListener downloadListener; + + // BufferedSource 是okio库中的输入流,这里就当作inputStream来使用。 + private BufferedSource bufferedSource; + + public DownloadResponseBody(ResponseBody responseBody, DownloadListener downloadListener) { + this.responseBody = responseBody; + this.downloadListener = downloadListener; + } + + @Override + public MediaType contentType() { + return responseBody.contentType(); + } + + @Override + public long contentLength() { + return responseBody.contentLength(); + } + + @Override + public BufferedSource source() { + if (bufferedSource == null) { + bufferedSource = Okio.buffer(source(responseBody.source())); + } + return bufferedSource; + } + + private Source source(Source source) { + return new ForwardingSource(source) { + long totalBytesRead = 0L; + + @Override + public long read(Buffer sink, long byteCount) throws IOException { + long bytesRead = super.read(sink, byteCount); + // read() returns the number of bytes read, or -1 if this source is exhausted. + totalBytesRead += bytesRead != -1 ? bytesRead : 0; + Log.e("download", "read: "+ (int) (totalBytesRead * 100 / responseBody.contentLength())); + if (null != downloadListener) { + if (bytesRead != -1) { + downloadListener.onProgress((int) (totalBytesRead * 100 / responseBody.contentLength())); + } + + } + return bytesRead; + } + }; + + } +} \ No newline at end of file diff --git a/base/src/main/java/com/xuqm/base/file/FileDownLoadObserver.java b/base/src/main/java/com/xuqm/base/file/FileDownLoadObserver.java new file mode 100644 index 0000000..0dcc460 --- /dev/null +++ b/base/src/main/java/com/xuqm/base/file/FileDownLoadObserver.java @@ -0,0 +1,80 @@ +package com.xuqm.base.file; + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; + +import io.reactivex.observers.DefaultObserver; +import okhttp3.ResponseBody; + +public abstract class FileDownLoadObserver extends DefaultObserver { + + @Override + public void onNext(T t) { + onDownLoadSuccess(t); + } + @Override + public void onError(Throwable e) { + onDownLoadFail(e); + } + //可以重写,具体可由子类实现 + @Override + public void onComplete() { + } + //下载成功的回调 + public abstract void onDownLoadSuccess(T t); + //下载失败回调 + public abstract void onDownLoadFail(Throwable throwable); + //下载进度监听 + public abstract void onProgress(int progress,long total); + + /** + * 将文件写入本地 + * @param responseBody 请求结果全体 + * @param destFileDir 目标文件夹 + * @param destFileName 目标文件名 + * @return 写入完成的文件 + * @throws IOException IO异常 + */ + public File saveFile(ResponseBody responseBody, String destFileDir, String destFileName) throws IOException { + InputStream is = null; + byte[] buf = new byte[2048]; + int len = 0; + FileOutputStream fos = null; + try { + is = responseBody.byteStream(); + final long total = responseBody.contentLength(); + long sum = 0; + + File dir = new File(destFileDir); + if (!dir.exists()) { + dir.mkdirs(); + } + File file = new File(dir, destFileName); + fos = new FileOutputStream(file); + while ((len = is.read(buf)) != -1) { + sum += len; + fos.write(buf, 0, len); + final long finalSum = sum; + //这里就是对进度的监听回调 + onProgress((int) (finalSum * 100 / total),total); + } + fos.flush(); + + return file; + + } finally { + try { + if (is != null) is.close(); + } catch (IOException e) { + e.printStackTrace(); + } + try { + if (fos != null) fos.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } +} \ No newline at end of file diff --git a/base/src/main/java/com/xuqm/base/file/FileDownloadAndUploadManager.java b/base/src/main/java/com/xuqm/base/file/FileDownloadAndUploadManager.java new file mode 100644 index 0000000..867e037 --- /dev/null +++ b/base/src/main/java/com/xuqm/base/file/FileDownloadAndUploadManager.java @@ -0,0 +1,178 @@ +package com.xuqm.base.file; + +import com.xuqm.base.common.LogHelper; +import com.xuqm.base.di.component.AppComponent; +import com.xuqm.base.di.manager.HttpManager; +import com.xuqm.base.repository.CommonService; + +import java.io.File; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.util.Map; + +import io.reactivex.android.schedulers.AndroidSchedulers; +import io.reactivex.annotations.NonNull; +import io.reactivex.disposables.CompositeDisposable; +import io.reactivex.disposables.Disposable; +import io.reactivex.schedulers.Schedulers; +import okhttp3.MediaType; +import okhttp3.RequestBody; +import okhttp3.ResponseBody; + +public class FileDownloadAndUploadManager { + private static FileDownloadAndUploadManager instance; + + public static FileDownloadAndUploadManager getInstance() { + if (null == instance) { + synchronized (FileDownloadAndUploadManager.class) { + if (null == instance) { + instance = new FileDownloadAndUploadManager(); + } + } + } + return instance; + } + + private final AppComponent appComponent; + protected CompositeDisposable compositeDisposable; + + private FileDownloadAndUploadManager() { + appComponent = HttpManager.getAppComponent("https://xuqinmin.com/"); + compositeDisposable = new CompositeDisposable(); + } + + public void download(@NonNull String url, final String filePath) { + LogHelper.e(url); + thisListener.onStartDownload(); + Disposable d = HttpManager.getApi(appComponent, CommonService.class) + .download(url) + .subscribeOn(Schedulers.io()) + .unsubscribeOn(Schedulers.io()) + .map(ResponseBody::byteStream) + .observeOn(Schedulers.computation()) + .doOnNext(inputStream -> writeFile(inputStream, filePath)) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(body -> { + thisListener.onFinishDownload(); + }, err -> { + LogHelper.e("=============>", err); + thisListener.onFail(err.getMessage()); + }); + compositeDisposable.add(d); + } + + public void cancel() { + compositeDisposable.dispose(); + compositeDisposable.clear(); + } + + public void download(@NonNull String url, final String destDir, final String fileName, final FileDownLoadObserver fileDownLoadObserver) { + HttpManager.getApi(appComponent, CommonService.class) + .download(url) + .subscribeOn(Schedulers.io()) + .observeOn(Schedulers.io()) + .observeOn(Schedulers.computation()) + .map(responseBody -> fileDownLoadObserver.saveFile(responseBody, destDir, fileName)) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(fileDownLoadObserver); + } + +// public void upload(@NonNull String url, @NonNull String filePath, final Map formDataPart) { +// upload(url, new File(filePath), formDataPart); +// } + + public void upload(@NonNull String url, @NonNull File file, final String contentType) { + + MediaType mediaType = MediaType.parse(contentType); + RequestBody body = + RequestBody.create(mediaType, file); + + Disposable d = HttpManager.getApi(appComponent, CommonService.class) + .upload(url, body) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(b -> { + LogHelper.e("=============>上传完成:::" + b); + if (null != listener) + listener.onFinishDownload(); + }, err -> { + LogHelper.e("=============>", err); + if (null != listener) + listener.onFail(err.getMessage()); + }); + compositeDisposable.add(d); + } + + /** + * 将输入流写入文件 + * + * @param inputString 文件流 + * @param filePath 文件地址 + */ + private void writeFile(InputStream inputString, String filePath) { + + File file = new File(filePath); + if (file.exists()) { + file.delete(); + } + + FileOutputStream fos = null; + try { + fos = new FileOutputStream(file); + + byte[] b = new byte[1024]; + + int len; + while ((len = inputString.read(b)) != -1) { + fos.write(b, 0, len); + } + inputString.close(); + fos.close(); + + } catch (FileNotFoundException e) { + thisListener.onFail("FileNotFoundException"); + } catch (IOException e) { + thisListener.onFail("IOException"); + } + + } + + private DownloadListener listener; + + private final DownloadListener thisListener = new DownloadListener() { + @Override + public void onStartDownload() { + if (null != listener) + listener.onStartDownload(); + LogHelper.e("=========开始下载"); + } + + @Override + public void onProgress(int progress) { + if (null != listener) + listener.onProgress(progress); + LogHelper.e("=========下载进度" + progress); + } + + @Override + public void onFinishDownload() { + + if (null != listener) + listener.onFinishDownload(); + LogHelper.e("=========下载完成"); + } + + @Override + public void onFail(String errorInfo) { + if (null != listener) + listener.onFail(errorInfo); + LogHelper.e("=========下载失败" + errorInfo); + } + }; + + public void setListener(DownloadListener listener) { + this.listener = listener; + } +} diff --git a/base/src/main/java/com/xuqm/base/model/HttpResult.java b/base/src/main/java/com/xuqm/base/model/HttpResult.java new file mode 100644 index 0000000..beca784 --- /dev/null +++ b/base/src/main/java/com/xuqm/base/model/HttpResult.java @@ -0,0 +1,48 @@ +package com.xuqm.base.model; + +import androidx.annotation.NonNull; + +/** + * 通用的HttpResult封装,app应该根据接口情况定制化配置 + * + * @param + */ +public class HttpResult { + private String status; + private String maxNumber; + private T data; + + public String getStatus() { + return status; + } + + public void setStatus(String status) { + this.status = status; + } + + public String getMaxNumber() { + return maxNumber; + } + + public void setMaxNumber(String maxNumber) { + this.maxNumber = maxNumber; + } + + public T getData() { + return data; + } + + public void setData(T data) { + this.data = data; + } + + @Override + @NonNull + public String toString() { + return "HttpResult{" + + "status='" + status + '\'' + + ", maxNumber='" + maxNumber + '\'' + + ", data=" + data + + '}'; + } +} diff --git a/base/src/main/java/com/xuqm/base/model/KeyValueData.java b/base/src/main/java/com/xuqm/base/model/KeyValueData.java new file mode 100644 index 0000000..3168f8c --- /dev/null +++ b/base/src/main/java/com/xuqm/base/model/KeyValueData.java @@ -0,0 +1,38 @@ +package com.xuqm.base.model; + +public class KeyValueData { + private K key; + private V value; + + public KeyValueData() { + } + + public KeyValueData(K key, V value) { + this.key = key; + this.value = value; + } + + public K getKey() { + return key; + } + + public void setKey(K key) { + this.key = key; + } + + public V getValue() { + return value; + } + + public void setValue(V value) { + this.value = value; + } + + @Override + public String toString() { + return "KeyValueData{" + + "key=" + key + + ", value=" + value + + '}'; + } +} diff --git a/base/src/main/java/com/xuqm/base/repository/CommonService.java b/base/src/main/java/com/xuqm/base/repository/CommonService.java new file mode 100644 index 0000000..f0858a9 --- /dev/null +++ b/base/src/main/java/com/xuqm/base/repository/CommonService.java @@ -0,0 +1,21 @@ +package com.xuqm.base.repository; + +import io.reactivex.Observable; +import okhttp3.RequestBody; +import okhttp3.ResponseBody; +import retrofit2.http.Body; +import retrofit2.http.GET; +import retrofit2.http.POST; +import retrofit2.http.PUT; +import retrofit2.http.Streaming; +import retrofit2.http.Url; + +public interface CommonService { + @Streaming + @GET + Observable download(@Url String url); + + @PUT + @Streaming + Observable upload(@Url String url, @Body RequestBody body); +} diff --git a/base/src/main/java/com/xuqm/base/ui/BaseActivity.java b/base/src/main/java/com/xuqm/base/ui/BaseActivity.java new file mode 100644 index 0000000..9addcc1 --- /dev/null +++ b/base/src/main/java/com/xuqm/base/ui/BaseActivity.java @@ -0,0 +1,382 @@ +package com.xuqm.base.ui; + +import android.app.Activity; +import android.content.Context; +import android.graphics.Typeface; +import android.os.Bundle; +import android.view.MotionEvent; +import android.view.View; +import android.view.WindowManager; +import android.view.inputmethod.InputMethodManager; +import android.widget.EditText; + +import androidx.annotation.ColorRes; +import androidx.annotation.DrawableRes; +import androidx.annotation.LayoutRes; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.annotation.StringRes; +import androidx.appcompat.app.AppCompatActivity; +import androidx.databinding.DataBindingUtil; +import androidx.databinding.ViewDataBinding; + +import com.gyf.immersionbar.BarHide; +import com.gyf.immersionbar.ImmersionBar; +import com.xuqm.base.R; +import com.xuqm.base.common.AppManager; +import com.xuqm.base.databinding.ActivityBaseBinding; +import com.xuqm.base.ui.callback.UiCallback; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +public abstract class BaseActivity extends AppCompatActivity implements UiCallback { + + protected String TAG = this.getClass().getSimpleName(); + protected Activity mContext; + private V binding; + + private ActivityBaseBinding baseBinding; + + @Override + protected void onCreate(@Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + AppManager.getInstance().pushActivity(this); + getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN); + mContext = this; + editText.clear(); + views.clear(); + if (getLayoutId() == 0) {//没有layout的时候,act自己写布局 + ImmersionBar.with(this) + .init(); + setContentView(); + } else if (showStatus() != -1) {//没有toolbar但是有状态栏的情况 + bindUi(getLayoutId()); + ImmersionBar.with(this) + .titleBar(binding.getRoot()) //指定标题栏view + .statusBarColor(showStatus()) + .autoStatusBarDarkModeEnable(true) + .init(); + } else if (transparentStatusBar()) {//透明状态栏,但是显示状态栏的内容 + bindUi(getLayoutId()); + ImmersionBar.with(this).transparentBar() + .titleBar(binding.getRoot().findViewWithTag("top_status")) + .statusBarDarkFont(true) +// .hideBar(BarHide.FLAG_HIDE_NAVIGATION_BAR) + .init(); + } else if (fullscreen()) {//全屏,什么都不显示 + bindUi(getLayoutId()); + ImmersionBar.with(this) + .fullScreen(true) + .statusBarDarkFont(true) +// .hideBar(BarHide.FLAG_HIDE_NAVIGATION_BAR) + .init(); + } else {//使用base提供的toolbar + baseBinding = DataBindingUtil.setContentView(mContext, R.layout.activity_base); + ImmersionBar.with(this) +// .hideBar(BarHide.FLAG_HIDE_NAVIGATION_BAR) + .statusBarColor(R.color.white) + .statusBarDarkFont(true) + .titleBar(baseBinding.baseToolbar) //指定标题栏view + .init(); + binding = DataBindingUtil.inflate(getLayoutInflater(), getLayoutId(), baseBinding.activityRootView, true); + getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR); + } + if (null != baseBinding) { + baseBinding.baseToolbar.backBtnPressed(this::backBtnPressed); + baseBinding.baseToolbar.getTitleView().setTypeface(Typeface.createFromAsset(this.getAssets(), "fonts/Montserrat-Bold.ttf")); + } + initView(savedInstanceState); + initData(); + lateInitView(); + } + + @NonNull + public V getBinding() { + return binding; + } + + public ActivityBaseBinding getBaseBinding() { + return baseBinding; + } + + /** + * 导航栏展示的内容 + * + * @param titleId 标题 + */ + public void setTitleText(@StringRes int titleId) { + setTitleText(getText(titleId)); + } + + /** + * 导航栏展示的内容 + * + * @param title 标题 + */ + public void setTitleText(CharSequence title) { + if (null == baseBinding) { + return; + } + baseBinding.baseToolbar.setTitle(title); + } + + /** + * 导航栏右上角按钮 + * + * @param title 标题 + */ + public void setConfirmText(CharSequence title, View.OnClickListener listener) { + if (null == baseBinding) { + return; + } + baseBinding.baseToolbar.getConfirmBtn().setVisibility(View.VISIBLE); + baseBinding.baseToolbar.getConfirmBtn().setText(title); + baseBinding.baseToolbar.getConfirmBtn().setOnClickListener(listener); + } + + /** + * 设置标题颜色 + * + * @param color 标题颜色 + */ + public void setTextColor(int color) { + if (null == baseBinding) { + return; + } + baseBinding.baseToolbar.setTextColor(color); + } + + /** + * 设置返回图标颜色 + * + * @param iconTintColor 返回图标颜色 + */ + public void setIconTintColor(int iconTintColor) { + if (null == baseBinding) { + return; + } + baseBinding.baseToolbar.setIconTintColor(iconTintColor); + } + + public void setIconDraw(@DrawableRes int resId) { + if (null == baseBinding) { + return; + } + baseBinding.baseToolbar.getBackBtn().setImageResource(resId); + } + + /** + * 是否展示返回按钮 + * + * @param showBack 是否展示返回按钮 + */ + public void showBack(boolean showBack) { + if (null == baseBinding) { + return; + } + baseBinding.baseToolbar.setShowBack(showBack); + } + + /** + * 是否显示导航栏下面的线 + * + * @param showLine 是否显示导航栏下面的线 + */ + public void showLine(boolean showLine) { + if (null == baseBinding) { + return; + } + baseBinding.baseToolbar.setShowLine(showLine); + } + + + public void backBtnPressed() { + finish(); + } + + + protected void bindUi(@LayoutRes int layoutResID) { + binding = DataBindingUtil.setContentView(mContext, layoutResID); + } + + /** + * 如果不提供layoutId{@link #getLayoutId()} 则可以重写这个方法自己布局 + */ + @Override + public void setContentView() { + + } + + @Override + public void initView(Bundle savedInstanceState) { + + } + + @Override + public void initData() { + + } + + /** + * 这个init方法,在initData之后执行,有一些view相关的设置,需要数据信息 + */ + public void lateInitView() { + + } + + /** + * 是否需要展示statusBar,默认为false,使用默认布局展示toolbar + * false的话,可以自定义toolbar + * + * @return statusBar 的颜色 + */ + @Override + @ColorRes + public int showStatus() { + return -1; + } + + /** + * 如果返回true,则状态栏变成透明状态,但是状态栏的文字还显示 + * 使用透明状态栏 布局必须指定一个 android:tag="top_status" + * 最好是第一个子元素指定,可以自动设置padding + * + * @return 是否需要设置状态栏为透明状态 + */ + @Override + public boolean transparentStatusBar() { + return false; + } + + /** + * 是不是黑色主题 + * + * @return 全屏展示 + */ + @Override + public boolean fullscreen() { + return false; + } + + @Override + protected void onDestroy() { + super.onDestroy(); + AppManager.getInstance().popActivity(this); + } + + + /** + * 点击空白处软键盘是否消失 + */ + protected boolean canTouch = true; + /** + * 指定控件,点击软键盘不消失,需要addView相关控件 + */ + protected boolean viewCanTouch = true; + /** + * editText注册-不在这里注册一下,软件盘消失时光标还会闪烁 + */ + private final List editText = new ArrayList<>(); + /** + * 指定控件,点击软键盘不消失 + */ + private final List views = new ArrayList<>(); + + /** + * EditText与软键盘的控制 + * 如果点击空白处(非EditText),关闭软键盘,隐藏光标 + * + * @param editText + */ + public void addEditText(EditText... editText) { + this.editText.addAll(Arrays.asList(editText)); + } + + /** + * 部分页面存在点击按钮,软键盘不取消的需求,把对应view添加到这里就好了 + * + * @param view + */ + public void addView(View view) { + this.views.add(view); + } + + @Override + public boolean dispatchTouchEvent(MotionEvent ev) { + + for (View v : views) { + int[] leftTop = {0, 0}; + //获取输入框当前的location位置 + v.getLocationInWindow(leftTop); + int left = leftTop[0]; + int top = leftTop[1]; + int bottom = top + v.getHeight(); + int right = left + v.getWidth(); + if ((ev.getX() > left && ev.getX() < right + && ev.getY() > top && ev.getY() < bottom + && v.getVisibility() == View.VISIBLE)) { + viewCanTouch = false; + } + } + + if (!canTouch || !viewCanTouch) { + viewCanTouch = true; + return super.dispatchTouchEvent(ev); + } + if (ev.getAction() == MotionEvent.ACTION_DOWN) { + View v = getCurrentFocus(); + if (isShouldHideInput(v, ev)) { + hideKeyboard(v); + } + return super.dispatchTouchEvent(ev); + } + // 必不可少,否则所有的组件都不会有TouchEvent了 + if (getWindow().superDispatchTouchEvent(ev)) { + return true; + } + return onTouchEvent(ev); + } + + /** + * 强制隐藏键盘 + * + * @param v + */ + public void hideKeyboard(View v) { + InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); + if (null == v || null == v.getWindowToken()) { + } else { + imm.hideSoftInputFromWindow(v.getWindowToken(), 0); + this.onHideKeyboard(); + for (EditText et : editText) { + et.clearFocus(); + } + } + } + + public void onHideKeyboard() { + } + + public boolean isShouldHideInput(View v, MotionEvent event) { + if (v != null && (v instanceof EditText)) { + int[] leftTop = {0, 0}; + //获取输入框当前的location位置 + v.getLocationInWindow(leftTop); + int left = leftTop[0]; + int top = leftTop[1]; + int bottom = top + v.getHeight(); + int right = left + v.getWidth(); + if ((event.getX() > left && event.getX() < right + && event.getY() > top && event.getY() < bottom)) { + // 点击的是输入框区域,保留点击EditText的事件 + return false; + } else { + return true; + } + } + return false; + } + +} diff --git a/base/src/main/java/com/xuqm/base/ui/BaseFragment.java b/base/src/main/java/com/xuqm/base/ui/BaseFragment.java new file mode 100644 index 0000000..3e43e7a --- /dev/null +++ b/base/src/main/java/com/xuqm/base/ui/BaseFragment.java @@ -0,0 +1,61 @@ +package com.xuqm.base.ui; + +import android.content.Context; +import android.os.Bundle; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.view.inputmethod.InputMethodManager; + +import androidx.annotation.LayoutRes; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.databinding.DataBindingUtil; +import androidx.databinding.ViewDataBinding; +import androidx.fragment.app.Fragment; + +import com.xuqm.base.common.ToolsHelper; + +public abstract class BaseFragment extends Fragment { + + private V binding; + protected Context mContext; + + @Nullable + @Override + public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { + binding = DataBindingUtil.inflate(getLayoutInflater(), getLayoutId(), container, false); + mContext = getActivity(); + return binding.getRoot(); + } + + + @Override + public void onActivityCreated(@Nullable Bundle savedInstanceState) { + super.onActivityCreated(savedInstanceState); + initView(); + initData(); + } + + @NonNull + protected V getBinding() { + return binding; + } + + @LayoutRes + protected abstract int getLayoutId(); + + protected void initView() { + } + + protected void initData() { + } + + /** + * 收起键盘 + */ + protected void hideSoftInput() { + InputMethodManager imm = (InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE); + imm.hideSoftInputFromWindow(getActivity().getWindow().getDecorView().getWindowToken(), 0); + } +} diff --git a/base/src/main/java/com/xuqm/base/ui/BaseListActivity.java b/base/src/main/java/com/xuqm/base/ui/BaseListActivity.java new file mode 100644 index 0000000..cd95f7b --- /dev/null +++ b/base/src/main/java/com/xuqm/base/ui/BaseListActivity.java @@ -0,0 +1,161 @@ +package com.xuqm.base.ui; + +import android.os.Bundle; +import android.view.View; + +import androidx.lifecycle.ViewModelProvider; +import androidx.paging.PagedList; +import androidx.recyclerview.widget.LinearLayoutManager; + +import com.xuqm.base.R; +import com.xuqm.base.adapter.BaseItem; +import com.xuqm.base.adapter.BasePagedAdapter; +import com.xuqm.base.common.RefreshResult; +import com.xuqm.base.common.ToolsHelper; +import com.xuqm.base.databinding.ActivityBaseListBinding; +import com.xuqm.base.view.enu.Status; +import com.xuqm.base.viewmodel.BaseListViewModel; +import com.xuqm.base.viewmodel.callback.AdapterObserverCallback; +import com.xuqm.base.viewmodel.callback.DataObserverCallback; + +import java.lang.reflect.ParameterizedType; + +/** + * 列表页面的activity继承这个,只需要指定一个adapter就可以展示数据了 + * 例子参考: + * MainActivity extends BaseListActivity + * + * User需要继承{@link BaseItem} + * MainViewModel 需要继承{@link BaseListViewModel} + * + * @param + * @param + */ +public abstract class BaseListActivity> + extends BaseActivity { + + private ParameterizedType parameterizedType = (ParameterizedType) getClass().getGenericSuperclass(); + private Class cal = (Class) parameterizedType.getActualTypeArguments()[1]; + private VM viewModel; + + private BasePagedAdapter adapter; + + @Override + public int getLayoutId() { + return R.layout.activity_base_list; + } + + /** + * 获取到viewModel,可以做其它事情,比如item的增删改查等 + * + * @return viewModel + */ + public VM getViewModel() { + return viewModel; + } + + @Override + public void initView(Bundle savedInstanceState) { + getBaseBinding().activityRootView.setBackgroundResource(R.color.bg_window); + viewModel = new ViewModelProvider(this).get(cal); + adapter = adapter(); + adapter.setItemClickListener(this::itemClicked); + adapter.setItemLongClickListener(this::itemLongClicked); + getBinding().baseRecyclerView.setAdapter(adapter); + getBinding().baseRecyclerView.setLayoutManager(new LinearLayoutManager(mContext)); + getBinding().baseRefreshLayout.setOnRefreshListener(() -> viewModel.invalidate()); + } + + @Override + public void initData() { + + /* + 数据更新更新事件的观察者 + */ + viewModel.observeDataObserver(this, new DataObserverCallback() { + @Override + public void data(PagedList data) { + adapter.submitList(data);//数据加载 + } + + @Override + public void refreshResult(RefreshResult refreshResult) { + refreshFinished(refreshResult);//刷新状态处理 + } + + @Override + public void loadMoreResult(RefreshResult refreshResult) { + loadMoreFinished(refreshResult);//加载更多的处理 + } + }); + //数据更新处理观察者 + viewModel.observeAdapterObserver(this, new AdapterObserverCallback() { + @Override + public void notifyItem(int position, Object payload) { + adapter.notifyItemChanged(position, payload); + } + + @Override + public void removeItem(int position) { + adapter.notifyItemRemoved(position); + } + }); + + } + + /** + * 如果需要对item的点击事件做处理,直接重写这个方法就可以了 + * + * @param view view + * @param item item + * @param position position + */ + public void itemClicked(View view, T item, int position) { + + } + + /** + * 如果需要对item的长按事件做处理,直接重写这个方法就可以了 + * + * @param view view + * @param item item + * @param position position + * @return true + */ + public boolean itemLongClicked(View view, T item, int position) { + return false; + } + + private void refreshFinished(RefreshResult result) { + getBinding().baseRefreshLayout.setRefreshing(false); + + if (result == RefreshResult.SUCCEED) + getBinding().baseEmptyView.setStatus(Status.DISMISS); + else if (result == RefreshResult.FAILED) + getBinding().baseEmptyView.setStatus(Status.LOAD_FAILED); + else if (result == RefreshResult.NO_DATA) + getBinding().baseEmptyView.setStatus(Status.NO_DATA); + else if (result == RefreshResult.NO_MORE) { + getBinding().baseEmptyView.setStatus(Status.DISMISS); + ToolsHelper.snack(getBinding().baseEmptyView, "All loads completed"); + } + } + + private void loadMoreFinished(RefreshResult result) { +// if (result == RefreshResult.SUCCEED) { +// } else if (result == RefreshResult.FAILED) { +// } else + if (result == RefreshResult.NO_MORE) { + ToolsHelper.snack(getBinding().baseEmptyView, "All loads completed"); + } + + } + + /** + * 需要指定一个adapter,item只有一种类型的使用{@link com.xuqm.base.adapter.CommonPagedAdapter} + * 需要指定一个adapter,item有多种类型的使用{@link com.xuqm.base.adapter.BasePagedAdapter} + * + * @return 自定义的adapter + */ + public abstract BasePagedAdapter adapter(); +} diff --git a/base/src/main/java/com/xuqm/base/ui/BaseListAppBarFragment.java b/base/src/main/java/com/xuqm/base/ui/BaseListAppBarFragment.java new file mode 100644 index 0000000..c2fb177 --- /dev/null +++ b/base/src/main/java/com/xuqm/base/ui/BaseListAppBarFragment.java @@ -0,0 +1,174 @@ +package com.xuqm.base.ui; + +import android.os.Bundle; +import android.view.View; + +import androidx.annotation.LayoutRes; +import androidx.annotation.Nullable; +import androidx.lifecycle.ViewModelProvider; +import androidx.paging.PagedList; +import androidx.recyclerview.widget.LinearLayoutManager; + +import com.google.android.material.appbar.AppBarLayout; +import com.xuqm.base.R; +import com.xuqm.base.adapter.BaseItem; +import com.xuqm.base.adapter.BasePagedAdapter; +import com.xuqm.base.common.RefreshResult; +import com.xuqm.base.common.ToolsHelper; +import com.xuqm.base.databinding.ActivityBaseListAppBarBinding; +import com.xuqm.base.view.enu.Status; +import com.xuqm.base.viewmodel.BaseListViewModel; +import com.xuqm.base.viewmodel.callback.AdapterObserverCallback; +import com.xuqm.base.viewmodel.callback.DataObserverCallback; + +import java.lang.reflect.ParameterizedType; + +public abstract class BaseListAppBarFragment> extends BaseFragment { + + private ParameterizedType parameterizedType = (ParameterizedType) getClass().getGenericSuperclass(); + private Class cal = (Class) parameterizedType.getActualTypeArguments()[1]; + private VM viewModel; + + private BasePagedAdapter adapter; + + @Override + public int getLayoutId() { + return R.layout.activity_base_list_app_bar; + } + + @LayoutRes + protected int getAppBarView() { + return 0; + } + + @Override + public void onActivityCreated(@Nullable Bundle savedInstanceState) { + if (0 != getAppBarView()) { + getLayoutInflater().inflate(getAppBarView(), getBinding().appBarLayout,true); + } + super.onActivityCreated(savedInstanceState); + } + + /** + * 获取到viewModel,可以做其它事情,比如item的增删改查等 + * + * @return viewModel + */ + public VM getViewModel() { + return viewModel; + } + + @Override + protected void initView() { + + viewModel = new ViewModelProvider(this).get(cal); + adapter = adapter(); + adapter.setItemClickListener(this::itemClicked); + adapter.setItemLongClickListener(this::itemLongClicked); + getBinding().baseRecyclerView.setAdapter(adapter); + getBinding().baseRecyclerView.setLayoutManager(new LinearLayoutManager(mContext)); + getBinding().baseRefreshLayout.setOnRefreshListener(() -> viewModel.invalidate()); + + getBinding().appBarLayout.addOnOffsetChangedListener((appBarLayout, verticalOffset) -> { + if (verticalOffset >= 0) { + getBinding().baseRefreshLayout.setEnabled(true); + } else { + getBinding().baseRefreshLayout.setEnabled(false); + } + }); + } + + @Override + protected void initData() { + + /* + 数据更新更新事件的观察者 + */ + viewModel.observeDataObserver(this, new DataObserverCallback() { + @Override + public void data(PagedList data) { + adapter.submitList(data);//数据加载 + } + + @Override + public void refreshResult(RefreshResult refreshResult) { + refreshFinished(refreshResult);//刷新状态处理 + } + + @Override + public void loadMoreResult(RefreshResult refreshResult) { + loadMoreFinished(refreshResult);//加载更多的处理 + } + }); + //数据更新处理观察者 + viewModel.observeAdapterObserver(this, new AdapterObserverCallback() { + @Override + public void notifyItem(int position, Object payload) { + adapter.notifyItemChanged(position, payload); + } + + @Override + public void removeItem(int position) { + adapter.notifyItemRemoved(position); + } + }); + + } + + + /** + * 如果需要对item的点击事件做处理,直接重写这个方法就可以了 + * + * @param view view + * @param item item + * @param position position + */ + public void itemClicked(View view, T item, int position) { + + } + + /** + * 如果需要对item的长按事件做处理,直接重写这个方法就可以了 + * + * @param view view + * @param item item + * @param position position + * @return true + */ + public boolean itemLongClicked(View view, T item, int position) { + return false; + } + + public void refreshFinished(RefreshResult result) { + getBinding().baseRefreshLayout.setRefreshing(false); + + if (result == RefreshResult.SUCCEED) + getBinding().baseEmptyView.setStatus(Status.DISMISS); + else if (result == RefreshResult.FAILED) + getBinding().baseEmptyView.setStatus(Status.LOAD_FAILED); + else if (result == RefreshResult.NO_DATA) + getBinding().baseEmptyView.setStatus(Status.NO_DATA); + else if (result == RefreshResult.NO_MORE) { + getBinding().baseEmptyView.setStatus(Status.DISMISS); + ToolsHelper.snack(getBinding().baseEmptyView, "All loads completed"); + } + } + + private void loadMoreFinished(RefreshResult result) { +// if (result == RefreshResult.SUCCEED) { +// } else if (result == RefreshResult.FAILED) { +// } else + if (result == RefreshResult.NO_MORE) { + ToolsHelper.snack(getBinding().baseEmptyView, "All loads completed"); + } + + } + + /** + * 需要指定一个adapter,item只有一种类型的使用{@link com.xuqm.base.adapter.CommonPagedAdapter} + * 需要指定一个adapter,item有多种类型的使用{@link BasePagedAdapter} + * + * @return 自定义的adapter + */ + public abstract BasePagedAdapter adapter(); +} diff --git a/base/src/main/java/com/xuqm/base/ui/BaseListFormLayoutActivity.java b/base/src/main/java/com/xuqm/base/ui/BaseListFormLayoutActivity.java new file mode 100644 index 0000000..78d7a59 --- /dev/null +++ b/base/src/main/java/com/xuqm/base/ui/BaseListFormLayoutActivity.java @@ -0,0 +1,174 @@ +package com.xuqm.base.ui; + +import android.os.Bundle; +import android.view.View; + +import androidx.databinding.ViewDataBinding; +import androidx.lifecycle.ViewModelProvider; +import androidx.paging.PagedList; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; +import androidx.swiperefreshlayout.widget.SwipeRefreshLayout; + +import com.xuqm.base.R; +import com.xuqm.base.adapter.BaseItem; +import com.xuqm.base.adapter.BasePagedAdapter; +import com.xuqm.base.common.RefreshResult; +import com.xuqm.base.common.ToolsHelper; +import com.xuqm.base.view.EmptyView; +import com.xuqm.base.view.enu.Status; +import com.xuqm.base.viewmodel.BaseListViewModel; +import com.xuqm.base.viewmodel.callback.AdapterObserverCallback; +import com.xuqm.base.viewmodel.callback.DataObserverCallback; + +import java.lang.reflect.ParameterizedType; + +/** + * 列表页面的activity继承这个,只需要指定一个adapter就可以展示数据了 + * 例子参考: + * MainActivity extends BaseListActivity + *

+ * User需要继承{@link BaseItem} + * MainViewModel 需要继承{@link BaseListViewModel} + * + * @param + * @param + */ +public abstract class BaseListFormLayoutActivity, V extends ViewDataBinding> + extends BaseActivity { + + private ParameterizedType parameterizedType = (ParameterizedType) getClass().getGenericSuperclass(); + private Class cal = (Class) parameterizedType.getActualTypeArguments()[1]; + private VM viewModel; + + private BasePagedAdapter adapter; + + @Override + public int getLayoutId() { + return R.layout.activity_base_list; + } + + /** + * 获取到viewModel,可以做其它事情,比如item的增删改查等 + * + * @return viewModel + */ + public VM getViewModel() { + return viewModel; + } + public BasePagedAdapter getAdapter() { + return adapter; + } + + public RecyclerView recyclerView; + private SwipeRefreshLayout swipeRefreshLayout; + private EmptyView baseEmptyView; + + @Override + public void initView(Bundle savedInstanceState) { + viewModel = new ViewModelProvider(this).get(cal); + adapter = adapter(); + adapter.setItemClickListener(this::itemClicked); + adapter.setItemLongClickListener(this::itemLongClicked); + recyclerView = findViewById(R.id.baseRecyclerView); + swipeRefreshLayout = findViewById(R.id.baseRefreshLayout); + baseEmptyView = findViewById(R.id.baseEmptyView); + recyclerView.setAdapter(adapter); + recyclerView.setLayoutManager(new LinearLayoutManager(mContext)); + swipeRefreshLayout.setOnRefreshListener(() -> viewModel.invalidate()); + } + + @Override + public void initData() { + + /* + 数据更新更新事件的观察者 + */ + viewModel.observeDataObserver(this, new DataObserverCallback() { + @Override + public void data(PagedList data) { + adapter.submitList(data);//数据加载 + } + + @Override + public void refreshResult(RefreshResult refreshResult) { + refreshFinished(refreshResult);//刷新状态处理 + } + + @Override + public void loadMoreResult(RefreshResult refreshResult) { + loadMoreFinished(refreshResult);//加载更多的处理 + } + }); + //数据更新处理观察者 + viewModel.observeAdapterObserver(this, new AdapterObserverCallback() { + @Override + public void notifyItem(int position, Object payload) { + adapter.notifyItemChanged(position, payload); + } + + @Override + public void removeItem(int position) { +// adapter.notifyItemRemoved(position); + adapter.notifyItemRangeRemoved(position,adapter.getItemCount()-1); + } + }); + + } + + /** + * 如果需要对item的点击事件做处理,直接重写这个方法就可以了 + * + * @param view view + * @param item item + * @param position position + */ + public void itemClicked(View view, T item, int position) { + + } + + /** + * 如果需要对item的长按事件做处理,直接重写这个方法就可以了 + * + * @param view view + * @param item item + * @param position position + * @return true + */ + public boolean itemLongClicked(View view, T item, int position) { + return false; + } + + public void refreshFinished(RefreshResult result) { + swipeRefreshLayout.setRefreshing(false); + + if (result == RefreshResult.SUCCEED) + baseEmptyView.setStatus(Status.DISMISS); + else if (result == RefreshResult.FAILED) + baseEmptyView.setStatus(Status.LOAD_FAILED); + else if (result == RefreshResult.NO_DATA) + baseEmptyView.setStatus(Status.NO_DATA); + else if (result == RefreshResult.NO_MORE) { + baseEmptyView.setStatus(Status.DISMISS); + ToolsHelper.snack(baseEmptyView, "All loads completed"); + } + } + + public void loadMoreFinished(RefreshResult result) { +// if (result == RefreshResult.SUCCEED) { +// } else if (result == RefreshResult.FAILED) { +// } else + if (result == RefreshResult.NO_MORE) { + ToolsHelper.snack(baseEmptyView, "All loads completed"); + } + + } + + /** + * 需要指定一个adapter,item只有一种类型的使用{@link com.xuqm.base.adapter.CommonPagedAdapter} + * 需要指定一个adapter,item有多种类型的使用{@link BasePagedAdapter} + * + * @return 自定义的adapter + */ + public abstract BasePagedAdapter adapter(); +} diff --git a/base/src/main/java/com/xuqm/base/ui/BaseListFragment.java b/base/src/main/java/com/xuqm/base/ui/BaseListFragment.java new file mode 100644 index 0000000..d3dc401 --- /dev/null +++ b/base/src/main/java/com/xuqm/base/ui/BaseListFragment.java @@ -0,0 +1,163 @@ +package com.xuqm.base.ui; + +import android.view.View; + +import androidx.lifecycle.ViewModelProvider; +import androidx.paging.PagedList; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + +import com.xuqm.base.R; +import com.xuqm.base.adapter.BaseItem; +import com.xuqm.base.adapter.BasePagedAdapter; +import com.xuqm.base.common.RefreshResult; +import com.xuqm.base.common.ToolsHelper; +import com.xuqm.base.databinding.ActivityBaseListBinding; +import com.xuqm.base.view.enu.Status; +import com.xuqm.base.viewmodel.BaseListViewModel; +import com.xuqm.base.viewmodel.callback.AdapterObserverCallback; +import com.xuqm.base.viewmodel.callback.DataObserverCallback; + +import java.lang.reflect.ParameterizedType; + +public abstract class BaseListFragment> extends BaseFragment { + + private ParameterizedType parameterizedType = (ParameterizedType) getClass().getGenericSuperclass(); + private Class cal = (Class) parameterizedType.getActualTypeArguments()[1]; + protected VM viewModel; + + private BasePagedAdapter adapter; + + @Override + public int getLayoutId() { + return R.layout.activity_base_list; + } + + /** + * 获取到viewModel,可以做其它事情,比如item的增删改查等 + * + * @return viewModel + */ + public VM getViewModel() { + return viewModel; + } + + @Override + protected void initView() { + + if (getFactory() == null) + viewModel = new ViewModelProvider(this).get(cal); + else + viewModel = new ViewModelProvider(this, getFactory()).get(cal); + adapter = adapter(); + adapter.setItemClickListener(this::itemClicked); + adapter.setItemLongClickListener(this::itemLongClicked); + getBinding().baseRecyclerView.setAdapter(adapter); + getBinding().baseRecyclerView.setLayoutManager(layoutManager()); + getBinding().baseRefreshLayout.setOnRefreshListener(() -> viewModel.invalidate()); + } + + protected ViewModelProvider.Factory getFactory() { + return null; + } + + @Override + protected void initData() { + + /* + 数据更新更新事件的观察者 + */ + viewModel.observeDataObserver(this, new DataObserverCallback() { + @Override + public void data(PagedList data) { + adapter.submitList(data);//数据加载 + } + + @Override + public void refreshResult(RefreshResult refreshResult) { + refreshFinished(refreshResult);//刷新状态处理 + } + + @Override + public void loadMoreResult(RefreshResult refreshResult) { + loadMoreFinished(refreshResult);//加载更多的处理 + } + }); + //数据更新处理观察者 + viewModel.observeAdapterObserver(this, new AdapterObserverCallback() { + @Override + public void notifyItem(int position, Object payload) { + adapter.notifyItemChanged(position, payload); + } + + @Override + public void removeItem(int position) { + adapter.notifyItemRemoved(position); + } + }); + + } + + + /** + * 如果需要对item的点击事件做处理,直接重写这个方法就可以了 + * + * @param view view + * @param item item + * @param position position + */ + public void itemClicked(View view, T item, int position) { + + } + + /** + * 如果需要对item的长按事件做处理,直接重写这个方法就可以了 + * + * @param view view + * @param item item + * @param position position + * @return true + */ + public boolean itemLongClicked(View view, T item, int position) { + return false; + } + + public void refreshFinished(RefreshResult result) { + getBinding().baseRefreshLayout.setRefreshing(false); + + if (result == RefreshResult.SUCCEED) + getBinding().baseEmptyView.setStatus(Status.DISMISS); + else if (result == RefreshResult.FAILED) + getBinding().baseEmptyView.setStatus(Status.LOAD_FAILED); + else if (result == RefreshResult.NO_DATA) + getBinding().baseEmptyView.setStatus(Status.NO_DATA); + else if (result == RefreshResult.NO_MORE) { + getBinding().baseEmptyView.setStatus(Status.DISMISS); +// ToolsHelper.snack(getBinding().baseEmptyView, "All loads completed"); + } + } + + private void loadMoreFinished(RefreshResult result) { +// if (result == RefreshResult.SUCCEED) { +// } else if (result == RefreshResult.FAILED) { +// } else + if (result == RefreshResult.NO_MORE) { +// ToolsHelper.snack(getBinding().baseEmptyView, "All loads completed"); + } + + } + + /** + * 需要指定一个adapter,item只有一种类型的使用{@link com.xuqm.base.adapter.CommonPagedAdapter} + * 需要指定一个adapter,item有多种类型的使用{@link com.xuqm.base.adapter.BasePagedAdapter} + * + * @return 自定义的adapter + */ + public abstract BasePagedAdapter adapter(); + + public RecyclerView.LayoutManager layoutManager() { + return new LinearLayoutManager(mContext); + } + + ; +} diff --git a/base/src/main/java/com/xuqm/base/ui/BaseListFromLayoutFragment.java b/base/src/main/java/com/xuqm/base/ui/BaseListFromLayoutFragment.java new file mode 100644 index 0000000..150ca64 --- /dev/null +++ b/base/src/main/java/com/xuqm/base/ui/BaseListFromLayoutFragment.java @@ -0,0 +1,185 @@ +package com.xuqm.base.ui; + +import android.view.View; + +import androidx.databinding.ViewDataBinding; +import androidx.lifecycle.ViewModelProvider; +import androidx.paging.PagedList; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; +import androidx.swiperefreshlayout.widget.SwipeRefreshLayout; + +import com.xuqm.base.R; +import com.xuqm.base.adapter.BaseItem; +import com.xuqm.base.adapter.BasePagedAdapter; +import com.xuqm.base.common.RefreshResult; +import com.xuqm.base.common.ToolsHelper; +import com.xuqm.base.view.EmptyView; +import com.xuqm.base.view.enu.Status; +import com.xuqm.base.viewmodel.BaseListViewModel; +import com.xuqm.base.viewmodel.callback.AdapterObserverCallback; +import com.xuqm.base.viewmodel.callback.DataObserverCallback; + +import java.lang.reflect.ParameterizedType; + +public abstract class BaseListFromLayoutFragment, V extends ViewDataBinding> extends BaseFragment { + + private ParameterizedType parameterizedType = (ParameterizedType) getClass().getGenericSuperclass(); + private Class cal = (Class) parameterizedType.getActualTypeArguments()[1]; + protected VM viewModel; + + private BasePagedAdapter adapter; + + @Override + public int getLayoutId() { + return R.layout.activity_base_list; + } + + /** + * 获取到viewModel,可以做其它事情,比如item的增删改查等 + * + * @return viewModel + */ + public VM getViewModel() { + return viewModel; + } + + public RecyclerView recyclerView; + private SwipeRefreshLayout swipeRefreshLayout; + private EmptyView baseEmptyView; + + @Override + protected void initView() { + + if (getFactory() == null) + viewModel = new ViewModelProvider(this).get(cal); + else + viewModel = new ViewModelProvider(this, getFactory()).get(cal); + adapter = adapter(); + recyclerView = recyclerView(); + swipeRefreshLayout = swipeRefreshLayout(); + baseEmptyView = baseEmptyView(); + adapter.setItemClickListener(this::itemClicked); + adapter.setItemLongClickListener(this::itemLongClicked); + recyclerView.setLayoutManager(layoutManager()); + recyclerView.setAdapter(adapter); + swipeRefreshLayout.setOnRefreshListener(() -> viewModel.invalidate()); + } + + protected ViewModelProvider.Factory getFactory() { + return null; + } + + @Override + protected void initData() { + + /* + 数据更新更新事件的观察者 + */ + viewModel.observeDataObserver(this, new DataObserverCallback() { + @Override + public void data(PagedList data) { + adapter.submitList(data);//数据加载 + } + + @Override + public void refreshResult(RefreshResult refreshResult) { + refreshFinished(refreshResult);//刷新状态处理 + } + + @Override + public void loadMoreResult(RefreshResult refreshResult) { + loadMoreFinished(refreshResult);//加载更多的处理 + } + }); + //数据更新处理观察者 + viewModel.observeAdapterObserver(this, new AdapterObserverCallback() { + @Override + public void notifyItem(int position, Object payload) { + adapter.notifyItemChanged(position, payload); + } + + @Override + public void removeItem(int position) { + adapter.notifyItemRemoved(position); + } + }); + + } + + + /** + * 如果需要对item的点击事件做处理,直接重写这个方法就可以了 + * + * @param view view + * @param item item + * @param position position + */ + public void itemClicked(View view, T item, int position) { + + } + + /** + * 如果需要对item的长按事件做处理,直接重写这个方法就可以了 + * + * @param view view + * @param item item + * @param position position + * @return true + */ + public boolean itemLongClicked(View view, T item, int position) { + return false; + } + + public void refreshFinished(RefreshResult result) { + swipeRefreshLayout.setRefreshing(false); + + if (result == RefreshResult.SUCCEED) + baseEmptyView.setStatus(Status.DISMISS); + else if (result == RefreshResult.FAILED) + baseEmptyView.setStatus(Status.LOAD_FAILED); + else if (result == RefreshResult.NO_DATA) + baseEmptyView.setStatus(Status.NO_DATA); + else if (result == RefreshResult.NO_MORE) { + baseEmptyView.setStatus(Status.DISMISS); + ToolsHelper.snack(baseEmptyView, "All loads completed"); + } + } + + private void loadMoreFinished(RefreshResult result) { +// if (result == RefreshResult.SUCCEED) { +// } else if (result == RefreshResult.FAILED) { +// } else + if (result == RefreshResult.NO_MORE) { +// ToolsHelper.snack(getBinding().baseEmptyView, "All loads completed"); + } + + } + + /** + * 需要指定一个adapter,item只有一种类型的使用{@link com.xuqm.base.adapter.CommonPagedAdapter} + * 需要指定一个adapter,item有多种类型的使用{@link BasePagedAdapter} + * + * @return 自定义的adapter + */ + public abstract BasePagedAdapter adapter(); + + public RecyclerView recyclerView() { + return getActivity().findViewById(R.id.baseRecyclerView); + } + + public SwipeRefreshLayout swipeRefreshLayout() { + return getActivity().findViewById(R.id.baseRefreshLayout); + } + + public EmptyView baseEmptyView() { + return getActivity().findViewById(R.id.baseEmptyView); + } + + + public RecyclerView.LayoutManager layoutManager() { + return new LinearLayoutManager(mContext); + } + + ; +} diff --git a/base/src/main/java/com/xuqm/base/ui/adapter/ImageViewAdapter.java b/base/src/main/java/com/xuqm/base/ui/adapter/ImageViewAdapter.java new file mode 100644 index 0000000..d82a84c --- /dev/null +++ b/base/src/main/java/com/xuqm/base/ui/adapter/ImageViewAdapter.java @@ -0,0 +1,44 @@ +package com.xuqm.base.ui.adapter; + +import android.graphics.Bitmap; +import android.graphics.drawable.Drawable; +import android.widget.ImageView; + +import androidx.databinding.BindingAdapter; + +import com.bumptech.glide.Glide; +import com.xuqm.base.R; +import com.xuqm.base.common.ImageHelper; + +public class ImageViewAdapter { + @BindingAdapter("android:src") + public static void setSrc(ImageView view, Bitmap bitmap) { + view.setImageBitmap(bitmap); + } + + @BindingAdapter("android:src") + public static void setSrc(ImageView view, int resId) { + view.setImageResource(resId); + } + + + @BindingAdapter("imageUrl") + public static void setSrc(ImageView imageView, String url) { + Glide.with(imageView.getContext()).load(url) + .placeholder(R.drawable.ic_loading) + .into(imageView); +// ImageHelper.load(imageView,url); + } + + + @BindingAdapter({"imageUrl", "placeHolder", "error"}) + public static void loadImage(ImageView imageView, String url, Drawable holderDrawable, Drawable errorDrawable) { + Glide.with(imageView.getContext()) + .load(url) + .placeholder(holderDrawable) + .error(errorDrawable) + .into(imageView); + } + + +} diff --git a/base/src/main/java/com/xuqm/base/ui/callback/ToolBarListener.java b/base/src/main/java/com/xuqm/base/ui/callback/ToolBarListener.java new file mode 100644 index 0000000..f603cdf --- /dev/null +++ b/base/src/main/java/com/xuqm/base/ui/callback/ToolBarListener.java @@ -0,0 +1,5 @@ +package com.xuqm.base.ui.callback; + +public interface ToolBarListener { + void back(); +} diff --git a/base/src/main/java/com/xuqm/base/ui/callback/UiCallback.java b/base/src/main/java/com/xuqm/base/ui/callback/UiCallback.java new file mode 100644 index 0000000..c0882e4 --- /dev/null +++ b/base/src/main/java/com/xuqm/base/ui/callback/UiCallback.java @@ -0,0 +1,23 @@ +package com.xuqm.base.ui.callback; + +import android.os.Bundle; + +import androidx.annotation.LayoutRes; + +public interface UiCallback { + @LayoutRes + int getLayoutId(); + + void setContentView(); + + void initView(Bundle savedInstanceState); + + void initData(); + + int showStatus(); + + boolean transparentStatusBar(); + + boolean fullscreen(); + +} diff --git a/base/src/main/java/com/xuqm/base/view/EmptyMsgView.java b/base/src/main/java/com/xuqm/base/view/EmptyMsgView.java new file mode 100644 index 0000000..0c65390 --- /dev/null +++ b/base/src/main/java/com/xuqm/base/view/EmptyMsgView.java @@ -0,0 +1,100 @@ +package com.xuqm.base.view; + +import android.content.Context; +import android.util.AttributeSet; +import android.view.View; +import android.widget.FrameLayout; +import android.widget.LinearLayout; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; + +import com.xuqm.base.R; +import com.xuqm.base.view.enu.Status; + +/** + * 自定义的view + * 展示不同的数据加载状态 + */ +public class EmptyMsgView extends FrameLayout { + + private View contentView; + private Status status = Status.DISMISS; + + + public EmptyMsgView(@NonNull Context context) { + super(context); + init(); + } + + public EmptyMsgView(@NonNull Context context, @Nullable AttributeSet attrs) { + super(context, attrs); + init(); + } + + private void init() { + View.inflate(getContext(), R.layout.empty_msg_view, this); + } + + @Override + protected void onFinishInflate() { + super.onFinishInflate(); + if (getChildCount() > 5) { + throw new IllegalStateException("EmptyView can only have one child view"); + } + if (getChildCount() == 5) { + contentView = getChildAt(4); + } + emptyViewLoading = findViewById(R.id.emptyViewLoading); + emptyViewNoData = findViewById(R.id.emptyViewNoData); + emptyViewLoadFailed = findViewById(R.id.emptyViewLoadFailed); + emptyViewNetworkUnavailable = findViewById(R.id.emptyViewNetworkUnavailable); + + setStatus(Status.DISMISS); + } + + private LinearLayout emptyViewLoading; + private LinearLayout emptyViewNoData; + private LinearLayout emptyViewLoadFailed; + private LinearLayout emptyViewNetworkUnavailable; + + + public void setStatus(Status status) { +// LogHelper.e(contentView.getVisibility()); + if (status != this.status) { + + if (status == Status.DISMISS) { + if (null != contentView) contentView.setVisibility(VISIBLE); + emptyViewLoading.setVisibility(GONE); + emptyViewNoData.setVisibility(GONE); + emptyViewLoadFailed.setVisibility(GONE); + emptyViewNetworkUnavailable.setVisibility(GONE); + } else if (status == Status.LOADING) { + if (null != contentView) contentView.setVisibility(GONE); + emptyViewLoading.setVisibility(VISIBLE); + emptyViewNoData.setVisibility(GONE); + emptyViewLoadFailed.setVisibility(GONE); + emptyViewNetworkUnavailable.setVisibility(GONE); + } else if (status == Status.NO_DATA) { + if (null != contentView) contentView.setVisibility(GONE); + emptyViewLoading.setVisibility(GONE); + emptyViewNoData.setVisibility(VISIBLE); + emptyViewLoadFailed.setVisibility(GONE); + emptyViewNetworkUnavailable.setVisibility(GONE); + } else if (status == Status.LOAD_FAILED) { + if (null != contentView) contentView.setVisibility(GONE); + emptyViewLoading.setVisibility(GONE); + emptyViewNoData.setVisibility(GONE); + emptyViewLoadFailed.setVisibility(VISIBLE); + emptyViewNetworkUnavailable.setVisibility(GONE); + } else if (status == Status.NETWORK_UNAVAILABLE) { + if (null != contentView) contentView.setVisibility(GONE); + emptyViewLoading.setVisibility(GONE); + emptyViewNoData.setVisibility(GONE); + emptyViewLoadFailed.setVisibility(GONE); + emptyViewNetworkUnavailable.setVisibility(VISIBLE); + } + this.status = status; + } + } +} diff --git a/base/src/main/java/com/xuqm/base/view/EmptyView.java b/base/src/main/java/com/xuqm/base/view/EmptyView.java new file mode 100644 index 0000000..6399fc1 --- /dev/null +++ b/base/src/main/java/com/xuqm/base/view/EmptyView.java @@ -0,0 +1,112 @@ +package com.xuqm.base.view; + +import android.content.Context; +import android.util.AttributeSet; +import android.view.View; +import android.widget.FrameLayout; +import android.widget.ImageView; +import android.widget.LinearLayout; +import android.widget.TextView; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; + +import com.xuqm.base.R; +import com.xuqm.base.common.ImageHelper; +import com.xuqm.base.view.enu.Status; + +/** + * 自定义的view + * 展示不同的数据加载状态 + */ +public class EmptyView extends FrameLayout { + + private View contentView; + private Status status = Status.DISMISS; + + + public EmptyView(@NonNull Context context) { + super(context); + init(); + } + + public EmptyView(@NonNull Context context, @Nullable AttributeSet attrs) { + super(context, attrs); + init(); + } + + private void init() { + View.inflate(getContext(), R.layout.empty_view, this); + } + + @Override + protected void onFinishInflate() { + super.onFinishInflate(); + if (getChildCount() > 5) { + throw new IllegalStateException("EmptyView can only have one child view"); + } + if (getChildCount() == 5) { + contentView = getChildAt(4); + } + emptyViewLoading = findViewById(R.id.emptyViewLoading); + emptyViewNoData = findViewById(R.id.emptyViewNoData); + emptyViewLoadFailed = findViewById(R.id.emptyViewLoadFailed); + emptyViewNetworkUnavailable = findViewById(R.id.emptyViewNetworkUnavailable); + emptyIv = findViewById(R.id.empty_iv); + emptyTv = findViewById(R.id.empty_tv); + + setStatus(Status.DISMISS); + } + + private LinearLayout emptyViewLoading; + private LinearLayout emptyViewNoData; + private LinearLayout emptyViewLoadFailed; + private LinearLayout emptyViewNetworkUnavailable; + private ImageView emptyIv; + private TextView emptyTv; + + + public void setEmptyView(String content, Object url) { + emptyTv.setText(content); + ImageHelper.load(emptyIv, url); + } + + public void setStatus(Status status) { +// LogHelper.e(contentView.getVisibility()); + if (status != this.status) { + + if (status == Status.DISMISS) { + if (null != contentView) contentView.setVisibility(VISIBLE); + emptyViewLoading.setVisibility(GONE); + emptyViewNoData.setVisibility(GONE); + emptyViewLoadFailed.setVisibility(GONE); + emptyViewNetworkUnavailable.setVisibility(GONE); + } else if (status == Status.LOADING) { + if (null != contentView) contentView.setVisibility(GONE); + emptyViewLoading.setVisibility(VISIBLE); + emptyViewNoData.setVisibility(GONE); + emptyViewLoadFailed.setVisibility(GONE); + emptyViewNetworkUnavailable.setVisibility(GONE); + } else if (status == Status.NO_DATA) { + if (null != contentView) contentView.setVisibility(GONE); + emptyViewLoading.setVisibility(GONE); + emptyViewNoData.setVisibility(VISIBLE); + emptyViewLoadFailed.setVisibility(GONE); + emptyViewNetworkUnavailable.setVisibility(GONE); + } else if (status == Status.LOAD_FAILED) { + if (null != contentView) contentView.setVisibility(GONE); + emptyViewLoading.setVisibility(GONE); + emptyViewNoData.setVisibility(GONE); + emptyViewLoadFailed.setVisibility(VISIBLE); + emptyViewNetworkUnavailable.setVisibility(GONE); + } else if (status == Status.NETWORK_UNAVAILABLE) { + if (null != contentView) contentView.setVisibility(GONE); + emptyViewLoading.setVisibility(GONE); + emptyViewNoData.setVisibility(GONE); + emptyViewLoadFailed.setVisibility(GONE); + emptyViewNetworkUnavailable.setVisibility(VISIBLE); + } + this.status = status; + } + } +} diff --git a/base/src/main/java/com/xuqm/base/view/FlowRadioGroup.java b/base/src/main/java/com/xuqm/base/view/FlowRadioGroup.java new file mode 100644 index 0000000..6d86836 --- /dev/null +++ b/base/src/main/java/com/xuqm/base/view/FlowRadioGroup.java @@ -0,0 +1,120 @@ +package com.xuqm.base.view; + +import android.content.Context; +import android.util.AttributeSet; +import android.view.View; +import android.widget.RadioGroup; + +public class FlowRadioGroup extends RadioGroup { + + public FlowRadioGroup(Context context) { + super(context); + } + + public FlowRadioGroup(Context context, AttributeSet attrs) { + super(context, attrs); + } + + @Override + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + int widthSize = MeasureSpec.getSize(widthMeasureSpec); + int widthMode = MeasureSpec.getMode(widthMeasureSpec); + int heightSize = MeasureSpec.getSize(heightMeasureSpec); + int heightMode = MeasureSpec.getMode(heightMeasureSpec); + + //调用ViewGroup的方法,测量子view + measureChildren(widthMeasureSpec, heightMeasureSpec); + + //最大的宽 + int maxWidth = 0; + //累计的高 + int totalHeight = 0; + + //当前这一行的累计行宽 + int lineWidth = 0; + //当前这行的最大行高 + int maxLineHeight = 0; + //用于记录换行前的行宽和行高 + int oldHeight; + int oldWidth; + + int count = getChildCount(); + //假设 widthMode和heightMode都是AT_MOST + for (int i = 0; i < count; i++) { + View child = getChildAt(i); + MarginLayoutParams params = (MarginLayoutParams) child.getLayoutParams(); + oldHeight = maxLineHeight; + //当前最大宽度 + oldWidth = maxWidth; + + int deltaX = child.getMeasuredWidth() + params.leftMargin + params.rightMargin; + if (lineWidth + deltaX + getPaddingLeft() + getPaddingRight() > widthSize) {//如果折行,height增加 + //和目前最大的宽度比较,得到最宽。不能加上当前的child的宽,所以用的是oldWidth + maxWidth = Math.max(lineWidth, oldWidth); + //重置宽度 + lineWidth = deltaX; + //累加高度 + totalHeight += oldHeight; + //重置行高,当前这个View,属于下一行,因此当前最大行高为这个child的高度加上margin + maxLineHeight = child.getMeasuredHeight() + params.topMargin + params.bottomMargin; + + } else { + //不换行,累加宽度 + lineWidth += deltaX; + //不换行,计算行最高 + int deltaY = child.getMeasuredHeight() + params.topMargin + params.bottomMargin; + maxLineHeight = Math.max(maxLineHeight, deltaY); + } + if (i == count - 1) { + //前面没有加上下一行的搞,如果是最后一行,还要再叠加上最后一行的最高的值 + totalHeight += maxLineHeight; + //计算最后一行和前面的最宽的一行比较 + maxWidth = Math.max(lineWidth, oldWidth); + } + } + + //加上当前容器的padding值 + maxWidth += getPaddingLeft() + getPaddingRight(); + totalHeight += getPaddingTop() + getPaddingBottom(); + setMeasuredDimension(widthMode == MeasureSpec.EXACTLY ? widthSize : maxWidth, + heightMode == MeasureSpec.EXACTLY ? heightSize : totalHeight); + + } + + @Override + protected void onLayout(boolean changed, int l, int t, int r, int b) { + int count = getChildCount(); + //pre为前面所有的child的相加后的位置 + int preLeft = getPaddingLeft(); + int preTop = getPaddingTop(); + //记录每一行的最高值 + int maxHeight = 0; + for (int i = 0; i < count; i++) { + View child = getChildAt(i); + MarginLayoutParams params = (MarginLayoutParams) child.getLayoutParams(); + //r-l为当前容器的宽度。如果子view的累积宽度大于容器宽度,就换行。 + if (preLeft + params.leftMargin + child.getMeasuredWidth() + params.rightMargin + getPaddingRight() > (r - l)) { + //重置 + preLeft = getPaddingLeft(); + //要选择child的height最大的作为设置 + preTop = preTop + maxHeight; + maxHeight = getChildAt(i).getMeasuredHeight() + params.topMargin + params.bottomMargin; + } else { //不换行,计算最大高度 + maxHeight = Math.max(maxHeight, child.getMeasuredHeight() + params.topMargin + params.bottomMargin); + } + //left坐标 + int left = preLeft + params.leftMargin; + //top坐标 + int top = preTop + params.topMargin; + int right = left + child.getMeasuredWidth(); + int bottom = top + child.getMeasuredHeight(); + //为子view布局 + child.layout(left, top, right, bottom); + //计算布局结束后,preLeft的值 + preLeft += params.leftMargin + child.getMeasuredWidth() + params.rightMargin; + + } + + } + +} \ No newline at end of file diff --git a/base/src/main/java/com/xuqm/base/view/GalleryTransformer.kt b/base/src/main/java/com/xuqm/base/view/GalleryTransformer.kt new file mode 100644 index 0000000..b4dba34 --- /dev/null +++ b/base/src/main/java/com/xuqm/base/view/GalleryTransformer.kt @@ -0,0 +1,35 @@ +package com.xuqm.base.view + +import android.view.View +import androidx.viewpager2.widget.ViewPager2 + +class GalleryTransformer : ViewPager2.PageTransformer { + companion object { + private const val TARGET_ALPHA = 0.5f + private const val TARGET_SCALE = 0.9f + } + + override fun transformPage(page: View, position: Float) { + if (position < -1 || position > 1) { + //当前页面左侧以及右侧的页面效果 + page.alpha = TARGET_ALPHA + page.scaleX = TARGET_SCALE + page.scaleY = TARGET_SCALE + } else { + //从不可见变为可见效果 + + //透明度效果 + if (position <= 0) { + page.alpha = + TARGET_ALPHA + TARGET_ALPHA * (1 + position) + } else { + page.alpha = + TARGET_ALPHA + TARGET_ALPHA * (1 - position) + } + //缩放效果 + val scale = Math.max(TARGET_SCALE, 1 - Math.abs(position)) + page.scaleX = scale + page.scaleY = scale + } + } +} diff --git a/base/src/main/java/com/xuqm/base/view/MaxLimitRecyclerView.java b/base/src/main/java/com/xuqm/base/view/MaxLimitRecyclerView.java new file mode 100644 index 0000000..6c158da --- /dev/null +++ b/base/src/main/java/com/xuqm/base/view/MaxLimitRecyclerView.java @@ -0,0 +1,69 @@ +package com.xuqm.base.view; + +import android.content.Context; +import android.content.res.TypedArray; +import android.util.AttributeSet; + +import androidx.annotation.Nullable; +import androidx.recyclerview.widget.RecyclerView; + +import com.xuqm.base.R; + +/** + * max limit-able RecyclerView + */ +public class MaxLimitRecyclerView extends RecyclerView { + private int mMaxHeight; + private int mMaxWidth; + + public MaxLimitRecyclerView(Context context) { + this(context, null); + } + + public MaxLimitRecyclerView(Context context, @Nullable AttributeSet attrs) { + this(context, attrs, 0); + } + + public MaxLimitRecyclerView(Context context, @Nullable AttributeSet attrs, int defStyle) { + super(context, attrs, defStyle); + inti(attrs); + } + + private void inti(AttributeSet attrs) { + if (getContext() != null && attrs != null) { + TypedArray typedArray = null; + try { + typedArray = getContext().obtainStyledAttributes(attrs, R.styleable.MaxLimitRecyclerView); + if (typedArray.hasValue(R.styleable.MaxLimitRecyclerView_limit_maxHeight)) { + mMaxHeight = typedArray.getDimensionPixelOffset(R.styleable.MaxLimitRecyclerView_limit_maxHeight, -1); + } + if (typedArray.hasValue(R.styleable.MaxLimitRecyclerView_limit_maxWidth)) { + mMaxWidth = typedArray.getDimensionPixelOffset(R.styleable.MaxLimitRecyclerView_limit_maxWidth, -1); + } + } catch (Exception e) { + e.printStackTrace(); + } finally { + if (typedArray != null) { + typedArray.recycle(); + } + } + } + } + + @Override + protected void onMeasure(int widthSpec, int heightSpec) { + super.onMeasure(widthSpec, heightSpec); + boolean needLimit = mMaxHeight >= 0 || mMaxWidth >= 0; + if (needLimit) { + int limitHeight = getMeasuredHeight(); + int limitWith = getMeasuredWidth(); + if (getMeasuredHeight() > mMaxHeight) { + limitHeight = mMaxHeight; + } +// if (getMeasuredWidth() > mMaxWidth) { +// limitWith = mMaxWidth; +// } + setMeasuredDimension(limitWith, limitHeight); + } + } +} diff --git a/base/src/main/java/com/xuqm/base/view/SelectableRoundedImageView.java b/base/src/main/java/com/xuqm/base/view/SelectableRoundedImageView.java new file mode 100644 index 0000000..175ddaf --- /dev/null +++ b/base/src/main/java/com/xuqm/base/view/SelectableRoundedImageView.java @@ -0,0 +1,657 @@ +package com.xuqm.base.view; + + +import android.annotation.SuppressLint; +import android.content.Context; +import android.content.res.ColorStateList; +import android.content.res.Resources; +import android.content.res.TypedArray; +import android.graphics.Bitmap; +import android.graphics.BitmapShader; +import android.graphics.Canvas; +import android.graphics.Color; +import android.graphics.ColorFilter; +import android.graphics.Matrix; +import android.graphics.Paint; +import android.graphics.Path; +import android.graphics.PixelFormat; +import android.graphics.Rect; +import android.graphics.RectF; +import android.graphics.Shader; +import android.graphics.drawable.BitmapDrawable; +import android.graphics.drawable.Drawable; +import android.graphics.drawable.LayerDrawable; +import android.net.Uri; +import android.util.AttributeSet; +import android.widget.ImageView; + +import com.xuqm.base.R; + +/** + * Created by JiYaRuo on 2019/10/11. + * + * @BeUsedFor 自定义ImageView 随心所欲的改变ImageView的四个圆角角度 + */ +@SuppressLint("AppCompatCustomView") +public class SelectableRoundedImageView extends ImageView { + public static final String TAG = "SelectableRoundedImageView"; + + private int mResource = 0; + + private static final ScaleType[] sScaleTypeArray = { + ScaleType.MATRIX, + ScaleType.FIT_XY, + ScaleType.FIT_START, + ScaleType.FIT_CENTER, + ScaleType.FIT_END, + ScaleType.CENTER, + ScaleType.CENTER_CROP, + ScaleType.CENTER_INSIDE + }; + + // Set default scale type to FIT_CENTER, which is default scale type of + // original ImageView. + private ScaleType mScaleType = ScaleType.FIT_CENTER; + + private float mLeftTopCornerRadius = 0.0f; + private float mRightTopCornerRadius = 0.0f; + private float mLeftBottomCornerRadius = 0.0f; + private float mRightBottomCornerRadius = 0.0f; + + private float mBorderWidth = 0.0f; + private static final int DEFAULT_BORDER_COLOR = Color.BLACK; + private ColorStateList mBorderColor = ColorStateList.valueOf(DEFAULT_BORDER_COLOR); + + private boolean isOval = false; + + private Drawable mDrawable; + + private float[] mRadii = new float[]{0, 0, 0, 0, 0, 0, 0, 0}; + + public SelectableRoundedImageView(Context context) { + super(context); + } + + public SelectableRoundedImageView(Context context, AttributeSet attrs) { + this(context, attrs, 0); + } + + public SelectableRoundedImageView(Context context, AttributeSet attrs, int defStyle) { + super(context, attrs, defStyle); + + TypedArray a = context.obtainStyledAttributes(attrs, + R.styleable.SelectableRoundedImageView, defStyle, 0); + + final int index = a.getInt(R.styleable.SelectableRoundedImageView_android_scaleType, -1); + if (index >= 0) { + setScaleType(sScaleTypeArray[index]); + } + + mLeftTopCornerRadius = a.getDimensionPixelSize( + R.styleable.SelectableRoundedImageView_sriv_left_top_corner_radius, 0); + mRightTopCornerRadius = a.getDimensionPixelSize( + R.styleable.SelectableRoundedImageView_sriv_right_top_corner_radius, 0); + mLeftBottomCornerRadius = a.getDimensionPixelSize( + R.styleable.SelectableRoundedImageView_sriv_left_bottom_corner_radius, 0); + mRightBottomCornerRadius = a.getDimensionPixelSize( + R.styleable.SelectableRoundedImageView_sriv_right_bottom_corner_radius, 0); + + if (mLeftTopCornerRadius < 0.0f || mRightTopCornerRadius < 0.0f + || mLeftBottomCornerRadius < 0.0f || mRightBottomCornerRadius < 0.0f) { + throw new IllegalArgumentException("radius values cannot be negative."); + } + + mRadii = new float[]{ + mLeftTopCornerRadius, mLeftTopCornerRadius, + mRightTopCornerRadius, mRightTopCornerRadius, + mRightBottomCornerRadius, mRightBottomCornerRadius, + mLeftBottomCornerRadius, mLeftBottomCornerRadius + }; + + mBorderWidth = a.getDimensionPixelSize(R.styleable.SelectableRoundedImageView_sriv_border_width, 0); + if (mBorderWidth < 0) { + throw new IllegalArgumentException("border width cannot be negative."); + } + + mBorderColor = a.getColorStateList(R.styleable.SelectableRoundedImageView_sriv_border_color); + if (mBorderColor == null) { + mBorderColor = ColorStateList.valueOf(DEFAULT_BORDER_COLOR); + } + + isOval = a.getBoolean(R.styleable.SelectableRoundedImageView_sriv_oval, false); + a.recycle(); + + updateDrawable(); + } + + @Override + protected void drawableStateChanged() { + super.drawableStateChanged(); + invalidate(); + } + + @Override + public ScaleType getScaleType() { + return mScaleType; + } + + @Override + public void setScaleType(ScaleType scaleType) { + super.setScaleType(scaleType); + mScaleType = scaleType; + updateDrawable(); + } + + @Override + public void setImageDrawable(Drawable drawable) { + mResource = 0; + mDrawable = SelectableRoundedCornerDrawable.fromDrawable(drawable, getResources()); + super.setImageDrawable(mDrawable); + updateDrawable(); + } + + @Override + public void setImageBitmap(Bitmap bm) { + mResource = 0; + mDrawable = SelectableRoundedCornerDrawable.fromBitmap(bm, getResources()); + super.setImageDrawable(mDrawable); + updateDrawable(); + } + + @Override + public void setImageResource(int resId) { + if (mResource != resId) { + mResource = resId; + mDrawable = resolveResource(); + super.setImageDrawable(mDrawable); + updateDrawable(); + } + } + + @Override + public void setImageURI(Uri uri) { + super.setImageURI(uri); + setImageDrawable(getDrawable()); + } + + private Drawable resolveResource() { + Resources rsrc = getResources(); + if (rsrc == null) { + return null; + } + + Drawable d = null; + + if (mResource != 0) { + try { + d = rsrc.getDrawable(mResource); + } catch (Exception e) { +// Log.w(TAG, "Unable to find resource: " + mResource, e); + // Don't try again. + mResource = 0; + } + } + return SelectableRoundedCornerDrawable.fromDrawable(d, getResources()); + } + + private void updateDrawable() { + if (mDrawable == null) { + return; + } + + ((SelectableRoundedCornerDrawable) mDrawable).setScaleType(mScaleType); + ((SelectableRoundedCornerDrawable) mDrawable).setCornerRadii(mRadii); + ((SelectableRoundedCornerDrawable) mDrawable).setBorderWidth(mBorderWidth); + ((SelectableRoundedCornerDrawable) mDrawable).setBorderColor(mBorderColor); + ((SelectableRoundedCornerDrawable) mDrawable).setOval(isOval); + } + + public float getCornerRadius() { + return mLeftTopCornerRadius; + } + + /** + * Set radii for each corner. + * + * @param leftTop The desired radius for left-top corner in dip. + * @param rightTop The desired desired radius for right-top corner in dip. + * @param leftBottom The desired radius for left-bottom corner in dip. + * @param rightBottom The desired radius for right-bottom corner in dip. + */ + public void setCornerRadiiDP(float leftTop, float rightTop, float leftBottom, float rightBottom) { + final float density = getResources().getDisplayMetrics().density; + + final float lt = leftTop * density; + final float rt = rightTop * density; + final float lb = leftBottom * density; + final float rb = rightBottom * density; + + mRadii = new float[]{lt, lt, rt, rt, rb, rb, lb, lb}; + updateDrawable(); + } + + public float getBorderWidth() { + return mBorderWidth; + } + + /** + * Set border width. + * + * @param width The desired width in dip. + */ + public void setBorderWidthDP(float width) { + float scaledWidth = getResources().getDisplayMetrics().density * width; + if (mBorderWidth == scaledWidth) { + return; + } + + mBorderWidth = scaledWidth; + updateDrawable(); + invalidate(); + } + + public int getBorderColor() { + return mBorderColor.getDefaultColor(); + } + + public void setBorderColor(int color) { + setBorderColor(ColorStateList.valueOf(color)); + } + + public ColorStateList getBorderColors() { + return mBorderColor; + } + + public void setBorderColor(ColorStateList colors) { + if (mBorderColor.equals(colors)) { + return; + } + + mBorderColor = (colors != null) ? colors : ColorStateList + .valueOf(DEFAULT_BORDER_COLOR); + updateDrawable(); + if (mBorderWidth > 0) { + invalidate(); + } + } + + public boolean isOval() { + return isOval; + } + + public void setOval(boolean oval) { + isOval = oval; + updateDrawable(); + invalidate(); + } + + static class SelectableRoundedCornerDrawable extends Drawable { + + private static final String TAG = "SelectableRoundedCornerDrawable"; + private static final int DEFAULT_BORDER_COLOR = Color.BLACK; + + private RectF mBounds = new RectF(); + private RectF mBorderBounds = new RectF(); + + private final RectF mBitmapRect = new RectF(); + private final int mBitmapWidth; + private final int mBitmapHeight; + + private final Paint mBitmapPaint; + private final Paint mBorderPaint; + + private BitmapShader mBitmapShader; + + private float[] mRadii = new float[]{0, 0, 0, 0, 0, 0, 0, 0}; + private float[] mBorderRadii = new float[]{0, 0, 0, 0, 0, 0, 0, 0}; + + private boolean mOval = false; + + private float mBorderWidth = 0; + private ColorStateList mBorderColor = ColorStateList.valueOf(DEFAULT_BORDER_COLOR); + // Set default scale type to FIT_CENTER, which is default scale type of + // original ImageView. + private ScaleType mScaleType = ScaleType.FIT_CENTER; + + private Path mPath = new Path(); + private Bitmap mBitmap; + private boolean mBoundsConfigured = false; + + public SelectableRoundedCornerDrawable(Bitmap bitmap, Resources r) { + mBitmap = bitmap; + mBitmapShader = new BitmapShader(bitmap, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP); + + if (bitmap != null) { + mBitmapWidth = bitmap.getScaledWidth(r.getDisplayMetrics()); + mBitmapHeight = bitmap.getScaledHeight(r.getDisplayMetrics()); + } else { + mBitmapWidth = mBitmapHeight = -1; + } + + mBitmapRect.set(0, 0, mBitmapWidth, mBitmapHeight); + + mBitmapPaint = new Paint(Paint.ANTI_ALIAS_FLAG); + mBitmapPaint.setStyle(Paint.Style.FILL); + mBitmapPaint.setShader(mBitmapShader); + + mBorderPaint = new Paint(Paint.ANTI_ALIAS_FLAG); + mBorderPaint.setStyle(Paint.Style.STROKE); + mBorderPaint.setColor(mBorderColor.getColorForState(getState(), DEFAULT_BORDER_COLOR)); + mBorderPaint.setStrokeWidth(mBorderWidth); + } + + public static SelectableRoundedCornerDrawable fromBitmap(Bitmap bitmap, Resources r) { + if (bitmap != null) { + return new SelectableRoundedCornerDrawable(bitmap, r); + } else { + return null; + } + } + + public static Drawable fromDrawable(Drawable drawable, Resources r) { + if (drawable != null) { + if (drawable instanceof SelectableRoundedCornerDrawable) { + return drawable; + } else if (drawable instanceof LayerDrawable) { + LayerDrawable ld = (LayerDrawable) drawable; + final int num = ld.getNumberOfLayers(); + for (int i = 0; i < num; i++) { + Drawable d = ld.getDrawable(i); + ld.setDrawableByLayerId(ld.getId(i), fromDrawable(d, r)); + } + return ld; + } + + Bitmap bm = drawableToBitmap(drawable); + if (bm != null) { + return new SelectableRoundedCornerDrawable(bm, r); + } else { +// Log.w(TAG, "Failed to create bitmap from drawable!"); + } + } + return drawable; + } + + public static Bitmap drawableToBitmap(Drawable drawable) { + if (drawable == null) { + return null; + } + + if (drawable instanceof BitmapDrawable) { + return ((BitmapDrawable) drawable).getBitmap(); + } + + Bitmap bitmap; + int width = Math.max(drawable.getIntrinsicWidth(), 2); + int height = Math.max(drawable.getIntrinsicHeight(), 2); + try { + bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888); + Canvas canvas = new Canvas(bitmap); + drawable.setBounds(0, 0, canvas.getWidth(), canvas.getHeight()); + drawable.draw(canvas); + } catch (IllegalArgumentException e) { + e.printStackTrace(); + bitmap = null; + } + return bitmap; + } + + @Override + public boolean isStateful() { + return mBorderColor.isStateful(); + } + + @Override + protected boolean onStateChange(int[] state) { + int newColor = mBorderColor.getColorForState(state, 0); + if (mBorderPaint.getColor() != newColor) { + mBorderPaint.setColor(newColor); + return true; + } else { + return super.onStateChange(state); + } + } + + private void configureBounds(Canvas canvas) { + // I have discovered a truly marvelous explanation of this, + // which this comment space is too narrow to contain. :) + // If you want to understand what's going on here, + // See http://www.joooooooooonhokim.com/?p=289 + Rect clipBounds = canvas.getClipBounds(); + Matrix canvasMatrix = canvas.getMatrix(); + + if (ScaleType.CENTER == mScaleType) { + mBounds.set(clipBounds); + } else if (ScaleType.CENTER_CROP == mScaleType) { + applyScaleToRadii(canvasMatrix); + mBounds.set(clipBounds); + } else if (ScaleType.FIT_XY == mScaleType) { + Matrix m = new Matrix(); + m.setRectToRect(mBitmapRect, new RectF(clipBounds), Matrix.ScaleToFit.FILL); + mBitmapShader.setLocalMatrix(m); + mBounds.set(clipBounds); + } else if (ScaleType.FIT_START == mScaleType || ScaleType.FIT_END == mScaleType + || ScaleType.FIT_CENTER == mScaleType || ScaleType.CENTER_INSIDE == mScaleType) { + applyScaleToRadii(canvasMatrix); + mBounds.set(mBitmapRect); + } else if (ScaleType.MATRIX == mScaleType) { + applyScaleToRadii(canvasMatrix); + mBounds.set(mBitmapRect); + } + } + + private void applyScaleToRadii(Matrix m) { + float[] values = new float[9]; + m.getValues(values); + for (int i = 0; i < mRadii.length; i++) { + mRadii[i] = mRadii[i] / values[0]; + } + } + + private void adjustCanvasForBorder(Canvas canvas) { + Matrix canvasMatrix = canvas.getMatrix(); + final float[] values = new float[9]; + canvasMatrix.getValues(values); + + final float scaleFactorX = values[0]; + final float scaleFactorY = values[4]; + final float translateX = values[2]; + final float translateY = values[5]; + + final float newScaleX = mBounds.width() + / (mBounds.width() + mBorderWidth + mBorderWidth); + final float newScaleY = mBounds.height() + / (mBounds.height() + mBorderWidth + mBorderWidth); + + canvas.scale(newScaleX, newScaleY); + if (ScaleType.FIT_START == mScaleType || ScaleType.FIT_END == mScaleType + || ScaleType.FIT_XY == mScaleType || ScaleType.FIT_CENTER == mScaleType + || ScaleType.CENTER_INSIDE == mScaleType || ScaleType.MATRIX == mScaleType) { + canvas.translate(mBorderWidth, mBorderWidth); + } else if (ScaleType.CENTER == mScaleType || ScaleType.CENTER_CROP == mScaleType) { + // First, make translate values to 0 + canvas.translate( + -translateX / (newScaleX * scaleFactorX), + -translateY / (newScaleY * scaleFactorY)); + // Then, set the final translate values. + canvas.translate(-(mBounds.left - mBorderWidth), -(mBounds.top - mBorderWidth)); + } + } + + private void adjustBorderWidthAndBorderBounds(Canvas canvas) { + Matrix canvasMatrix = canvas.getMatrix(); + final float[] values = new float[9]; + canvasMatrix.getValues(values); + + final float scaleFactor = values[0]; + + float viewWidth = mBounds.width() * scaleFactor; + mBorderWidth = (mBorderWidth * mBounds.width()) / (viewWidth - (2 * mBorderWidth)); + mBorderPaint.setStrokeWidth(mBorderWidth); + + mBorderBounds.set(mBounds); + mBorderBounds.inset(-mBorderWidth / 2, -mBorderWidth / 2); + } + + private void setBorderRadii() { + for (int i = 0; i < mRadii.length; i++) { + if (mRadii[i] > 0) { + mBorderRadii[i] = mRadii[i]; + mRadii[i] = mRadii[i] - mBorderWidth; + } + } + } + + @Override + public void draw(Canvas canvas) { + canvas.save(); + if (!mBoundsConfigured) { + configureBounds(canvas); + if (mBorderWidth > 0) { + adjustBorderWidthAndBorderBounds(canvas); + setBorderRadii(); + } + mBoundsConfigured = true; + } + + if (mOval) { + if (mBorderWidth > 0) { + adjustCanvasForBorder(canvas); + mPath.addOval(mBounds, Path.Direction.CW); + canvas.drawPath(mPath, mBitmapPaint); + mPath.reset(); + mPath.addOval(mBorderBounds, Path.Direction.CW); + canvas.drawPath(mPath, mBorderPaint); + } else { + mPath.addOval(mBounds, Path.Direction.CW); + canvas.drawPath(mPath, mBitmapPaint); + } + } else { + if (mBorderWidth > 0) { + adjustCanvasForBorder(canvas); + mPath.addRoundRect(mBounds, mRadii, Path.Direction.CW); + canvas.drawPath(mPath, mBitmapPaint); + mPath.reset(); + mPath.addRoundRect(mBorderBounds, mBorderRadii, Path.Direction.CW); + canvas.drawPath(mPath, mBorderPaint); + } else { + mPath.addRoundRect(mBounds, mRadii, Path.Direction.CW); + canvas.drawPath(mPath, mBitmapPaint); + } + } + canvas.restore(); + } + + public void setCornerRadii(float[] radii) { + if (radii == null) + return; + + if (radii.length != 8) { + throw new ArrayIndexOutOfBoundsException("radii[] needs 8 values"); + } + + for (int i = 0; i < radii.length; i++) { + mRadii[i] = radii[i]; + } + } + + @Override + public int getOpacity() { + return (mBitmap == null || mBitmap.hasAlpha() || mBitmapPaint.getAlpha() < 255) ? PixelFormat.TRANSLUCENT + : PixelFormat.OPAQUE; + } + + @Override + public void setAlpha(int alpha) { + mBitmapPaint.setAlpha(alpha); + invalidateSelf(); + } + + @Override + public void setColorFilter(ColorFilter cf) { + mBitmapPaint.setColorFilter(cf); + invalidateSelf(); + } + + @Override + public void setDither(boolean dither) { + mBitmapPaint.setDither(dither); + invalidateSelf(); + } + + @Override + public void setFilterBitmap(boolean filter) { + mBitmapPaint.setFilterBitmap(filter); + invalidateSelf(); + } + + @Override + public int getIntrinsicWidth() { + return mBitmapWidth; + } + + @Override + public int getIntrinsicHeight() { + return mBitmapHeight; + } + + public float getBorderWidth() { + return mBorderWidth; + } + + public void setBorderWidth(float width) { + mBorderWidth = width; + mBorderPaint.setStrokeWidth(width); + } + + public int getBorderColor() { + return mBorderColor.getDefaultColor(); + } + + public void setBorderColor(int color) { + setBorderColor(ColorStateList.valueOf(color)); + } + + public ColorStateList getBorderColors() { + return mBorderColor; + } + + /** + * Controls border color of this ImageView. + * + * @param colors The desired border color. If it's null, no border will be + * drawn. + */ + public void setBorderColor(ColorStateList colors) { + if (colors == null) { + mBorderWidth = 0; + mBorderColor = ColorStateList.valueOf(Color.TRANSPARENT); + mBorderPaint.setColor(Color.TRANSPARENT); + } else { + mBorderColor = colors; + mBorderPaint.setColor(mBorderColor.getColorForState(getState(), + DEFAULT_BORDER_COLOR)); + } + } + + public boolean isOval() { + return mOval; + } + + public void setOval(boolean oval) { + mOval = oval; + } + + public ScaleType getScaleType() { + return mScaleType; + } + + public void setScaleType(ScaleType scaleType) { + if (scaleType == null) { + return; + } + mScaleType = scaleType; + } + } + +} diff --git a/base/src/main/java/com/xuqm/base/view/StrokeTextView.java b/base/src/main/java/com/xuqm/base/view/StrokeTextView.java new file mode 100644 index 0000000..26908cc --- /dev/null +++ b/base/src/main/java/com/xuqm/base/view/StrokeTextView.java @@ -0,0 +1,83 @@ +package com.xuqm.base.view; + +import android.content.Context; +import android.graphics.Canvas; +import android.graphics.Color; +import android.graphics.Paint; +import android.text.TextPaint; +import android.util.AttributeSet; +import android.view.ViewGroup; +import android.widget.TextView; + +public class StrokeTextView extends androidx.appcompat.widget.AppCompatTextView { + private final TextView outlineTextView; + private TextPaint strokePaint; + + public StrokeTextView(Context context) { + super(context); + + outlineTextView = new TextView(context); + } + + public StrokeTextView(Context context, AttributeSet attrs) { + super(context, attrs); + + outlineTextView = new TextView(context, attrs); + } + + public StrokeTextView(Context context, AttributeSet attrs, int defStyle) { + super(context, attrs, defStyle); + + outlineTextView = new TextView(context, attrs, defStyle); + } + + @Override + public void setLayoutParams(ViewGroup.LayoutParams params) { + super.setLayoutParams(params); + outlineTextView.setLayoutParams(params); + } + + @Override + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + super.onMeasure(widthMeasureSpec, heightMeasureSpec); + + //设置轮廓文字 + CharSequence outlineText = outlineTextView.getText(); + if (outlineText == null || !outlineText.equals(this.getText())) { + outlineTextView.setText(getText()); + postInvalidate(); + } + outlineTextView.measure(widthMeasureSpec, heightMeasureSpec); + } + + @Override + protected void onLayout(boolean changed, int left, int top, int right, int bottom) { + super.onLayout(changed, left, top, right, bottom); + outlineTextView.layout(left, top, right, bottom); + } + + @Override + protected void onDraw(Canvas canvas) { + + if (strokePaint == null) { + strokePaint = new TextPaint(); + } + //复制原来TextViewg画笔中的一些参数 + TextPaint paint = getPaint(); + strokePaint.setTextSize(paint.getTextSize()+3); + strokePaint.setFlags(paint.getFlags()); + strokePaint.setAlpha(paint.getAlpha()); + + //自定义描边效果 + strokePaint.setStyle(Paint.Style.STROKE); + strokePaint.setColor(Color.parseColor("#66000000")); + strokePaint.setStrokeWidth(6); + + String text = getText().toString(); + + //在文本底层画出带描边的文本 + canvas.drawText(text, (getWidth() - strokePaint.measureText(text)) / 2, + getBaseline(), strokePaint); + super.onDraw(canvas); + } +} \ No newline at end of file diff --git a/base/src/main/java/com/xuqm/base/view/SuperViewPager.kt b/base/src/main/java/com/xuqm/base/view/SuperViewPager.kt new file mode 100644 index 0000000..145a686 --- /dev/null +++ b/base/src/main/java/com/xuqm/base/view/SuperViewPager.kt @@ -0,0 +1,98 @@ +package com.xuqm.base.view + +import android.annotation.SuppressLint +import android.content.Context +import android.util.AttributeSet +import android.view.Gravity +import android.view.LayoutInflater +import android.view.MotionEvent +import android.view.View +import android.view.ViewGroup +import android.widget.RelativeLayout +import androidx.recyclerview.widget.RecyclerView +import androidx.viewpager2.widget.ViewPager2 +import com.xuqm.base.R + +class SuperViewPager : RelativeLayout { + + val mViewPager: ViewPager2 by lazy { + findViewById(R.id.mViewPager) + .apply { + //设置关闭过度滑动的效果 + getChildAt(0).overScrollMode = View.OVER_SCROLL_NEVER + } + } + + //自己定义了一个比率,来调整画廊效果最左侧和最右侧占用的宽度 + var edgeRatio = 0.25 + set(value) { + field = value + refreshPageSize() + } + + //为了保证画廊效果,可见的Page处理为单数 + var visibleItem: Int = 1 + set(value) { + field = if (value.rem(2) == 0) { + value - 1 + } else { + value + } + refreshPageSize() + } + + + //刷新页面大小 + private fun refreshPageSize() { + //使用post为了保证获取根布局width的时候结果不为0 + mViewPager.post { + mViewPager.offscreenPageLimit = visibleItem + //根据想要显示的页面个数,动态给ViewPager2计算一个大小 + val mPageWidth = if (visibleItem == 1) { + width + } else { + width.toDouble().div(visibleItem.minus(2).plus(edgeRatio)).toInt() + } + mViewPager.layoutParams = LayoutParams( + LayoutParams( + mPageWidth, + ViewGroup.LayoutParams.MATCH_PARENT + ).apply { gravity = Gravity.CENTER }) + } + } + + /** + * 将根布局的触摸事件直接传递给ViewPager + */ + @SuppressLint("ClickableViewAccessibility") + override fun onTouchEvent(event: MotionEvent?): Boolean { + return mViewPager.getChildAt(0).onTouchEvent(event) + } + + constructor(context: Context?) : super(context) + constructor(context: Context?, attrs: AttributeSet?) : super(context, attrs) + constructor(context: Context?, attrs: AttributeSet?, defStyleAttr: Int) : super( + context, + attrs, + defStyleAttr + ) + + init { + clipChildren = false + LayoutInflater.from(context).inflate(R.layout.super_viewpager_layout, this, true) + } + + /** + * 为ViewPager2设置一个适配器,ViewPager2的适配器不再是PagerAdapter,而是RecyclerView.Adapter类型 + */ + fun setAdapter(adapter: RecyclerView.Adapter<*>) { + mViewPager.adapter = adapter + } + + /** + * 设置页面切换的效果 + */ + fun setPageTransformer(pageTransformer: ViewPager2.PageTransformer) { + mViewPager.setPageTransformer(pageTransformer) + } +} diff --git a/base/src/main/java/com/xuqm/base/view/ToolbarLayout.java b/base/src/main/java/com/xuqm/base/view/ToolbarLayout.java new file mode 100644 index 0000000..e29865c --- /dev/null +++ b/base/src/main/java/com/xuqm/base/view/ToolbarLayout.java @@ -0,0 +1,150 @@ +package com.xuqm.base.view; + +import android.content.Context; +import android.content.res.ColorStateList; +import android.content.res.TypedArray; +import android.graphics.drawable.Drawable; +import android.util.AttributeSet; +import android.view.View; +import android.widget.FrameLayout; +import android.widget.ImageView; +import android.widget.TextView; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.core.content.ContextCompat; +import androidx.core.graphics.drawable.DrawableCompat; + +import com.xuqm.base.R; +import com.xuqm.base.ui.callback.ToolBarListener; + +/** + * 自定义的toolbar + */ +public class ToolbarLayout extends FrameLayout { + + private CharSequence title = ""; + private int textColor = 0xFFFFFF; + private int iconTintColor = 0xFFFFFF; + private boolean showBack = true; + private boolean showLine = false; + + public void setTitle(CharSequence title) { + this.title = title; + getTitleView().setText(title); + } + + public void setTextColor(int textColor) { + this.textColor = textColor; + getTitleView().setTextColor(textColor); + } + + public void setIconTintColor(int iconTintColor) { + this.iconTintColor = iconTintColor; + tintIcon(iconTintColor); + } + + public void setShowBack(boolean showBack) { + this.showBack = showBack; + getBackBtn().setVisibility(showBack ? VISIBLE : GONE); + } + + public void setShowLine(boolean showLine) { + this.showLine = showLine; + findViewById(R.id.toolbarLine).setVisibility(showLine ? VISIBLE : GONE); + } + + private ToolBarListener backListener; + + public void backBtnPressed(ToolBarListener listener) { + backListener = listener; + } + + public ToolbarLayout(@NonNull Context context) { + super(context); + init(null); + } + + public ToolbarLayout(@NonNull Context context, @Nullable AttributeSet attrs) { + super(context, attrs); + init(attrs); + } + + private void init(AttributeSet attrs) { + Context mContext = getContext(); + if (null == attrs) return; + View.inflate(mContext, R.layout.toolbar, this); + TypedArray typedArray = mContext.obtainStyledAttributes(attrs, R.styleable.ToolbarLayout); + title = typedArray.getString(R.styleable.ToolbarLayout_title); + showBack = typedArray.getBoolean(R.styleable.ToolbarLayout_showBack, true); + showLine = typedArray.getBoolean(R.styleable.ToolbarLayout_showLine, false); + textColor = typedArray.getColor(R.styleable.ToolbarLayout_textColor, ContextCompat.getColor(mContext, R.color.title)); +// iconTintColor = typedArray.getColor(R.styleable.ToolbarLayout_iconTint, ContextCompat.getColor(mContext, R.color.white)); + typedArray.recycle(); + } + + @Override + protected void onFinishInflate() { + super.onFinishInflate(); + if (null != getBackBtn()) { + getBackBtn().setVisibility(showBack ? VISIBLE : GONE); + if (showBack) { +// tintIcon(iconTintColor); + getBackBtn().setOnClickListener(v -> backListener.back()); + + } + } + if (null != getTitleView()) { + getTitleView().setText(title); + getTitleView().setTextColor(textColor); + } + if (null != getConfirmBtn()) { + getTitleView().setText(title); + getConfirmBtn().setTextColor(textColor); + } + findViewById(R.id.toolbarLine).setVisibility(showLine ? VISIBLE : GONE); + } + + private void tintIcon(int colors) { + Drawable wrappedDrawable = DrawableCompat.wrap(getBackBtn().getDrawable()); + DrawableCompat.setTintList(wrappedDrawable, ColorStateList.valueOf(colors)); + getBackBtn().setImageDrawable(wrappedDrawable); + } + + private ImageView backBtn; + + public ImageView getBackBtn() { + if (null == backBtn) + backBtn = findViewById(R.id.toolbarBack); + return backBtn; + } + + private TextView titleView; + + public TextView getTitleView() { + if (null == titleView) + titleView = findViewById(R.id.toolbarTitle); + return titleView; + } + private TextView confirmBtn; + + public TextView getConfirmBtn() { + if (null == confirmBtn) + confirmBtn = findViewById(R.id.toolbarConfirm); + return confirmBtn; + } + private ImageView closeBtn; + + public ImageView getCloseBtn() { + if (null == closeBtn) + closeBtn = findViewById(R.id.toolbarClose); + return closeBtn; + } + private ImageView toolbarMenu; + + public ImageView getToolbarMenu() { + if (null == toolbarMenu) + toolbarMenu = findViewById(R.id.toolbarMenu); + return toolbarMenu; + } +} diff --git a/base/src/main/java/com/xuqm/base/view/enu/Status.java b/base/src/main/java/com/xuqm/base/view/enu/Status.java new file mode 100644 index 0000000..28a13c9 --- /dev/null +++ b/base/src/main/java/com/xuqm/base/view/enu/Status.java @@ -0,0 +1,5 @@ +package com.xuqm.base.view.enu; + +public enum Status { + DISMISS, LOADING, NO_DATA, LOAD_FAILED, NETWORK_UNAVAILABLE +} diff --git a/base/src/main/java/com/xuqm/base/viewmodel/BaseListViewModel.java b/base/src/main/java/com/xuqm/base/viewmodel/BaseListViewModel.java new file mode 100644 index 0000000..2440cbb --- /dev/null +++ b/base/src/main/java/com/xuqm/base/viewmodel/BaseListViewModel.java @@ -0,0 +1,132 @@ +package com.xuqm.base.viewmodel; + +import androidx.annotation.NonNull; +import androidx.core.util.Pair; +import androidx.lifecycle.LifecycleOwner; +import androidx.lifecycle.LiveData; +import androidx.lifecycle.MutableLiveData; +import androidx.paging.LivePagedListBuilder; +import androidx.paging.PageKeyedDataSource; +import androidx.paging.PagedList; + +import com.xuqm.base.common.RefreshResult; +import com.xuqm.base.datasource.DataSourceFactory; +import com.xuqm.base.datasource.PagedDataLoader; +import com.xuqm.base.viewmodel.callback.AdapterObserverCallback; +import com.xuqm.base.viewmodel.callback.DataObserverCallback; +import com.xuqm.base.viewmodel.callback.Response; + +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; + +/** + * @param + */ +public abstract class BaseListViewModel extends BaseViewModel implements PagedDataLoader { + + public int pageSize() { + return 10; + } + + private final ArrayList data = new ArrayList<>(); + + private final DataSourceFactory dataSourceFactory = new DataSourceFactory<>(this); + private final LiveData> loadLiveData = new LivePagedListBuilder<>(dataSourceFactory, this.pageSize()).build(); + private final MutableLiveData refreshLiveData = new MutableLiveData<>(); + private final MutableLiveData loadMoreLiveData = new MutableLiveData<>(); + private final MutableLiveData> notifyItemLiveData = new MutableLiveData<>(); + private final MutableLiveData removeItemLiveData = new MutableLiveData<>(); + + public void invalidate() { + Objects.requireNonNull(dataSourceFactory.sourceLiveData.getValue()).invalidate(); + } + + public void observeDataObserver(@NonNull LifecycleOwner owner, DataObserverCallback dataObserverCallback) { + loadLiveData.observe(owner, dataObserverCallback::data); + refreshLiveData.observe(owner, dataObserverCallback::refreshResult); + loadMoreLiveData.observe(owner, dataObserverCallback::loadMoreResult); + } + + public void observeAdapterObserver(@NonNull LifecycleOwner owner, AdapterObserverCallback observerCallback) { + notifyItemLiveData.observe(owner, integerObjectPair -> observerCallback.notifyItem(integerObjectPair.first, integerObjectPair.second)); + removeItemLiveData.observe(owner, observerCallback::removeItem); + } + + @Override + public void loadInitial(PageKeyedDataSource.LoadInitialParams params, PageKeyedDataSource.LoadInitialCallback callback) { + refresh(); + data.clear(); + loadData(1, onResponse -> { + if (null == onResponse) { + refreshLiveData.postValue(RefreshResult.FAILED); + } else if (onResponse.isEmpty()) { + refreshLiveData.postValue(RefreshResult.NO_DATA); + } else if (onResponse.size() < pageSize()) { + data.addAll(onResponse); + callback.onResult(onResponse, null, null); + refreshLiveData.postValue(RefreshResult.NO_MORE); + } else { + data.addAll(onResponse); + callback.onResult(onResponse, null, 2); + refreshLiveData.postValue(RefreshResult.SUCCEED); + } + + }); + } + + @Override + public void loadAfter(PageKeyedDataSource.LoadParams params, PageKeyedDataSource.LoadCallback callback) { + loadMore(); + loadData(params.key, onResponse -> { + if (null == onResponse) loadMoreLiveData.postValue(RefreshResult.FAILED); + else if (onResponse.size() < pageSize()) { + data.addAll(onResponse); + callback.onResult(onResponse, null); + loadMoreLiveData.postValue(RefreshResult.NO_MORE); + } else { + data.addAll(onResponse); + callback.onResult(onResponse, params.key + 1); + loadMoreLiveData.postValue(RefreshResult.SUCCEED); + } + + }); + } + + public void setData(List data) { + this.data.clear(); + this.data.addAll(data); + refreshLiveData.postValue(RefreshResult.SUCCEED); + } + + public ArrayList getData() { + return data; + } + + public void notifyItem(int position) { + notifyItemLiveData.postValue(new Pair<>(position, null)); + } + + public void notifyItem(int position, Object payload) { + notifyItemLiveData.postValue(new Pair<>(position, payload)); + } + + public void removeItem(int position) { + removeItemLiveData.postValue(position); + } + + @Override + public void refresh() { + + } + + @Override + public void loadMore() { + + } + + public abstract void loadData(int page, Response onResponse); + +} + + diff --git a/base/src/main/java/com/xuqm/base/viewmodel/BaseViewModel.java b/base/src/main/java/com/xuqm/base/viewmodel/BaseViewModel.java new file mode 100644 index 0000000..ef3a0a9 --- /dev/null +++ b/base/src/main/java/com/xuqm/base/viewmodel/BaseViewModel.java @@ -0,0 +1,67 @@ +package com.xuqm.base.viewmodel; + +import androidx.annotation.NonNull; +import androidx.lifecycle.DefaultLifecycleObserver; +import androidx.lifecycle.LifecycleOwner; +import androidx.lifecycle.ViewModel; + +import com.xuqm.base.common.LogHelper; + +import io.reactivex.disposables.CompositeDisposable; +import io.reactivex.disposables.Disposable; + +/** + * ViewModel 基类 + */ +public abstract class BaseViewModel extends ViewModel implements DefaultLifecycleObserver { + private final String TAG = getClass().getSimpleName(); + protected CompositeDisposable compositeDisposable = new CompositeDisposable(); + + /** + * Disposable 的管理,自动处理网络请求 + * + * @param d Disposable + */ + protected void add(Disposable d) { + compositeDisposable.add(d); + } + + @Override + public void onCreate(@NonNull LifecycleOwner owner) { + LogHelper.d(TAG, "onCreate"); + } + + @Override + public void onStart(@NonNull LifecycleOwner owner) { + LogHelper.d(TAG, "onStart"); + } + + @Override + public void onResume(@NonNull LifecycleOwner owner) { + LogHelper.d(TAG, "onResume"); + } + + @Override + public void onPause(@NonNull LifecycleOwner owner) { + LogHelper.d(TAG, "onPause"); + } + + @Override + public void onStop(@NonNull LifecycleOwner owner) { + LogHelper.d(TAG, "onStop"); + } + + @Override + public void onDestroy(@NonNull LifecycleOwner owner) { + LogHelper.d(TAG, "onDestroy"); + } + + @Override + protected void onCleared() { + super.onCleared(); + LogHelper.d(TAG, "onCleared"); + if (!compositeDisposable.isDisposed()) { + compositeDisposable.dispose(); + } + } +} diff --git a/base/src/main/java/com/xuqm/base/viewmodel/callback/AdapterObserverCallback.java b/base/src/main/java/com/xuqm/base/viewmodel/callback/AdapterObserverCallback.java new file mode 100644 index 0000000..4b51f4b --- /dev/null +++ b/base/src/main/java/com/xuqm/base/viewmodel/callback/AdapterObserverCallback.java @@ -0,0 +1,7 @@ +package com.xuqm.base.viewmodel.callback; + +public interface AdapterObserverCallback { + void notifyItem(int position, Object payload); + + void removeItem(int position); +} diff --git a/base/src/main/java/com/xuqm/base/viewmodel/callback/DataObserverCallback.java b/base/src/main/java/com/xuqm/base/viewmodel/callback/DataObserverCallback.java new file mode 100644 index 0000000..bc28aae --- /dev/null +++ b/base/src/main/java/com/xuqm/base/viewmodel/callback/DataObserverCallback.java @@ -0,0 +1,13 @@ +package com.xuqm.base.viewmodel.callback; + +import androidx.paging.PagedList; + +import com.xuqm.base.common.RefreshResult; + +public interface DataObserverCallback { + void data(PagedList data); + + void refreshResult(RefreshResult refreshResult); + + void loadMoreResult(RefreshResult refreshResult); +} diff --git a/base/src/main/java/com/xuqm/base/viewmodel/callback/Response.java b/base/src/main/java/com/xuqm/base/viewmodel/callback/Response.java new file mode 100644 index 0000000..1956357 --- /dev/null +++ b/base/src/main/java/com/xuqm/base/viewmodel/callback/Response.java @@ -0,0 +1,7 @@ +package com.xuqm.base.viewmodel.callback; + +import java.util.ArrayList; + +public interface Response { + void onResponse(ArrayList onResponse); +} diff --git a/base/src/main/java/com/xuqm/base/web/XAndroidInterface.kt b/base/src/main/java/com/xuqm/base/web/XAndroidInterface.kt new file mode 100644 index 0000000..1d19ea2 --- /dev/null +++ b/base/src/main/java/com/xuqm/base/web/XAndroidInterface.kt @@ -0,0 +1,41 @@ +package com.xuqm.base.web + +import android.content.Context +import android.webkit.JavascriptInterface +import com.xuqm.base.common.AppManager +import com.xuqm.base.common.ToolsHelper +import com.xuqm.base.extensions.log + +class XAndroidInterface constructor(val mContext: Context, val viewModel: XWebViewModel) { + @JavascriptInterface + fun showToast(callBackId: String, toast: String) { + ToolsHelper.showMessage(toast) + viewModel.callBackSuccess(callBackId) + } + + @JavascriptInterface + fun setTitle(callBackId: String, title: String) { + viewModel.setTitle(title) + viewModel.callBackSuccess(callBackId) + } + + @JavascriptInterface + fun scan(callBackId: String) { + viewModel.scan(callBackId) + } + + @JavascriptInterface + fun closed() { + AppManager.getInstance().finish() + } + + @JavascriptInterface + fun setTopMenu(callBackId: String, date: String) { + date.split(",").log() + viewModel.setTopMenu(callBackId,date.split(",")) + } + @JavascriptInterface + fun getUserInfo(callBackId: String) { + viewModel.getUserInfo(callBackId) + } +} \ No newline at end of file diff --git a/base/src/main/java/com/xuqm/base/web/XWebCallBack.kt b/base/src/main/java/com/xuqm/base/web/XWebCallBack.kt new file mode 100644 index 0000000..5a26258 --- /dev/null +++ b/base/src/main/java/com/xuqm/base/web/XWebCallBack.kt @@ -0,0 +1,25 @@ +package com.xuqm.base.web + +import android.webkit.WebView +import com.xuqm.base.App +import com.xuqm.base.common.GsonImplHelp +import com.xuqm.base.extensions.log + +class XWebCallBack(val webView: WebView) { + fun error(callBackId: String, msg: String) { + sendCallBack(XWebJsCallModel(callBackId, -1, msg, null)) + } + + fun success(callBackId: String, data: Any?) { + sendCallBack(XWebJsCallModel(callBackId, 0, null, data)) + } + + private fun sendCallBack(model: XWebJsCallModel) { + App.getInstance().runOnUiThread { + GsonImplHelp.get().toJson(model).log() + webView.loadUrl( + "javascript:__callbackMessageFromNative("+GsonImplHelp.get().toJson(model)+")" + ) + } + } +} \ No newline at end of file diff --git a/base/src/main/java/com/xuqm/base/web/XWebChromeClient.kt b/base/src/main/java/com/xuqm/base/web/XWebChromeClient.kt new file mode 100644 index 0000000..f1c19d0 --- /dev/null +++ b/base/src/main/java/com/xuqm/base/web/XWebChromeClient.kt @@ -0,0 +1,115 @@ +package com.xuqm.base.web + +import android.Manifest +import android.net.Uri +import android.webkit.* +import com.bigkoo.alertview.AlertView +import com.xuqm.base.App +import com.xuqm.base.extensions.log +import com.xuqm.base.extensions.loge +import com.xuqm.base.extensions.runWithPermission + + +class XWebChromeClient(val mContext: XWebViewActivity, val viewModel: XWebViewModel) : + WebChromeClient() { + + override fun onProgressChanged(view: WebView?, newProgress: Int) { + super.onProgressChanged(view, newProgress) + viewModel.setProgress(newProgress) + } + + override fun onJsAlert( + view: WebView, + url: String, + message: String, + result: JsResult + ): Boolean { + App.getInstance().runOnUiThread { + + AlertView( + "", message, null, arrayOf("Confirm"), null, mContext, + AlertView.Style.Alert + ) { _, _ -> + result.confirm() + }.show() + } + return true + } + + override fun onJsConfirm( + view: WebView, + url: String, + message: String, + result: JsResult + ): Boolean { + AlertView( + "", message, null, arrayOf("Confirm", "Cancel"), null, mContext, + AlertView.Style.Alert + ) { _, position -> + when (position) { + 0 -> result.confirm() + 1 -> result.cancel() + } + }.show() + return true + } + + override fun onShowFileChooser( + webView: WebView, + filePathCallback: ValueCallback>, + fileChooserParams: FileChooserParams + ): Boolean { + var types = "*/*" + if (fileChooserParams.acceptTypes.isNotEmpty()) + types = if (fileChooserParams.acceptTypes[0].contains("image")) + "image/*" + else "*/*" + mContext.selectedFile(types, filePathCallback) + return true + } + + override fun onGeolocationPermissionsShowPrompt( + origin: String?, + callback: GeolocationPermissions.Callback + ) { + + mContext.runWithPermission( + Manifest.permission.ACCESS_COARSE_LOCATION, + Manifest.permission.ACCESS_FINE_LOCATION, + ) { + + AlertView( + "定位权限", + "当前页面需要获取定位权限", + null, + arrayOf("Confirm", "Cancel"), + null, + mContext, + AlertView.Style.Alert + ) { _, position -> + when (position) { + 0 -> callback.invoke(origin, true, true) + 1 -> callback.invoke(origin, false, true) + } + super.onGeolocationPermissionsShowPrompt(origin, callback) + }.show() + + } + } + + override fun onGeolocationPermissionsHidePrompt() { + "onGeolocationPermissionsHidePrompt".loge() + super.onGeolocationPermissionsHidePrompt() + } + + override fun onPermissionRequest(request: PermissionRequest) { + "onPermissionRequest".loge() + request.grant(request.resources) + } + + override fun onPermissionRequestCanceled(request: PermissionRequest?) { + "onPermissionRequestCanceled".loge() + request?.loge() + super.onPermissionRequestCanceled(request) + } +} \ No newline at end of file diff --git a/base/src/main/java/com/xuqm/base/web/XWebJsCallModel.kt b/base/src/main/java/com/xuqm/base/web/XWebJsCallModel.kt new file mode 100644 index 0000000..307d80d --- /dev/null +++ b/base/src/main/java/com/xuqm/base/web/XWebJsCallModel.kt @@ -0,0 +1,8 @@ +package com.xuqm.base.web + +data class XWebJsCallModel( + val callBackId: String, + val status: Int, + val errMsg: String?, + val data: Any? +) diff --git a/base/src/main/java/com/xuqm/base/web/XWebViewActivity.kt b/base/src/main/java/com/xuqm/base/web/XWebViewActivity.kt new file mode 100644 index 0000000..6e7f347 --- /dev/null +++ b/base/src/main/java/com/xuqm/base/web/XWebViewActivity.kt @@ -0,0 +1,237 @@ +package com.xuqm.base.web + +import android.Manifest +import android.annotation.SuppressLint +import android.app.DownloadManager +import android.content.Intent +import android.net.Uri +import android.os.Bundle +import android.view.View +import android.webkit.URLUtil +import android.webkit.ValueCallback +import androidx.lifecycle.ViewModelProvider +import com.bigkoo.alertview.AlertView +import com.huawei.hms.hmsscankit.ScanUtil +import com.huawei.hms.ml.scan.HmsScan +import com.luck.picture.lib.basic.PictureSelector +import com.luck.picture.lib.config.SelectMimeType +import com.luck.picture.lib.config.SelectModeConfig +import com.luck.picture.lib.entity.LocalMedia +import com.luck.picture.lib.interfaces.OnResultCallbackListener +import com.xuqm.base.R +import com.xuqm.base.common.FileHelper +import com.xuqm.base.common.GlideEngine +import com.xuqm.base.common.LogHelper +import com.xuqm.base.databinding.ActivityXWebviewBinding +import com.xuqm.base.extensions.loge +import com.xuqm.base.extensions.runWithPermission +import com.xuqm.base.extensions.showMessage +import com.xuqm.base.ui.BaseActivity +import java.io.File + + +class XWebViewActivity : BaseActivity() { + private lateinit var title: String + private lateinit var url: String + private var hasTopBar: Boolean = true + + + private lateinit var viewModel: XWebViewModel + + override fun getLayoutId(): Int = R.layout.activity_x_webview + + @SuppressLint("SetJavaScriptEnabled") + override fun initView(savedInstanceState: Bundle?) { + super.initView(savedInstanceState) + LogHelper.e("initView") + showBack(false) + intent?.apply { + hasTopBar = getBooleanExtra("hasTopBar", true) + } + if (hasTopBar) { + showBack(true) + } + + viewModel = ViewModelProvider(this)[XWebViewModel::class.java] + + viewModel.activity = this + viewModel.callBack = XWebCallBack(binding.XWebView) + + binding.XWebView.webChromeClient = XWebChromeClient(this, viewModel) + binding.XWebView.webViewClient = XWebViewClient() + binding.XWebView.clearCache(true) + binding.XWebView.settings.javaScriptEnabled = true + binding.XWebView.settings.setGeolocationEnabled(true) + binding.XWebView.settings.domStorageEnabled = true + binding.XWebView.settings.mediaPlaybackRequiresUserGesture = false; + + binding.XWebView.addJavascriptInterface( + XAndroidInterface(mContext, viewModel), + "ZHHBAndroid" + ) + binding.XWebView.setDownloadListener { url, _, contentDisposition, mimeType, _ -> + + downloadBySystem(url, contentDisposition, mimeType) + } + } + + override fun fullscreen(): Boolean { + return false + } + + override fun initData() { + super.initData() + LogHelper.e("initData") + intent?.apply { + title = getStringExtra("title") ?: "" + url = getStringExtra("url") ?: "" + } + + viewModel.title.observe(this) { +// if(ToolsHelper.isNull(it)){ +// baseBinding.baseToolbar.visibility=View.GONE +// }else{ +// baseBinding.baseToolbar.visibility=View.VISIBLE + setTitleText(it) +// } + } + viewModel.progress.observe(this) { + binding.XProgressBar.progress = it + if (it > 90) { + binding.XProgressBar.visibility = View.GONE + } else { + binding.XProgressBar.visibility = View.VISIBLE + } + } + + } + + override fun lateInitView() { + super.lateInitView() + LogHelper.e("lateInitView") + LogHelper.e(url) + setTitleText(title) + binding.XWebView.loadUrl(url) + + } + + override fun backBtnPressed() { + if (binding.XWebView.canGoBack()) { + binding.XWebView.goBack() + } else finish() + } + + override fun onBackPressed() { + if (binding.XWebView.canGoBack()) { + binding.XWebView.goBack() + } else finish() + } + + private lateinit var filePathCallback: ValueCallback> + + fun selectedFile(types: String, back: ValueCallback>) { + filePathCallback = back + + if (types.contains("image")) { + runWithPermission( + Manifest.permission.CAMERA, + rationaleMethod = { + "无法获取相关权限".showMessage() + back.onReceiveValue(null) + }, + permanentDeniedMethod = { + "请在设置界面开放对应权限".showMessage() + back.onReceiveValue(null) + }, + callback = { + PictureSelector.create(this) + .openGallery(SelectMimeType.ofImage()) + .setImageEngine(GlideEngine.createGlideEngine()) + .setSelectionMode(SelectModeConfig.SINGLE) + .forResult(object : OnResultCallbackListener { + override fun onResult(result: ArrayList) { + val results = + result.map { FileHelper.getFileUri(File(it.realPath)) } + back.onReceiveValue(results.toTypedArray()) + } + + override fun onCancel() { + back.onReceiveValue(null) + } + }) + + }) + } else { + val intent = Intent(Intent.ACTION_OPEN_DOCUMENT).apply { + addCategory(Intent.CATEGORY_OPENABLE) + type = types + } + mContext.startActivityForResult(intent, 10012) + } + + } + + override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { + super.onActivityResult(requestCode, resultCode, data) + + if (requestCode == 10012) { + if (resultCode == RESULT_OK) { + data?.data?.also { uri -> + filePathCallback.onReceiveValue(arrayOf(uri)) + } + } else { + filePathCallback.onReceiveValue(emptyArray()) + } + } else if (requestCode == 1111) { + + + if (resultCode == RESULT_OK) { + val obj: HmsScan? = data?.getParcelableExtra(ScanUtil.RESULT) + if (obj != null) { + viewModel.backScan(obj.originalValue) + } else { + viewModel.backScanError() + } + } else { + viewModel.backScan("Cancel") + } + + } + + } + + private fun downloadBySystem(url: String, contentDisposition: String, mimeType: String) { + val request = DownloadManager.Request(Uri.parse(url)) + + val fileName: String = URLUtil.guessFileName(url, contentDisposition, mimeType) + fileName.loge() + +// request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE) + // 设置通知栏的标题,如果不设置,默认使用文件名 +// request.setTitle(BuildConfig.APP_Name); + // 设置通知栏的描述 + request.setDescription("正在下载文件:${fileName}"); + // 允许在计费流量下下载 + request.setAllowedOverMetered(false) + // 允许该记录在下载管理界面可见 + request.setVisibleInDownloadsUi(true) + // 允许漫游时下载 + request.setAllowedOverRoaming(true) + // 允许下载的网路类型 + request.setAllowedNetworkTypes(DownloadManager.Request.NETWORK_WIFI) + // 设置下载文件保存的路径和文件名 + val file = File(FileHelper.getDownloadPath(), fileName) + request.setDestinationUri(Uri.fromFile(file)) + val downloadManager = getSystemService(DOWNLOAD_SERVICE) as DownloadManager + // 添加一个下载任务 + val downloadId = downloadManager.enqueue(request) + downloadId.loge() + + AlertView( + "", "当前文件已经开始下载,请查看通知栏下载进度", null, arrayOf("Confirm"), null, mContext, + AlertView.Style.Alert + ) { _, _ -> + }.show() + } + +} \ No newline at end of file diff --git a/base/src/main/java/com/xuqm/base/web/XWebViewClient.kt b/base/src/main/java/com/xuqm/base/web/XWebViewClient.kt new file mode 100644 index 0000000..8c45381 --- /dev/null +++ b/base/src/main/java/com/xuqm/base/web/XWebViewClient.kt @@ -0,0 +1,19 @@ +package com.xuqm.base.web + +import android.webkit.WebResourceRequest +import android.webkit.WebView +import android.webkit.WebViewClient +import com.xuqm.base.common.LogHelper + +class XWebViewClient : WebViewClient() { + override fun onPageFinished(view: WebView?, url: String?) { + super.onPageFinished(view, url) + LogHelper.e(url) + } + + override fun shouldOverrideUrlLoading(view: WebView?, request: WebResourceRequest?): Boolean { + LogHelper.e(request?.toString()) + return false + } + +} \ No newline at end of file diff --git a/base/src/main/java/com/xuqm/base/web/XWebViewHelper.kt b/base/src/main/java/com/xuqm/base/web/XWebViewHelper.kt new file mode 100644 index 0000000..f21737d --- /dev/null +++ b/base/src/main/java/com/xuqm/base/web/XWebViewHelper.kt @@ -0,0 +1,22 @@ +package com.xuqm.base.web + +import android.content.Context +import android.content.Intent + +object XWebViewHelper { + fun startWebWithTopBar(context: Context, url: String, title: String?) { + val intent: Intent = Intent(context, XWebViewActivity::class.java).apply { + title?.let { putExtra("title", title) } + putExtra("url", url) + putExtra("hasTopBar", true) + } + context.startActivity(intent) + } + fun startWebNoTopBar(context: Context, url: String) { + val intent: Intent = Intent(context, XWebViewActivity::class.java).apply { + putExtra("url", url) + putExtra("hasTopBar", false) + } + context.startActivity(intent) + } +} \ No newline at end of file diff --git a/base/src/main/java/com/xuqm/base/web/XWebViewModel.kt b/base/src/main/java/com/xuqm/base/web/XWebViewModel.kt new file mode 100644 index 0000000..ba06a27 --- /dev/null +++ b/base/src/main/java/com/xuqm/base/web/XWebViewModel.kt @@ -0,0 +1,128 @@ +package com.xuqm.base.web + +import android.Manifest +import android.annotation.SuppressLint +import android.view.View +import androidx.lifecycle.LiveData +import androidx.lifecycle.MutableLiveData +import com.bigkoo.alertview.AlertView +import com.huawei.hms.hmsscankit.ScanUtil +import com.huawei.hms.ml.scan.HmsScan +import com.huawei.hms.ml.scan.HmsScanAnalyzerOptions +import com.xuqm.base.App +import com.xuqm.base.extensions.getStringForPreferences +import com.xuqm.base.extensions.log +import com.xuqm.base.extensions.runWithPermission +import com.xuqm.base.extensions.showMessage +import com.xuqm.base.viewmodel.BaseViewModel +import com.xuqm.base.common.SHARE_UESR_NAME + +class XWebViewModel : BaseViewModel() { + lateinit var callBack: XWebCallBack + + @SuppressLint("StaticFieldLeak") + lateinit var activity: XWebViewActivity + + private val _title = MutableLiveData() + val title: LiveData = _title + + fun setTitle(title: String) { + _title.postValue(title) + } + + private lateinit var callId: String + fun scan(callBackId: String) { + callId = callBackId + + App.getInstance().runOnUiThread { + activity.runWithPermission( + Manifest.permission.CAMERA, + rationaleMethod = { + "无法获取相关权限".showMessage() + callBackError(callId, "没有相关权限") + }, + permanentDeniedMethod = { + "请在设置界面开放对应权限".showMessage() + callBackError(callId, "没有相关权限") + }, + callback = { + ScanUtil.startScan( + activity, 1111, HmsScanAnalyzerOptions.Creator().setHmsScanTypes( + HmsScan.QRCODE_SCAN_TYPE + ).create() + ); + }) + } + + } + + fun backScan(msg: String) { + callBackSuccess(callId, msg) + } + + fun backScanError() { + callBackError(callId, "扫码失败") + } + + private val _progress = MutableLiveData().also { it.postValue(0) } + val progress: LiveData = _progress + + fun setProgress(progress: Int) { + _progress.postValue(progress) + } + + fun callBackSuccess(id: String) { + if (this::callBack.isInitialized) { + callBack.success(id, null) + } + } + + fun callBackSuccess(id: String, data: Any) { + if (this::callBack.isInitialized) { + callBack.success(id, data) + } + } + + fun callBackError(id: String, data: String) { + if (this::callBack.isInitialized) { + callBack.error(id, data) + } + } + + + fun getUserInfo(callBackId: String) { + if (this::callBack.isInitialized) { + callBack.success(callBackId, activity.getStringForPreferences(SHARE_UESR_NAME)) + } + } + + lateinit var v: AlertView + + fun setTopMenu(id: String, date: List) { + "================>".log() + App.getInstance().runOnUiThread { + if (date.isNotEmpty()) { + activity.baseBinding.baseToolbar.toolbarMenu.visibility = View.VISIBLE + activity.baseBinding.baseToolbar.toolbarMenu.setOnClickListener { + v = AlertView( + "请选择需要操作的内容", "", null, date.toTypedArray(), null, activity, + AlertView.Style.ActionSheet + ) { _, position -> + selected(id, position) + } + v.show() + } + } else { + activity.baseBinding.baseToolbar.toolbarMenu.visibility = View.GONE + } + } + } + + private fun selected(callBackId: String, data: Int) { + v.dismissImmediately() + if (this::callBack.isInitialized) { + callBack.success(callBackId, data) + } + } + +} \ No newline at end of file diff --git a/base/src/main/java/com/xuqm/base/webSocket/ConnectStatus.java b/base/src/main/java/com/xuqm/base/webSocket/ConnectStatus.java new file mode 100644 index 0000000..58c3830 --- /dev/null +++ b/base/src/main/java/com/xuqm/base/webSocket/ConnectStatus.java @@ -0,0 +1,9 @@ +package com.xuqm.base.webSocket; + +public enum ConnectStatus { + Connecting, // the initial state of each web socket. + Open, // the web socket has been accepted by the remote peer + Closing, // one of the peers on the web socket has initiated a graceful shutdown + Closed, // the web socket has transmitted all of its messages and has received all messages from the peer + Canceled // the web socket connection failed +} \ No newline at end of file diff --git a/base/src/main/java/com/xuqm/base/webSocket/WebSocketCallBack.java b/base/src/main/java/com/xuqm/base/webSocket/WebSocketCallBack.java new file mode 100644 index 0000000..7d14f3c --- /dev/null +++ b/base/src/main/java/com/xuqm/base/webSocket/WebSocketCallBack.java @@ -0,0 +1,11 @@ +package com.xuqm.base.webSocket; + +public interface WebSocketCallBack { + void onClose(); + + void onConnectError(Throwable t); + + void onMessage(String message); + + void onOpen(); +} diff --git a/base/src/main/java/com/xuqm/base/webSocket/WebSocketHandler.java b/base/src/main/java/com/xuqm/base/webSocket/WebSocketHandler.java new file mode 100644 index 0000000..63be659 --- /dev/null +++ b/base/src/main/java/com/xuqm/base/webSocket/WebSocketHandler.java @@ -0,0 +1,171 @@ +package com.xuqm.base.webSocket; + +import androidx.annotation.Nullable; + +import com.xuqm.base.common.LogHelper; + +import java.util.HashMap; +import java.util.Map; + +import okhttp3.OkHttpClient; +import okhttp3.Request; +import okhttp3.Response; +import okhttp3.WebSocket; +import okhttp3.WebSocketListener; +import okio.ByteString; + +public class WebSocketHandler extends WebSocketListener { + private static final String TAG = "WebSocketHandler "; + + private boolean log = false; + + private String wsUrl; + + private WebSocket webSocket; + + private ConnectStatus status; + + private OkHttpClient client = new OkHttpClient.Builder() + .build(); + + private WebSocketHandler(String wsUrl) { + this.wsUrl = wsUrl; + } + + private static WebSocketHandler INST; + + public static WebSocketHandler getInstance(String url) { + if (INST == null) { + synchronized (WebSocketHandler.class) { + INST = new WebSocketHandler(url); + } + } + + return INST; + } + + public void setLog(boolean log) { + this.log = log; + } + + public ConnectStatus getStatus() { + return status; + } + + private Map headers = new HashMap<>(); + + public void addHeader(String name, String value) { + headers.put(name, value); + } + + public void connect() { + //构造request对象 + Request.Builder builder = new Request.Builder() + .url(wsUrl); + for (String key : headers.keySet()) { + builder.addHeader(key, headers.get(key)); + } + Request request = builder.build(); + webSocket = client.newWebSocket(request, this); + status = ConnectStatus.Connecting; + } + + public void reConnect() { + if (webSocket != null) { + webSocket = client.newWebSocket(webSocket.request(), this); + } + } + + public void send(String text) { + if (webSocket != null) { + if (this.log) + LogHelper.d("send: " + text); + webSocket.send(text); + if (mSocketIOCallBack != null) { + mSocketIOCallBack.onMessage(text); + } + } + } + + public void cancel() { + if (webSocket != null) { + webSocket.cancel(); + } + } + + public void close() { + if (webSocket != null) { + webSocket.close(1000, null); + } + } + + @Override + public void onOpen(WebSocket webSocket, Response response) { + super.onOpen(webSocket, response); + if (this.log) + LogHelper.d("onOpen"); + this.status = ConnectStatus.Open; + if (mSocketIOCallBack != null) { + mSocketIOCallBack.onOpen(); + } + } + + @Override + public void onMessage(WebSocket webSocket, String text) { + super.onMessage(webSocket, text); + if (this.log) + LogHelper.d("onMessage: " + text); + if (mSocketIOCallBack != null) { + mSocketIOCallBack.onMessage(text); + } + } + + @Override + public void onMessage(WebSocket webSocket, ByteString bytes) { + super.onMessage(webSocket, bytes); + } + + @Override + public void onClosing(WebSocket webSocket, int code, String reason) { + super.onClosing(webSocket, code, reason); + this.status = ConnectStatus.Closing; + if (this.log) + LogHelper.d("onClosing"); + } + + @Override + public void onClosed(WebSocket webSocket, int code, String reason) { + super.onClosed(webSocket, code, reason); + if (this.log) + LogHelper.d("onClosed"); + this.status = ConnectStatus.Closed; + if (mSocketIOCallBack != null) { + mSocketIOCallBack.onClose(); + } + } + + @Override + public void onFailure(WebSocket webSocket, Throwable t, @Nullable Response response) { + super.onFailure(webSocket, t, response); + if (this.log) + LogHelper.d("onFailure: " + t.toString()); + t.printStackTrace(); + this.status = ConnectStatus.Canceled; + if (mSocketIOCallBack != null) { + mSocketIOCallBack.onConnectError(t); + } + } + + + private WebSocketCallBack mSocketIOCallBack; + + public WebSocketHandler setSocketIOCallBack(WebSocketCallBack callBack) { + mSocketIOCallBack = callBack; + return this; + } + + public void removeSocketIOCallBack() { + mSocketIOCallBack = null; + } +} + diff --git a/base/src/main/res/drawable-hdpi/ic_arrow.png b/base/src/main/res/drawable-hdpi/ic_arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..f7f8fe5e53ccbb96fb7a3dc23650848964f691cf GIT binary patch literal 630 zcmV-+0*U>JP)(zH5%ELrL?J#AAThM^)~|GKV|K zth;MYwR5!(m{xRPnZ9qo%g$=oh$PQ!1lUs}a|{@b2&cYX-S*M^6pO=!%&)+$WI)@^ zUK`Q|*v$il6z6O#B0S4hHQCvo(*=8u7WKWRaN^TAT2W#B)IzHV9lwgj- zXoBTk{Q%B31|^uE_slFazv#`R<$o{9a~e(tRH1#JF) QsQ>@~07*qoM6N<$f`hvsUH||9 literal 0 HcmV?d00001 diff --git a/base/src/main/res/drawable-mdpi/ic_arrow.png b/base/src/main/res/drawable-mdpi/ic_arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..d4425e1ddc56cdd99bb1b9b31caaef305320e61d GIT binary patch literal 377 zcmV-<0fzpGP)d5#dzY`) zZfs3^ZMJnc*La>a=Xl4O;v0|cHee7qR5jjqJ8%KC0*_w`wmX1xpd~(h`Ke&L6F38Y z1bh$lR}^e_1>79)T@jWZa)Rw{;1p;I_)oxpv-JnT_RoMD1HKLTUn!h-!S*lU1Zarj z4KN_-F-@{4*zN_6f%+(32mDkXyKMIXM?hT^uL6FqG^0#-Ng8|rdL;e-Y@nHN01O9U zU{ccNS3)hY4-6$zLDG7~BSq6Sz+Tx-(~?$mO_yHS&ZHe+B-v?3(n>DYM9N~`21XNU zR?>2AaAndKFqTO3l78oYjWQ`qYCJj4f~3W2_hAE=NTj*%+_*JhDx}w{Ld3oV6oB0~ XjofqzTgI|v00000NkvXXu0mjfUPPQ% literal 0 HcmV?d00001 diff --git a/base/src/main/res/drawable-xhdpi/ic_arrow.png b/base/src/main/res/drawable-xhdpi/ic_arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..5f149209c3c2c5f99a966b44d6498e8ea18b719b GIT binary patch literal 691 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 literal 0 HcmV?d00001 diff --git a/base/src/main/res/drawable-xxhdpi/ic_back_arrow.png b/base/src/main/res/drawable-xxhdpi/ic_back_arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..639cc47bd587447a9a8e2b42a062b7651eb36cb6 GIT binary patch literal 249 zcmeAS@N?(olHy`uVBq!ia0vp^f)-6oVt4(Gfs{#7ctv zf*Cl4rO&E7xW4o8?TZR~CHM~<)ci2R>@}ldEl`E8r;B5V#`&!mJoy?F1Y9nLi4r@c(ce;}K?)2RjQ&4A*|^b`r}J>=m1r gndQ4(fb}!efp9i?(+45OK!X`PUHx3vIVCg!086An)Bpeg literal 0 HcmV?d00001 diff --git a/base/src/main/res/drawable-xxhdpi/ic_orange_arrow_down.png b/base/src/main/res/drawable-xxhdpi/ic_orange_arrow_down.png new file mode 100644 index 0000000000000000000000000000000000000000..dfaae6a04f531672337c92152ed4d504a4935c19 GIT binary patch literal 1224 zcmeAS@N?(olHy`uVBq!ia0vp^4nSG?WUP)qwZeFo6#1NP{E~&-IMVSR9nfZANAafIw@=Hr>m6Sjh!2!gb zC7EdmoAQdG-U511A0(r1sAr%LHyfzc1|(|bUzC{&v>9Z+ouLg_C5jl-9vgj-WFZw za*K&=PF&KN_O3;-can;tl&WXYl&Tq(n?Ed16H8gBd6Z3)E7eeY;}luxlQQ=|KRZ`a zzkKD)>id=DV(-ge?JKU^U;Xb--TcpcpWkDTFl2H&z#+k?oWRo4AZUPt<1krZLPX^* z7J19-ZgKS&x~2vlJReb<{=BeZfi&~h`1-}H*-z~DrT%`Bx&6sY8|V1>d-Su$o+_-}@K5X3`@4=he1CTO z%+sH)`TKI#1cisQ_@}II5aex$pS}BIYhzwep~ae~3x6CdO_=!U{G|m=dK+F>UX8tQ z`pN23;TJl%4jeylz%Gz;cBl=X^o6$R>-yE5`xS5o?Q@qOG~Op0 z#k}80^Y`PDI{|(NBUiH7U0pciq5*^5oLii4H#oPd-8j1aFvnB_|DVClo9umVw(qW) zxaoS~SZd`k(b>%G5pa^?o7~)cEH8YQM2B zdNZs42kz=riT`Tv&0T#tj#uc}Jinb#7p#)wDTOnIoiS|uzs|dRUAa~6P6iG?WUP)qwZeFo6#1NP{E~&-IMVSR9nfZANAafIw@=Hr>m6Sjh!2!gb zC7EdmoAQdG-U511A0(r1sAr%LHyfzc1|(|bUzC{&v>9Z+ouLg_C5jl-9vgj-+gT=?ftx|K~GSC5j)bD+c5utpM6Jo9fR}I{B391@@9X0 za(ExV^@Ua`n{(Hj;|q%`=F}{1VzlNu=WW#Mzpwd`_C#1*}L*%tfAH#41K{vV6a`%;U(uL%0n^YP+| z_};k{=c1$k$t}0|pKD>iG}ept!^>VnPwjh&71|$XN^I}Bf1@>S+o^2ja}Rs>_e?%E z{f0*zW6j*&4eQ^tR`zXp{+@lGubOtExm7WT?ZF3y>*~dSOq$`T-H>X($8*o|2*Hmt zrNRzbG0u6It5McEwLquyk%Gr2u7sQ6k%um;?K^C7|Mm9X^$iETZXEtE5iaq*W9GYp zDIe`5;+IThVK^E-<4w$j)3SCyXE(0j@KQfX|9tEBp6UZSw+ z&WxfDGoCb>XVvIR^xQpqLw@I$+dAbIN4$O{)#yqEraRO*wLfZHDe}nJR^(@Q=!C5Y z%NL)2ym_N?j|Rh^+;XKG)w6mFY(Kcpd?#3!#LF(3Vybn)UhFtiMBb6FGnW5Q{3cTW zd&%BALUkL2z8SxYvMsvQY>>OHON~iMfdKli*=Ya6b4uMaQNfL%GQrc;&t;ucLK6Th CAjg#e literal 0 HcmV?d00001 diff --git a/base/src/main/res/drawable-xxxhdpi/ic_arrow.png b/base/src/main/res/drawable-xxxhdpi/ic_arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..935be9de7f978a985ecd42cdf1a7edd8db254420 GIT binary patch literal 1483 zcmV;+1vL7JP)W*0l2!%qAb?{A^pNiW97Xc&&H+eT4ZxEC4j<9I zzXdR@QvgZ)vj7e)`ED-k3_ue9Jb*(=iuYxob^<`s8US7Za8L#DzI55x0VJ)N#2;8u zyf6Q1tN@bM2H9d9BaHlGaV)_skGKm*o6O|JEWPY5gRA_YCoulDw(t-wJ@F4U+ij8R9P@ zd28#dQAryDcpbp5LGc1`A<2dP{2Pscq>TW)0brL5@#m4eeUN`+0FpLIEx&Vy_;X3# zG0eXa07;vsmftZ${8=RL9_3#{c8h|v}F>%ZP|zSTxap8lf1u*e=Pu#woc;xGh!BhDoO8yD_J&xq-~P; zttvhF--|8&WRed@{IdWgxvzViclU|dGN(>RJ{obhPZ&Vb_DTHa!G|vea01CiLH`N2 z5P&3)?_M5w$c)$@N&Mpx=b}$#07*NgmiJ5>F^fNr)00Z7^nz-s`!u8-Jn0FEZ^0VM5_#IF~8vc)@#?C3RO0|6vCYv7i579nC5Kbxdq`o^p;fTX>X zc;{~-_A`K4&fiCztN8p6K$0_Me%YM%i`Y*|{5uinsy_b#khFhFv_{4Mki@@NRY>&u ze*h#oJM2X3TEUxrpTxf(^bfgB07!CP-V==T^bxc8nIu1qIOq5P)q^*3!EFY~ zkAnVLZU*oeeOT}=-?$h@a&gc<+sy#pRJf2_)t01||G27So!1+{E5wxoH*I~y>8H^E z9(iU30PON(8hPFg`e(Ztz#Ehg07Pe9Ph3Z~G3)k?KpIBtSoav>t?VYPc!T0Z=Bmjn z0CHBIb4Yrx+?w?+CF)rFd*kAUXvO+1=5lvmzoy++BO93BRvEOMu4Dh}NW9o|7=~?V zTvc&@&dES{E9qgnF&nj|>{JeD;4nI@c~Tb6+d@}eBIcR?c#=NERJ)DLN~C!rHxFuv z6La&Rp$JSmrA)M|FRsEw%!@`Rb03R15ArD$fda%>YXMmiC_vOvjX8znLv=)=QUnSR zuEzMq&Z&o;M)HANh!8+}v0JZ5*3yNFH<9G(j3>KjP57@=6TUYZiEso8-Kn*zeC-h^ zK)71tcfvDw#9W;}o8+BUowFlQfN1<=N@EcyK)8D2NO(0HF-PJ8lDCz0t}Oxuh}_dz zhPb%j>8!>hP=Ki8eB8vb%2AQ1Jpu&?@2$PH%sHWWImrdXAQ}TmlU=Q6L|f}ZJ(HdD zO^$>=BZ=BoB(EO}K#GJ5COPM%eVgk@Ufm1PXcy{lky{AJ#Z;9LF7SOF4*zuI%oXl4Ln$=CrB#FPYaL`8_Dod8G>D+74K)t(9v zpL7PG0O3=Nvr9rO=oCN!;t|&vMnHT4V0z~O3J`bsIPw4pi+4F|aVG&LMN66k;QX|b l^^5+Qzup6I3(2p2-QR-+)X*GO8QcH>002ovPDHLkV1j6_z*YbN literal 0 HcmV?d00001 diff --git a/base/src/main/res/drawable/dialog_style_xml_icon.xml b/base/src/main/res/drawable/dialog_style_xml_icon.xml new file mode 100644 index 0000000..ebd7e89 --- /dev/null +++ b/base/src/main/res/drawable/dialog_style_xml_icon.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/base/src/main/res/drawable/ic_baseline_close_24.xml b/base/src/main/res/drawable/ic_baseline_close_24.xml new file mode 100644 index 0000000..70db409 --- /dev/null +++ b/base/src/main/res/drawable/ic_baseline_close_24.xml @@ -0,0 +1,5 @@ + + + diff --git a/base/src/main/res/drawable/ic_load_failed.xml b/base/src/main/res/drawable/ic_load_failed.xml new file mode 100644 index 0000000..582475a --- /dev/null +++ b/base/src/main/res/drawable/ic_load_failed.xml @@ -0,0 +1,9 @@ + + + diff --git a/base/src/main/res/drawable/ic_loading.xml b/base/src/main/res/drawable/ic_loading.xml new file mode 100644 index 0000000..d83dd10 --- /dev/null +++ b/base/src/main/res/drawable/ic_loading.xml @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + + diff --git a/base/src/main/res/drawable/ic_network_unavailable.xml b/base/src/main/res/drawable/ic_network_unavailable.xml new file mode 100644 index 0000000..54771e0 --- /dev/null +++ b/base/src/main/res/drawable/ic_network_unavailable.xml @@ -0,0 +1,9 @@ + + + diff --git a/base/src/main/res/drawable/ic_no_data.xml b/base/src/main/res/drawable/ic_no_data.xml new file mode 100644 index 0000000..ddf33f6 --- /dev/null +++ b/base/src/main/res/drawable/ic_no_data.xml @@ -0,0 +1,9 @@ + + + diff --git a/base/src/main/res/drawable/ic_top_menu.xml b/base/src/main/res/drawable/ic_top_menu.xml new file mode 100644 index 0000000..8bb3fc3 --- /dev/null +++ b/base/src/main/res/drawable/ic_top_menu.xml @@ -0,0 +1,5 @@ + + + diff --git a/base/src/main/res/drawable/icon_loading.png b/base/src/main/res/drawable/icon_loading.png new file mode 100644 index 0000000000000000000000000000000000000000..382b9360f062690c58d33bf24ff67f5327c18635 GIT binary patch literal 4476 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 Lu`sSQB*y$VuH@Hb literal 0 HcmV?d00001 diff --git a/base/src/main/res/drawable/load_progress.xml b/base/src/main/res/drawable/load_progress.xml new file mode 100644 index 0000000..06f6e66 --- /dev/null +++ b/base/src/main/res/drawable/load_progress.xml @@ -0,0 +1,9 @@ + + + + \ No newline at end of file diff --git a/base/src/main/res/drawable/picture_new_item_select_bg.xml b/base/src/main/res/drawable/picture_new_item_select_bg.xml new file mode 100644 index 0000000..5df58cc --- /dev/null +++ b/base/src/main/res/drawable/picture_new_item_select_bg.xml @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/base/src/main/res/layout/activity_base.xml b/base/src/main/res/layout/activity_base.xml new file mode 100644 index 0000000..8df83d4 --- /dev/null +++ b/base/src/main/res/layout/activity_base.xml @@ -0,0 +1,16 @@ + + + + + + + + + \ No newline at end of file diff --git a/base/src/main/res/layout/activity_base_list.xml b/base/src/main/res/layout/activity_base_list.xml new file mode 100644 index 0000000..d3514a4 --- /dev/null +++ b/base/src/main/res/layout/activity_base_list.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/base/src/main/res/layout/activity_base_list_app_bar.xml b/base/src/main/res/layout/activity_base_list_app_bar.xml new file mode 100644 index 0000000..25e06a0 --- /dev/null +++ b/base/src/main/res/layout/activity_base_list_app_bar.xml @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/base/src/main/res/layout/activity_x_webview.xml b/base/src/main/res/layout/activity_x_webview.xml new file mode 100644 index 0000000..6d37225 --- /dev/null +++ b/base/src/main/res/layout/activity_x_webview.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/base/src/main/res/layout/empty_msg_view.xml b/base/src/main/res/layout/empty_msg_view.xml new file mode 100644 index 0000000..2ac56da --- /dev/null +++ b/base/src/main/res/layout/empty_msg_view.xml @@ -0,0 +1,102 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/base/src/main/res/layout/empty_view.xml b/base/src/main/res/layout/empty_view.xml new file mode 100644 index 0000000..24e37f9 --- /dev/null +++ b/base/src/main/res/layout/empty_view.xml @@ -0,0 +1,104 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/base/src/main/res/layout/item_slip.xml b/base/src/main/res/layout/item_slip.xml new file mode 100644 index 0000000..13fb8be --- /dev/null +++ b/base/src/main/res/layout/item_slip.xml @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/base/src/main/res/layout/loading_circle_process_dialog_icon.xml b/base/src/main/res/layout/loading_circle_process_dialog_icon.xml new file mode 100644 index 0000000..d9ac540 --- /dev/null +++ b/base/src/main/res/layout/loading_circle_process_dialog_icon.xml @@ -0,0 +1,39 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/base/src/main/res/layout/loading_circle_process_dialog_icon_by_textview.xml b/base/src/main/res/layout/loading_circle_process_dialog_icon_by_textview.xml new file mode 100644 index 0000000..38e7909 --- /dev/null +++ b/base/src/main/res/layout/loading_circle_process_dialog_icon_by_textview.xml @@ -0,0 +1,45 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/base/src/main/res/layout/loading_process_dialog_icon.xml b/base/src/main/res/layout/loading_process_dialog_icon.xml new file mode 100644 index 0000000..e0f6330 --- /dev/null +++ b/base/src/main/res/layout/loading_process_dialog_icon.xml @@ -0,0 +1,26 @@ + + + + + + + + \ No newline at end of file diff --git a/base/src/main/res/layout/super_viewpager_layout.xml b/base/src/main/res/layout/super_viewpager_layout.xml new file mode 100644 index 0000000..778c474 --- /dev/null +++ b/base/src/main/res/layout/super_viewpager_layout.xml @@ -0,0 +1,8 @@ + + + diff --git a/base/src/main/res/layout/toolbar.xml b/base/src/main/res/layout/toolbar.xml new file mode 100644 index 0000000..be4dfed --- /dev/null +++ b/base/src/main/res/layout/toolbar.xml @@ -0,0 +1,88 @@ + + + + + + + + + + + + + + + + diff --git a/base/src/main/res/mipmap-hdpi/btn_back.png b/base/src/main/res/mipmap-hdpi/btn_back.png new file mode 100644 index 0000000000000000000000000000000000000000..a67482f496322849dbd712360a5d092944817f25 GIT binary patch literal 1668 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 IM6N<$f}&kZAOHXW literal 0 HcmV?d00001 diff --git a/base/src/main/res/mipmap-hdpi/home_follow.png b/base/src/main/res/mipmap-hdpi/home_follow.png new file mode 100644 index 0000000000000000000000000000000000000000..fcb91d9128d2dfbc6c7a52f39862464225134e17 GIT binary patch literal 2511 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 literal 0 HcmV?d00001 diff --git a/base/src/main/res/mipmap-hdpi/nomessage.png b/base/src/main/res/mipmap-hdpi/nomessage.png new file mode 100644 index 0000000000000000000000000000000000000000..ad491c7d90e500102e87048ee155a6f2a40754df GIT binary patch literal 12000 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 Ef{=i>lK=n! literal 0 HcmV?d00001 diff --git a/base/src/main/res/mipmap-hdpi/video_play.png b/base/src/main/res/mipmap-hdpi/video_play.png new file mode 100644 index 0000000000000000000000000000000000000000..6be37759356b4b7d88312927b5a78667d681318e GIT binary patch literal 3760 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 literal 0 HcmV?d00001 diff --git a/base/src/main/res/mipmap-mdpi/video_play.png b/base/src/main/res/mipmap-mdpi/video_play.png new file mode 100644 index 0000000000000000000000000000000000000000..92a08b6975e3b7bd281923e787427ce1318bfd6e GIT binary patch literal 1984 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 Im{G|800Z>7q5uE@ literal 0 HcmV?d00001 diff --git a/base/src/main/res/mipmap-xhdpi/video_lock.png b/base/src/main/res/mipmap-xhdpi/video_lock.png new file mode 100644 index 0000000000000000000000000000000000000000..9ab56ff026afdbb2ddde6478201fd5c7d5d42b28 GIT binary patch literal 5025 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 Dc*df* literal 0 HcmV?d00001 diff --git a/base/src/main/res/mipmap-xxhdpi/empty.png b/base/src/main/res/mipmap-xxhdpi/empty.png new file mode 100644 index 0000000000000000000000000000000000000000..63b4ca09617bb61c9530d14634c34d84c6a28cc4 GIT binary patch literal 37476 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%0Do?+>{7P$TF+0gVciI&Sfxsu~5eR(9N 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

~*i5py;rr^ZLJ+iyk;_Gj9ZI+_)_z;a+M9GhZI; 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 literal 0 HcmV?d00001 diff --git a/base/src/main/res/mipmap-xxhdpi/home_follow.png b/base/src/main/res/mipmap-xxhdpi/home_follow.png new file mode 100644 index 0000000000000000000000000000000000000000..ef059ae70ea7e8275180010f7dfd929e0c1b5d8c GIT binary patch literal 5322 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 Hu0mjf)t%AP literal 0 HcmV?d00001 diff --git a/base/src/main/res/mipmap-xxhdpi/network.png b/base/src/main/res/mipmap-xxhdpi/network.png new file mode 100644 index 0000000000000000000000000000000000000000..61c0c6d2aa616101f405779c31b3e03b2fb4a884 GIT binary patch literal 27872 zcmeEt^;4T&v~?2P-QC^2xVyUtm*Or3g1Z!VEAC$0DORLNafhPCrTEAD&D@{wKXB)n zOlBuJ@|^SRz1P}jC0b2I76p+I5dZ+7$jeD-002Pd|6cI0AD{RJBzS(j0o^rZB>;8P z#K!;tIY3@YT+7Gg%oqWzwYVtq(5v6vz))C7zl&H$JwT!?2GXl;RoFP`)v7fxH0-h^ z`rh`tQ|q(z>72oxt`xSkoE|2&G$KOXc0`PZ7W7Kf)b(ap-y!Qo4}!imEtfoPhlL$& z%ENir#rkuvz+u;xKn5hx4$1c8+K+;fOSska)-)9RxB%SXWBEdsLY5>h+*wE(mt?76 z)rVCGRGa}i0v&^M8zHbYxdeK_&mMb8iQ|Mw9G!wo+8sdk)T|6iZ|bMF83MQ+1f z2xPK}Q1I6JuWzXIe5h5>DoDWMqn!YkR_C|>EW(Cc;#u5T+%bZWb`x1eb0mu&)-0s- z5Yh%|6Pwl(gVLEsPCKvoupqF^!f-7xEii6BKH9liS9r*_epnw<7Wls@|1YcD#0_UJ z^30t2AWt1sz4a4HFk6*@0)wk_0~K{O@S5X!$>zAJbA`2~f38$@>lR8*Ye?p(D|{RK%I zp4HXv$y0r4lw=`7ElDL-g2b8iqawpf3aW>OIO>D-d6(N@5Nncc(^VZL=+zi$1xjJ@ zBYgyHM^2-c@1(|j2nh;B?B#UIs*XGw6ku&}_QaNq$x)j2k6r}lTXk!|J) z_5Q0)@L&I)I15>v{-?`g5SWazU!IyYgx`P;OqONf8UD`bo!7+cpX+S*=;*lSg$>9C z76KtXP8?7B3kcF|R<%$)?K{3m@BSs?Uu-xU%0c}Aa%yCNnZhxuiEG9;FV+blYI zqf%oyucT8xNe{Ssd_jkYX8#$bA%V*UQtWR_PgTW#uvb0zZhPkKvwkdUlTQ2wOFZSk z&)U}jmSZM_nvXjiZl`o15FwMw&Ut?z5q(OAIUBFEqN%r8a}w@(6+zL{uJ03uE^hP( zj!6NQ5&CxAfF-NhT4RwE&y)C{!Ev?Ufn}da( zrGe;#O+1mBbh}MwtoF#^FQ#c3WOK__c}F2gQ+dy>vlm;u3!KXW(A%)cdlrrBmkF9Y zXbE=o#1Ul?KfWV}n)F&(*jkzHbv|K(dtMaⅈqzS_AN)p@JoHmjiZikYNXg)0E~7 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 KqUM`%(EkDE^44+y literal 0 HcmV?d00001 diff --git a/base/src/main/res/mipmap-xxhdpi/video_lock.png b/base/src/main/res/mipmap-xxhdpi/video_lock.png new file mode 100644 index 0000000000000000000000000000000000000000..30735f02fd90674c98d43a84b48078c0aa207a0a GIT binary patch literal 9315 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%0A{eL44ha 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 WBV)+5_Vxu3u-Vx-5t{J6iT?$x3l;JJ literal 0 HcmV?d00001 diff --git a/base/src/main/res/mipmap-xxxhdpi/home_follow.png b/base/src/main/res/mipmap-xxxhdpi/home_follow.png new file mode 100644 index 0000000000000000000000000000000000000000..387074feea34631bd28977b35eedb9c2e4d28d4e GIT binary patch literal 5741 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 literal 0 HcmV?d00001 diff --git a/base/src/main/res/mipmap-xxxhdpi/honem_chat.png b/base/src/main/res/mipmap-xxxhdpi/honem_chat.png new file mode 100644 index 0000000000000000000000000000000000000000..86e80dfd3252502e35d4939fb4d274c0fd236bc8 GIT binary patch literal 5953 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 literal 0 HcmV?d00001 diff --git a/base/src/main/res/mipmap-xxxhdpi/network.png b/base/src/main/res/mipmap-xxxhdpi/network.png new file mode 100644 index 0000000000000000000000000000000000000000..ce8e7138688a999556cb253e3c5ca2d254e5ae0b GIT binary patch literal 34799 zcmeEtc)N+_kv76)6(jrA1n_#i6(tDHL~icemm)O@;xju!oSENIsVkHQu~92!J%<`{p>&VMX};^5EgVoxvRc zl5E~fKl7!d!QqdVo^AKbH?2J2r(Wt+=qcC>BmnfL4D_x!QxpJ_BgF+u|DpzDi##a) zpPN*xXf$lIe$@ZDg}4e@Kl$H3TZR6?KvJgk?${>rM)dOU&-9Rhm;ZW1v_%ZTUcf#K z?v+3P^PHf+zQ6w4J{S9iD`QxBEA`(euA+6XApf@=PXNpoIS(GR-c z-#H_uDER-U_#eyt|5g0Ia@4XG;-$GI!MY~T!CgvyF1}hu(ur`5Jm`2Hv~$b^0*WuR z2w8vrVu4%iG$)FBbY|jh5JWNLBx1bWVo85_U$O!k z$bfd}AQIqsm`DSZ(hdwb*mNBNol*e>u>zHmM>&x|%Hc(q6GP#L7dAqVx7-Dih@ESF zHoR}Q9%S&-bdnyj2LSRyz#hmU5jtE-*Wcp6tFO-jsZo?6s-CW9OI>~0oj00F;K8i> z+5D$(?bt!rj1RO0flSoeQX&{grz?TH0j~;AZrI+wSk=id%od3R*|9DSw*_>BY52QQ zih8jl9mc`$H^)DMV~?nUr9TBWiOUI2j`QB0Q4xL;wg>{l?^$=1DWU=QKw}mF{NBMY zXbHdU9TKxxt~cQ?0ZgZ-N%8$`=J`IqUY&nO8B=M<(XzyChXqD1~?#ViNx=Ha1PCa28HAYw(A{{gUw3t;rbqVyt*{{ZO_*88$g z@%k0TijXIW@n*a4Q8&Cr($ewozcwComjh>;djjaLju3a?{S|_|VTh zX_@^mCV&hjFeZ?lHNykX6SIRU&`CT#H{(0G+OyT~n07JLL$rJlF3+9pAJ7^rrw>%`{b`zh^CGE_?J5;|&#$UH= zo_?Zl=U*>x4s=dU=~Zrz#vxH6sZ%W7jzfNL{ICPyL7 z6x>VDG1ovRyx8K#y4yg(6(Vi|%}$KZg7>$o8fHRIq@kC1BD^)ZSJCV1QXqB`vA_NU z$xXxS**4}^$7nP;w+@a0cGW_M_ju@9DbIaaNWlw8r(d=U=lNZ2c{$=74t9%Z!OAGX zxDe;Egb1;ZT8bbH_FqPCc_xSZD^OSZ|G8t(%_m5YR_N(_052BQ2K~@Mf`|UwO#CSa zp@Dy6yN{%0Dl{$oC`eN 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 literal 0 HcmV?d00001 diff --git a/base/src/main/res/mipmap-xxxhdpi/nomessage.png b/base/src/main/res/mipmap-xxxhdpi/nomessage.png new file mode 100644 index 0000000000000000000000000000000000000000..cd10a2d30f52819514d07209fb81420b58b077c6 GIT binary patch literal 36104 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≪imh=1#6JnE< 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 literal 0 HcmV?d00001 diff --git a/base/src/main/res/mipmap-xxxhdpi/video_lock.png b/base/src/main/res/mipmap-xxxhdpi/video_lock.png new file mode 100644 index 0000000000000000000000000000000000000000..f481ea004e4e4ac7124744f62d0cd0c395f585e2 GIT binary patch literal 9543 zcmXw91ymGmxSl1K5|ETex)-FRK~j+JMgi%N25Ce=6r5RnGyR6x3sj{E)h zo;&BT!#O*Syaosnm5h zKPSeDH2qXF#$RnnpFH8ZGmys|(Bu_PP3oa!RC?2a4|ny5AAsEE{q9GOQ6>4$tgO#= zXHjdi-WLr7Ot&okt5`0p181BbH}P}Z?BZgj-07XZPQ)&rbc|34U8XP+2Z2kpB0PL> zPb5VUmd(nJ@`(_QcSRT}Ltq&~_XGFNoE+ocNmip4wa=9+DtB&lbkq|ba%IeZFNr6` zVDLx*N%e?`oSd9Bu3sJpErj>2#PWx})uvek7JueAC40d%=PmbUBRp^nB=I;mxMihV zN#;VyX=$Ydk+RZnB_yR-iIH*yvftjNNNd#gnImqT1k)(5udbXVj(;#X8pnLVdlW7J zb=({)Z(SU%c3bfokcZF(3nP~o`I_#e2rLn4LqdMOzIGozd?+>Z{{4=oV!)yNZTEv9 zM@Pr%`37f&Z-}x#Czp5R;q+7N?{W6b$>m=#PaKek>-hNj>0Ml0Y&O!7Y4PFWK)O0Q z!3kV6(lM@LG-|;XGgai%p>ep~h~d>ELvJxt^r&1RZT5s4X&^KZs zbQqJ*`#NXIxBk7Sr*`gV^xl~&dS`ezhK`xpG9!67>TUsRXxHfM#6;fC_V)HKyE<_& zfhHLl8P*x9ulKjMr0Wd1=ElZ?1%-stl$Di-q>!7NHtktiw969{L`P?5^7)!*;O0x0s>A z?S7l0Ev2S5viBDpC-E#sGLSbMrweWyHG07G!L}g4Yp`} z6q214|D5TbEGC%+77Sw{P^-l z`BfjX4JJ(>Ea$fUn+l?&q(trXwCAVj(=TPq8=EoF)6?_Xo#7n{M#W4&3xj{}a9R|( z{L}j(p$i-`Iirh)8Sr;9E{k65tgK)94QbA7`W}H1B5n9n4G_3}DMQw!_45@K6^U7a zcTMgSg)h=I`Lu`{{LY>3Q=YsoSzKHsnL1oMxg?LuMbF8}k$grFX4oCNC72GG`}^Or z;&vxyvu?lYg}}0%rGau{ySrG8KF}Xq+Dg5-90@!#ZFVpAJ>47&7NZ&Y^Hi1~{{?r_ z{mT0K;S=K0QuHTd3owZOyWOs@#YLR7@yI>=|ms837s_4mP$3`rAjgLY6V3^pJzC?GZ0IuCfYq zoE(c7*t{OQGhY|VjT(^TUQEh=eWxo-0&vK<-_DG8M@i8&G7w`&UtV5*-B0=<0y!_W zVpWVJCJ$Lln5>8Rjet$}rzk6+xwf)0+N}_+dDT30cwhiW!hKWS-O_T+8y;e_LoQ9Q z(&f*|$SB(#o{s8Yh27cQ+zcj@)ZnGIle2T>^4C`i?e;BoxTNMrcLQd3d=`Vryj|`_ zA%0dl>dB7?2-KAtK9#$d!Kw-inK44LecZd=uQu|EieCQ=$D^chq+U~W>Tq6e&wlFm zS0!hM3(ZO0g-ViylvKATd`TZ>E+^N^7%X+jy4a1;*yerEcFz6r*96xD(fznGPm}Xp ztu4kPhlGnTZ;Fbff~>6ZE5k(0%USB6goFeo1g=`4Xv}ipecM&a>&&L9U%z^=p0SxU zHK}eK97Ml8U-XLefBQDx-AW*BD2aiAfoGziA$+(3;^gAW0Q0uG1;^O+P2w>d_B-k& zGq{BpGR(W=DygaIiQgP{N4ob}BFF=DN+(}$jT=3GEd(VdB)lMjqfKnWEd|s5Wd&Sq z&BnfolU86k%ZCZEmFkwKVs#_96!7Ev-FeyBw@bt=t8t*f>ph`56=ow@1@jf*!?Stk zELT!B5|LMLFjC{=iO;!=>IX@&-|>kYgH3DQ_x(Fx0K$SQ=-s<_IeaM&Y}9%_D+JBf zL#a=inwsQAp1X`8N`v$B8OJik{j4WkBhZ;sMZNZ^vJe(1c}r6tQ4W75aJ(YH?tSAj zBwtW6JUm=zHITUeYierA!`@3AIVNRe!+JmO-0|Y`!1|r`!=RmJaLvcCFtqQjpU6?o zO-(Z!8XC^s#Au?ATXO5_>dwCQ(X?zgPiCjS@my+YYLea<&PbD=uqmImt21L^X0}U- zK@vjswY7@()V=p8$kq4FVi?tQ~pBebJr*cu;RMmRrM(`Xr%{>Y9eUtfsp9Z_q~z?a!TvbV>?})Ms)E zXG_fgt=qc@*<34aJ%<%L$IIjOB8)#aj)XIlQ+E`QhOe3bze(egAXXRWh3RQ8*>c_G zT3z;1SaMbt&(Z0rv0Q@MhzeLOkY>`EMJNa&O(GiCGz?6=W0-)pT1Ud>qV>BL+Kyy|5XMK zB`GrI^NIm}LhJlM#)ARSM*PLm;_J6NvWv2?-~(18DvM3Rt!W3)q0yUlqTdR!9iq#-n4nAhFV-) z4Eqn!;#F8!qn3~n5f>jTmTXXChP(2>TYPM6TV%}{Et~0Ts7c%=sk=Kn%2!xZlan6Y z^z`&u!<#m+!ymB>)qq9sL+Bz9ez0(hD-sS}s*UGApNNEdjpXoSgPwyH{UNpqSg*Zpq}R3ume*m8#Oqsn{@=-ULCIw3^a-J?Gz0B_yPZ~3T@NXoSmID92^`3 zb$EbaVP!pxA6UPaBULS)*qWpD-OSO_&UiZD7xT_;w%Y0gfG1K0INuaSlLqna?Qn*u zWDz*<`y5P!oEG%y5}vn3x=+w9`5-tsKk~yKGC>0a0~;roH~OEII+wsq4%XJzI@vQv zDLX=kx)sJvhTKU!7Mc~Hs8`=VpcX--2Q>!V`i_9D#SN+^toZaU1D0pL(C8`|yY-nk zXr!1C#Fcz-K09q)1H?4tx$si(ApL2I>iO zeu_`)ENYnx5>)Mk;LLfmU0RvRI3WFspTaFKFAvM49uCvj)O<|*p|>(-Qm?eQm@QSv zc?qwOC6X&(CFrP!NbRlNh>r7@uRuswzb$|CfbM3iDC%uC2icEO+tg zAr1}>A`5b6cVQ@a4dC(>Jqt@8+ko6t?6;^y=u-MRI{&=t4E;mOY1758VAd&M5?T7i ztZ^~AN9^i+6|WCtAT*~l0Re#>Z!sE+rxR&H&WR(b0v{5;j?thtyknX1Jl|jR1A1G2 z?pxnfeYX|UV1Iwg+Q9*>^l@<^4nF>UR?fotdo*($9g;6?@)Y{*wiAU1YU#pb_B)Ki zx&8_YeNHJV7&2I#0UzaGz0)lfcSexAgTaYF#mgW1{H0tj3!c`THton7F!#9l?J80Qs4eF?SDC!(OZ z;$ngXC_a(*9qIM+QRWvEShd~XT{kopqKO=n(Ic zeqIQWXDuQkVo%#0^?-w&eW~tW45Yj8p2pWkG-DDWAmBkbiLI>XsW1w=jgoyVBg&3k zl`PgSxpw#-2${clF;pXrB+|{}|$$zrQ^nL0BzA>m3 z)6mierj~X{@io;N?s+yDXR0t=1L-#I@9*!WIc9Luo|m`!Dn&(pd(?L1t~_>jTo5q* z3FAX7iwsF(xetQsY~lxyW&!z{tduMoE2mN(eAdU;adv|$9hk5^pljF~A3YjZ#voR~eehrj zReE%hvepkOD=vQYepNV!_iIZ_i-3eg=C8W&tu91wbj682 zjcf>ohlS-YqnZbP-JDih*gslZTf=?*?>aBlB^&OSY#PBFgcN%#k)`W{!yMdATnS9! zT_h0;+>6MC1Bj7(Sd{hhEe6n$=<6$b1X!a$IB+mC|20#=`XNXwLX;U7cfx11B<{ZE zY7K>4a&dE;$|f$o;3O@=L__0WLN`}Z>gSJDlV^^wZaQhQ|^>cDxg?pW;VwJoZ~KhAh>lQN{nG zuC6E6gUPBWo!AM_J#M%`5f6P}je1Cvw(PT!K|4M%;i#%O)J}2Npg;!APQMLwlKz&) zf+lU4@O(W72DKw|Sv4H-Il(X}U#oKNqtIPLXjmg3qM|aX9qeg1(L?CIw_p-d^%VeM ztb7=`Ik>Nf`sxiV#vcly0kxY6QjaQPeSQ5InlH`GB8SVhVM~oBCMH8zSXiE=i9f>a zz@0uD2;5!0`nMD9!1}yoko@sY& z03V93oXE-MI!KVbMRI{sqFsVzxv<&ehhP{oAwn+@8{W;7%q|)n96Zv{(7=yRru)-EWu%KqB@{y#@N`{ z!ZvWI`s`tl79IRCrz&u&`-A@1XR&|1S9@@eyv0`R8^AK&dwO|cu5a!ouKy%lMK>Te zG%}jVU~8G$sqB#0p42mAQgI2g&}V>FlnKxXNekT)jR+Jrd@XR|JFV_PP~(gs`TAO| zsVk()YJl_`9TRT%Ty|wh|i#Z8v(35#hNbK99JkNeLr@)Fj&P)(zFm5~AV&KVf&3dIZr zeh&XY|C*!DOOy<1!s!II%e(D#Tsb@OM+`o4bqETgd&>=oXveFI8+t<)r0vxuMpH@S z&~*=!R%a!I0C&402QWrraiuC)_^#IC)V>d=2}L8wgu*Q*JLx^JvPM{NvsQfxzkw^N zY+RlOT%{r3qw42rD+iT*3W5BL4E`zp%mH90&QHE@Jd` zX?gjJCm!3s2F@f@^aqwTAS%{rXbtS0=y*j&qRqA7de3y(y~b7)(>7m^t7P6+A(55} z8mGhvSGSOP+#tyoSYmn(98_RLcDntBqt|_ zv#_uLS8hJ`ZgrN@FD&a|ACI|$5=Q$zQJzy1{jA2s7lbKpY?m%S*?^2n>62hH2fLh% zspnNyRc&6V6ZUp?g0TsfCiM;m^3u}5{WMT@0*et;yEfJJIc&2YnN0#FuK95PAJ)Tm*IK2visz|9#^qEC|{3pNVEa ztFO1HKsf|zT#Fc6jyw|Y@LQwn>hV5GRZfmYS(iE8={z4fu1S4j*-N_tpBQ{fDBtbE zTfHLoLFXOLgKsZC(QzrLtE*3#fH>-bEr03@OJuR}KO9TcpbC=F>h-)1?e0K=I+V;& zaGP{;JOPy|q4Ie?6ml9eMQ9bw#o#)r*u+E^8(Ui+HxMv|?QbT&VB-}aYcMbQ2oJUY zzKCiLiqIXm8-B3YXh@&I1sQ&p>*#nqt|TZ{*94a;Ic*iAId}swadE!R4|1@x!`|Q9 zV^Y?x_!Jr0Z@rx~KulW?!Pg3mx)h5hs6o6JwqBA6N$8u5cxB!OhWCYHnEi3S7^VAAYv`zWr%+{ouERwv9rTEz(n8f%c3 z5?uuHr3{J-3w!4#B~8B+tY7RBS)If7zPWI%Gc0E=a}8Pb&UjuR!iNaIF0o2XOk@TL z;5WN1@bUEdaB7&8Q6Rrc{RRb8yd4U(<%C_`RRcZDd;KSg5D0MflK*5iv=VO{ z)0CLzz73#D?O&j3qSFWOH2`6{{Hs{&K+a&P0R@FlTTd@E6#iRqPyka0)HtdXJEk^O zp8$Kp_Iwx4FfF8SU~ox*+wB&q%LKwoB5LZ}P_9zaI7bs`?EwUal7#(EhAk2%BFf2G z7C{_D@k##Us_;xW;bVE=q<#i~V5(LHrQgsL-~(!qsOK*E$!^WaFhgqJ-GnoHBRV}g zowtFJQ45H%=X?*(55$}$&`zB!cG8J#Q+)OI0_wd)ukh?Jq%7f zG&H0$QKU9fg8}Bx6*hVV<(FWh97F60Km9u|gGeEmhK|l8F+2obN`34t<^Z&$q~+_^ zqWrG0UFH{r(gfeArd2{R>|51|9UlVm`ZReq=DfHl^K-z(@Aq_gJSx9vk*iPH6WG1J zoIi8w3L>DAN8tLQ_qpai4j1DVX0@rC+XI<+6*~iE+{zb;vLh`^!>RQ2bS1C>!y@rI zbDmXB2j=RQej%mpkP%G{l6RQJnh^(el>6uS0Uyw{#4|dou=kzRxU2Q zh3kigD(b|y0*@buR87(S#)cCYPuhu#h>GgPEq-*#NnB7gMsKRRGHLbZ9UB>muKGcU zXah<7ZF_rrSY4qK3@)V)R)M^`inZG83_yR4sGC~0DRoXV5w3Pf|!22F36au)G7gGM%z!otFC6btd6LxKVVpQd*H-76*j zFs__lPT{xJOl0_Ah)S@()aLhIh1u`d66C@d7?WZFJlKKo!?)Sw9svP&tB+$9Rr7Jk z!(Bm4N=iT=)r`nMTP5VK3o5LtLfrSWWN~_}tp&Ar30W8$FT4~IYKZt< z{WxTzLbYh1!*x~uFR0*S>he|EfD3wdX6Eo(VhZFc3E0-c31zj=e<>BMfZZ?l>Rl{h zBqa!k{X*;?lxkzUv^A)p(yiEl_*zYhpohf{OFE{ht?jm^KaRyq!?g%qsxv<~_oYY( zT^KJzP+?nJTfonFHnL(7k2Wt;yqn_zo{6^BR(M-M=Z`__ll31z6b&Cu+Mp7Y1$cOP z@Z_;RC*Q#mk#zez*jr~mJtbNhW%8NG)_l3$U;01g`dD0BN?p&!W>Xp-qArq}kJovp zgLo)Spqa;mT>T3o@%tZ4MLHr;E@LtF=Dam;!MdWPuy}886R^6<4CK&0{XL=Nz)Lw zb7#6T8pL;Rg9ptB;GHC|(Us$W=TaM@YNx15bC|melH;1m%E=j6;@6W0W!C^7y7f3V z;#3M{lN*5DWiOf8uSVu69|5U^bvtuQ&?7kpQp}cG48y*g9SSk#17X?-Xo-BaEJ0rm zr477st*_BG_A*VLQ8@m$GwtUDA{N-J3D4%EzN2Lw_Q~lfMGF#0T47@(D+wI~qrGSK zsK=5zl>9Te_;t%}=#)zI>KvzjRi`6J7I4r|U^!|w9q#_1|7Gjy>Kb<5W|>z-5fo$# z829JmBK5-O7>Sh93f>aJS$~L4x5;8kAC|L2!|R zH?tH3Wx%&Nj^)a|Heq>XUlf($2})H_S9gjkMMW^RM4@Ijo%YcqA7s?96NmZz9scyx zR0ZPzuQ**NSgtf+EL@jjRdMQB?He1=RWbfc;@FY~*u)2UaqYE=wasJ*!e(>H()6T8 zeUy|Ulk_UJnJ;t>G?kX_-1qkNdCiny%0uulRvsQb z?04T-ig!bU>OtV=xzy^TXTp(FKGCP*S9P56)D2_Jote|{>8Msm+rbyEW&h9uYuun) zIy7$e&fo-ulvTD{x$bDN8Q0!=a>-r;^zxbr?-;rQg=^i(mgva{(R^I9Y2Got0NJ=nSI@o%mGoor3s@K~>#HoaaPmu}qLvZn(E%)BcEU5g%`TdNOM zsLWjb$gkmmuJyk4%jCrTigb+$YLw4od!ed&H{>Bxh|ew(zmo5Fyw)GKvSL0C?}M4H zq^W@@GYW~M;md<%NNkPHPzOmxfST#^@%5FE?~_H{^blDr_geB{+31NRYIDcpyUjr9LB$0{MJ&Mee&4_BG=R~OYXegIqRnn1leoPa%w-S=evjiBNw_Br z*^U8ni}eP}{?A+P4aVk{Q(NwRfByW@cg=eR2FsDt@%}v~>u=d@=_lUG81g$H9llRZ zOB1zpBD~V#t!9;OTZ)#rvdQh}kSuWZiLt%{4JsrvBjdu*BPR3#2txb!-?IRBBi})3 zb_E@uoG1*eA6pTi#bOAFH&XmvUndc}zc~?bVC|i~Rs`Lh7wN);`G%xp)Hul1MW96P zKYseu_N)Pq$h{1;iZ<*aK7KS40vFSe4}R$Az0w(6%8falQ-@Lgs}e|WY-+W{E-H26 z@`L^TVc-fL?<_AofUR_{;Nai{R~L?pr=K=--#EdIPjD6F2v81&aw^n<#ORRF!fP_vQ7)1*4In#Scrqe>%FliO%!& z<<;5QEA2hg-6S^nNF3vWy_v5JG6kA)$Cq!LmnXeugQ{PF1h6me^XF9RVxIS?1h^6$ z9Lhj{(~`l_!bs{PVi-*uJ)5$(Ms2^!((`-9_~SLB{{E?}#%u zKh^=|GZ92Zeh5JQ55Rw#0{fCjWvm3yci(_&8hHS=n`B4{R1Di$Em2mlCvO0vj@hyQhWtE;Q8 z#Qn||+&xe55Je6%RrJDqe0($A-OqR%zZEk{Nof$5`Mw4%JL*I&7gnFAn4K_s<>${s z!eo9M15L9tJe~~gp6$&K_4f9rnzVQdh`2C&nqh{j~+%chJTGc@fIT}o}QbVGX=E%W^b;}seYlWv%&b~%UlI__gc_(_~`28 zb#C#-SR`ZrdxoeN_h9-{tr12uzr#1!&;#6?!IURU*zaCOX|sRIU3GQ*^bHr|S&?ed z4n|;u)8aVD=-oX$JyHBpnu>}rC++HN6cjM$78V?6X2!b`w>CEV&QDKeTieOj(T&HHb9W>JO=20-0GBYzNL5=x@;z)@aaw}hZ*@3aumy}=|H}`cTsL-WHZTuWZ z64{e%eXE8-w7`=w1Et%4==nP0teYYz zv<~}*U~ypq1@z{K;b^bu;h$ZtO81uyTV6105k=+VfqTUxVo_~fM`%~g97VuZLPhpA zH^~bo?W8Mqq(EF5-nZKS0`%r-n5Kr~r07QTSm$8v8!F6Nc``YTPwjrOrk#}Ob3`-D zf6|8@6u49MEwXcPw5bzQzgul&!R^k3hcu#U;e&@maJw%MxD0e!VrbGor1+TOAs>a2 zd7bnq-3a1vi$k?15tULJwUpfms6rGTvJe>&(TFM?^UR)8^q~v>+3h{d=#~vbu)_iX PAOtDNsmfN!n1}oiwqp~m literal 0 HcmV?d00001 diff --git a/base/src/main/res/mipmap-xxxhdpi/video_play.png b/base/src/main/res/mipmap-xxxhdpi/video_play.png new file mode 100644 index 0000000000000000000000000000000000000000..84aee8c65f64b12b364700e16f98ac92e2579e2b GIT binary patch literal 9526 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 + + + + + + + + + + + + + diff --git a/base/src/main/res/values/attrs.xml b/base/src/main/res/values/attrs.xml new file mode 100644 index 0000000..7b5ee6d --- /dev/null +++ b/base/src/main/res/values/attrs.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/base/src/main/res/values/colors.xml b/base/src/main/res/values/colors.xml new file mode 100644 index 0000000..8f320d3 --- /dev/null +++ b/base/src/main/res/values/colors.xml @@ -0,0 +1,41 @@ + + + #008577 + + + @color/bg_window + @color/colorPrimary + #FAFAFA + #00000000 + + #F7F9FC + #222222 + #FFFFFF + #000000 + #409CFA + #FF4444 + #586C94 + + #56ffff + #ff4667 + #2084fb + #9056ffff + #902084fb + #90ff4667 + + #333333 + #00000000 + + @color/light_gray + + #CDCDCD + #686868 + + #000000 + #FFFFFF + #E0DBDBDB + #53575e + + #5ea978 + + diff --git a/base/src/main/res/values/dimens.xml b/base/src/main/res/values/dimens.xml new file mode 100644 index 0000000..80bccfc --- /dev/null +++ b/base/src/main/res/values/dimens.xml @@ -0,0 +1,4 @@ + + + 44dp + \ No newline at end of file diff --git a/base/src/main/res/values/strings.xml b/base/src/main/res/values/strings.xml new file mode 100644 index 0000000..0a2de60 --- /dev/null +++ b/base/src/main/res/values/strings.xml @@ -0,0 +1,5 @@ + + + 返回按钮 + 右上角按钮 + \ No newline at end of file diff --git a/base/src/main/res/values/styles.xml b/base/src/main/res/values/styles.xml new file mode 100644 index 0000000..c443476 --- /dev/null +++ b/base/src/main/res/values/styles.xml @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/base/src/main/res/xml/file_paths.xml b/base/src/main/res/xml/file_paths.xml new file mode 100644 index 0000000..a3b9b54 --- /dev/null +++ b/base/src/main/res/xml/file_paths.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/config.gradle b/config.gradle index 3ed995d..7b93f0d 100644 --- a/config.gradle +++ b/config.gradle @@ -14,7 +14,7 @@ ext { paging : '2.1.1', room : '2.2.3', - lifecycle : '2.5.1', + lifecycle : '2.2.0', retrofit : '2.4.0', glide : '4.10.0', @@ -25,9 +25,9 @@ ext { } androidx = [ - appcompat : 'androidx.appcompat:appcompat:1.3.0', + appcompat : 'androidx.appcompat:appcompat:1.1.0', annotation : 'androidx.annotation:annotation:1.1.0', - constraintlayout : 'androidx.constraintlayout:constraintlayout:2.0.4', + constraintlayout : 'androidx.constraintlayout:constraintlayout:1.1.3', recyclerview : 'androidx.recyclerview:recyclerview:1.1.0', viewpager2 : 'androidx.viewpager2:viewpager2:1.0.0', material : 'com.google.android.material:material:1.1.0', diff --git a/core/build.gradle b/core/build.gradle index f8a0029..4ceeb83 100644 --- a/core/build.gradle +++ b/core/build.gradle @@ -31,8 +31,8 @@ android { dependencies { api fileTree(dir: "libs", include: ["*.jar"]) -// api project(path: ':base') - api 'com.xuqm.android:base:0.0.5.102' + api project(path: ':base') +// api 'com.xuqm.android:base:0.0.5.102' api 'androidx.navigation:navigation-fragment-ktx:2.3.5' api 'androidx.navigation:navigation-ui-ktx:2.3.5' diff --git a/settings.gradle b/settings.gradle index add3c0a..9642a8d 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1,4 +1,4 @@ +include ':base' include ':app' include ':core' -include ':base' rootProject.name = "AndroidPlatform" \ No newline at end of file